LoginSignup
7
0

More than 1 year has passed since last update.

【PMMP】特殊アイテムの作り方

Last updated at Posted at 2021-12-13

謝罪ッ!

PMMPを全然触ってないので文法がガバガバだし動作しないかも(笑)
PMMP3.xの書き方です。暇があれば4.0の書き方も追記します。

ウンコード

実はずっと前にPvP鯖を運営していました。
その際に特殊なアイテムを実装しようということで、以下のようなコードを書いておりました。

EventListener.php
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:が永遠に続く。。。
        }
    }
}

1個の.phpファイルに複数のアイテムの処理を書いており、なんと1000行を超えてました。
今にしてみれば地獄のようなコードです。

マシな書き方

ブレイズパウダーを持ってブロックをタップすることで、半径10m以内のプレイヤーに✟闇の炎✟をくらわせるアイテムを例に書いていきます。

アイテムクラスを作る

pocketmine\item\Itemを継承したクラスを作成します。
ブロックをタップした際にonActivateが呼び出されるので、この中に処理を書きます。

XxDarknessBurstxX.php
<?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に登録したら完了です。プラグイン起動時に登録しましょう。

Main.php
<?php

// 省略

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

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

いかがでしたか?

高評価とチャンネル登録お願いします。
Minecraftサーバ開発・運営 Advent Calendar 2021 次の記事はこちら → 非同期ってナンダ | @ribnil

ちな12月15日は神PMMPer ribnil の誕生日!
おめでとうribnil!
🍺Happy🚬Birthday👩

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0