提供: Minecraft Modding Wiki
移動先: 案内検索

ComputerCraft API >

この記事は"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などの適当なテクスチャ画像を各自で用意してください。