[C#なMinecraftPEサーバーのMinet]プラグインをつくる#2 コード編

イベントや、コマンドを理解しようとしたらすでにまとめてあったので、和訳します。

プラグインAPIの文章

MiNETにはすでにたくさんのMinecraftの機能が実装されています。 しかし、私たちは時にはあなたがより多くの機能を望むこと、あるいはそれが違うように機能するかもしれません。 この目的のために、MiNETは.NETのプラグインAPIを提供しています。これを使用して、あなたの特定のニーズに合わせて機能を作り、調整し改造することができます。
注:APIとこのページの情報は実験的なものであり、予告なく変更することがあります。 APIに関するご質問は、Gitterチャット(メインページのリンク)でお問い合わせください。

対応している機能

現在、次の機能がAPIによって提供されています。
  • 起動クラスによるサーバーの起動時に何かを実行すること。
  • プラグインは、パケット送受信処理をすることができます。
  • プラグインは、コマンドの処理ができます。

Hello world プラグイン

コマンド処理

自分でコマンドを作ることができます。これらのコマンドは、MiNETが解析し、低レベルなコマンドハンドラに渡すテキストメッセージとしてクライアントから送信されます。
下の例文は '/min' コマンドの処理です。
    [Command]
    public void Min()
    {
    }
下に、特定の球の範囲を爆破する、より完全な例があります。
    [Command]
    [Description("特定の球の範囲を爆破します")]
    public void Boom(Player player, int radius = 10)
    {
        new Explosion(
            player.Level,
            new BlockCoordinates((int) player.KnownPosition.X, (int) player.KnownPosition.Y, (int) player.KnownPosition.Z),
            radius).Explode();
    }

この例について注目すべきことがいくつかあります。 まず、名前とメソッドのパラメータに基づいて(クライアント内の)使用情報が自動的に生成されます。 さらに、Descriptionを使用して説明を書くことができます。 Playerオブジェクトは、最初のパラメータとして存在する場合、自動的に挿入されます。 他のすべてのメソッドパラメータは、コマンドパラメータとして扱われます。 それらは、MiNETによる受信の際にパラメータに指定された型に自動的に変換されます。

下のデータ型は自動で変換されます。
  • string
  • short
  • int
  • bool
  • float
  • double
これにより、プラグイン作成者がコマンド処理メソッドから完全な機能とパラメータ解析を得るために書くために必要なコードが大幅に削減されます。
APIは、型変換をバイパスして引数を直接送信するために、次の表記法もサポートしています(警告:これには現在バグがあります)
    [Command]
    [Description("argsを使った一般的なコマンド")]
    public void Generic(Player player, string[] args)
    {
        Log.Info("一般的なコマンドが実行されました");
    }
args引数には、クライアントのチャットウィンドウにユーザが入力した引数リストが含まれています。

パケット受信処理

パケットを引数として受け取るメソッドを実装することによって、パケットの受信を傍受することができます。 以下の規則に従って実装されたメソッドはすべて、受信パケットハンドラとして自動的に登録され、PacketHandlerなしで実行されます。
  • メソッドはpublicにしてください
  • メソッドは Package型で返します。
  • メソッドの最初の引数は、Packageから派生した型です
  • 送信パケットハンドラの場合、Sendは常に必要です。
    public Package MinimalHandler(McpeMovePlayer packet)
    {
        return packet; // Handled
    }
必要に応じて、メソッドにPacketHandlerを使用して注釈を付けることができます。 これにより、コードの可読性が向上し、コードの動作も変更される可能性があります。 また、以下のReceiveに注目し、このメソッドを受信ハンドラとして指定します。 メソッドはハンドラを受け取るようにデフォルト設定されています。
    [PacketHandler]
    [Receive]
    public Package HandleIncomingMove(McpeMovePlayer packet)
    {
        return packet;
    }
送信するパケットをプラグインで傍受したい場合は、ReceiveをSendに置き換えます。
    [Send]
    public Package HandleSendMove(McpeMovePlayer packet)
    {
        return packet;
    }
ハンドラメソッドがnullを返すと、それはパケットのさらなる処理を停止します。 これはsendハンドラとreceiveハンドラの両方で同じです。
    [Send]
    public Package HandleSendMove(McpeMovePlayer packet)
    {
        return null; // Halt processing
    }
2番目の引数はPlayer型の場合、現在、要求したプレイヤーが挿入されます。
    public Package HandleSendMove(McpeMovePlayer packet, Player player)
    {
        return packet;
    }

完全なプラグインの例

以下のコードは、プレイヤー移動パケットの送受信処理をできるプラグインを実装する例です。
    [Plugin]
    public class SimplePlugin : Plugin
    {
        [PacketHandler, Receive]
        public Package HandleIncoming(McpeMovePlayer packet)
        {
            return packet; // Process
        }

        [PacketHandler, Send]
        public Package HandleOutgoing(McpeMovePlayer packet)
        {
            return packet; // Send
        }
    }

サーバーの起動時処理

MiNETの多くの基礎機能は、さまざまなプロバイダインターフェイスを実装することで置き換えることができます。 ただし、この機能を置き換えるには、サーバーが動作する前に再構成する必要があります。 したがって、これらのシナリオをカバーし、起動の冗長的な構成を避けるために、プラグイン開発者はIStartupを実装してサーバーを起動時処理を選択できます。
シンプルなコード構成によって、サーバー内のID管理を完全に置き換える方法の完全な例を以下に示します。
    [Plugin]
    public class StartupPlugin : Plugin, IStartup
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof (StartupPlugin));

        /// <summary>
        /// Minetのスタートアップクラス。 ユーザーと権限管理を保存します。
        /// </summary>
        /// <param name="server"></param>
        public void Configure(MiNetServer server)
        {
            server.UserManager = new UserManager<User>(new DefaultUserStore());
            server.RoleManager = new RoleManager<Role>(new DefaultRoleStore());
            Log.Info("Executed startup successfully. Replaced identity managment.");
        }
    }
MiNETのID管理についてもっと知りたい場合は、公式のASP.NET IDのドキュメントを参照してください:

イベント

MiNETはまた、コードを書くのを少し簡単にするために、いくつかのイベントを提供しています。
    var server = Context.Server;

    server.LevelManager.LevelCreated += (sender, args) =>
    {
        Level level = args.Level;
        level.BlockBreak += (o, eventArgs) => { };
        level.BlockPlace += (o, eventArgs) => { };
    };

    server.PlayerFactory.PlayerCreated += (sender, args) =>
    {
        Player player = args.Player;
        player.PlayerJoin += (o, eventArgs) => eventArgs.Player.Level.BroadcastMessage($"{ChatColors.Gold}[{ChatColors.Green}+{ChatColors.Gold}]{ChatFormatting.Reset} {eventArgs.Player.Username}");
        player.PlayerLeave += (o, eventArgs) => eventArgs.Player.Level.BroadcastMessage($"{ChatColors.Gold}[{ChatColors.Red}-{ChatColors.Gold}]{ChatFormatting.Reset} {eventArgs.Player.Username}");
    };

さらなる例


コメント

このブログの人気の投稿

pocketmine-mp隠れたおすすめ プラグイン一覧

[pocketmine-mp]pocketmineの0.14対応化 pocketmine-mp.phar src

[Nukkit-JAVA版PocketMine-MP] Nukkitのプラグインを作る!