When storage bus receive items, try to put them into existing slots first
This commit is contained in:
parent
2597a8b15b
commit
cbc1c634d2
@ -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))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user