提供: Minecraft Modding Wiki
この記事は"Minecraft Forge Universal 10.14.4.x~"及び"ComputerCraft 1.76~"を前提MODとしています。 |
目次
周辺機器タイプTurtleの追加
周辺機器タイプのTurtle Upgradeを追加します。
- ITurtleUpgrade(周辺機器タイプ)の実装
- TurtleUpgradeの登録
- IPeripheralの実装
- Turtle Upgradeの外観(独自テクスチャ・モデル)の実装
ソースコード
Turtle Upgradeの追加については「MC1.8 ツールタイプTurtleの追加」を、周辺機器の実装については「MC1.8 周辺機器の追加」を合わせて参照してください。
SampleUpgradeCore.java
Modのコアとなるクラス
package mods.sample.upgrade; import mods.sample.upgrade.client.ClientEventHandler; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLInitializationEvent; 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 init(FMLInitializationEvent event) { // Turtle Upgradeの登録 ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); if (event.getSide().isClient()) { // クライアント限定の処理 // クライアントイベント受信クラスの登録 MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); } } }
ClientEventHandler.java
各種クライアントeventを受信するためのクラス
Turtle Upgradeの外見であるテクスチャとモデルを登録します。
package mods.sample.upgrade.client; import java.io.IOException; import mods.sample.upgrade.SampleUpgradeCore; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.resources.model.IBakedModel; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.model.IModel; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import com.google.common.base.Function; public class ClientEventHandler { @SubscribeEvent public void onTextureStitchEvent(TextureStitchEvent.Pre event) { // 使用するテクスチャの登録 event.map.registerSprite(new ResourceLocation(SampleUpgradeCore.MOD_ID, "blocks/sample_upgrade")); } @SubscribeEvent public void onModelBakeEvent(ModelBakeEvent event) { // 使用するモデルの場所 ResourceLocation modelLeft = new ResourceLocation(SampleUpgradeCore.MOD_ID, "block/turtle_sample_left"); ResourceLocation modelRight = new ResourceLocation(SampleUpgradeCore.MOD_ID, "block/turtle_sample_right"); // 使用するモデルの登録 loadModel(event, modelLeft); loadModel(event, modelRight); } // モデルをロードしbakeして登録 private void loadModel(ModelBakeEvent event, ResourceLocation location) { try { IModel model = event.modelLoader.getModel(location); IBakedModel bakedModel = model.bake(model.getDefaultState(), DefaultVertexFormats.ITEM, new Function<ResourceLocation, TextureAtlasSprite>() { @Override public TextureAtlasSprite apply(ResourceLocation location) { Minecraft mc = Minecraft.getMinecraft(); return mc.getTextureMapBlocks().getAtlasSprite(location.toString()); } }); ModelResourceLocation modelLocation = new ModelResourceLocation(location, "inventory"); event.modelRegistry.putObject(modelLocation, bakedModel); } catch (IOException e) { e.printStackTrace(); } } }
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.client.resources.model.ModelManager; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLCommonHandler; 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 ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample"); // Turtle Upgradeの装着に必要なアイテム。ここではバニラブロックの石(焼石) private ItemStack upgradeItem = new ItemStack(Blocks.stone); // Turtle UpgradeのモデルのModelResourceLocation.クライアント側でのみ参照される @SideOnly(Side.CLIENT) private ModelResourceLocation modelLeft; @SideOnly(Side.CLIENT) private ModelResourceLocation modelRight; public TurtleSample() { if (FMLCommonHandler.instance().getSide().isClient()) { // クライアント限定の処理 String modid = SampleUpgradeCore.MOD_ID; // 使用する登録済みモデルのModelResourceLocation modelLeft = new ModelResourceLocation(new ResourceLocation(modid, "block/turtle_sample_left"), "inventory"); modelRight = new ModelResourceLocation(new ResourceLocation(modid, "block/turtle_sample_right"), "inventory"); } } @Override public ResourceLocation getUpgradeID() { // Turtle UpgradeのIDをResourceLocationで指定 // 他のTurtle Upgradeと重複しないようにする return upgradeID; } @Override public int getLegacyUpgradeID() { // Minecraft 1.7.10やそれ以前のワールドからTurtle Upgradeを引き継ぐ場合は、そのTurtle Upgradeと同じIDを返す // 引き継ぐ必要がない場合は-1を返す return -1; } @Override public String getUnlocalisedAdjective() { // Turtle Upgradeを装着したTurtleのアイテム名に付加される形容詞を返す // この例では"Sample Turtle"になる return "Sample"; } @Override public TurtleUpgradeType getType() { // Turtle Upgradeの種類の指定 // 周辺機器タイプを指定 return TurtleUpgradeType.Peripheral; } @Override public ItemStack getCraftingItem() { // Turtle Upgradeの装着に必要なアイテムを返す return upgradeItem; } @Override public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { // 周辺機器クラスのインスタンスを生成して返す return new SamplePeripheral(turtle, side); } @Override public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, TurtleVerb verb, EnumFacing direction) { // ツールタイプTurtle Upgradeの処理 // 周辺機器タイプでは何もしない return null; } @Override @SideOnly(Side.CLIENT) public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) { Minecraft mc = Minecraft.getMinecraft(); ModelManager modelManager = mc.getRenderItem().getItemModelMesher().getModelManager(); // Turtle Upgradeの装着方向に応じたモデルを取得して返す // このモデルはTurtleのTileEntitySpecialRenderer内で描画される if (side == TurtleSide.Left) { return Pair.of(modelManager.getModel(modelLeft), null); } else { return Pair.of(modelManager.getModel(modelRight), null); } } @Override public void update(ITurtleAccess turtle, TurtleSide side) { // Tick毎の処理 } }
SamplePeripheral.java
周辺機器を定義するクラス
package mods.sample.upgrade; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; public class SamplePeripheral implements IPeripheral { private final ITurtleAccess turtleAccess; private final TurtleSide turtleSide; public SamplePeripheral(ITurtleAccess turtle, TurtleSide side) { // 装着されたTurtleのTurtleAccessとTurtleSideを保存 turtleAccess = turtle; turtleSide = side; } /* 以下は周辺機器ブロックと同様に実装 */ @Override public String getType() { return "sample"; } @Override public String[] getMethodNames() { return new String[] {}; } @Override public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException { switch(method) { } return null; } @Override public void attach(IComputerAccess computer) { // 装着されたTurtleが起動したとき、またはコマンドでTurtleに装着されたときに呼び出される } @Override public void detach(IComputerAccess computer) { // 装着されたTurtleが終了したとき、またはコマンドでTurtleから取り外されたときに呼び出される } @Override public boolean equals(IPeripheral other) { // 周辺機器が同一のものであるかを返す // サンプルでは、このクラスのインスタンスで同一Turtleの同一方向に装着されている場合にのみtrueを返している if ((other != null) && (other instanceof SamplePeripheral)) { SamplePeripheral other1 = (SamplePeripheral)other; return (other1.turtleAccess == this.turtleAccess) && (other1.turtleSide == this.turtleSide); } return false; } }
モデル・テクスチャ
今回はモデルの形状についてはComputerCraft本体で定義されているものを流用し、テクスチャのみオリジナルなものを使用しています。
モデルを定義するJSONの仕様については「1.8のバニラJsonの仕様」や「1.8のブロック追加」を参照してください。
turtle_sample_left.json
Turtle UpgradeをTurtleの左側に装着したときのモデル
assets\sampleupgrademod\models\block ディレクトリに設置します。
{ "parent": "computercraft:block/turtle_upgrade_base_left", "textures": { "texture": "sampleupgrademod:blocks/sample_upgrade" } }
turtle_sample_right.json
Turtle UpgradeをTurtleの右側に装着したときのモデル
assets\sampleupgrademod\models\block ディレクトリに設置します。
{ "parent": "computercraft:block/turtle_upgrade_base_right", "textures": { "texture": "sampleupgrademod:blocks/sample_upgrade" } }
sample_upgrade.png
Turtle Upgradeのテクスチャ
assets\sampleupgrademod\textures\blocks ディレクトリに設置します。
※サイズ16x16などの適当なテクスチャ画像を各自で用意してください。