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);
            }
        }
    }

您的问题是您正在检查 Blocke.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',爆炸不会消除它。