2015-12-15 21:19:04 +00:00
|
|
|
package net.minecraftforge.debug;
|
|
|
|
|
2016-01-02 13:38:18 +00:00
|
|
|
import net.minecraft.block.BlockContainer;
|
|
|
|
import net.minecraft.block.material.Material;
|
2015-12-15 21:19:04 +00:00
|
|
|
import net.minecraft.block.state.IBlockState;
|
|
|
|
import net.minecraft.client.renderer.ItemMeshDefinition;
|
2016-03-01 12:58:03 +00:00
|
|
|
import net.minecraft.client.renderer.block.model.ModelBakery;
|
|
|
|
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
|
2015-12-15 21:19:04 +00:00
|
|
|
import net.minecraft.creativetab.CreativeTabs;
|
2016-01-02 13:38:18 +00:00
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
2016-03-12 21:17:57 +00:00
|
|
|
import net.minecraft.init.Blocks;
|
2015-12-15 21:19:04 +00:00
|
|
|
import net.minecraft.init.Items;
|
|
|
|
import net.minecraft.item.Item;
|
|
|
|
import net.minecraft.item.ItemStack;
|
2016-01-02 13:38:18 +00:00
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
import net.minecraft.network.NetworkManager;
|
|
|
|
import net.minecraft.network.Packet;
|
2016-03-01 12:58:03 +00:00
|
|
|
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
|
2016-01-02 13:38:18 +00:00
|
|
|
import net.minecraft.tileentity.TileEntity;
|
2016-03-01 12:58:03 +00:00
|
|
|
import net.minecraft.util.math.BlockPos;
|
|
|
|
import net.minecraft.util.text.TextComponentString;
|
2016-01-02 13:38:18 +00:00
|
|
|
import net.minecraft.util.EnumFacing;
|
2016-03-05 01:43:41 +00:00
|
|
|
import net.minecraft.util.EnumHand;
|
2015-12-15 21:19:04 +00:00
|
|
|
import net.minecraft.util.ResourceLocation;
|
2016-01-02 13:38:18 +00:00
|
|
|
import net.minecraft.world.World;
|
2015-12-15 21:19:04 +00:00
|
|
|
import net.minecraftforge.client.model.ModelLoader;
|
|
|
|
import net.minecraftforge.debug.ModelFluidDebug.TestFluid;
|
|
|
|
import net.minecraftforge.debug.ModelFluidDebug.TestGas;
|
|
|
|
import net.minecraftforge.event.entity.player.FillBucketEvent;
|
2016-01-02 13:38:18 +00:00
|
|
|
import net.minecraftforge.fluids.*;
|
2015-12-15 21:19:04 +00:00
|
|
|
import net.minecraftforge.fml.common.Mod;
|
|
|
|
import net.minecraftforge.fml.common.Mod.EventHandler;
|
|
|
|
import net.minecraftforge.fml.common.SidedProxy;
|
|
|
|
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
|
|
|
import net.minecraftforge.fml.common.eventhandler.Event.Result;
|
|
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
|
|
import net.minecraftforge.fml.common.registry.GameRegistry;
|
2016-03-12 21:17:57 +00:00
|
|
|
import net.minecraftforge.items.IItemHandler;
|
|
|
|
import net.minecraftforge.items.ItemStackHandler;
|
|
|
|
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
2015-12-15 21:19:04 +00:00
|
|
|
|
2016-01-02 13:38:18 +00:00
|
|
|
import java.util.List;
|
|
|
|
|
2016-03-15 22:42:01 +00:00
|
|
|
@Mod(modid = DynBucketTest.MODID, version = "0.1", dependencies = "after:" + ModelFluidDebug.MODID)
|
2015-12-15 21:19:04 +00:00
|
|
|
public class DynBucketTest
|
|
|
|
{
|
2016-03-15 22:42:01 +00:00
|
|
|
public static final String MODID = "DynBucketTest";
|
2015-12-15 21:19:04 +00:00
|
|
|
public static final Item dynBucket = new DynBucket();
|
|
|
|
public static final Item dynBottle = new DynBottle();
|
|
|
|
|
2016-01-02 13:38:18 +00:00
|
|
|
static
|
|
|
|
{
|
|
|
|
FluidRegistry.enableUniversalBucket();
|
|
|
|
}
|
|
|
|
|
2016-01-02 06:59:14 +00:00
|
|
|
@SidedProxy
|
2015-12-15 21:19:04 +00:00
|
|
|
public static CommonProxy proxy;
|
|
|
|
|
|
|
|
public static class CommonProxy
|
|
|
|
{
|
|
|
|
void setupModels()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-02 13:38:18 +00:00
|
|
|
public static class ServerProxy extends CommonProxy
|
|
|
|
{
|
|
|
|
}
|
2016-01-02 06:59:14 +00:00
|
|
|
|
2015-12-15 21:19:04 +00:00
|
|
|
public static class ClientProxy extends CommonProxy
|
|
|
|
{
|
|
|
|
@Override
|
|
|
|
void setupModels()
|
|
|
|
{
|
2015-12-29 12:20:36 +00:00
|
|
|
ModelLoader.setBucketModelDefinition(dynBucket);
|
2015-12-15 21:19:04 +00:00
|
|
|
|
2015-12-24 03:06:38 +00:00
|
|
|
final ModelResourceLocation bottle = new ModelResourceLocation(new ResourceLocation("forge", "dynbottle"), "inventory");
|
2015-12-15 21:19:04 +00:00
|
|
|
ModelLoader.setCustomMeshDefinition(dynBottle, new ItemMeshDefinition()
|
|
|
|
{
|
|
|
|
@Override
|
|
|
|
public ModelResourceLocation getModelLocation(ItemStack stack)
|
|
|
|
{
|
2015-12-24 03:06:38 +00:00
|
|
|
return bottle;
|
2015-12-15 21:19:04 +00:00
|
|
|
}
|
|
|
|
});
|
2015-12-24 03:06:38 +00:00
|
|
|
ModelBakery.registerItemVariants(dynBottle, bottle);
|
2016-03-15 22:42:01 +00:00
|
|
|
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(GameRegistry.findBlock(MODID, "simpletank")), 0, new ModelResourceLocation(new ResourceLocation(MODID, "simpletank"), "normal"));
|
2015-12-15 21:19:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-05 01:43:41 +00:00
|
|
|
@SuppressWarnings("unused")
|
2015-12-15 21:19:04 +00:00
|
|
|
@EventHandler
|
|
|
|
public void preInit(FMLPreInitializationEvent event)
|
|
|
|
{
|
2016-03-12 21:17:57 +00:00
|
|
|
GameRegistry.registerItem(new TestItem(), "testitem");
|
2016-01-02 13:38:18 +00:00
|
|
|
GameRegistry.registerBlock(new BlockSimpleTank(), "simpletank");
|
|
|
|
GameRegistry.registerTileEntity(TileSimpleTank.class, "simpletank");
|
|
|
|
|
|
|
|
FluidRegistry.addBucketForFluid(FluidRegistry.getFluid(TestFluid.name));
|
|
|
|
FluidRegistry.addBucketForFluid(FluidRegistry.getFluid(TestGas.name));
|
|
|
|
|
|
|
|
//GameRegistry.registerItem(dynBucket, "dynbucket");
|
2015-12-15 21:19:04 +00:00
|
|
|
GameRegistry.registerItem(dynBottle, "dynbottle");
|
|
|
|
|
|
|
|
// register fluid containers
|
|
|
|
int i = 0;
|
|
|
|
//registerFluidContainer(FluidRegistry.WATER, i++);
|
|
|
|
//registerFluidContainer(FluidRegistry.LAVA, i++);
|
2016-01-02 13:38:18 +00:00
|
|
|
//registerFluidContainer(FluidRegistry.getFluid(TestFluid.name), i++);
|
|
|
|
//registerFluidContainer(FluidRegistry.getFluid(TestGas.name), i++);
|
2015-12-15 21:19:04 +00:00
|
|
|
|
|
|
|
i = 0;
|
2016-01-02 13:38:18 +00:00
|
|
|
//registerFluidContainer2(FluidRegistry.WATER, i++);
|
|
|
|
//registerFluidContainer2(FluidRegistry.LAVA, i++);
|
|
|
|
//registerFluidContainer2(FluidRegistry.getFluid(TestFluid.name), i++);
|
|
|
|
//registerFluidContainer2(FluidRegistry.getFluid(TestGas.name), i++);
|
2015-12-15 21:19:04 +00:00
|
|
|
|
|
|
|
// Set TestFluidBlocks blockstate to use milk instead of testfluid for the texture to be loaded
|
|
|
|
FluidContainerRegistry.registerFluidContainer(FluidRegistry.getFluid("milk"), new ItemStack(Items.milk_bucket), FluidContainerRegistry.EMPTY_BUCKET);
|
|
|
|
|
|
|
|
proxy.setupModels();
|
2016-01-02 13:38:18 +00:00
|
|
|
//MinecraftForge.EVENT_BUS.register(this);
|
2015-12-15 21:19:04 +00:00
|
|
|
}
|
|
|
|
|
2016-03-05 01:43:41 +00:00
|
|
|
@SuppressWarnings("unused")
|
2015-12-15 21:19:04 +00:00
|
|
|
private void registerFluidContainer(Fluid fluid, int meta)
|
|
|
|
{
|
|
|
|
if (fluid == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
FluidStack fs = new FluidStack(fluid, FluidContainerRegistry.BUCKET_VOLUME);
|
|
|
|
ItemStack stack = new ItemStack(dynBucket, 1, meta);
|
|
|
|
FluidContainerRegistry.registerFluidContainer(fs, stack, new ItemStack(Items.bucket));
|
|
|
|
}
|
|
|
|
|
2016-03-05 01:43:41 +00:00
|
|
|
@SuppressWarnings("unused")
|
2015-12-15 21:19:04 +00:00
|
|
|
private void registerFluidContainer2(Fluid fluid, int meta)
|
|
|
|
{
|
|
|
|
if (fluid == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
FluidStack fs = new FluidStack(fluid, 250);
|
|
|
|
ItemStack stack = new ItemStack(dynBottle, 1, meta);
|
|
|
|
FluidContainerRegistry.registerFluidContainer(fs, stack, new ItemStack(Items.glass_bottle));
|
|
|
|
}
|
|
|
|
|
|
|
|
@SubscribeEvent
|
|
|
|
public void onBucketFill(FillBucketEvent event)
|
|
|
|
{
|
2016-03-05 01:43:41 +00:00
|
|
|
IBlockState state = event.getWorld().getBlockState(event.getTarget().getBlockPos());
|
2015-12-15 21:19:04 +00:00
|
|
|
if (state.getBlock() instanceof IFluidBlock)
|
|
|
|
{
|
|
|
|
Fluid fluid = ((IFluidBlock) state.getBlock()).getFluid();
|
|
|
|
FluidStack fs = new FluidStack(fluid, FluidContainerRegistry.BUCKET_VOLUME);
|
|
|
|
|
2016-03-05 01:43:41 +00:00
|
|
|
ItemStack filled = FluidContainerRegistry.fillFluidContainer(fs, event.getEmptyBucket());
|
2015-12-15 21:19:04 +00:00
|
|
|
if (filled != null)
|
|
|
|
{
|
2016-03-05 01:43:41 +00:00
|
|
|
event.setFilledBucket(filled);
|
2015-12-15 21:19:04 +00:00
|
|
|
event.setResult(Result.ALLOW);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-12 21:17:57 +00:00
|
|
|
public static class TestItem extends Item {
|
|
|
|
@Override
|
|
|
|
public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn)
|
|
|
|
{
|
|
|
|
if(worldIn.isRemote)
|
|
|
|
return itemStackIn;
|
|
|
|
|
|
|
|
ItemStackHandler handler = new ItemStackHandler(5);
|
|
|
|
ItemStackHandler handler2 = new ItemStackHandler(5);
|
|
|
|
IItemHandler joined = new CombinedInvWrapper(handler, handler2);
|
|
|
|
|
|
|
|
handler.setStackInSlot(0, new ItemStack(Blocks.stone));
|
|
|
|
handler.setStackInSlot(1, new ItemStack(Blocks.grass));
|
|
|
|
handler.setStackInSlot(2, new ItemStack(Blocks.dirt));
|
|
|
|
handler.setStackInSlot(3, new ItemStack(Blocks.glass));
|
|
|
|
handler.setStackInSlot(4, new ItemStack(Blocks.sand));
|
|
|
|
|
|
|
|
handler2.setStackInSlot(0, new ItemStack(Blocks.slime_block));
|
|
|
|
handler2.setStackInSlot(1, new ItemStack(Blocks.tnt));
|
|
|
|
handler2.setStackInSlot(2, new ItemStack(Blocks.planks));
|
|
|
|
handler2.setStackInSlot(3, new ItemStack(Blocks.log));
|
|
|
|
handler2.setStackInSlot(4, new ItemStack(Blocks.diamond_block));
|
|
|
|
|
|
|
|
for (int i = 0; i < handler.getSlots(); i++) {
|
|
|
|
System.out.println("Expected 1: " + handler.getStackInSlot(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < handler2.getSlots(); i++) {
|
|
|
|
System.out.println("Expected 2: " + handler2.getStackInSlot(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < joined.getSlots(); i++) {
|
|
|
|
System.out.println("Joined: " + joined.getStackInSlot(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
return itemStackIn;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-15 21:19:04 +00:00
|
|
|
public static class DynBucket extends Item
|
|
|
|
{
|
|
|
|
public DynBucket()
|
|
|
|
{
|
|
|
|
setUnlocalizedName("dynbucket");
|
|
|
|
setMaxStackSize(1);
|
|
|
|
setHasSubtypes(true);
|
|
|
|
setCreativeTab(CreativeTabs.tabMisc);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void getSubItems(Item itemIn, CreativeTabs tab, List<ItemStack> subItems)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
|
|
{
|
|
|
|
ItemStack bucket = new ItemStack(this, 1, i);
|
|
|
|
if (FluidContainerRegistry.isFilledContainer(bucket))
|
|
|
|
subItems.add(bucket);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-02 13:38:18 +00:00
|
|
|
public static class DynBottle extends UniversalBucket
|
2015-12-15 21:19:04 +00:00
|
|
|
{
|
|
|
|
public DynBottle()
|
|
|
|
{
|
2016-01-02 13:38:18 +00:00
|
|
|
super(250, new ItemStack(Items.glass_bottle), true);
|
2015-12-15 21:19:04 +00:00
|
|
|
setUnlocalizedName("dynbottle");
|
2016-01-02 13:38:18 +00:00
|
|
|
setMaxStackSize(16);
|
2015-12-15 21:19:04 +00:00
|
|
|
setHasSubtypes(true);
|
|
|
|
setCreativeTab(CreativeTabs.tabMisc);
|
|
|
|
}
|
2016-01-02 13:38:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// simple tank copied from tinkers construct
|
|
|
|
public static class BlockSimpleTank extends BlockContainer
|
|
|
|
{
|
|
|
|
|
|
|
|
protected BlockSimpleTank()
|
|
|
|
{
|
|
|
|
super(Material.rock);
|
|
|
|
setCreativeTab(CreativeTabs.tabMisc);
|
|
|
|
}
|
2015-12-15 21:19:04 +00:00
|
|
|
|
|
|
|
@Override
|
2016-01-02 13:38:18 +00:00
|
|
|
public TileEntity createNewTileEntity(World worldIn, int meta)
|
2015-12-15 21:19:04 +00:00
|
|
|
{
|
2016-01-02 13:38:18 +00:00
|
|
|
return new TileSimpleTank();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-03-05 01:43:41 +00:00
|
|
|
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ)
|
2016-01-02 13:38:18 +00:00
|
|
|
{
|
|
|
|
TileEntity te = worldIn.getTileEntity(pos);
|
|
|
|
if (!(te instanceof IFluidHandler))
|
2015-12-15 21:19:04 +00:00
|
|
|
{
|
2016-01-02 13:38:18 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
IFluidHandler tank = (IFluidHandler) te;
|
|
|
|
side = side.getOpposite();
|
|
|
|
|
2016-03-05 01:43:41 +00:00
|
|
|
if (heldItem == null)
|
2016-01-02 13:38:18 +00:00
|
|
|
{
|
|
|
|
sendText(playerIn, tank, side);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// do the thing with the tank and the buckets
|
2016-03-05 01:43:41 +00:00
|
|
|
if (FluidUtil.interactWithTank(heldItem, playerIn, tank, side))
|
2016-01-02 13:38:18 +00:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sendText(playerIn, tank, side);
|
|
|
|
}
|
|
|
|
|
|
|
|
// prevent interaction of the item if it's a fluidcontainer. Prevents placing liquids when interacting with the tank
|
2016-03-05 01:43:41 +00:00
|
|
|
return FluidContainerRegistry.isFilledContainer(heldItem) || heldItem.getItem() instanceof IFluidContainerItem;
|
2016-01-02 13:38:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void sendText(EntityPlayer player, IFluidHandler tank, EnumFacing side)
|
|
|
|
{
|
|
|
|
if (player.worldObj.isRemote)
|
|
|
|
{
|
|
|
|
String text;
|
|
|
|
if (tank.getTankInfo(side).length > 0 && tank.getTankInfo(side)[0] != null && tank.getTankInfo(side)[0].fluid != null)
|
|
|
|
{
|
|
|
|
text = tank.getTankInfo(side)[0].fluid.amount + "x " + tank.getTankInfo(side)[0].fluid.getLocalizedName();
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
text = "empty";
|
|
|
|
}
|
2016-03-01 12:58:03 +00:00
|
|
|
player.addChatMessage(new TextComponentString(text));
|
2016-01-02 13:38:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class TileSimpleTank extends TileEntity implements IFluidHandler
|
|
|
|
{
|
|
|
|
FluidTank tank = new FluidTank(4000);
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int fill(EnumFacing from, FluidStack resource, boolean doFill)
|
|
|
|
{
|
|
|
|
int filled = tank.fill(resource, doFill);
|
|
|
|
if(doFill && filled > 0) {
|
2016-03-05 01:43:41 +00:00
|
|
|
IBlockState state = worldObj.getBlockState(pos);
|
2016-03-13 01:40:03 +00:00
|
|
|
worldObj.notifyBlockUpdate(pos, state, state, 8); // TODO check flag
|
2016-01-02 13:38:18 +00:00
|
|
|
}
|
|
|
|
return filled;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain)
|
|
|
|
{
|
|
|
|
// not used in this test
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain)
|
|
|
|
{
|
|
|
|
FluidStack drained = tank.drain(maxDrain, doDrain);
|
|
|
|
if(doDrain && drained != null) {
|
2016-03-05 01:43:41 +00:00
|
|
|
IBlockState state = worldObj.getBlockState(pos);
|
2016-03-13 01:40:03 +00:00
|
|
|
worldObj.notifyBlockUpdate(pos, state, state, 8); // TODO check flag
|
2015-12-15 21:19:04 +00:00
|
|
|
}
|
2016-01-02 13:38:18 +00:00
|
|
|
return drained;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean canFill(EnumFacing from, Fluid fluid)
|
|
|
|
{
|
|
|
|
return tank.getFluidAmount() == 0 ||
|
|
|
|
(tank.getFluid().getFluid() == fluid && tank.getFluidAmount() < tank.getCapacity());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean canDrain(EnumFacing from, Fluid fluid)
|
|
|
|
{
|
|
|
|
return tank.getFluidAmount() > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public FluidTankInfo[] getTankInfo(EnumFacing from)
|
|
|
|
{
|
|
|
|
return new FluidTankInfo[]{new FluidTankInfo(tank)};
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void readFromNBT(NBTTagCompound tags)
|
|
|
|
{
|
|
|
|
super.readFromNBT(tags);
|
|
|
|
tank.readFromNBT(tags);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void writeToNBT(NBTTagCompound tags)
|
|
|
|
{
|
|
|
|
super.writeToNBT(tags);
|
|
|
|
tank.writeToNBT(tags);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-03-05 01:43:41 +00:00
|
|
|
public Packet<?> getDescriptionPacket() {
|
2016-01-02 13:38:18 +00:00
|
|
|
NBTTagCompound tag = new NBTTagCompound();
|
|
|
|
writeToNBT(tag);
|
2016-03-01 12:58:03 +00:00
|
|
|
return new SPacketUpdateTileEntity(this.getPos(), this.getBlockMetadata(), tag);
|
2016-01-02 13:38:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-03-01 12:58:03 +00:00
|
|
|
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
|
2016-01-02 13:38:18 +00:00
|
|
|
super.onDataPacket(net, pkt);
|
|
|
|
readFromNBT(pkt.getNbtCompound());
|
2015-12-15 21:19:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|