提供: Minecraft Modding Wiki
この記事は"Minecraft Forge Universal 9.10.0.xxx~"を前提MODとしています。 |
概要
1.6で追加した流体をバケツで扱えるようにします前提チュートリアル:1.6の流体追加
ソースコード
- FillBucketHandler.java(SpaceToad氏のBCでの実装の一部改変)
/** * Copyright (c) SpaceToad, 2011 http://www.mod-buildcraft.com * * BuildCraft is distributed under the terms of the Minecraft Mod Public License * 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package samplefluid; import java.util.HashMap; import java.util.Map; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.event.Event.Result; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.entity.player.FillBucketEvent; public class FillBucketHandler { public static FillBucketHandler INSTANCE = new FillBucketHandler(); public Map<Block, Item> buckets = new HashMap<Block, Item>(); private BucketHandler() { } @ForgeSubscribe public void onBucketFill(FillBucketEvent event) { ItemStack result = fillCustomBucket(event.world, event.target); if (result == null) return; event.result = result; event.setResult(Result.ALLOW); } private ItemStack fillCustomBucket(World world, MovingObjectPosition pos) { //BlockIDを取得 int blockID = world.getBlockId(pos.blockX, pos.blockY, pos.blockZ); //BlockIDから登録した液体バケツを取得 Item bucket = buckets.get(Block.blocksList[blockID]); if (bucket != null && world.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ) == 0) { world.setBlock(pos.blockX, pos.blockY, pos.blockZ, 0); return new ItemStack(bucket);//液体バケツを返却 } else return null; } }
- SampleFluid.javaの修正部分
@EventHandler public void load(FMLInitializationEvent event) { //この行を //FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer);] //こちらに入れ替える。 FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer, new ItemStack(Items.bucket)); //ここから追加 FillBucketHandler.INSTANCE.buckets.put(sampleFluidBlock, itemSampleFluid); MinecraftForge.EVENT_BUS.register(FillBucketHandler.INSTANCE); //ここまで追加 }
解説
FluidContainerRegistry.registerFluidContainer(sampleFluid, filledContainer, new ItemStack(Items.bucket));
液体ブロック設置時に空のバケツが返却されるように、登録。IC2の空のセルとかを返却させることも出来る。
FillBucketHandler.INSTANCE.buckets.put(sampleFluidBlock, itemSampleFluid); MinecraftForge.EVENT_BUS.register(FillBucketHandler.INSTANCE);
バニラのバケツの処理が特殊なので、ハンドラーを登録し、ハンドラーに液体ブロックと液体入りバケツを登録。
private ItemStack fillCustomBucket(World world, MovingObjectPosition pos) { //BlockIDを取得 int blockID = world.getBlockId(pos.blockX, pos.blockY, pos.blockZ); //BlockIDから登録した液体バケツを取得 Item bucket = buckets.get(Block.blocksList[blockID]); if (bucket != null && world.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ) == 0) { world.setBlock(pos.blockX, pos.blockY, pos.blockZ, 0); return new ItemStack(bucket);//液体バケツを返却 } else return null; }
空バケツの右クリックの座標から液体ブロックを取得し、液体バケツを返却
@ForgeSubscribe public void onBucketFill(FillBucketEvent event) { ItemStack result = fillCustomBucket(event.world, event.target); if (result == null) return; event.result = result; event.setResult(Result.ALLOW); }
バケツのイベントから、ターゲット座標を取得し、fillCustomBucketメソッドに送り、返ってきた液体バケツのItemStackを結果に返す。 これにより、空バケツが液体バケツになる。