Archived
0

attempt to implement an event model of Player movement

This commit is contained in:
2018-08-11 19:30:36 +03:00
parent a3880f49ec
commit 916a78c660
7 changed files with 91 additions and 10 deletions

View File

@@ -4,8 +4,12 @@
*/ */
package mc.core; package mc.core;
import com.google.common.eventbus.Subscribe;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; 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.player.PlayerManager;
import mc.core.time.TimeProcessor; import mc.core.time.TimeProcessor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -38,10 +42,22 @@ public class GameLoop extends Thread {
TPS_WATCHER.setTraceTPS(value); 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 @Override
public void run() { public void run() {
TPS_WATCHER.startWatch(); TPS_WATCHER.startWatch();
EventBusGetter.INSTANCE.register(this);
while (!isInterrupted()) { while (!isInterrupted()) {
TPS_WATCHER.check(); TPS_WATCHER.check();

View File

@@ -0,0 +1,22 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 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;
}

View File

@@ -1,19 +1,15 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-05-02
*/
package mc.core.events; package mc.core.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import mc.core.Location; import mc.core.EntityLocation;
import mc.core.player.Player; import mc.core.player.Player;
@RequiredArgsConstructor @RequiredArgsConstructor
@Getter @Getter
@Setter public class SC_PlayerMoveEvent extends EventBase {
public class PlayerPositionEvent extends EventBase {
private final Player player; private final Player player;
private Location newPosition; @Setter
private EntityLocation newLocation;
} }

View File

@@ -16,10 +16,11 @@ import mc.core.network.SCPacket;
@NoArgsConstructor @NoArgsConstructor
@Getter @Getter
@Setter
@ToString @ToString
public class PlayerPositionAndLookPacket implements SCPacket, CSPacket { public class PlayerPositionAndLookPacket implements SCPacket, CSPacket {
@Setter
private EntityLocation location; private EntityLocation location;
@Setter
private int teleportId; private int teleportId;
private boolean onGround = false; private boolean onGround = false;

View File

@@ -14,6 +14,7 @@ import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.util.AttributeKey; import io.netty.util.AttributeKey;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.events.EventBusGetter;
import mc.core.network.Server; import mc.core.network.Server;
import mc.core.network.StartServerException; import mc.core.network.StartServerException;
import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.State;
@@ -62,6 +63,9 @@ public class NettyServer implements Server {
@Override @Override
public void start() throws StartServerException { public void start() throws StartServerException {
log.info("Use protocol {}", StatusResponsePacket.NAME); log.info("Use protocol {}", StatusResponsePacket.NAME);
EventBusGetter.INSTANCE.register(new PlayerEventListener());
bossGroup = new NioEventLoopGroup(1); bossGroup = new NioEventLoopGroup(1);
workerGroup = new NioEventLoopGroup(workerGroupCount); workerGroup = new NioEventLoopGroup(workerGroupCount);

View File

@@ -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);
}
}

View File

@@ -5,7 +5,12 @@
package mc.core.network.proto_1_12_2.netty.handlers; package mc.core.network.proto_1_12_2.netty.handlers;
import io.netty.channel.Channel; 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.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.TeleportManager;
import mc.core.network.proto_1_12_2.packets.*; import mc.core.network.proto_1_12_2.packets.*;
import mc.core.player.Player; 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; import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_PLAYER;
@Slf4j
@Component @Component
public class PlayHandler extends AbstractStateHandler implements PlayStateHandler { public class PlayHandler extends AbstractStateHandler implements PlayStateHandler {
@Autowired @Autowired
@@ -63,8 +69,23 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle
@Handler @Handler
public void onPlayerMove(Channel channel, PlayerPositionPacket packet) { public void onPlayerMove(Channel channel, PlayerPositionPacket packet) {
log.debug("(Netty) onPlayerMove()");
Player player = channel.attr(ATTR_PLAYER).get(); 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 @Handler