From ab08a723171053a86010c47d74da71377b7cf815 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Aug 2018 11:44:22 +0300 Subject: [PATCH] =?UTF-8?q?core:=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=D0=BE=D0=B2=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/CoreEventListener.java | 60 +++++++++++++++++++ core/src/main/java/mc/core/GameLoop.java | 50 +--------------- 2 files changed, 61 insertions(+), 49 deletions(-) create mode 100644 core/src/main/java/mc/core/CoreEventListener.java diff --git a/core/src/main/java/mc/core/CoreEventListener.java b/core/src/main/java/mc/core/CoreEventListener.java new file mode 100644 index 0000000..46c8f49 --- /dev/null +++ b/core/src/main/java/mc/core/CoreEventListener.java @@ -0,0 +1,60 @@ +package mc.core; + +import com.google.common.eventbus.Subscribe; +import lombok.extern.slf4j.Slf4j; +import mc.core.eventbus.EventBusGetter; +import mc.core.eventbus.events.CS_PlayerMoveEvent; +import mc.core.eventbus.events.SC_ChunkLoadEvent; +import mc.core.utils.CompactedCoords; +import mc.core.world.chunk.Chunk; + +import javax.annotation.PostConstruct; + +@Slf4j +public class CoreEventListener { + @PostConstruct + public void registerEventHandlers() { + EventBusGetter.getInstance().register(this); + } + + @Subscribe + public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) { + event.getPlayer().getLocation().setXYZ(event.getNewLocation()); + + Chunk chunk = event.getNewLocation().getChunk(); // Next chunk + int ncX = chunk.getX(); + int ncZ = chunk.getZ(); + chunk = event.getPlayer().getLocation().getChunk(); // Current chunk + int ccX = chunk.getX(); + int ccZ = chunk.getZ(); + + if (event.isRecalcChunk() || (ncX != ccX && ncZ != ccZ)) { + final int viewDistance = event.getPlayer().getSettings().getViewDistance(); + int cMinX = chunk.getX() - viewDistance; + int cMaxX = chunk.getX() + viewDistance; + int cMinZ = chunk.getZ() - viewDistance; + int cMaxZ = chunk.getZ() + viewDistance; + + SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer()); + for (int cZ = cMinZ; cZ <= cMaxZ; cZ++) { + for (int cX = cMinX; cX <= cMaxX; cX++) { + int compressXZ = CompactedCoords.compressXZ(cX, cZ); + if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { + if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { + eventChunkLoad.getNeedLoadChunks().add(compressXZ); + } + } + } + } + + if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { + EventBusGetter.getInstance().post(eventChunkLoad); + } + } + + // TODO отсылать клиенту только(!) для корректировки позиции + // SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer()); + // nextEvent.setNewLocation(event.getNewLocation()); + // EventBusGetter.INSTANCE.post(nextEvent); + } +} diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java index 93a0a6a..a51e42a 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -4,16 +4,11 @@ */ package mc.core; -import com.google.common.eventbus.Subscribe; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.EventBusGetter; -import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.player.PlayerManager; import mc.core.time.TimeProcessor; -import mc.core.utils.CompactedCoords; -import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; @Slf4j @@ -44,59 +39,16 @@ public class GameLoop extends Thread { TPS_WATCHER.setTraceTPS(value); } - @Subscribe - public void playerMoveEventHandler(CS_PlayerMoveEvent event) { - log.trace("(GameLoop) playerMoveEventHandler()"); - event.getPlayer().getLocation().setXYZ(event.getNewLocation()); - - Chunk chunk = event.getNewLocation().getChunk(); // Next chunk - int ncX = chunk.getX(); - int ncZ = chunk.getZ(); - chunk = event.getPlayer().getLocation().getChunk(); // Current chunk - int ccX = chunk.getX(); - int ccZ = chunk.getZ(); - - if (event.isRecalcChunk() || (ncX != ccX && ncZ != ccZ)) { - final int viewDistance = event.getPlayer().getSettings().getViewDistance(); - int cMinX = chunk.getX() - viewDistance; - int cMaxX = chunk.getX() + viewDistance; - int cMinZ = chunk.getZ() - viewDistance; - int cMaxZ = chunk.getZ() + viewDistance; - - SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer()); - for (int cZ = cMinZ; cZ <= cMaxZ; cZ++) { - for (int cX = cMinX; cX <= cMaxX; cX++) { - int compressXZ = CompactedCoords.compressXZ(cX, cZ); - if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { - if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { - eventChunkLoad.getNeedLoadChunks().add(compressXZ); - } - } - } - } - - if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { - EventBusGetter.getInstance().post(eventChunkLoad); - } - } - - // TODO отсылать клиенту только(!) для корректировки позиции -// SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer()); -// nextEvent.setNewLocation(event.getNewLocation()); -// EventBusGetter.INSTANCE.post(nextEvent); - } - @Override public void run() { TPS_WATCHER.startWatch(); - EventBusGetter.getInstance().register(this); - while (!isInterrupted()) { TPS_WATCHER.check(); /* --- --- --- */ + /* TODO нужно перенести этот функционал на Network */ playerManager.getBroadcastChannel().sendTimeUpdate( gameTimer.getGameTime(), gameTimer.getWorldAge()