Advertisement
hevohevo

解析メモその3

Aug 16th, 2014
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.17 KB | None | 0 0
  1. # ここはへぼへぼ(@hevohevo)のメモ帳
  2. Forge(#1180)のソースコードと、他Modderのサンプルコードを見つつMinecraftの内部構造とForgeによるModdingを探る
  3. このページには、調査した内容およびその経過を書き込みます。そのため正しさは保障しません。
  4. 間違えているところがあれば、ご指摘を書き込んでいただけるか、あるいは直接書き換えていただいてかまいません。(期待感)
  5.  
  6. # Item の取り扱い
  7.  
  8. - https://github.com/reginn/Tutorial-Item/blob/master/src/main/java/com/sample/item/basic/SampleItemBasicCore.java
  9.  
  10. ## 新アイテムを追加するための最低限の設定(現在リアルタイムで調査中)
  11.  
  12. - PreInitでアイテム追加する
  13. - 具体的には、Item(系)クラスを継承した独自アイテムクラスを作り、そのインスタンスをGameRegistryに追加
  14.  
  15. ```
  16. // 以下は、最低限の設定なのでテクスチャ設定していない。ゲーム中では紫・黒の市松模様
  17. Item myItem = (new MyItem()) // 独自アイテムインスタンス
  18. myItem.setUnlocalizedName("myItem"); // 名前をセット。ゲーム中では、 tile.myItem.name となる
  19. myItem.setCreativeTab(CreatieTabs.tabMaterials); // Creativeモードで取り出すためのタブを選ぶ
  20.  
  21. GameRegistry.registerItem(myItem, "MyItem"); // この登録名は何に使う?(要検討)
  22. ```
  23.  
  24. - そのアイテムがどんなアイテムなのかで、どのItem系クラスを継承するか異なる。
  25. - Armor系なら、ItemArmorクラスを継承して、独自アイテムクラスを作る
  26. - Food系なら、ItemFoodクラスを継承して、独自アイテムクラスを作る
  27.  
  28. - 簡単にいくつかのパラメータ(威力など)を設定する程度なら、独自クラスを作らなくてもいけるっぽい? 以下は武器追加の例
  29. - https://github.com/reginn/Tutorial-Item/blob/master/src/main/java/com/sample/item/weapon/SampleItemWeaponCore.java
  30.  
  31. ## アイテムにテクスチャを設定する
  32.  
  33. - バニラアイテムのテクスチャをそのまま適用
  34. - minecraft.jar内のassets/minecraft/textures/items を参照。拡張子はいらない
  35. - ```myItem.setTextureName("apple");```
  36. - 独自テクスチャを適用
  37. - resources/assets/modID/textures/items/hoge.png を参照させたいならば
  38. - ```myItem.setTextureName("moID:hoge");```
  39. - 既存のテクスチャにRGB乗算なんてこともできるらしい。
  40. - https://github.com/reginn/Tutorial-Item/blob/master/src/main/java/com/sample/item/icon/ItemColor.java
  41.  
  42. ## アイテムにメタデータを持たせる
  43.  
  44. - http://minecraftjp.info/modding/index.php/%E5%9B%BA%E6%9C%89%E6%83%85%E5%A0%B1%E3%82%92%E6%8C%81%E3%81%A4%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B
  45.  
  46. ダメージ値とはいったい・・・
  47. うぉっ、ここでItemStackが出てくるのか
  48. ItemBlockというのも出てきたぞ
  49.  
  50. # ItemStack
  51.  
  52. ```
  53. public final class ItemStack{
  54. private Item item;
  55.  
  56. }
  57. ```
  58.  
  59. - ```public boolean tryPlaceItemIntoWorld()```
  60. - 内包しているItemに対して、boolean onItemUse()メソッド呼び出し、trueなら、統計情報セット
  61.  
  62.  
  63. # ItemBlock
  64. ```
  65. public class ItemBlock extends Item{}
  66. ```
  67.  
  68. # NBTとは
  69. - http://minecraft.gamepedia.com/NBT_format
  70. - http://minecraftjp.info/modding/index.php/How_to_use_NBT_Tag_Compound
  71. - ```world.notifyBlockChange(xCoord, yCoord, zCoord, 2);```とはなんだろ? 特に最後のパラメータ
  72.  
  73. Minecraftにおけるデータ保存方式。原則として、NBTTagCompoundをハンドルとして、データをTagと対にして保管
  74. データタイプ(String等)ごとに保管メソッド、読み込みメソッドを変えなくてはならない。齟齬があるとひどい目に?
  75.  
  76. # TileEntityとNBTの関連
  77.  
  78. - Blockクラスのインスタンスはゲーム内に1つしか存在しない
  79. - ワールド内の特定座標にブロックが設置されているという情報は、ワールドに位置をキーとしたマッピングデータとして保存されている
  80. - world.getblock(1,1,1) 座標(1,1,1)にあるブロックを入手。
  81. - 違う地点であろうと、種類が同じであれば同じブロックインスタンスを指すことになる。
  82. - つまり、Blockという単位(枠組み)では、ブロックに個別情報を保存できない。
  83. - ブロックの個別情報を保存する方法として、MetaDataを使う方法と、TileEntityを使う方法がある
  84.  
  85. - MetaDataとは
  86. - ワールド上に設置された個別のブロックに結び付けられたブロックデータ保存基盤
  87. - ただし保存できるデータ量は4bitと小さい。でもお手軽
  88. - Blockクラスから直接利用できる。
  89. - http://www.minecraftforge.net/wiki/Metadata_Based_Subblocks
  90.  
  91. - TileEntity とは、
  92. - ワールド上に設置された個別のブロックに結び付けられたブロックデータ保存基盤
  93. - 通常は、BlockクラスをextendsしたBlockContainerクラスから利用する(楽だし)
  94. - ブロックを新しく設置するたびにTileEntityは新しく生成され、ワールドに位置をキーとして保存される
  95. - つまり、特定ブロックのTileEntityの呼び出しには、ブロックと同じ座標をキーにしてワールドから呼び出す
  96. - 個別のTileEntityは個別のインスタンスなので、インスタンス内に独自データを自由に保存できる。
  97. - ただし、ブロック再設置、ゲーム再起動などでインスタンスは再生成されるので、残しておきたいデータはNBTを使って明示的に保存しなくてはならない
  98. - TileEntityのライフサイクル
  99. - ```public static TileEntity createAndLoadEntity(NBTTagCompound p_145827_0_)```
  100. - 自座標のBlockの```createNewTileEntity```メソッドを呼び出してTileEntityを新しく生成
  101. - public void readFromNBT(NBTTagCompound p_145839_1_)で、自身のx,y,z座標を呼び出し、xCoor, yCood,zCoodに代入
  102. - 以上。
  103. - どこで呼び出されているかはわからないけれど、writeToNBT()というメソッドがある。デフォではデータセーブやゲーム終了時かな?(要検討)
  104. - つまり、ブロック再設置やゲーム再起動で座標以外のデータは保存されない
  105. - 保存するにはどうするか。 ```public void writeToNBT(NBTTagCompound p_145841_1_)``` を@Overrideせよ。
  106. - そして、ゲーム起動時にNBTから読み込んでくれるように、```public void readFromNBT(NBTTagCompound p_145839_1_)``` を@Overrideせよ。
  107.  
  108. # ItemStackとNBTの関連
  109.  
  110. - http://minecraftjp.info/modding/index.php/%E5%9B%BA%E6%9C%89%E6%83%85%E5%A0%B1%E3%82%92%E6%8C%81%E3%81%A4%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B
  111.  
  112. - Itemクラスのインスタンスはゲーム内に1つしか存在しない
  113. - インベントリ内にある具体的なアイテムは、ItemStackのインスタンスとして取り扱う(地面にばら撒かれたアイテムは?要検討)
  114. - itemStack.getTagCompoundで、itemStackに結び付けられたNBTタグのハンドル(NBTTagCompound)を入手できるので、これを用いてNBTに記録
  115. - 上記メソッドで入手できなかったら新しく作って、itemStack.setTagCompoundする
  116.  
  117. # Damage Values
  118.  
  119. - http://www.minecraftforge.net/wiki/Metadata_Based_Subblocks
  120. - Damage values are the metadata equivalent for items, except that the value is an int.
  121. - ファッ? MetaData(4bit)と同義とかいいつつ、intだと?どうやって。(時間があったらソース追ってみる)
  122. - 使用例として、ICのバッテリー充電量とか書いてある。
  123.  
  124. # ItemBlockはなんのためにあるのー?
  125.  
  126. Itemの中でも、onItemUse() するとブロックを設置するアイテムで使う?
  127. 使っている実例ソースコード探さなきゃ。
  128. ModのStrageBoxとか、これ使ってそう。コード落ちていないかな。
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement