From 3ec1b2b3a923b157db05a2d17b664628b79431d8 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 22 Apr 2018 01:03:18 +0300 Subject: [PATCH] in memory fake db players --- src/main/java/mc/core/Look.java | 14 +++++++ src/main/java/mc/core/Player.java | 12 ++++++ src/main/java/mc/core/PlayerManager.java | 6 ++- .../core/embedded/InMemoryPlayerManager.java | 26 +++++++----- .../mc/core/network/BroadcastNetChannel.java | 6 +-- .../network/proto_125/netty/NettyPlayer.java | 3 ++ .../proto_125/netty/PacketHandler.java | 40 +++++++++++-------- 7 files changed, 75 insertions(+), 32 deletions(-) create mode 100644 src/main/java/mc/core/Look.java diff --git a/src/main/java/mc/core/Look.java b/src/main/java/mc/core/Look.java new file mode 100644 index 0000000..594b214 --- /dev/null +++ b/src/main/java/mc/core/Look.java @@ -0,0 +1,14 @@ +/* + * DmitriyMX + * 2018-04-22 + */ +package mc.core; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Look { + private float yaw, pitch; +} diff --git a/src/main/java/mc/core/Player.java b/src/main/java/mc/core/Player.java index 5298f6b..96d8fc2 100644 --- a/src/main/java/mc/core/Player.java +++ b/src/main/java/mc/core/Player.java @@ -8,8 +8,20 @@ import mc.core.network.NetChannel; public interface Player { int getId(); + void setId(int value); + String getName(); + void setName(String value); + + boolean isOnline(); + void setOnline(boolean status); + NetChannel getChannel(); + void setChannel(NetChannel channel); + Location getLocation(); void setLocation(Location location); + + Look getLook(); + void setLook(Look look); } diff --git a/src/main/java/mc/core/PlayerManager.java b/src/main/java/mc/core/PlayerManager.java index ab28208..4f93d3e 100644 --- a/src/main/java/mc/core/PlayerManager.java +++ b/src/main/java/mc/core/PlayerManager.java @@ -6,10 +6,12 @@ package mc.core; import mc.core.network.NetChannel; +import java.util.Optional; + public interface PlayerManager { void addPlayer(Player player); - Player getPlayer(String name); - Player getPlayerById(int id); + Optional getPlayer(String name); + Optional getPlayerById(int id); void removePlayer(Player player); NetChannel getBroadcastChannel(); } diff --git a/src/main/java/mc/core/embedded/InMemoryPlayerManager.java b/src/main/java/mc/core/embedded/InMemoryPlayerManager.java index adf83d6..0de4501 100644 --- a/src/main/java/mc/core/embedded/InMemoryPlayerManager.java +++ b/src/main/java/mc/core/embedded/InMemoryPlayerManager.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; @Slf4j public class InMemoryPlayerManager implements PlayerManager, Runnable { @@ -23,6 +24,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { private final Object lock = new Object(); @Setter private int keepAliveInterval = 1; + private BroadcastNetChannel broadcastNetChannel = new BroadcastNetChannel(); @Autowired public InMemoryPlayerManager(Config config) { @@ -41,30 +43,34 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { } @Override - public Player getPlayer(final String name) { + public Optional getPlayer(final String name) { return players.stream() .filter(player -> player.getName().equalsIgnoreCase(name)) - .findFirst() - .get(); + .findFirst(); } @Override - public Player getPlayerById(final int id) { + public Optional getPlayerById(final int id) { return players.stream() .filter(player -> player.getId() == id) - .findFirst() - .get(); + .findFirst(); } @Override public void removePlayer(Player player) { - players.remove(player); + player.setOnline(false); + player.setChannel(null); log.info("Player \"{}\" left server", player.getName()); } @Override public NetChannel getBroadcastChannel() { - return new BroadcastNetChannel(players.stream()); + broadcastNetChannel.setPlayerStream( + players.stream() + .filter(Player::isOnline) + .filter(player -> player.getChannel() != null) + ); + return broadcastNetChannel; } @Override @@ -80,9 +86,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { } } - players.stream() - .parallel() - .forEach(player -> player.getChannel().sendKeepAlive()); + getBroadcastChannel().sendKeepAlive(); try { Thread.sleep(keepAliveInterval); diff --git a/src/main/java/mc/core/network/BroadcastNetChannel.java b/src/main/java/mc/core/network/BroadcastNetChannel.java index 4c6f8a4..382c0a7 100644 --- a/src/main/java/mc/core/network/BroadcastNetChannel.java +++ b/src/main/java/mc/core/network/BroadcastNetChannel.java @@ -4,14 +4,14 @@ */ package mc.core.network; -import lombok.RequiredArgsConstructor; +import lombok.Setter; import mc.core.Player; import java.util.stream.Stream; -@RequiredArgsConstructor public class BroadcastNetChannel implements NetChannel { - private final Stream playerStream; + @Setter + private Stream playerStream; @Override public void sendKeepAlive() { diff --git a/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java b/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java index 35e2f7b..f3a7764 100644 --- a/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java +++ b/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java @@ -7,6 +7,7 @@ package mc.core.network.proto_125.netty; import lombok.Getter; import lombok.Setter; import mc.core.Location; +import mc.core.Look; import mc.core.Player; import mc.core.network.NetChannel; @@ -15,6 +16,8 @@ import mc.core.network.NetChannel; public class NettyPlayer implements Player { private int id; private String name; + private boolean online; private NetChannel channel; private Location location; + private Look look; } diff --git a/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java b/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java index f29d955..9fc8ef3 100644 --- a/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java +++ b/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java @@ -10,11 +10,8 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.util.AttributeKey; import lombok.extern.slf4j.Slf4j; -import mc.core.Location; -import mc.core.Player; -import mc.core.PlayerManager; +import mc.core.*; import mc.core.network.CSPacket; -import mc.core.Config; import mc.core.network.proto_125.netty.wrappers.WrapperNetChannel; import mc.core.network.proto_125.packets.*; import org.springframework.beans.factory.annotation.Autowired; @@ -68,16 +65,26 @@ public class PacketHandler extends SimpleChannelInboundHandler { } public void onLoginPacket(Channel channel, LoginPacket packet) { - int pId = random.nextInt(9999); - Location spawnLoc = new Location(0, 65, 0); + final Location spawnLoc = new Location(0, 65, 0); + Player player; - NettyPlayer player = new NettyPlayer(); - player.setId(pId); - player.setName(packet.getPlayerName()); - player.setChannel(new WrapperNetChannel(channel)); + Optional optPlayer = playerManager.getPlayer(packet.getPlayerName()); + if (optPlayer.isPresent()) { + player = optPlayer.get(); + } else { + int pId = random.nextInt(9999); + + player = new NettyPlayer(); + player.setId(pId); + player.setName(packet.getPlayerName()); + player.setLocation(spawnLoc); + player.setLook(new Look(0f, 0f)); + player.setOnline(true); + playerManager.addPlayer(player); + } // Response login - packet.setPlayerId(pId); + packet.setPlayerId(player.getId()); packet.setLevelType("flat"); packet.setServerMode(1/*creative*/); packet.setDimension(0/*Overworld*/); @@ -149,15 +156,16 @@ public class PacketHandler extends SimpleChannelInboundHandler { // send Position and look PositionAndLookPacket posLookPkt = new PositionAndLookPacket(); - posLookPkt.setLocation(spawnLoc); - posLookPkt.setStance(spawnLoc.getY() + 1.64d); - posLookPkt.setYaw(0f); - posLookPkt.setPitch(0f); + posLookPkt.setLocation(player.getLocation()); + posLookPkt.setStance(player.getLocation().getY() + 1.64d); + posLookPkt.setYaw(player.getLook().getYaw()); + posLookPkt.setPitch(player.getLook().getPitch()); posLookPkt.setOnGround(false); channel.write(posLookPkt); - playerManager.addPlayer(player); channel.attr(ATTR_PLAYER).set(player); + player.setChannel(new WrapperNetChannel(channel)); + player.setOnline(true); channel.flush(); }