diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java index d028e8a..5b1e571 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -4,8 +4,12 @@ */ package mc.core; +import com.google.common.eventbus.Subscribe; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import mc.core.events.EventBusGetter; +import mc.core.events.CS_PlayerMoveEvent; +import mc.core.events.SC_PlayerMoveEvent; import mc.core.player.PlayerManager; import mc.core.time.TimeProcessor; import org.springframework.beans.factory.annotation.Autowired; @@ -38,10 +42,22 @@ 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()); + + 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(); diff --git a/core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java b/core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java new file mode 100644 index 0000000..e8c8274 --- /dev/null +++ b/core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java @@ -0,0 +1,22 @@ +/* + * DmitriyMX + * 2018-05-02 + */ +package mc.core.events; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import mc.core.EntityLocation; +import mc.core.Location; +import mc.core.player.Player; + +@RequiredArgsConstructor +@Getter +public class CS_PlayerMoveEvent extends EventBase { + private final Player player; + private final EntityLocation oldLocation; // TODO сомнительное решение + // вообще нужно будет создать реализацию "иммутабл локейшен" для подобных ситуаций + @Setter + private EntityLocation newLocation; +} diff --git a/core/src/main/java/mc/core/events/PlayerPositionEvent.java b/core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java similarity index 54% rename from core/src/main/java/mc/core/events/PlayerPositionEvent.java rename to core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java index 2b296f6..d64350b 100644 --- a/core/src/main/java/mc/core/events/PlayerPositionEvent.java +++ b/core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java @@ -1,19 +1,15 @@ -/* - * DmitriyMX - * 2018-05-02 - */ package mc.core.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; -import mc.core.Location; +import mc.core.EntityLocation; import mc.core.player.Player; @RequiredArgsConstructor @Getter -@Setter -public class PlayerPositionEvent extends EventBase { +public class SC_PlayerMoveEvent extends EventBase { private final Player player; - private Location newPosition; + @Setter + private EntityLocation newLocation; } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java index 4c5ebaf..985d8df 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java @@ -16,10 +16,11 @@ import mc.core.network.SCPacket; @NoArgsConstructor @Getter -@Setter @ToString public class PlayerPositionAndLookPacket implements SCPacket, CSPacket { + @Setter private EntityLocation location; + @Setter private int teleportId; private boolean onGround = false; 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 7e2877f..79be3f9 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,6 +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.network.Server; import mc.core.network.StartServerException; import mc.core.network.proto_1_12_2.State; @@ -62,6 +63,9 @@ public class NettyServer implements Server { @Override public void start() throws StartServerException { log.info("Use protocol {}", StatusResponsePacket.NAME); + + EventBusGetter.INSTANCE.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 new file mode 100644 index 0000000..5c58142 --- /dev/null +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -0,0 +1,21 @@ +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_PlayerMoveEvent; +import mc.core.network.proto_1_12_2.TeleportManager; +import mc.core.network.proto_1_12_2.packets.PlayerPositionAndLookPacket; + +@Slf4j +class PlayerEventListener { + @Subscribe + public void playerMoveEventHandler(SC_PlayerMoveEvent event) { + log.debug("(SC) playerMoveEventHandler()"); + PlayerPositionAndLookPacket packet = new PlayerPositionAndLookPacket(); + packet.setLocation(event.getNewLocation()); + int tpId = TeleportManager.getInstance().append(event.getPlayer(), event.getNewLocation()); + packet.setTeleportId(tpId); + + event.getPlayer().getChannel().writeAndFlush(packet); + } +} 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 f7cffb0..b48e6f6 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 @@ -5,7 +5,12 @@ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; +import lombok.extern.slf4j.Slf4j; +import mc.core.EntityLocation; +import mc.core.Location; import mc.core.chat.ChatProcessor; +import mc.core.events.EventBusGetter; +import mc.core.events.CS_PlayerMoveEvent; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.*; import mc.core.player.Player; @@ -14,6 +19,7 @@ import org.springframework.stereotype.Component; import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_PLAYER; +@Slf4j @Component public class PlayHandler extends AbstractStateHandler implements PlayStateHandler { @Autowired @@ -63,8 +69,23 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle @Handler public void onPlayerMove(Channel channel, PlayerPositionPacket packet) { + log.debug("(Netty) onPlayerMove()"); Player player = channel.attr(ATTR_PLAYER).get(); - player.getLocation().setXYZ(packet.getX(), packet.getY(), packet.getZ()); + + if (player.getLocation().getX() == packet.getX() && + player.getLocation().getY() == packet.getY() && + player.getLocation().getZ() == packet.getZ()) { + return; + } + + CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation().clone()); + event.setNewLocation(new EntityLocation( + packet.getX(), packet.getY(), packet.getZ(), + player.getLocation().getYaw(), + player.getLocation().getPitch(), + null + )); + EventBusGetter.INSTANCE.post(event); } @Handler