BlockPlaceEvent 后自定义爆炸
Custom explosion after BlockPlaceEvent
所以我想在 Minecraft 中制作核弹,所以我尝试在放置时制作自定义 TNT 方块,但我似乎无法触发在方块位置创建爆炸的动作。我可以帮忙吗?
这是代码...
package com.TheRealBee.Bows.Event9;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
public class EventManager9 implements Listener {
@EventHandler
public static void onBlockPlace(BlockPlaceEvent e) {
Block b = e.getBlock();
Location blocklocation = b.getLocation();
if (e.getBlockPlaced().equals(ChatColor.AQUA+"Nuclear bomb")){
blocklocation.getWorld().createExplosion(blocklocation, 5, true);
}
}
}
您的问题是您正在检查 Block
(e.getBlockPlaced()
的结果)和字符串之间的相等性。这两个永远不会相等,所以你的条件不满足。
您可以更改条件,以便在放置方块时检查玩家手中的 ItemStack
。您也没有检查块类型,因此我在下面的示例代码中添加了对 TNT
的检查,但您可以删除它以使其与具有自定义名称的任何块一起使用。
@EventHandler
public void onNukePlace(BlockPlaceEvent e){
// Return if it's not TNT, doesn't have ItemMeta or doesn't have a custom dispaly name
if(!e.getBlock().getType().equals(Material.TNT) || !e.getItemInHand().hasItemMeta() || !e.getItemInHand().getItemMeta().hasDisplayName())
return;
// Return if the item display name is not correct
if(!e.getItemInHand().getItemMeta().getDisplayName().equals(ChatColor.AQUA + "Nuclear bomb"))
return;
// Create the explosion
e.getBlock().getLocation().getWorld().createExplosion(e.getBlock().getLocation(), 5, true);
}
然而,这会导致爆炸在放置时立即发生,如果不需要,您可以使用像 runTaskLater
这样的可运行对象。您可能希望手动移除玩家放置的方块,例如,您使用基岩制作 'Nuclear bomb',爆炸不会消除它。
所以我想在 Minecraft 中制作核弹,所以我尝试在放置时制作自定义 TNT 方块,但我似乎无法触发在方块位置创建爆炸的动作。我可以帮忙吗?
这是代码...
package com.TheRealBee.Bows.Event9;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
public class EventManager9 implements Listener {
@EventHandler
public static void onBlockPlace(BlockPlaceEvent e) {
Block b = e.getBlock();
Location blocklocation = b.getLocation();
if (e.getBlockPlaced().equals(ChatColor.AQUA+"Nuclear bomb")){
blocklocation.getWorld().createExplosion(blocklocation, 5, true);
}
}
}
您的问题是您正在检查 Block
(e.getBlockPlaced()
的结果)和字符串之间的相等性。这两个永远不会相等,所以你的条件不满足。
您可以更改条件,以便在放置方块时检查玩家手中的 ItemStack
。您也没有检查块类型,因此我在下面的示例代码中添加了对 TNT
的检查,但您可以删除它以使其与具有自定义名称的任何块一起使用。
@EventHandler
public void onNukePlace(BlockPlaceEvent e){
// Return if it's not TNT, doesn't have ItemMeta or doesn't have a custom dispaly name
if(!e.getBlock().getType().equals(Material.TNT) || !e.getItemInHand().hasItemMeta() || !e.getItemInHand().getItemMeta().hasDisplayName())
return;
// Return if the item display name is not correct
if(!e.getItemInHand().getItemMeta().getDisplayName().equals(ChatColor.AQUA + "Nuclear bomb"))
return;
// Create the explosion
e.getBlock().getLocation().getWorld().createExplosion(e.getBlock().getLocation(), 5, true);
}
然而,这会导致爆炸在放置时立即发生,如果不需要,您可以使用像 runTaskLater
这样的可运行对象。您可能希望手动移除玩家放置的方块,例如,您使用基岩制作 'Nuclear bomb',爆炸不会消除它。