Войти или зарегистрироваться

Помогите Как запретить играть с нескольких аккаунтов

  • Автор темы Автор темы Aviloo
  • Дата начала Дата начала

Aviloo

Активный участник
Пользователь
Баллы
61
Имя в Minecraft
Aviloo
Всем привет . Хочу запретить играть ОДНОВРЕМЕННО с нескольких аккаунтов на сервере. Пытался написать подобную фичу , но не выходит (хз почему . Ошибок в консоли нет .). Я прекрасно понимаю ,что никто не хочет лопатить чужой код (прикреплю его здесь , вдруг кто-то , с свободным временем и добрым сердцем <3 найдется.)Если же лень , то посоветуйте похожие плагины , пожалуйста .Заранее спасибо .
Код:
public class AMA implements Listener {

    private ArrayList<InetSocketAddress> playersSocket = new ArrayList<>();

    private ArrayList<InetSocketAddress> playersSocketExpelConnectedPlayer(Player player){
        ArrayList<InetSocketAddress> list = new ArrayList<>();
        for(InetSocketAddress is: playersSocket){
            list.add(is);
        }
        list.remove(player.getAddress());
        return list;
    }

    private void addAddress(Player player){
        playersSocket.add(player.getAddress());
    }

    private void removeAddress(Player player){
        playersSocket.remove(player.getAddress());
    }

    @EventHandler
    public void onQuit(PlayerQuitEvent event){
        Player player = event.getPlayer();
        removeAddress(player);
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent event){
        Player player = event.getPlayer();

        if(playersSocket.isEmpty()){
            addAddress(player);
        }

        for(InetSocketAddress ap: playersSocketExpelConnectedPlayer(player)){
            if(ap.equals(player.getAddress())){
                player.kickPlayer("No multi account");
            }
            if(!ap.equals(player.getAddress())){
                addAddress(player);
            }
        }
    }
}

P.S:В main - классе все объявлено.
 
Если кратко - перемудрил. В playersSocketExpelConnectedPlayer ты заранее убираешь ip игрока из списка, и потом ищешь в этом списке его же. Плюс в onJoin ты проверяешь каждый ip, и каждый раз, когда не находишь, зачем-то добавляешь ip игрока снова и снова - это следует делать лишь раз.
Упрощенным это будет выглядеть как-то так
PHP:
 public class IpChecker implements Listener {
    private final Set<InetSocketAddress> playerAddresses = new HashSet<>();

    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        if (playerAddresses.contains(player.getAddress())) {
            player.kickPlayer("No multi accounts");
        } else {
            playerAddresses.add(player.getAddress());
        }
    }

    @EventHandler
    public void onQuit(PlayerQuitEvent event) {
        playerAddresses.remove(event.getPlayer().getAddress());
    }
}
HashSet для лучшей производительности - он будет сразу находить ip при contains, если он есть в нем. ArrayList в свою очередь будет проверять каждый ip по-отдельности.
 
Если кратко - перемудрил. В playersSocketExpelConnectedPlayer ты заранее убираешь ip игрока из списка, и потом ищешь в этом списке его же. Плюс в onJoin ты проверяешь каждый ip, и каждый раз, когда не находишь, зачем-то добавляешь ip игрока снова и снова - это следует делать лишь раз.
Упрощенным это будет выглядеть как-то так
PHP:
 public class IpChecker implements Listener {
    private final Set<InetSocketAddress> playerAddresses = new HashSet<>();

    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        if (playerAddresses.contains(player.getAddress())) {
            player.kickPlayer("No multi accounts");
        } else {
            playerAddresses.add(player.getAddress());
        }
    }

    @EventHandler
    public void onQuit(PlayerQuitEvent event) {
        playerAddresses.remove(event.getPlayer().getAddress());
    }
}
HashSet для лучшей производительности - он будет сразу находить ip при contains, если он есть в нем. ArrayList в свою очередь будет проверять каждый ip по-отдельности.
Спасибо большое. Очень помог.
P.S: Чуть-чуть изменил код , т.к даже если игроки заходят с одного компа , то порты у них различаются. Обновленная версия выглядит так :
Код:
private Set<String> playerAddresses = new HashSet<>();

    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        if (playerAddresses.contains(player.getAddress().getHostName())) {
            player.kickPlayer("No multi accounts");
        } else {
            Bukkit.getConsoleSender().sendMessage(player.getName()+ " " +player.getAddress().getHostName());
            playerAddresses.add(player.getAddress().getHostName());
        }
    }

    @EventHandler
    public void onQuit(PlayerQuitEvent event) {
        playerAddresses.remove(event.getPlayer().getAddress().getHostName());
    }
И еще раз. Спасибо за помощь.
 
Последнее редактирование:
Назад
Верх