When storage bus receive items, try to put them into existing slots first

This commit is contained in:
DBotThePony 2022-06-16 15:26:13 +07:00
parent 2597a8b15b
commit cbc1c634d2
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.block.entity.storage
import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap
import it.unimi.dsi.fastutil.ints.IntArraySet
import it.unimi.dsi.fastutil.longs.Long2ObjectAVLTreeMap
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
@ -235,6 +236,38 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
}
}
private inner class PrioritizedSlotIterator(tuple: TrackedTuple?) : Iterator<Int> {
private val tupleIndexes = IntArraySet()
init {
if (tuple != null) {
for (child in tuple.children) {
tupleIndexes.add(child.key)
}
}
}
private val seenIterator = tupleIndexes.iterator()
private val regularIterator = (0 until parent.slots).iterator()
override fun hasNext(): Boolean {
return seenIterator.hasNext() || regularIterator.hasNext()
}
override fun next(): Int {
if (seenIterator.hasNext())
return seenIterator.nextInt()
var value = regularIterator.nextInt()
while (tupleIndexes.remove(value)) {
value = regularIterator.nextInt()
}
return value
}
}
private var snapshot: EventsSnapshot? = null
override val storageType: StorageStackType<ItemStackWrapper>
@ -435,7 +468,7 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
leftover.count -= additional
}
for (slot in 0 until parent.slots) {
for (slot in PrioritizedSlotIterator(tuples[stack.key()])) {
val oldCount = leftover.count
leftover = ItemStackWrapper(parent.insertItem(slot, leftover.stack, simulate))