diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt index 17a67f16b..0f4c331fe 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt @@ -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 { + 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 @@ -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))