Java Bukkit插件编码不起作用?

Java Bukkit插件编码不起作用?,java,events,plugins,minecraft,bukkit,Java,Events,Plugins,Minecraft,Bukkit,首先,我对Java是新手。这是我的第一个bukkit插件,唯一的错误是这个()。该插件的目标是,当你右键点击“基石断路器”时,它会打破基石 package me.jrneulight.bedrockbreaker; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import

首先,我对Java是新手。这是我的第一个bukkit插件,唯一的错误是这个()。该插件的目标是,当你右键点击“基石断路器”时,它会打破基石

package me.jrneulight.bedrockbreaker;


import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
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.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {
    public static void main(String[] args) {

    }
    @Override
    public void onEnable() {
        getLogger().info("Breakrock Breaker Enabled!");
        getServer().getPluginManager().registerEvents(this, this);
    }
    @Override
    public void onDisable() {
        getLogger().info("Bedrock Breaker Disabled!");
    }
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
        if(cmd.getName().equalsIgnoreCase("bedrockbreaker")){ 
            Player player = (Player) sender;
            PlayerInventory inventory = player.getInventory();

            ItemStack bedrockbreaker = new ItemStack(Material.DIAMOND_HOE,1);

            ItemMeta im = bedrockbreaker.getItemMeta();

            im.setDisplayName(ChatColor.DARK_AQUA + "Bedrock Breaker");
            bedrockbreaker.setItemMeta(im);
            inventory.addItem(bedrockbreaker);
            return true;
        } 

        return false; 
    }
    @EventHandler(priority=EventPriority.HIGH)
    public void onPlayerUse (org.bukkit.event.player.PlayerInteractEvent evnt) {
        org.bukkit.block.Block block = evnt.getClickedBlock();
        org.bukkit.inventory.ItemStack item = evnt.getItem();
        Player player = evnt.getPlayer();
        org.bukkit.World world = block.getWorld();
        ItemMeta itemmeta = item.getItemMeta();
            if (block.getType() == Material.BEDROCK && item.getType() == Material.DIAMOND_HOE && itemmeta.getDisplayName() == ChatColor.DARK_AQUA + "Bedrock Breaker") {

                BlockBreakEvent breakEvent = new BlockBreakEvent(block, player);
                getServer().getPluginManager().callEvent(breakEvent);
                ItemStack drop = new ItemStack(block.getType());
                drop.setAmount(1);
                drop.setType(Material.BEDROCK);
                block.setType(Material.AIR);

                world.dropItemNaturally(block.getLocation(), drop);
                player.sendMessage("Bedrock Broken!");
            }
    }
}

从您的错误中可以看出,这里:

Caused by: java.lang.NullPointerException
    at me.jrneulight.bedrockbreaker.Main.onPlayerUse(Main.java:54)
您将在第
54行的
Main
文件中获得一个
NullPointer
。这意味着第54行的值是空的。首先,让我从改进
onPlayerUse
开头的代码开始。您不必使用
org.bukkit.block.block
,只需使用
block block=evnt.getClickedBlock()
org.bukkit.inventory.ItemStack也一样,您只需要使用
ItemStack

错误是由您的方法在未单击块时尝试单击块,或在未使用块时尝试使用项引起的。以下是您应该使用的代码:

@EventHandler(priority=EventPriority.HIGH)
public void onPlayerUse (PlayerInteractEvent evnt) {
    if(evnt.getAction().equals(Action.LEFT_CLICK_BLOCK){//make sure that they are infact hitting a block
        if(evt.getItem() == new ItemStack(Material.DIAMOND_HOE)){ //make sure they are using a diamond hoe
            Block block = evnt.getClickedBlock();
            //ItemStack item = evnt.getItem();
            //we don't need the above line any more
            Player player = evnt.getPlayer();

            World world = block.getWorld();
            ItemMeta itemmeta = item.getItemMeta();
         }
    }
}
因此,对于整个
onPlayerUse
方法,您应该使用以下代码:

    @EventHandler(priority=EventPriority.HIGH)
    public void onPlayerUse (PlayerInteractEvent evnt) {
        if(evnt.getAction().equals(Action.LEFT_CLICK_BLOCK)){//make sure that they are infact hitting a block
            if(evnt.getItem() == new ItemStack(Material.DIAMOND_HOE)){ //make sure they are using a diamond hoe
               if(evnt.getItem().getItemMeta().getDisplayName().equals(ChatColor.DARK_AQUA + "Bedrock Breaker")){ //make sure the name of the diamond hoe is "Bedrock Breaker" in DARK_AQUA

                Block block = evnt.getClickedBlock();
                World world = block.getWorld();
                Player player = evnt.getPlayer();
                if(block.getType() == Material.BEDROCK){ //make sure the block clicked is bedrock

                    BlockBreakEvent breakEvent = new BlockBreakEvent(block, player);
                    Bukkit.getServer().getPluginManager().callEvent(breakEvent);
                    ItemStack drop = new ItemStack(block.getType());
                    drop.setAmount(1);
                    drop.setType(Material.BEDROCK);
                    block.setType(Material.AIR);

                    world.dropItemNaturally(block.getLocation(), drop);
                    player.sendMessage("Bedrock Broken!");
                }
            }
        }
    }
    }
您需要使用
.equals(String)
而不是
==String
检查名称。此外,您应该首先检查大多数需求,以减少延迟

你之所以会犯这个错误,是因为你没有确定他们击中了一个方块,所以,在你的代码中,当玩家做任何动作时(踩在压盘上,右击一个项目,击中空气),它称为你的代码。这就是为什么您需要确保他们正在使用
操作左键单击块。左键单击块
,然后获取他们正在单击的块。在您尝试获取他们正在命中的块之前,即使当他们按下按钮或踩到压盘时,它也会返回一个
NullPointerException
,因为没有命中任何块


一般的经验法则是,在从事件中获取某些信息之前,首先检查您获取的信息是否存在。

如您的错误所示,如下所示:

Caused by: java.lang.NullPointerException
    at me.jrneulight.bedrockbreaker.Main.onPlayerUse(Main.java:54)
您将在第
54行的
Main
文件中获得一个
NullPointer
。这意味着第54行的值是空的。首先,让我从改进
onPlayerUse
开头的代码开始。您不必使用
org.bukkit.block.block
,只需使用
block block=evnt.getClickedBlock()
org.bukkit.inventory.ItemStack也一样,您只需要使用
ItemStack

错误是由您的方法在未单击块时尝试单击块,或在未使用块时尝试使用项引起的。以下是您应该使用的代码:

@EventHandler(priority=EventPriority.HIGH)
public void onPlayerUse (PlayerInteractEvent evnt) {
    if(evnt.getAction().equals(Action.LEFT_CLICK_BLOCK){//make sure that they are infact hitting a block
        if(evt.getItem() == new ItemStack(Material.DIAMOND_HOE)){ //make sure they are using a diamond hoe
            Block block = evnt.getClickedBlock();
            //ItemStack item = evnt.getItem();
            //we don't need the above line any more
            Player player = evnt.getPlayer();

            World world = block.getWorld();
            ItemMeta itemmeta = item.getItemMeta();
         }
    }
}
因此,对于整个
onPlayerUse
方法,您应该使用以下代码:

    @EventHandler(priority=EventPriority.HIGH)
    public void onPlayerUse (PlayerInteractEvent evnt) {
        if(evnt.getAction().equals(Action.LEFT_CLICK_BLOCK)){//make sure that they are infact hitting a block
            if(evnt.getItem() == new ItemStack(Material.DIAMOND_HOE)){ //make sure they are using a diamond hoe
               if(evnt.getItem().getItemMeta().getDisplayName().equals(ChatColor.DARK_AQUA + "Bedrock Breaker")){ //make sure the name of the diamond hoe is "Bedrock Breaker" in DARK_AQUA

                Block block = evnt.getClickedBlock();
                World world = block.getWorld();
                Player player = evnt.getPlayer();
                if(block.getType() == Material.BEDROCK){ //make sure the block clicked is bedrock

                    BlockBreakEvent breakEvent = new BlockBreakEvent(block, player);
                    Bukkit.getServer().getPluginManager().callEvent(breakEvent);
                    ItemStack drop = new ItemStack(block.getType());
                    drop.setAmount(1);
                    drop.setType(Material.BEDROCK);
                    block.setType(Material.AIR);

                    world.dropItemNaturally(block.getLocation(), drop);
                    player.sendMessage("Bedrock Broken!");
                }
            }
        }
    }
    }
您需要使用
.equals(String)
而不是
==String
检查名称。此外,您应该首先检查大多数需求,以减少延迟

你之所以会犯这个错误,是因为你没有确定他们击中了一个方块,所以,在你的代码中,当玩家做任何动作时(踩在压盘上,右击一个项目,击中空气),它称为你的代码。这就是为什么您需要确保他们正在使用
操作左键单击块。左键单击块
,然后获取他们正在单击的块。在您尝试获取他们正在命中的块之前,即使当他们按下按钮或踩到压盘时,它也会返回一个
NullPointerException
,因为没有命中任何块


一般的经验法则是,在从事件中获取某些信息之前,首先检查您获取的信息是否存在。

如您的错误所示,如下所示:

Caused by: java.lang.NullPointerException
    at me.jrneulight.bedrockbreaker.Main.onPlayerUse(Main.java:54)
您将在第
54行的
Main
文件中获得一个
NullPointer
。这意味着第54行的值是空的。首先,让我从改进
onPlayerUse
开头的代码开始。您不必使用
org.bukkit.block.block
,只需使用
block block=evnt.getClickedBlock()
org.bukkit.inventory.ItemStack也一样,您只需要使用
ItemStack

错误是由您的方法在未单击块时尝试单击块,或在未使用块时尝试使用项引起的。以下是您应该使用的代码:

@EventHandler(priority=EventPriority.HIGH)
public void onPlayerUse (PlayerInteractEvent evnt) {
    if(evnt.getAction().equals(Action.LEFT_CLICK_BLOCK){//make sure that they are infact hitting a block
        if(evt.getItem() == new ItemStack(Material.DIAMOND_HOE)){ //make sure they are using a diamond hoe
            Block block = evnt.getClickedBlock();
            //ItemStack item = evnt.getItem();
            //we don't need the above line any more
            Player player = evnt.getPlayer();

            World world = block.getWorld();
            ItemMeta itemmeta = item.getItemMeta();
         }
    }
}
因此,对于整个
onPlayerUse
方法,您应该使用以下代码:

    @EventHandler(priority=EventPriority.HIGH)
    public void onPlayerUse (PlayerInteractEvent evnt) {
        if(evnt.getAction().equals(Action.LEFT_CLICK_BLOCK)){//make sure that they are infact hitting a block
            if(evnt.getItem() == new ItemStack(Material.DIAMOND_HOE)){ //make sure they are using a diamond hoe
               if(evnt.getItem().getItemMeta().getDisplayName().equals(ChatColor.DARK_AQUA + "Bedrock Breaker")){ //make sure the name of the diamond hoe is "Bedrock Breaker" in DARK_AQUA

                Block block = evnt.getClickedBlock();
                World world = block.getWorld();
                Player player = evnt.getPlayer();
                if(block.getType() == Material.BEDROCK){ //make sure the block clicked is bedrock

                    BlockBreakEvent breakEvent = new BlockBreakEvent(block, player);
                    Bukkit.getServer().getPluginManager().callEvent(breakEvent);
                    ItemStack drop = new ItemStack(block.getType());
                    drop.setAmount(1);
                    drop.setType(Material.BEDROCK);
                    block.setType(Material.AIR);

                    world.dropItemNaturally(block.getLocation(), drop);
                    player.sendMessage("Bedrock Broken!");
                }
            }
        }
    }
    }
您需要使用
.equals(String)
而不是
==String
检查名称。此外,您应该首先检查大多数需求,以减少延迟

你之所以会犯这个错误,是因为你没有确定他们击中了一个方块,所以,在你的代码中,当玩家做任何动作时(踩在压盘上,右击一个项目,击中空气),它称为你的代码。这就是为什么您需要确保他们正在使用
操作左键单击块。左键单击块
,然后获取他们正在单击的块。在您尝试获取他们正在命中的块之前,即使当他们按下按钮或踩到压盘时,它也会返回一个
NullPointerException
,因为没有命中任何块


一般的经验法则是,在从事件中获取某些信息之前,首先检查您获取的信息是否存在。

如您的错误所示,如下所示:

Caused by: java.lang.NullPointerException
    at me.jrneulight.bedrockbreaker.Main.onPlayerUse(Main.java:54)
您将在第
54行的
Main
文件中获得一个
NullPointer
。这意味着第54行的值是空的。首先,让我先在
onPlayerUse
bette的开头编写代码