diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt index 39365b5ea..7c7be1288 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt @@ -18,14 +18,15 @@ import net.minecraft.world.level.block.Block import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity import ru.dbotthepony.mc.otm.capability.matter.* import ru.dbotthepony.mc.otm.container.HandlerFilter +import ru.dbotthepony.mc.otm.container.iterator import ru.dbotthepony.mc.otm.container.stream -import ru.dbotthepony.mc.otm.core.collect.iterator +import ru.dbotthepony.mc.otm.core.collect.filterNotNull +import ru.dbotthepony.mc.otm.core.collect.map import ru.dbotthepony.mc.otm.core.filterNotNull import ru.dbotthepony.mc.otm.core.isNotEmpty import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.graph.matter.SimpleMatterNode import ru.dbotthepony.mc.otm.registry.MBlockEntities -import java.util.ArrayList import java.util.stream.Stream @MethodsReturnNonnullByDefault @@ -110,7 +111,7 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override val patternCapacity: Int get() { var stored = 0L - for ((_, pattern) in this.container.iterator(MatteryCapability.PATTERN)) + for (pattern in this.container.iterator().map { it.getCapability(MatteryCapability.PATTERN).orNull() }.filterNotNull()) stored += pattern.patternCapacity.toLong() return if (stored > Int.MAX_VALUE) Int.MAX_VALUE else stored.toInt() @@ -119,7 +120,7 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override val storedPatterns: Int get() { var stored = 0L - for ((_, pattern) in this.container.iterator(MatteryCapability.PATTERN)) + for (pattern in this.container.iterator().map { it.getCapability(MatteryCapability.PATTERN).orNull() }.filterNotNull()) stored += pattern.storedPatterns.toLong() return if (stored > Int.MAX_VALUE) Int.MAX_VALUE else stored.toInt() @@ -131,8 +132,8 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } override fun insertPattern(pattern: PatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus { - for (pair in this.container.iterator(MatteryCapability.PATTERN)) { - val status = pair.second.insertPattern(pattern, onlyUpdate, simulate) + for (spattern in this.container.iterator().map { it.getCapability(MatteryCapability.PATTERN).orNull() }.filterNotNull()) { + val status = spattern.insertPattern(pattern, onlyUpdate, simulate) if (!status.isFailed) { if (!simulate) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt index 87a193247..1269f480a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt @@ -43,4 +43,10 @@ class ContainerIterator(private val container: Container) : IContainerIterator { } } -fun Container.iterator() = ContainerIterator(this) +fun Container.iterator(): IContainerIterator { + return if (this is MatteryContainer) { + iterator() + } else { + ContainerIterator(this) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt index 1029bdbff..9b79113b9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt @@ -9,11 +9,8 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap import net.minecraft.world.Container import net.minecraft.world.item.ItemStack import net.minecraft.world.item.enchantment.EnchantmentHelper.hasVanishingCurse -import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.fluids.capability.IFluidHandler import ru.dbotthepony.mc.otm.core.addAll -import ru.dbotthepony.mc.otm.core.collect.iterator -import ru.dbotthepony.mc.otm.core.collect.nonEmpty import ru.dbotthepony.mc.otm.core.isNotEmpty import kotlin.math.roundToInt @@ -98,42 +95,6 @@ fun Container.vanishCursedItems() { } } -inline fun Container.forEach(cap: Capability, consumer: (Pair) -> Unit) { - for (value in iterator(cap)) { - consumer(value) - } -} - -inline fun Container.forEach(cap: Capability, consumer: (ItemStack, T) -> Unit) { - for ((a, b) in iterator(cap)) { - consumer(a, b) - } -} - -inline fun Container.forEachItem(cap: Capability, consumer: (ItemStack) -> Unit) { - for (pair in iterator(cap)) { - consumer(pair.first) - } -} - -inline fun Container.forEachCapability(cap: Capability, consumer: (T) -> Unit) { - for (pair in iterator(cap)) { - consumer(pair.second) - } -} - -inline fun Container.forEach(lambda: (ItemStack) -> Unit) { - for (value in iterator()) { - lambda(value) - } -} - -inline fun Container.forEachNonEmpty(lambda: (ItemStack) -> Unit) { - for (value in iterator().nonEmpty()) { - lambda(value) - } -} - fun Container.balance(slots: IntSet, checkForEmpty: Boolean = true) { if (slots.isEmpty() || checkForEmpty && !slots.any { getItem(it).isNotEmpty }) return diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/CapabilityIterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/CapabilityIterators.kt deleted file mode 100644 index eb4760384..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/CapabilityIterators.kt +++ /dev/null @@ -1,60 +0,0 @@ -package ru.dbotthepony.mc.otm.core.collect - -import net.minecraft.world.Container -import net.minecraftforge.common.capabilities.Capability -import net.minecraftforge.common.capabilities.ICapabilityProvider -import ru.dbotthepony.mc.otm.container.iterator -import ru.dbotthepony.mc.otm.core.ifPresentK - -open class CapabilityIterator

(protected open val parent: Iterator

, private val cap: Capability) : Iterator> { - private var provider: P? = null - private var capability: T? = null - private var searched = false - - private fun search() { - searched = true - - if (provider != null) { - return - } - - for (provider in parent) { - provider.getCapability(cap).ifPresentK { - this.provider = provider - capability = it - return - } - } - } - - override fun hasNext(): Boolean { - if (!searched) { - search() - } - - return provider != null - } - - override fun next(): Pair { - if (!searched) { - search() - } - - val provider = provider ?: throw IllegalStateException("No next element") - val capability = capability ?: throw IllegalStateException("No next element") - this.provider = null - this.capability = null - this.searched = false - return provider to capability - } -} - -class MutableCapabilityIterator

(override val parent: MutableIterator

, cap: Capability) : CapabilityIterator(parent, cap), MutableIterator> { - override fun remove() { - parent.remove() - } -} - -fun Container.iterator(cap: Capability) = CapabilityIterator(iterator().nonEmpty(), cap) -fun

Iterator

.filtered(cap: Capability) = CapabilityIterator(this, cap) -fun

MutableIterator

.filtered(cap: Capability) = MutableCapabilityIterator(this, cap) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/ItemStackIterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/ItemStackIterators.kt deleted file mode 100644 index ea38e5fec..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/ItemStackIterators.kt +++ /dev/null @@ -1,5 +0,0 @@ -package ru.dbotthepony.mc.otm.core.collect - -import net.minecraft.world.item.ItemStack - -fun Iterator.nonEmpty() = FilteredIterator(this) { !it.isEmpty } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/storage/ItemMonitorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/storage/ItemMonitorMenu.kt index fe5cb8824..c5941db23 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/storage/ItemMonitorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/storage/ItemMonitorMenu.kt @@ -5,13 +5,11 @@ import net.minecraft.world.Container import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player -import net.minecraft.world.inventory.Slot import net.minecraft.world.item.ItemStack import net.minecraftforge.network.PacketDistributor import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorBlockEntity import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorPlayerSettings import ru.dbotthepony.mc.otm.container.get -import ru.dbotthepony.mc.otm.core.collect.nonEmpty import ru.dbotthepony.mc.otm.menu.MatteryPoweredMenu import ru.dbotthepony.mc.otm.menu.MatterySlot import ru.dbotthepony.mc.otm.menu.data.INetworkedItemViewProvider @@ -21,7 +19,6 @@ import ru.dbotthepony.mc.otm.registry.MMenus import ru.dbotthepony.mc.otm.storage.* import java.util.* - private class ResultSlot(container: Container) : MatterySlot(container, 0) { override fun mayPlace(itemStack: ItemStack): Boolean { return false @@ -198,7 +195,7 @@ class ItemMonitorMenu @JvmOverloads constructor( var maxStack = 64 if (settings.craftingAmount == ItemMonitorPlayerSettings.Amount.FULL) { - for (gridItem in tile.craftingGrid.iterator().nonEmpty()) { + for (gridItem in tile.craftingGrid.iterator()) { if (!gridItem.isStackable) { hasUnstackables = true break @@ -207,7 +204,7 @@ class ItemMonitorMenu @JvmOverloads constructor( } else { maxStack = 0 - for (gridItem in tile.craftingGrid.iterator().nonEmpty()) { + for (gridItem in tile.craftingGrid.iterator()) { maxStack = maxStack.coerceAtLeast(gridItem.maxStackSize) } }