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

ComputerCraft API >

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

ツールタイプTurtleの追加

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

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

ソースコード

Packageは適宜設定してください。

SampleUpgradeCore.java

// package mods.sample.upgrade;

import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.common.config.Property;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.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)
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 = "after:ComputerCraft";

	public static int turtleSampleID = 10000;

	@EventHandler
	public void preInit(FMLPreInitializationEvent event) {
		Property Prop;
		Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
		cfg.load();

		Prop = cfg.get("upgrade", "SampleTurtleID", turtleSampleID);
		turtleSampleID = Prop.getInt();

		cfg.save();
	}

	@EventHandler
	public void init(FMLInitializationEvent event) {
		ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample());
	}

}

TurtleSample.java

// package mods.sample.upgrade;

import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Facing;
import net.minecraft.util.IIcon;
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 {

	private ItemStack upgradeItem = new ItemStack(Items.stick);

	@Override
	public int getUpgradeID() {
		return SampleUpgradeCore.turtleSampleID;
	}

	@Override
	public String getUnlocalisedAdjective() {
		return "Sample";
	}

	@Override
	public TurtleUpgradeType getType() {
		return TurtleUpgradeType.Tool;
	}

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

	@Override
	public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) {
		return null;
	}

	@Override
	public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side,
			TurtleVerb verb, int direction) {
		switch(verb) {
		case Dig:
			return dig(turtle, direction);
		case Attack:
			return attack(turtle, direction);
		}

		return TurtleCommandResult.failure("Undefined command");
	}

	@Override
	public IIcon getIcon(ITurtleAccess turtle, TurtleSide side) {
		return upgradeItem.getItem().getIconFromDamage(0);
	}

	@Override
	public void update(ITurtleAccess turtle, TurtleSide side) {

	}

	private TurtleCommandResult dig(ITurtleAccess turtle, int direction) {
		return TurtleCommandResult
				.success(new Object[] {"DIG to " + Facing.facings[direction]});
	}

	private TurtleCommandResult attack(ITurtleAccess turtle, int direction) {
		return TurtleCommandResult
				.success(new Object[] {"ATTACK to " + Facing.facings[direction]});
	}

}

解説

SampleUpgradeCore.java

Modのコアとなるクラス

  • dependencies
@Mod(
	dependencies = SampleUpgradeCore.MOD_DEPENDENCIES)
public class SampleUpgradeCore {

	public static final String MOD_DEPENDENCIES = "after:ComputerCraft";

このmodがComputerCraftの後に読み込まれるように設定しています。

  • Configファイルのロード
public static int turtleSampleID = 10000;

@EventHandler
public void preInit(FMLPreInitializationEvent event) {
	Property Prop;
	Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
	cfg.load();

	Prop = cfg.get("upgrade", "SampleTurtleID", turtleSampleID);
	turtleSampleID = Prop.getInt();

	cfg.save();
}

ConfigファイルをロードしてTurtle UpgradeのUpgradeID(後述)の設定値(初期値:10000)を取得します。

  • TurtleUpgradeの登録
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample());

実装したITurtleUpgrade(後述)のインスタンスをComputerCraftに登録します。
これは、実装したTurtleUpgradeをTurtleへ装着するために必須です。

TurtleSample.java

Turtle Upgradeの機能を定義するクラス

  • ITurtleUpgradeの実装
public class TurtleSample implements ITurtleUpgrade {

ITurtleUpgradeを実装します。
前述の通り、このクラスのインスタンスをComputerCraftへ登録します。

  • getUpgradeID()
@Override
public int getUpgradeID() {
	return SampleUpgradeCore.turtleSampleID;
}

ComputerCraftがTurtle Upgradeを識別するためのUpgradeIDを返します。UpgradeIDの数値は他のTurtle Upgradeと重複しないものである必要があります。
ちなみに、ComputerCraft WikiにはメジャーなTurtle Upgradeで使われているIDの一覧表があるので参考にしてください。→Turtle Upgrade IDs - ComputerCraft Wiki

今回はUpgradeIDとしてcoreクラスでconfigファイルから取得した数値を指定しています。

  • getUnlocalisedAdjective()

Turtle Upgradeを装着した際にTurtleのアイテム名に付与される形容詞を指定します。
戻り値は表示される前にStatCollector#translateToLocalで処理されるため、langファイルによる翻訳も可能です。

  • getType()

Turtle Upgradeの種類をTurtleUpgradeTypeの値で指定します。

今回はツールタイプなので TurtleUpgradeType.Tool を返しています。

  • getCraftingItem()
private ItemStack upgradeItem = new ItemStack(Items.stick);

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

Turtle Upgradeを装着するためのアイテムをItemStackで指定します。

今回はバニラアイテムの棒を指定していますが、modで追加した独自アイテムも同様に指定できます。

  • createPeripheral()

周辺機器タイプのTurtle Upgradeでは周辺機器のインスタンスを返します。

今回のような、ツールタイプのTurtle Upgradeではそもそも呼び出されないのでnullを返しています。

  • useTool()
@Override
public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side,
		TurtleVerb verb, int direction) {
	switch(verb) {
	case Dig:
		return dig(turtle, direction);
	case Attack:
		return attack(turtle, direction);
	}

	return TurtleCommandResult.failure("Undefined command");
}

ツールタイプのTurtle Upgradeでゲーム内のLuaからturtle.dig()やturtle.attack()が呼ばれたときに呼び出されます。
digとattackのどちらが呼ばれたのかは引数verbの値で判別可能です。

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

今回はdigとattackの処理をそれぞれ別のprivateメソッドで行っています。

private TurtleCommandResult dig(ITurtleAccess turtle, int direction) {
	return TurtleCommandResult
			.success(new Object[] {"DIG to " + Facing.facings[direction]});
}

private TurtleCommandResult attack(ITurtleAccess turtle, int direction) {
	return TurtleCommandResult
			.success(new Object[] {"ATTACK to " + Facing.facings[direction]});
}

今回は無条件に行動成功とし、呼び出した行動の種類と方向が分かるような文字列を返しています。
例えばLua側からturtle.digDown()を呼び出したときのLua側への戻り値は次のようになります:

true, "DIG to DOWN"
  • getIcon()
@Override
public IIcon getIcon(ITurtleAccess turtle, TurtleSide side) {
	return upgradeItem.getItem().getIconFromDamage(0);
}

Turtleに装着されたTurtle Upgradeの外観を指定します。
ツールタイプのTurtle Upgradeの場合、アイテムクラス内で登録されたアイコンのIIconを返します。
装着中に返すアイコンを変更した場合それが即座に外見へ反映されるため、Turtle Upgradeの状態に合わせてアイコンを変えるようなことも可能です。

今回はバニラアイテムの棒のアイコンを指定していますが、mod追加の独自アイテムクラス内で登録したアイコンも同様に指定できます。

  • update()

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

今回は何もしていません。