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

Помогите NullPointerException в плагине

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Здравствуйте. Получаю NPE в плагине.
    Код плагина ниже. Версия 1.12.2
    NPE на 55 строке TrapSet.java
    P.S. Еще одна проблема: при активации эвента ничего не происходит(Клик ПКМ с палкой в руке, у который DisplayName "Ловушка".
    Код:
    package net.darkmine.trap;
    
    import org.bukkit.Bukkit;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Trap extends JavaPlugin{
     
        FileConfiguration config = null;
     
        public void onEnable() {
            getCommand("trapset").setExecutor(new TrapSet());
            Bukkit.getPluginManager().registerEvents(new TrapSet(), this);
            config = getConfig();
            saveDefaultConfig();
            config.options().copyDefaults(true);
        }
     
        public void onDisable() {
            saveConfig();
        }
    
    }
    
    Код:
    package net.darkmine.trap;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.*********ventory.ItemStack;
    import org.*********ventory.meta.ItemMeta;
    
    
    public class TrapSet implements Listener, CommandExecutor{
        Trap plugin;
     
        public void rightClickTrap(PlayerInteractEvent e) {
            if(!e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) return;
            if(!e.getAction().equals(Action.RIGHT_CLICK_AIR)) return;
            if(!e.getItem().hasItemMeta()) return;
            if(!e.getPlayer().hasPermission("trap.set")) return;
            ItemStack trapItem = new ItemStack(Material.STICK);
            ItemMeta trapMeta = trapItem.getItemMeta();
            trapMeta.setDisplayName(ChatColor.RED + "Ловушка");
            trapItem.setItemMeta(trapMeta);
            if(!e.getItem().isSimilar(trapItem));
            Player p = e.getPlayer();
            Location ploc = p.getLocation();
            Location loc = ploc.subtract(0, 1, 0);
            plugin.getConfig().set("blocks." + locationToDLF(loc) + ".active", true);
            plugin.getConfig().set("blocks." + locationToDLF(loc) + ".player", p.getName());
            plugin.getConfig().set("blocks." + locationToDLF(loc) + ".level", 1);
            plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), "particle cloud " + loc.getBlockX() + " " + loc.getBlockY() + " " + loc.getBlockZ() + " 1 1 1 1 300");
            plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), "title " + p.getName() + " subtitle [\"\",{\"text\":\"Ловушка установлена\",\"color\":\"aqua\"}]");
            p.sendMessage(ChatColor.AQUA + "Вы установили ловушку [" + loc.getBlockX() + ", " + loc.getBlockY() + ", " + loc.getBlockZ() + "]");
        }
     
        public String locationToDLF(Location loc) {
            return loc.getBlockX() + "_" + loc.getBlockY() + "_" + loc.getBlockZ();
        }
    
        @SuppressWarnings("deprecation")
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            Player p = (Player)sender;
            if(!p.hasPermission("trap.set.command")) {
                p.sendMessage(ChatColor.RED + "Недостаточно прав!");
                return true;
            }
            Location ploc = p.getLocation();
            Location loc = ploc.subtract(0, 1, 0);
            plugin.getConfig().set("blocks." + locationToDLF(loc) + ".active", true);
            plugin.getConfig().set("blocks." + locationToDLF(loc) + ".player", p.getName());
            plugin.getConfig().set("blocks." + locationToDLF(loc) + ".level", 1);
            plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), "particle cloud " + loc.getBlockX() + " " + loc.getBlockY() + " " + loc.getBlockZ() + " 1 1 1 1 300");
            plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), "title " + p.getName() + " subtitle [\"\",{\"text\":\"Ловушка установлена\",\"color\":\"aqua\"}]");
            p.sendMessage(ChatColor.AQUA + "Вы установили ловушку [" + loc.getBlockX() + ", " + loc.getBlockY() + ", " + loc.getBlockZ() + "]");
            return true;
        }
    
    }
    
    Код:
    main: net.darkmine.trap.Trap
    name: Trap
    version: '1.0'
    description: Trap
    author: DragOn4ik
    commands:
      trapset:
       description: Set a trap
       permission: trap.set
       usage: /<command>
    
    *в этом файле ничего нет*
    Код:
    [17:45:35 ERROR]: null
     org.bukkit.command.CommandException: Unhandled exception executing command 'trapset' in plugin Trap v1.0  
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:648) ~[spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1397) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]    
    at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1232) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_172]  
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_172]  
    at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
     at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_172] Caused by: java.lang.NullPointerException  
    at net.darkmine.trap.TrapSet.onCommand(TrapSet.java:55) ~[?:?]  
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.12.2.jar:git-Spigot-eb3d921-2b93d83]  
    ... 15 more
    
     
  2. Difuuz

    Difuuz Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    Difuuz
    Переменной plugin дай значение. Она у тебя пустая поэтому и null
    А ивент не работает потому что у него нету аннотации @EventHandler
     
  3. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Спасибо)
    Хм... Никогда не давал, все работало (В версиях ниже, правда)
    Про аннотацию забыл. Просто давно не писал плагины)
     
  4. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    А какое значение дать?
     
  5. Difuuz

    Difuuz Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    Difuuz
    Главного класса.. Конструктор сделай
     
  6. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Взаимоисключающие проверки.
    Код:
    Action act=e.getAction();
    if(act!=Action.RIGHT_CLICK_AIR||act!=Action.RIGHT_CLICK_BLOCK) return;
     
  7. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Ага. Конечно. new Trap().
    Пробовал, бросает ошибку, что плагин уже запущен
     
  8. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Я знаю об этом, но всё равно спасибо)
     
  9. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    В TrapSet запихни
    Код:
    public TrapSet(Trap plugin) {
        this.plugin=plugin;
    }
    В onEnable в Trap
    Код:
            TrapSet trapset=new TrapSet(this);
            getCommand("trapset").setExecutor(trapset);
            Bukkit.getPluginManager().registerEvents(trapset, this);
     
  10. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Это уберет NPE?
     
  11. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Да. Первый код - конструктор TrapSet. Второй - передача плагина(Trap) в TrapSet, потому plugin не будет null
     
  12. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Спасибо. Команда работает, а эвент нет...
     
  13. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Просто ничего не происходит. Аннотация @EventHandler есть...
     
  14. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Не работает эвент, а всё остальное работает отлично.

    Код:
    package net.darkmine.trap;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Effect;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.*********ventory.ItemStack;
    import org.*********ventory.meta.ItemMeta;
    
    
    public class TrapSet implements Listener, CommandExecutor{
        Trap plugin;
        public TrapSet(Trap plugin) {
            this.plugin=plugin;
        }
        @SuppressWarnings("deprecation")
        @EventHandler
        public void rightClickTrap(PlayerInteractEvent e) {
            if(!e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) return;
            if(!e.getAction().equals(Action.RIGHT_CLICK_AIR)) return;
            if(!e.getItem().hasItemMeta()) return;
            if(!e.getPlayer().hasPermission("trap.set")) return;
            ItemStack trapItem = new ItemStack(Material.STICK);
            ItemMeta trapMeta = trapItem.getItemMeta();
            trapMeta.setDisplayName("§cЛовушка");
            trapItem.setItemMeta(trapMeta);
            if(!e.getItem().isSimilar(trapItem));
            Player p = e.getPlayer();
            Location ploc = p.getLocation();
            Location loc = ploc.subtract(0, 1, 0);
            plugin.config.set("blocks." + locationToDLF(loc) + ".active", true);
            plugin.config.set("blocks." + locationToDLF(loc) + ".player", p.getName());
            plugin.config.set("blocks." + locationToDLF(loc) + ".level", 1);
            p.sendTitle(ChatColor.AQUA + "Ловушка установлена", "", 20, 20, 20);
            p.getWorld().spigot().playEffect(p.getLocation(), Effect.CLOUD, 0, 0, 0.3f, 0f, 0.3f, 0.5f, 100, 3);
            p.sendMessage(ChatColor.AQUA + "Вы установили ловушку [" + loc.getBlockX() + ", " + loc.getBlockY() + ", " + loc.getBlockZ() + "]");
        }
      
        public String locationToDLF(Location loc) {
            return loc.getBlockX() + "_" + loc.getBlockY() + "_" + loc.getBlockZ();
        }
    
        @SuppressWarnings("deprecation")
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            Player p = (Player)sender;
            if(!p.hasPermission("trap.set.command")) {
                p.sendMessage(ChatColor.RED + "Недостаточно прав!");
                return true;
            }
            Location ploc = p.getLocation();
            Location loc = ploc.subtract(0, 1, 0);
            plugin.config.set("blocks." + locationToDLF(loc) + ".active", true);
            plugin.config.set("blocks." + locationToDLF(loc) + ".player", p.getName());
            plugin.config.set("blocks." + locationToDLF(loc) + ".level", 1);
            p.sendTitle(ChatColor.AQUA + "Ловушка установлена", "", 20, 20, 20);
            p.getWorld().spigot().playEffect(p.getLocation(), Effect.CLOUD, 0, 0, 0.3f, 0f, 0.3f, 0.5f, 100, 3);
            p.sendMessage(ChatColor.AQUA + "Вы установили ловушку [" + loc.getBlockX() + ", " + loc.getBlockY() + ", " + loc.getBlockZ() + "]");
            return true;
        }
    
    }
    

    Код:
    package net.darkmine.trap;
    
    import org.bukkit.Bukkit;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Trap extends JavaPlugin{
      
        FileConfiguration config = null;
      
        public void onEnable() {
            TrapSet trapset=new TrapSet(this);
            getCommand("trapset").setExecutor(trapset);
            Bukkit.getPluginManager().registerEvents(trapset, this);
            config = getConfig();
            saveDefaultConfig();
            config.options().copyDefaults(true);
        }
      
        public void onDisable() {
            saveConfig();
        }
    
    }
    
    
     
  15. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Дак ты так и не поправил взаимоисключающие проверки.
     
  16. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Я думал это просто совет, а оказывается ошибка... Спасибо)
     
  17. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    @imDaniX Поправил взаимоисключающие проверки. Не помогло(
     
  18. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Да, тут уж я сглупил - все равно взаимоисключающая.
    Код:
    if(!(act==Action.RIGHT_CLICK_AIR||act==Action.RIGHT_CLICK_BLOCK)) return;
     
  19. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Пойду проверю
     
  20. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Спасибо, все работает.
    Ещё один вопрос:
    Как с минимальной нагрузкой на сервер проверять, встал ли игрок на блок, который ловушка(в конфиге прописаны координаты). PlayerMoveEvent? Но это же нагрузка большая...
     

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