(ページの作成:「{{前提MOD|reqmod="Minecraft Forge Universal 9.10.0.xxx~"}} ==流体の追加== <p>流体追加のチュートリアルです。<br /> このチュートリアル...」) |
|||
1行目: | 1行目: | ||
{{前提MOD|reqmod="Minecraft Forge Universal 9.10.0.xxx~"}} | {{前提MOD|reqmod="Minecraft Forge Universal 9.10.0.xxx~"}} | ||
− | == | + | ==概要== |
<p>流体追加のチュートリアルです。<br /> | <p>流体追加のチュートリアルです。<br /> | ||
− | + | 1.6.x用Forgeから、アイテム・ブロックなどの実体を持たない流体情報のみを追加することができるようになりました。<br /> | |
+ | 合わせて容器入り流体の簡易チュートリアルも併記しています。<br /> | ||
+ | このチュートリアルで追加した流体は流体APIをサポートする他のMODで扱うことが出来る可能性があります。</p> | ||
− | + | ==ソースコード== | |
*SampleFluid.java | *SampleFluid.java | ||
<source lang = "java"> | <source lang = "java"> | ||
− | package | + | package mods.samplefluid; |
import net.minecraft.item.Item; | import net.minecraft.item.Item; | ||
19行目: | 21行目: | ||
import cpw.mods.fml.common.registry.LanguageRegistry; | import cpw.mods.fml.common.registry.LanguageRegistry; | ||
− | @Mod(modid="SampleFluid", name="SampleFluid", version="1.0") | + | @Mod(modid="samplefluid.SampleFluid", name="SampleFluid", version="1.0") |
public class SampleFluid { | public class SampleFluid { | ||
− | + | //容器入り流体のアイテムID | |
− | public static int sampleFluidID = 28000;// | + | public static int sampleFluidID = 28000; |
+ | //容器入り流体アイテム | ||
+ | public static Item itemSampleFluid; | ||
− | public static Fluid sampleFluid ; | + | //流体クラス |
+ | public static Fluid sampleFluid ; | ||
− | public static final String DOMAIN_NAME = "samplefluid"; | + | //ドメイン名 |
− | + | //他mod等との競合を避けるための識別用の名前です。 ※英数字小文字 及び "." 等が使えます。大文字や"/"は使えません。 | |
− | @ | + | public static final String DOMAIN_NAME = "samplefluid"; |
− | + | ||
− | + | @EventHandler | |
− | @ | + | public void preInit(FMLPreInitializationEvent evt) { |
+ | //TextureStitchEvent.Preイベントのためにイベントバスに登録します。 | ||
+ | MinecraftForge.EVENT_BUS.register(this); | ||
+ | } | ||
+ | |||
+ | @EventHandler | ||
public void load(FMLInitializationEvent event) { | public void load(FMLInitializationEvent event) { | ||
− | + | //Fluidクラスのインスタンスを生成 | |
− | + | sampleFluid = new Fluid("LiquidSample"); | |
− | |||
− | sampleFluid = new Fluid(" | ||
− | |||
FluidRegistry.registerFluid(sampleFluid); | FluidRegistry.registerFluid(sampleFluid); | ||
+ | |||
+ | //容器入り流体の登録です。 | ||
+ | //通常のアイテム作成と同様なので省略します。 | ||
+ | //バケツのような動作には別途実装が必要です。 | ||
+ | itemSampleFluid = new Item(sampleFluidID) | ||
+ | .setUnlocalizedName(DOMAIN_NAME + ".liquidSample") //内部アイテム名の登録 | ||
+ | //テクスチャ名の登録 func_111206_dはForgeバージョンによって名称が変わることがあります。 | ||
+ | //assets/samplefluid/textures/item/bottoledLiquidSample.png が必要です。 | ||
+ | .func_111206_d(DOMAIN_NAME + ":bottled" + sampleFluid.getName()); | ||
+ | |||
+ | ItemStack filledContainer = new ItemStack(itemSampleFluid); | ||
+ | FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer); | ||
− | LanguageRegistry.addName(itemSampleFluid, " | + | //ローカライズ表示名の登録 |
− | + | LanguageRegistry.addName(itemSampleFluid, "bottledSampleLiquid"); | |
+ | LanguageRegistry.addName(itemSampleFluid, "ja-JP", "ボトル要りサンプル流体"); | ||
} | } | ||
+ | |||
+ | |||
+ | /** | ||
+ | * IconはResourceパックを変更する際、新しいインスタンスが生成されるため | ||
+ | * TextureMapの生成タイミングをフックして登録し直す必要があります。 | ||
+ | * | ||
+ | * また、ブロック無し流体の場合ここでRegisterIconを呼ぶ必要があるため | ||
+ | * TextureStitchEvent.Pre で処理します。 | ||
+ | */ | ||
+ | @ForgeSubscribe | ||
+ | public void PreTextureStitchEvent(TextureStitchEvent.Pre event){ | ||
+ | //必ず 0:"/terain.png"(※ブロックと共有) のTextureMapに画像を登録する必要があります。 | ||
+ | if(event.map.textureType == 0){ | ||
+ | |||
+ | //初期化時に保存しておいた流体クラスを利用する | ||
+ | //または流体名を指定してFluidRegistoryからFluidインスタンスを取得します。 | ||
− | + | Fluid f = sampleFluid; | |
− | + | //Fluid f = FluidRegistry.getFluid("LiquidSample"); | |
+ | |||
+ | if(f != null){ | ||
+ | if(f.getBlockID() != -1){ | ||
+ | //流体ブロックを実装している場合は、ブロックからの流用が可能です。 | ||
+ | //尚本チュートリアルは流体のみ(ついでに容器)の登録なため使用されません。例として参照ください。 | ||
+ | //getIcon(int side,int meta) getBlockTextureFromSide(int side)等。 | ||
− | + | f.setIcons(Block.blocksList[f.getBlockID()].getBlockTextureFromSide(1)); | |
− | + | }else{ | |
− | + | //ブロックのIcon登録と同様です。 | |
− | + | //この例の場合 assets/samplefluid/textures/blocks/LiquidSample.png が必要です。 | |
− | + | //※本チュートリアルでは DOMAIN_NAME = samplefluid , f.getName() == "LiquidSample" となっています。 | |
− | + | Icon commonIcon = event.map.registerIcon(DOMAIN_NAME + ":" + f.getName()); | |
− | |||
− | |||
− | + | //下記のように、ドメインを省略した場合はデフォルトでminecraftドメインとなり | |
+ | //event.map.registerIcon("name"); | ||
+ | //必要な画像は assets/minecraft/textures/blocks/name.png となります。 | ||
+ | //できるだけ重複を避けるために、独自ドメインを指定しましょう。 | ||
− | + | f.setIcons(commonIcon); | |
− | |||
− | |||
− | |||
− | |||
− | + | //また、静止状態 still / 流動状態 flowingを別々に指定できます。 | |
− | + | //f.setIcons(stillIcon, flowingIcon); | |
− | + | //f.setStillIcon(stillIcon); | |
− | + | //f.setFlowingIcon(flowingIcon); | |
− | + | } | |
− | + | } | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
85行目: | 118行目: | ||
</source> | </source> | ||
− | ==解説 | + | ===解説=== |
− | |||
<source lang = "java"> | <source lang = "java"> | ||
− | + | sampleFluid = new Fluid("LiquidSample"); | |
− | |||
− | |||
− | |||
</source> | </source> | ||
− | + | Fluidインスタンスを作成する際に指定する名前が、辞書登録される名称となります。 | |
− | + | この段階ではまだ辞書登録されません。 | |
− | |||
− | |||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
− | + | FluidRegistry.registerFluid(sampleFluid); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | FluidRegistry.registerFluid(sampleFluid | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | + | 流体を辞書へ登録します。</br> | |
− | + | 登録に成功すれば:True</br> | |
− | + | 既に登録済みの流体名であれば:Falseが戻り値となります。 | |
− | |||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
− | + | FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | + | 容器入り流体の登録です。例の場合バケツ1杯分(内部数値1000)で登録されます。</br> | |
− | + | </br> | |
− | + | Fluidには、アイテムやブロックを関連付ける必要性は必ずしも無いため</br> | |
+ | 別途Icon登録処理が必要になります。(ブロックがある場合流用はできます。 | ||
<source lang = "java"> | <source lang = "java"> | ||
− | @ | + | @EventHandler |
− | + | public void preInit(FMLPreInitializationEvent evt) { | |
− | public void | + | //TextureStitchEvent.Preイベントのためにイベントバスに登録します。 |
− | + | MinecraftForge.EVENT_BUS.register(this); | |
− | |||
} | } | ||
</source> | </source> | ||
− | + | TextureStitchEvent.Preイベントのためにイベントバスに登録します。</br> | |
+ | ブロック無し流体の場合RegisterIconを呼ぶために TextureStitchEvent.Pre である必要があります。</br> | ||
+ | </br> | ||
+ | PreTextureStitchEventに関しては、複数登録する場合は、流体の取得方法の工夫とループを組むなどの改変が必要となります。、 | ||
− | |||
===テクスチャ=== | ===テクスチャ=== | ||
− | + | 今回の場合は、容器テクスチャに<br /> | |
− | + | "assets/samplefluid/textures/items/LiquidSample.png"<br /> | |
+ | 流体用テクスチャに<br /> | ||
+ | "assets/samplefluid/textures/blocks/LiquidSample.png"<br /> | ||
+ | が使用されます。<br> | ||
− | == | + | ==その他== |
− | 1.5.2までのMinecraft | + | 1.5.2までのMinecraft ForgeではBCで使われていた液体APIを改修したものが実装されていました。<br /> |
− | + | 1.6.xからはLiquidDictionary→FluidDictionaryに刷新され多くの機能が増えました。<br /> | |
+ | これにより、アイテムやブロックの実体を持たずに流体のみが存在する物を追加できるようになりました。<br /> | ||
詳しくは、Fluidクラスを見てください。(液体の明るさや、密度などが設定できるようです) | 詳しくは、Fluidクラスを見てください。(液体の明るさや、密度などが設定できるようです) | ||
+ | |||
+ | <comments /> |
2013年7月31日 (水) 17:38時点における版
この記事は"Minecraft Forge Universal 9.10.0.xxx~"を前提MODとしています。 |
概要
流体追加のチュートリアルです。
1.6.x用Forgeから、アイテム・ブロックなどの実体を持たない流体情報のみを追加することができるようになりました。
合わせて容器入り流体の簡易チュートリアルも併記しています。
このチュートリアルで追加した流体は流体APIをサポートする他のMODで扱うことが出来る可能性があります。
ソースコード
- SampleFluid.java
package mods.samplefluid; import net.minecraft.item.Item; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; @Mod(modid="samplefluid.SampleFluid", name="SampleFluid", version="1.0") public class SampleFluid { //容器入り流体のアイテムID public static int sampleFluidID = 28000; //容器入り流体アイテム public static Item itemSampleFluid; //流体クラス public static Fluid sampleFluid ; //ドメイン名 //他mod等との競合を避けるための識別用の名前です。 ※英数字小文字 及び "." 等が使えます。大文字や"/"は使えません。 public static final String DOMAIN_NAME = "samplefluid"; @EventHandler public void preInit(FMLPreInitializationEvent evt) { //TextureStitchEvent.Preイベントのためにイベントバスに登録します。 MinecraftForge.EVENT_BUS.register(this); } @EventHandler public void load(FMLInitializationEvent event) { //Fluidクラスのインスタンスを生成 sampleFluid = new Fluid("LiquidSample"); FluidRegistry.registerFluid(sampleFluid); //容器入り流体の登録です。 //通常のアイテム作成と同様なので省略します。 //バケツのような動作には別途実装が必要です。 itemSampleFluid = new Item(sampleFluidID) .setUnlocalizedName(DOMAIN_NAME + ".liquidSample") //内部アイテム名の登録 //テクスチャ名の登録 func_111206_dはForgeバージョンによって名称が変わることがあります。 //assets/samplefluid/textures/item/bottoledLiquidSample.png が必要です。 .func_111206_d(DOMAIN_NAME + ":bottled" + sampleFluid.getName()); ItemStack filledContainer = new ItemStack(itemSampleFluid); FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer); //ローカライズ表示名の登録 LanguageRegistry.addName(itemSampleFluid, "bottledSampleLiquid"); LanguageRegistry.addName(itemSampleFluid, "ja-JP", "ボトル要りサンプル流体"); } /** * IconはResourceパックを変更する際、新しいインスタンスが生成されるため * TextureMapの生成タイミングをフックして登録し直す必要があります。 * * また、ブロック無し流体の場合ここでRegisterIconを呼ぶ必要があるため * TextureStitchEvent.Pre で処理します。 */ @ForgeSubscribe public void PreTextureStitchEvent(TextureStitchEvent.Pre event){ //必ず 0:"/terain.png"(※ブロックと共有) のTextureMapに画像を登録する必要があります。 if(event.map.textureType == 0){ //初期化時に保存しておいた流体クラスを利用する //または流体名を指定してFluidRegistoryからFluidインスタンスを取得します。 Fluid f = sampleFluid; //Fluid f = FluidRegistry.getFluid("LiquidSample"); if(f != null){ if(f.getBlockID() != -1){ //流体ブロックを実装している場合は、ブロックからの流用が可能です。 //尚本チュートリアルは流体のみ(ついでに容器)の登録なため使用されません。例として参照ください。 //getIcon(int side,int meta) getBlockTextureFromSide(int side)等。 f.setIcons(Block.blocksList[f.getBlockID()].getBlockTextureFromSide(1)); }else{ //ブロックのIcon登録と同様です。 //この例の場合 assets/samplefluid/textures/blocks/LiquidSample.png が必要です。 //※本チュートリアルでは DOMAIN_NAME = samplefluid , f.getName() == "LiquidSample" となっています。 Icon commonIcon = event.map.registerIcon(DOMAIN_NAME + ":" + f.getName()); //下記のように、ドメインを省略した場合はデフォルトでminecraftドメインとなり //event.map.registerIcon("name"); //必要な画像は assets/minecraft/textures/blocks/name.png となります。 //できるだけ重複を避けるために、独自ドメインを指定しましょう。 f.setIcons(commonIcon); //また、静止状態 still / 流動状態 flowingを別々に指定できます。 //f.setIcons(stillIcon, flowingIcon); //f.setStillIcon(stillIcon); //f.setFlowingIcon(flowingIcon); } } } } }
解説
sampleFluid = new Fluid("LiquidSample");
Fluidインスタンスを作成する際に指定する名前が、辞書登録される名称となります。 この段階ではまだ辞書登録されません。
FluidRegistry.registerFluid(sampleFluid);
流体を辞書へ登録します。
登録に成功すれば:True
既に登録済みの流体名であれば:Falseが戻り値となります。
FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer);
容器入り流体の登録です。例の場合バケツ1杯分(内部数値1000)で登録されます。
Fluidには、アイテムやブロックを関連付ける必要性は必ずしも無いため
別途Icon登録処理が必要になります。(ブロックがある場合流用はできます。
@EventHandler public void preInit(FMLPreInitializationEvent evt) { //TextureStitchEvent.Preイベントのためにイベントバスに登録します。 MinecraftForge.EVENT_BUS.register(this); }
TextureStitchEvent.Preイベントのためにイベントバスに登録します。
ブロック無し流体の場合RegisterIconを呼ぶために TextureStitchEvent.Pre である必要があります。
PreTextureStitchEventに関しては、複数登録する場合は、流体の取得方法の工夫とループを組むなどの改変が必要となります。、
テクスチャ
今回の場合は、容器テクスチャに
"assets/samplefluid/textures/items/LiquidSample.png"
流体用テクスチャに
"assets/samplefluid/textures/blocks/LiquidSample.png"
が使用されます。
その他
1.5.2までのMinecraft ForgeではBCで使われていた液体APIを改修したものが実装されていました。
1.6.xからはLiquidDictionary→FluidDictionaryに刷新され多くの機能が増えました。
これにより、アイテムやブロックの実体を持たずに流体のみが存在する物を追加できるようになりました。
詳しくは、Fluidクラスを見てください。(液体の明るさや、密度などが設定できるようです)
コメントの自動更新を有効化