提供: Minecraft Modding Wiki
移動先: 案内検索
29行目: 29行目:
 
==実際のソースの変更部分==
 
==実際のソースの変更部分==
  
==共通==
+
===共通===
1.worldObj使用時にMCPのMappingデータよります。<br />
+
1.worldObj使用時にMCPのMappingデータによります。<br />
 
 対象項目としては
 
 対象項目としては
 
<pre>
 
<pre>
   world.isRemote ←この部分(1.2.3時点では共通項目です)
+
   world.isRemote ←この部分(1.2.3時点では共通項目のはず。)
 
</pre>
 
</pre>
   古いデータの場合以下のように直します。 
+
 
 +
古いデータの場合以下のように直さないとエラーになるはずです。 
 
<pre>
 
<pre>
 
   world.multiplayerWorld //ClientSide
 
   world.multiplayerWorld //ClientSide
 
   world.singleplayerWorld  //ServerSide
 
   world.singleplayerWorld  //ServerSide
 
</pre>
 
</pre>
<br />
 
  
 また、ModLoaderを継承参照している定義ModLoaderMpに修正します。<br />
+
2.ModLoaderを継承参照している定義ModLoaderMpに修正します。<br />
  
 
<pre>
 
<pre>
   public class mod_*** extends BaseMod
+
public class mod_*** extends BaseMod
 
</pre>
 
</pre>
<br />
+
 
  これを<br />
+
これを<br/>
  
 
<pre>
 
<pre>
   public class mod_*** extends BaseModMp
+
public class mod_*** extends BaseModMp
 
</pre>
 
</pre>
<br />
+
に修正する。<br />
  に修正する。<br />
 
 ②アイテムを追加する場合<br />
 
  基本はmod_***に定義されているはずですが、loadメソッド内に以下も付け加えます。<br />
 
  Client側:<br />
 
  
 +
===Block,Itemを追加する場合===
 +
Block,Itemを追加している記述部分に以下を付け加えます。<br />
 +
Client側:<br />
 
<pre>
 
<pre>
   ModLoaderMp.registerNetClientHandlerEntity(Entity***.clas, netID);
+
ModLoaderMp.registerNetClientHandlerEntity(Entity***.clas, netID);
 
</pre>
 
</pre>
  
  Server側:<br />
+
Server側:<br />
  
 
<pre>
 
<pre>
   ModLoaderMp.registerEntityTrackerEntry(Entity***.class, netID);
+
ModLoaderMp.registerEntityTrackerEntry(Entity***.class, netID);
      ModLoaderMp.registerEntityTracker(Entity***.class, 160, 5);
+
ModLoaderMp.registerEntityTracker(Entity***.class, 160, 5);
 
</pre>
 
</pre>
  
※netIDは0~256の中で指定すること。<br />
+
※netIDは0~256の中で指定することとし、Client・Serverで共通であること。<br />
  <br />
+
※ModLoaderMp.registerEntityTrackerは更新頻度を調整してます。<br/>
 ②Guiを追加してる場合<br />
+
 160は任意(だったはず。)5はticksを表しています。<br/>
 ③Modを追加する場合<br />
+
 
<br />
+
===Guiを追加する場合===
Step4<br />
+
※そこまで詳しくないので詳しい人お願いします。<br />
 まず、Server側にModel,Render系のclassは必要ありません。<br />
+
SMPのGUIを作るためにはGUIを呼び出すコードをServerに設定し<br />
 描画するわけじゃないので<br />
+
Client側に処理するメソッドを設定します。<br />
 +
 
 +
1.Server側に設定処理を追加します。<br />
 +
大体の場合、Entity,TileEntity,BlockGUI設定場所に設定しているはず。
 +
 
 +
<pre>
 +
ModLoader.OpenGUI(player, guiID, inventory, container);
 +
</pre>
 +
 
 +
player:GUIを開こうとしているPlayer<br />
 +
guiID:対象GUIのID<br />
 +
inventory:編集対象のinventory<br />
 +
container:使用しているSlotのインターフェイス<br />
 +
 
 +
2.Client側に設定処理を追加します。<br />
 +
大体の場合mod_***
 +
<pre>
 +
ModLoaderMp.registerGUI(this, guiID);
 +
</pre>
 +
また、メソッドを追加します。
 +
<pre>
 +
public GuiScreen HandleGUI(int inventoryType)
 +
{
 +
  if(inventoryType == guiID)
 +
    return new Gui***(args);
 +
  else return null;
 +
}
 +
</pre>
 +
Gui***には追加GuiのClass名を指定してください。<br />
 +
argsはGUIの引数の場所<br />
 +
ModLoader.getMinecraftinstance().thePlayer ←これ使うと楽かもしれない。<br />
 +
 
 +
===Mobを追加する場合===
 +
※そこまで詳しくないので詳しい人お願いします。<br />
 +
以下1または2をClientとServer両方に追加します。(EntityIDは一緒にすること)<br />
 +
 
 +
1.以下行を追加します。
 +
<pre>
 +
ModLoader.registerEntityID(Entity***.class, "EntityName", ModLoader.getUniqueEntiityID());
 +
</pre> 
 +
Entity***:対象MobのEntityのclassファイルを指定<br />
 +
"EntityName":対象Mobの名前<br />
 +
ModLoader.getUniqueEntityID:空いてるEntityIDから取得する<br />
 +
 
 +
2.上記よりこっちのがオススメかもしれません。
 +
<pre>
 +
ModLoader.registerEntityID(Entity***.class, "EntityName", ID);
 +
</pre>
 +
ID部分はClient,Server共に同じEntityIDを指定して下さい。<br />
 +
※EntityIDは0~128までです。<br />
 +
 
 +
==リコンパイル・検証作業==
 +
1.Server側にModel,Render系のclassは必要ありません。描画するわけじゃないので<br />
 
 また、ModLoader.addNameやAddRenderも必要ありません。表示させるわけじゃないですので。<br />
 
 また、ModLoader.addNameやAddRenderも必要ありません。表示させるわけじゃないですので。<br />
 ここまで出来て文法エラーがない場合、リコンパイルして実行してみましょう。<br />
+
 
 +
2.ここまで出来て文法エラーがない場合、リコンパイルして実行してみましょう。<br />
 
 あとは調整するのみです。<br />
 
 あとは調整するのみです。<br />
  
 
 参考資料:http://www.minecraftforum.net/topic/352121-smp-mods-modloadermp-modding-310511/ <br />
 
 参考資料:http://www.minecraftforum.net/topic/352121-smp-mods-modloadermp-modding-310511/ <br />

2012年3月14日 (水) 13:49時点における版

ModLoaderMPとは、マインクラフトのSMP(マルチのこと)に対応させるためのMOD作成・導入補助用のMODです。
基本は、ModLoaderに付随して+α機能が付いていると認識されたほうがいいかもしれません。
前提Modの導入方法は割愛します。

※前提としてModLodaerとMCPの利用が可能なこととします。

環境構築

1.MCPフォルダの「Jar」フォルダにminecraft_sever.jarをコピーする。
2.minecraft_server.jarにModLoaderMP(Server版)を導入する。
3.同「Jar」フォルダにクライアント側の「bin」「resources」フォルダをコピーする。
4.のクライアント側のminecraft.jarには必ずクライアント用ModLoader、ModLoaderMPを導入しておきます。

MCPでの操作

1.MCPの「decompile.bat」を動かす。
2.エラーがでますが気にしない。
3.エラーがでている部分を修正します。  ソースフォルダの/minecraft_server/net/minecraft/serverのMinecraftServer.javaを編集します。
Ver1.2.3の場合:515行目から551行目をコメントアウト
Ver1.1の場合:400~431行目をコメントアウト
Ver1.01の場合:406~437行目をコメントアウト
Ver1.8.1の場合:344~375行目をコメントアウト
末尾に

}

を入れる。

実際のソースの変更部分

共通

1.worldObj使用時にMCPのMappingデータによります。
 対象項目としては

   world.isRemote ←この部分(1.2.3時点では共通項目のはず。)

古いデータの場合以下のように直さないとエラーになるはずです。 

   world.multiplayerWorld //ClientSide
   world.singleplayerWorld  //ServerSide

2.ModLoaderを継承参照している定義ModLoaderMpに修正します。

public class mod_*** extends BaseMod

これを

public class mod_*** extends BaseModMp

に修正する。

Block,Itemを追加する場合

Block,Itemを追加している記述部分に以下を付け加えます。
Client側:

ModLoaderMp.registerNetClientHandlerEntity(Entity***.clas, netID);

Server側:

ModLoaderMp.registerEntityTrackerEntry(Entity***.class, netID);
ModLoaderMp.registerEntityTracker(Entity***.class, 160, 5);

※netIDは0~256の中で指定することとし、Client・Serverで共通であること。
※ModLoaderMp.registerEntityTrackerは更新頻度を調整してます。
 160は任意(だったはず。)5はticksを表しています。

Guiを追加する場合

※そこまで詳しくないので詳しい人お願いします。
SMPのGUIを作るためにはGUIを呼び出すコードをServerに設定し
Client側に処理するメソッドを設定します。

1.Server側に設定処理を追加します。
大体の場合、Entity,TileEntity,BlockGUI設定場所に設定しているはず。

ModLoader.OpenGUI(player, guiID, inventory, container);

player:GUIを開こうとしているPlayer
guiID:対象GUIのID
inventory:編集対象のinventory
container:使用しているSlotのインターフェイス

2.Client側に設定処理を追加します。
大体の場合mod_***

ModLoaderMp.registerGUI(this, guiID);

また、メソッドを追加します。

public GuiScreen HandleGUI(int inventoryType)
{
  if(inventoryType == guiID)
     return new Gui***(args);
  else return null;
}

Gui***には追加GuiのClass名を指定してください。
argsはGUIの引数の場所
ModLoader.getMinecraftinstance().thePlayer ←これ使うと楽かもしれない。

Mobを追加する場合

※そこまで詳しくないので詳しい人お願いします。
以下1または2をClientとServer両方に追加します。(EntityIDは一緒にすること)

1.以下行を追加します。

ModLoader.registerEntityID(Entity***.class, "EntityName", ModLoader.getUniqueEntiityID());

 

Entity***:対象MobのEntityのclassファイルを指定
"EntityName":対象Mobの名前
ModLoader.getUniqueEntityID:空いてるEntityIDから取得する

2.上記よりこっちのがオススメかもしれません。

ModLoader.registerEntityID(Entity***.class, "EntityName", ID);

ID部分はClient,Server共に同じEntityIDを指定して下さい。
※EntityIDは0~128までです。

リコンパイル・検証作業

1.Server側にModel,Render系のclassは必要ありません。描画するわけじゃないので
 また、ModLoader.addNameやAddRenderも必要ありません。表示させるわけじゃないですので。

2.ここまで出来て文法エラーがない場合、リコンパイルして実行してみましょう。
 あとは調整するのみです。

 参考資料:http://www.minecraftforum.net/topic/352121-smp-mods-modloadermp-modding-310511/