我目前正在使用自定义生成器为 Spigot 1.19 编写一个 Minecraft 插件。我需要让生成器生成一个右键单击的项目。我正在使用 PlayerInteractEvent 检测到这一点。这就是我到目前为止所拥有的:
@EventHandler
private void onRightClick(PlayerInteractEvent event) {
final Block block = event.getClickedBlock();
final CreatureSpawner spawner = (CreatureSpawner) block;
final ItemStack item = player.getInventory().getItemInMainHand();
final NamespacedKey key = item.getType().getKey();
// That's the thing that doesn't work
final String command = "execute as " + player.getName() + " at @s run setblock " + block.getX() + " " + block.getY() + " " + block.getZ() + " minecraft:spawner{SpawnData:{entity:{id:\"minecraft:item\",Item:{id:\"" + key.getNamespace() + ":" + key.getKey() + "\",Count:1b}}}} replace";
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
}
虽然它不会抛出错误,但它根本不起作用。您有解决此问题的解决方案吗?
请注意,为了便于理解,我省略了一些部分。
看起来您的
SpawnData
设置中有多余的字段。删除entity:
中的SpawnData
。所以,你的String
部分应该是这样的:
SpawnData:{id:\"minecraft:item\",Item:{id:\"" + key.getNameSpace() + ":" + key.getKey() + "\",Count:1b}}} replace"
更新: 您不能使用
CreatureSpawner
来生成 EntityType
枚举中未列出的东西。但是,您可以通过使用生成器的位置作为第一个参数调用 dropItem()
函数来“伪造”它。所以,这样的事情可能是一个选择:
...
ItemStack itemToSpawn = new ItemStack(item.getType() );
itemToSpawn.setAmount(1);
World world = player.getWorld();
world.dropItem(spawner.getLocation(), itemToSpawn)