Помогите Сохранение мута игрока в 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);
        }
        
    }
}
 
Не помогло...
PHP:
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;
                } else
                {
                    player.sendMessage(instance.getConfig().getString("chat.muted.chat-disabled-ru").replace("&", "\u00a7"));
                    e.setCancelled(true);
                }
            }
        }
 
Код:
    private final File storage = new File(getDataFolder(), "mutes.yml");

    private final YamlConfiguration storageConfiguration = new YamlConfiguration();

    private final Map<String, Mute> mutes = Maps.<String, Mute>newHashMap();

    @Override
    public void onEnable() {
        getDataFolder().mkdir();
        try {
            if (!storage.isFile())
                storage.createNewFile();
            storageConfiguration.load(storage);
        } catch (IOException | InvalidConfigurationException e) {
        }
        storageConfiguration.getKeys(false).forEach(this::addInfo);
    }

    @Override
    public void onDisable() {
        mutes.entrySet().forEach((entry) -> {
            final String name = entry.getKey();
            final Mute mute = entry.getValue();
            storageConfiguration.set(name + ".reason", mute.getReason());
            storageConfiguration.set(name + ".period", mute.getPeriod());
        });
        try {
            storageConfiguration.save(storage);
        } catch (IOException e) {}
    }

    private void addInfo(String player) {
        mutes.put(player, new Mute(storageConfiguration.getString(player + ".reason"),
                storageConfiguration.getLong(player + ".period")));
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

        // TODO: checks
        long period = -1L; // edit
        mutes.put(sender.getName().toLowerCase(), new Mute(args[0], period));

        return true;
    }

    @EventHandler(ignoreCancelled = true)
    public void onChat(AsyncPlayerChatEvent e) {
        final String name = e.getPlayer().getName().toLowerCase();
        if (!mutes.containsKey(name))
            return;
        // TODO: mute check && remove from configuration
    }
 
Код:
    private final File storage = new File(getDataFolder(), "mutes.yml");

    private final YamlConfiguration storageConfiguration = new YamlConfiguration();

    private final Map<String, Mute> mutes = Maps.<String, Mute>newHashMap();

    @Override
    public void onEnable() {
        getDataFolder().mkdir();
        try {
            if (!storage.isFile())
                storage.createNewFile();
            storageConfiguration.load(storage);
        } catch (IOException | InvalidConfigurationException e) {
        }
        storageConfiguration.getKeys(false).forEach(this::addInfo);
    }

    @Override
    public void onDisable() {
        mutes.entrySet().forEach((entry) -> {
            final String name = entry.getKey();
            final Mute mute = entry.getValue();
            storageConfiguration.set(name + ".reason", mute.getReason());
            storageConfiguration.set(name + ".period", mute.getPeriod());
        });
        try {
            storageConfiguration.save(storage);
        } catch (IOException e) {}
    }

    private void addInfo(String player) {
        mutes.put(player, new Mute(storageConfiguration.getString(player + ".reason"),
                storageConfiguration.getLong(player + ".period")));
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

        // TODO: checks
        long period = -1L; // edit
        mutes.put(sender.getName().toLowerCase(), new Mute(args[0], period));

        return true;
    }

    @EventHandler(ignoreCancelled = true)
    public void onChat(AsyncPlayerChatEvent e) {
        final String name = e.getPlayer().getName().toLowerCase();
        if (!mutes.containsKey(name))
            return;
        // TODO: mute check && remove from configuration
    }
Варианта по проще нет? Не хочется создавать файлы новые.
 
ну а как ты сохранишь мут при выключении сирвира?
Это мне не нужно. Сервер будет редко отключаться. Рестарт каждые сутки поздно вечером. Так что на этом можно сэкономить)
 
Как я понимаю, систему мутов он пишет явно не для администрации, а для донатеров. Если это так, то сохранение мутов не нужно, т.к. не стоит позволять школоте слишком много.
 
Дорогой друг, а нет ли у тебя такого, что при выходе игрока срабатывапт эвент и удаляет его из мапы?
 
Дорогой друг, а нет ли у тебя такого, что при выходе игрока срабатывапт эвент и удаляет его из мапы?
Нет конечно. Если бы было так, я бы сам проблему решил. Хотя я практически дописал уже по советам xDark через класс Mute. Еще чуть допишу и буду тестить.
 
Назад
Верх