diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt index 6084ce9d9..4f9d5ca5d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt @@ -8,7 +8,8 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.SkinElement -import ru.dbotthepony.mc.otm.container.nonEmptyIterator +import ru.dbotthepony.mc.otm.container.iterator +import ru.dbotthepony.mc.otm.core.nonEmpty import ru.dbotthepony.mc.otm.registry.MRegistry import kotlin.collections.ArrayList @@ -260,7 +261,7 @@ class AndroidResearchBuilder( for (item in items) { var required = item.count - val iterator = capability.ply.inventory.nonEmptyIterator() + val iterator = capability.ply.inventory.iterator().nonEmpty() for (invItem in iterator) { if (ItemStack.isSameItemSameTags(invItem, item)) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt index 7ab535bbe..3e20f6baa 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt @@ -9,7 +9,6 @@ import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.block.matter.PatternStorageBlock import net.minecraft.nbt.CompoundTag import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.items.CapabilityItemHandler import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu @@ -25,13 +24,12 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.matter.* import ru.dbotthepony.mc.otm.container.forEachCapability -import ru.dbotthepony.mc.otm.container.iterator +import ru.dbotthepony.mc.otm.core.iterator import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.set import java.util.ArrayList diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt index 4e0ede534..039326589 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt @@ -1,8 +1,6 @@ package ru.dbotthepony.mc.otm.capability import net.minecraft.core.Direction -import net.minecraft.world.Container -import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack import net.minecraftforge.common.capabilities.ForgeCapabilities @@ -12,7 +10,7 @@ import net.minecraftforge.energy.IEnergyStorage import net.minecraftforge.fml.ModList import ru.dbotthepony.mc.otm.compat.mekanism.getMekanismEnergySided import ru.dbotthepony.mc.otm.compat.mekanism.mekanismEnergy -import ru.dbotthepony.mc.otm.container.iterator +import ru.dbotthepony.mc.otm.core.iterator import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.orNull 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 73036c966..01dcca7c0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt @@ -25,4 +25,6 @@ class ContainerIterator(private val container: Container) : MutableIterator 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) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt deleted file mode 100644 index e1ce0b281..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt +++ /dev/null @@ -1,147 +0,0 @@ -package ru.dbotthepony.mc.otm.container - -import net.minecraft.world.Container -import net.minecraft.world.item.ItemStack -import net.minecraftforge.common.capabilities.Capability -import net.minecraftforge.common.capabilities.ICapabilityProvider -import ru.dbotthepony.mc.otm.core.ifPresentK - -open class NonEmptyItemStackIterator(protected open val parent: Iterator) : Iterator { - private var itemStack: ItemStack? = null - private var searched = false - - private fun search() { - searched = true - - if (itemStack != null) { - return - } - - for (stack in parent) { - if (!stack.isEmpty) { - itemStack = stack - return - } - } - } - - override fun hasNext(): Boolean { - if (!searched) { - search() - } - - return itemStack != null - } - - override fun next(): ItemStack { - if (!searched) { - search() - } - - val itemStack = itemStack ?: throw IllegalStateException("No next element") - this.itemStack = null - this.searched = false - return itemStack - } -} - -class NonEmptyMutableItemStackIterator(override val parent: MutableIterator) : NonEmptyItemStackIterator(parent), MutableIterator { - override fun remove() { - parent.remove() - } -} - -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() = ContainerIterator(this) -fun Iterator.nonEmpty() = NonEmptyItemStackIterator(this) -fun MutableIterator.nonEmpty() = NonEmptyMutableItemStackIterator(this) -fun Container.nonEmptyIterator() = iterator().nonEmpty() - -fun Container.iterator(cap: Capability) = CapabilityIterator(nonEmptyIterator(), cap) - -fun

Iterator

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

MutableIterator

.filtered(cap: Capability) = MutableCapabilityIterator(this, cap) - -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 nonEmptyIterator()) { - lambda(value) - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/CapabilityIterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CapabilityIterators.kt new file mode 100644 index 000000000..c8c756788 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CapabilityIterators.kt @@ -0,0 +1,59 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.world.Container +import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ICapabilityProvider +import ru.dbotthepony.mc.otm.container.iterator + +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) \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ItemStackIterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ItemStackIterators.kt new file mode 100644 index 000000000..01bbe5fbc --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ItemStackIterators.kt @@ -0,0 +1,51 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.world.item.ItemStack + +open class NonEmptyItemStackIterator(protected open val parent: Iterator) : Iterator { + private var itemStack: ItemStack? = null + private var searched = false + + private fun search() { + searched = true + + if (itemStack != null) { + return + } + + for (stack in parent) { + if (!stack.isEmpty) { + itemStack = stack + return + } + } + } + + override fun hasNext(): Boolean { + if (!searched) { + search() + } + + return itemStack != null + } + + override fun next(): ItemStack { + if (!searched) { + search() + } + + val itemStack = itemStack ?: throw IllegalStateException("No next element") + this.itemStack = null + this.searched = false + return itemStack + } +} + +class NonEmptyMutableItemStackIterator(override val parent: MutableIterator) : NonEmptyItemStackIterator(parent), MutableIterator { + override fun remove() { + parent.remove() + } +} + +fun Iterator.nonEmpty() = NonEmptyItemStackIterator(this) +fun MutableIterator.nonEmpty() = NonEmptyMutableItemStackIterator(this) \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt index a323f0d7a..c25b015ed 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt @@ -22,7 +22,7 @@ import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.core.itemStackIterator -import ru.dbotthepony.mc.otm.container.nonEmpty +import ru.dbotthepony.mc.otm.core.nonEmpty import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.network.GenericNetworkChannel import ru.dbotthepony.mc.otm.network.MatteryPacket diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt index 47da9e5e8..789d5c7ac 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt @@ -11,7 +11,7 @@ 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.container.nonEmptyIterator +import ru.dbotthepony.mc.otm.core.nonEmpty import ru.dbotthepony.mc.otm.menu.data.INetworkedItemViewProvider import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView import ru.dbotthepony.mc.otm.network.MenuNetworkChannel @@ -198,7 +198,7 @@ class ItemMonitorMenu @JvmOverloads constructor( var maxStack = 64 if (settings.craftingAmount == ItemMonitorPlayerSettings.Amount.FULL) { - for (gridItem in tile.craftingGrid.nonEmptyIterator()) { + for (gridItem in tile.craftingGrid.iterator().nonEmpty()) { if (!gridItem.isStackable) { hasUnstackables = true break @@ -207,7 +207,7 @@ class ItemMonitorMenu @JvmOverloads constructor( } else { maxStack = 0 - for (gridItem in tile.craftingGrid.nonEmptyIterator()) { + for (gridItem in tile.craftingGrid.iterator().nonEmpty()) { maxStack = maxStack.coerceAtLeast(gridItem.maxStackSize) } }