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(村民)。
- 生成 PNJ 作为默认实体
如果使用 world.spawnEntity
生成它,则可以使用默认的 spigot 事件。
例如,使用PlayerInteractAtEntityEvent
,您可以获得实体。
- 使用数据包生成实体
就我个人而言,我使用数据包来检测PacketPlayInUseEntity
并获取带有ID的村民。
- 在全球范围内,通过多个交互事件并通过检查 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
就是这样
我正在为我的 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(村民)。
- 生成 PNJ 作为默认实体
如果使用 world.spawnEntity
生成它,则可以使用默认的 spigot 事件。
例如,使用PlayerInteractAtEntityEvent
,您可以获得实体。
- 使用数据包生成实体
就我个人而言,我使用数据包来检测PacketPlayInUseEntity
并获取带有ID的村民。
- 在全球范围内,通过多个交互事件并通过检查 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
就是这样