ModLoaderMpで使用できるCustumPacketsの設定方法を記載します。
この記事は"ModLoaderMp"を前提MODとしています。 |
目次
カスタムパケットの基本
送付できるPacketの種類
1.int型
2.float型
3.String型
Ex:以下のように設定します。
float[] dataFloat = new float[numberOfFloats]; dataFloat[0] = xxxx; dataFloat[1] = yyyy; .... int[] dataInt = new int[numberOfInts]; dataInt[0] = zzzz; dataInt[1] = bbbb; .... String[] dataString = new loat[numberOfStrings]; dataString[0] = aaaa; dataString[1] = cccc; ....
インターフェイスを実装する
ISpawnableインターフェイスを実装します。
Ex:
public class ClassName extends Entity implements ISpawnable {
上記はClassNameクラスにEntityクラスを継承してISpawnableインターフェイスを実装しています。
ISpawnableインターフェイスを実装した後、
Server側でgetSpawnPacketメソッドを追加した場合の例
public Packet230ModLoader getSpawnPacket() { Packet230ModLoader packet = new Packet230ModLoader(); packet.packetType = 0; packet.dataInt = new int[1]; packet.dataInt[0] = entityColor; packet.dataFloat = new float[2]; packet.dataFloat[0] = (float)posX; packet.dataFloat[1] = posY; packet.dataString = new String; packet.dataString[0] = dataString; return packet; }
packetType = 0:アップデートフラグとして
packetType = 1:送信フラグとして
※言葉が書きづらい・・・。もっとわかりやすく書ける方お願いします。
Packetの送信方法
ModLoaderMp.SendPacket
使用方法は基本同じなので、まとめてあります。
1.ModLoaderMp.SendPacket
クライアントからサーバー側へデータを送るために使用するメソッドです。
ModloaderMp.SendPacket(this, packet)
this:送付データ
packet:送付時に使用するclass
2.ModLoaderMp.SendPacketTo
サーバーからクライアント側へデータを送るために使用するメソッドです。
ModLoaderMp.SendPacketTo(this, player, packet)
this:送付データ
player:送付先のEntity
packet:送付時に使用するclass
3.ModLoaderMp.SendPacketAll
サーバーからクライアント側へデータを送るために使用するメソッドです。
ModLoderMp.SendPacketAll(this, packet)
this:送付データ
packet:送付時に使用するclass
使用例
public void sendInthoge(EntityPlayerMP entityPlayerMp, int inthoge) { if(entityPlayerMp.ridingEntity instanceof Entity) { int[] dataInt = new int[1]; dataInt[0] = inthoge; Packet230ModLoader packet = new Packet230ModLoader(); packet.packetType = 0; packet.dataInt = dataInt; ModLoaderMp.SendPacketTo(this, entityPlayerMp, packet); } }
上記では、sendInthogeメソッドが呼び出された場合、
entityPlayerMp.ridingEntityがEntityをクラスを実装していればTrueとして(←ここは特に関係ない)
dataInt[0]にinthogeを格納し、ModLoaderMp.SendPacketToにてデータを対象クライアントに送付してます。
やっぱり書きづらい。もっとわかりやすく書ける方お願いします。
HandlePacket
Packetを受信した際の処理を行わせるためのメソッドです。
サンプルを以下に書いておきます。
クライアント側
public void HandlePacket(Packet230ModLoader packet) { switch(packet.packetType) { case 0: { //ここに処理内容を書く //packet.dataint[0]とか } } }
サーバー側
public void HandlePacket(Packet230ModLoader packet, EntityPlayerMp player) { switch(packet.packetType) { case 0: { //ここに処理内容を書く //packet.dataint[0]とか、playerに対する処理とか } } }
SendKey
キーボード入力をサーバー側に送信したいときに使うメソッドです。
ModLoaderMp.SendKey(instance, key);
instance:クラスファイルでの静的インスタンス
key:キーコードリストを参照してください。
URL:http://lwjgl.org/javadoc/constant-values.html#org.lwjgl.input.Keyboard.EVENT_SIZE
使用例
package net.minecraft.src; public class mod_hogehoge extends BaseModMp{ public static mod_hogehoge instance; @Override public String getVersion() { return ""; } @Override public void load() { ModLoaderMp.SendKey(instance, 210); } }
ただの適当に作ったサンプルですが、
mod_hogehogeをINSERTキー(210がInsertキー)入力時にパケット送信します。
別として以下のように
import org.lwjgl.input.Keyboard;
JavaのKeyboardクラスを呼び出して
Keyboard.KEY_....
で使用も可能です。
サーバー側の受信はHandleSendKeyメソッドを使用します。
public void HandleSendKey(EntityPlayerMp entityplayermp, int key) { }
entityplayermpはkeyを押したプレイヤーです。
注意
このSendKeyメソッドを使う場合は、ユーザーのMinecraftでのキーコンフィグに出て来ませんので
(キー設定変更がユーザーにできないので)注意してください。
コマンドによるPacket送信処理
ModLoaderMpにはOPコマンドやサーバーコンソールコマンドを追加する機能が含まれています。
Server側のmod_***クラスに2つメソッドを追加します。
ちなみに筆者は「これを使って作ったことはありません」ので間違ってた場合修正願います。
1.getCommandInfo
利用可能なコンソールをクライアントのログに記載します。
public void GetCommandInfo(ICommandListener icommandlistener) { icommandlistener.log("MpUtils : Op only commands"); icommandlistener.log(" i <id> [num] [meta] gives you [num] of <id> with damage [meta]"); icommandlistener.log(" heal heals you to full health"); icommandlistener.log(" warp <x> <y> <z> moves you to x,y,z"); }
上記メソッドを呼び出した場合、
クライアント側にlog("")で設定したテキストが書き出されます。
2.HandleCommand サーバーに送信されるコマンドを制御します。
public boolean HandleCommand(String command, String username, Logger logger, boolean isOp) { { }
command:入力されるコマンド文字列(上記GetCommandInfoの例でいうと heal)最初の"/"は除かれるので注意
username:其名の通りユーザーの名前(またはコンソール)
Logger:使用されたコマンドのメッセージを他のプレイヤーに伝える文章
isOp:Op権限を有してるかどうか判定
送られたコマンドを検出・処理する方法として
if(command.toLowerCase().startsWith("command ")) {
で判定しifの中に処理内容を書くといいと思います。
また、ほとんどのコマンドが複数の引数を取るので、
コマンドの文字列を分割する必要があります。
下記サンプルではスペースで分割し長さを判定します。
コマンドが間違ってた場合Falseを返す形になります。
String commandSplit[] = command.split(" "); if(commandSplit.length != 2) { return false; }
1行目でスペース分割
2行目のifで分割した文字列の長さを判定
おかしかったら return false
次に文字列配列のcomandSplit[]を使用します。
コマンドはエラーが発生した場合、下記メソッドを使用する必要があります。
logger.fine((new StringBuilder()).append("There's no item with id ").append(itemID).toString());
StringBuilderは"There's no item with id "を受け取り、
(commandSplitから取得した)ItemIDをつけて送ります。
toString()を末尾に忘れると、文字列にならないので注意
正常にコマンドが実行された場合はTrueを返してOPに通知させます。
ModLoaderMp.sendChatToOps(username, (new StringBuilder()).append("Giving ").append(player.username).append(" some ").append(itemID).toString());
上記はGiveコマンドを想定したOPへの通知内容です。
また、コマンド作成に使えると思われるメソッドが
hasClientSide()
です。
public boolean hasClientSide() { return false; }
参考:http://www.minecraftforum.net/topic/352121-smp-mods-modloadermp-modding-310511/
コメントの自動更新を有効化