Extract "char list" from Client to handler

This commit is contained in:
P0nk
2023-08-06 21:14:32 +02:00
parent bbee8d7caa
commit f6d06ba82a
3 changed files with 51 additions and 42 deletions

View File

@@ -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<Character> loadCharacters(int serverId) {
List<Character> 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<CharacterIdentity> loadCharactersInternal(int worldId) {
List<CharacterIdentity> 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;
}

View File

@@ -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);
}
}
private void sendChrList(Client c, int worldId) {
List<Character> chrs = loadChrs(c, worldId);
Packet charListPacket = PacketCreator.getCharList(c, chrs, 0);
c.sendPacket(charListPacket);
}
private List<Character> loadChrs(Client c, int worldId) {
List<Character> 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<CharacterIdentity> loadChrIdentities(int accountId, int worldId) {
List<CharacterIdentity> 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;
}
}

View File

@@ -859,14 +859,11 @@ public class PacketCreator {
* <br> 17: Wrong gateway or personal info<br>
* <br> 21: Verify account via email<br>
*/
public static Packet getCharList(Client c, int serverId, int status) {
public static Packet getCharList(Client c, List<Character> chars, int status) {
final OutPacket p = OutPacket.create(SendOpcode.CHARLIST);
p.writeByte(status);
List<Character> 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());