提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「{{前提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 />
このチュートリアルで追加した流体は他のMODで扱うことができます。</p>
+
1.6.x用Forgeから、アイテム・ブロックなどの実体を持たない流体情報のみを追加することができるようになりました。<br />
 +
合わせて容器入り流体の簡易チュートリアルも併記しています。<br />
 +
このチュートリアルで追加した流体は流体APIをサポートする他のMODで扱うことが出来る可能性があります。</p>
  
===ソースコード===
+
==ソースコード==
 
*SampleFluid.java
 
*SampleFluid.java
 
<source lang = "java">
 
<source lang = "java">
package sample;
+
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 {
  
public static Item itemSampleFluid;//アイテム
+
//容器入り流体のアイテムID
public static int sampleFluidID = 28000;//流体のアイテムID
+
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等との競合を避けるための識別用の名前です。 ※英数字小文字 及び "." 等が使えます。大文字や"/"は使えません。
@Instance("SampleFluid")
+
public static final String DOMAIN_NAME = "samplefluid";
         protected static SampleFluid instance;
+
   
 
+
@EventHandler
@Mod.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クラスのインスタンスを生成
itemSampleFluid = new ItemSampleFluid(sampleFluidID).setUnlocalizedName("liquidSample");//ItemSampleFluidクラスのインスタンスを生成
+
sampleFluid = new Fluid("LiquidSample");
 
 
sampleFluid = new Fluid("SampleFluid").setIcons(itemSampleFluid.getIconFromDamage(0));//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, "SampleFluid");
+
//ローカライズ表示名の登録
 
+
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;
</source>
+
//Fluid f = FluidRegistry.getFluid("LiquidSample");
 +
 +
if(f != null){
 +
if(f.getBlockID() != -1){
 +
//流体ブロックを実装している場合は、ブロックからの流用が可能です。
 +
//尚本チュートリアルは流体のみ(ついでに容器)の登録なため使用されません。例として参照ください。
 +
//getIcon(int side,int meta) getBlockTextureFromSide(int side)等。
  
*ItemSampleFluid.java
+
f.setIcons(Block.blocksList[f.getBlockID()].getBlockTextureFromSide(1));
<source lang = "java">
+
}else{
package sample;
+
//ブロックのIcon登録と同様です。
  
import cpw.mods.fml.relauncher.Side;
+
//この例の場合 assets/samplefluid/textures/blocks/LiquidSample.png が必要です。
import cpw.mods.fml.relauncher.SideOnly;
+
//※本チュートリアルでは DOMAIN_NAME = samplefluid , f.getName() == "LiquidSample" となっています。
import net.minecraft.client.renderer.texture.IconRegister;
+
Icon commonIcon = event.map.registerIcon(DOMAIN_NAME + ":" + f.getName());
import net.minecraft.creativetab.CreativeTabs;
 
import net.minecraft.item.Item;
 
  
public class ItemSampleFluid extends Item {
+
//下記のように、ドメインを省略した場合はデフォルトでminecraftドメインとなり
 +
//event.map.registerIcon("name");
 +
//必要な画像は assets/minecraft/textures/blocks/name.png となります。
 +
//できるだけ重複を避けるために、独自ドメインを指定しましょう。
  
private String IconName;
+
f.setIcons(commonIcon);
  
public ItemSampleFluid(int par1) {
 
super(par1);
 
this.setCreativeTab(null);//クリエイティブで出す必要がないのでnull
 
}
 
  
@Override
+
//また、静止状態 still / 流動状態 flowingを別々に指定できます。
public Item setUnlocalizedName(String par1Str)
+
//f.setIcons(stillIcon, flowingIcon);
        {
+
//f.setStillIcon(stillIcon);
super.setUnlocalizedName(par1Str);
+
//f.setFlowingIcon(flowingIcon);
IconName = (SampleFluid.DOMAIN_NAME + ":" + par1Str);
+
}
return this;
+
}
        }
+
}
 
 
@Override
 
@SideOnly(Side.CLIENT)
 
public void registerIcons(IconRegister par1IconRegister)
 
{
 
this.itemIcon = par1IconRegister.registerIcon(IconName);
 
 
}
 
}
  
85行目: 118行目:
 
</source>
 
</source>
  
==解説==
+
===解説===
===SampleFluid.java===
 
 
<source lang = "java">
 
<source lang = "java">
public static Item itemSampleFluid;//アイテム
+
sampleFluid = new Fluid("LiquidSample");
public static int sampleFluidID = 28000;//流体のアイテムID
 
public static Fluid sampleFluid ;//流体
 
public static final String DOMAIN_NAME = "samplefluid";//テクスチャのパス
 
 
</source>
 
</source>
追加する流体(アイテム)を保持しておく変数<br />
+
Fluidインスタンスを作成する際に指定する名前が、辞書登録される名称となります。
流体(アイテム)のIDを保持しておく変数<br />
+
この段階ではまだ辞書登録されません。
流体を保持しておく変数<br />
 
テクスチャのパスを保持しておく変数<br />
 
を宣言。
 
  
 
<source lang = "java">
 
<source lang = "java">
itemSampleFluid = new ItemSampleFluid(sampleFluidID).setUnlocalizedName("liquidSample");
+
FluidRegistry.registerFluid(sampleFluid);
 
 
sampleFluid = new Fluid("SampleFluid").setIcons(itemSampleFluid.getIconFromDamage(0));
 
 
 
</source>
 
変数に、新しくItemSampleFluidクラス、Fluidクラスのインスタンスを代入。
 
 
 
<source lang = "java">
 
FluidRegistry.registerFluid(sampleFluid);
 
</source>
 
流体を流体辞書に登録。<br>
 
これで、他のMODでも扱うことができるようになります。
 
 
 
<source lang = "java">
 
LanguageRegistry.addName(itemSampleFluid, "SampleFluid");
 
 
</source>
 
</source>
追加するアイテムの表示名を登録。<br>
+
流体を辞書へ登録します。</br>
 
+
登録に成功すれば:True</br>
 
+
既に登録済みの流体名であれば:Falseが戻り値となります。
 
 
===ItemSampleFluid.java===
 
  
 
<source lang = "java">
 
<source lang = "java">
@Override
+
FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer);
public Item setUnlocalizedName(String par1Str)
 
        {
 
super.setUnlocalizedName(par1Str);
 
IconName = (SampleFluid.DOMAIN_NAME + ":" + par1Str);
 
return this;
 
        }
 
 
</source>
 
</source>
違うことが殆ど無いのでシステム名とテクスチャ名を同じにしています。<br>
+
容器入り流体の登録です。例の場合バケツ1杯分(内部数値1000)で登録されます。</br>
ついでにSampleFluid.javaで指定したテクスチャのパスも合わせています。
+
</br>
 
+
Fluidには、アイテムやブロックを関連付ける必要性は必ずしも無いため</br>
 +
別途Icon登録処理が必要になります。(ブロックがある場合流用はできます。
 
<source lang = "java">
 
<source lang = "java">
@Override
+
    @EventHandler
@SideOnly(Side.CLIENT)
+
public void preInit(FMLPreInitializationEvent evt) {
public void registerIcons(IconRegister par1IconRegister)
+
//TextureStitchEvent.Preイベントのためにイベントバスに登録します。
{
+
MinecraftForge.EVENT_BUS.register(this);
this.itemIcon = par1IconRegister.registerIcon(IconName);
 
 
}
 
}
 
</source>
 
</source>
テクスチャの設定。
+
TextureStitchEvent.Preイベントのためにイベントバスに登録します。</br>
 +
ブロック無し流体の場合RegisterIconを呼ぶために TextureStitchEvent.Pre である必要があります。</br>
 +
</br>
 +
PreTextureStitchEventに関しては、複数登録する場合は、流体の取得方法の工夫とループを組むなどの改変が必要となります。、
  
==その他==
 
 
===テクスチャ===
 
===テクスチャ===
テクスチャは、'''"assets/DOMAIN_NAME/textures/items/登録名"'''に置いたのが表示されます。<br>
+
今回の場合は、容器テクスチャに<br />
今回の場合は、"assets/samplefluid/textures/items/liquidSample.png"です。<br>
+
"assets/samplefluid/textures/items/LiquidSample.png"<br />
 +
流体用テクスチャに<br />
 +
"assets/samplefluid/textures/blocks/LiquidSample.png"<br />
 +
が使用されます。<br>
  
===Fluid===
+
==その他==
1.5.2までのMinecraft ForgeではBCで使われていた液体APIをそのまま利用していました。<br />
+
1.5.2までのMinecraft ForgeではBCで使われていた液体APIを改修したものが実装されていました。<br />
しかし、1.6.xからはLiquidDictionary→FluidDictionaryに刷新され多くの機能が増えました。<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クラスを見てください。(液体の明るさや、密度などが設定できるようです)


自分のコメントを追加
Minecraft Modding Wikiはすべてのコメントを歓迎します。匿名で投稿したくない場合は、アカウント作成またはログインしてください。無料です。