提供: Minecraft Modding Wiki
2012年4月11日 (水) 13:38時点におけるNagisawa (トーク | 投稿記録)による版 (一行コメント)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

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/


自分のコメントを追加
Minecraft Modding Wikiはすべてのコメントを歓迎します。匿名で投稿したくない場合は、アカウント作成またはログインしてください。無料です。


  • ModLoaderMp.SendPacketを使い、左クリックすると変数に値が入るようにして、そのデータを送る形にすればいいかと思います。 --Nagisawa 2012年4月11日 (水) 13:38 (JST)

  • sendkeyのかわりにマウスのクリックを送信するにはどうすればいいでしょうか? --221.170.40.37 2012年4月11日 (水) 00:27 (JST)