diff --git a/src/main/java/emu/lunarcore/game/service/ChatService.java b/src/main/java/emu/lunarcore/game/service/ChatService.java index 4521ac5..cdd8d8d 100644 --- a/src/main/java/emu/lunarcore/game/service/ChatService.java +++ b/src/main/java/emu/lunarcore/game/service/ChatService.java @@ -24,7 +24,7 @@ public class ChatService extends BaseGameService { } // Get target - Player target = getServer().getPlayerByUid(targetUid); + Player target = getServer().getOnlinePlayerByUid(targetUid); if (target == null) { return; @@ -35,7 +35,7 @@ public class ChatService extends BaseGameService { public void sendPrivChat(Player player, int targetUid, int emote) { // Get target - Player target = getServer().getPlayerByUid(targetUid); + Player target = getServer().getOnlinePlayerByUid(targetUid); if (target == null) { return; diff --git a/src/main/java/emu/lunarcore/server/game/GameServer.java b/src/main/java/emu/lunarcore/server/game/GameServer.java index 4e67bd4..cb620fb 100644 --- a/src/main/java/emu/lunarcore/server/game/GameServer.java +++ b/src/main/java/emu/lunarcore/server/game/GameServer.java @@ -24,6 +24,7 @@ public class GameServer extends KcpServer { private final RegionInfo info; private final InetSocketAddress address; + @Getter private final GameServerPacketHandler packetHandler; private final Int2ObjectMap players; @@ -41,7 +42,7 @@ public class GameServer extends KcpServer { this.address = new InetSocketAddress(serverConfig.bindAddress, serverConfig.getPort()); this.packetHandler = new GameServerPacketHandler(); - this.players = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>()); + this.players = new Int2ObjectOpenHashMap<>(); // Setup managers this.battleService = new BattleService(this); @@ -58,20 +59,25 @@ public class GameServer extends KcpServer { return this.serverConfig; } - public GameServerPacketHandler getPacketHandler() { - return this.packetHandler; - } - public void registerPlayer(Player player) { - players.put(player.getUid(), player); + synchronized (this.players) { + this.players.put(player.getUid(), player); + } + } + + public void deregisterPlayer(Player player) { + synchronized (this.players) { + Player check = this.players.get(player.getUid()); + if (check == player) { + this.players.remove(player.getUid()); + } + } } - public void deregisterPlayer(int uid) { - players.remove(uid); - } - - public Player getPlayerByUid(int uid) { - return players.get(uid); + public Player getOnlinePlayerByUid(int uid) { + synchronized (this.players) { + return this.players.get(uid); + } } public void start() { @@ -96,6 +102,9 @@ public class GameServer extends KcpServer { } private void onShutdown() { + // Close server socket + this.stop(); + // Set region info this.info.setUp(false); this.info.save(); diff --git a/src/main/java/emu/lunarcore/server/game/GameSession.java b/src/main/java/emu/lunarcore/server/game/GameSession.java index 6fe7e4e..0c6f7b5 100644 --- a/src/main/java/emu/lunarcore/server/game/GameSession.java +++ b/src/main/java/emu/lunarcore/server/game/GameSession.java @@ -77,7 +77,7 @@ public class GameSession { // Save first player.save(); // Deregister - this.getServer().deregisterPlayer(player.getUid()); + this.getServer().deregisterPlayer(player); } } diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerGetTokenCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerGetTokenCsReq.java index 89962f9..1933431 100644 --- a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerGetTokenCsReq.java +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerGetTokenCsReq.java @@ -35,6 +35,12 @@ public class HandlerPlayerGetTokenCsReq extends PacketHandler { player = new Player(session); LunarRail.getGameDatabase().save(player); } + + // Dont let people log on to the same player at the same time + Player prevPlayer = session.getServer().getOnlinePlayerByUid(player.getUid()); + if (prevPlayer != null) { + prevPlayer.getSession().close(); + } // Set player object for session session.setPlayer(player);