MinecraftPE向けサーバーツール(PocketMine-MP, Nukkit, MiNET)について解説したサイトです初心者でもわかりやすいように解説します

MiNET APIドキュメント

原文: https://github.com/NiclasOlofsson/MiNET/wiki/Plugi...

Hello World

MiNETのプラグインはIPluginインターフェースを実装する必要がある。だが、作業の簡易化のために、プラグインベースのクラスに通常のプラグインを置き、必要なパーツのみ実装可能である。

下のサンプルはプラグインを作るのに最小限のコードです。
[Plugin]
public class HelloWorld:Plugin
{
}

コマンド処理

コマンドの処理について説明する。これらのコマンドは、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

argsを含むコマンド
[Command]
[Description("argsを使用した一般的なコマンド")]
public void Generic(Player player, string[] args)
{
    Log.info("Genericコマンドが実行された");
}
args引数には、クライアントのチャットにユーザーが指定した引数リストが含まれる。

パケット受信処理

パケットを引数として受け取るメソッドを実装することで、パケットの受信が可能。以下の規則に従って実装されたメソッドはすべて、パケット受信処理として自動的に登録、PacketHandler属性なしで実行される。
  • メソッドはpublicにする。
  • メソッドはPackage型で返す。
  • メソッドの最初の引数は、Packageから派生した型。
  • パケット送信処理の場合、Send属性はいつも必要。
public Package MinimalHandler(McpeMovePlayer packet)
{
    return packet; // 処理される
}
必要に応じ、メソッドにPacketHandler属性を使用して注釈を付けられる。これにより、コードの可読性が向上し、コードの動作も変更される可能性がある。また、以下のReceive属性に注目し、このメソッドを受信処理としてマークする。 メソッドは処理を受け取るように基本設定されてる。
[PacketHandler, Receive]
public Package MinimalHandler(McpeMovePlayer packet)
{
    return packet;
}
送信するパケットをプラグインで受け取りたい場合、Receive属性をSend属性に書き換える。
[Send]
public Package MinimalHandler(McpeMovePlayer packet)
{
    return packet;
}
メソッド処理がnullを返すと、それはパケットのこれ以降の処理を停止させる。これは、送受信処理両方で同じだ。
[Send]
public Package HandleSendMove(McpeMovePlayer packet)
{
    return null; // 処理を停止させる
}
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 ILof Log = LogManager.GetLogger(typeof (StartupPlugin));

	/// <summary>
	/// Startup class for MiNET. Example sets the user and role managers and stores 
	/// for the application.
	/// </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のアイデンティティ管理についてもっと知りたい場合は、公式のASP.NET IDのドキュメントを参照してください:

イベント

MiNETはまた、もう少し簡単にするためのイベントもいくつか用意されています。
var server = Contect.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}");
};

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

※現在 ユーザーID保持者 のみがコメント投稿可能な設定になっています。

Menu

メンバーのみ編集できます

メンバー募集!
閉じる
メンバー募集のお知らせ
鯖主のための MinecraftPEサーバーツール wikiでは編集者を募集しています