2014-02-02 3 views
0

Для начала, я новичок в Java. Это мой первый плагин bukkit, и единственная ошибка - это (Click Here). Цель плагина заключается в том, что когда вы щелкаете правой кнопкой мыши с помощью «Bedrock Breaker», он разбивает коренные породы.Кодирование плагинов 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!"); 
      } 
    } 
} 

ответ

3

Как видно из вашей ошибки, здесь:

Caused by: java.lang.NullPointerException 
    at me.jrneulight.bedrockbreaker.Main.onPlayerUse(Main.java:54) 

вы получаете NullPointer в файле Main на линии 54. Значение значения в строке 54: null. Во-первых, позвольте мне начать, сделав ваш код в начале onPlayerUse лучше. Вам не нужно использовать org.bukkit.block.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. Кроме того, вы должны сначала проверить большинство требований, чтобы уменьшить отставание.

Причина, по которой вы получали эту ошибку, заключалась в том, что вы не были уверены, что они попали в блок, поэтому в вашем коде, когда игрок сделал какое-либо действие (нажав на прижимную пластину, щелкнув правой кнопкой мыши пункт, попав в воздух), он назвал вас кодом. Вот почему вам нужно убедиться, что они оставлены щелчком по блоку, с Action.LEFT_CLICK_BLOCK, а затем получите блок, который они нажимают. Прежде чем вы попытаетесь получить блок, который они нажимали, даже когда они нажимали кнопку или наступали на прижимную пластину, поэтому он возвращал NullPointerException, потому что не было никакого блока.

Как правило, прежде чем вы получите что-то из события, сначала проверьте, существует ли что-то, что вы получаете.

+0

фиксирует ошибку, но по-прежнему не работает .. Это, как я зарегистрировал событие? – user3137578

+0

@ user3137578 Что именно вы пытаетесь сделать? Мне кажется, что вы пытаетесь бросить скальную породу, когда игрок попадает под корень с помощью бриллиантовой мотыги под названием «Bedrock Breaker» с ChatColor 'DARK_AQUA'. Я думаю, что это имеет какое-то отношение к имени ... Попробуйте изменить его на 'getItemMeta(). GetDisplayName(). Conatins (" test ")' затем переименовать алмазную мотыгу в наковальню, чтобы "проверить" и посмотреть, это работает – Jojodmo

0

Вы получаете NullPointerException, что означает, что одного из возвращаемых значений не существует.

Попробуйте добавить некоторые if statments, чтобы убедиться, что все существует первый

Смежные вопросы