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

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
9行目: 9行目:
  
 
=== ソースコード ===
 
=== ソースコード ===
 +
Packageは適宜設定してください。
 +
 
==== SampleUpgradeCore.java ====
 
==== SampleUpgradeCore.java ====
Modのコアとなるクラス
 
 
<source lang = "java">
 
<source lang = "java">
package mods.sample.upgrade;
+
// package mods.sample.upgrade;
  
 
import net.minecraftforge.fml.common.Mod;
 
import net.minecraftforge.fml.common.Mod;
 
import net.minecraftforge.fml.common.Mod.EventHandler;
 
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
+
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
 
import dan200.computercraft.api.ComputerCraftAPI;
 
import dan200.computercraft.api.ComputerCraftAPI;
  
29行目: 30行目:
 
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 = "required-after:ComputerCraft"; // 前提MODとしてComputerCraftを要求
+
public static final String MOD_DEPENDENCIES = "after:ComputerCraft";
public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]"; // Minecraft 1.8~1.8.9でのみ起動可能
+
public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]";
  
 
@EventHandler
 
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
+
public void init(FMLInitializationEvent event) {
// Turtle Upgradeの登録
 
 
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample());
 
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample());
 
}
 
}
42行目: 42行目:
  
 
==== TurtleSample.java ====
 
==== TurtleSample.java ====
Turtle Upgradeの機能を定義するクラス
 
 
<source lang = "java">
 
<source lang = "java">
package mods.sample.upgrade;
+
// package mods.sample.upgrade;
  
 
import javax.vecmath.Matrix4f;
 
import javax.vecmath.Matrix4f;
69行目: 68行目:
 
public class TurtleSample implements ITurtleUpgrade {
 
public class TurtleSample implements ITurtleUpgrade {
  
// Turtle UpgradeのID
+
private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample");
private final ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample_tool");
+
private ItemStack upgradeItem = new ItemStack(Items.stick);
// Turtle Upgradeの装着に必要なアイテム。ここではバニラアイテムの棒
 
private final ItemStack upgradeItem = new ItemStack(Items.stick);
 
  
// Turtle UpgradeのIDをResourceLocationで指定
 
// 他のTurtle Upgradeと重複しないようにする
 
 
@Override
 
@Override
 
public ResourceLocation getUpgradeID() {
 
public ResourceLocation getUpgradeID() {
81行目: 76行目:
 
}
 
}
  
// Minecraft 1.7.10やそれ以前のワールドからTurtle Upgradeを引き継ぐ場合は、そのTurtle Upgradeと同じIDを返す
 
// 引き継ぐ必要がない場合は-1を返す
 
 
@Override
 
@Override
 
public int getLegacyUpgradeID() {
 
public int getLegacyUpgradeID() {
88行目: 81行目:
 
}
 
}
  
// 装着したTurtleのアイテム名に付加される形容詞を返す(『○○ Turtle』の○○の部分)
 
// 戻り値は(設定されていれば)langファイルによる翻訳を経てゲーム内に表示される
 
 
@Override
 
@Override
 
public String getUnlocalisedAdjective() {
 
public String getUnlocalisedAdjective() {
return "turtle.sample_tool.adjective";
+
return "Sample";
 
}
 
}
  
// Turtle Upgradeの種類の指定
 
 
@Override
 
@Override
 
public TurtleUpgradeType getType() {
 
public TurtleUpgradeType getType() {
// ツールタイプを指定
 
 
return TurtleUpgradeType.Tool;
 
return TurtleUpgradeType.Tool;
 
}
 
}
  
// Turtle Upgradeの装着に必要なアイテムを返す
 
 
@Override
 
@Override
 
public ItemStack getCraftingItem() {
 
public ItemStack getCraftingItem() {
108行目: 96行目:
 
}
 
}
  
// 周辺機器クラスのインスタンスを生成して返す
 
 
@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: // turtle.dig系
+
case Dig:
 
return dig(turtle, direction);
 
return dig(turtle, direction);
case Attack: // turtle.attack系
+
case 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(
145行目: 124行目:
 
0.0F, 0.0F, 0.0F, 1.0F);
 
0.0F, 0.0F, 0.0F, 1.0F);
 
Minecraft mc = Minecraft.getMinecraft();
 
Minecraft mc = Minecraft.getMinecraft();
// アイテムのモデルを取得
 
 
IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem);
 
IBakedModel model = mc.getRenderItem().getItemModelMesher().getItemModel(upgradeItem);
// 返したモデルはTurtleのTileEntitySpecialRenderer内で描画される
 
 
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) {
// 毎tickこのクラスで定義したTurtle Upgradeの装着数×2(Server側とClient側の分)回呼び出される
+
 
// どのTurtle Upgradeに対するupdateなのかはパラメータのturtleとsideで判別可能
 
// またServerとClientのどちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能
 
 
}
 
}
  
// ゲーム内から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のコアとなるクラス
  
==== en_US.lang ====
+
*dependencies
アメリカ英語(デフォルト言語)のlangファイル<br />
+
<source lang = "java">
assets\sampleupgrademod\lang ディレクトリに設置します。
+
@Mod(
<source lang="ini">
+
dependencies = SampleUpgradeCore.MOD_DEPENDENCIES
 +
)
 +
public class SampleUpgradeCore {
 
   
 
   
turtle.sample_tool.adjective=Sample
+
public static final String MOD_DEPENDENCIES = "after:ComputerCraft";
 
</source>
 
</source>
 +
このmodがComputerCraftの後に読み込まれるように設定しています。
  
このTurtle UpgradeをTurtleに装着した際、そのTurtleのアイテム名が「Sample Turtle」のようになります。
+
*TurtleUpgradeの登録
 +
<source lang = "java">
 +
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample());
 +
</source>
 +
実装したITurtleUpgrade(後述)のインスタンスをComputerCraftに登録します。<br>
 +
これは、実装したTurtleUpgradeをTurtleへ装着するために'''必須'''です。
  
=== 解説 ===
 
 
==== TurtleSample.java ====
 
==== TurtleSample.java ====
*ComputerCraftに登録したTurtle UpgradeのインスタンスとTurtle Upgradeの処理について
+
Turtle Upgradeの機能を定義するクラス
ここで定義したTurtle Upgradeの処理は、すべてComputerCraftに登録した単一のインスタンス内で行われます(ブロックやアイテムの定義クラスと似たような感じです)。<br />
+
 
Turtleに装着した個々のTurtle Upgradeごとにインスタンスが作られるわけではないので、一部のメソッドではパラメータのITurtleAccessとTurtleSideの値からどのTurtle Upgradeに対する呼び出しなのかを判別して処理を行う必要があります。<br />
+
*ITurtleUpgradeの実装
個々のTurtle Upgrade固有のデータを保存するためには[[ComputerCraft_API/1.65/UpgradeNBTDataの利用|UpgradeNBTData]]を利用することもできます。
+
<source lang = "java">
 +
public class TurtleSample implements ITurtleUpgrade {
 +
</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()の戻り値と言語ファイルによる翻訳
+
*getUnlocalisedAdjective()
戻り値はlangファイルによる翻訳も可能です(ゲーム内で表示される前にComputerCraftによってStatCollector#translateToLocalで処理されるため)。<br />
+
<source lang = "java">
例えば、以下のようなlangファイル(UTF-8で保存)を assets\<mod_id>\lang\ja_JP.lang に置いて"turtle.sample_tool.adjective"を返した場合、Minecraftの言語設定が日本語のときに「サンプル Turtle」のように表示されます。
+
@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;
  turtle.sample_tool.adjective=サンプル
+
  Sample=サンプル
 +
 
 +
*getType()
 +
<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()では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"
  
*useTool()と戻り値について
+
*getModel()
useTool()はゲーム内で実行されたluaプログラムに従って呼び出されますが、例えばブロックを掘ったりmobを攻撃したりというような処理はすべて自分で実装する必要があります(逆に言えば、「掘る」「攻撃する」にとらわれず自由に実装できるということでもあります)。<br />
+
<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()
 +
<source lang = "java">
 +
@Override
 +
public void update(ITurtleAccess turtle, TurtleSide side) {
 +
 
 +
}
 +
</source>
 +
Turtle UpgradeがTurtleに装着されている間、毎tick呼び出されます。<br>
 +
ロードされているワールド上で装着されている数だけ呼び出されますが、各パラメータでどれに対する呼び出しなのかが判別が可能です。<br>
 +
また、サーバ側とクライアント側でそれぞれ別に呼び出されますが、どちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能です。
  
戻り値は行動成功時にはTurtleCommandResult.success()、失敗時にはTurtleCommandResult.failure()を返します。<br />
+
今回は何もしていません。
TurtleCommandResult.success()ではObject[]で追加のパラメータ(値はIPeripheral#callMethodと同様にLuaの型へ変換されます)を、TurtleCommandResult.failure()では文字列で失敗理由を同時に返すことも可能です。
 

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート: