【PMMP】特殊道具的制作方法

道歉了!

我完全没有碰过PMMP,所以语法可能有问题,甚至可能无法运行(笑)。这是PMMP3.x的写法。如果有空的话,我还会补充4.0的写法。

便便代码

事实上,很早以前我一直在运营PvP服务器。当时我们想要实现一些特殊道具,因此我写了以下的代码。

class EventListener implements Listener {
    public function onInteract(PlayerInteractEvent $event) {
        $item = $event->getItem();
        switch ($item->getId()) {
            case 0:
                // かっこいい機能
                break;
            case 1:
                // 面白い機能
                break;
            case 2:
                // 素晴らしい機能
                break;

            // このあともcase n:が永遠に続く。。。
        }
    }
}

在一个.php文件中,编写了处理多个项目的代码,并且超过了1000行。现在回想起来,这段代码简直是地狱一般。

比较好的写法

通过点击带有火焰粉末的方块,我们来举一个例子,这个道具会让半径10米内的玩家受到✟黑暗火焰✟的影响。

创建一个物品类。

创建一个继承自PocketMine\item\Item的类。
当点击方块时,将调用onActivate函数,所以在这个函数中编写处理的代码。

<?php

// 省略

use pocketmine\block\Block;
use pocketmine\item\Item;
use pocketmine\item\ItemIds;
use pocketmine\level\sound\BlazeShootSound;
use pocketmine\math\Vector3;
use pocketmine\Player;

class XxDarknessBurstxX extends Item {
    public function __construct() {
        parent::__construct(ItemIds::BLAZE_POWDER, 0, 'XxDarknessBurstxX');
    }

    // オーバーライド
    public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector): bool {
        $level = $player->getLevel();
        $level->addSound(new BlazeShootSound($player)); // 発動音
        foreach ($level->getPlayers() as $p) {
            if ($player !== $p && $player->distance($p) <= 10) {
                $p->setOnFire(10);
                $p->sendTip("闇の炎に抱かれて消えろっ!");
            }
        }
    }
}

将制作的物品进行登记

在将先前创建的物品(XxDarknessBurstxX)注册到PocketMine-MP后,就完成了。请在插件启动时进行注册。

<?php

// 省略

use pocketmine\item\ItemFactory;
use pocketmine\plugin\PluginBase;

class Main extends PluginBase {
    public function onEnable() {
        ItemFactory::registerItem(new XxDarknessBurstxX(), true); // 第2引数は必ずtrueにしてください
    }
}

你觉得怎么样?

请给予高度评价并订阅我的频道。
Minecraft服务器开发与运营2021年圣诞节日历的下一篇文章在这里→ 非同步是什么 | @ribnil

12月15日是神PMMPer ribnil的生日!
祝ribnil生日快乐!
?幸福?生日?

广告
将在 10 秒后关闭
bannerAds