Files
MinecraftForge/src/main/java/net/minecraftforge/fluids/FluidContainerRegistry.java
T

281 lines
9.8 KiB
Java
Raw Normal View History

2013-05-23 01:01:19 -04:00
package net.minecraftforge.fluids;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import cpw.mods.fml.common.eventhandler.Event;
import net.minecraft.init.Items;
2013-05-23 01:01:19 -04:00
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.MinecraftForge;
/**
* Register simple items that contain fluids here. Useful for buckets, bottles, and things that have
* ID/metadata mappings.
*
* For more complex items, use {@link IFluidContainerItem} instead.
*
* @author King Lemming
*
*/
2014-01-17 21:55:48 -08:00
@SuppressWarnings("unused")
public abstract class FluidContainerRegistry
{
/*
2013-05-23 01:01:19 -04:00
private static Map<List, FluidContainerData> containerFluidMap = new HashMap();
private static Map<List, FluidContainerData> filledContainerMap = new HashMap();
private static Set<List> emptyContainers = new HashSet();
public static final int BUCKET_VOLUME = 1000;
public static final ItemStack EMPTY_BUCKET = new ItemStack(Items.bucket);
public static final ItemStack EMPTY_BOTTLE = new ItemStack(Items.glass_bottle);
private static final ItemStack NULL_EMPTYCONTAINER = new ItemStack(Items.bucket);
2013-05-23 01:01:19 -04:00
static
{
registerFluidContainer(FluidRegistry.WATER, new ItemStack(Items.water_bucket), EMPTY_BUCKET);
registerFluidContainer(FluidRegistry.LAVA, new ItemStack(Items.lava_bucket), EMPTY_BUCKET);
registerFluidContainer(FluidRegistry.WATER, new ItemStack(Items.potionitem), EMPTY_BOTTLE);
2013-05-23 01:01:19 -04:00
}
private FluidContainerRegistry(){}
2013-05-23 01:01:19 -04:00
/**
* Register a new fluid containing item.
*
* @param stack
* FluidStack containing the type and amount of the fluid stored in the item.
* @param filledContainer
* ItemStack representing the container when it is full.
* @param emptyContainer
* ItemStack representing the container when it is empty.
* @return True if container was successfully registered; false if it already is.
* /
public static boolean registerFluidContainer(FluidStack stack, ItemStack filledContainer, ItemStack emptyContainer)
{
2013-05-23 01:01:19 -04:00
return registerFluidContainer(new FluidContainerData(stack, filledContainer, emptyContainer));
}
/**
* Register a new fluid containing item. The item is assumed to hold 1000 mB of fluid. Also
* registers the Fluid if possible.
*
* @param fluid
* Fluid type that is stored in the item.
* @param filledContainer
* ItemStack representing the container when it is full.
* @param emptyContainer
* ItemStack representing the container when it is empty.
* @return True if container was successfully registered; false if it already is.
* /
public static boolean registerFluidContainer(Fluid fluid, ItemStack filledContainer, ItemStack emptyContainer)
{
if (!FluidRegistry.isFluidRegistered(fluid))
{
2013-05-23 01:01:19 -04:00
FluidRegistry.registerFluid(fluid);
}
return registerFluidContainer(new FluidStack(fluid, BUCKET_VOLUME), filledContainer, emptyContainer);
}
/**
* Register a new fluid containing item that does not have an empty container.
*
* @param stack
* FluidStack containing the type and amount of the fluid stored in the item.
* @param filledContainer
* ItemStack representing the container when it is full.
* @return True if container was successfully registered; false if it already is.
* /
public static boolean registerFluidContainer(FluidStack stack, ItemStack filledContainer)
{
2013-05-23 01:01:19 -04:00
return registerFluidContainer(new FluidContainerData(stack, filledContainer, null, true));
}
/**
* Register a new fluid containing item that does not have an empty container. The item is
* assumed to hold 1000 mB of fluid. Also registers the Fluid if possible.
*
* @param fluid
* Fluid type that is stored in the item.
* @param filledContainer
* ItemStack representing the container when it is full.
* @return True if container was successfully registered; false if it already is.
* /
public static boolean registerFluidContainer(Fluid fluid, ItemStack filledContainer)
{
if (!FluidRegistry.isFluidRegistered(fluid))
{
2013-05-23 01:01:19 -04:00
FluidRegistry.registerFluid(fluid);
}
return registerFluidContainer(new FluidStack(fluid, BUCKET_VOLUME), filledContainer);
}
/**
* Register a new fluid containing item.
*
* @param data
* See {@link FluidContainerData}.
* @return True if container was successfully registered; false if it already is.
* /
public static boolean registerFluidContainer(FluidContainerData data)
{
if (isFilledContainer(data.filledContainer))
{
2013-05-23 01:01:19 -04:00
return false;
}
containerFluidMap.put(Arrays.asList(data.filledContainer, data.filledContainer.getItemDamage()), data);
2013-05-23 01:01:19 -04:00
if (data.emptyContainer != null && data.emptyContainer != NULL_EMPTYCONTAINER)
{
filledContainerMap.put(Arrays.asList(data.emptyContainer, data.emptyContainer.getItemDamage(), data.fluid.fluidID), data);
emptyContainers.add(Arrays.asList(data.emptyContainer, data.emptyContainer.getItemDamage()));
2013-05-23 01:01:19 -04:00
}
2013-05-23 01:01:19 -04:00
MinecraftForge.EVENT_BUS.post(new FluidContainerRegisterEvent(data));
return true;
}
/**
* Determines the fluid type and amount inside a container.
*
* @param container
* The fluid container.
* @return FluidStack representing stored fluid.
* /
public static FluidStack getFluidForFilledItem(ItemStack container)
{
if (container == null)
{
2013-05-23 01:01:19 -04:00
return null;
}
FluidContainerData data = containerFluidMap.get(Arrays.asList(container, container.getItemDamage()));
2013-05-23 01:01:19 -04:00
return data == null ? null : data.fluid.copy();
}
/**
* Attempts to fill an empty container with a fluid.
*
* NOTE: Returns null on fail, NOT the empty container.
*
* @param fluid
* FluidStack containing the type and amount of fluid to fill.
* @param container
* ItemStack representing the empty container.
* @return Filled container if successful, otherwise null.
* /
public static ItemStack fillFluidContainer(FluidStack fluid, ItemStack container)
{
if (container == null || fluid == null)
{
2013-05-23 01:01:19 -04:00
return null;
}
FluidContainerData data = filledContainerMap.get(Arrays.asList(container, container.getItemDamage(), fluid.fluidID));
if (data != null && fluid.amount >= data.fluid.amount)
{
2013-05-23 01:01:19 -04:00
return data.filledContainer.copy();
}
return null;
}
/**
* Determines if a container holds a specific fluid.
* /
public static boolean containsFluid(ItemStack container, FluidStack fluid)
{
if (container == null || fluid == null)
{
2013-05-23 01:01:19 -04:00
return false;
}
FluidContainerData data = filledContainerMap.get(Arrays.asList(container, container.getItemDamage(), fluid.fluidID));
2013-05-23 01:01:19 -04:00
return data == null ? false : data.fluid.isFluidEqual(fluid);
}
public static boolean isBucket(ItemStack container)
{
if (container == null)
{
2013-05-23 01:01:19 -04:00
return false;
}
if (container.isItemEqual(EMPTY_BUCKET))
{
2013-05-23 01:01:19 -04:00
return true;
}
FluidContainerData data = containerFluidMap.get(Arrays.asList(container, container.getItemDamage()));
2013-05-23 01:01:19 -04:00
return data != null && data.emptyContainer.isItemEqual(EMPTY_BUCKET);
}
public static boolean isContainer(ItemStack container)
{
2013-05-23 01:01:19 -04:00
return isEmptyContainer(container) || isFilledContainer(container);
}
public static boolean isEmptyContainer(ItemStack container)
{
return container != null && emptyContainers.contains(Arrays.asList(container, container.getItemDamage()));
2013-05-23 01:01:19 -04:00
}
public static boolean isFilledContainer(ItemStack container)
{
2013-05-23 01:01:19 -04:00
return container != null && getFluidForFilledItem(container) != null;
}
public static FluidContainerData[] getRegisteredFluidContainerData()
{
return containerFluidMap.values().toArray(new FluidContainerData[containerFluidMap.size()]);
2013-05-23 01:01:19 -04:00
}
/**
* Wrapper class for the registry entries. Ensures that none of the attempted registrations
* contain null references unless permitted.
* /
public static class FluidContainerData
{
2013-05-23 01:01:19 -04:00
public final FluidStack fluid;
public final ItemStack filledContainer;
public final ItemStack emptyContainer;
public FluidContainerData(FluidStack stack, ItemStack filledContainer, ItemStack emptyContainer)
{
2013-05-23 01:01:19 -04:00
this(stack, filledContainer, emptyContainer, false);
}
public FluidContainerData(FluidStack stack, ItemStack filledContainer, ItemStack emptyContainer, boolean nullEmpty)
{
2013-05-23 01:01:19 -04:00
this.fluid = stack;
this.filledContainer = filledContainer;
this.emptyContainer = emptyContainer == null ? NULL_EMPTYCONTAINER : emptyContainer;
2013-05-23 01:01:19 -04:00
if (stack == null || filledContainer == null || emptyContainer == null && !nullEmpty)
{
2013-05-23 01:01:19 -04:00
throw new RuntimeException("Invalid FluidContainerData - a parameter was null.");
}
}
public FluidContainerData copy()
{
2013-05-23 01:01:19 -04:00
return new FluidContainerData(fluid, filledContainer, emptyContainer, true);
}
}
public static class FluidContainerRegisterEvent extends Event
{
2013-05-23 01:01:19 -04:00
public final FluidContainerData data;
public FluidContainerRegisterEvent(FluidContainerData data)
{
2013-05-23 01:01:19 -04:00
this.data = data.copy();
}
}
*/
2013-05-23 01:01:19 -04:00
}