Вопрос Перезапуск таймера Bukkit Scheduler

Версия Minecraft
1.16.X

mestoff_X

Пользователь
Сообщения
92
Java:
    @Override
    public void onEnable() {
        instance = this;
        saveDefaultConfig();
        int delay = ConfigUtil.getInt("promo-delay");
        Bukkit.getScheduler().runTaskTimer(this, () -> {
            currentPromoCode = generatePromoCode();
            Bukkit.broadcastMessage(ConfigUtil.getColorizedString("messages.new-promo").replace("{promo}", String.valueOf(currentPromoCode)));
        }, delay * 20L, delay * 20L);

    }

Здесь я создал таймер простой таймер на задержку и период показа команды после запуска сервера. Т.к переменная delay берется из конфига плагина, нужно сделать так, чтобы после изменений в конфиге они вступали в силу и в таймере. Но я так и не понял как вместе с перезапуском конфига перезапускать и таймер, потому что он не останавливается в зависимости от того был ли перезагружен конфиг или нет. Может есть способ перезапустить его. Код команды перезапуска плагина:

Java:
            if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("mpromocode.admin")) {
                this.reloadConfig();
                sender.sendMessage(ConfigUtil.getColorizedString("messages.reload"));
                return true;
            }
 
Java:
    @Override
    public void onEnable() {
        instance = this;
        saveDefaultConfig();
        int delay = ConfigUtil.getInt("promo-delay");
        Bukkit.getScheduler().runTaskTimer(this, () -> {
            currentPromoCode = generatePromoCode();
            Bukkit.broadcastMessage(ConfigUtil.getColorizedString("messages.new-promo").replace("{promo}", String.valueOf(currentPromoCode)));
        }, delay * 20L, delay * 20L);

    }

Здесь я создал таймер простой таймер на задержку и период показа команды после запуска сервера. Т.к переменная delay берется из конфига плагина, нужно сделать так, чтобы после изменений в конфиге они вступали в силу и в таймере. Но я так и не понял как вместе с перезапуском конфига перезапускать и таймер, потому что он не останавливается в зависимости от того был ли перезагружен конфиг или нет. Может есть способ перезапустить его. Код команды перезапуска плагина:

Java:
            if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("mpromocode.admin")) {
                this.reloadConfig();
                sender.sendMessage(ConfigUtil.getColorizedString("messages.reload"));
                return true;
            }
Брать значение конфига не из Scheduler...
 
Java:
    private int delay = ConfigUtil.getInt("promo-delay");
    private BukkitTask bukkitTask;
    @Override
    public onEnable() {
        instance = this;
        saveDefaultConfig();
        startTask();
    }
    public void startTask() {
        bukkitTask = Bukkit.getScheduler().runTaskTimer(this, () -> {
            currentPromoCode = generatePromoCode();
            Bukkit.broadcastMessage(ConfigUtil.getColorizedString("messages.new-promo").replace("{promo}", String.valueOf(currentPromoCode)));
        }, delay * 20L, delay * 20L);
    }

# команда
        if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("mpromocode.admin")) {
            bukkitTask.cancel();
            bukkitTask = null;
            this.reloadConfig();
            delay = ConfigUtil.getInt("promo-delay");
            startTask();
            sender.sendMessage(ConfigUtil.getColorizedString("messages.reload"));
            return true;
        }
Объединено

Вот так должно работать.
 
Последнее редактирование:
Java:
    private int delay = ConfigUtil.getInt("promo-delay");
    private BukkitTask bukkitTask;
    @Override
    public onEnable() {
        instance = this;
        saveDefaultConfig();
        startTask();
    }
    public void startTask() {
        bukkitTask = Bukkit.getScheduler().runTaskTimer(this, () -> {
            currentPromoCode = generatePromoCode();
            Bukkit.broadcastMessage(ConfigUtil.getColorizedString("messages.new-promo").replace("{promo}", String.valueOf(currentPromoCode)));
        }, delay * 20L, delay * 20L);
    }

# команда
        if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("mpromocode.admin")) {
            bukkitTask.cancel();
            bukkitTask = null;
            this.reloadConfig();
            delay = ConfigUtil.getInt("promo-delay");
            startTask();
            sender.sendMessage(ConfigUtil.getColorizedString("messages.reload"));
            return true;
        }
Объединено

Вот так должно работать.
Сделал все как написано, плагин выдает ошибку:

Форматирование (BB-код):
[17:59:19 ERROR]: Could not load 'plugins\mPromocode-1.0.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: java.lang.NullPointerException: Cannot invoke "ru.mestoff.mpromocode.MPromocode.getConfig()" because the return value of "ru.mestoff.mpromocode.MPromocode.getInstance()" is null
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:157) ~[patched_1.16.5.jar:git-Paper-790]
        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:414) ~[patched_1.16.5.jar:git-Paper-790]
        at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:322) ~[patched_1.16.5.jar:git-Paper-790]
        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.loadPlugins(CraftServer.java:393) ~[patched_1.16.5.jar:git-Paper-790]
        at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:269) ~[patched_1.16.5.jar:git-Paper-790]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1074) ~[patched_1.16.5.jar:git-Paper-790]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291) ~[patched_1.16.5.jar:git-Paper-790]
        at java.lang.Thread.run(Thread.java:842) [?:?]
Caused by: java.lang.NullPointerException: Cannot invoke "ru.mestoff.mpromocode.MPromocode.getConfig()" because the return value of "ru.mestoff.mpromocode.MPromocode.getInstance()" is null
        at ru.mestoff.mpromocode.utils.ConfigUtil.getInt(ConfigUtil.java:28) ~[?:?]
        at ru.mestoff.mpromocode.MPromocode.<init>(MPromocode.java:19) ~[?:?]
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[?:?]
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?]
        at java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) ~[?:?]
        at jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) ~[?:?]
        at java.lang.Class.newInstance(Class.java:645) ~[?:?]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:94) ~[patched_1.16.5.jar:git-Paper-790]
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:153) ~[patched_1.16.5.jar:git-Paper-790]
        ... 7 more

Вот полный код плагина:
Java:
package ru.mestoff.mpromocode;

import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.scheduler.BukkitTask;
import ru.mestoff.mpromocode.utils.ConfigUtil;
import java.util.Random;


public class MPromocode extends JavaPlugin {

    public static MPromocode instance;
    private int delay = ConfigUtil.getInt("promo-delay");
    private BukkitTask bukkitTask;
    private static Economy economy;
    private static String currentPromoCode;

    public static Economy getEconomy() {
        return economy;
    }

    public static MPromocode getInstance() {
        return instance;
    }


    @Override
    public void onEnable() {
        instance = this;
        saveDefaultConfig();
        startTask();
    }
    public void startTask() {
        bukkitTask = Bukkit.getScheduler().runTaskTimer(this, () -> {
            currentPromoCode = generatePromoCode();
            for (String message : ConfigUtil.getStringColorizedList("messages.new-promo")) {
                Bukkit.broadcastMessage(message.replace("{promo}", String.valueOf(currentPromoCode)));
            }
        }, delay * 20L, delay * 20L);

        if (!setupEconomy()) {
            getLogger().severe(String.format("Vault не найден!", new Object(), getDescription().getName()));
            getServer().getPluginManager().disablePlugin(this);
        }
    }

    private boolean setupEconomy() {
        if (getServer().getPluginManager().getPlugin("Vault") == null)
            return false;
        RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
        if (rsp == null)
            return false;
        economy = (Economy) rsp.getProvider();
        return (economy != null);
    }

    public String generatePromoCode() {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuilder promoCode = new StringBuilder();
        for (int i = 0; i < ConfigUtil.getInt("promo-length"); i++) {
            promoCode.append(characters.charAt(random.nextInt(characters.length())));
        }
        return promoCode.toString();
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("mpromocode")) {
            if (!sender.hasPermission("mpromocode.admin")) {
                sender.sendMessage("§fИспользуется: §amPromocode " + this.instance.getDescription().getVersion() + " §fby mestoff");
                return true;
            }
            if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("mpromocode.admin")) {
                bukkitTask.cancel();
                bukkitTask = null;
                this.reloadConfig();
                delay = ConfigUtil.getInt("promo-delay");
                startTask();
                sender.sendMessage(ConfigUtil.getColorizedString("messages.reload"));
                return true;
            }
            if (cmd.getName().equalsIgnoreCase("promo")) {
                if (args.length == 0) {
                    sender.sendMessage(ConfigUtil.getColorizedString("messages.usage"));
                    return true;
                }
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ConfigUtil.getColorizedString("messages.only-player"));
                    return true;
                }

                String promoCodeEntered = args[0];
                String name = sender.getName();
                int reward = ConfigUtil.getInt("reward-amount");

                if (!promoCodeEntered.equals(currentPromoCode)) {
                    sender.sendMessage(ConfigUtil.getColorizedString("messages.error-promo"));
                    return true;
                }

                if (promoCodeEntered.equals(currentPromoCode)) {
                    MPromocode.getEconomy().depositPlayer((OfflinePlayer) sender, ConfigUtil.getInt("reward"));
                    for (String message : ConfigUtil.getStringColorizedList("messages.player-activate")) {
                        Bukkit.broadcastMessage(message.replace("{player}", String.valueOf(name)).replace("{reward-amount}", String.valueOf(reward)));
                    }
                    sender.sendMessage(ConfigUtil.getColorizedString("messages.successful-input").replace("{reward}", String.valueOf(reward)));
                    currentPromoCode = null;
                }
            }
        }
        return false;
    }
    @Override
    public void onDisable() {}
}

Видимо где-то не там поставил instance = this;
 
Сделал все как написано, плагин выдает ошибку:

Форматирование (BB-код):
[17:59:19 ERROR]: Could not load 'plugins\mPromocode-1.0.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: java.lang.NullPointerException: Cannot invoke "ru.mestoff.mpromocode.MPromocode.getConfig()" because the return value of "ru.mestoff.mpromocode.MPromocode.getInstance()" is null
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:157) ~[patched_1.16.5.jar:git-Paper-790]
        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:414) ~[patched_1.16.5.jar:git-Paper-790]
        at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:322) ~[patched_1.16.5.jar:git-Paper-790]
        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.loadPlugins(CraftServer.java:393) ~[patched_1.16.5.jar:git-Paper-790]
        at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:269) ~[patched_1.16.5.jar:git-Paper-790]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1074) ~[patched_1.16.5.jar:git-Paper-790]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291) ~[patched_1.16.5.jar:git-Paper-790]
        at java.lang.Thread.run(Thread.java:842) [?:?]
Caused by: java.lang.NullPointerException: Cannot invoke "ru.mestoff.mpromocode.MPromocode.getConfig()" because the return value of "ru.mestoff.mpromocode.MPromocode.getInstance()" is null
        at ru.mestoff.mpromocode.utils.ConfigUtil.getInt(ConfigUtil.java:28) ~[?:?]
        at ru.mestoff.mpromocode.MPromocode.<init>(MPromocode.java:19) ~[?:?]
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[?:?]
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?]
        at java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) ~[?:?]
        at jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) ~[?:?]
        at java.lang.Class.newInstance(Class.java:645) ~[?:?]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:94) ~[patched_1.16.5.jar:git-Paper-790]
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:153) ~[patched_1.16.5.jar:git-Paper-790]
        ... 7 more

Вот полный код плагина:
Java:
package ru.mestoff.mpromocode;

import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.scheduler.BukkitTask;
import ru.mestoff.mpromocode.utils.ConfigUtil;
import java.util.Random;


public class MPromocode extends JavaPlugin {

    public static MPromocode instance;
    private int delay = ConfigUtil.getInt("promo-delay");
    private BukkitTask bukkitTask;
    private static Economy economy;
    private static String currentPromoCode;

    public static Economy getEconomy() {
        return economy;
    }

    public static MPromocode getInstance() {
        return instance;
    }


    @Override
    public void onEnable() {
        instance = this;
        saveDefaultConfig();
        startTask();
    }
    public void startTask() {
        bukkitTask = Bukkit.getScheduler().runTaskTimer(this, () -> {
            currentPromoCode = generatePromoCode();
            for (String message : ConfigUtil.getStringColorizedList("messages.new-promo")) {
                Bukkit.broadcastMessage(message.replace("{promo}", String.valueOf(currentPromoCode)));
            }
        }, delay * 20L, delay * 20L);

        if (!setupEconomy()) {
            getLogger().severe(String.format("Vault не найден!", new Object(), getDescription().getName()));
            getServer().getPluginManager().disablePlugin(this);
        }
    }

    private boolean setupEconomy() {
        if (getServer().getPluginManager().getPlugin("Vault") == null)
            return false;
        RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
        if (rsp == null)
            return false;
        economy = (Economy) rsp.getProvider();
        return (economy != null);
    }

    public String generatePromoCode() {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuilder promoCode = new StringBuilder();
        for (int i = 0; i < ConfigUtil.getInt("promo-length"); i++) {
            promoCode.append(characters.charAt(random.nextInt(characters.length())));
        }
        return promoCode.toString();
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("mpromocode")) {
            if (!sender.hasPermission("mpromocode.admin")) {
                sender.sendMessage("§fИспользуется: §amPromocode " + this.instance.getDescription().getVersion() + " §fby mestoff");
                return true;
            }
            if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("mpromocode.admin")) {
                bukkitTask.cancel();
                bukkitTask = null;
                this.reloadConfig();
                delay = ConfigUtil.getInt("promo-delay");
                startTask();
                sender.sendMessage(ConfigUtil.getColorizedString("messages.reload"));
                return true;
            }
            if (cmd.getName().equalsIgnoreCase("promo")) {
                if (args.length == 0) {
                    sender.sendMessage(ConfigUtil.getColorizedString("messages.usage"));
                    return true;
                }
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ConfigUtil.getColorizedString("messages.only-player"));
                    return true;
                }

                String promoCodeEntered = args[0];
                String name = sender.getName();
                int reward = ConfigUtil.getInt("reward-amount");

                if (!promoCodeEntered.equals(currentPromoCode)) {
                    sender.sendMessage(ConfigUtil.getColorizedString("messages.error-promo"));
                    return true;
                }

                if (promoCodeEntered.equals(currentPromoCode)) {
                    MPromocode.getEconomy().depositPlayer((OfflinePlayer) sender, ConfigUtil.getInt("reward"));
                    for (String message : ConfigUtil.getStringColorizedList("messages.player-activate")) {
                        Bukkit.broadcastMessage(message.replace("{player}", String.valueOf(name)).replace("{reward-amount}", String.valueOf(reward)));
                    }
                    sender.sendMessage(ConfigUtil.getColorizedString("messages.successful-input").replace("{reward}", String.valueOf(reward)));
                    currentPromoCode = null;
                }
            }
        }
        return false;
    }
    @Override
    public void onDisable() {}
}

Видимо где-то не там поставил instance = this;
Сори тут тупанул:

Код:
    private int delay;
    @Override
    public onEnable() {
        instance = this;
        saveDefaultConfig();
        delay = ConfigUtil.getInt("promo-delay");
        startTask();
    }
    public void startTask() {
        bukkitTask = Bukkit.getScheduler().runTaskTimer(this, () -> {
            currentPromoCode = generatePromoCode();
            Bukkit.broadcastMessage(ConfigUtil.getColorizedString("messages.new-promo").replace("{promo}", String.valueOf(currentPromoCode)));
        }, delay * 20L, delay * 20L);
    }
 
Сори тут тупанул:

Код:
    private int delay;
    @Override
    public onEnable() {
        instance = this;
        saveDefaultConfig();
        delay = ConfigUtil.getInt("promo-delay");
        startTask();
    }
    public void startTask() {
        bukkitTask = Bukkit.getScheduler().runTaskTimer(this, () -> {
            currentPromoCode = generatePromoCode();
            Bukkit.broadcastMessage(ConfigUtil.getColorizedString("messages.new-promo").replace("{promo}", String.valueOf(currentPromoCode)));
        }, delay * 20L, delay * 20L);
    }
Огромное спасибо! Все прекрасно работает.
 
Назад
Сверху Снизу