From bcb8a48620895bd8340569f5c27c45f156c52536 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 6 Feb 2024 14:52:06 +1100 Subject: [PATCH 1/3] you know what *siphons your gas* --- .../java/com/hbm/crafting/ToolRecipes.java | 2 + .../hbm/inventory/FluidContainerRegistry.java | 49 +++++++-- .../fluid/tank/FluidLoaderStandard.java | 4 +- .../hbm/inventory/fluid/tank/FluidTank.java | 4 +- src/main/java/com/hbm/items/ModItems.java | 5 + .../hbm/items/machine/ItemFluidSiphon.java | 93 ++++++++++++++++++ .../java/com/hbm/items/tool/ItemPipette.java | 11 ++- src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../assets/hbm/textures/items/siphon.png | Bin 0 -> 4418 bytes 9 files changed, 153 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/hbm/items/machine/ItemFluidSiphon.java create mode 100644 src/main/resources/assets/hbm/textures/items/siphon.png diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index df95ca834..27c513745 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -134,6 +134,8 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_boron, 1), new Object[] { " P", " B ", "B ", 'P', RUBBER.ingot(), 'B', ModBlocks.glass_boron}); CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_laboratory, 1), new Object[] { " C", " R ", "P ", 'C', ModItems.circuit_aluminium, 'R', RUBBER.ingot(), 'P', ModItems.pipette_boron }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.siphon, 1), new Object[] { " GR", " GR", " G ", 'G', KEY_CLEARGLASS, 'R', ANY_RUBBER.ingot()}); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.mirror_tool), new Object[] { " A ", " IA", "I ", 'A', AL.ingot(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.rbmk_tool), new Object[] { " A ", " IA", "I ", 'A', PB.ingot(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.power_net_tool), new Object[] { "WRW", " I ", " B ", 'W', ModItems.wire_red_copper, 'R', REDSTONE.dust(), 'I', IRON.ingot(), 'B', ModItems.battery_su }); diff --git a/src/main/java/com/hbm/inventory/FluidContainerRegistry.java b/src/main/java/com/hbm/inventory/FluidContainerRegistry.java index 5033ee2a4..ac426cf5a 100644 --- a/src/main/java/com/hbm/inventory/FluidContainerRegistry.java +++ b/src/main/java/com/hbm/inventory/FluidContainerRegistry.java @@ -1,6 +1,7 @@ package com.hbm.inventory; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; @@ -18,8 +19,9 @@ import net.minecraftforge.oredict.OreDictionary; public class FluidContainerRegistry { - //TODO: somehow incorporate hashmaps into this + //TODO: continue incorporating hashmaps into this public static List allContainers = new ArrayList(); + private static HashMap> containerMap = new HashMap>(); public static void register() { FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.water_bucket), new ItemStack(Items.bucket), Fluids.WATER, 1000)); @@ -88,6 +90,35 @@ public class FluidContainerRegistry { public static void registerContainer(FluidContainer con) { allContainers.add(con); OreDictionary.registerOre(con.type.getDict(con.content), con.fullContainer); + + if (!containerMap.containsKey(con.type)) + containerMap.put(con.type, new ArrayList()); + + List items = containerMap.get(con.type); + items.add(con); + } + + public static List getContainers(FluidType type) { + return containerMap.get(type); + } + + public static FluidContainer getContainer(FluidType type, ItemStack stack) { + if(stack == null) + return null; + + ItemStack sta = stack.copy(); + sta.stackSize = 1; + + if (!containerMap.containsKey(type)) + return null; + + for (FluidContainer container : getContainers(type)) { + if (ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) { + return container; + } + } + + return null; } public static int getFluidContent(ItemStack stack, FluidType type) { @@ -97,11 +128,12 @@ public class FluidContainerRegistry { ItemStack sta = stack.copy(); sta.stackSize = 1; + + if (!containerMap.containsKey(type)) + return 0; - for(FluidContainer container : allContainers) { - if(container.type == type && - ItemStack.areItemStacksEqual(container.fullContainer, sta) && - ItemStack.areItemStackTagsEqual(container.fullContainer, sta)) + for(FluidContainer container : containerMap.get(type)) { + if(ItemStack.areItemStacksEqual(container.fullContainer, sta) && ItemStack.areItemStackTagsEqual(container.fullContainer, sta)) return container.content; } @@ -131,8 +163,11 @@ public class FluidContainerRegistry { ItemStack sta = stack.copy(); sta.stackSize = 1; - for(FluidContainer container : allContainers) { - if(ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta) && container.type == type) + if (!containerMap.containsKey(type)) + return null; + + for(FluidContainer container : containerMap.get(type)) { + if(ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) return container.fullContainer.copy(); } diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java index c8fcecbb4..4252f025c 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java @@ -20,8 +20,6 @@ public class FluidLoaderStandard extends FluidLoadingHandler { if(full != null && slots[in] != null && tank.getFill() - FluidContainerRegistry.getFluidContent(full, type) >= 0) { - ItemStack fullContainer = FluidContainerRegistry.getFullContainer(slots[in], type); - if(slots[out] == null) { tank.setFill(tank.getFill() - FluidContainerRegistry.getFluidContent(full, type)); @@ -31,7 +29,7 @@ public class FluidLoaderStandard extends FluidLoadingHandler { slots[in] = null; } - } else if(slots[out] != null && slots[out].getItem() == fullContainer.getItem() && slots[out].getItemDamage() == fullContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()) { + } else if(slots[out] != null && slots[out].getItem() == full.getItem() && slots[out].getItemDamage() == full.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()) { tank.setFill(tank.getFill() - FluidContainerRegistry.getFluidContent(full, type)); slots[in].stackSize--; diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index 719b0eda3..40172b6bd 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -27,8 +27,8 @@ import net.minecraft.util.MathHelper; public class FluidTank { - public static final List loadingHandlers = new ArrayList(); - public static final Set noDualUnload = new HashSet(); + public static final List loadingHandlers = new ArrayList(); + public static final Set noDualUnload = new HashSet(); static { loadingHandlers.add(new FluidLoaderStandard()); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 0b2168673..fc18a256c 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -942,6 +942,7 @@ public class ModItems { public static Item pipette; public static Item pipette_boron; public static Item pipette_laboratory; + public static Item siphon; public static Item disperser_canister_empty; public static Item disperser_canister; @@ -4678,6 +4679,7 @@ public class ModItems { pipette = new ItemPipette().setUnlocalizedName("pipette").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette"); pipette_boron = new ItemPipette().setUnlocalizedName("pipette_boron").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_boron"); pipette_laboratory = new ItemPipette().setUnlocalizedName("pipette_laboratory").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_laboratory"); + siphon = new ItemFluidSiphon().setUnlocalizedName("siphon").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":siphon"); inf_water = new ItemInfiniteFluid(Fluids.WATER, 50).setUnlocalizedName("inf_water").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water"); inf_water_mk2 = new ItemInfiniteFluid(Fluids.WATER, 500).setUnlocalizedName("inf_water_mk2").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water_mk2"); @@ -6427,6 +6429,9 @@ public class ModItems { GameRegistry.registerItem(pipette_boron, pipette_boron.getUnlocalizedName()); GameRegistry.registerItem(pipette_laboratory, pipette_laboratory.getUnlocalizedName()); + //Siphon + GameRegistry.registerItem(siphon, siphon.getUnlocalizedName()); + //Disperser Canister GameRegistry.registerItem(disperser_canister_empty, disperser_canister_empty.getUnlocalizedName()); GameRegistry.registerItem(disperser_canister, disperser_canister.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java new file mode 100644 index 000000000..35c4123af --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java @@ -0,0 +1,93 @@ +package com.hbm.items.machine; + +import com.hbm.util.CompatExternal; + +import com.hbm.inventory.FluidContainer; +import com.hbm.inventory.FluidContainerRegistry; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.items.ModItems; +import com.hbm.items.tool.ItemPipette; + +import api.hbm.fluid.IFluidStandardReceiver; +import api.hbm.fluid.IFluidStandardTransceiver; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class ItemFluidSiphon extends Item { + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { + TileEntity te = CompatExternal.getCoreFromPos(world, x, y, z); + + if(te != null && (te instanceof IFluidStandardReceiver || te instanceof IFluidStandardTransceiver)) { + FluidTank[] tanks; + if (te instanceof IFluidStandardReceiver) { + tanks = ((IFluidStandardReceiver) te).getReceivingTanks(); + } else { + tanks = ((IFluidStandardTransceiver) te).getReceivingTanks(); + } + + boolean hasDrainedTank = false; + + // We need to iterate through the inventory for _each_ siphonable tank, so we can handle fluids that can only go into certain containers + // After we successfully siphon any fluid from a tank, we stop further processing, multiple fluid types require multiple clicks + for (FluidTank tank : tanks) { + if (tank.getFill() <= 0) continue; + + ItemStack availablePipette = null; + FluidType tankType = tank.getTankType(); + + for (int j = 0; j < player.inventory.mainInventory.length; j++) { + ItemStack inventoryStack = player.inventory.mainInventory[j]; + if (inventoryStack == null) continue; + + FluidContainer container = FluidContainerRegistry.getContainer(tankType, inventoryStack); + + if (availablePipette == null && inventoryStack.getItem() instanceof ItemPipette) { + ItemPipette pipette = (ItemPipette) inventoryStack.getItem(); + if (!pipette.willFizzle(tankType) && pipette != ModItems.pipette_laboratory) { // Ignoring laboratory pipettes for now + availablePipette = inventoryStack; + } + } + + if (container == null) continue; + + ItemStack full = FluidContainerRegistry.getFullContainer(inventoryStack, tankType); + + while (tank.getFill() >= container.content && inventoryStack.stackSize > 0) { + hasDrainedTank = true; + + inventoryStack.stackSize--; + if (inventoryStack.stackSize <= 0) { + player.inventory.mainInventory[j] = null; + } + + ItemStack filledContainer = full.copy(); + tank.setFill(tank.getFill() - container.content); + player.inventory.addItemStackToInventory(filledContainer); + } + } + + // If the remainder of the tank can only fit into a pipette, fill a pipette with the remainder + // Will not auto-fill fizzlable pipettes, there is no feedback for the fizzle in this case, and that's a touch too unfair + if (availablePipette != null && tank.getFill() < 1000) { + ItemPipette pipette = (ItemPipette) availablePipette.getItem(); + + if (pipette.acceptsFluid(tankType, availablePipette)) { + hasDrainedTank = true; + tank.setFill(pipette.tryFill(tankType, tank.getFill(), availablePipette)); + } + } + + if (hasDrainedTank) return true; + } + } + + return false; + } + +} diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java index 110dee982..2ac6a72bd 100644 --- a/src/main/java/com/hbm/items/tool/ItemPipette.java +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -133,15 +133,18 @@ public class ItemPipette extends Item implements IFillableItem { this.setFill(stack, type, (short) (this.getFill(stack) + toFill)); // fizzling checks - if(this.getFill(stack) > 0 && (this.getType(stack).isCorrosive() && type != Fluids.ACID)) { - if(this == ModItems.pipette) { - stack.stackSize = 0; - } + if(this.getFill(stack) > 0 && willFizzle(type)) { + stack.stackSize = 0; } return amount - toFill; } + public boolean willFizzle(FluidType type) { + if (this != ModItems.pipette) return false; + return type.isCorrosive() && type != Fluids.ACID; + } + @Override public boolean providesFluid(FluidType type, ItemStack stack) { return this.getType(stack) == type; diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 04d811ab6..a627dc85e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3667,6 +3667,7 @@ item.power_net_tool.name=Cable Network Analysis Tool item.pipette.name=Pipette item.pipette_boron.name=Boron Pipette item.pipette_laboratory.name=Laboratory Grade Pipette +item.siphon.name=Siphon item.primer_357.name=.357 Magnum Primer (x24) item.primer_44.name=.44 Magnum Primer (x24) item.primer_50.name=Large Caliber Primer (x12) diff --git a/src/main/resources/assets/hbm/textures/items/siphon.png b/src/main/resources/assets/hbm/textures/items/siphon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec759097888e47203b0db85ba8ed51a67b6b29be GIT binary patch literal 4418 zcmeHKdsGzH8J~p&l!pN;slj?!SDIqW?94vc$FPgy?jkEJAS@A5G|tYgRkUh66-_mG)Q~EQy|cR@oaUS!&T0N* z_sq`BcYojSe&6r=?mc@~7v#;0jY^DyASl+HZ7c-$IN_QQ0e+M2KE}bVy~bL?7vf&A zn`P{DB_-zlZc0q~XgdV?&N~Y-Cxy?LaOm!u4AFDe+J>Hs&p*n1`=zpdr9F9HYF0ca z!WMT$UQA3*p-;UzfBwzSwwXSNzS>a3F46m+(seYxm!GM7y6uc1=jx+Vk&Bz>Rwp1? zo}_vwJZ1V|Kb8Dw?!R{4ST?l@f9gg(8nZNMZPD)9>3F)Y{u{%(&(F3l|MF%}&-TaR z8^T35W6BxmR?0gq+p6yTQuI~giPQ01@=GV$^p?-2ot;)1dt#vNSqKu<(FQ|-*e&!VXDEinIQO>A8y^L|PIXr~GhU`@YMU zyKLR<9iy+`u$&hB|YZ2|LvpFmGjS#bLJ#BC@%hPm3oy!4R5)d zQB_x*T>tN8-(R;zPoB*#^4wp?ox@-0dVT7FQ@X0Ul2q^R3mqTYb{Yo@_8}aephPHo% zUCS^tp1s%O(Y>){WnQKKnLk_*Wwr2~>wh#WJ13=S#kYzFJHpV~=$H==9PsyQmO<>s z?mMw=_k`SybpIc_4h|gT2KFESv@dd_oZb7;L!=foorea^Rbt7-2*xSJNybJ=eNH#% zItbFu_PKGQg5t$C%0avIlD>m&5;0BcB@5FmsKsrd%IWMHmMW^rvl2BGgqD=d&WO_a zFhJm>cwFprR=POMr)~MKokw7{l0|D;Cyra-Vxd*@iWwBsJhNu?8GaL01VSbEc2%5wKj~Y~_ zz!h>7*4l6-tklX$SVO2~u#8d@DveSmr*L!xmD$DdxQn0!DnKr!0gqaPtL!Qj4r>V& z2`kYw61FJ_Eo@J-Y1ImiO+hM@BPjA&8gwOIIWj7NiWI0&6xApNUoEMHm1%?uw%I8P z*2v^`8HL+5Dl!-iNnlwF>%>7hX(#TW5Vy+_m_ra8%PcVKC30yH8n6^p;=CO=fHgq7 zNXE-O0b6M&Rm9_ho-#G6mT6IyTA`IIRPtcd0sj{$mIJ*gu*y(rC?BCP7)S?5iwm6! z2!`^+3@nB73~ObWO1(s&5DT8e!xpfhNSw!wI8OmmRIbEOIfkmNG9{)^V`++?$z&Kh z0?&}N-T%MP!txR8f<@1!IWWIJU<$6OBC0C*7JRLw1B*#44lD}{CxR((xQ8MGaRRR3 z5K)f192D3;LJd1)r@x~a?4(AawWSfTMkt=rj;df>qp-syLE1HTr3#fP6{FcX#?E_j zmdbPh9f4M$K?7QeQ$nShH5%_Nr-V8H$zW6tkC04)gpx&s9b+h49r9m#=mLNdTMY0E z+Q8NYc0y!$D-7u+Y&zfLCsc>;aRxv=KFOH$9hYldt}!VvCh&N7jmtGA1;zv(@2>xw zTv1OBQ9uuODkmvRsk{R80=L2orr1;$9; zY%xV%4~q!@aay;l$puWe&Bjct=F{%R-Aj+4Q%s-Ck1(Vs6oq~AnzUuzdk;;$rw0?3 z8`W>@*fY4z;7_{zZij4R%;vIpZrRt&yn=OFuWw1dclvKlUxyFA=xNA+6P+Vbula7|KQ}#pZ-2I{nFNHoqze0Y|$5% zJX0OCe#b0p!Y Date: Tue, 6 Feb 2024 17:40:51 +1100 Subject: [PATCH 2/3] you know what *unsiphons your water* --- .../com/hbm/items/machine/ItemFluidSiphon.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java index 35c4123af..59f9b1ee5 100644 --- a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java +++ b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java @@ -2,9 +2,13 @@ package com.hbm.items.machine; import com.hbm.util.CompatExternal; +import java.util.List; +import java.util.Arrays; + import com.hbm.inventory.FluidContainer; import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.tool.ItemPipette; @@ -18,6 +22,15 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class ItemFluidSiphon extends Item { + + private static List IGNORED_FLUIDS = Arrays.asList( + Fluids.WATER, + Fluids.SPENTSTEAM, + Fluids.STEAM, + Fluids.HOTSTEAM, + Fluids.SUPERHOTSTEAM, + Fluids.ULTRAHOTSTEAM + ); @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { @@ -37,6 +50,7 @@ public class ItemFluidSiphon extends Item { // After we successfully siphon any fluid from a tank, we stop further processing, multiple fluid types require multiple clicks for (FluidTank tank : tanks) { if (tank.getFill() <= 0) continue; + if (IGNORED_FLUIDS.contains(tank.getTankType())) continue; ItemStack availablePipette = null; FluidType tankType = tank.getTankType(); From 72a252194af1ac1966d9094b9b803b41ea8502d9 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 6 Feb 2024 18:07:21 +1100 Subject: [PATCH 3/3] Add a new "unsiphonable" fluid trait instead of using a static list --- .../java/com/hbm/inventory/fluid/Fluids.java | 11 ++++++----- .../hbm/inventory/fluid/trait/FluidTrait.java | 1 + .../inventory/fluid/trait/FluidTraitSimple.java | 6 ++++++ .../com/hbm/items/machine/ItemFluidSiphon.java | 17 +++-------------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 527133b66..cb5498d8b 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -185,6 +185,7 @@ public class Fluids { public static final FT_NoID NOID = new FT_NoID(); public static final FT_Delicious DELICIOUS = new FT_Delicious(); public static final FT_Leaded LEADED = new FT_Leaded(); + public static final FT_Unsiphonable UNSIPHONABLE = new FT_Unsiphonable(); public static void init() { @@ -202,11 +203,11 @@ public class Fluids { */ NONE = new FluidType("NONE", 0x888888, 0, 0, 0, EnumSymbol.NONE); - WATER = new FluidType("WATER", 0x3333FF, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); - STEAM = new FluidType("STEAM", 0xe5e5e5, 3, 0, 0, EnumSymbol.NONE).setTemp(100).addTraits(GASEOUS); - HOTSTEAM = new FluidType("HOTSTEAM", 0xE7D6D6, 4, 0, 0, EnumSymbol.NONE).setTemp(300).addTraits(GASEOUS); - SUPERHOTSTEAM = new FluidType("SUPERHOTSTEAM", 0xE7B7B7, 4, 0, 0, EnumSymbol.NONE).setTemp(450).addTraits(GASEOUS); - ULTRAHOTSTEAM = new FluidType("ULTRAHOTSTEAM", 0xE39393, 4, 0, 0, EnumSymbol.NONE).setTemp(600).addTraits(GASEOUS); + WATER = new FluidType("WATER", 0x3333FF, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, UNSIPHONABLE); + STEAM = new FluidType("STEAM", 0xe5e5e5, 3, 0, 0, EnumSymbol.NONE).setTemp(100).addTraits(GASEOUS, UNSIPHONABLE); + HOTSTEAM = new FluidType("HOTSTEAM", 0xE7D6D6, 4, 0, 0, EnumSymbol.NONE).setTemp(300).addTraits(GASEOUS, UNSIPHONABLE); + SUPERHOTSTEAM = new FluidType("SUPERHOTSTEAM", 0xE7B7B7, 4, 0, 0, EnumSymbol.NONE).setTemp(450).addTraits(GASEOUS, UNSIPHONABLE); + ULTRAHOTSTEAM = new FluidType("ULTRAHOTSTEAM", 0xE39393, 4, 0, 0, EnumSymbol.NONE).setTemp(600).addTraits(GASEOUS, UNSIPHONABLE); COOLANT = new FluidType("COOLANT", 0xd8fcff, 1, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); LAVA = new FluidType("LAVA", 0xFF3300, 4, 0, 0, EnumSymbol.NOWATER).setTemp(1200).addTraits(LIQUID, VISCOUS); DEUTERIUM = new FluidType("DEUTERIUM", 0x0000FF, 3, 4, 0, EnumSymbol.NONE).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), GASEOUS); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java index de7ddc591..c840d3a89 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java @@ -38,6 +38,7 @@ public abstract class FluidTrait { traitNameMap.put("pheromone", FT_Pheromone.class); traitNameMap.put("noid", FT_NoID.class); traitNameMap.put("nocontainer", FT_NoContainer.class); + traitNameMap.put("unsiphonable", FT_Unsiphonable.class); } /** Important information that should always be displayed */ diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java index f62cd456e..0c5026534 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java @@ -62,6 +62,12 @@ public class FluidTraitSimple { } } + public static class FT_Unsiphonable extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.BLUE + "[Ignored by siphon]"); + } + } + public static class FT_NoID extends FluidTrait { } public static class FT_NoContainer extends FluidTrait { } } diff --git a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java index 59f9b1ee5..2a7fc95ce 100644 --- a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java +++ b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java @@ -2,14 +2,11 @@ package com.hbm.items.machine; import com.hbm.util.CompatExternal; -import java.util.List; -import java.util.Arrays; - import com.hbm.inventory.FluidContainer; import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Unsiphonable; import com.hbm.items.ModItems; import com.hbm.items.tool.ItemPipette; @@ -22,15 +19,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class ItemFluidSiphon extends Item { - - private static List IGNORED_FLUIDS = Arrays.asList( - Fluids.WATER, - Fluids.SPENTSTEAM, - Fluids.STEAM, - Fluids.HOTSTEAM, - Fluids.SUPERHOTSTEAM, - Fluids.ULTRAHOTSTEAM - ); @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { @@ -50,11 +38,12 @@ public class ItemFluidSiphon extends Item { // After we successfully siphon any fluid from a tank, we stop further processing, multiple fluid types require multiple clicks for (FluidTank tank : tanks) { if (tank.getFill() <= 0) continue; - if (IGNORED_FLUIDS.contains(tank.getTankType())) continue; ItemStack availablePipette = null; FluidType tankType = tank.getTankType(); + if (tankType.hasTrait(FT_Unsiphonable.class)) continue; + for (int j = 0; j < player.inventory.mainInventory.length; j++) { ItemStack inventoryStack = player.inventory.mainInventory[j]; if (inventoryStack == null) continue;