From f6d06ba82a42627de20617045c34bc8420d76da2 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 6 Aug 2023 21:14:32 +0200 Subject: [PATCH] Extract "char list" from Client to handler --- src/main/java/client/Client.java | 35 ------------- .../login/CharlistRequestHandler.java | 51 ++++++++++++++++++- src/main/java/tools/PacketCreator.java | 7 +-- 3 files changed, 51 insertions(+), 42 deletions(-) diff --git a/src/main/java/client/Client.java b/src/main/java/client/Client.java index c722d4f55e..27a21e4b4e 100644 --- a/src/main/java/client/Client.java +++ b/src/main/java/client/Client.java @@ -27,7 +27,6 @@ import constants.id.MapId; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.timeout.IdleStateEvent; -import model.CharacterIdentity; import net.PacketHandler; import net.PacketProcessor; import net.netty.DisconnectException; @@ -302,40 +301,6 @@ public class Client extends ChannelInboundHandlerAdapter { return new AbstractPlayerInteraction(this); } - public void sendCharList(int server) { - this.sendPacket(PacketCreator.getCharList(this, server, 0)); - } - - public List loadCharacters(int serverId) { - List chars = new ArrayList<>(15); - try { - for (CharacterIdentity cni : loadCharactersInternal(serverId)) { - chars.add(Character.loadCharFromDB(cni.id(), this, false)); - } - } catch (Exception e) { - e.printStackTrace(); - } - return chars; - } - - private List loadCharactersInternal(int worldId) { - List chars = new ArrayList<>(15); - try (Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT id, name FROM characters WHERE accountid = ? AND world = ?")) { - ps.setInt(1, this.getAccID()); - ps.setInt(2, worldId); - - try (ResultSet rs = ps.executeQuery()) { - while (rs.next()) { - chars.add(new CharacterIdentity(rs.getString("name"), rs.getInt("id"))); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return chars; - } - public boolean isLoggedIn() { return loggedIn; } diff --git a/src/main/java/net/server/handlers/login/CharlistRequestHandler.java b/src/main/java/net/server/handlers/login/CharlistRequestHandler.java index 0ca780dc50..cbfad27e2c 100644 --- a/src/main/java/net/server/handlers/login/CharlistRequestHandler.java +++ b/src/main/java/net/server/handlers/login/CharlistRequestHandler.java @@ -21,14 +21,25 @@ */ package net.server.handlers.login; +import client.Character; import client.Client; +import model.CharacterIdentity; import net.AbstractPacketHandler; import net.packet.InPacket; +import net.packet.Packet; import net.server.Server; import net.server.channel.Channel; import net.server.world.World; +import tools.DatabaseConnection; import tools.PacketCreator; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + public final class CharlistRequestHandler extends AbstractPacketHandler { @Override @@ -51,6 +62,42 @@ public final class CharlistRequestHandler extends AbstractPacketHandler { c.setWorld(world); c.setChannel(channel); - c.sendCharList(world); + sendChrList(c, world); } -} \ No newline at end of file + + private void sendChrList(Client c, int worldId) { + List chrs = loadChrs(c, worldId); + Packet charListPacket = PacketCreator.getCharList(c, chrs, 0); + c.sendPacket(charListPacket); + } + + private List loadChrs(Client c, int worldId) { + List chars = new ArrayList<>(); + try { + for (CharacterIdentity identity : loadChrIdentities(c.getAccID(), worldId)) { + chars.add(Character.loadCharFromDB(identity.id(), c, false)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return chars; + } + + private List loadChrIdentities(int accountId, int worldId) { + List chars = new ArrayList<>(15); + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("SELECT id, name FROM characters WHERE accountid = ? AND world = ?")) { + ps.setInt(1, accountId); + ps.setInt(2, worldId); + + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + chars.add(new CharacterIdentity(rs.getString("name"), rs.getInt("id"))); + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + return chars; + } +} diff --git a/src/main/java/tools/PacketCreator.java b/src/main/java/tools/PacketCreator.java index 033edab0b6..5660eaebe6 100644 --- a/src/main/java/tools/PacketCreator.java +++ b/src/main/java/tools/PacketCreator.java @@ -859,14 +859,11 @@ public class PacketCreator { *
17: Wrong gateway or personal info
*
21: Verify account via email
*/ - public static Packet getCharList(Client c, int serverId, int status) { + public static Packet getCharList(Client c, List chars, int status) { final OutPacket p = OutPacket.create(SendOpcode.CHARLIST); p.writeByte(status); - List chars = c.loadCharacters(serverId); p.writeByte((byte) chars.size()); - for (Character chr : chars) { - addCharEntry(p, chr, false); - } + chars.forEach(chr -> addCharEntry(p, chr, false)); p.writeByte(YamlConfig.config.server.ENABLE_PIC && !c.canBypassPic() ? (c.getPic() == null || c.getPic().equals("") ? 0 : 1) : 2); p.writeInt(YamlConfig.config.server.COLLECTIVE_CHARSLOT ? chars.size() + c.getAvailableCharacterSlots() : c.getCharacterSlots());