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

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

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
1行目: 1行目:
 
{{前提MOD|reqmod="Minecraft Forge Universal 9.10.0.xxx~"}}
 
{{前提MOD|reqmod="Minecraft Forge Universal 9.10.0.xxx~"}}
{{チュートリアル難易度|difficulty=1|clear=none}}
+
 
{{チュートリアルカテゴリー|difficulty=1|type=Fluid}}
 
 
==概要==
 
==概要==
 
<p>流体追加のチュートリアルです。<br />
 
<p>流体追加のチュートリアルです。<br />
 
1.6.x用Forgeから、アイテム・ブロックなどの実体を持たない流体情報のみを追加することができるようになりました。<br />
 
1.6.x用Forgeから、アイテム・ブロックなどの実体を持たない流体情報のみを追加することができるようになりました。<br />
また、Forgeに流体ブロックの実装を簡単にする基礎クラスが用意され、流体ブロックの実装が簡単になりました<br />
+
合わせて容器入り流体の簡易チュートリアルも併記しています。<br />
※ブロックIDが1つで、水源 水流を実装できます。<br />
 
そのため合わせてForgeで用意される基礎クラスを使った流体ブロック、容器入り流体の簡易チュートリアルも併記しています。<br />
 
 
このチュートリアルで追加した流体は流体APIをサポートする他のMODで扱うことが出来る可能性があります。</p>
 
このチュートリアルで追加した流体は流体APIをサポートする他のMODで扱うことが出来る可能性があります。</p>
  
13行目: 10行目:
 
*SampleFluid.java
 
*SampleFluid.java
 
<source lang = "java">
 
<source lang = "java">
package samplefluid;
+
package mods.samplefluid;
  
import net.minecraft.block.Block;
 
import net.minecraft.block.material.Material;
 
import net.minecraft.creativetab.CreativeTabs;
 
 
import net.minecraft.item.Item;
 
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
 
import net.minecraft.util.Icon;
 
import net.minecraft.world.IBlockAccess;
 
import net.minecraft.world.World;
 
import net.minecraftforge.client.event.TextureStitchEvent;
 
import net.minecraftforge.common.MinecraftForge;
 
import net.minecraftforge.event.ForgeSubscribe;
 
import net.minecraftforge.fluids.BlockFluidClassic;
 
 
import net.minecraftforge.fluids.Fluid;
 
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
 
 
import net.minecraftforge.fluids.FluidRegistry;
 
import net.minecraftforge.fluids.FluidRegistry;
 
import cpw.mods.fml.common.Mod;
 
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
 
 
import cpw.mods.fml.common.Mod.Instance;
 
import cpw.mods.fml.common.Mod.Instance;
 
import cpw.mods.fml.common.event.FMLInitializationEvent;
 
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
 
 
import cpw.mods.fml.common.registry.GameRegistry;
 
import cpw.mods.fml.common.registry.GameRegistry;
 
import cpw.mods.fml.common.registry.LanguageRegistry;
 
import cpw.mods.fml.common.registry.LanguageRegistry;
40行目: 23行目:
 
@Mod(modid="samplefluid.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 sampleFluidBlockID = 2892;
 
//流体ブロック
 
public static BlockFluidClassic sampleFluidBlock;
 
  
 
//容器入り流体のアイテムID
 
//容器入り流体のアイテムID
57行目: 35行目:
 
//他mod等との競合を避けるための識別用の名前です。 ※英数字小文字 及び "." 等が使えます。大文字や"/"は使えません。
 
//他mod等との競合を避けるための識別用の名前です。 ※英数字小文字 及び "." 等が使えます。大文字や"/"は使えません。
 
public static final String DOMAIN_NAME = "samplefluid";
 
public static final String DOMAIN_NAME = "samplefluid";
 
+
   
 
@EventHandler
 
@EventHandler
 
public void preInit(FMLPreInitializationEvent evt) {
 
public void preInit(FMLPreInitializationEvent evt) {
//Fluidクラスのインスタンスを生成
 
sampleFluid = new Fluid("FluidSample")
 
.setViscosity(1000)
 
//流れる速度
 
//小さいほど早い(アイテムを押す速さではない
 
//水 1000 溶岩6000 ネザー溶岩2000
 
    //溶岩のように、状況で変化させるには BlockFluidBase.tickRate をオーバーライド実装ください。
 
.setLuminosity(15)
 
//流体の明るさ
 
//流れの先のように水位が下がるのに比例して暗くなる
 
.setDensity(500);
 
//0以上で下へ、0未満で上へ流れます
 
//また密度が高い方の流体が、設置されている流体を押しのけて流れ込みます
 
//BC原油は800となっています。
 
//水や溶岩には密度設定がないので、無条件で押しのけ流れ込むため、後述を参考に別途実装が必要です。
 
 
 
//流体レジストリに追加
 
FluidRegistry.registerFluid(sampleFluid);
 
 
//Materialは別途実装しましょう。
 
//ちなみにWaterを設定すると、水同様溶岩を固める能力を持ちます。
 
sampleFluidBlock = (BlockFluidClassic)new BlockFluidClassic(sampleFluidBlockID, sampleFluid, Material.water)
 
.setUnlocalizedName(DOMAIN_NAME + ".liquidSample")
 
//※一枚textureならこれでよいですが、side,meta(8面別、水位)で別にする場合getIconをオーバーライド実装下さい
 
.func_111022_d(DOMAIN_NAME + ":" + sampleFluid.getName())
 
.setCreativeTab(CreativeTabs.tabDecorations);
 
 
/*
 
* 流れ込んでブロックを上書きするかどうか個別に登録する方法
 
*
 
* BlockFluidClassicを継承したクラスで
 
* displacementIds.put(blockID, [上書きする:true/しない:false]);
 
* のように追加します。
 
* displacementIds.put(Block.waterStill.blockID,false);
 
* と追加すれば、水源に流れ込まなくなります。
 
*
 
* 別方法としては下記のようにすると、バニラ式の流体には流れこまず、それ以外にはForge式判定を行うようになります。
 
*
 
* public boolean canDisplace(IBlockAccess world, int x, int y, int z){
 
* int bId = world.getBlockId(x, y, z);
 
* if(!(Block.blocksList[bId] instanceof BlockFluidBase))
 
* if(world.getBlockMaterial(x,  y,  z).isLiquid()) return false;
 
* return super.canDisplace(world, x, y, z);
 
* }
 
*
 
* public boolean displaceIfPossible(World world, int x, int y, int z) {
 
* int bId = world.getBlockId(x, y, z);
 
* if(!(Block.blocksList[bId] instanceof BlockFluidBase))
 
* if(world.getBlockMaterial(x,  y,  z).isLiquid()) return false;
 
* return super.displaceIfPossible(world, x, y, z);
 
* }
 
*/
 
 
/*
 
* 流体の混合反応について
 
* 溶岩の接触による黒曜石化、丸石化は
 
* BlockFluid.checkForHardenを参考に実装するとよいでしょう。
 
*
 
* public void onBlockAdded(World par1World, int par2, int par3, int par4){
 
* super.onBlockAdded(par1World, par2, par3, par4);
 
* checkForHarden(par1World, par2, par3, par4);
 
* }
 
* public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5){
 
* super.onNeighborBlockChange(par1World, par2, par3, par4, par5);
 
* checkForHarden(par1World, par2, par3, par4);
 
* }
 
*
 
* 溶岩が水に流れ込むことによる、焼き石化は下記のような処理でできます。
 
* protected void flowIntoBlock(World world, int x, int y, int z, int meta){
 
* if (meta < 0) return;
 
* if (displaceIfPossible(world, x, y, z)){
 
* 流れ込んで上書きした場合(溶岩が焼き石化する状態
 
* }else{
 
* 流れ込まず上に乗った場合
 
*  }
 
*  super.flowIntoBlock(world, x, y, z, meta);
 
* }
 
*/
 
 
/*
 
* 無限水源化したい場合
 
* updateTickをオーバーライドし
 
* BlockFlowingの64行目から103行目までを参考に周囲の水源、直下ブロックの判定をしましょう
 
* numAdjacentSourcesが、周囲の水源の数で、上記例であればj1が0であれば、水源化です。
 
*/
 
 
GameRegistry.registerBlock(sampleFluidBlock, sampleFluidBlock.getUnlocalizedName());
 
 
 
 
         //TextureStitchEvent.Preイベントのためにイベントバスに登録します。
 
         //TextureStitchEvent.Preイベントのためにイベントバスに登録します。
 
MinecraftForge.EVENT_BUS.register(this);
 
MinecraftForge.EVENT_BUS.register(this);
 
}
 
}
 
+
 
@EventHandler
 
@EventHandler
 
public void load(FMLInitializationEvent event) {
 
public void load(FMLInitializationEvent event) {
 +
//Fluidクラスのインスタンスを生成
 +
sampleFluid = new Fluid("LiquidSample");
 +
FluidRegistry.registerFluid(sampleFluid);
 +
 
//容器入り流体の登録です。
 
//容器入り流体の登録です。
 
//通常のアイテム作成と同様なので省略します。
 
//通常のアイテム作成と同様なので省略します。
 
//バケツのような動作には別途実装が必要です。
 
//バケツのような動作には別途実装が必要です。
 
itemSampleFluid = new Item(sampleFluidID)
 
itemSampleFluid = new Item(sampleFluidID)
.setUnlocalizedName(DOMAIN_NAME + ".fluidSample")//内部アイテム名の登録
+
.setUnlocalizedName(DOMAIN_NAME + ".liquidSample") //内部アイテム名の登録
 
//テクスチャ名の登録 func_111206_dはForgeバージョンによって名称が変わることがあります。
 
//テクスチャ名の登録 func_111206_dはForgeバージョンによって名称が変わることがあります。
 
//assets/samplefluid/textures/item/bottoledLiquidSample.png が必要です。
 
//assets/samplefluid/textures/item/bottoledLiquidSample.png が必要です。
 
.func_111206_d(DOMAIN_NAME + ":bottled" + sampleFluid.getName());
 
.func_111206_d(DOMAIN_NAME + ":bottled" + sampleFluid.getName());
 
+
       
 
ItemStack filledContainer = new ItemStack(itemSampleFluid);
 
ItemStack filledContainer = new ItemStack(itemSampleFluid);
 
FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer);
 
FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer);
  
//ボトル入り流体のローカライズ表示名の登録
+
//ローカライズ表示名の登録
LanguageRegistry.addName(itemSampleFluid, "bottledSampleFluid");
+
LanguageRegistry.addName(itemSampleFluid, "bottledSampleLiquid");
LanguageRegistry.instance().addNameForObject(itemSampleFluid, "ja-JP", "ボトル要りサンプル流体");
+
LanguageRegistry.addName(itemSampleFluid, "ja-JP", "ボトル要りサンプル流体");
 
 
//流体のローカライズ表示名の登録
 
LanguageRegistry.instance().addStringLocalization(sampleFluid.getUnlocalizedName(), "SampleFluid");
 
LanguageRegistry.instance().addStringLocalization(sampleFluid.getUnlocalizedName(), "ja-JP", "サンプル流体");
 
 
 
//流体ブロックのローカライズ表示名の登録
 
LanguageRegistry.addName(sampleFluidBlock, "SampleFluid");
 
LanguageRegistry.instance().addNameForObject(sampleFluidBlock, "ja-JP", "サンプル流体");
 
 
 
 
}
 
}
 
+
 
+
 
/**
 
/**
 
* IconはResourceパックを変更する際、新しいインスタンスが生成されるため
 
* IconはResourceパックを変更する際、新しいインスタンスが生成されるため
194行目: 77行目:
 
//必ず 0:"/terain.png"(※ブロックと共有) のTextureMapに画像を登録する必要があります。
 
//必ず 0:"/terain.png"(※ブロックと共有) のTextureMapに画像を登録する必要があります。
 
if(event.map.textureType == 0){
 
if(event.map.textureType == 0){
 
+
 
//初期化時に保存しておいた流体クラスを利用する
 
//初期化時に保存しておいた流体クラスを利用する
 
//または流体名を指定してFluidRegistoryからFluidインスタンスを取得します。
 
//または流体名を指定してFluidRegistoryからFluidインスタンスを取得します。
200行目: 83行目:
 
Fluid f = sampleFluid;
 
Fluid f = sampleFluid;
 
//Fluid f = FluidRegistry.getFluid("LiquidSample");
 
//Fluid f = FluidRegistry.getFluid("LiquidSample");
 
+
 
if(f != null){
 
if(f != null){
 
if(f.getBlockID() != -1){
 
if(f.getBlockID() != -1){
 
//流体ブロックを実装している場合は、ブロックからの流用が可能です。
 
//流体ブロックを実装している場合は、ブロックからの流用が可能です。
 +
//尚本チュートリアルは流体のみ(ついでに容器)の登録なため使用されません。例として参照ください。
 
//getIcon(int side,int meta) getBlockTextureFromSide(int side)等。
 
//getIcon(int side,int meta) getBlockTextureFromSide(int side)等。
  

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

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

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