Skip to content

Commit 81d03db

Browse files
committed
允许高级结构构造器使用原版桶搭建流体
1 parent e7c31a0 commit 81d03db

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
lines changed

src/main/java/github/kasuminova/novaeng/common/util/AssemblyBlockArray.kt

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ import hellfirepvp.modularmachinery.common.util.MiscUtils
1818
import ink.ikx.mmce.common.assembly.MachineAssembly
1919
import ink.ikx.mmce.common.utils.FluidUtils
2020
import ink.ikx.mmce.common.utils.StackUtils
21+
import ink.ikx.mmce.common.utils.StructureIngredient
2122
import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap
2223
import it.unimi.dsi.fastutil.objects.ObjectArrayList
2324
import net.minecraft.block.BlockLiquid
2425
import net.minecraft.block.material.Material
2526
import net.minecraft.block.state.IBlockState
2627
import net.minecraft.entity.player.EntityPlayerMP
28+
import net.minecraft.entity.player.InventoryPlayer
2729
import net.minecraft.init.Blocks
28-
import net.minecraft.init.Items
2930
import net.minecraft.item.ItemStack
3031
import net.minecraft.util.EnumFacing
3132
import net.minecraft.util.Tuple
@@ -38,38 +39,72 @@ import net.minecraftforge.fluids.BlockFluidBase
3839
import net.minecraftforge.fluids.FluidRegistry
3940
import net.minecraftforge.fluids.FluidStack
4041
import net.minecraftforge.fluids.FluidUtil
41-
import net.minecraftforge.fluids.UniversalBucket
4242
import net.minecraftforge.fluids.capability.IFluidHandlerItem
4343
import java.util.ArrayDeque
4444
import java.util.Queue
4545
import java.util.function.Function
4646

4747
class 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())

src/main/java/github/kasuminova/novaeng/common/util/NEWMachineAssemblyManager.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ class NEWMachineAssemblyManager {
117117
autoAECrafting: Boolean
118118
): Miss2ListPair {
119119
if (player.isCreative) return emptyMiss2ListPair
120-
val inventory = player.inventory.mainInventory.stream().map { obj: ItemStack -> obj.copy() }
120+
val inventory = player.inventory.mainInventory.stream().map { it.copy() }
121121
.collect(Collectors.toCollection { ObjectArrayList() })
122122
val itemIngredientList = ingredient.itemIngredient()
123123
val fluidIngredientList = ingredient.fluidIngredient()
124124
MachineAssembly.searchAndRemoveContainItem(inventory, itemIngredientList)
125-
MachineAssembly.searchAndRemoveContainFluid(inventory, fluidIngredientList)
125+
AssemblyBlockArray.searchAndRemoveContainFluid(inventory, fluidIngredientList)
126126
if (itemIngredientList.isEmpty() && fluidIngredientList.isEmpty()) {
127127
return emptyMiss2ListPair
128128
} else {

0 commit comments

Comments
 (0)