最終更新: mazaicrafty 2018年03月24日(土) 11:54:09履歴
MiNET APIドキュメント
原文: https://github.com/NiclasOlofsson/MiNET/wiki/Plugi...
原文: https://github.com/NiclasOlofsson/MiNET/wiki/Plugi...
MiNETのプラグインはIPluginインターフェースを実装する必要がある。だが、作業の簡易化のために、プラグインベースのクラスに通常のプラグインを置き、必要なパーツのみ実装可能である。
下のサンプルはプラグインを作るのに最小限のコードです。
下のサンプルはプラグインを作るのに最小限のコードです。
[Plugin] public class HelloWorld:Plugin { }
コマンドの処理について説明する。これらのコマンドは、MiNETが解析して潜在的なコマンド処理に渡すテキストメッセージとしてクライアントから送信される。
下のサンプルは/minコマンドの処理です。
まず、メソッド名と引数に基づいて(クライアント内の)使用情報が自動的に生成される。
さらに、Description属性を使用して説明を書くことができる。Playerオブジェクトは、最初のパラメータとして存在する場合、自動的に挿入される。 他のすべてのメソッド引数は、コマンド引数として扱われる。それらは、MiNETの受信の際にパラメータに指定された型に自動的に変換される。
以下のデータ型は自動でキャストされます
argsを含むコマンド
下のサンプルは/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管理を完全に置き換える方法のサンプルです。
以下のコードは、シンプルなコード構成によって、サーバー内の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}"); };
- カテゴリ:
- ゲーム
- MinecraftPE
コメントをかく