提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
9行目: | 9行目: | ||
=== ソースコード === | === ソースコード === | ||
+ | Packageは適宜設定してください。 | ||
+ | |||
==== SampleUpgradeCore.java ==== | ==== SampleUpgradeCore.java ==== | ||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
− | package mods.sample.upgrade; | + | // package mods.sample.upgrade; |
import net.minecraftforge.fml.common.Mod; | import net.minecraftforge.fml.common.Mod; | ||
import net.minecraftforge.fml.common.Mod.EventHandler; | import net.minecraftforge.fml.common.Mod.EventHandler; | ||
− | import net.minecraftforge.fml.common.event. | + | import net.minecraftforge.fml.common.event.FMLInitializationEvent; |
import dan200.computercraft.api.ComputerCraftAPI; | import dan200.computercraft.api.ComputerCraftAPI; | ||
29行目: | 30行目: | ||
public static final String MOD_NAME = "Sample Upgrade Mod"; | public static final String MOD_NAME = "Sample Upgrade Mod"; | ||
public static final String MOD_VERSION = "1.0"; | public static final String MOD_VERSION = "1.0"; | ||
− | public static final String MOD_DEPENDENCIES = " | + | public static final String MOD_DEPENDENCIES = "after:ComputerCraft"; |
− | public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]"; | + | public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]"; |
@EventHandler | @EventHandler | ||
− | public void | + | public void init(FMLInitializationEvent event) { |
− | |||
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ||
} | } | ||
42行目: | 42行目: | ||
==== TurtleSample.java ==== | ==== TurtleSample.java ==== | ||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
− | package mods.sample.upgrade; | + | // package mods.sample.upgrade; |
import javax.vecmath.Matrix4f; | import javax.vecmath.Matrix4f; | ||
69行目: | 68行目: | ||
public class TurtleSample implements ITurtleUpgrade { | public class TurtleSample implements ITurtleUpgrade { | ||
− | + | private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample"); | |
− | private | + | private ItemStack upgradeItem = new ItemStack(Items.stick); |
− | |||
− | private | ||
− | |||
− | |||
@Override | @Override | ||
public ResourceLocation getUpgradeID() { | public ResourceLocation getUpgradeID() { | ||
81行目: | 76行目: | ||
} | } | ||
− | |||
− | |||
@Override | @Override | ||
public int getLegacyUpgradeID() { | public int getLegacyUpgradeID() { | ||
88行目: | 81行目: | ||
} | } | ||
− | |||
− | |||
@Override | @Override | ||
public String getUnlocalisedAdjective() { | public String getUnlocalisedAdjective() { | ||
− | return " | + | return "Sample"; |
} | } | ||
− | |||
@Override | @Override | ||
public TurtleUpgradeType getType() { | public TurtleUpgradeType getType() { | ||
− | |||
return TurtleUpgradeType.Tool; | return TurtleUpgradeType.Tool; | ||
} | } | ||
− | |||
@Override | @Override | ||
public ItemStack getCraftingItem() { | public ItemStack getCraftingItem() { | ||
108行目: | 96行目: | ||
} | } | ||
− | |||
@Override | @Override | ||
public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
− | |||
return null; | return null; | ||
} | } | ||
− | |||
− | |||
@Override | @Override | ||
public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, | public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, | ||
TurtleVerb verb, EnumFacing direction) { | TurtleVerb verb, EnumFacing direction) { | ||
− | |||
switch(verb) { | switch(verb) { | ||
− | case Dig: | + | case Dig: |
return dig(turtle, direction); | return dig(turtle, direction); | ||
− | case Attack: | + | case Attack: |
return attack(turtle, direction); | return attack(turtle, direction); | ||
} | } | ||
− | |||
return TurtleCommandResult.failure("Undefined command"); | return TurtleCommandResult.failure("Undefined command"); | ||
} | } | ||
− | |||
− | |||
@Override | @Override | ||
@SideOnly(Side.CLIENT) | @SideOnly(Side.CLIENT) | ||
public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) { | public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) { | ||
− | |||
float xOffset = (side == TurtleSide.Left) ? -0.40625F : 0.40625F; | float xOffset = (side == TurtleSide.Left) ? -0.40625F : 0.40625F; | ||
Matrix4f transform = new Matrix4f( | Matrix4f transform = new Matrix4f( | ||
145行目: | 124行目: | ||
0.0F, 0.0F, 0.0F, 1.0F); | 0.0F, 0.0F, 0.0F, 1.0F); | ||
Minecraft mc = Minecraft.getMinecraft(); | Minecraft mc = Minecraft.getMinecraft(); | ||
− | |||
IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem); | IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem); | ||
− | |||
return Pair.of(model, transform); | return Pair.of(model, transform); | ||
} | } | ||
− | |||
@Override | @Override | ||
public void update(ITurtleAccess turtle, TurtleSide side) { | public void update(ITurtleAccess turtle, TurtleSide side) { | ||
− | + | ||
− | |||
− | |||
} | } | ||
− | |||
− | |||
private TurtleCommandResult dig(ITurtleAccess turtle, EnumFacing direction) { | private TurtleCommandResult dig(ITurtleAccess turtle, EnumFacing direction) { | ||
− | |||
return TurtleCommandResult.success(new Object[] {"DIG to " + direction.getName()}); | return TurtleCommandResult.success(new Object[] {"DIG to " + direction.getName()}); | ||
} | } | ||
− | |||
− | |||
private TurtleCommandResult attack(ITurtleAccess turtle, EnumFacing direction) { | private TurtleCommandResult attack(ITurtleAccess turtle, EnumFacing direction) { | ||
− | |||
return TurtleCommandResult.success(new Object[] {"ATTACK to " + direction.getName()}); | return TurtleCommandResult.success(new Object[] {"ATTACK to " + direction.getName()}); | ||
} | } | ||
} | } | ||
+ | </source> | ||
− | + | === 解説 === | |
+ | ==== SampleUpgradeCore.java ==== | ||
+ | Modのコアとなるクラス | ||
− | + | *dependencies | |
− | + | <source lang = "java"> | |
− | + | @Mod( | |
− | <source lang=" | + | dependencies = SampleUpgradeCore.MOD_DEPENDENCIES |
+ | ) | ||
+ | public class SampleUpgradeCore { | ||
− | + | public static final String MOD_DEPENDENCIES = "after:ComputerCraft"; | |
</source> | </source> | ||
+ | このmodがComputerCraftの後に読み込まれるように設定しています。 | ||
− | + | *TurtleUpgradeの登録 | |
+ | <source lang = "java"> | ||
+ | ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ||
+ | </source> | ||
+ | 実装したITurtleUpgrade(後述)のインスタンスをComputerCraftに登録します。<br> | ||
+ | これは、実装したTurtleUpgradeをTurtleへ装着するために'''必須'''です。 | ||
− | |||
==== TurtleSample.java ==== | ==== TurtleSample.java ==== | ||
− | * | + | Turtle Upgradeの機能を定義するクラス |
− | + | ||
− | + | *ITurtleUpgradeの実装 | |
− | + | <source lang = "java"> | |
+ | public class TurtleSample implements ITurtleUpgrade { | ||
+ | </source> | ||
+ | ITurtleUpgradeを実装します。<br> | ||
+ | 前述の通り、このクラスのインスタンスをComputerCraftへ登録します。 | ||
+ | |||
+ | *getUpgradeID() | ||
+ | <source lang = "java"> | ||
+ | private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample"); | ||
+ | |||
+ | @Override | ||
+ | public ResourceLocation getUpgradeID() { | ||
+ | return upgradeID; | ||
+ | } | ||
+ | </source> | ||
+ | ComputerCraftがTurtle Upgradeを識別するためのIDを返します。戻り値のResourceLocationに設定する文字列は、他のTurtle Upgradeと重複しないものである必要があります。 | ||
+ | |||
+ | 今回はUpgradeIDとして"sampleupgrademod:sample"という文字列を設定しています。 | ||
+ | |||
+ | *getLegacyUpgradeID() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public int getLegacyUpgradeID() { | ||
+ | return -1; | ||
+ | } | ||
+ | </source> | ||
+ | MC1.8以前のワールドで使用されていたTurtle UpgradeをMC1.8以降へ引き継ぎたい場合、MC1.8以前(CC1.75まで)のgetUpgradeIDと同じ値を返すようにします。<br> | ||
+ | 旧バージョンとの互換性を考えない場合は -1 を返します。 | ||
− | *getUnlocalisedAdjective() | + | *getUnlocalisedAdjective() |
− | + | <source lang = "java"> | |
− | + | @Override | |
+ | public String getUnlocalisedAdjective() { | ||
+ | return "Sample"; | ||
+ | } | ||
+ | </source> | ||
+ | Turtle Upgradeを装着した際にTurtleのアイテム名に付与される形容詞を指定します。 | ||
+ | |||
+ | 今回の例では“Sample Turtle”のようになります。 | ||
+ | |||
+ | 戻り値は表示される前にStatCollector#translateToLocalで処理されるため、langファイルによる翻訳も可能です。<br> | ||
+ | 例えば次のようなlangファイル(UTF-8で保存)を assets\<mod_id>\lang\ja_JP.lang に置いてこのメソッドで"Sample"を返した場合、Minecraftの言語設定を日本語にしたときに「サンプル Turtle」のように表示されます。 | ||
| | ||
− | turtle. | + | Sample=サンプル |
+ | |||
+ | *getType() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public TurtleUpgradeType getType() { | ||
+ | return TurtleUpgradeType.Tool; | ||
+ | } | ||
+ | </source> | ||
+ | Turtle Upgradeの種類をTurtleUpgradeTypeの値で指定します。 | ||
+ | |||
+ | 今回はツールタイプなので TurtleUpgradeType.Tool を返しています。 | ||
+ | |||
+ | *getCraftingItem() | ||
+ | <source lang = "java"> | ||
+ | private ItemStack upgradeItem = new ItemStack(Items.stick); | ||
+ | |||
+ | @Override | ||
+ | public ItemStack getCraftingItem() { | ||
+ | return upgradeItem; | ||
+ | } | ||
+ | </source> | ||
+ | Turtle Upgradeを装着するためのアイテムをItemStackで指定します。 | ||
+ | |||
+ | 今回はバニラアイテムの棒を指定していますが、modで追加した独自アイテムも同様に指定できます。 | ||
+ | |||
+ | *createPeripheral() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
+ | return null; | ||
+ | } | ||
+ | </source> | ||
+ | 周辺機器タイプのTurtle Upgradeでは周辺機器のインスタンスを返します。 | ||
+ | |||
+ | 今回のようなツールタイプのTurtle Upgradeではそもそも呼び出されないため、nullを返しています。 | ||
+ | |||
+ | *useTool() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, | ||
+ | TurtleVerb verb, EnumFacing direction) { | ||
+ | switch(verb) { | ||
+ | case Dig: | ||
+ | return dig(turtle, direction); | ||
+ | case Attack: | ||
+ | return attack(turtle, direction); | ||
+ | } | ||
+ | |||
+ | return TurtleCommandResult.failure("Undefined command"); | ||
+ | } | ||
+ | </source> | ||
+ | ツールタイプのTurtle Upgradeでゲーム内のLuaからturtle.dig()やturtle.attack()が呼ばれたときに呼び出されます。<br> | ||
+ | digとattackのどちらが呼ばれたのかは引数verbの値で判別可能です。 | ||
+ | |||
+ | 戻り値は行動成功時にはTurtleCommandResult.success()、失敗時にはTurtleCommandResult.failure()を返します。<br> | ||
+ | TurtleCommandResult.success()ではObject[]で追加パラメータ(値はIPeripheral#callMethodと同様にLuaの型へ変換されます)を、TurtleCommandResult.failure()では文字列で失敗理由を同時に返すことも可能です。 | ||
+ | |||
+ | 今回はdigとattackの処理をそれぞれ別のprivateメソッドで行っています。 | ||
+ | <source lang = "java"> | ||
+ | private TurtleCommandResult dig(ITurtleAccess turtle, EnumFacing direction) { | ||
+ | return TurtleCommandResult.success(new Object[] {"DIG to " + direction.getName()}); | ||
+ | } | ||
+ | |||
+ | private TurtleCommandResult attack(ITurtleAccess turtle, EnumFacing direction) { | ||
+ | return TurtleCommandResult.success(new Object[] {"ATTACK to " + direction.getName()}); | ||
+ | } | ||
+ | </source> | ||
+ | 無条件に行動成功とし、呼び出した行動の種類と方向が分かる文字列を返しています。<br> | ||
+ | 例えばLua側からturtle.digDown()を呼び出したときは、Lua側への次のような値が返ります。 | ||
+ | true, "DIG to down" | ||
− | * | + | *getModel() |
− | + | <source lang = "java"> | |
+ | @Override | ||
+ | @SideOnly(Side.CLIENT) | ||
+ | public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) { | ||
+ | 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); | ||
+ | return Pair.of(model, transform); | ||
+ | } | ||
+ | </source> | ||
+ | Turtleに装着されたTurtle Upgradeの外観を指定します。<br> | ||
+ | 戻り値はPair<IBakedModel, Matrix4f>で、IBakedModelがモデル、Matrix4fがモデルを変形する座標変換行列です。 | ||
+ | |||
+ | 今回はCC1.76の実装を参考にしています。 | ||
+ | |||
+ | *update() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public void update(ITurtleAccess turtle, TurtleSide side) { | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | Turtle UpgradeがTurtleに装着されている間、毎tick呼び出されます。<br> | ||
+ | ロードされているワールド上で装着されている数だけ呼び出されますが、各パラメータでどれに対する呼び出しなのかが判別が可能です。<br> | ||
+ | また、サーバ側とクライアント側でそれぞれ別に呼び出されますが、どちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能です。 | ||
− | + | 今回は何もしていません。 | |
− |