提供: Minecraft Modding Wiki
移動先: 案内検索
(Mod.acceptedMinecraftVersionsについての解説を追加)
(解説をできるだけソースコード内のコメントへ移動)
10行目: 10行目:
 
=== ソースコード ===
 
=== ソースコード ===
 
==== SampleUpgradeCore.java ====
 
==== SampleUpgradeCore.java ====
 +
Modのコアとなるクラス
 
<source lang = "java">
 
<source lang = "java">
 
package mods.sample.upgrade;
 
package mods.sample.upgrade;
28行目: 29行目:
 
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]";
+
public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]"; // Minecraft 1.8~1.8.9でのみ起動可能
  
 
@EventHandler
 
@EventHandler
 
public void init(FMLInitializationEvent event) {
 
public void init(FMLInitializationEvent event) {
 +
// Turtle Upgradeの登録
 
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample());
 
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample());
 
}
 
}
40行目: 42行目:
  
 
==== TurtleSample.java ====
 
==== TurtleSample.java ====
 +
Turtle Upgradeの機能を定義するクラス
 
<source lang = "java">
 
<source lang = "java">
 
package mods.sample.upgrade;
 
package mods.sample.upgrade;
66行目: 69行目:
 
public class TurtleSample implements ITurtleUpgrade {
 
public class TurtleSample implements ITurtleUpgrade {
  
 +
// Turtle UpgradeのID
 
private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample");
 
private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample");
 +
// Turtle Upgradeの装着に必要なアイテム。ここではバニラアイテムの棒
 
private ItemStack upgradeItem = new ItemStack(Items.stick);
 
private ItemStack upgradeItem = new ItemStack(Items.stick);
  
 +
// Turtle UpgradeのIDをResourceLocationで指定
 +
// 他のTurtle Upgradeと重複しないようにする
 
@Override
 
@Override
 
public ResourceLocation getUpgradeID() {
 
public ResourceLocation getUpgradeID() {
74行目: 81行目:
 
}
 
}
  
 +
// Minecraft 1.7.10やそれ以前のワールドからTurtle Upgradeを引き継ぐ場合は、そのTurtle Upgradeと同じIDを返す
 +
// 引き継ぐ必要がない場合は-1を返す
 
@Override
 
@Override
 
public int getLegacyUpgradeID() {
 
public int getLegacyUpgradeID() {
79行目: 88行目:
 
}
 
}
  
 +
// Turtle Upgradeを装着したTurtleのアイテム名に付加される形容詞を返す
 
@Override
 
@Override
 
public String getUnlocalisedAdjective() {
 
public String getUnlocalisedAdjective() {
 +
// この例では"Sample Turtle"になる
 
return "Sample";
 
return "Sample";
 
}
 
}
  
 +
// Turtle Upgradeの種類の指定
 
@Override
 
@Override
 
public TurtleUpgradeType getType() {
 
public TurtleUpgradeType getType() {
 +
// ツールタイプを指定
 
return TurtleUpgradeType.Tool;
 
return TurtleUpgradeType.Tool;
 
}
 
}
94行目: 107行目:
 
}
 
}
  
 +
// 周辺機器クラスのインスタンスを生成して返す
 
@Override
 
@Override
 
public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) {
 
public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) {
 +
// ツールタイプではnullを返す
 
return null;
 
return null;
 
}
 
}
  
 +
// ツールタイプTurtle Upgradeの処理
 +
// ゲーム内でturtle.dig()やturtle.attack()が呼び出された時に呼ばれる
 
@Override
 
@Override
 
public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side,
 
public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side,
 
TurtleVerb verb, EnumFacing direction) {
 
TurtleVerb verb, EnumFacing direction) {
 +
// 呼び出された動作それぞれの処理を行う
 
switch(verb) {
 
switch(verb) {
case Dig:
+
case Dig: // turtle.dig系
 
return dig(turtle, direction);
 
return dig(turtle, direction);
case Attack:
+
case Attack: // turtle.attack系
 
return attack(turtle, direction);
 
return attack(turtle, direction);
 
}
 
}
  
 +
// 上に対応する動作が無かったとき「失敗」とメッセージを返す(CC1.76の時点でこのサンプルでは到達しないはず)
 
return TurtleCommandResult.failure("Undefined command");
 
return TurtleCommandResult.failure("Undefined command");
 
}
 
}
  
 +
// Turtle Upgradeのモデルと変形行列のペアを返す
 +
// Turtle Upgradeの外見を描画するためクライアント側で毎描画フレーム呼び出される
 
@Override
 
@Override
 
@SideOnly(Side.CLIENT)
 
@SideOnly(Side.CLIENT)
 
public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) {
 
public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) {
 +
// アイテムモデルをTurtleの左または右側に描画するための変形行列を作成
 
float xOffset = (side == TurtleSide.Left) ? -0.40625F : 0.40625F;
 
float xOffset = (side == TurtleSide.Left) ? -0.40625F : 0.40625F;
 
Matrix4f transform = new Matrix4f(
 
Matrix4f transform = new Matrix4f(
122行目: 144行目:
 
0.0F, 0.0F, 0.0F, 1.0F);
 
0.0F, 0.0F, 0.0F, 1.0F);
 
Minecraft mc = Minecraft.getMinecraft();
 
Minecraft mc = Minecraft.getMinecraft();
 +
// ItemStackからアイテムモデルを取得
 
IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem);
 
IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem);
 
return Pair.of(model, transform);
 
return Pair.of(model, transform);
 
}
 
}
  
 +
// Tick毎の処理
 
@Override
 
@Override
 
public void update(ITurtleAccess turtle, TurtleSide side) {
 
public void update(ITurtleAccess turtle, TurtleSide side) {
131行目: 155行目:
 
}
 
}
  
 +
// ゲーム内からturtle.dig系が呼び出された時の処理
 +
// 動作が成功した時はTurtleCommandResult.successを、失敗した時はTurtleCommandResult.failureを返す
 
private TurtleCommandResult dig(ITurtleAccess turtle, EnumFacing direction) {
 
private TurtleCommandResult dig(ITurtleAccess turtle, EnumFacing direction) {
 +
// このサンプルでは単に「成功」と動作の方向を表す文字列を返す
 
return TurtleCommandResult.success(new Object[] {"DIG to " + direction.getName()});
 
return TurtleCommandResult.success(new Object[] {"DIG to " + direction.getName()});
 
}
 
}
  
 +
// ゲーム内からturtle.attack系が呼び出された時の処理
 +
// 動作が成功した時はTurtleCommandResult.successを、失敗した時はTurtleCommandResult.failureを返す
 
private TurtleCommandResult attack(ITurtleAccess turtle, EnumFacing direction) {
 
private TurtleCommandResult attack(ITurtleAccess turtle, EnumFacing direction) {
 +
// このサンプルでは単に「成功」と動作の方向を表す文字列を返す
 
return TurtleCommandResult.success(new Object[] {"ATTACK to " + direction.getName()});
 
return TurtleCommandResult.success(new Object[] {"ATTACK to " + direction.getName()});
 
}
 
}
  
 
}
 
}
 +
 
</source>
 
</source>
  
 
=== 解説 ===
 
=== 解説 ===
==== SampleUpgradeCore.java ====
 
Modのコアとなるクラス
 
 
*dependencies
 
<source lang = "java">
 
@Mod(
 
dependencies = SampleUpgradeCore.MOD_DEPENDENCIES
 
)
 
public class SampleUpgradeCore {
 
 
public static final String MOD_DEPENDENCIES = "after:ComputerCraft";
 
</source>
 
このmodがComputerCraftの後に読み込まれるように設定しています。
 
 
*Modが対応するMinecraftバージョンの指定
 
<source lang = "java">
 
@Mod(
 
acceptedMinecraftVersions = SampleUpgradeCore.MOD_ACCEPTED_MC_VERSIONS)
 
public class SampleUpgradeCore {
 
 
public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]";
 
</source>
 
このmodが対応しているMinecraftのバージョンを指定します。これによってmodが指定バージョン以外のMinecraftでロードされることを防ぐことができます。
 
 
今回の例ではMinecraft 1.8~1.8.9でのみ作動するように指定しています。
 
Modが対応するMinecraftのバージョンに合わせて適宜変更してください
 
 
*TurtleUpgradeの登録
 
<source lang = "java">
 
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample());
 
</source>
 
実装したITurtleUpgrade(後述)のインスタンスをComputerCraftに登録します。<br>
 
これは、実装したTurtleUpgradeをTurtleへ装着するために'''必須'''です。
 
 
 
==== TurtleSample.java ====
 
==== TurtleSample.java ====
Turtle Upgradeの機能を定義するクラス
+
このクラスで定義されTurtleに装着されたTurtle Upgradeの処理はすべてComputerCraftに登録された単一のインスタンス内で行われます。
  
*ITurtleUpgradeの実装
+
*getUnlocalisedAdjective()の戻り値と言語ファイルによる翻訳
<source lang = "java">
+
戻り値はゲーム内で表示される前にComputerCraftによってStatCollector#translateToLocalで処理されるため、langファイルによる翻訳も可能です。<br />
public class TurtleSample implements ITurtleUpgrade {
+
例えば、以下のようなlangファイル(UTF-8で保存)を assets\<mod_id>\lang\ja_JP.lang に置いて"Sample"を返した場合、Minecraftの言語設定が日本語のときに「サンプル Turtle」のように表示されます。
</source>
 
ITurtleUpgradeを実装します。<br>
 
前述の通り、このクラスのインスタンスをComputerCraftへ登録します。
 
 
 
*getUpgradeID()
 
<source lang = "java">
 
private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample");
 
 
 
@Override
 
public ResourceLocation getUpgradeID() {
 
return upgradeID;
 
}
 
</source>
 
ComputerCraftがTurtle Upgradeを識別するためのIDを返します。戻り値のResourceLocationに設定する文字列は、他のTurtle Upgradeと重複しないものである必要があります。
 
 
 
今回はUpgradeIDとして"sampleupgrademod:sample"という文字列を設定しています。
 
 
 
*getLegacyUpgradeID()
 
<source lang = "java">
 
@Override
 
public int getLegacyUpgradeID() {
 
return -1;
 
}
 
</source>
 
MC1.8以前のワールドで使用されていたTurtle UpgradeをMC1.8以降へ引き継ぎたい場合、MC1.8以前(CC1.75まで)のgetUpgradeIDと同じ値を返すようにします。<br>
 
旧バージョンとの互換性を考えない場合は -1 を返します。
 
 
 
*getUnlocalisedAdjective()
 
<source lang = "java">
 
@Override
 
public String getUnlocalisedAdjective() {
 
return "Sample";
 
}
 
</source>
 
Turtle Upgradeを装着した際にTurtleのアイテム名に付与される形容詞を指定します。
 
 
 
今回の例では“Sample Turtle”のようになります。
 
 
 
戻り値は表示される前にStatCollector#translateToLocalで処理されるため、langファイルによる翻訳も可能です。<br>
 
例えば次のようなlangファイル(UTF-8で保存)を assets\<mod_id>\lang\ja_JP.lang に置いてこのメソッドで"Sample"を返した場合、Minecraftの言語設定を日本語にしたときに「サンプル Turtle」のように表示されます。
 
 
  &nbsp;
 
  &nbsp;
 
  Sample=サンプル
 
  Sample=サンプル
  
*getType()
+
*useTool()の戻り値について
<source lang = "java">
 
@Override
 
public TurtleUpgradeType getType() {
 
return TurtleUpgradeType.Tool;
 
}
 
</source>
 
Turtle Upgradeの種類をTurtleUpgradeTypeの値で指定します。
 
 
 
今回はツールタイプなので TurtleUpgradeType.Tool を返しています。
 
 
 
*getCraftingItem()
 
<source lang = "java">
 
private ItemStack upgradeItem = new ItemStack(Items.stick);
 
 
 
@Override
 
public ItemStack getCraftingItem() {
 
return upgradeItem;
 
}
 
</source>
 
Turtle Upgradeを装着するためのアイテムをItemStackで指定します。
 
 
 
今回はバニラアイテムの棒を指定していますが、modで追加した独自アイテムも同様に指定できます。
 
 
 
*createPeripheral()
 
<source lang = "java">
 
@Override
 
public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) {
 
return null;
 
}
 
</source>
 
周辺機器タイプのTurtle Upgradeでは周辺機器のインスタンスを返します。
 
 
 
今回のようなツールタイプのTurtle Upgradeではそもそも呼び出されないため、nullを返しています。
 
 
 
*useTool()
 
<source lang = "java">
 
@Override
 
public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side,
 
TurtleVerb verb, EnumFacing direction) {
 
switch(verb) {
 
case Dig:
 
return dig(turtle, direction);
 
case Attack:
 
return attack(turtle, direction);
 
}
 
 
 
return TurtleCommandResult.failure("Undefined command");
 
}
 
</source>
 
ツールタイプのTurtle Upgradeでゲーム内のLuaからturtle.dig()やturtle.attack()が呼ばれたときに呼び出されます。<br>
 
digとattackのどちらが呼ばれたのかは引数verbの値で判別可能です。
 
 
 
 
戻り値は行動成功時にはTurtleCommandResult.success()、失敗時にはTurtleCommandResult.failure()を返します。<br>
 
戻り値は行動成功時にはTurtleCommandResult.success()、失敗時にはTurtleCommandResult.failure()を返します。<br>
 
TurtleCommandResult.success()ではObject[]で追加パラメータ(値はIPeripheral#callMethodと同様にLuaの型へ変換されます)を、TurtleCommandResult.failure()では文字列で失敗理由を同時に返すことも可能です。
 
TurtleCommandResult.success()ではObject[]で追加パラメータ(値はIPeripheral#callMethodと同様にLuaの型へ変換されます)を、TurtleCommandResult.failure()では文字列で失敗理由を同時に返すことも可能です。
 
今回はdigとattackの処理をそれぞれ別のprivateメソッドで行っています。
 
<source lang = "java">
 
private TurtleCommandResult dig(ITurtleAccess turtle, EnumFacing direction) {
 
return TurtleCommandResult.success(new Object[] {"DIG to " + direction.getName()});
 
}
 
 
private TurtleCommandResult attack(ITurtleAccess turtle, EnumFacing direction) {
 
return TurtleCommandResult.success(new Object[] {"ATTACK to " + direction.getName()});
 
}
 
</source>
 
無条件に行動成功とし、呼び出した行動の種類と方向が分かる文字列を返しています。<br>
 
例えばLua側からturtle.digDown()を呼び出したときは、Lua側への次のような値が返ります。
 
true, "DIG to down"
 
 
*getModel()
 
<source lang = "java">
 
@Override
 
@SideOnly(Side.CLIENT)
 
public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) {
 
float xOffset = (side == TurtleSide.Left) ? -0.40625F : 0.40625F;
 
Matrix4f transform = new Matrix4f(
 
0.0F, 0.0F, -1.0F, 1.0F + xOffset,
 
1.0F, 0.0F, 0.0F, 0.0F,
 
0.0F, -1.0F, 0.0F, 1.0F,
 
0.0F, 0.0F, 0.0F, 1.0F);
 
Minecraft mc = Minecraft.getMinecraft();
 
IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem);
 
return Pair.of(model, transform);
 
}
 
</source>
 
Turtleに装着されたTurtle Upgradeの外観を指定します。<br>
 
戻り値はPair<IBakedModel, Matrix4f>で、IBakedModelがモデル、Matrix4fがモデルを変形する座標変換行列です。
 
 
今回はCC1.76の実装を参考にしています。
 
  
 
*update()
 
*update()
<source lang = "java">
 
@Override
 
public void update(ITurtleAccess turtle, TurtleSide side) {
 
 
}
 
</source>
 
 
Turtle UpgradeがTurtleに装着されている間、毎tick呼び出されます。<br>
 
Turtle UpgradeがTurtleに装着されている間、毎tick呼び出されます。<br>
ロードされているワールド上で装着されている数だけ呼び出されますが、各パラメータでどれに対する呼び出しなのかが判別が可能です。<br>
+
前述の通り、ロードされているチャンク内で装着されている数だけ呼び出されますが、各パラメータでどれに対する呼び出しなのかが判別可能です。<br>
 
また、サーバ側とクライアント側でそれぞれ別に呼び出されますが、どちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能です。
 
また、サーバ側とクライアント側でそれぞれ別に呼び出されますが、どちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能です。
 
今回は何もしていません。
 

2016年4月16日 (土) 09:15時点における版

ComputerCraft API >

この記事は"Minecraft Forge Universal 10.14.4.x~"及び"ComputerCraft 1.76~"を前提MODとしています。

ツールタイプTurtleの追加

ツールタイプのTurtle Upgradeを追加します。

  • ITurtleUpgrade(ツールタイプ)の実装
  • TurtleUpgradeの登録

ソースコード

SampleUpgradeCore.java

Modのコアとなるクラス

package mods.sample.upgrade;

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());
	}

}

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.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
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(Items.stick);

	// 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 Upgradeを装着したTurtleのアイテム名に付加される形容詞を返す
	@Override
	public String getUnlocalisedAdjective() {
		// この例では"Sample Turtle"になる
		return "Sample";
	}

	// Turtle Upgradeの種類の指定
	@Override
	public TurtleUpgradeType getType() {
		// ツールタイプを指定
		return TurtleUpgradeType.Tool;
	}

	@Override
	public ItemStack getCraftingItem() {
		return upgradeItem;
	}

	// 周辺機器クラスのインスタンスを生成して返す
	@Override
	public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) {
		// ツールタイプではnullを返す
		return null;
	}

	// ツールタイプTurtle Upgradeの処理
	// ゲーム内でturtle.dig()やturtle.attack()が呼び出された時に呼ばれる
	@Override
	public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side,
			TurtleVerb verb, EnumFacing direction) {
		// 呼び出された動作それぞれの処理を行う
		switch(verb) {
		case Dig:	// turtle.dig系
			return dig(turtle, direction);
		case Attack:	// turtle.attack系
			return attack(turtle, direction);
		}

		// 上に対応する動作が無かったとき「失敗」とメッセージを返す(CC1.76の時点でこのサンプルでは到達しないはず)
		return TurtleCommandResult.failure("Undefined command");
	}

	// Turtle Upgradeのモデルと変形行列のペアを返す
	// Turtle Upgradeの外見を描画するためクライアント側で毎描画フレーム呼び出される
	@Override
	@SideOnly(Side.CLIENT)
	public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) {
		// アイテムモデルをTurtleの左または右側に描画するための変形行列を作成
		float xOffset = (side == TurtleSide.Left) ? -0.40625F : 0.40625F;
		Matrix4f transform = new Matrix4f(
				0.0F, 0.0F, -1.0F, 1.0F + xOffset,
				1.0F, 0.0F, 0.0F, 0.0F,
				0.0F, -1.0F, 0.0F, 1.0F,
				0.0F, 0.0F, 0.0F, 1.0F);
		Minecraft mc = Minecraft.getMinecraft();
		// ItemStackからアイテムモデルを取得
		IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem);
		return Pair.of(model, transform);
	}

	// Tick毎の処理
	@Override
	public void update(ITurtleAccess turtle, TurtleSide side) {

	}

	// ゲーム内からturtle.dig系が呼び出された時の処理
	// 動作が成功した時はTurtleCommandResult.successを、失敗した時はTurtleCommandResult.failureを返す
	private TurtleCommandResult dig(ITurtleAccess turtle, EnumFacing direction) {
		// このサンプルでは単に「成功」と動作の方向を表す文字列を返す
		return TurtleCommandResult.success(new Object[] {"DIG to " + direction.getName()});
	}

	// ゲーム内からturtle.attack系が呼び出された時の処理
	// 動作が成功した時はTurtleCommandResult.successを、失敗した時はTurtleCommandResult.failureを返す
	private TurtleCommandResult attack(ITurtleAccess turtle, EnumFacing direction) {
		// このサンプルでは単に「成功」と動作の方向を表す文字列を返す
		return TurtleCommandResult.success(new Object[] {"ATTACK to " + direction.getName()});
	}

}

解説

TurtleSample.java

このクラスで定義されTurtleに装着されたTurtle Upgradeの処理はすべてComputerCraftに登録された単一のインスタンス内で行われます。

  • getUnlocalisedAdjective()の戻り値と言語ファイルによる翻訳

戻り値はゲーム内で表示される前にComputerCraftによってStatCollector#translateToLocalで処理されるため、langファイルによる翻訳も可能です。
例えば、以下のようなlangファイル(UTF-8で保存)を assets\<mod_id>\lang\ja_JP.lang に置いて"Sample"を返した場合、Minecraftの言語設定が日本語のときに「サンプル Turtle」のように表示されます。

 
Sample=サンプル
  • useTool()の戻り値について

戻り値は行動成功時にはTurtleCommandResult.success()、失敗時にはTurtleCommandResult.failure()を返します。
TurtleCommandResult.success()ではObject[]で追加パラメータ(値はIPeripheral#callMethodと同様にLuaの型へ変換されます)を、TurtleCommandResult.failure()では文字列で失敗理由を同時に返すことも可能です。

  • update()

Turtle UpgradeがTurtleに装着されている間、毎tick呼び出されます。
前述の通り、ロードされているチャンク内で装着されている数だけ呼び出されますが、各パラメータでどれに対する呼び出しなのかが判別可能です。
また、サーバ側とクライアント側でそれぞれ別に呼び出されますが、どちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能です。