attempt to implement an event model of Player movement
This commit is contained in:
@@ -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();
|
||||||
|
|
||||||
|
|||||||
22
core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java
Normal file
22
core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java
Normal 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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user