diff --git a/src/main/java/client/Character.java b/src/main/java/client/Character.java index ea8ad1c379..ee08af1f7b 100644 --- a/src/main/java/client/Character.java +++ b/src/main/java/client/Character.java @@ -584,10 +584,6 @@ public class Character extends AbstractCharacterObject { return disabledPartySearchInvites.contains(fromLeaderid); } - public void setSessionTransitionState() { - client.setCharacterOnSessionTransitionState(this.getId()); - } - public boolean getCS() { return useCS; } diff --git a/src/main/java/client/Client.java b/src/main/java/client/Client.java index 9b3377ed59..76a4476c9b 100644 --- a/src/main/java/client/Client.java +++ b/src/main/java/client/Client.java @@ -740,13 +740,6 @@ public class Client extends ChannelInboundHandlerAdapter { } } - // TODO: move to postgres. Called from all CharSelect handlers (6 in total). - // - public void setCharacterOnSessionTransitionState(int cid) { - this.updateLoginState(LoginState.SERVER_TRANSITION); - Server.getInstance().setCharacteridInTransition(this, cid); - } - public int getChannel() { return channel; } diff --git a/src/main/java/net/PacketProcessor.java b/src/main/java/net/PacketProcessor.java index b76e4c81ff..f41be30a24 100644 --- a/src/main/java/net/PacketProcessor.java +++ b/src/main/java/net/PacketProcessor.java @@ -280,7 +280,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.AFTER_LOGIN, new AfterLoginHandler(channelDeps.accountService())); registerHandler(RecvOpcode.SERVERLIST_REREQUEST, new ServerlistRequestHandler()); registerHandler(RecvOpcode.CHARLIST_REQUEST, new CharlistRequestHandler()); - registerHandler(RecvOpcode.CHAR_SELECT, new CharSelectedHandler()); + registerHandler(RecvOpcode.CHAR_SELECT, new CharSelectedHandler(channelDeps.transitionService())); registerHandler(RecvOpcode.LOGIN_PASSWORD, new LoginPasswordHandler(channelDeps.accountService(), channelDeps.transitionService())); registerHandler(RecvOpcode.RELOG, new RelogRequestHandler()); @@ -290,15 +290,18 @@ public final class PacketProcessor { registerHandler(RecvOpcode.CREATE_CHAR, new CreateCharHandler(channelDeps.characterCreator())); registerHandler(RecvOpcode.DELETE_CHAR, new DeleteCharHandler()); registerHandler(RecvOpcode.VIEW_ALL_CHAR, new ViewAllCharHandler()); - registerHandler(RecvOpcode.PICK_ALL_CHAR, new ViewAllCharSelectedHandler()); + registerHandler(RecvOpcode.PICK_ALL_CHAR, new ViewAllCharSelectedHandler(channelDeps.transitionService())); registerHandler(RecvOpcode.REGISTER_PIN, new RegisterPinHandler(channelDeps.accountService())); registerHandler(RecvOpcode.GUEST_LOGIN, new GuestLoginHandler()); - registerHandler(RecvOpcode.REGISTER_PIC, new RegisterPicHandler(channelDeps.accountService())); - registerHandler(RecvOpcode.CHAR_SELECT_WITH_PIC, new CharSelectedWithPicHandler()); + registerHandler(RecvOpcode.REGISTER_PIC, new RegisterPicHandler(channelDeps.accountService(), + channelDeps.transitionService())); + registerHandler(RecvOpcode.CHAR_SELECT_WITH_PIC, new CharSelectedWithPicHandler( + channelDeps.transitionService())); registerHandler(RecvOpcode.SET_GENDER, new SetGenderHandler(channelDeps.accountService())); - registerHandler(RecvOpcode.VIEW_ALL_WITH_PIC, new ViewAllCharSelectedWithPicHandler()); + registerHandler(RecvOpcode.VIEW_ALL_WITH_PIC, new ViewAllCharSelectedWithPicHandler( + channelDeps.transitionService())); registerHandler(RecvOpcode.VIEW_ALL_PIC_REGISTER, new ViewAllCharRegisterPicHandler( - channelDeps.accountService())); + channelDeps.accountService(), channelDeps.transitionService())); } private void registerChannelHandlers() { @@ -319,7 +322,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.MESO_DROP, new MesoDropHandler()); registerHandler(RecvOpcode.PLAYER_LOGGEDIN, new PlayerLoggedinHandler(channelDeps.characterLoader(), channelDeps.accountService(), channelDeps.noteService())); - registerHandler(RecvOpcode.CHANGE_MAP, new ChangeMapHandler()); + registerHandler(RecvOpcode.CHANGE_MAP, new ChangeMapHandler(channelDeps.transitionService())); registerHandler(RecvOpcode.MOVE_LIFE, new MoveLifeHandler()); registerHandler(RecvOpcode.CLOSE_RANGE_ATTACK, new CloseRangeDamageHandler(channelDeps.dropProvider(), channelDeps.banService())); registerHandler(RecvOpcode.RANGED_ATTACK, new RangedAttackHandler(channelDeps.dropProvider(), channelDeps.banService())); diff --git a/src/main/java/net/server/Server.java b/src/main/java/net/server/Server.java index d84f5f73df..802cb71e5b 100644 --- a/src/main/java/net/server/Server.java +++ b/src/main/java/net/server/Server.java @@ -824,12 +824,13 @@ public class Server { CharacterRepository characterRepository = new CharacterRepository(); MonsterCardRepository monsterCardRepository = new MonsterCardRepository(connection); CharacterSaver characterSaver = new CharacterSaver(connection, characterRepository, monsterCardRepository); - TransitionService transitionService = new TransitionService(characterSaver); + AccountService accountService = new AccountService(new AccountRepository(connection)); + TransitionService transitionService = new TransitionService(characterSaver, accountService); NoteService noteService = new NoteService(new NoteDao(connection)); DropProvider dropProvider = new DropProvider(new DropRepository(connection)); ShopFactory shopFactory = new ShopFactory(new ShopDao(connection)); ChannelDependencies channelDependencies = ChannelDependencies.builder() - .accountService(new AccountService(new AccountRepository(connection))) + .accountService(accountService) .characterCreator(new CharacterCreator(connection, characterRepository)) .characterLoader(new CharacterLoader(monsterCardRepository)) .characterSaver(characterSaver) @@ -1631,6 +1632,7 @@ public class Server { return SessionCoordinator.getSessionRemoteHost(client); } + // Move to TransitionService public void setCharacteridInTransition(Client client, int charId) { String remoteIp = getRemoteHost(client); diff --git a/src/main/java/net/server/channel/handlers/ChangeMapHandler.java b/src/main/java/net/server/channel/handlers/ChangeMapHandler.java index 0d1bee4cb2..2e7e0736f8 100644 --- a/src/main/java/net/server/channel/handlers/ChangeMapHandler.java +++ b/src/main/java/net/server/channel/handlers/ChangeMapHandler.java @@ -36,6 +36,7 @@ import org.slf4j.LoggerFactory; import server.Trade; import server.maps.MapleMap; import server.maps.Portal; +import service.TransitionService; import tools.PacketCreator; import java.awt.*; @@ -45,6 +46,12 @@ import java.net.UnknownHostException; public final class ChangeMapHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(ChangeMapHandler.class); + private final TransitionService transitionService; + + public ChangeMapHandler(TransitionService transitionService) { + this.transitionService = transitionService; + } + @Override public void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); @@ -188,7 +195,7 @@ public final class ChangeMapHandler extends AbstractPacketHandler { } chr.getCashShop().open(false); - chr.setSessionTransitionState(); + transitionService.setInTransition(c, chr.getId()); try { c.sendPacket(PacketCreator.getChannelChange(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]))); } catch (UnknownHostException ex) { diff --git a/src/main/java/net/server/handlers/login/CharSelectedHandler.java b/src/main/java/net/server/handlers/login/CharSelectedHandler.java index 9654531cd3..02a86c75ac 100644 --- a/src/main/java/net/server/handlers/login/CharSelectedHandler.java +++ b/src/main/java/net/server/handlers/login/CharSelectedHandler.java @@ -31,6 +31,7 @@ import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult; import net.server.world.World; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import service.TransitionService; import tools.PacketCreator; import java.net.InetAddress; @@ -39,6 +40,12 @@ import java.net.UnknownHostException; public final class CharSelectedHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(CharSelectedHandler.class); + private final TransitionService transitionService; + + public CharSelectedHandler(TransitionService transitionService) { + this.transitionService = transitionService; + } + private static int parseAntiMulticlientError(AntiMulticlientResult res) { return switch (res) { case REMOTE_PROCESSING -> 10; @@ -99,7 +106,7 @@ public final class CharSelectedHandler extends AbstractPacketHandler { } server.unregisterLoginState(c); - c.setCharacterOnSessionTransitionState(charId); + transitionService.setInTransition(c, charId); try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); @@ -107,4 +114,4 @@ public final class CharSelectedHandler extends AbstractPacketHandler { e.printStackTrace(); } } -} \ No newline at end of file +} diff --git a/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java b/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java index 11c1a9f0ad..1c6f9a7501 100644 --- a/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java +++ b/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java @@ -10,6 +10,7 @@ import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult; import net.server.world.World; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import service.TransitionService; import tools.PacketCreator; import java.net.InetAddress; @@ -18,6 +19,12 @@ import java.net.UnknownHostException; public class CharSelectedWithPicHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(CharSelectedWithPicHandler.class); + private final TransitionService transitionService; + + public CharSelectedWithPicHandler(TransitionService transitionService) { + this.transitionService = transitionService; + } + private static int parseAntiMulticlientError(AntiMulticlientResult res) { return switch (res) { case REMOTE_PROCESSING -> 10; @@ -80,7 +87,7 @@ public class CharSelectedWithPicHandler extends AbstractPacketHandler { } server.unregisterLoginState(c); - c.setCharacterOnSessionTransitionState(charId); + transitionService.setInTransition(c, charId); try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); diff --git a/src/main/java/net/server/handlers/login/RegisterPicHandler.java b/src/main/java/net/server/handlers/login/RegisterPicHandler.java index c94e12c1e3..ef01d6dda6 100644 --- a/src/main/java/net/server/handlers/login/RegisterPicHandler.java +++ b/src/main/java/net/server/handlers/login/RegisterPicHandler.java @@ -11,6 +11,7 @@ import net.server.world.World; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import service.AccountService; +import service.TransitionService; import tools.PacketCreator; import java.net.InetAddress; @@ -19,10 +20,12 @@ import java.net.UnknownHostException; public final class RegisterPicHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(RegisterPicHandler.class); + private final TransitionService transitionService; private final AccountService accountService; - public RegisterPicHandler(AccountService accountService) { + public RegisterPicHandler(AccountService accountService, TransitionService transitionService) { this.accountService = accountService; + this.transitionService = transitionService; } @Override @@ -81,7 +84,7 @@ public final class RegisterPicHandler extends AbstractPacketHandler { } server.unregisterLoginState(c); - c.setCharacterOnSessionTransitionState(charId); + transitionService.setInTransition(c, charId); try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); diff --git a/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java index 41e42d4872..92322146ca 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java @@ -11,6 +11,7 @@ import net.server.world.World; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import service.AccountService; +import service.TransitionService; import tools.PacketCreator; import tools.Randomizer; @@ -21,9 +22,11 @@ public final class ViewAllCharRegisterPicHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(ViewAllCharRegisterPicHandler.class); private final AccountService accountService; + private final TransitionService transitionService; - public ViewAllCharRegisterPicHandler(AccountService accountService) { + public ViewAllCharRegisterPicHandler(AccountService accountService, TransitionService transitionService) { this.accountService = accountService; + this.transitionService = transitionService; } @Override @@ -85,7 +88,7 @@ public final class ViewAllCharRegisterPicHandler extends AbstractPacketHandler { } server.unregisterLoginState(c); - c.setCharacterOnSessionTransitionState(charId); + transitionService.setInTransition(c, charId); try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); diff --git a/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java index 3dc0ba8f58..fbf6c8cd70 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java @@ -31,6 +31,7 @@ import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult; import net.server.world.World; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import service.TransitionService; import tools.PacketCreator; import tools.Randomizer; @@ -40,6 +41,12 @@ import java.net.UnknownHostException; public final class ViewAllCharSelectedHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(ViewAllCharSelectedHandler.class); + private final TransitionService transitionService; + + public ViewAllCharSelectedHandler(TransitionService transitionService) { + this.transitionService = transitionService; + } + private static int parseAntiMulticlientError(AntiMulticlientResult res) { return switch (res) { case REMOTE_PROCESSING -> 10; @@ -110,7 +117,7 @@ public final class ViewAllCharSelectedHandler extends AbstractPacketHandler { } server.unregisterLoginState(c); - c.setCharacterOnSessionTransitionState(charId); + transitionService.setInTransition(c, charId); try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); diff --git a/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java index c5fb6b4600..9364a6e5f3 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java @@ -10,6 +10,7 @@ import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult; import net.server.world.World; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import service.TransitionService; import tools.PacketCreator; import tools.Randomizer; @@ -19,6 +20,12 @@ import java.net.UnknownHostException; public class ViewAllCharSelectedWithPicHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(ViewAllCharSelectedWithPicHandler.class); + private final TransitionService transitionService; + + public ViewAllCharSelectedWithPicHandler(TransitionService transitionService) { + this.transitionService = transitionService; + } + private static int parseAntiMulticlientError(AntiMulticlientResult res) { return switch (res) { case REMOTE_PROCESSING -> 10; @@ -86,7 +93,7 @@ public class ViewAllCharSelectedWithPicHandler extends AbstractPacketHandler { } server.unregisterLoginState(c); - c.setCharacterOnSessionTransitionState(charId); + transitionService.setInTransition(c, charId); try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); diff --git a/src/main/java/service/AccountService.java b/src/main/java/service/AccountService.java index 38fef5d005..80879d512b 100644 --- a/src/main/java/service/AccountService.java +++ b/src/main/java/service/AccountService.java @@ -220,19 +220,27 @@ public class AccountService { return false; } - setLoginStateMysql(c.getAccID(), newState); - setLoginStatePostgres(c.getAccID(), newState); - c.setLoginState(newState); + setLoginState(c, newState); return true; } public void logOut(Client c) { SessionCoordinator.getInstance().closeSession(c, false); - byte newState = LoginState.NOT_LOGGED_IN; - int accountId = c.getAccID(); + setLoginState(c, LoginState.NOT_LOGGED_IN); + } + + public void setInTransition(Client c) { + setLoginState(c, LoginState.SERVER_TRANSITION); + } + + private void setLoginState(Client c, byte newState) { + saveLoginState(c.getAccID(), newState); + c.setLoginState(newState); + } + + private void saveLoginState(int accountId, byte newState) { setLoginStateMysql(accountId, newState); setLoginStatePostgres(accountId, newState); - c.setLoginState(newState); } private void setLoginStateMysql(int accountId, byte newState) { diff --git a/src/main/java/service/TransitionService.java b/src/main/java/service/TransitionService.java index 112273b711..5c857715ae 100644 --- a/src/main/java/service/TransitionService.java +++ b/src/main/java/service/TransitionService.java @@ -34,9 +34,11 @@ public class TransitionService { private static final Logger log = LoggerFactory.getLogger(TransitionService.class); private final Server server = Server.getInstance(); private final CharacterSaver chrSaver; + private final AccountService accountService; - public TransitionService(CharacterSaver characterSaver) { + public TransitionService(CharacterSaver characterSaver, AccountService accountService) { this.chrSaver = characterSaver; + this.accountService = accountService; } public void changeChannel(Client c, int channel) { @@ -88,7 +90,7 @@ public class TransitionService { chrSaver.save(chr); - chr.setSessionTransitionState(); + setInTransition(chr.getClient(), chr.getId()); try { c.sendPacket(PacketCreator.getChannelChange(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]))); } catch (IOException e) { @@ -96,6 +98,11 @@ public class TransitionService { } } + public void setInTransition(Client c, int chrId) { + accountService.setInTransition(c); + Server.getInstance().setCharacteridInTransition(c, chrId); + } + public void disconnect(final Client c, final boolean shutdown) { if (c.tryDisconnect()) { ThreadManager.getInstance().newTask(() -> disconnectInternal(c, shutdown));