(→TurtleSample.java: 説明修正) |
(解説を修正。サンプルのupgradeIDを変更。IPeripheral.equalsの処理を変更。langファイルによる形容詞の翻訳を必須に) |
||
(同じ利用者による、間の2版が非表示) | |||
23行目: | 23行目: | ||
import net.minecraftforge.fml.common.Mod.EventHandler; | import net.minecraftforge.fml.common.Mod.EventHandler; | ||
import net.minecraftforge.fml.common.event.FMLInitializationEvent; | import net.minecraftforge.fml.common.event.FMLInitializationEvent; | ||
+ | import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; | ||
import dan200.computercraft.api.ComputerCraftAPI; | import dan200.computercraft.api.ComputerCraftAPI; | ||
39行目: | 40行目: | ||
@EventHandler | @EventHandler | ||
− | public void | + | public void preInit(FMLPreInitializationEvent event) { |
// Turtle Upgradeの登録 | // Turtle Upgradeの登録 | ||
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ||
+ | } | ||
− | if (event.getSide().isClient()) { | + | @EventHandler |
+ | public void init(FMLInitializationEvent event) { | ||
+ | // クライアント限定の処理 | ||
+ | if (event.getSide().isClient()) { | ||
// クライアントイベント受信クラスの登録 | // クライアントイベント受信クラスの登録 | ||
MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); | MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); | ||
71行目: | 76行目: | ||
import net.minecraftforge.client.model.IModel; | import net.minecraftforge.client.model.IModel; | ||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; | import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; | ||
+ | import net.minecraftforge.fml.relauncher.Side; | ||
+ | import net.minecraftforge.fml.relauncher.SideOnly; | ||
import com.google.common.base.Function; | import com.google.common.base.Function; | ||
+ | @SideOnly(Side.CLIENT) | ||
public class ClientEventHandler { | public class ClientEventHandler { | ||
150行目: | 158行目: | ||
// Turtle UpgradeのID | // Turtle UpgradeのID | ||
− | private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, " | + | private final ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample_peripheral"); |
// Turtle Upgradeの装着に必要なアイテム。ここではバニラブロックの石(焼石) | // Turtle Upgradeの装着に必要なアイテム。ここではバニラブロックの石(焼石) | ||
− | private ItemStack upgradeItem = new ItemStack(Blocks.stone); | + | private final ItemStack upgradeItem = new ItemStack(Blocks.stone); |
// Turtle UpgradeのモデルのModelResourceLocation.クライアント側でのみ参照される | // Turtle UpgradeのモデルのModelResourceLocation.クライアント側でのみ参照される | ||
161行目: | 169行目: | ||
public TurtleSample() { | public TurtleSample() { | ||
− | if (FMLCommonHandler.instance().getSide().isClient()) { | + | // クライアント限定の処理 |
+ | if (FMLCommonHandler.instance().getSide().isClient()) { | ||
String modid = SampleUpgradeCore.MOD_ID; | String modid = SampleUpgradeCore.MOD_ID; | ||
// 登録済みモデルのModelResourceLocationを前もってコンストラクタで定義しておく | // 登録済みモデルのModelResourceLocationを前もってコンストラクタで定義しておく | ||
169行目: | 178行目: | ||
} | } | ||
+ | // Turtle UpgradeのIDをResourceLocationで指定 | ||
+ | // 他のTurtle Upgradeと重複しないようにする | ||
@Override | @Override | ||
public ResourceLocation getUpgradeID() { | public ResourceLocation getUpgradeID() { | ||
− | |||
− | |||
return upgradeID; | return upgradeID; | ||
} | } | ||
+ | // Minecraft 1.7.10やそれ以前のワールドからTurtle Upgradeを引き継ぐ場合は、そのTurtle Upgradeと同じIDを返す | ||
+ | // 引き継ぐ必要がない場合は-1を返す | ||
@Override | @Override | ||
public int getLegacyUpgradeID() { | public int getLegacyUpgradeID() { | ||
− | |||
− | |||
return -1; | return -1; | ||
} | } | ||
+ | // 装着したTurtleのアイテム名に付加される形容詞を返す(『○○ Turtle』の○○の部分) | ||
+ | // 戻り値は(設定されていれば)langファイルによる翻訳を経てゲーム内に表示される | ||
@Override | @Override | ||
public String getUnlocalisedAdjective() { | public String getUnlocalisedAdjective() { | ||
− | + | return "turtle.sample_peripheral.adjective"; | |
− | |||
− | return " | ||
} | } | ||
+ | // Turtle Upgradeの種類の指定 | ||
@Override | @Override | ||
public TurtleUpgradeType getType() { | public TurtleUpgradeType getType() { | ||
− | |||
// 周辺機器タイプを指定 | // 周辺機器タイプを指定 | ||
return TurtleUpgradeType.Peripheral; | return TurtleUpgradeType.Peripheral; | ||
} | } | ||
+ | // Turtle Upgradeの装着に必要なアイテムを返す | ||
@Override | @Override | ||
public ItemStack getCraftingItem() { | public ItemStack getCraftingItem() { | ||
− | |||
return upgradeItem; | return upgradeItem; | ||
} | } | ||
+ | // 周辺機器クラスのインスタンスを生成して返す | ||
@Override | @Override | ||
public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
− | |||
return new SamplePeripheral(turtle, side); | return new SamplePeripheral(turtle, side); | ||
} | } | ||
+ | // ツールタイプTurtle Upgradeの処理 | ||
@Override | @Override | ||
public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, | public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, | ||
TurtleVerb verb, EnumFacing direction) { | TurtleVerb verb, EnumFacing direction) { | ||
− | |||
// 周辺機器タイプでは何もしない | // 周辺機器タイプでは何もしない | ||
return null; | return null; | ||
} | } | ||
+ | // Turtle Upgradeのモデルと変形行列のペアを返す | ||
+ | // Turtle Upgradeの外見を描画するためクライアント側で毎描画フレーム呼び出される | ||
+ | // そのため、Wireless Turtleのような「Turtle Upgradeや周辺機器の状態による描画モデルの変更」も可能 | ||
@Override | @Override | ||
@SideOnly(Side.CLIENT) | @SideOnly(Side.CLIENT) | ||
232行目: | 244行目: | ||
} | } | ||
+ | // Tick毎の処理 | ||
@Override | @Override | ||
public void update(ITurtleAccess turtle, TurtleSide side) { | public void update(ITurtleAccess turtle, TurtleSide side) { | ||
− | // | + | // 毎tickこのクラスで定義したTurtle Upgradeの装着数×2(Server側とClient側の分)回呼び出される |
+ | // どのTurtle Upgradeに対するupdateなのかはパラメータのturtleとsideで判別可能 | ||
+ | // またServerとClientのどちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能 | ||
} | } | ||
245行目: | 260行目: | ||
package mods.sample.upgrade; | package mods.sample.upgrade; | ||
+ | import net.minecraft.util.BlockPos; | ||
import dan200.computercraft.api.lua.ILuaContext; | import dan200.computercraft.api.lua.ILuaContext; | ||
import dan200.computercraft.api.lua.LuaException; | import dan200.computercraft.api.lua.LuaException; | ||
286行目: | 302行目: | ||
} | } | ||
+ | // 装着されたTurtleが起動したとき、またはコマンドでTurtleに装着されたときに呼び出される | ||
@Override | @Override | ||
public void attach(IComputerAccess computer) { | public void attach(IComputerAccess computer) { | ||
− | + | ||
} | } | ||
+ | // 装着されたTurtleが終了したとき、またはコマンドでTurtleから取り外されたときに呼び出される | ||
@Override | @Override | ||
public void detach(IComputerAccess computer) { | public void detach(IComputerAccess computer) { | ||
− | + | ||
} | } | ||
+ | // 周辺機器が同一のものであるかを比較して返す | ||
@Override | @Override | ||
public boolean equals(IPeripheral other) { | public boolean equals(IPeripheral other) { | ||
− | // | + | // ここでは、このクラスのインスタンスで同一座標のTurtleの同一方向に装着されている場合にのみtrueを返す |
− | |||
if ((other != null) && (other instanceof SamplePeripheral)) { | if ((other != null) && (other instanceof SamplePeripheral)) { | ||
− | SamplePeripheral | + | BlockPos otherPos = ((SamplePeripheral)other).turtleAccess.getPosition(); |
− | return | + | TurtleSide otherSide = ((SamplePeripheral)other).turtleSide; |
+ | return this.turtleAccess.getPosition().equals(otherPos) && (this.turtleSide == otherSide); | ||
} | } | ||
309行目: | 328行目: | ||
} | } | ||
+ | </source> | ||
+ | |||
+ | ==== en_US.lang ==== | ||
+ | アメリカ英語(デフォルト言語)のlangファイル<br /> | ||
+ | assets\sampleupgrademod\lang ディレクトリに設置します。 | ||
+ | <source lang="ini"> | ||
+ | |||
+ | turtle.sample_peripheral.adjective=Sample | ||
</source> | </source> | ||
=== モデル・テクスチャ === | === モデル・テクスチャ === | ||
− | + | 今回、モデルの形状についてはComputerCraft本体で定義されているものを流用し、テクスチャのみオリジナルなものを使用しています。<br /> | |
モデルを定義するJSONの仕様については「[[1.8のバニラJsonの仕様]]」や「[[1.8のブロック追加]]」を参照してください。 | モデルを定義するJSONの仕様については「[[1.8のバニラJsonの仕様]]」や「[[1.8のブロック追加]]」を参照してください。 | ||
2016年5月4日 (水) 11:39時点における最新版
この記事は"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 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()); } @EventHandler public void init(FMLInitializationEvent event) { // クライアント限定の処理 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 net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.google.common.base.Function; @SideOnly(Side.CLIENT) 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 final ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample_peripheral"); // Turtle Upgradeの装着に必要なアイテム。ここではバニラブロックの石(焼石) private final 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"); } } // 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_peripheral.adjective"; } // Turtle Upgradeの種類の指定 @Override public TurtleUpgradeType getType() { // 周辺機器タイプを指定 return TurtleUpgradeType.Peripheral; } // Turtle Upgradeの装着に必要なアイテムを返す @Override public ItemStack getCraftingItem() { return upgradeItem; } // 周辺機器クラスのインスタンスを生成して返す @Override public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { return new SamplePeripheral(turtle, side); } // ツールタイプTurtle Upgradeの処理 @Override public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, TurtleVerb verb, EnumFacing direction) { // 周辺機器タイプでは何もしない return null; } // Turtle Upgradeのモデルと変形行列のペアを返す // Turtle Upgradeの外見を描画するためクライアント側で毎描画フレーム呼び出される // そのため、Wireless Turtleのような「Turtle Upgradeや周辺機器の状態による描画モデルの変更」も可能 @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); } } // 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の値で判別可能 } }
SamplePeripheral.java[編集]
周辺機器を定義するクラス
package mods.sample.upgrade; import net.minecraft.util.BlockPos; 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; } // 装着されたTurtleが起動したとき、またはコマンドでTurtleに装着されたときに呼び出される @Override public void attach(IComputerAccess computer) { } // 装着されたTurtleが終了したとき、またはコマンドでTurtleから取り外されたときに呼び出される @Override public void detach(IComputerAccess computer) { } // 周辺機器が同一のものであるかを比較して返す @Override public boolean equals(IPeripheral other) { // ここでは、このクラスのインスタンスで同一座標のTurtleの同一方向に装着されている場合にのみtrueを返す if ((other != null) && (other instanceof SamplePeripheral)) { BlockPos otherPos = ((SamplePeripheral)other).turtleAccess.getPosition(); TurtleSide otherSide = ((SamplePeripheral)other).turtleSide; return this.turtleAccess.getPosition().equals(otherPos) && (this.turtleSide == otherSide); } return false; } }
en_US.lang[編集]
アメリカ英語(デフォルト言語)のlangファイル
assets\sampleupgrademod\lang ディレクトリに設置します。
turtle.sample_peripheral.adjective=Sample
モデル・テクスチャ[編集]
今回、モデルの形状については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などの適当なテクスチャ画像を各自で用意してください。