diff --git a/src/main/java/client/Client.java b/src/main/java/client/Client.java index 34dc92a406..04bbe340e0 100644 --- a/src/main/java/client/Client.java +++ b/src/main/java/client/Client.java @@ -22,7 +22,6 @@ along with this program. If not, see . package client; import config.YamlConfig; -import constants.game.GameConstants; import constants.id.MapId; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; @@ -1092,22 +1091,6 @@ public class Client extends ChannelInboundHandlerAdapter { return disconnect; } - public void checkChar(int accid) { /// issue with multiple chars from same account login found by shavit, resinate - if (!YamlConfig.config.server.USE_CHARACTER_ACCOUNT_CHECK) { - return; - } - - for (World w : Server.getInstance().getWorlds()) { - for (Character chr : w.getPlayerStorage().getAllCharacters()) { - if (accid == chr.getAccountID()) { - log.warn("Chr {} has been removed from world {}. Possible Dupe attempt.", chr.getName(), GameConstants.WORLD_NAMES[w.getId()]); - chr.getClient().forceDisconnect(); - w.getPlayerStorage().removePlayer(chr.getId()); - } - } - } - } - public void lockClient() { lock.lock(); } diff --git a/src/main/java/net/PacketProcessor.java b/src/main/java/net/PacketProcessor.java index d038dc12b5..c4d2686111 100644 --- a/src/main/java/net/PacketProcessor.java +++ b/src/main/java/net/PacketProcessor.java @@ -118,7 +118,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.SERVERLIST_REREQUEST, new ServerlistRequestHandler()); registerHandler(RecvOpcode.CHARLIST_REQUEST, new CharlistRequestHandler()); registerHandler(RecvOpcode.CHAR_SELECT, new CharSelectedHandler()); - registerHandler(RecvOpcode.LOGIN_PASSWORD, new LoginPasswordHandler()); + registerHandler(RecvOpcode.LOGIN_PASSWORD, new LoginPasswordHandler(channelDeps.transitionService())); registerHandler(RecvOpcode.RELOG, new RelogRequestHandler()); registerHandler(RecvOpcode.SERVERLIST_REQUEST, new ServerlistRequestHandler()); registerHandler(RecvOpcode.SERVERSTATUS_REQUEST, new ServerStatusRequestHandler()); @@ -128,7 +128,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.VIEW_ALL_CHAR, new ViewAllCharHandler()); registerHandler(RecvOpcode.PICK_ALL_CHAR, new ViewAllCharSelectedHandler()); registerHandler(RecvOpcode.REGISTER_PIN, new RegisterPinHandler()); - registerHandler(RecvOpcode.GUEST_LOGIN, new GuestLoginHandler()); + registerHandler(RecvOpcode.GUEST_LOGIN, new GuestLoginHandler(channelDeps.transitionService())); registerHandler(RecvOpcode.REGISTER_PIC, new RegisterPicHandler()); registerHandler(RecvOpcode.CHAR_SELECT_WITH_PIC, new CharSelectedWithPicHandler()); registerHandler(RecvOpcode.SET_GENDER, new SetGenderHandler()); diff --git a/src/main/java/net/server/PlayerStorage.java b/src/main/java/net/server/PlayerStorage.java index fd406cadbb..bffb36dc12 100644 --- a/src/main/java/net/server/PlayerStorage.java +++ b/src/main/java/net/server/PlayerStorage.java @@ -23,6 +23,7 @@ package net.server; import client.Character; import client.Client; +import service.TransitionService; import java.util.*; import java.util.concurrent.locks.Lock; @@ -30,12 +31,14 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class PlayerStorage { + private final TransitionService transitionService; private final Map storage = new LinkedHashMap<>(); private final Map nameStorage = new LinkedHashMap<>(); private final Lock rlock; private final Lock wlock; - public PlayerStorage() { + public PlayerStorage(TransitionService transitionService) { + this.transitionService = transitionService; ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true); this.rlock = readWriteLock.readLock(); this.wlock = readWriteLock.writeLock(); @@ -104,7 +107,7 @@ public class PlayerStorage { for (Character mc : chrList) { Client client = mc.getClient(); if (client != null) { - client.forceDisconnect(); + transitionService.forceDisconnect(client); } } @@ -124,4 +127,4 @@ public class PlayerStorage { rlock.unlock(); } } -} \ No newline at end of file +} diff --git a/src/main/java/net/server/channel/Channel.java b/src/main/java/net/server/channel/Channel.java index fc5fb41da6..99888028d9 100644 --- a/src/main/java/net/server/channel/Channel.java +++ b/src/main/java/net/server/channel/Channel.java @@ -70,13 +70,14 @@ public final class Channel { private final int world; private final int channel; - private PlayerStorage players = new PlayerStorage(); + private PlayerStorage players; private ChannelServer channelServer; private String serverMessage; private MapManager mapManager; private EventScriptManager eventSM; private ServicesManager services; private final DropProvider dropProvider; + private final TransitionService transitionService; private final Map hiredMerchants = new HashMap<>(); private final Map storedVars = new HashMap<>(); private final Set playersAway = new HashSet<>(); @@ -115,6 +116,8 @@ public final class Channel { this.world = world; this.channel = channel; this.dropProvider = channelDependencies.dropProvider(); + this.transitionService = channelDependencies.transitionService(); + this.players = new PlayerStorage(channelDependencies.transitionService()); this.ongoingStartTime = startTime + 10000; // rude approach to a world's last channel boot time, placeholder for the 1st wedding reservation ever this.mapManager = new MapManager(null, world, channel, dropProvider); @@ -341,7 +344,7 @@ public final class Channel { for (Integer cid : playersAway) { Character chr = wserv.getPlayerStorage().getCharacterById(cid); if (chr != null && chr.isLoggedin()) { - chr.getClient().forceDisconnect(); + transitionService.forceDisconnect(chr.getClient()); } } } diff --git a/src/main/java/net/server/handlers/login/GuestLoginHandler.java b/src/main/java/net/server/handlers/login/GuestLoginHandler.java index dc23390bef..70c33c63d2 100644 --- a/src/main/java/net/server/handlers/login/GuestLoginHandler.java +++ b/src/main/java/net/server/handlers/login/GuestLoginHandler.java @@ -24,17 +24,23 @@ package net.server.handlers.login; import client.Client; import net.AbstractPacketHandler; import net.packet.InPacket; +import service.TransitionService; import tools.PacketCreator; /* * @author David */ public final class GuestLoginHandler extends AbstractPacketHandler { + private final TransitionService transitionService; + + public GuestLoginHandler(TransitionService transitionService) { + this.transitionService = transitionService; + } @Override public final void handlePacket(InPacket p, Client c) { c.sendPacket(PacketCreator.sendGuestTOS()); //System.out.println(slea.toString()); - new LoginPasswordHandler().handlePacket(p, c); + new LoginPasswordHandler(transitionService).handlePacket(p, c); } } diff --git a/src/main/java/net/server/handlers/login/LoginPasswordHandler.java b/src/main/java/net/server/handlers/login/LoginPasswordHandler.java index 2e698de907..4fda128801 100644 --- a/src/main/java/net/server/handlers/login/LoginPasswordHandler.java +++ b/src/main/java/net/server/handlers/login/LoginPasswordHandler.java @@ -21,13 +21,19 @@ */ package net.server.handlers.login; +import client.Character; import client.Client; import client.DefaultDates; import config.YamlConfig; +import constants.game.GameConstants; import net.PacketHandler; import net.packet.InPacket; import net.server.Server; import net.server.coordinator.session.Hwid; +import net.server.world.World; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import service.TransitionService; import tools.BCrypt; import tools.DatabaseConnection; import tools.HexTool; @@ -41,6 +47,12 @@ import java.sql.*; import java.util.Calendar; public final class LoginPasswordHandler implements PacketHandler { + private static final Logger log = LoggerFactory.getLogger(LoginPasswordHandler.class); + private final TransitionService transitionService; + + public LoginPasswordHandler(TransitionService transitionService) { + this.transitionService = transitionService; + } @Override public boolean validateState(Client c) { @@ -124,13 +136,30 @@ public final class LoginPasswordHandler implements PacketHandler { return; } if (c.finishLogin()) { - c.checkChar(c.getAccID()); + checkChar(c); login(c); } else { c.sendPacket(PacketCreator.getLoginFailed(7)); } } + private void checkChar(Client c) { // issue with multiple chars from same account login found by shavit, resinate + if (!YamlConfig.config.server.USE_CHARACTER_ACCOUNT_CHECK) { + return; + } + + final int accId = c.getAccID(); + for (World w : Server.getInstance().getWorlds()) { + for (Character chr : w.getPlayerStorage().getAllCharacters()) { + if (accId == chr.getAccountID()) { + log.warn("Chr {} has been removed from world {}. Possible Dupe attempt.", chr.getName(), GameConstants.WORLD_NAMES[w.getId()]); + transitionService.forceDisconnect(c); + w.getPlayerStorage().removePlayer(chr.getId()); + } + } + } + } + private static void login(Client c) { c.sendPacket(PacketCreator.getAuthSuccess(c));//why the fk did I do c.getAccountName()? Server.getInstance().registerLoginState(c); diff --git a/src/main/java/net/server/world/World.java b/src/main/java/net/server/world/World.java index cc85a274f7..bde37c3a0c 100644 --- a/src/main/java/net/server/world/World.java +++ b/src/main/java/net/server/world/World.java @@ -98,7 +98,7 @@ public class World { private final Map relationships = new HashMap<>(); private final Map> relationshipCouples = new HashMap<>(); private final Map gsStore = new HashMap<>(); - private PlayerStorage players = new PlayerStorage(); + private PlayerStorage players; private final ServicesManager services = new ServicesManager(WorldServices.SAVE_CHARACTER); private final MatchCheckerCoordinator matchChecker = new MatchCheckerCoordinator(); private final PartySearchCoordinator partySearch = new PartySearchCoordinator(); @@ -177,6 +177,8 @@ public class World { runningPartyId.set(1000000001); // partyid must not clash with charid to solve update item looting issues, found thanks to Vcoc runningMessengerId.set(1); + this.players = new PlayerStorage(transitionService); + ReadWriteLock channelLock = new ReentrantReadWriteLock(true); this.chnRLock = channelLock.readLock(); this.chnWLock = channelLock.writeLock();