細 |
(解説を修正。サンプルのupgradeIDを変更。IPeripheral.equalsの処理を変更。langファイルによる形容詞の翻訳を必須に) |
||
(同じ利用者による、間の9版が非表示) | |||
8行目: | 8行目: | ||
*TurtleUpgradeの登録 | *TurtleUpgradeの登録 | ||
*IPeripheralの実装 | *IPeripheralの実装 | ||
− | *Turtle | + | *Turtle Upgradeの外観(独自テクスチャ・モデル)の実装 |
=== ソースコード === | === ソースコード === | ||
− | + | Turtle Upgradeの追加については「[[ComputerCraft_API/1.76/ツールタイプTurtleの追加|MC1.8 ツールタイプTurtleの追加]]」を、周辺機器の実装については「[[ComputerCraft_API/1.76/周辺機器の追加|MC1.8 周辺機器の追加]]」を合わせて参照してください。 | |
− | |||
==== SampleUpgradeCore.java ==== | ==== SampleUpgradeCore.java ==== | ||
+ | Modのコアとなるクラス | ||
<source lang = "java"> | <source lang = "java"> | ||
package mods.sample.upgrade; | 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; | ||
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; | ||
− | @Mod(modid=SampleUpgradeCore.MOD_ID, | + | @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 class SampleUpgradeCore { | ||
33行目: | 36行目: | ||
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 = "after:ComputerCraft"; | + | 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 | @EventHandler | ||
− | public void | + | public void preInit(FMLPreInitializationEvent event) { |
− | + | // Turtle Upgradeの登録 | |
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ||
} | } | ||
− | + | @EventHandler | |
− | + | public void init(FMLInitializationEvent event) { | |
− | + | // クライアント限定の処理 | |
− | + | if (event.getSide().isClient()) { | |
− | + | // クライアントイベント受信クラスの登録 | |
− | + | MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | public void | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
112行目: | 57行目: | ||
</source> | </source> | ||
− | ==== | + | ==== ClientEventHandler.java ==== |
+ | 各種クライアントeventを受信するためのクラス<br /> | ||
+ | Turtle Upgradeの外見であるテクスチャとモデルを登録します。 | ||
<source lang = "java"> | <source lang = "java"> | ||
package mods.sample.upgrade.client; | package mods.sample.upgrade.client; | ||
− | import java. | + | import java.io.IOException; |
import mods.sample.upgrade.SampleUpgradeCore; | import mods.sample.upgrade.SampleUpgradeCore; | ||
126行目: | 73行目: | ||
import net.minecraft.util.ResourceLocation; | import net.minecraft.util.ResourceLocation; | ||
import net.minecraftforge.client.event.ModelBakeEvent; | import net.minecraftforge.client.event.ModelBakeEvent; | ||
+ | import net.minecraftforge.client.event.TextureStitchEvent; | ||
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; | ||
− | public class | + | @SideOnly(Side.CLIENT) |
+ | public class ClientEventHandler { | ||
@SubscribeEvent | @SubscribeEvent | ||
− | public void | + | 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(); | |
− | |||
} | } | ||
} | } | ||
171行目: | 127行目: | ||
==== TurtleSample.java ==== | ==== TurtleSample.java ==== | ||
+ | Turtle Upgradeを定義するクラス | ||
<source lang = "java"> | <source lang = "java"> | ||
package mods.sample.upgrade; | package mods.sample.upgrade; | ||
184行目: | 141行目: | ||
import net.minecraft.util.EnumFacing; | import net.minecraft.util.EnumFacing; | ||
import net.minecraft.util.ResourceLocation; | import net.minecraft.util.ResourceLocation; | ||
+ | import net.minecraftforge.fml.common.FMLCommonHandler; | ||
import net.minecraftforge.fml.relauncher.Side; | import net.minecraftforge.fml.relauncher.Side; | ||
import net.minecraftforge.fml.relauncher.SideOnly; | import net.minecraftforge.fml.relauncher.SideOnly; | ||
199行目: | 157行目: | ||
public class TurtleSample implements ITurtleUpgrade { | public class TurtleSample implements ITurtleUpgrade { | ||
− | private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, " | + | // Turtle UpgradeのID |
− | private ItemStack upgradeItem = new ItemStack(Blocks.stone); | + | 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; | private ModelResourceLocation modelLeft; | ||
+ | @SideOnly(Side.CLIENT) | ||
private ModelResourceLocation modelRight; | private ModelResourceLocation modelRight; | ||
public TurtleSample() { | public TurtleSample() { | ||
− | String modid = SampleUpgradeCore.MOD_ID; | + | // クライアント限定の処理 |
− | + | 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 | @Override | ||
public ResourceLocation getUpgradeID() { | public ResourceLocation getUpgradeID() { | ||
216行目: | 185行目: | ||
} | } | ||
+ | // Minecraft 1.7.10やそれ以前のワールドからTurtle Upgradeを引き継ぐ場合は、そのTurtle Upgradeと同じIDを返す | ||
+ | // 引き継ぐ必要がない場合は-1を返す | ||
@Override | @Override | ||
public int getLegacyUpgradeID() { | public int getLegacyUpgradeID() { | ||
221行目: | 192行目: | ||
} | } | ||
+ | // 装着したTurtleのアイテム名に付加される形容詞を返す(『○○ Turtle』の○○の部分) | ||
+ | // 戻り値は(設定されていれば)langファイルによる翻訳を経てゲーム内に表示される | ||
@Override | @Override | ||
public String getUnlocalisedAdjective() { | public String getUnlocalisedAdjective() { | ||
− | return " | + | return "turtle.sample_peripheral.adjective"; |
} | } | ||
+ | // 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() { | ||
236行目: | 212行目: | ||
} | } | ||
+ | // 周辺機器クラスのインスタンスを生成して返す | ||
@Override | @Override | ||
public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
241行目: | 218行目: | ||
} | } | ||
+ | // ツールタイプ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) | ||
253行目: | 235行目: | ||
ModelManager modelManager = mc.getRenderItem().getItemModelMesher().getModelManager(); | ModelManager modelManager = mc.getRenderItem().getItemModelMesher().getModelManager(); | ||
+ | // Turtle Upgradeの装着方向に応じたモデルを取得して返す | ||
+ | // このモデルはTurtleのTileEntitySpecialRenderer内で描画される | ||
if (side == TurtleSide.Left) { | if (side == TurtleSide.Left) { | ||
return Pair.of(modelManager.getModel(modelLeft), null); | return Pair.of(modelManager.getModel(modelLeft), null); | ||
260行目: | 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の値で判別可能 | ||
} | } | ||
269行目: | 256行目: | ||
==== SamplePeripheral.java ==== | ==== SamplePeripheral.java ==== | ||
+ | 周辺機器を定義するクラス | ||
<source lang = "java"> | <source lang = "java"> | ||
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; | ||
285行目: | 274行目: | ||
public SamplePeripheral(ITurtleAccess turtle, TurtleSide side) { | public SamplePeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
+ | // 装着されたTurtleのTurtleAccessとTurtleSideを保存 | ||
turtleAccess = turtle; | turtleAccess = turtle; | ||
turtleSide = side; | turtleSide = side; | ||
} | } | ||
+ | |||
+ | /* 以下は周辺機器ブロックと同様に実装 */ | ||
@Override | @Override | ||
310行目: | 302行目: | ||
} | } | ||
+ | // 装着されたTurtleが起動したとき、またはコマンドでTurtleに装着されたときに呼び出される | ||
@Override | @Override | ||
public void attach(IComputerAccess computer) { | public void attach(IComputerAccess computer) { | ||
315行目: | 308行目: | ||
} | } | ||
+ | // 装着されたTurtleが終了したとき、またはコマンドでTurtleから取り外されたときに呼び出される | ||
@Override | @Override | ||
public void detach(IComputerAccess computer) { | public void detach(IComputerAccess computer) { | ||
320行目: | 314行目: | ||
} | } | ||
+ | // 周辺機器が同一のものであるかを比較して返す | ||
@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)) { | ||
− | return | + | BlockPos otherPos = ((SamplePeripheral)other).turtleAccess.getPosition(); |
+ | TurtleSide otherSide = ((SamplePeripheral)other).turtleSide; | ||
+ | return this.turtleAccess.getPosition().equals(otherPos) && (this.turtleSide == otherSide); | ||
} | } | ||
332行目: | 330行目: | ||
</source> | </source> | ||
− | ==== turtle_sample_left.json | + | ==== en_US.lang ==== |
+ | アメリカ英語(デフォルト言語)のlangファイル<br /> | ||
+ | assets\sampleupgrademod\lang ディレクトリに設置します。 | ||
+ | <source lang="ini"> | ||
+ | |||
+ | turtle.sample_peripheral.adjective=Sample | ||
+ | </source> | ||
+ | |||
+ | |||
+ | === モデル・テクスチャ === | ||
+ | 今回、モデルの形状についてはComputerCraft本体で定義されているものを流用し、テクスチャのみオリジナルなものを使用しています。<br /> | ||
+ | モデルを定義するJSONの仕様については「[[1.8のバニラJsonの仕様]]」や「[[1.8のブロック追加]]」を参照してください。 | ||
+ | |||
+ | ==== turtle_sample_left.json ==== | ||
+ | Turtle UpgradeをTurtleの左側に装着したときのモデル<br /> | ||
assets\sampleupgrademod\models\block ディレクトリに設置します。 | assets\sampleupgrademod\models\block ディレクトリに設置します。 | ||
<source lang = "javascript"> | <source lang = "javascript"> | ||
338行目: | 350行目: | ||
"parent": "computercraft:block/turtle_upgrade_base_left", | "parent": "computercraft:block/turtle_upgrade_base_left", | ||
"textures": { | "textures": { | ||
− | "texture": "blocks/ | + | "texture": "sampleupgrademod:blocks/sample_upgrade" |
} | } | ||
} | } | ||
</source> | </source> | ||
− | ==== turtle_sample_right.json | + | ==== turtle_sample_right.json ==== |
+ | Turtle UpgradeをTurtleの右側に装着したときのモデル<br /> | ||
assets\sampleupgrademod\models\block ディレクトリに設置します。 | assets\sampleupgrademod\models\block ディレクトリに設置します。 | ||
<source lang = "javascript"> | <source lang = "javascript"> | ||
349行目: | 362行目: | ||
"parent": "computercraft:block/turtle_upgrade_base_right", | "parent": "computercraft:block/turtle_upgrade_base_right", | ||
"textures": { | "textures": { | ||
− | "texture": "blocks/ | + | "texture": "sampleupgrademod:blocks/sample_upgrade" |
} | } | ||
} | } | ||
</source> | </source> | ||
+ | ==== sample_upgrade.png ==== | ||
+ | Turtle Upgradeのテクスチャ<br /> | ||
+ | assets\sampleupgrademod\textures\blocks ディレクトリに設置します。 | ||
− | + | ※サイズ16x16などの適当なテクスチャ画像を各自で用意してください。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
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などの適当なテクスチャ画像を各自で用意してください。