Minecraft 插件 - 从 Item 设置 Spawner 生成类型

问题描述 投票:0回答:1

我目前正在使用自定义生成器为 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);
}

虽然它不会抛出错误,但它根本不起作用。您有解决此问题的解决方案吗?

请注意,为了便于理解,我省略了一些部分。

plugins server minecraft spigot
1个回答
0
投票

看起来您的

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)
© www.soinside.com 2019 - 2024. All rights reserved.