提供: Minecraft Modding Wiki
移動先: 案内検索
(サンプルソース中のCoreクラスの定数と@Modを変更)
(解説追加)
187行目: 187行目:
  
 
*getLegacyUpgradeID()
 
*getLegacyUpgradeID()
MC1.8以前のTurtle UpgradeをMC1.8以降のワールドで引き継ぎたい場合、MC1.8以前のTurtle UpgradeのUpgradeIDと同じ値を返すようにします。<br>
+
<source lang = "java">
 +
@Override
 +
public int getLegacyUpgradeID() {
 +
return -1;
 +
}
 +
</source>
 +
MC1.8以前のワールドで使用されていたTurtle UpgradeをMC1.8以降へ引き継ぎたい場合、MC1.8以前(CC1.75まで)のgetUpgradeIDと同じ値を返すようにします。<br>
 
旧バージョンとの互換性を考えない場合は -1 を返します。
 
旧バージョンとの互換性を考えない場合は -1 を返します。
  
 
*getUnlocalisedAdjective()
 
*getUnlocalisedAdjective()
Turtle Upgradeを装着した際にTurtleのアイテム名に付与される形容詞を指定します。<br>
+
<source lang = "java">
戻り値は表示される前にStatCollector#translateToLocalで処理されるため、langファイルによる翻訳も可能です。
+
@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;
 +
Sample=サンプル
  
 
*getType()
 
*getType()
 +
<source lang = "java">
 +
@Override
 +
public TurtleUpgradeType getType() {
 +
return TurtleUpgradeType.Tool;
 +
}
 +
</source>
 
Turtle Upgradeの種類をTurtleUpgradeTypeの値で指定します。
 
Turtle Upgradeの種類をTurtleUpgradeTypeの値で指定します。
  
213行目: 237行目:
  
 
*createPeripheral()
 
*createPeripheral()
 +
<source lang = "java">
 +
@Override
 +
public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) {
 +
return null;
 +
}
 +
</source>
 
周辺機器タイプのTurtle Upgradeでは周辺機器のインスタンスを返します。
 
周辺機器タイプのTurtle Upgradeでは周辺機器のインスタンスを返します。
  
今回のような、ツールタイプのTurtle Upgradeではそもそも呼び出されないのでnullを返しています。
+
今回のようなツールタイプのTurtle Upgradeではそもそも呼び出されないため、nullを返しています。
  
 
*useTool()
 
*useTool()
248行目: 278行目:
 
}
 
}
 
</source>
 
</source>
今回は無条件に行動成功とし、呼び出した行動の種類と方向が分かるような文字列を返しています。<br>
+
無条件に行動成功とし、呼び出した行動の種類と方向が分かる文字列を返しています。<br>
例えばLua側からturtle.digDown()を呼び出したときのLua側への戻り値は次のようになります:
+
例えばLua側からturtle.digDown()を呼び出したときは、Lua側への次のような値が返ります。
 
  true, "DIG to down"
 
  true, "DIG to down"
  
274行目: 304行目:
  
 
*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>

2016年1月4日 (月) 11:43時点における版

ComputerCraft API >

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

ツールタイプTurtleの追加

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

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

ソースコード

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

SampleUpgradeCore.java

// 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)
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";

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

}

TurtleSample.java

// 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 {

	private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample");
	private ItemStack upgradeItem = new ItemStack(Items.stick);

	@Override
	public ResourceLocation getUpgradeID() {
		return upgradeID;
	}

	@Override
	public int getLegacyUpgradeID() {
		return -1;
	}

	@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, EnumFacing direction) {
		switch(verb) {
		case Dig:
			return dig(turtle, direction);
		case Attack:
			return attack(turtle, direction);
		}

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

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

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

	}

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

}

解説

SampleUpgradeCore.java

Modのコアとなるクラス

  • dependencies
@Mod(
	dependencies = SampleUpgradeCore.MOD_DEPENDENCIES)
public class SampleUpgradeCore {
 
	public static final String MOD_DEPENDENCIES = "after:ComputerCraft";

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

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

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

TurtleSample.java

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

  • ITurtleUpgradeの実装
public class TurtleSample implements ITurtleUpgrade {

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

  • getUpgradeID()
private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample");

@Override
public ResourceLocation getUpgradeID() {
	return upgradeID;
}

ComputerCraftがTurtle Upgradeを識別するためのIDを返します。戻り値のResourceLocationに設定する文字列は、他のTurtle Upgradeと重複しないものである必要があります。

今回はUpgradeIDとして"sampleupgrademod:sample"という文字列を設定しています。

  • getLegacyUpgradeID()
@Override
public int getLegacyUpgradeID() {
	return -1;
}

MC1.8以前のワールドで使用されていたTurtle UpgradeをMC1.8以降へ引き継ぎたい場合、MC1.8以前(CC1.75まで)のgetUpgradeIDと同じ値を返すようにします。
旧バージョンとの互換性を考えない場合は -1 を返します。

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

Turtle Upgradeを装着した際にTurtleのアイテム名に付与される形容詞を指定します。

今回の例では“Sample Turtle”のようになります。

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

 
Sample=サンプル
  • getType()
@Override
public TurtleUpgradeType getType() {
	return TurtleUpgradeType.Tool;
}

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

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

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

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

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

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

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

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

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

  • useTool()
@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");
}

ツールタイプの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, 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()});
}

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

true, "DIG to down"
  • getModel()
@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);
}

Turtleに装着されたTurtle Upgradeの外観を指定します。
戻り値はPair<IBakedModel, Matrix4f>で、IBakedModelがモデル、Matrix4fがモデルを変形する座標変換行列です。

今回はCC1.76の実装を参考にしています。

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

}

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

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