この記事は"Minecraft Forge Universal 10.14.4.x~"及び"ComputerCraft 1.76~"を前提MODとしています。 |
目次
ツールタイプTurtleの追加
ツールタイプのTurtle Upgradeを追加します。
- ITurtleUpgrade(ツールタイプ)の実装
- TurtleUpgradeの登録
ソースコード
SampleUpgradeCore.java
Modのコアとなるクラス
package mods.sample.upgrade; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import dan200.computercraft.api.ComputerCraftAPI; @Mod( modid = SampleUpgradeCore.MOD_ID, name = SampleUpgradeCore.MOD_NAME, version = SampleUpgradeCore.MOD_VERSION, dependencies = SampleUpgradeCore.MOD_DEPENDENCIES, acceptedMinecraftVersions = SampleUpgradeCore.MOD_ACCEPTED_MC_VERSIONS) public class SampleUpgradeCore { public static final String MOD_ID = "sampleupgrademod"; public static final String MOD_NAME = "Sample Upgrade Mod"; public static final String MOD_VERSION = "1.0"; public static final String MOD_DEPENDENCIES = "required-after:ComputerCraft"; // 前提MODとしてComputerCraftを要求 public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]"; // Minecraft 1.8~1.8.9でのみ起動可能 @EventHandler public void preInit(FMLPreInitializationEvent event) { // Turtle Upgradeの登録 ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); } }
TurtleSample.java
Turtle Upgradeの機能を定義するクラス
package mods.sample.upgrade; import javax.vecmath.Matrix4f; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.IBakedModel; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.Pair; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleUpgradeType; import dan200.computercraft.api.turtle.TurtleVerb; public class TurtleSample implements ITurtleUpgrade { // Turtle UpgradeのID private final ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample_tool"); // Turtle Upgradeの装着に必要なアイテム。ここではバニラアイテムの棒 private final ItemStack upgradeItem = new ItemStack(Items.stick); // Turtle UpgradeのIDをResourceLocationで指定 // 他のTurtle Upgradeと重複しないようにする @Override public ResourceLocation getUpgradeID() { return upgradeID; } // Minecraft 1.7.10やそれ以前のワールドからTurtle Upgradeを引き継ぐ場合は、そのTurtle Upgradeと同じIDを返す // 引き継ぐ必要がない場合は-1を返す @Override public int getLegacyUpgradeID() { return -1; } // 装着したTurtleのアイテム名に付加される形容詞を返す(『○○ Turtle』の○○の部分) // 戻り値は(設定されていれば)langファイルによる翻訳を経てゲーム内に表示される @Override public String getUnlocalisedAdjective() { return "turtle.sample_tool.adjective"; } // Turtle Upgradeの種類の指定 @Override public TurtleUpgradeType getType() { // ツールタイプを指定 return TurtleUpgradeType.Tool; } // Turtle Upgradeの装着に必要なアイテムを返す @Override public ItemStack getCraftingItem() { return upgradeItem; } // 周辺機器クラスのインスタンスを生成して返す @Override public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { // ツールタイプではnullを返す return null; } // ツールタイプTurtle Upgradeの処理 // ゲーム内でturtle.dig()やturtle.attack()が呼び出された時に呼ばれる @Override public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, TurtleVerb verb, EnumFacing direction) { // 呼び出された動作それぞれの処理を行う switch(verb) { case Dig: // turtle.dig系 return dig(turtle, direction); case Attack: // turtle.attack系 return attack(turtle, direction); } // 対応する動作が無かったとき「失敗」とメッセージを返す(CC1.76の時点でこのサンプルでは到達しないはず) return TurtleCommandResult.failure("Undefined command"); } // Turtle Upgradeのモデルと変形行列のペアを返す // Turtle Upgradeの外見を描画するためクライアント側で毎描画フレーム呼び出される @Override @SideOnly(Side.CLIENT) public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) { // アイテムのモデルをTurtleの左または右側に描画するための変形行列を作成 float xOffset = (side == TurtleSide.Left) ? -0.40625F : 0.40625F; Matrix4f transform = new Matrix4f( 0.0F, 0.0F, -1.0F, 1.0F + xOffset, 1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -1.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.0F, 1.0F); Minecraft mc = Minecraft.getMinecraft(); // アイテムのモデルを取得 IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem); // 返したモデルはTurtleのTileEntitySpecialRenderer内で描画される return Pair.of(model, transform); } // Tick毎の処理 @Override public void update(ITurtleAccess turtle, TurtleSide side) { // 毎tickこのクラスで定義したTurtle Upgradeの装着数×2(Server側とClient側の分)回呼び出される // どのTurtle Upgradeに対するupdateなのかはパラメータのturtleとsideで判別可能 // またServerとClientのどちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能 } // ゲーム内からturtle.dig系が呼び出された時の処理 // 動作が成功した時はTurtleCommandResult.successを、失敗した時はTurtleCommandResult.failureを返す private TurtleCommandResult dig(ITurtleAccess turtle, EnumFacing direction) { // このサンプルでは単に「成功」と動作の方向を表す文字列を返す return TurtleCommandResult.success(new Object[] {"DIG to " + direction.getName()}); } // ゲーム内からturtle.attack系が呼び出された時の処理 // 動作が成功した時はTurtleCommandResult.successを、失敗した時はTurtleCommandResult.failureを返す private TurtleCommandResult attack(ITurtleAccess turtle, EnumFacing direction) { // このサンプルでは単に「成功」と動作の方向を表す文字列を返す return TurtleCommandResult.success(new Object[] {"ATTACK to " + direction.getName()}); } }
en_US.lang
アメリカ英語(デフォルト言語)のlangファイル
assets\sampleupgrademod\lang ディレクトリに設置します。
turtle.sample_tool.adjective=Sample
このTurtle UpgradeをTurtleに装着した際、そのTurtleのアイテム名が「Sample Turtle」のようになります。
解説
TurtleSample.java
- ComputerCraftに登録したTurtle UpgradeのインスタンスとTurtle Upgradeの処理について
ここで定義したTurtle Upgradeの処理は、すべてComputerCraftに登録した単一のインスタンス内で行われます(ブロックやアイテムの定義クラスと似たような感じです)。
Turtleに装着した個々のTurtle Upgradeごとにインスタンスが作られるわけではないので、一部のメソッドではパラメータのITurtleAccessとTurtleSideの値からどのTurtle Upgradeに対する呼び出しなのかを判別して処理を行う必要があります。
個々のTurtle Upgrade固有のデータを保存するためにはUpgradeNBTDataを利用することもできます。
- getUnlocalisedAdjective()の戻り値と言語ファイルによる翻訳
戻り値はlangファイルによる翻訳も可能です(ゲーム内で表示される前にComputerCraftによってStatCollector#translateToLocalで処理されるため)。
例えば、以下のようなlangファイル(UTF-8で保存)を assets\<mod_id>\lang\ja_JP.lang に置いて"turtle.sample_tool.adjective"を返した場合、Minecraftの言語設定が日本語のときに「サンプル Turtle」のように表示されます。
turtle.sample_tool.adjective=サンプル
- useTool()と戻り値について
useTool()はゲーム内で実行されたluaプログラムに従って呼び出されますが、例えばブロックを掘ったりmobを攻撃したりというような処理はすべて自分で実装する必要があります(逆に言えば、「掘る」「攻撃する」にとらわれず自由に実装できるということでもあります)。
戻り値は行動成功時にはTurtleCommandResult.success()、失敗時にはTurtleCommandResult.failure()を返します。
TurtleCommandResult.success()ではObject[]で追加のパラメータ(値はIPeripheral#callMethodと同様にLuaの型へ変換されます)を、TurtleCommandResult.failure()では文字列で失敗理由を同時に返すことも可能です。