提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
11行目: | 11行目: | ||
=== ソースコード === | === ソースコード === | ||
− | + | 「[[ComputerCraft_API/1.76/ツールタイプTurtleの追加|MC1.8 ツールタイプTurtleの追加]]」や「[[ComputerCraft_API/1.76/周辺機器の追加|MC1.8 周辺機器の追加]]」の解説を元にして、変更部分のみを解説します。<br> | |
+ | Packageは適宜設定してください。 | ||
==== SampleUpgradeCore.java ==== | ==== SampleUpgradeCore.java ==== | ||
− | |||
<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.SidedProxy; | ||
import net.minecraftforge.fml.common.event.FMLInitializationEvent; | import net.minecraftforge.fml.common.event.FMLInitializationEvent; | ||
− | |||
import dan200.computercraft.api.ComputerCraftAPI; | import dan200.computercraft.api.ComputerCraftAPI; | ||
− | @Mod( modid = SampleUpgradeCore.MOD_ID, | + | @Mod(modid=SampleUpgradeCore.MOD_ID, |
− | + | name=SampleUpgradeCore.MOD_NAME, | |
− | + | version=SampleUpgradeCore.MOD_VERSION, | |
− | + | dependencies = SampleUpgradeCore.MOD_DEPENDENCIES) | |
− | |||
public class SampleUpgradeCore { | public class SampleUpgradeCore { | ||
36行目: | 33行目: | ||
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 = " | + | public static final String MOD_DEPENDENCIES = "after:ComputerCraft"; |
− | + | ||
+ | @SidedProxy(clientSide = "mods.sample.upgrade.client.ClientProxy", serverSide = "mods.sample.upgrade.CommonProxy") | ||
+ | public static CommonProxy proxy; | ||
@EventHandler | @EventHandler | ||
− | public void | + | public void init(FMLInitializationEvent event) { |
− | + | proxy.registerEventHandlers(); | |
ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ComputerCraftAPI.registerTurtleUpgrade(new TurtleSample()); | ||
} | } | ||
− | + | } | |
− | public void | + | </source> |
− | / | + | |
− | + | ==== CommonProxy.java ==== | |
− | + | <source lang = "java"> | |
− | + | package mods.sample.upgrade; | |
− | } | + | |
+ | import java.util.Set; | ||
+ | |||
+ | import net.minecraft.client.resources.model.ModelResourceLocation; | ||
+ | import net.minecraft.util.ResourceLocation; | ||
+ | |||
+ | public class CommonProxy { | ||
+ | |||
+ | public void registerEventHandlers() { | ||
+ | |||
+ | } | ||
+ | |||
+ | public void setTextureLocation(String domain, String path) { | ||
+ | |||
+ | } | ||
+ | |||
+ | public Set<ResourceLocation> getTextureLocations() { | ||
+ | return null; | ||
+ | } | ||
+ | |||
+ | public ModelResourceLocation loadModelLocation(String domain, String path) { | ||
+ | return null; | ||
+ | } | ||
+ | |||
+ | public Set<ResourceLocation> getModelLocations() { | ||
+ | return null; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ==== ClientProxy.java ==== | ||
+ | <source lang = "java"> | ||
+ | package mods.sample.upgrade.client; | ||
+ | |||
+ | import java.util.HashSet; | ||
+ | import java.util.Set; | ||
+ | |||
+ | import mods.sample.upgrade.CommonProxy; | ||
+ | import net.minecraft.client.resources.model.ModelResourceLocation; | ||
+ | import net.minecraft.util.ResourceLocation; | ||
+ | import net.minecraftforge.common.MinecraftForge; | ||
+ | import net.minecraftforge.fml.relauncher.Side; | ||
+ | import net.minecraftforge.fml.relauncher.SideOnly; | ||
+ | |||
+ | @SideOnly(Side.CLIENT) | ||
+ | public class ClientProxy extends CommonProxy { | ||
+ | |||
+ | private Set<ResourceLocation> textureLocations = new HashSet<ResourceLocation>(); | ||
+ | private Set<ResourceLocation> modelLocations = new HashSet<ResourceLocation>(); | ||
+ | |||
+ | @Override | ||
+ | public void registerEventHandlers() { | ||
+ | MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void setTextureLocation(String domain, String path) { | ||
+ | ResourceLocation location = new ResourceLocation(domain, path); | ||
+ | textureLocations.add(location); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Set<ResourceLocation> getTextureLocations() { | ||
+ | return textureLocations; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public ModelResourceLocation loadModelLocation(String domain, String path) { | ||
+ | ResourceLocation location = new ResourceLocation(domain, path); | ||
+ | modelLocations.add(location); | ||
+ | return new ModelResourceLocation(location, "inventory"); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Set<ResourceLocation> getModelLocations() { | ||
+ | return modelLocations; | ||
} | } | ||
58行目: | 133行目: | ||
==== ClientEventHandler.java ==== | ==== ClientEventHandler.java ==== | ||
− | |||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
package mods.sample.upgrade.client; | package mods.sample.upgrade.client; | ||
− | import java. | + | import java.util.Set; |
import mods.sample.upgrade.SampleUpgradeCore; | import mods.sample.upgrade.SampleUpgradeCore; | ||
76行目: | 149行目: | ||
import net.minecraftforge.client.model.IModel; | import net.minecraftforge.client.model.IModel; | ||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; | import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; | ||
− | |||
− | |||
import com.google.common.base.Function; | import com.google.common.base.Function; | ||
− | |||
public class ClientEventHandler { | public class ClientEventHandler { | ||
@SubscribeEvent | @SubscribeEvent | ||
public void onTextureStitchEvent(TextureStitchEvent.Pre event) { | public void onTextureStitchEvent(TextureStitchEvent.Pre event) { | ||
− | + | registerTextures(event); | |
− | |||
} | } | ||
@SubscribeEvent | @SubscribeEvent | ||
public void onModelBakeEvent(ModelBakeEvent event) { | public void onModelBakeEvent(ModelBakeEvent event) { | ||
− | + | bakeModels(event); | |
− | ResourceLocation | + | } |
− | + | ||
+ | private void registerTextures(TextureStitchEvent.Pre event) { | ||
+ | Set<ResourceLocation> textureLocations = SampleUpgradeCore.proxy.getTextureLocations(); | ||
+ | |||
+ | if (textureLocations == null) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | for (ResourceLocation location : textureLocations) { | ||
+ | event.map.registerSprite(location); | ||
+ | } | ||
− | |||
− | |||
− | |||
} | } | ||
− | + | private void bakeModels(ModelBakeEvent event) { | |
− | private void | + | Set<ResourceLocation> modelLocations = SampleUpgradeCore.proxy.getModelLocations(); |
− | + | ||
− | + | if (modelLocations == null) { | |
− | + | return; | |
− | + | } | |
− | + | ||
+ | for (ResourceLocation location : modelLocations) { | ||
+ | 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 (Exception e) { | |
− | + | e.printStackTrace(); | |
+ | } | ||
} | } | ||
} | } | ||
127行目: | 210行目: | ||
==== TurtleSample.java ==== | ==== TurtleSample.java ==== | ||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
package mods.sample.upgrade; | package mods.sample.upgrade; | ||
141行目: | 223行目: | ||
import net.minecraft.util.EnumFacing; | import net.minecraft.util.EnumFacing; | ||
import net.minecraft.util.ResourceLocation; | import net.minecraft.util.ResourceLocation; | ||
− | |||
import net.minecraftforge.fml.relauncher.Side; | import net.minecraftforge.fml.relauncher.Side; | ||
import net.minecraftforge.fml.relauncher.SideOnly; | import net.minecraftforge.fml.relauncher.SideOnly; | ||
157行目: | 238行目: | ||
public class TurtleSample implements ITurtleUpgrade { | public class TurtleSample implements ITurtleUpgrade { | ||
− | + | private ResourceLocation upgradeID = new ResourceLocation(SampleUpgradeCore.MOD_ID, "sample"); | |
− | private | + | private ItemStack upgradeItem = new ItemStack(Blocks.stone); |
− | |||
− | private | ||
− | |||
− | |||
private ModelResourceLocation modelLeft; | private ModelResourceLocation modelLeft; | ||
− | |||
private ModelResourceLocation modelRight; | private ModelResourceLocation modelRight; | ||
public TurtleSample() { | public TurtleSample() { | ||
− | + | String modid = SampleUpgradeCore.MOD_ID; | |
− | + | SampleUpgradeCore.proxy.setTextureLocation(modid, "blocks/sample_upgrade"); | |
− | + | modelLeft = SampleUpgradeCore.proxy.loadModelLocation(modid, "block/turtle_sample_left"); | |
− | + | modelRight = SampleUpgradeCore.proxy.loadModelLocation(modid, "block/turtle_sample_right"); | |
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
@Override | @Override | ||
public ResourceLocation getUpgradeID() { | public ResourceLocation getUpgradeID() { | ||
185行目: | 256行目: | ||
} | } | ||
− | |||
− | |||
@Override | @Override | ||
public int getLegacyUpgradeID() { | public int getLegacyUpgradeID() { | ||
192行目: | 261行目: | ||
} | } | ||
− | |||
− | |||
@Override | @Override | ||
public String getUnlocalisedAdjective() { | public String getUnlocalisedAdjective() { | ||
− | return " | + | return "Sample"; |
} | } | ||
− | |||
@Override | @Override | ||
public TurtleUpgradeType getType() { | public TurtleUpgradeType getType() { | ||
− | |||
return TurtleUpgradeType.Peripheral; | return TurtleUpgradeType.Peripheral; | ||
} | } | ||
− | |||
@Override | @Override | ||
public ItemStack getCraftingItem() { | public ItemStack getCraftingItem() { | ||
212行目: | 276行目: | ||
} | } | ||
− | |||
@Override | @Override | ||
public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
218行目: | 281行目: | ||
} | } | ||
− | |||
@Override | @Override | ||
public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, | public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, | ||
TurtleVerb verb, EnumFacing direction) { | TurtleVerb verb, EnumFacing direction) { | ||
− | |||
return null; | return null; | ||
} | } | ||
− | |||
− | |||
− | |||
@Override | @Override | ||
@SideOnly(Side.CLIENT) | @SideOnly(Side.CLIENT) | ||
235行目: | 293行目: | ||
ModelManager modelManager = mc.getRenderItem().getItemModelMesher().getModelManager(); | ModelManager modelManager = mc.getRenderItem().getItemModelMesher().getModelManager(); | ||
− | |||
− | |||
if (side == TurtleSide.Left) { | if (side == TurtleSide.Left) { | ||
return Pair.of(modelManager.getModel(modelLeft), null); | return Pair.of(modelManager.getModel(modelLeft), null); | ||
244行目: | 300行目: | ||
} | } | ||
− | |||
@Override | @Override | ||
public void update(ITurtleAccess turtle, TurtleSide side) { | public void update(ITurtleAccess turtle, TurtleSide side) { | ||
− | + | ||
− | |||
− | |||
} | } | ||
} | } | ||
+ | |||
</source> | </source> | ||
==== SamplePeripheral.java ==== | ==== SamplePeripheral.java ==== | ||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
package mods.sample.upgrade; | package mods.sample.upgrade; | ||
− | |||
import dan200.computercraft.api.lua.ILuaContext; | import dan200.computercraft.api.lua.ILuaContext; | ||
import dan200.computercraft.api.lua.LuaException; | import dan200.computercraft.api.lua.LuaException; | ||
274行目: | 326行目: | ||
public SamplePeripheral(ITurtleAccess turtle, TurtleSide side) { | public SamplePeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
− | |||
turtleAccess = turtle; | turtleAccess = turtle; | ||
turtleSide = side; | turtleSide = side; | ||
} | } | ||
− | |||
− | |||
@Override | @Override | ||
302行目: | 351行目: | ||
} | } | ||
− | |||
@Override | @Override | ||
public void attach(IComputerAccess computer) { | public void attach(IComputerAccess computer) { | ||
308行目: | 356行目: | ||
} | } | ||
− | |||
@Override | @Override | ||
public void detach(IComputerAccess computer) { | public void detach(IComputerAccess computer) { | ||
314行目: | 361行目: | ||
} | } | ||
− | |||
@Override | @Override | ||
public boolean equals(IPeripheral other) { | public boolean equals(IPeripheral other) { | ||
− | |||
if ((other != null) && (other instanceof SamplePeripheral)) { | if ((other != null) && (other instanceof SamplePeripheral)) { | ||
− | + | return other == this; | |
− | |||
− | |||
} | } | ||
329行目: | 372行目: | ||
} | } | ||
</source> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==== turtle_sample_left.json ==== | ==== turtle_sample_left.json ==== | ||
− | |||
assets\sampleupgrademod\models\block ディレクトリに設置します。 | assets\sampleupgrademod\models\block ディレクトリに設置します。 | ||
<source lang = "javascript"> | <source lang = "javascript"> | ||
356行目: | 385行目: | ||
==== turtle_sample_right.json ==== | ==== turtle_sample_right.json ==== | ||
− | |||
assets\sampleupgrademod\models\block ディレクトリに設置します。 | assets\sampleupgrademod\models\block ディレクトリに設置します。 | ||
<source lang = "javascript"> | <source lang = "javascript"> | ||
368行目: | 396行目: | ||
==== sample_upgrade.png ==== | ==== sample_upgrade.png ==== | ||
− | |||
assets\sampleupgrademod\textures\blocks ディレクトリに設置します。 | assets\sampleupgrademod\textures\blocks ディレクトリに設置します。 | ||
− | + | 適当なテクスチャファイル(16x16の画像など)を各自で用意してください。 | |
+ | |||
+ | |||
+ | === 解説 === | ||
+ | ==== SampleUpgradeCore.java ==== | ||
+ | Modのコアとなるクラス | ||
+ | |||
+ | *プロキシクラスの指定 | ||
+ | <source lang = "java"> | ||
+ | @SidedProxy(clientSide = "mods.sample.upgrade.client.ClientProxy", serverSide = "mods.sample.upgrade.CommonProxy") | ||
+ | public static CommonProxy proxy; | ||
+ | </source> | ||
+ | Turtle Upgradeのモデルに関する処理はクライアント側でのみ行うため、今回の例では[[プロキシシステムについて|プロキシシステム]]を利用しています。 | ||
+ | |||
+ | *Event受信クラスの登録 | ||
+ | <source lang = "java"> | ||
+ | proxy.registerEventHandlers(); | ||
+ | </source> | ||
+ | プロキシを介して登録用メソッドを呼び出し、クライアント側でのみ登録されるようにしています。 | ||
+ | |||
+ | ==== CommonProxy.java ==== | ||
+ | サーバー側でのみ呼び出されるプロキシクラス | ||
+ | |||
+ | クライアント側のプロキシクラスでオーバーライドするためのメソッドを実装します。<br> | ||
+ | クライアント側での処理がメインとなるため、こちらでは何もしません。 | ||
+ | |||
+ | ==== ClientProxy.java ==== | ||
+ | クライアント側でのみ呼び出されるプロキシクラス | ||
+ | |||
+ | *クライアントevent受信クラスの登録 | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public void registerEventHandlers() { | ||
+ | MinecraftForge.EVENT_BUS.register(new ModelBakeEventHandler()); | ||
+ | } | ||
+ | </source> | ||
+ | クライアントevent受信クラス(ClientEventHandler)のインスタンスをForgeに登録します。 | ||
+ | |||
+ | *テクスチャ関連のフィールドやメソッド | ||
+ | <source lang = "java"> | ||
+ | private Set<ResourceLocation> textureLocations = new HashSet<ResourceLocation>(); | ||
+ | |||
+ | @Override | ||
+ | public void setTextureLocation(String domain, String path) { | ||
+ | ResourceLocation location = new ResourceLocation(domain, path); | ||
+ | textureLocations.add(location); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Set<ResourceLocation> getTextureLocations() { | ||
+ | return textureLocations; | ||
+ | } | ||
+ | </source> | ||
+ | 今回の例ではTurtle Upgradeの独自テクスチャをTextureStitchEvent.Preイベントでまとめて登録するために画像ファイルの位置を前もって登録するためのリストとメソッドを用意しています。<br> | ||
+ | 画像ファイルの位置は各ITurtleUpgrade実装クラスのコンストラクタでsetTextureLocationメソッドを呼び出して登録します。 | ||
+ | |||
+ | *モデル関連のフィールドやメソッド | ||
+ | <source lang = "java"> | ||
+ | private Set<ResourceLocation> modelLocations = new HashSet<ResourceLocation>(); | ||
+ | |||
+ | @Override | ||
+ | public Set<ResourceLocation> getModelLocations() { | ||
+ | return modelLocations; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public ModelResourceLocation loadModelLocation(String domain, String path) { | ||
+ | ResourceLocation location = new ResourceLocation(domain, path); | ||
+ | modelLocations.add(location); | ||
+ | return new ModelResourceLocation(location, "inventory"); | ||
+ | } | ||
+ | </source> | ||
+ | 今回の例ではTurtle Upgradeの各モデルをModelBakeEventでまとめてbakeするためにモデルのJSONファイルの位置を前もって登録するためのリストとメソッドを用意しています。<br> | ||
+ | モデルの位置は各ITurtleUpgrade実装クラスのコンストラクタでloadModelLocationメソッドを呼び出して登録します。 | ||
+ | |||
+ | ==== ClientEventHandler.java ==== | ||
+ | 各種クライアントeventを受信するためのクラス | ||
+ | |||
+ | *TextureStitchEvent.Preイベント | ||
+ | <source lang = "java"> | ||
+ | @SubscribeEvent | ||
+ | public void onTextureStitchEvent(TextureStitchEvent.Pre event) { | ||
+ | registerTextures(event); | ||
+ | } | ||
+ | </source> | ||
+ | このメソッドはTextureStitchEvent.Preイベント発生時に呼び出されます。<br> | ||
+ | ここでは自前のテクスチャ画像をテクスチャマップに登録するために、registerTextures()を呼び出しています。 | ||
+ | |||
+ | *独自テクスチャの登録 | ||
+ | <source lang = "java"> | ||
+ | private void registerTextures(TextureStitchEvent.Pre event) { | ||
+ | Set<ResourceLocation> textureLocations = SampleUpgradeCore.proxy.getTextureLocations(); | ||
+ | |||
+ | if (textureLocations == null) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | for (ResourceLocation location : textureLocations) { | ||
+ | event.map.registerSprite(location); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | ClientProxy.textureLocationsに登録されたテクスチャファイルをすべてテクスチャマップに登録します。<br> | ||
+ | これにより、自前の画像ファイルがテクスチャとして使用できるようになります。 | ||
+ | |||
+ | *ModelBakeEvent | ||
+ | <source lang = "java"> | ||
+ | @SubscribeEvent | ||
+ | public void onModelBakeEvent(ModelBakeEvent event) { | ||
+ | bakeModels(event); | ||
+ | } | ||
+ | </source> | ||
+ | このメソッドはModelBakeEvent発生時に呼び出されます。<br> | ||
+ | ここではモデルをbakeしてmodelRegistryへ登録するため、bakeModels()を呼び出しています。 | ||
+ | |||
+ | *モデルのbakeと登録 | ||
+ | <source lang = "java"> | ||
+ | private void bakeModels(ModelBakeEvent event) { | ||
+ | Set<ResourceLocation> modelLocations = SampleUpgradeCore.proxy.getModelLocations(); | ||
+ | |||
+ | if (modelLocations == null) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | for (ResourceLocation location : modelLocations) { | ||
+ | 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 (Exception e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | ClientProxy.modelLocationsに登録されたモデルをすべてbakeし、modelRegistryに登録します。<br> | ||
+ | これにより、ITurtleUpgrade実装クラスのgetModel()で指定したモデルが描画されるようになります。 | ||
+ | |||
+ | ==== TurtleSample.java ==== | ||
+ | Turtle Upgradeの機能を定義するクラス | ||
+ | |||
+ | *コンストラクタ | ||
+ | <source lang = "java"> | ||
+ | public TurtleSample() { | ||
+ | String modid = SampleUpgradeCore.MOD_ID; | ||
+ | SampleUpgradeCore.proxy.setTextureLocation(modid, "blocks/sample_upgrade"); | ||
+ | modelLeft = SampleUpgradeCore.proxy.loadModelLocation(modid, "block/turtle_sample_left"); | ||
+ | modelRight = SampleUpgradeCore.proxy.loadModelLocation(modid, "block/turtle_sample_right"); | ||
+ | } | ||
+ | </source> | ||
+ | *TurtleUpgradeで使用するテクスチャファイル位置の登録 | ||
+ | <source lang = "java"> | ||
+ | String modid = SampleUpgradeCore.MOD_ID; | ||
+ | SampleUpgradeCore.proxy.setTextureLocation(modid, "blocks/sample_upgrade"); | ||
+ | </source> | ||
+ | 今回は自前の画像ファイルをテクスチャとして使用するので、プロキシクラスで用意したsetTextureLocationメソッドをコンストラクタで呼び出して(クライアント側でのみ)Turtle Upgradeのテクスチャファイルの位置を登録します。<br> | ||
+ | ちなみにこの工程は、バニラなどで使われている(つまり他所でテクスチャマップに登録済みの)テクスチャを流用するときには必要ありません。 | ||
+ | *TurtleUpgradeで使用するモデルャファイル位置の登録 | ||
+ | <source lang = "java"> | ||
+ | String modid = SampleUpgradeCore.MOD_ID; | ||
+ | |||
+ | modelLeft = SampleUpgradeCore.proxy.loadModelLocation(modid, "block/turtle_sample_left"); | ||
+ | modelRight = SampleUpgradeCore.proxy.loadModelLocation(modid, "block/turtle_sample_right"); | ||
+ | </source> | ||
+ | プロキシクラスで用意したloadModelLocationメソッドをコンストラクタで呼び出して(クライアント側でのみ)Turtle UpgradeのモデルのJSONファイルの位置を登録します。<br> | ||
+ | 戻り値はgetModel()で使うためメンバフィールドに保存します。 | ||
+ | |||
+ | *getType() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public TurtleUpgradeType getType() { | ||
+ | return TurtleUpgradeType.Peripheral; | ||
+ | } | ||
+ | </source> | ||
+ | Turtle Upgradeの種類をTurtleUpgradeTypeの値で指定します。 | ||
+ | |||
+ | 今回は周辺機器タイプなので TurtleUpgradeType.Peripheral を返しています。 | ||
+ | |||
+ | *getCraftingItem() | ||
+ | <source lang = "java"> | ||
+ | private ItemStack upgradeItem = new ItemStack(Blocks.stone); | ||
+ | |||
+ | @Override | ||
+ | public ItemStack getCraftingItem() { | ||
+ | return upgradeItem; | ||
+ | } | ||
+ | </source> | ||
+ | Turtle Upgradeを装着するためのアイテムをItemStackで指定します。 | ||
+ | |||
+ | 今回はバニラブロックの石(焼石)を指定していますが、modで追加した独自のブロックやアイテムも同様に指定できます。 | ||
+ | |||
+ | *createPeripheral() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public IPeripheral createPeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
+ | return new SamplePeripheral(turtle, side); | ||
+ | } | ||
+ | </source> | ||
+ | 周辺機器タイプのTurtle Upgradeの場合、周辺機器の動作を定義したIPeripheral実装クラスのインスタンスを返します。 | ||
+ | |||
+ | IPeripheral実装クラスにはコンストラクタの引数でTurtle Upgradeの情報を渡しています。 | ||
+ | |||
+ | *useTool() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public TurtleCommandResult useTool(ITurtleAccess turtle, TurtleSide side, | ||
+ | TurtleVerb verb, EnumFacing direction) { | ||
+ | return null; | ||
+ | } | ||
+ | </source> | ||
+ | 周辺機器タイプのTurtle Upgradeでは呼び出されることは無いため、単にnullを返しています。 | ||
+ | |||
+ | *getModel() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | @SideOnly(Side.CLIENT) | ||
+ | public Pair<IBakedModel, Matrix4f> getModel(ITurtleAccess turtle, TurtleSide side) { | ||
+ | Minecraft mc = Minecraft.getMinecraft(); | ||
+ | ModelManager modelManager = mc.getRenderItem().getItemModelMesher().getModelManager(); | ||
+ | |||
+ | if (side == TurtleSide.Left) { | ||
+ | return Pair.of(modelManager.getModel(modelLeft), null); | ||
+ | } else { | ||
+ | return Pair.of(modelManager.getModel(modelRight), null); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | Turtleに装着されたTurtle Upgradeの外観を指定します。<br> | ||
+ | 戻り値はPair<IBakedModel, Matrix4f>で、IBakedModelがモデル、Matrix4fがモデルを変形する座標変換行列です。 | ||
+ | |||
+ | 今回はCC1.76の実装を参考にしています。<br> | ||
+ | コンストラクタで登録してModelBakeEventでbakeされたモデルをModelManager.getModel()で取得して返しています。<br> | ||
+ | Turtle Upgradeを装着した位置がTurtleの左側ならば左用のモデルを、右側ならば右用のモデルを描画するようにしています。 | ||
+ | |||
+ | *update() | ||
+ | <source lang = "java"> | ||
+ | @Override | ||
+ | public void update(ITurtleAccess turtle, TurtleSide side) { | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | Turtle UpgradeがTurtleに装着されている間、毎tick呼び出されます。<br> | ||
+ | ロードされているワールド上で装着されている数だけ呼び出されますが、各パラメータでどれに対する呼び出しなのかが判別が可能です。<br> | ||
+ | また、サーバ側とクライアント側でそれぞれ別に呼び出されますが、どちら側の呼び出しなのかはturtle.getWorld().isRemoteの値で判別可能です。<br> | ||
+ | ITurtleAccess.getPeripheral()で装着されている周辺機器Upgradeの周辺機器クラスのインスタンスを取得できます。<br> | ||
+ | turtle.getUpgradeNBTData()で読み書き可能なNBTTagCompoundを取得できます。このNBTTagCompoundはTurtleに記録され、ゲームを終了しても消去されません(Turtle Upgradeを取り外したりTurtleが破壊されると消えます)。 | ||
+ | |||
+ | 今回は何もしていません。 | ||
+ | |||
+ | ==== SamplePeripheral.java ==== | ||
+ | 周辺機器を定義するクラス | ||
+ | |||
+ | *装着されたTurtleの情報取得・保存 | ||
+ | <source lang = "java"> | ||
+ | private final ITurtleAccess turtleAccess; | ||
+ | private final TurtleSide turtleSide; | ||
+ | |||
+ | public SamplePeripheral(ITurtleAccess turtle, TurtleSide side) { | ||
+ | turtleAccess = turtle; | ||
+ | turtleSide = side; | ||
+ | } | ||
+ | </source> | ||
+ | 周辺機器でTurtle Upgradeの情報を利用したい場合、コンストラクタで受け取って周辺機器側で保存しておきます。<br> | ||
+ | |||
+ | ==== turtle_sample_left.json ==== | ||
+ | Turtleの左側に装着された時のTurtle Upgradeのモデルを指定するJSONファイルです。<br> | ||
+ | |||
+ | 今回の例では、TurtleSampleのコンストラクタでファイル位置を "block/turtle_sample_left" と指定したため、assets\<MOD_ID>\models\block ディレクトリに設置します。 | ||
+ | |||
+ | <source lang = "javascript"> | ||
+ | "parent": "computercraft:block/turtle_upgrade_base_left", | ||
+ | "textures": { | ||
+ | "texture": "sampleupgrademod:blocks/sample_upgrade" | ||
+ | } | ||
+ | </source> | ||
+ | モデル自体はComputerCraft本体で定義されている物を流用しており、テクスチャのみ独自に設定しています。 | ||
+ | |||
+ | ==== turtle_sample_right.json ==== | ||
+ | Turtleの右側に装着された時のTurtle Upgradeのモデルを指定するJSONファイルです。<br> | ||
+ | 解説はturtle_sample_left.jsonの項目を参照してください。 | ||
+ | |||
+ | ==== sample_upgrade.png ==== | ||
+ | Turtle Upgradeのテクスチャ画像ファイルです。 | ||
+ | |||
+ | 今回の例では、TurtleSampleのコンストラクタとモデルのJSONファイルでファイル位置を "sampleupgrademod:blocks/sample_upgrade" と指定したため、assets\sampleupgrademod\textures\blocks ディレクトリに設置します。 |