@@ -18,14 +18,15 @@ import hellfirepvp.modularmachinery.common.util.MiscUtils
1818import ink.ikx.mmce.common.assembly.MachineAssembly
1919import ink.ikx.mmce.common.utils.FluidUtils
2020import ink.ikx.mmce.common.utils.StackUtils
21+ import ink.ikx.mmce.common.utils.StructureIngredient
2122import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap
2223import it.unimi.dsi.fastutil.objects.ObjectArrayList
2324import net.minecraft.block.BlockLiquid
2425import net.minecraft.block.material.Material
2526import net.minecraft.block.state.IBlockState
2627import net.minecraft.entity.player.EntityPlayerMP
28+ import net.minecraft.entity.player.InventoryPlayer
2729import net.minecraft.init.Blocks
28- import net.minecraft.init.Items
2930import net.minecraft.item.ItemStack
3031import net.minecraft.util.EnumFacing
3132import net.minecraft.util.Tuple
@@ -38,38 +39,72 @@ import net.minecraftforge.fluids.BlockFluidBase
3839import net.minecraftforge.fluids.FluidRegistry
3940import net.minecraftforge.fluids.FluidStack
4041import net.minecraftforge.fluids.FluidUtil
41- import net.minecraftforge.fluids.UniversalBucket
4242import net.minecraftforge.fluids.capability.IFluidHandlerItem
4343import java.util.ArrayDeque
4444import java.util.Queue
4545import java.util.function.Function
4646
4747class AssemblyBlockArray : BlockArray {
4848
49+ private data class FluidInventory (val slot : Int , val fluid : IFluidHandlerItem )
50+
4951 companion object {
5052 private val material =
5153 Object2ReferenceOpenHashMap <BlockInformation , ObjectArrayList <Tuple <Ingredient , IBlockState >>>()
5254
5355 /* *
5456 * MachineAssembly#getFluidHandlerItems(List)
5557 */
56- private fun getFluidHandlerItems (inventory : List <ItemStack >): List <IFluidHandlerItem > {
57- val fluidHandlers = ObjectArrayList <IFluidHandlerItem >()
58- for (invStack in inventory) {
59- val item = invStack.item
60- if (item is UniversalBucket || item == = Items .LAVA_BUCKET || item == = Items .WATER_BUCKET ) {
61- continue
62- }
58+ private fun getFluidHandlerItems (inventory : List <ItemStack >): List <FluidInventory > {
59+ val fluidHandlers = ObjectArrayList <FluidInventory >()
60+ for ((index, invStack) in inventory.withIndex()) {
6361 if (! FluidUtils .isFluidHandler(invStack)) {
6462 continue
6563 }
6664 val fluidHandler = FluidUtil .getFluidHandler(invStack)
6765 if (fluidHandler != null ) {
68- fluidHandlers.add(fluidHandler)
66+ fluidHandlers.add(FluidInventory (index, fluidHandler) )
6967 }
7068 }
7169 return fluidHandlers
7270 }
71+
72+ private fun consumeInventoryFluid (
73+ required : FluidStack ,
74+ fluidHandlers : List <FluidInventory >,
75+ player : InventoryPlayer ?
76+ ): Boolean {
77+ for ((slot, fluidHandler) in fluidHandlers) {
78+ val drained = fluidHandler.drain(required.copy(), false )
79+ if (drained != null && drained.containsFluid(required)) {
80+ fluidHandler.drain(required.copy(), true )
81+ player?.setInventorySlotContents(slot, fluidHandler.container)
82+ return true
83+ }
84+ }
85+
86+ return false
87+ }
88+
89+ fun searchAndRemoveContainFluid (
90+ inventory : MutableList <ItemStack >,
91+ fluidIngredients : MutableList <StructureIngredient .FluidIngredient >
92+ ) {
93+ val fluidHandlers = getFluidHandlerItems(inventory)
94+ val fluidIngredientIter: MutableIterator <StructureIngredient .FluidIngredient > = fluidIngredients.iterator()
95+
96+ while (fluidIngredientIter.hasNext()) {
97+ val fluidIngredient = fluidIngredientIter.next()
98+
99+ for (tuple in fluidIngredient.ingredientList()) {
100+ val required = tuple.getFirst() as FluidStack
101+ if (consumeInventoryFluid(required, fluidHandlers, null )) {
102+ fluidIngredientIter.remove()
103+ break
104+ }
105+ }
106+ }
107+ }
73108 }
74109
75110 var usingAE = false
@@ -197,9 +232,10 @@ class AssemblyBlockArray : BlockArray {
197232 return OperatingStatus .SUCCESS
198233 }
199234 } else {
200- if (MachineAssembly . consumeInventoryFluid(
235+ if (consumeInventoryFluid(
201236 ingredient.fluidStack,
202- fluidInventory
237+ fluidInventory,
238+ player.inventory
203239 )
204240 ) {
205241 placeBlock(player, world, pos, ingredientAndIBlockState.getSecond())
0 commit comments