Вы ошиблись, скорее 95% будут знать, а 5% это тем, кому до звезды на вас. Но все-же, чтобы это сделать, при входе на сервер, нужно создать хранилище ип адресов, которые уже зашли на сервер, а собственно при отключении игроков, опустошать их ип-адрес из списка. Ну и если уже зашел и такой ип уже есть в списке, просто разрываем соединение.
2 вариант, более надежен от школы, если зашить в клиент условия на запуск игры. Почему надежнее? Потому, что 95% не смогут изменить dll как потребуется для них. А 5% не станут терять на это время, если конечно будет над чем терять, а не 3 секунды и все исправлено. Но 3 секунды и VPN сменить и 2 оконо запустить. На край виртуалку поднять.
Ну да, усложнишь и 5% жизнь, если сделаешь и 1 и 2 варианты. Правда из 5% - 70% точно сразу сделают все.
На сервере примерно выглядит так:
Заходим в WorldManager.java - добавляем:
private static volatile List<String> ips = new ArrayList<>();
public static void addIp(final String ip) {
if (!ip.isEmpty() && !ips.contains(ip)) {
ips.add(ip);
}
}
public static boolean isIp(final String ip) {
return !ip.isEmpty() && ips.contains(ip);
}
public static void removeIp(final String ip) {
ips.remove(ip);
}
public static List<String> getIps() {
return ips;
}
Далее переходим в AbstractPacket.java - добавляем:
public String ip() {
return this.getInetAddress().getHostAddress();
}
public InetAddress getInetAddress() {
return ((MMOConnection) ((MMOClient) this._client).getConnection()).getInetAddress();
}
После переходим в EnterWorld.java -> runImpl(), run(), etc()...
final boolean isIp = WorldManager.isIp(ip());
if (!isIp) {
WorldManager.addIp(ip());
}
В L2Player.java или что у вас там-> closeNetConnection()
Тут придется написать так:
final String ip = client.getConnection().getInetAddress().getHostAddress();
if (WorldManager.isIp(ip)) {
WorldManager.removeIp(ip);
}
В L2GameClient.java -> CleanupTask -> run()
WorldManager.removeIp(getConnection().getInetAddress().getHostAddress());
В Logout.java -> runImpl(), run(), etc()...
WorldManager.removeIp(ip());
В RequestRestart.java -> runImpl(), run(), etc()...
WorldManager.removeIp(ip());
В GameServerThread.java -> kickPlayer()
WorldManager.removeIp(_connectionIPAddress);
Думаю, намек понятен, при входе где нужно добавляем, при выходе, кике, вылетах и т.д., что вызывает отключение клиента от сервера, там просто из списка удаляем, чтобы не получилось так, что клиент подключился, его выбило или отключился, а потом подключается, а его не пустит, пока сервер не перезагрузим или во время его работы не вычистим из памяти его ип, который у нас записывается в список.