Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # ここはへぼへぼ(@hevohevo)のメモ帳
- Forge(#1180)のソースコードと、他Modderのサンプルコードを見つつMinecraftの内部構造とForgeによるModdingを探る
- このページには、調査した内容およびその経過を書き込みます。そのため正しさは保障しません。
- 間違えているところがあれば、ご指摘を書き込んでいただけるか、あるいは直接書き換えていただいてかまいません。(期待感)
- # Item の取り扱い
- - https://github.com/reginn/Tutorial-Item/blob/master/src/main/java/com/sample/item/basic/SampleItemBasicCore.java
- ## 新アイテムを追加するための最低限の設定(現在リアルタイムで調査中)
- - PreInitでアイテム追加する
- - 具体的には、Item(系)クラスを継承した独自アイテムクラスを作り、そのインスタンスをGameRegistryに追加
- ```
- // 以下は、最低限の設定なのでテクスチャ設定していない。ゲーム中では紫・黒の市松模様
- Item myItem = (new MyItem()) // 独自アイテムインスタンス
- myItem.setUnlocalizedName("myItem"); // 名前をセット。ゲーム中では、 tile.myItem.name となる
- myItem.setCreativeTab(CreatieTabs.tabMaterials); // Creativeモードで取り出すためのタブを選ぶ
- GameRegistry.registerItem(myItem, "MyItem"); // この登録名は何に使う?(要検討)
- ```
- - そのアイテムがどんなアイテムなのかで、どのItem系クラスを継承するか異なる。
- - Armor系なら、ItemArmorクラスを継承して、独自アイテムクラスを作る
- - Food系なら、ItemFoodクラスを継承して、独自アイテムクラスを作る
- - 簡単にいくつかのパラメータ(威力など)を設定する程度なら、独自クラスを作らなくてもいけるっぽい? 以下は武器追加の例
- - https://github.com/reginn/Tutorial-Item/blob/master/src/main/java/com/sample/item/weapon/SampleItemWeaponCore.java
- ## アイテムにテクスチャを設定する
- - バニラアイテムのテクスチャをそのまま適用
- - minecraft.jar内のassets/minecraft/textures/items を参照。拡張子はいらない
- - ```myItem.setTextureName("apple");```
- - 独自テクスチャを適用
- - resources/assets/modID/textures/items/hoge.png を参照させたいならば
- - ```myItem.setTextureName("moID:hoge");```
- - 既存のテクスチャにRGB乗算なんてこともできるらしい。
- - https://github.com/reginn/Tutorial-Item/blob/master/src/main/java/com/sample/item/icon/ItemColor.java
- ## アイテムにメタデータを持たせる
- - 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
- ダメージ値とはいったい・・・
- うぉっ、ここでItemStackが出てくるのか
- ItemBlockというのも出てきたぞ
- # ItemStack
- ```
- public final class ItemStack{
- private Item item;
- }
- ```
- - ```public boolean tryPlaceItemIntoWorld()```
- - 内包しているItemに対して、boolean onItemUse()メソッド呼び出し、trueなら、統計情報セット
- # ItemBlock
- ```
- public class ItemBlock extends Item{}
- ```
- # NBTとは
- - http://minecraft.gamepedia.com/NBT_format
- - http://minecraftjp.info/modding/index.php/How_to_use_NBT_Tag_Compound
- - ```world.notifyBlockChange(xCoord, yCoord, zCoord, 2);```とはなんだろ? 特に最後のパラメータ
- Minecraftにおけるデータ保存方式。原則として、NBTTagCompoundをハンドルとして、データをTagと対にして保管
- データタイプ(String等)ごとに保管メソッド、読み込みメソッドを変えなくてはならない。齟齬があるとひどい目に?
- # TileEntityとNBTの関連
- - Blockクラスのインスタンスはゲーム内に1つしか存在しない
- - ワールド内の特定座標にブロックが設置されているという情報は、ワールドに位置をキーとしたマッピングデータとして保存されている
- - world.getblock(1,1,1) 座標(1,1,1)にあるブロックを入手。
- - 違う地点であろうと、種類が同じであれば同じブロックインスタンスを指すことになる。
- - つまり、Blockという単位(枠組み)では、ブロックに個別情報を保存できない。
- - ブロックの個別情報を保存する方法として、MetaDataを使う方法と、TileEntityを使う方法がある
- - MetaDataとは
- - ワールド上に設置された個別のブロックに結び付けられたブロックデータ保存基盤
- - ただし保存できるデータ量は4bitと小さい。でもお手軽
- - Blockクラスから直接利用できる。
- - http://www.minecraftforge.net/wiki/Metadata_Based_Subblocks
- - TileEntity とは、
- - ワールド上に設置された個別のブロックに結び付けられたブロックデータ保存基盤
- - 通常は、BlockクラスをextendsしたBlockContainerクラスから利用する(楽だし)
- - ブロックを新しく設置するたびにTileEntityは新しく生成され、ワールドに位置をキーとして保存される
- - つまり、特定ブロックのTileEntityの呼び出しには、ブロックと同じ座標をキーにしてワールドから呼び出す
- - 個別のTileEntityは個別のインスタンスなので、インスタンス内に独自データを自由に保存できる。
- - ただし、ブロック再設置、ゲーム再起動などでインスタンスは再生成されるので、残しておきたいデータはNBTを使って明示的に保存しなくてはならない
- - TileEntityのライフサイクル
- - ```public static TileEntity createAndLoadEntity(NBTTagCompound p_145827_0_)```
- - 自座標のBlockの```createNewTileEntity```メソッドを呼び出してTileEntityを新しく生成
- - public void readFromNBT(NBTTagCompound p_145839_1_)で、自身のx,y,z座標を呼び出し、xCoor, yCood,zCoodに代入
- - 以上。
- - どこで呼び出されているかはわからないけれど、writeToNBT()というメソッドがある。デフォではデータセーブやゲーム終了時かな?(要検討)
- - つまり、ブロック再設置やゲーム再起動で座標以外のデータは保存されない
- - 保存するにはどうするか。 ```public void writeToNBT(NBTTagCompound p_145841_1_)``` を@Overrideせよ。
- - そして、ゲーム起動時にNBTから読み込んでくれるように、```public void readFromNBT(NBTTagCompound p_145839_1_)``` を@Overrideせよ。
- # ItemStackとNBTの関連
- - 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
- - Itemクラスのインスタンスはゲーム内に1つしか存在しない
- - インベントリ内にある具体的なアイテムは、ItemStackのインスタンスとして取り扱う(地面にばら撒かれたアイテムは?要検討)
- - itemStack.getTagCompoundで、itemStackに結び付けられたNBTタグのハンドル(NBTTagCompound)を入手できるので、これを用いてNBTに記録
- - 上記メソッドで入手できなかったら新しく作って、itemStack.setTagCompoundする
- # Damage Values
- - http://www.minecraftforge.net/wiki/Metadata_Based_Subblocks
- - Damage values are the metadata equivalent for items, except that the value is an int.
- - ファッ? MetaData(4bit)と同義とかいいつつ、intだと?どうやって。(時間があったらソース追ってみる)
- - 使用例として、ICのバッテリー充電量とか書いてある。
- # ItemBlockはなんのためにあるのー?
- Itemの中でも、onItemUse() するとブロックを設置するアイテムで使う?
- 使っている実例ソースコード探さなきゃ。
- ModのStrageBoxとか、これ使ってそう。コード落ちていないかな。
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement