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..070ae5b --- /dev/null +++ b/core/src/main/java/mc/core/CoreEventListener.java @@ -0,0 +1,81 @@ +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.eventbus.events.SC_ChunkUnloadEvent; +import mc.core.utils.CompactedCoords; +import mc.core.world.chunk.Chunk; + +import javax.annotation.PostConstruct; +import java.util.Iterator; + +@Slf4j +public class CoreEventListener { + @PostConstruct + public void registerEventHandlers() { + EventBusGetter.getInstance().register(this); + } + + @Subscribe + public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) { + log.trace("(GameLoop) playerMoveEventHandler()"); + + Chunk chunk; + chunk = event.getOldLocation().getChunk(); // Old chunk + int ccX = chunk.getX(); + int ccZ = chunk.getZ(); + chunk = event.getNewLocation().getChunk(); // Next chunk + int ncX = chunk.getX(); + int ncZ = chunk.getZ(); + + if (event.isRecalcChunk() || (ncX != ccX || ncZ != ccZ)) { + final int viewDistance = event.getPlayer().getSettings().getViewDistance() + 1; + int cMinX = chunk.getX() - viewDistance; + int cMaxX = chunk.getX() + viewDistance; + int cMinZ = chunk.getZ() - viewDistance; + int cMaxZ = chunk.getZ() + viewDistance; + + SC_ChunkUnloadEvent eventChunkUnload = new SC_ChunkUnloadEvent(event.getPlayer()); + Iterator itr = event.getPlayer().getLoadedChunks().iterator(); + while(itr.hasNext()) { + int compressXZ = itr.next(); + int[] xz = CompactedCoords.uncompressXZ(compressXZ); + if (xz[0] > cMaxX || xz[0] < cMinX || xz[1] > cMaxZ || xz[1] < cMinZ) { + eventChunkUnload.getNeedUnloadChunks().add(compressXZ); + itr.remove(); + } + } + + if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) { + EventBusGetter.getInstance().post(eventChunkUnload); + } + + 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); + event.getPlayer().getLoadedChunks().add(compressXZ); + } + } + } + } + + if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { + EventBusGetter.getInstance().post(eventChunkLoad); + } + } + + event.getPlayer().getLocation().setXYZ(event.getNewLocation()); + + // 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 06fc0a1..4b5affc 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -4,22 +4,12 @@ */ package mc.core; -import com.google.common.eventbus.Subscribe; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import mc.core.events.CS_PlayerMoveEvent; -import mc.core.events.EventBusGetter; -import mc.core.events.SC_ChunkLoadEvent; -import mc.core.events.SC_ChunkUnloadEvent; import mc.core.player.PlayerManager; import mc.core.time.TimeProcessor; -import mc.core.utils.CompactedCoords; -import mc.core.world.World; -import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; -import java.util.Iterator; - @Slf4j public class GameLoop extends Thread { private final TpsWatcher TPS_WATCHER = TpsWatcher.getInstance(); @@ -48,77 +38,16 @@ public class GameLoop extends Thread { TPS_WATCHER.setTraceTPS(value); } - @Subscribe - public void playerMoveEventHandler(CS_PlayerMoveEvent event) { - log.trace("(GameLoop) playerMoveEventHandler()"); - - Chunk chunk; - chunk = event.getOldLocation().getChunk(); // Old chunk - int ccX = chunk.getX(); - int ccZ = chunk.getZ(); - chunk = event.getNewLocation().getChunk(); // Next chunk - int ncX = chunk.getX(); - int ncZ = chunk.getZ(); - - if (event.isRecalcChunk() || (ncX != ccX || ncZ != ccZ)) { - final int viewDistance = event.getPlayer().getSettings().getViewDistance() + 1; - int cMinX = chunk.getX() - viewDistance; - int cMaxX = chunk.getX() + viewDistance; - int cMinZ = chunk.getZ() - viewDistance; - int cMaxZ = chunk.getZ() + viewDistance; - - SC_ChunkUnloadEvent eventChunkUnload = new SC_ChunkUnloadEvent(event.getPlayer()); - Iterator itr = event.getPlayer().getLoadedChunks().iterator(); - while(itr.hasNext()) { - int compressXZ = itr.next(); - int[] xz = CompactedCoords.uncompressXZ(compressXZ); - if (xz[0] > cMaxX || xz[0] < cMinX || xz[1] > cMaxZ || xz[1] < cMinZ) { - eventChunkUnload.getNeedUnloadChunks().add(compressXZ); - itr.remove(); - } - } - - if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) { - EventBusGetter.INSTANCE.post(eventChunkUnload); - } - - 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); - event.getPlayer().getLoadedChunks().add(compressXZ); - } - } - } - } - - if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { - EventBusGetter.INSTANCE.post(eventChunkLoad); - } - } - - event.getPlayer().getLocation().setXYZ(event.getNewLocation()); - - // 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.INSTANCE.register(this); - while (!isInterrupted()) { TPS_WATCHER.check(); /* --- --- --- */ + /* TODO нужно перенести этот функционал на Network */ playerManager.getBroadcastChannel().sendTimeUpdate( gameTimer.getGameTime(), gameTimer.getWorldAge() diff --git a/core/src/main/java/mc/core/events/Event.java b/core/src/main/java/mc/core/eventbus/Event.java similarity index 89% rename from core/src/main/java/mc/core/events/Event.java rename to core/src/main/java/mc/core/eventbus/Event.java index 066e7c8..08aa0ec 100644 --- a/core/src/main/java/mc/core/events/Event.java +++ b/core/src/main/java/mc/core/eventbus/Event.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; public interface Event { void setCanceled(boolean value); diff --git a/core/src/main/java/mc/core/events/EventBase.java b/core/src/main/java/mc/core/eventbus/EventBase.java similarity index 89% rename from core/src/main/java/mc/core/events/EventBase.java rename to core/src/main/java/mc/core/eventbus/EventBase.java index 8c4f030..7756cce 100644 --- a/core/src/main/java/mc/core/events/EventBase.java +++ b/core/src/main/java/mc/core/eventbus/EventBase.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; import lombok.Getter; import lombok.Setter; diff --git a/core/src/main/java/mc/core/events/EventBusGetter.java b/core/src/main/java/mc/core/eventbus/EventBusGetter.java similarity index 59% rename from core/src/main/java/mc/core/events/EventBusGetter.java rename to core/src/main/java/mc/core/eventbus/EventBusGetter.java index d2e5aa3..37e952b 100644 --- a/core/src/main/java/mc/core/events/EventBusGetter.java +++ b/core/src/main/java/mc/core/eventbus/EventBusGetter.java @@ -2,12 +2,14 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; import com.google.common.eventbus.EventBus; +import lombok.Getter; public final class EventBusGetter { - public static final EventBus INSTANCE = new EventBus(); + @Getter + private static final EventBus instance = new EventBus(); private EventBusGetter() { } diff --git a/core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java similarity index 90% rename from core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java rename to core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java index d44f7b1..ae60200 100644 --- a/core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java @@ -2,12 +2,13 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import mc.core.EntityLocation; +import mc.core.eventbus.EventBase; import mc.core.player.Player; @RequiredArgsConstructor diff --git a/core/src/main/java/mc/core/events/SC_ChunkLoadEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java similarity index 83% rename from core/src/main/java/mc/core/events/SC_ChunkLoadEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java index 62d35c6..ea55a7a 100644 --- a/core/src/main/java/mc/core/events/SC_ChunkLoadEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java @@ -1,7 +1,8 @@ -package mc.core.events; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; +import mc.core.eventbus.EventBase; import mc.core.player.Player; import java.util.ArrayList; diff --git a/core/src/main/java/mc/core/events/SC_ChunkUnloadEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_ChunkUnloadEvent.java similarity index 83% rename from core/src/main/java/mc/core/events/SC_ChunkUnloadEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_ChunkUnloadEvent.java index 397cbac..b2cce0d 100644 --- a/core/src/main/java/mc/core/events/SC_ChunkUnloadEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_ChunkUnloadEvent.java @@ -1,7 +1,8 @@ -package mc.core.events; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; +import mc.core.eventbus.EventBase; import mc.core.player.Player; import java.util.ArrayList; diff --git a/core/src/main/java/mc/core/events/LoginEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java similarity index 75% rename from core/src/main/java/mc/core/events/LoginEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java index 63e123f..95765f3 100644 --- a/core/src/main/java/mc/core/events/LoginEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java @@ -2,18 +2,19 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; +import mc.core.eventbus.EventBase; import java.net.SocketAddress; @RequiredArgsConstructor @Getter @Setter -public class LoginEvent extends EventBase { +public class SC_LoginEvent extends EventBase { private String playerName; private final SocketAddress remoteAddress; private boolean deny; diff --git a/core/src/main/java/mc/core/events/PlayerLookEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java similarity index 72% rename from core/src/main/java/mc/core/events/PlayerLookEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java index 7506530..90e5379 100644 --- a/core/src/main/java/mc/core/events/PlayerLookEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java @@ -2,18 +2,19 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import mc.core.EntityLocation; +import mc.core.eventbus.EventBase; import mc.core.player.Player; @RequiredArgsConstructor @Getter @Setter -public class PlayerLookEvent extends EventBase { +public class SC_PlayerLookEvent extends EventBase { private final Player player; private EntityLocation newLook; } diff --git a/core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java similarity index 82% rename from core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java index d64350b..d0634a7 100644 --- a/core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java @@ -1,9 +1,10 @@ -package mc.core.events; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import mc.core.EntityLocation; +import mc.core.eventbus.EventBase; import mc.core.player.Player; @RequiredArgsConstructor diff --git a/core/src/main/java/mc/core/events/ServerPingEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java similarity index 74% rename from core/src/main/java/mc/core/events/ServerPingEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java index 3bbafce..877df70 100644 --- a/core/src/main/java/mc/core/events/ServerPingEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java @@ -2,18 +2,19 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; +import mc.core.eventbus.EventBase; import java.net.SocketAddress; @RequiredArgsConstructor @Getter @Setter -public class ServerPingEvent extends EventBase { +public class SC_ServerPingEvent extends EventBase { private final SocketAddress remoteAddress; private String description; private int online; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java index 79be3f9..057a425 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java @@ -14,7 +14,7 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.util.AttributeKey; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import mc.core.events.EventBusGetter; +import mc.core.eventbus.EventBusGetter; import mc.core.network.Server; import mc.core.network.StartServerException; import mc.core.network.proto_1_12_2.State; @@ -64,7 +64,7 @@ public class NettyServer implements Server { public void start() throws StartServerException { log.info("Use protocol {}", StatusResponsePacket.NAME); - EventBusGetter.INSTANCE.register(new PlayerEventListener()); + EventBusGetter.getInstance().register(new PlayerEventListener()); bossGroup = new NioEventLoopGroup(1); workerGroup = new NioEventLoopGroup(workerGroupCount); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index 66d46ec..bcfe393 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -2,16 +2,15 @@ package mc.core.network.proto_1_12_2.netty; import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; -import mc.core.events.SC_ChunkLoadEvent; -import mc.core.events.SC_ChunkUnloadEvent; -import mc.core.events.SC_PlayerMoveEvent; +import mc.core.eventbus.events.SC_ChunkLoadEvent; +import mc.core.eventbus.events.SC_ChunkUnloadEvent; +import mc.core.eventbus.events.SC_PlayerMoveEvent; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.ChunkDataPacket; import mc.core.network.proto_1_12_2.packets.PlayerPositionAndLookPacket; import mc.core.network.proto_1_12_2.packets.UnloadChunkPacket; import mc.core.utils.CompactedCoords; import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; @Slf4j class PlayerEventListener { diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 15cf04b..771b1c3 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -6,8 +6,8 @@ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; -import mc.core.events.CS_PlayerMoveEvent; -import mc.core.events.EventBusGetter; +import mc.core.eventbus.events.CS_PlayerMoveEvent; +import mc.core.eventbus.EventBusGetter; import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetChannel; @@ -140,7 +140,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation()); event.setNewLocation(player.getLocation()); event.setRecalcChunk(true); - EventBusGetter.INSTANCE.post(event); + EventBusGetter.getInstance().post(event); } } } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index e4162c5..d7636e3 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -8,8 +8,8 @@ import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.chat.ChatProcessor; -import mc.core.events.CS_PlayerMoveEvent; -import mc.core.events.EventBusGetter; +import mc.core.eventbus.events.CS_PlayerMoveEvent; +import mc.core.eventbus.EventBusGetter; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.*; import mc.core.player.Player; @@ -85,7 +85,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle player.getLocation().getPitch(), player.getLocation().getWorld() )); - EventBusGetter.INSTANCE.post(event); + EventBusGetter.getInstance().post(event); } @Handler