001
002 package net.minecraftforge.liquids;
003
004 import java.util.ArrayList;
005 import java.util.Arrays;
006 import java.util.HashMap;
007 import java.util.HashSet;
008 import java.util.List;
009 import java.util.Map;
010 import java.util.Set;
011
012 import net.minecraft.block.Block;
013 import net.minecraft.item.Item;
014 import net.minecraft.item.ItemStack;
015
016 public class LiquidContainerRegistry
017 {
018 public static final int BUCKET_VOLUME = 1000;
019 public static final ItemStack EMPTY_BUCKET = new ItemStack(Item.bucketEmpty);
020
021 private static Map<List, LiquidContainerData> mapFilledItemFromLiquid = new HashMap();
022 private static Map<List, LiquidContainerData> mapLiquidFromFilledItem = new HashMap();
023 private static Set<List> setContainerValidation = new HashSet();
024 private static Set<List> setLiquidValidation = new HashSet();
025 private static ArrayList<LiquidContainerData> liquids = new ArrayList();
026
027 /**
028 * Default registrations
029 */
030 static
031 {
032 registerLiquid(new LiquidContainerData(new LiquidStack(Block.waterStill, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.bucketWater), new ItemStack(Item.bucketEmpty)));
033 registerLiquid(new LiquidContainerData(new LiquidStack(Block.lavaStill, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.bucketLava), new ItemStack(Item.bucketEmpty)));
034 registerLiquid(new LiquidContainerData(new LiquidStack(Block.waterStill, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.potion), new ItemStack(Item.glassBottle)));
035 // registerLiquid(new LiquidContainerData(new LiquidStack(Item.bucketMilk, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.bucketMilk), new ItemStack(Item.bucketEmpty)));
036 }
037
038 /**
039 * To register a container with a non-bucket size, the LiquidContainerData entry simply needs to use a size other than LiquidManager.BUCKET_VOLUME
040 */
041 public static void registerLiquid(LiquidContainerData data)
042 {
043 mapFilledItemFromLiquid.put(Arrays.asList(data.container.itemID, data.container.getItemDamage(), data.stillLiquid.itemID, data.stillLiquid.itemMeta), data);
044 mapLiquidFromFilledItem.put(Arrays.asList(data.filled.itemID, data.filled.getItemDamage()), data);
045 setContainerValidation.add(Arrays.asList(data.container.itemID, data.container.getItemDamage()));
046 setLiquidValidation.add(Arrays.asList(data.stillLiquid.itemID, data.stillLiquid.itemMeta));
047
048 liquids.add(data);
049 }
050
051 public static LiquidStack getLiquidForFilledItem(ItemStack filledContainer)
052 {
053 if (filledContainer == null)
054 {
055 return null;
056 }
057
058 LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(filledContainer.itemID, filledContainer.getItemDamage()));
059 return ret == null ? null : ret.stillLiquid.copy();
060 }
061
062 public static ItemStack fillLiquidContainer(LiquidStack liquid, ItemStack emptyContainer)
063 {
064 if (emptyContainer == null || liquid == null)
065 {
066 return null;
067 }
068
069 LiquidContainerData ret = mapFilledItemFromLiquid.get(Arrays.asList(emptyContainer.itemID, emptyContainer.getItemDamage(), liquid.itemID, liquid.itemMeta));
070
071 if (ret != null && liquid.amount >= ret.stillLiquid.amount)
072 {
073 return ret.filled.copy();
074 }
075
076 return null;
077 }
078
079 public static boolean containsLiquid(ItemStack filledContainer, LiquidStack liquid)
080 {
081 if (filledContainer == null || liquid == null)
082 {
083 return false;
084 }
085
086 LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(filledContainer.itemID, filledContainer.getItemDamage()));
087
088 return ret != null && ret.stillLiquid.isLiquidEqual(liquid);
089 }
090
091 public static boolean isBucket(ItemStack container)
092 {
093 if (container == null)
094 {
095 return false;
096 }
097
098 if (container.isItemEqual(EMPTY_BUCKET))
099 {
100 return true;
101 }
102
103 LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(container.itemID, container.getItemDamage()));
104 return ret != null && ret.container.isItemEqual(EMPTY_BUCKET);
105 }
106
107 public static boolean isContainer(ItemStack container)
108 {
109 return isEmptyContainer(container) || isFilledContainer(container);
110 }
111
112 public static boolean isEmptyContainer(ItemStack emptyContainer)
113 {
114 return emptyContainer != null && setContainerValidation.contains(Arrays.asList(emptyContainer.itemID, emptyContainer.getItemDamage()));
115 }
116
117 public static boolean isFilledContainer(ItemStack filledContainer)
118 {
119 return filledContainer != null && getLiquidForFilledItem(filledContainer) != null;
120 }
121
122 public static boolean isLiquid(ItemStack item)
123 {
124 return item != null && setLiquidValidation.contains(Arrays.asList(item.itemID, item.getItemDamage()));
125 }
126
127 public static LiquidContainerData[] getRegisteredLiquidContainerData()
128 {
129 return liquids.toArray(new LiquidContainerData[liquids.size()]);
130 }
131 }