最新版 |
編集中の文章 |
8行目: |
8行目: |
| *TurtleUpgradeの登録 | | *TurtleUpgradeの登録 |
| *IPeripheralの実装 | | *IPeripheralの実装 |
− | *Turtle Upgradeの外観(独自テクスチャ・モデル)の実装 | + | *Turtle Upgradeの外観の実装 |
| | | |
| === ソースコード === | | === ソースコード === |
− | Turtle Upgradeの追加については「[[ComputerCraft_API/1.76/ツールタイプTurtleの追加|MC1.8 ツールタイプTurtleの追加]]」を、周辺機器の実装については「[[ComputerCraft_API/1.76/周辺機器の追加|MC1.8 周辺機器の追加]]」を合わせて参照してください。
| |
− |
| |
− | ==== SampleUpgradeCore.java ====
| |
− | Modのコアとなるクラス
| |
− | <source lang = "java">
| |
− | 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());
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | </source>
| |
− |
| |
− | ==== ClientEventHandler.java ====
| |
− | 各種クライアントeventを受信するためのクラス<br />
| |
− | Turtle Upgradeの外見であるテクスチャとモデルを登録します。
| |
− | <source lang = "java">
| |
− | 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();
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | </source>
| |
− |
| |
− | ==== TurtleSample.java ====
| |
− | Turtle Upgradeを定義するクラス
| |
− | <source lang = "java">
| |
− | 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の値で判別可能
| |
− | }
| |
− |
| |
− | }
| |
− | </source>
| |
− |
| |
− | ==== SamplePeripheral.java ====
| |
− | 周辺機器を定義するクラス
| |
− | <source lang = "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;
| |
− | }
| |
− |
| |
− | }
| |
− | </source>
| |
− |
| |
− | ==== 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 ディレクトリに設置します。
| |
− | <source lang = "javascript">
| |
− | {
| |
− | "parent": "computercraft:block/turtle_upgrade_base_left",
| |
− | "textures": {
| |
− | "texture": "sampleupgrademod:blocks/sample_upgrade"
| |
− | }
| |
− | }
| |
− | </source>
| |
− |
| |
− | ==== turtle_sample_right.json ====
| |
− | Turtle UpgradeをTurtleの右側に装着したときのモデル<br />
| |
− | assets\sampleupgrademod\models\block ディレクトリに設置します。
| |
− | <source lang = "javascript">
| |
− | {
| |
− | "parent": "computercraft:block/turtle_upgrade_base_right",
| |
− | "textures": {
| |
− | "texture": "sampleupgrademod:blocks/sample_upgrade"
| |
− | }
| |
− | }
| |
− | </source>
| |
− |
| |
− | ==== sample_upgrade.png ====
| |
− | Turtle Upgradeのテクスチャ<br />
| |
− | assets\sampleupgrademod\textures\blocks ディレクトリに設置します。
| |
− |
| |
− | ※サイズ16x16などの適当なテクスチャ画像を各自で用意してください。
| |