funo-network/invmenu

此包已被废弃且不再维护。未建议替代包。

https://github.com/FunoNetwork/InvMenu. Forked from muqsit/InvMenu

dev-master 2019-12-17 18:00 UTC

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_CHESTInvMenu::TYPE_DOUBLE_CHESTInvMenu::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 在服务器上使用的方法。