Неправильная обработка события

EvilBeaver

Новичок
Пользователь
Баллы
6
Имя в Minecraft
reker2050
PHP:
package SCP;

import java.util.logging.Logger;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

public final class SCP extends JavaPlugin implements Listener {
    Logger log = getLogger();
   
    // Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), "command");
   
    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
        log.info("Started");
        getServer().broadcastMessage("[SCP] Start");
    }
   
    // Игрок вошёл на сервен
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player p = event.getPlayer();
        String n = p.getName();
        p.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, 1, 9999999));
        Bukkit.broadcastMessage("Игрок "+n+" зашёл на сервер!");
    }
   
    // Игрок кикнулся
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onPlayerKick(PlayerKickEvent event) {
        Player p = event.getPlayer();
        String n = p.getName();
        Bukkit.broadcastMessage(n+" кикнулся. Земля ему пухом!");
    }
   
    // Игрок вышел с сервера
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onPlayerQuit(PlayerQuitEvent event) {
        Player p = event.getPlayer();
        String n = p.getName();
        Bukkit.broadcastMessage("До скорых встреч, "+n+"!");
    }
   
    @EventHandler
    public void onButton(PlayerInteractEvent event) {
        Action action = event.getAction();
        if (action == Action.RIGHT_CLICK_BLOCK) {
            Player p = event.getPlayer();
            p.sendMessage("event");
           
            Material item1 = event.getItem().getType();
            Material item2 = event.getClickedBlock().getType();
           
            p.sendMessage(item1.name());
            p.sendMessage(item2.name());
           
            // Если кликнули
            if (item2 == Material.DARK_OAK_BUTTON) {
                if (item1 != Material.DARK_OAK_BUTTON) {
                    event.setCancelled(true);
                    p.sendMessage("Отсутствует необходимый уровень доступа!!!");
                }
            }
        }
       
    }
}

Проблема в следующем: при попытке нажать кнопку с предметом в руке - всё отлично. Но если в руке пусто - эвент проходит, а item1 и item2 не определяются.
С item1 всё понятно - в руке пусто, а вот item2 пуст, хотя мы кликаем на блок.
Что нужно сделать, чтобы код работал и с пустыми руками?
 
Нашел ошибку: плагин матюкался на NullPoinerException, т.к. предмета в руке не было => в event он не передавался ;D
PHP:
Caused by: java.lang.NullPointerException
        at package.package.package.listeners.PlayerListener.onPlayerInteractButton(PlayerListener.java:50) ~[?:?]
Переписал метод, теперь работает:
PHP:
    @EventHandler
    public void onPlayerInteractButton(PlayerInteractEvent event) {
        Action action = event.getAction();

        if (action != Action.RIGHT_CLICK_BLOCK) {
            return;
        }

        Player player = event.getPlayer();
        player.sendMessage("event");

        Material itemInHand     = player.getInventory().getItemInMainHand().getType();
        Material clickedItem    = event.getClickedBlock().getType();

        player.sendMessage(itemInHand.name());
        player.sendMessage(clickedItem.name());

        // Если кликнули
        // TODO: вынести в отдельную переменную
        if (!(clickedItem == Material.DARK_OAK_BUTTON && itemInHand != Material.DARK_OAK_BUTTON)) {
            return;
        }

        event.setCancelled(true);
        player.sendMessage("Отсутствует необходимый уровень доступа!!!");
    }
 
Назад
Верх