1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Ошибка null пробывал все вы последняя надежда!

Тема в разделе "Разработка плагинов для новичков", создана пользователем ArkaDarkTime, 2 авг 2023.

  1. Автор темы
    ArkaDarkTime

    ArkaDarkTime Активный участник

    Баллы:
    61
    Сама ошибка:

    [23:41:49 INFO]: ArkaDarkTime issued server command: /infect arka2201
    [23:41:49 ERROR]: null
    org.bukkit.command.CommandException: Unhandled exception executing command 'infect' in plugin VirusQuestGame v0.1
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[pufferfish-api-1.20.1-R0.1-SNAPSHOT.jar:?]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:155) ~[pufferfish-api-1.20.1-R0.1-SNAPSHOT.jar:?]
    at org.bukkit.craftbukkit.v1_20_R1.CraftServer.dispatchCommand(CraftServer.java:1006) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at org.bukkit.craftbukkit.v1_20_R1.command.BukkitCommandWrapper.run(BukkitCommandWrapper.java:64) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at com.mojang.brigadier.CommandDispatcher.execute(CommandDispatcher.java:265) ~[pufferfish-1.20.1.jar:?]
    at net.minecraft.commands.Commands.performCommand(Commands.java:324) ~[?:?]
    at net.minecraft.commands.Commands.performCommand(Commands.java:308) ~[?:?]
    at net.minecraft.server.network.ServerGamePacketListenerImpl.performChatCommand(ServerGamePacketListenerImpl.java:2300) ~[?:?]
    at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$20(ServerGamePacketListenerImpl.java:2260) ~[?:?]
    at net.minecraft.util.thread.BlockableEventLoop.lambda$submitAsync$0(BlockableEventLoop.java:59) ~[?:?]
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[?:?]
    at net.minecraft.server.TickTask.run(TickTask.java:18) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:153) ~[?:?]
    at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[?:?]
    at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1341) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at net.minecraft.server.MinecraftServer.d(MinecraftServer.java:197) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:126) ~[?:?]
    at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1318) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1311) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:136) ~[?:?]
    at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1289) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1177) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:320) ~[pufferfish-1.20.1.jar:git-Pufferfish-19]
    at java.lang.Thread.run(Thread.java:1589) ~[?:?]
    Caused by: java.lang.NullPointerException: Cannot invoke "arkadarktime.InfectionManager.setInfected(java.util.UUID, boolean)" because "this.infectionManager" is null
    at arkadarktime.command.InfectCommand.onCommand(InfectCommand.java:32) ~[VirusQuestGame-0.1.jar:?]
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[pufferfish-api-1.20.1-R0.1-SNAPSHOT.jar:?]
    ... 23 more

    InfectCommand.java:

    package arkadarktime.command;

    import arkadarktime.InfectionManager;
    import arkadarktime.VirusQuestGame;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.checkerframework.checker.nullness.qual.NonNull;

    import java.util.UUID;

    public class InfectCommand implements CommandExecutor{
    private final VirusQuestGame plugin;
    private final InfectionManager infectionManager;

    public InfectCommand(VirusQuestGame plugin, InfectionManager infectionManager) {
    this.plugin = plugin;
    this.infectionManager = infectionManager;
    }

    @Override
    public boolean onCommand(@NonNull CommandSender sender, Command cmd, @NonNull String label, String[] args) {
    if (cmd.getName().equalsIgnoreCase("infect")) {
    if (sender instanceof Player) {
    Player player = (Player) sender;
    if (args.length > 0) {
    String targetPlayerName = args[0];
    Player targetPlayer = player.getServer().getPlayer(targetPlayerName);
    if (targetPlayer != null) {
    UUID targetPlayerUUID = targetPlayer.getUniqueId();
    // Проверяем, что infectionManager не является null, перед вызовом его методов
    if (infectionManager != null) {
    infectionManager.setInfected(targetPlayerUUID, true);
    String MSG_Infected = (String) plugin.getMessage("infected");
    sender.sendMessage(MSG_Infected.replace("%player%", targetPlayerName));
    infectionManager.applyInfectionEffect(targetPlayer);
    } else {
    sender.sendMessage("Произошла внутренняя ошибка. Пожалуйста, свяжитесь с администратором сервера.");
    plugin.getLogger().severe("InfectionManager равен null. Убедитесь, что он правильно инициализирован в методе VirusQuestGame.onEnable().");
    }
    } else {
    String MSG_PlayerNotFound = (String) plugin.getMessage("player-not-found");
    sender.sendMessage(MSG_PlayerNotFound.replace("%player%", targetPlayerName));
    }
    } else {
    String MSG_CommandUsage = (String) plugin.getMessage("command-usage");
    sender.sendMessage(MSG_CommandUsage);
    player.sendMessage("");
    }
    }
    return true;
    }
    return false;
    }
    }

    InfectedManager.java:
    package arkadarktime;

    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Particle;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.configuration.file.YamlConfiguration;
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scheduler.BukkitRunnable;
    import org.bukkit.util.Vector;

    import java.io.File;
    import java.io.IOException;
    import org.bukkit.Sound;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;

    public class InfectionManager {
    private final Map<UUID, Integer> playerDelays;
    private final File dataFile;
    private final FileConfiguration infected;
    private FileConfiguration config;
    private final Map<UUID, BukkitRunnable> infectionTasks;

    public InfectionManager(File dataFolder, FileConfiguration config) {
    this.dataFile = new File(dataFolder, "infected.yml");
    this.infected = YamlConfiguration.loadConfiguration(dataFile);
    this.config = config;
    this.infectionTasks = new HashMap<>();
    this.playerDelays = new HashMap<>();
    }

    public void setConfig(FileConfiguration config) {
    this.config = config;
    }

    public void setInfected(UUID playerUUID, boolean isInfected) {
    infected.set(playerUUID.toString(), isInfected);
    saveInfectedPlayers();
    }

    private void saveInfectedPlayers() {
    try {
    infected.save(dataFile);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public void applyInfectionEffect(Player player) {
    UUID playerUUID = player.getUniqueId();
    if (infectionTasks.containsKey(playerUUID)) {
    infectionTasks.get(playerUUID).cancel();
    }
    TimerParticle(player);
    }

    public void IfOnRunTimerParticle(Player player) {
    UUID playerUUID = player.getUniqueId();
    if (config.getBoolean("Virus.enable")) {
    // Запускаем BukkitRunnable только если у игрока еще нет запущенного задания
    if (!infectionTasks.containsKey(playerUUID)) {
    BukkitRunnable task = new BukkitRunnable() {
    @Override
    public void run() {
    TimerParticle(player);
    }
    };

    int delay = 20; // Задержка перед первым запуском (в тиках)
    task.runTaskTimer(JavaPlugin.getPlugin(VirusQuestGame.class), delay, delay);

    // Сохраняем созданный BukkitRunnable в infectionTasks, чтобы позже можно было отменить его выполнение
    infectionTasks.put(playerUUID, task);
    }
    } else {
    // Если значение Virus.enable стало равным false и у игрока уже есть запущенный BukkitRunnable, отменяем его выполнение
    if (infectionTasks.containsKey(playerUUID)) {
    BukkitRunnable task = infectionTasks.get(playerUUID);
    task.cancel();
    infectionTasks.remove(playerUUID);
    }
    }
    }

    public void TimerParticle(Player player) {
    UUID playerUUID = player.getUniqueId();
    if (config.getBoolean("Virus.enable")) {
    if (playerDelays.containsKey(playerUUID)) {
    // Если для игрока уже установлена задержка, используем ее
    int delay = playerDelays.get(playerUUID);
    playerDelays.remove(playerUUID);

    BukkitRunnable task = new BukkitRunnable() {
    @Override
    public void run() {
    Location eyeLocation = player.getEyeLocation();
    Vector direction = eyeLocation.getDirection().normalize();
    Location particleLocation = eyeLocation.clone().add(direction.multiply(1));

    player.getWorld().spawnParticle(Particle.SNEEZE, particleLocation, 50, 0, 0, 0, 0.05);
    player.playSound(player.getLocation(), Sound.ENTITY_PANDA_SNEEZE, 1.0f, 1.0f);
    Bukkit.getConsoleSender().sendMessage("\n\nОтображена частица чихания для игрока " + player.getName() + " \nРасположение чихания: " + player.getEyeLocation() + "\nВремя через сколько было новое чихание: " + delay);
    applyInfectionEffect(player);
    }
    };

    task.runTaskLater(JavaPlugin.getPlugin(VirusQuestGame.class), delay);
    infectionTasks.put(playerUUID, task);
    } else {
    // Если для игрока задержка еще не установлена, генерируем новую и добавляем в карту
    int minDelay = config.getInt("Virus.minDelayInSeconds", 5);
    int maxDelay = config.getInt("Virus.maxDelayInSeconds", 15);

    int minDelayTranslate = minDelay * 20;
    int maxDelayTranslate = maxDelay * 20;

    int delay = (int) (Math.random() * (maxDelayTranslate - minDelayTranslate + 1)) + minDelayTranslate;
    playerDelays.put(playerUUID, delay);
    }
    } else {
    IfOnRunTimerParticle(player);
    }
    }
    }

    Если еще что то надо просите!
     
  2. Автор темы
    ArkaDarkTime

    ArkaDarkTime Активный участник

    Баллы:
    61
    Главный класс:

    package arkadarktime;

    import arkadarktime.command.InfectCommand;
    import arkadarktime.command.SystemCommand;
    import arkadarktime.command.TabCompletor;
    import net.md_5.bungee.api.ChatColor;
    import org.bukkit.Bukkit;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.configuration.file.YamlConfiguration;
    import org.bukkit.plugin.java.JavaPlugin;

    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.stream.Collectors;

    public final class VirusQuestGame extends JavaPlugin {
    private Map<String, Object> messages;
    public FileConfiguration config;
    private InfectionManager infectionManager;
    private static final char COLOR_CHAR = '§';
    private static final Pattern HEX_PATTERN = Pattern.compile("&#([A-Fa-f0-9]{6})");


    public FileConfiguration getPluginConfig() {
    return config;
    }

    @Override
    public void onEnable() {
    loadConfig();
    loadMessages();
    registerCommands();

    infectionManager = new InfectionManager(getDataFolder(), config);

    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + " ");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "╔═════════════════════════════════════════════════");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "║");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "║ " + ChatColor.YELLOW + "Вирус для сервера " + ChatColor.GREEN + "QuestGame " + ChatColor.YELLOW + "успешно запущен!");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "║ " + ChatColor.DARK_GRAY + "Create by ArkaDarkTime");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "║");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "╚═════════════════════════════════════════════════");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + " ");
    }

    @Override
    public void onDisable() {
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + " ");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "╔═════════════════════════════════════════════════");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "║");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "║ " + ChatColor.YELLOW + "Вирус для сервера " + ChatColor.GREEN + "QuestGame " + ChatColor.YELLOW + "успешно выключен!");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "║ " + ChatColor.DARK_GRAY + "Create by ArkaDarkTime");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "║");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + "╚═════════════════════════════════════════════════");
    Bukkit.getConsoleSender().sendMessage(ChatColor.WHITE + " ");
    }

    private void loadMessages() {
    File messagesFile = new File(getDataFolder(), "messages.yml");
    if (!messagesFile.exists()) {
    saveResource("messages.yml", false);
    }

    FileConfiguration messagesConfig = YamlConfiguration.loadConfiguration(messagesFile);
    if (messagesConfig.contains("Messages")) {
    messages = new HashMap<>();
    for (String key : messagesConfig.getConfigurationSection("Messages").getKeys(false)) {
    Object message = messagesConfig.get("Messages." + key);
    if (message instanceof String) {
    String formattedMessage = ChatColor.translateAlternateColorCodes('&', (String) message);
    formattedMessage = formattedMessage.replace("\n", "\n&r");
    messages.put(key, formattedMessage);
    } else if (message instanceof List) {
    List<String> messagesList = (List<String>) message;
    List<String> formattedMessages = messagesList.stream()
    .map(msg -> ChatColor.translateAlternateColorCodes('&', msg.replace("\n", "\n&r")))
    .collect(Collectors.toList());
    messages.put(key, formattedMessages);
    }
    }
    } else {
    getLogger().severe("Секция 'Messages' не найдена в файле messages.yml! Пожалуйста, проверьте ваш файл messages.yml.");
    }
    }

    public Object getMessage(String key) {
    if (messages.containsKey(key)) {
    Object message = messages.get(key);
    if (message instanceof String) {
    return translateHexColorCodes((String) message);
    } else if (message instanceof List) {
    List<String> messagesList = (List<String>) message;
    return messagesList.stream().map(this::translateHexColorCodes).collect(Collectors.joining("\n"));
    }
    }
    return "";
    }

    public String translateHexColorCodes(String message) {
    Matcher matcher = HEX_PATTERN.matcher(message);
    StringBuffer buffer = new StringBuffer(message.length() + 4 * 8);
    while (matcher.find()) {
    String group = matcher.group(1);
    matcher.appendReplacement(buffer, COLOR_CHAR + "x"
    + COLOR_CHAR + group.charAt(0) + COLOR_CHAR + group.charAt(1)
    + COLOR_CHAR + group.charAt(2) + COLOR_CHAR + group.charAt(3)
    + COLOR_CHAR + group.charAt(4) + COLOR_CHAR + group.charAt(5)
    );
    }
    matcher.appendTail(buffer);
    String coloredMessage = buffer.toString();

    // Используем translateAlternateColorCodes для замены символов цвета
    coloredMessage = ChatColor.translateAlternateColorCodes('&', coloredMessage);
    return coloredMessage;
    }

    private void registerCommands() {
    getCommand("infect").setExecutor(new InfectCommand(this, infectionManager));
    getCommand("virus").setExecutor(new SystemCommand(this));
    getCommand("virus").setTabCompleter(new TabCompletor(this));
    }

    public void reloadConfigFiles() {
    reloadConfig();
    loadMessages();
    infectionManager.setConfig(getConfig());
    }

    private void loadConfig() {
    File configFile = new File(getDataFolder(), "config.yml");
    if (!configFile.exists()) {
    saveDefaultConfig();
    }
    config = YamlConfiguration.loadConfiguration(configFile);
    }

    public void updateConfigValue(String key, Object value) {
    config.set(key, value);
    saveConfig();
    }

    public void saveConfig() {
    try {
    config.save(new File(getDataFolder(), "config.yml"));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
     
  3. NuaN

    NuaN Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    NuaN
    Во-первых, лучше было бы весь код вставлять в тег для кода.
    Во-вторых, вот что из логов видно:
    Код:
    Caused by: java.lang.NullPointerException: Cannot invoke "arkadarktime.InfectionManager.setInfected(java.util.UUID, boolean)" because "this.infectionManager" is null
    Может быть такое, что не срабатывает конструктор, который принимает InfectionManager. Хотя очень странно, что проверка if (infectionManager != null) проходит...

    Могу посоветовать сделать так:
    1. В классе InfectCommand сделать конструктор: public InfectCommand(VirusQuestGame plugin), чтобы принимал только экземляр плагина (убрать InfectionManager).
    2. В классе VirusQuestGame добавить метод getInfectionManager(), который будет возвращать переменную с infectionManager.
    3. В классе InfectCommand в методе onCommand попробуй достучаться до infectionManager через метод plugin.getInfectionManager();
     
  4. MurlikMurlik

    MurlikMurlik Активный участник Пользователь

    Баллы:
    96
    Команды инициализируются раньше чем инициализирован InfectionManager. Инициализируй InfectionManager в самом начале в onEnable() методе.
     
  5. Автор темы
    ArkaDarkTime

    ArkaDarkTime Активный участник

    Баллы:
    61
    Я уже решил, но спасибо!
     
  6. Автор темы
    ArkaDarkTime

    ArkaDarkTime Активный участник

    Баллы:
    61
    Я уже решил, но спасибо!
     

Поделиться этой страницей