ToolMaterialとは武器道具の素材ごとに設定する値のことです。前回の防具の時にも
やりましたその武器道具バージョンのことです。
既存のToolMaterialは木 石 鉄 ダイヤ 金があります。
それにEnumHelperを使用して新たに独自のMaterialを追加して、独自の武器、道具を
作成します。武器も道具も元になるクラスはItemクラスです。
そして武器も道具も大まかに見れば同じToolのカテゴリーみたいです。
Itemクラスのメソッドの使用の違いで武器と道具の違いを出しているようですので
メソッドの使用次第で剣でも採掘ができるようになったり・・・羊の毛が刈れたり・・
とか出来るようにはできます。
今回は、ToolMaterialというよりもそれぞれのクラス作成の方が重点的になっています。
武器、道具の追加で必要なクラスがいっぱいありすぎて(;´∀`)英語のコメントもみないと
いけなくて思ったよりも大変でした。でも大体はバニラのクラスを参考にすれば武器、道具の
追加は出来る感じでした。
基本的にはアイテムの追加の流れと同じです。
フィールドの宣言、フィールドの作成と登録、テクスチャの登録とjsonファイルの作成。
これに必要に応じて独自のクラス制作。langファイルの追加記述。
武器の追加で攻撃力だけの変更でいいのならバニラのItemSwordをそのまま使って
ToolMaterialだけ追加する方法が一番簡単かと思いますが、攻撃速度は変更できません。
ItemSwordでインスタンス組んであるので特に何もする必要はなし。
ToolMaterialも既存の物から選んだり、
独自のToolMaterialを追加してそれを使用したりできます。
jsonファイルでは parentはItem/handeldとします。
これで右手に握っているように表現されるみたいです。
PNG画像の用意もしてassets/modid/textures/Itemsフォルダに入れます。
ItemSwordを使用すると攻撃スピードは決められているので変えることができません。
攻撃力はToolMaterialで変えることができます。
@Nullable public static ToolMaterial addToolMaterial(String name, int harvestLevel, int maxUses, float efficiency, float damage, int enchantability) { return addEnum(ToolMaterial.class, name, harvestLevel, maxUses, efficiency, damage, enchantability); }
EnumHelperではこういう風にメソッドが組まれています。
ToolMaterialのところのコメントを見るとそれぞれの引数の値が何に対応しているのか
わかります。
nameはMaterialの名前。
harvestLevelはツールが収穫できる素材のLV ダイヤ3鉄2石1木、金0
maxUsesは使用回数 木59石131鉄250金32ダイヤ1561
efficiencyは有効なブロックに対する素材の強度
damegeはentryに対するダメージ
enchantabilityは素材のエンチャント係数の定義
例:
Public final ToolMaterial RUBYW = EnumHelper.addToolMaterial("ruby",0,1500,8.0F,20F,10);
次はItemSwordクラスを継承させたクラスを作成して武器の追加を行います。
ItemSwordを継承しています。
EnumHelperでToolMaterialの追加を行っています。
コンストラクタの呼び出しですがItemSwordは引数がToolMaterialだけなので
変数RUBYに代入したToolMaterialを入れます。
class Rubyrod extends ItemSword
{
public static final ToolMaterial RUBY = EnumHelper.addToolMaterial("ruby",4,1500,3.0F,5.0F,30);
public Rubyrod()
{
super(RUBY);
this.setRegistryName("rubyrod");
this.setCreativeTab(Tab.MOONROSE);
this.setUnlocalizedName("rubyrod");
}
@Override
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand,
EnumFacing facing, float hitX, float hitY, float hitZ)
{
String test = "moonrosemod:chests/test";
String test1 = "minecraft:chests/spawn_bonus_chest";
worldIn.setBlockState(pos.offset(facing), Blocks.CHEST.getDefaultState());
if (worldIn.getTileEntity(pos.offset(facing)) instanceof TileEntityChest) {
((TileEntityChest) worldIn.getTileEntity(pos.offset(facing))).setLootTable(
new ResourceLocation(test), player.getRNG().nextLong());
}
return super.onItemUse(player, worldIn, pos, hand, facing, hitX, hitY, hitZ);
}
}
下のメソッドはアイテムを使用したときにメソッドの内容を返すもので
ここではLootTableを追加したチェストをタゲった場所に置くという物です。
ItemSwordがItemクラスを継承しているのでこのメソッドも使えます。
まあLootTableを追加するときの確認用に。
@Mod(modid = Robby.MODID,name = Robby.NAME,version = Robby.VERSION,acceptedMinecraftVersions = Robby.MCVER)
public class Robby
{
public static final String MODID = "moonrosemod";
public static final String NAME = "MoonroseMod";
public static final String VERSION = "1.0";
public static final String MCVER = "1.12";
public static Item rubyrod;
@EventHandler
public void preInt(FMLPreInitializationEvent event)
{
rubyrod = new Rubyrod();
ForgeRegistries.ITEMS.register(rubyrod);
ModelLoader.setCustomModelResourceLocation(rubyrod, 0, new ModelResourceLocation(MODID + ":rubyrod",variantIn));
}
}
クラスが出来たらいつものように登録作業をします。
先ほど作成したクラスでrejistrNAMEなども入れているので登録のみですね。
ssの方がいいのかコードそのものを載せるのがいいのか未だにどっちがいいのか
図りかねています。
jsonファイルの作成などいつもの手順は省略します。
ItemSwordクラスを継承しているのでやっぱり攻撃速度は変えられません。
攻撃力は変えられます。
アタックではなくアイテムの使用でブロックの上にチェストを設置することができます。
このアイテムを使用したときに何かをするメソッドは色々他でも使うことになります。
では・・・攻撃速度を変えたい!というときはどうするのかといいますと
ItemSwordクラスではなくItemクラスを継承してクラスを作成します。
Itemクラスを継承していないと使えないメソッドなどもありますので
Itemクラスは継承するのが無難です。
ちょっとだけ透けて見える仕様の剣で色合い的にもキングスフィールドのムーンライトソードを
再現できているのでは?!と調子に乗っています('ω')
基本的なことのみ記述したものです。
これにさらにメソッドなども必要なら足していきます。
Itemクラス継承、コンストラクタ フィールドの宣言 インスタンス、フィールドの設定、ToolMaterialの追加設定、下のメソッドは攻撃力と攻撃速度の設定をするメソッドです。
後の手順はいつも道理なので省略します。
攻撃速度もちょっとやりすぎ感がありますが・・・7になりました。
ふふ・・・素敵♪
でもこのままでは蜘蛛の巣も切れませんし・・・他のメソッドはItemSwordクラスなどを参考に
しつつ付けたいもののメソッドを足していきます。
一部だけですが・・・。特にgetStrVsBlockメソッドで指定をしておかないと採掘にすごく時間が
かかります(;´Д`)剣なので蜘蛛の巣に対する強さを指定しておく必要があります。
後はItemSwordクラスやItemクラスなどを見てお好きなものを。
蜘蛛の巣ははさみを使うと蜘蛛の巣をドロップ、剣などでは糸を落とします。
他のも指定できますのでお好きなものを。草はなんでも刈れるきはしますが~
ただの例なので気にしないでください。
次は道具の追加を行います。
手順などは武器と大体同じなので省略してコードだけ載せておきます。
ToolMaterialは武器の時と同じものを使用するので設定していません
ItemToolクラスを継承しています。大体はItemToolクラスを見て同じようにすれば大丈夫です。set<Block>のところは採掘したいブロックを入れます。配列というかコレクションというか
になっているので()の中にコンマで区切って入れていきます。
それから必要なメソッドをいれていきます。この辺も継承していることによる恩恵が
大きいことがわかりますね。
クラスが出来たらいつものように登録したりjsonファイルを作成したり。
それが終わったら今度はこのrubyknifeを使ってブロックを破壊したときのみ本来のドロップとは違う物をドロップするという設定をしたいと思います。別に自分には必要ないのなら飛ばしてもらって大丈夫です。
原木ブロックと葉ブロックをrubyknifeで破壊したときにtwigというアイテムを落とすように
しているイベントメソッドです。MinecraftForge.EVENT_BUS.register(this);が
initメソッド内にあってちゃんと読み込みが出来る状態にすることも必須です。
ifの条件が合えば本来ドロップするはずの原木ブロックと葉ブロックからドロップする
リンゴと苗が消されてtwigという新たに追加したアイテムが破壊されたブロックの
位置にドロップします。この辺のメソッドはHarvestDropEventクラスを参考にします。
色的に見辛いかもですが(-_-;)
次はrubysickleという鎌を作成します。これには鋏と同じような機能を付けたいと思います。
鋏と全く同じならItemShearsクラスを継承するかそのまま利用するか、ちょっと変えたい
のならItemクラスかItemToolクラスを継承させてクラスを作成します。
蜘蛛の巣ブロックを壊したときには糸を普通は出しますがここで蜘蛛の巣ブロックを
出すようにしているみたいですね。あと草ブロックも草ブロックを出すように、葉ブロックも
葉ブロックを出すようになっています。
例:羊に鋏といっても羊にしか適応していないのですがね・・・。
新しいmobを作成する際にそういう仕様にしているならこのメソッドで・・・
羊は毛を刈ったあと毛がない羊になるじゃないですか、ああいうのをしておかないと
ダメ見たいです。エンティティ側の設定が対応しているもののみ反映されるメソッドです。
羊の毛をこの道具で刈る必要がなければ入れなくていいです。
上のがエンティティに対するものでこちらはブロックに対するもののようです。
おそらくですが・・・ブロックが破壊されたときに羊が毛のない羊になるようにブロックが
空気ブロックに置き換わり、決められたアイテムをだすようなメソッドだとおもいます。
エンチャントを付けたいときのメソッドです。
付けないのならいらないです。武器でも道具でも防具でも同じようにできます。
既存のエンチャント。
斧・ピッケル・シャベル・クワを独自の素材で追加したいときはそれぞれのクラス(ItemAxe,ItemPickaxe,ItemSpade,ItemHoe)を継承させたクラスを作成するか
ItemToolクラスを継承させるかItemクラスを継承するかしてそれぞれのメソッドを入れたりして
クラスを作成するかします。コンストラクタが斧とピッケルはprotectedになっているから継承させないとそのままでは利用できないですが、シャベルとクワはPublicになっているから
そのままでも利用できます。
メソッドの内容などはそれぞれのクラスを見てもらうとして特に仕様にこだわらなければ
これで一応追加できます。
登録のところ斧とピッケルは作成したコンストラクタを、シャベルとクワはそれぞれのクラスの