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 d8e4b5851..b2ba96f32 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 @@ -2,8 +2,6 @@ package ru.dbotthepony.mc.otm.block.entity.storage import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap import it.unimi.dsi.fastutil.ints.IntAVLTreeSet -import it.unimi.dsi.fastutil.ints.IntArraySet -import it.unimi.dsi.fastutil.longs.Long2ObjectAVLTreeMap import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.nbt.CompoundTag @@ -44,6 +42,7 @@ import java.lang.ref.WeakReference import java.math.BigInteger import java.util.* import java.util.stream.Stream +import kotlin.NoSuchElementException import kotlin.collections.ArrayList import kotlin.collections.HashMap @@ -251,21 +250,47 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter private val seenIterator = tupleIndexes.iterator() private val regularIterator = (0 until parent.slots).iterator() + private var storedValue = -1 + override fun hasNext(): Boolean { - return seenIterator.hasNext() || regularIterator.hasNext() + return seenIterator.hasNext() || storedValue != -1 + } + + private fun advance() { + if (!regularIterator.hasNext()) { + storedValue = -1 + return + } + + var value = regularIterator.nextInt() + var removed = tupleIndexes.remove(value) + + while (removed && regularIterator.hasNext()) { + value = regularIterator.nextInt() + removed = tupleIndexes.remove(value) + } + + if (!removed) { + storedValue = value + } } override fun next(): Int { - if (seenIterator.hasNext()) - return seenIterator.nextInt() + if (storedValue != -1) { + val value = storedValue + advance() + return value + } else if (seenIterator.hasNext()) { + val value = seenIterator.nextInt() - var value = regularIterator.nextInt() + if (!seenIterator.hasNext()) { + advance() + } - while (tupleIndexes.remove(value)) { - value = regularIterator.nextInt() + return value } - return value + throw NoSuchElementException("Reached end of iteration") } }