Помогите Сохранение мута игрока в HashMap после выхода

_MasterCapeXD_

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
_MasterCapeXD_
Если я дам мут игроку, он может обойти его, всего лишь перезаходом на сервер. Мне нужно сохранить его. Сначала ключем в HashMap был класс Player, потом я поставил OfflinePlayer, ошибка не убиралась. Потом решил хранить именно имя игрока. Мут выдается во всех трех случаях, но при выходе сбрасывается. При этом в консоль бросает эту ошибку:
Код:
[22:14:30 WARN]: java.lang.NullPointerException
[22:14:30 WARN]:        at net.mcplugin.chat.ChatHooker.getTimePassed(ChatHooker.java:40)
[22:14:30 WARN]:        at net.mcplugin.chat.ChatHooker.on(ChatHooker.java:83)
[22:14:30 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[22:14:30 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
[22:14:30 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
[22:14:30 WARN]:        at java.lang.reflect.Method.invoke(Unknown Source)
[22:14:30 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302)
[22:14:30 WARN]:        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
[22:14:30 WARN]:        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:499)
[22:14:30 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:481)
[22:14:30 WARN]:        at net.minecraft.server.v1_12_R1.PlayerConnection.chat(PlayerConnection.java:1307)
[22:14:30 WARN]:        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1245)
[22:14:30 WARN]:        at net.minecraft.server.v1_12_R1.PacketPlayInChat$1.run(PacketPlayInChat.java:39)
[22:14:30 WARN]:        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[22:14:30 WARN]:        at java.util.concurrent.FutureTask.run(Unknown Source)
[22:14:30 WARN]:        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[22:14:30 WARN]:        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[22:14:30 WARN]:        at java.lang.Thread.run(Unknown Source)

Строка ChatHooker.java:40:
PHP:
    private long getTimePassed(String player)
    {
        return System.currentTimeMillis() - mutedplayers.get(player); //<- 40 строка
    }

Строка ChatHooker.java:83 (в операторе if):
PHP:
        if(this.getTimePassed(name) >= mutedplayers.get(name))
        {
            unmute(name);
        }

Фулл класс:
PHP:
    private oChat instance;
    
    public ChatHooker(oChat chat)
    {
        this.instance = chat;
    }

    static HashMap<String, Long> mutedplayers = new HashMap<String, Long>();
    
    static void unmute(String player)
    {
        mutedplayers.remove(player);
    }
    
    static void mute(String player, long minutes)
    {
        mutedplayers.put(player, minutes);
    }
    
    private long getTimePassed(String player)
    {
        return System.currentTimeMillis() - mutedplayers.get(player);
    }
    
    static long timeConvert(long time)
    {
        return time * 60_000; //1m
    }
    
    
    @EventHandler
    public void on(AsyncPlayerChatEvent e)
    {
        
        Player player = e.getPlayer();
        String name = player.getName();
        
        if(e.isCancelled()) return;
        
        if(mutedplayers.containsKey(name))
        {
            player.sendMessage(instance.getConfig().getString("chat.muted.chat-disabled-ru").replace("&", "\u00a7"));
            e.setCancelled(true);
        }
        
        if(this.getTimePassed(name) >= mutedplayers.get(name))
        {
            unmute(name);
        }
        
    }
}
 
String поможет в данной ситуации, тоже сталкивался с этим.
Или UUID храни
 
Я конечно не профи, но почему бы тебе не сделать дополнительный HashMap offlineMutedPlayers. Как только игрок покидает сервер он удаляется из mutedPlayers и записывается в offlineMutedPlayers. А потом при заходе проверяется, есть ли он в списке. Если да, то добавить его в mutedPlayers, а из offline удалить
 
Я конечно не профи, но почему бы тебе не сделать дополнительный HashMap offlineMutedPlayers. Как только игрок покидает сервер он удаляется из mutedPlayers и записывается в offlineMutedPlayers. А потом при заходе проверяется, есть ли он в списке. Если да, то добавить его в mutedPlayers, а из offline удалить
Неудобно. Думаю, есть варианты попроще и лучше
 
Или попробуй дебажить со стрингом, а ещё проверяй ники и тд. в toLowerCase(), чтобы проблем с регистром не было.
Да, забыл про toLowerCase(). Из-за того, что классы менял, еще не сильно "кастовал" все под String
 
Или попробуй дебажить со стрингом, а ещё проверяй ники и тд. в toLowerCase(), чтобы проблем с регистром не было.
Попробовал с UUID, теперь вообще мут не работает. Выдает, но при отправке сообщения не канселлит
 
PHP:
    private oChat instance;
    
    public ChatHooker(oChat chat)
    {
        this.instance = chat;
    }

    static HashMap<UUID, Long> mutedplayers = new HashMap<UUID, Long>();
    
    static void unmute(UUID playeruuid)
    {
        mutedplayers.remove(playeruuid);
    }
    
    static void mute(UUID playeruuid, long minutes)
    {
        mutedplayers.put(playeruuid, minutes);
    }
    
    private long getTimePassed(UUID playeruuid)
    {
        return System.currentTimeMillis() - mutedplayers.get(playeruuid);
    }
    
    static long timeConvert(long time)
    {
        return time * 60_000; //1m
    }
    
    
    @EventHandler
    public void on(AsyncPlayerChatEvent e)
    {
        
        Player player = e.getPlayer();
        String name = player.getName();
        UUID playeruuid = player.getUniqueId();
        
        if(e.isCancelled()) return;
        
        if(mutedplayers.containsKey(playeruuid))
        {
            player.sendMessage(instance.getConfig().getString("chat.muted.chat-disabled-ru").replace("&", "\u00a7"));
            e.setCancelled(true);
        }
        
        if(this.getTimePassed(playeruuid) >= mutedplayers.get(playeruuid))
        {
            unmute(playeruuid);
        }
        
    }
}
 
Проверку на размют выше чем запрет сообщения. Ещё в ChatColor есть метод для преобразования кодов, вместо реплейса.
Код должен был быть рабочим, если нету ошибок - сделай дебаг.
 
Ну дык понятно, что ссылка на объект игрока станет null после его выхода. Юзать ник тоже не особо надежно, войдут с другим регистром.
 
Ну дык понятно, что ссылка на объект игрока станет null после его выхода. Юзать ник тоже не особо надежно, войдут с другим регистром.
На регистр проверка будет, так что с ним проблемы нет.
 
Последнее редактирование:
Проверку на размют выше чем запрет сообщения. Ещё в ChatColor есть метод для преобразования кодов, вместо реплейса.
Код должен был быть рабочим, если нету ошибок - сделай дебаг.
Спасибо, попробую. Насчет реплейса, знаю про translateAlternateColorCodes(), использую через раз. Replace с привычки юзаю и удобней. Пофикшу проблему с мутом, заменю все на ChatColor.translateAlternateColorCodes().
 
Проверь зарегистрирован ли ивент, не отменяет ли его другой плагин, есть ли игрок в мапе.
 
Проверь зарегистрирован ли ивент, не отменяет ли его другой плагин, есть ли игрок в мапе.
У меня практическивсе плагины самописные, ошибок с отменой ивента из других плагинов не должно быть. Ивент зарегистрирован.
 
Проверку на размют выше чем запрет сообщения. Ещё в ChatColor есть метод для преобразования кодов, вместо реплейса.
Код должен был быть рабочим, если нету ошибок - сделай дебаг.
Поставил выше. Теперь не останавливает сообщение. Оно отправляется в чат, если игрок замучен.
 
PHP:
    private oChat instance;
    
    public ChatHooker(oChat chat)
    {
        this.instance = chat;
    }
    
    static HashMap<String, Long> mutedplayers = new HashMap<String, Long>();
    
    static void unmute(String playername)
    {
        mutedplayers.remove(playername.toLowerCase());
    }
    
    static void mute(String playername, long minutes)
    {
        mutedplayers.put(playername.toLowerCase(), minutes);
    }
    
    private long getTimePassed(String playername)
    {
        return System.currentTimeMillis() - mutedplayers.get(playername.toLowerCase());
    }
    
    static long timeConvert(long time)
    {
        return time * 60_000; //1m
    }
    
    @EventHandler
    public void on(AsyncPlayerChatEvent e)
    {
        
        Player player = e.getPlayer();
        String name = player.getName();
        
        if(e.isCancelled()) return;
        
        if(!(mutedplayers.isEmpty()))
        {
            if(mutedplayers.containsKey(name))
            {
                if(this.getTimePassed(name) >= mutedplayers.get(name))
                {
                    unmute(name);
                    return;
                }
                
                player.sendMessage(instance.getConfig().getString("chat.muted.chat-disabled-ru").replace("&", "\u00a7"));
                e.setCancelled(true);
            }
        }
    }
}
 
Назад
Верх