From fc591859224b8b411a3f9dea7be04a0bccbb6043 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 26 Apr 2018 21:26:56 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D0=BE=D1=80=D0=B3=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=8B=20Player=20manager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit f92b80d0ae10c329477ce39e41147a320301c2d5) --- core/src/main/java/mc/core/Player.java | 5 --- core/src/main/java/mc/core/PlayerManager.java | 6 +-- .../core/embedded/InMemoryPlayerManager.java | 44 ++++++++----------- .../java/mc/core/embedded/SimplePlayer.java | 21 +++++++++ .../network/proto_125/packets/KickPacket.java | 4 ++ .../network/proto_125/netty/NettyPlayer.java | 23 ---------- .../proto_125/netty/PacketHandler.java | 22 +++++----- 7 files changed, 58 insertions(+), 67 deletions(-) create mode 100644 core/src/main/java/mc/core/embedded/SimplePlayer.java delete mode 100644 proto125_netty/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java diff --git a/core/src/main/java/mc/core/Player.java b/core/src/main/java/mc/core/Player.java index 96d8fc2..215570a 100644 --- a/core/src/main/java/mc/core/Player.java +++ b/core/src/main/java/mc/core/Player.java @@ -8,13 +8,8 @@ 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); diff --git a/core/src/main/java/mc/core/PlayerManager.java b/core/src/main/java/mc/core/PlayerManager.java index 4f93d3e..2ff210f 100644 --- a/core/src/main/java/mc/core/PlayerManager.java +++ b/core/src/main/java/mc/core/PlayerManager.java @@ -9,9 +9,9 @@ import mc.core.network.NetChannel; import java.util.Optional; public interface PlayerManager { - void addPlayer(Player player); + Player createPlayer(String name); + void joinServer(Player player); + void leftServer(Player player); Optional getPlayer(String name); - Optional getPlayerById(int id); - void removePlayer(Player player); NetChannel getBroadcastChannel(); } diff --git a/core/src/main/java/mc/core/embedded/InMemoryPlayerManager.java b/core/src/main/java/mc/core/embedded/InMemoryPlayerManager.java index 520f0f8..e3070e0 100644 --- a/core/src/main/java/mc/core/embedded/InMemoryPlayerManager.java +++ b/core/src/main/java/mc/core/embedded/InMemoryPlayerManager.java @@ -13,13 +13,11 @@ import mc.core.network.BroadcastNetChannel; import mc.core.network.NetChannel; import org.springframework.beans.factory.annotation.Autowired; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; @Slf4j public class InMemoryPlayerManager implements PlayerManager, Runnable { + private static final Random rand = new Random(); private List players; private final Object lock = new Object(); @Setter @@ -33,12 +31,26 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { } @Override - public void addPlayer(Player player) { + public Player createPlayer(String name) { + SimplePlayer player = new SimplePlayer(); + player.setId(rand.nextInt(10000)); + player.setName(name); + synchronized (lock) { players.add(player); lock.notify(); - log.info("Player \"{}\" join server", player.getName()); } + return player; + } + + @Override + public void joinServer(Player player) { + ((SimplePlayer) player).setOnline(true); + } + + @Override + public void leftServer(Player player) { + ((SimplePlayer) player).setOnline(false); } @Override @@ -48,27 +60,9 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { .findFirst(); } - @Override - public Optional getPlayerById(final int id) { - return players.stream() - .filter(player -> player.getId() == id) - .findFirst(); - } - - @Override - public void removePlayer(Player player) { - player.setOnline(false); - player.setChannel(null); - log.info("Player \"{}\" left server", player.getName()); - } - @Override public NetChannel getBroadcastChannel() { - return new BroadcastNetChannel( - players.stream() - .filter(Player::isOnline) - .filter(player -> player.getChannel() != null) - ); + return new BroadcastNetChannel(players.stream().filter(Player::isOnline)); } @Override diff --git a/core/src/main/java/mc/core/embedded/SimplePlayer.java b/core/src/main/java/mc/core/embedded/SimplePlayer.java new file mode 100644 index 0000000..6ac251b --- /dev/null +++ b/core/src/main/java/mc/core/embedded/SimplePlayer.java @@ -0,0 +1,21 @@ +/* + * DmitriyMX + * 2018-04-23 + */ +package mc.core.embedded; + +import lombok.Data; +import mc.core.Location; +import mc.core.Look; +import mc.core.Player; +import mc.core.network.NetChannel; + +@Data +public class SimplePlayer implements Player { + private int id; + private String name; + private boolean online = false; + private NetChannel channel; + private Location location = new Location(0, 0, 0); + private Look look = new Look(0, 0); +} diff --git a/proto125/src/main/java/mc/core/network/proto_125/packets/KickPacket.java b/proto125/src/main/java/mc/core/network/proto_125/packets/KickPacket.java index f843962..c5c49d6 100644 --- a/proto125/src/main/java/mc/core/network/proto_125/packets/KickPacket.java +++ b/proto125/src/main/java/mc/core/network/proto_125/packets/KickPacket.java @@ -4,6 +4,8 @@ */ package mc.core.network.proto_125.packets; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; @@ -13,6 +15,8 @@ import mc.core.network.SCPacket; import mc.core.network.proto_125.ByteArrayOutputNetStream; @Slf4j +@NoArgsConstructor +@AllArgsConstructor @Setter @ToString public class KickPacket implements SCPacket, CSPacket { diff --git a/proto125_netty/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java b/proto125_netty/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java deleted file mode 100644 index f3a7764..0000000 --- a/proto125_netty/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * DmitriyMX - * 2018-04-15 - */ -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; - -@Getter -@Setter -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/proto125_netty/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java b/proto125_netty/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java index 6057f9e..d043b59 100644 --- a/proto125_netty/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java +++ b/proto125_netty/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java @@ -6,6 +6,7 @@ package mc.core.network.proto_125.netty; import io.netty.channel.Channel; +import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.util.AttributeKey; @@ -19,11 +20,9 @@ import org.springframework.beans.factory.annotation.Autowired; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Optional; -import java.util.Random; @Slf4j public class PacketHandler extends SimpleChannelInboundHandler { - private static final Random random = new Random(); private static final AttributeKey ATTR_PLAYER = AttributeKey.newInstance("ATTR_PLAYER"); @Autowired private Config config; @@ -35,7 +34,8 @@ public class PacketHandler extends SimpleChannelInboundHandler { super.channelInactive(context); Player player = context.channel().attr(ATTR_PLAYER).get(); if (player != null) { - playerManager.removePlayer(player); + playerManager.leftServer(player); + player.setChannel(null); } context.channel().attr(ATTR_PLAYER).set(null); } @@ -72,16 +72,16 @@ public class PacketHandler extends SimpleChannelInboundHandler { 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()); + if (player.isOnline()) { + channel.writeAndFlush(new KickPacket("Player is exists in server")) + .addListener(ChannelFutureListener.CLOSE); + return; + } + } else { + player = playerManager.createPlayer(packet.getPlayerName()); player.setLocation(spawnLoc); player.setLook(new Look(0f, 0f)); - player.setOnline(true); - playerManager.addPlayer(player); } // Response login @@ -165,7 +165,7 @@ public class PacketHandler extends SimpleChannelInboundHandler { channel.attr(ATTR_PLAYER).set(player); player.setChannel(new WrapperNetChannel(channel)); - player.setOnline(true); + playerManager.joinServer(player); channel.flush(); }