Minecraft Bukkit - 右键单击​​村民时的自定义 GUI

Minecraft Bukkit - Custom GUI when right click on a villager

我正在为我的 Minecraft 服务器制作一个 [Bed Wars][1] 插件。其实我要做一个定制村民店

我制作了我的 GUI(带有 InventoryHolder 工具)。它正在使用命令。我在整个 Internet 上搜索过,但我没有在系统上找到任何东西,当您右键单击一个村民(我知道如何生成它)时,它会显示我的 GUI。对此会有什么想法?

编辑:我尝试使用 PlayerInteractAtEntityEvent,我制作了一个 class,注册它并制作此代码:

    @EventHandler
    public void interactAtEntity(PlayerInteractAtEntityEvent e) {
        if (e.getRightClicked() == ShopVillager.villager1) {
            System.out.println("UwU");
            Player player = e.getPlayer();
            FastShop shop = new FastShop(player);
            player.openInventory(shop.getInventory());
            e.setCancelled(true);
            return;
        }
    }

它显示 gui 大约 0.2 秒,但在我关闭它并显示原始交易 gui 后,我在我的控制台中得到了 uwu。

这取决于你如何制作 PNJ(村民)。

  1. 生成 PNJ 作为默认实体

如果使用 world.spawnEntity 生成它,则可以使用默认的 spigot 事件。

例如,使用PlayerInteractAtEntityEvent,您可以获得实体。

  1. 使用数据包生成实体

就我个人而言,我使用数据包来检测PacketPlayInUseEntity并获取带有ID的村民。

  1. 在全球范围内,通过多个交互事件并通过检查 location/nearest PNJ,您将能够找到您正在寻找的那个。

如果您想拥有更大的多功能性并使用村民以外的东西,请考虑使用 Citizens2 API,它可以让您轻松生成实体并为其附加特征。

将公民添加到您的 Maven 项目

    <repository>
        <id>everything</id>
        <url>https://repo.citizensnpcs.co/</url>
    </repository>
    <dependency>
        <groupId>net.citizensnpcs</groupId>
        <artifactId>citizens-main</artifactId>
        <version>VERSION</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>

自定义商店 NPC

您可以生成 NPC,并为其附加自定义特征。 Here's how I implemented it in a minigame I made:


public class ItemShopTrait extends Trait
{
    public ItemShopTrait()
    {
        super("itemshoptrait");
    }
   
    
    @EventHandler
    public void rightClick(net.citizensnpcs.api.event.NPCRightClickEvent rightClickEvent)
    {
        if (rightClickEvent.getNPC().equals(this.getNPC()))
        {
            this.openShop(rightClickEvent.getClicker());
        }
    }
    
    @EventHandler
    public void leftClick(net.citizensnpcs.api.event.NPCLeftClickEvent leftClickEvent)
    {
        if (leftClickEvent.getNPC().equals(this.getNPC()))
        {
            this.openShop(leftClickEvent.getClicker());
        }
    }
    
    public void openShop(Player player)
    {
        // Open shop inventory, etc.
    }
}

然后生成 NPC 并附加特征:

Location shopLocation = /* Location where you want the NPC to spawn */;

// shopList is an ArrayList of usernames that have skins you want to use. This randomly chooses one of the skins from the list.
Random random = new Random();
String randomName = MapBase.shopList.get(random.nextInt(shopList.size())); 

// EntityType.PLAYER can be changed to whatever EntityType you want, like a VILLAGER
// "Shop" is the name of the NPC
NPC npc = CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, "Shop");

// Sets the NPC's skin to always stay the same
npc.data().setPersistent(NPC.PLAYER_SKIN_UUID_METADATA, randomName);

// Add the right/left click traits to the NPC
npc.addTrait(new ItemShopTrait());

// No capes
SkinLayers trait = npc.getTrait(SkinLayers.class);
trait.hideCape();
trait.setVisible(SkinLayers.Layer.CAPE, false);

// Spawn the NPC in the world
npc.spawn(shopLocation);

我继续 github 我探索了很多 bedwars 插件代码,我发现 !!!

我只需要使用:PlayerInteractEntityEvent

就是这样