From da4a4674533c7491919676c232433ff0025558a4 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 29 Sep 2024 08:22:26 +0200 Subject: [PATCH] Set in transition on log in, now able to enter the game The state is not set properly on logout though, so once you log out you can't log back in --- src/main/java/client/Character.java | 4 ---- src/main/java/client/Client.java | 7 ------- src/main/java/net/PacketProcessor.java | 17 +++++++++------- src/main/java/net/server/Server.java | 6 ++++-- .../channel/handlers/ChangeMapHandler.java | 9 ++++++++- .../handlers/login/CharSelectedHandler.java | 11 ++++++++-- .../login/CharSelectedWithPicHandler.java | 9 ++++++++- .../handlers/login/RegisterPicHandler.java | 7 +++++-- .../login/ViewAllCharRegisterPicHandler.java | 7 +++++-- .../login/ViewAllCharSelectedHandler.java | 9 ++++++++- .../ViewAllCharSelectedWithPicHandler.java | 9 ++++++++- src/main/java/service/AccountService.java | 20 +++++++++++++------ src/main/java/service/TransitionService.java | 11 ++++++++-- 13 files changed, 88 insertions(+), 38 deletions(-) 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));