Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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);
}
}
}

Если еще что то надо просите!
 
Главный класс:

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();
}
}
}
 
Во-первых, лучше было бы весь код вставлять в тег для кода.
Во-вторых, вот что из логов видно:
Код:
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();
 
registerCommands();

infectionManager = new InfectionManager(getDataFolder(), config);
private void registerCommands() {
getCommand("infect").setExecutor(new InfectCommand(this, infectionManager));
getCommand("virus").setExecutor(new SystemCommand(this));
getCommand("virus").setTabCompleter(new TabCompletor(this));
}
Команды инициализируются раньше чем инициализирован InfectionManager. Инициализируй InfectionManager в самом начале в onEnable() методе.
 
Во-первых, лучше было бы весь код вставлять в тег для кода.
Во-вторых, вот что из логов видно:
Код:
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();
Я уже решил, но спасибо!
 

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

Назад
Верх