我正在为我的Minecraft服务器制作一个[Bed Wars][1]插件。实际上,我必须创建一个自定义的村民商店。
我已经做了我的GUI(与实现InventoryHolder)。它是用命令工作的。我已经搜索了整个互联网,但我没有发现任何系统,使,当你右键单击一个村民(我知道如何产卵),它是显示我的GUI。有什么好主意呢?
编辑:我试图使用PlayerInteractAtEntityEvent,我做了一个类,注册它,使这个代码:
@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;
}
}
显示0.2秒的gui,但当我关闭它并显示原始交易gui时,我在控制台上得到了uwu。
这取决于你如何制作PNJ(村民)。
- 生成PNJ作为默认实体
如果你用world.spawnEntity
生成它,你可以使用默认的龙头事件。
例如,使用PlayerInteractAtEntityEvent
,您可以获得实体。
- 生成带有数据包的实体
我个人使用数据包检测PacketPlayInUseEntity
,获得村民ID。
- 在全球范围内,通过多个交互事件和检查位置/最近的PNJ,您将能够找到您正在寻找的那个。
如果你想拥有更大的多功能性并使用村民以外的东西,可以考虑使用Citizens2 API,它可以让你轻松地生成实体并为它们附加特征。
- https://wiki.citizensnpcs.co/API
将Citizens添加到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,并给它附加一个自定义的Trait。以下是我在自己制作的一款小游戏中是如何实现这一点的:
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
这它