aleksichenk 8 Опубликовано 12 января, 2023 Кто подскажет как сделать ограничение для входа на сервер максимум 2 окна ? 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saltfire 89 Опубликовано 12 января, 2023 Это все вилами по воде. Ограничения это лишь заглушка от лаймеров, в виде смотрим сколько коннектов с 1 ип или если в клиент вшит флажек и счетчик этих окон, который будет сбрасывать при запуски нового окна, если мол больше нельзя. Ну спасет только от незнающих машинного кода, те, кто проводят время изучая реверс, то все ваши защиты и ограничения - это так, на завтрак с чашкой кофе. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
aleksichenk 8 Опубликовано 12 января, 2023 Только что, Saltfire сказал: Это все вилами по воде. Ограничения это лишь заглушка от лаймеров, в виде смотрим сколько коннектов с 1 ип или если в клиент вшит флажек и счетчик этих окон, который будет сбрасывать при запуски нового окна, если мол больше нельзя. Ну спасет только от незнающих машинного кода, те, кто проводят время изучая реверс, то все ваши защиты и ограничения - это так, на завтрак с чашкой кофе. 95 % этого не будут знать с остальными 5 % можно решить ) Так а как это сделать чтобы больше 2 окон не смогли войти на сервер ? 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
iKindness 88 Опубликовано 12 января, 2023 1 час назад, aleksichenk сказал: 95 % этого не будут знать с остальными 5 % можно решить ) Так а как это сделать чтобы больше 2 окон не смогли войти на сервер ? Любая защита или скрипт на чтение ip Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saltfire 89 Опубликовано 13 января, 2023 (изменено) 14 часов назад, aleksichenk сказал: 95 % этого не будут знать с остальными 5 % можно решить ) Так а как это сделать чтобы больше 2 окон не смогли войти на сервер ? Вы ошиблись, скорее 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); Думаю, намек понятен, при входе где нужно добавляем, при выходе, кике, вылетах и т.д., что вызывает отключение клиента от сервера, там просто из списка удаляем, чтобы не получилось так, что клиент подключился, его выбило или отключился, а потом подключается, а его не пустит, пока сервер не перезагрузим или во время его работы не вычистим из памяти его ип, который у нас записывается в список. Изменено 13 января, 2023 пользователем Saltfire 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
aleksichenk 8 Опубликовано 13 января, 2023 1 час назад, Saltfire сказал: Вы ошиблись, скорее 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); Думаю, намек понятен, при входе где нужно добавляем, при выходе, кике, вылетах и т.д., что вызывает отключение клиента от сервера, там просто из списка удаляем, чтобы не получилось так, что клиент подключился, его выбило или отключился, а потом подключается, а его не пустит, пока сервер не перезагрузим или во время его работы не вычистим из памяти его ип, который у нас записывается в список. Спасибо ! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты