funo-network / invmenu
https://github.com/FunoNetwork/InvMenu. Forked from muqsit/InvMenu
This package is not auto-updated.
Last update: 2020-08-25 23:00:32 UTC
README
InvMenu 是一个 PocketMine-MP 的病毒,简化了创建和管理虚拟库存的过程!
安装
您可以在 poggit 上通过点击 这里 获取编译好的 .phar 文件。
使用方法
您需要导入 muqsit\invmenu\InvMenu.php 类。这是主类,也是您在创建和管理虚拟库存时可能需要(大部分情况下)使用的唯一类。
<?php use muqsit\invmenu\InvMenu;
InvMenu 通过扩展其 BaseFakeInventory 类支持从任何可以创建的库存中创建 GUI。
注意:如果您希望 InvMenu::readonly() 和 InvMenu 监听器正常工作,则需要允许 InvMenu 处理库存事件(如 InventoryTransactionEvent)。为此,当您的插件启用时,您可以这样做...
if(!InvMenuHandler::isRegistered()){ InvMenuHandler::register($this); }
创建 InvMenu 实例
InvMenu::create($identifier) 创建一个 InvMenu 的新实例。 $identifier 应该是一个已注册 MenuMedata 对象的标识符。InvMenu 默认带有 3 个预注册的 MenuMetadata 标识符:InvMenu::TYPE_CHEST、InvMenu::TYPE_DOUBLE_CHEST 和 InvMenu::TYPE_HOPPER。
$menu = InvMenu::create(InvMenu::TYPE_CHEST);
要访问此菜单的库存,您可以这样做
$inventory = $menu->getInventory();
这里的 $inventory 扩展了 pocketmine 的 Inventory 类,因此您可以使用所有漂亮的 pocketmine 库存方法。
$menu->getInventory()->setContents([ Item::get(Item::DIAMOND_SWORD), Item::get(Item::DIAMOND_PICKAXE) ]); $menu->getInventory()->addItem(Item::get(Item::DIAMOND_AXE)); $menu->getInventory()->setItem(3, Item::get(Item::GOLD_INGOT));
要向玩家发送菜单,使用
/** @var Player $player */ $menu->send($player);
是的,就是这样。就这么简单。
禁止玩家修改菜单内容
当您想要将库存用作 UI 时,这很有用。您可以通过将 InvMenu 实例设置为只读来禁止玩家修改库存。这只会禁止玩家。通过代码仍可以修改库存内容。
$menu->readonly();
指定菜单的自定义名称
要设置菜单的自定义名称,请使用
$menu->setName("Custom Name");
您也可以在 InvMenu::send() 期间为每个玩家分别指定不同的菜单名称。
/** @var Player $player */ $menu->send($player, "Greetings, " . $player->getName());
处理菜单项交易
要处理菜单中的库存交易,您需要指定一个可调用的函数,该函数将在将项目放入或从菜单库存中取出时被调用。您可以使用以下方法完成此操作
/** @var callable $listener */ $menu->setListener($listener);
什么是 $listener?
/** * @param Player $player the player who tried modifying the inventory. * * @param Item $itemClicked the item that the player clicked / took out of the * menu. * * @param Item $itemClickedWith the item that the player clicked $itemClicked * using / put in the menu. * * @param SlotChangeAction $action the SlotChangeAction instance created during the * transaction. You can use this to fetch the inventory instance by * using $action->getInventory(). * * Should return void if InvMenu is readonly, bool otherwise. Return false if you * want to cancel the inventory change from occuring. * @return bool|void */ bool|void callback(Player $player, Item $itemClicked, Item $itemClickedWith, SlotChangeAction $action);
库存关闭 — 监听库存关闭触发器 & 如何操作!
要监听库存关闭触发器,您可以使用以下方式指定库存关闭的可调用函数
/** @var callable $listener */ $menu->setInventoryCloseListener($listener);
什么是 $listener?
/** * @param Player $player the player who closed the inventory. * * @param InvMenuInventory $inventory the inventory instance closed by the player. */ void callback(Player $player, InvMenuInventory $inventory);
要强制关闭或从玩家处移除菜单,您可以使用
/** @var Player $player */ $player->removeCurrentWindow();
会话菜单 — “每个玩家的库存”
“会话化”功能允许您创建一个 InvMenu 实例,但向每个玩家发送不同的库存实例。您可以使用以下方法创建会话化的 InvMenu 实例:
$menu = InvMenu::createSessionized(InvMenu::TYPE_CHEST);
InvMenu::create() 和 InvMenu::createSessionized() 的区别在于,会话化的 InvMenu 实例为每个玩家创建一个单独的库存,而未会话化的 InvMenu 实例向每个玩家发送相同的库存。在会话化的 InvMenu 实例中,每个玩家都有自己的单独库存,不会受到查看相同 InvMenu 的其他人的干扰。要在会话化的 InvMenu 中访问玩家的库存,请使用以下方法:
/** @var Player $player */ $inventory = $menu->getInventory($player);
注意:库存实例不是持久的。当玩家关闭库存或退出服务器时,它们将被销毁。如果您想使库存内容持久化,可以监听库存关闭触发器并存储库存内容。
编写自定义库存类
假设您想向玩家发送一个自动分发器的库存。遗憾的是,InvMenu 没有提供 InvMenu::TYPE_DISPENSER。您仍然可以通过向 MenuMetadata 对象注册有关分发器库存外观的信息来创建分发器 InvMenu。
public const TYPE_DISPENSER = "myplugin:dispenser"; public function registerCustomMenuTypes() : void{ $type = new SingleBlockMenuMetadata( self::TYPE_DISPENSER, // identifier 9, // number of slots WindowTypes::DISPENSER, // mcpe window type id BlockFactory::get(Block::DISPENSER), // Block "Dispenser" // block entity identifier ); InvMenuHandler::registerMenuType($menu); } $this->registerCustomMenuTypes();
太好了!现在您可以使用以下方法创建分发器菜单:
$menu = InvMenu::create(self::TYPE_DISPENSER);
InvMenu 应用程序/示例
请参阅 wiki 了解 InvMenu 在服务器上使用的方法。