From e6b8b9b409265df8e00b2e6d546701ba98b5fc00 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 00:00:07 +0700 Subject: [PATCH] Clean up container iterators and move container extensions --- .../otm/datagen/models/MatteryModelBuilder.kt | 2 +- .../recipes/PlatePressFinishedRecipe.kt | 2 +- .../mc/otm/android/AndroidFeature.kt | 2 +- .../mc/otm/android/AndroidResearch.kt | 2 +- .../mc/otm/android/AndroidResearchBuilder.kt | 4 +- .../mc/otm/android/feature/NanobotsArmor.kt | 2 +- .../android/feature/NanobotsRegeneration.kt | 2 +- .../otm/block/entity/CargoCrateBlockEntity.kt | 2 +- .../mc/otm/block/entity/MatteryBlockEntity.kt | 2 +- .../block/entity/MatteryPoweredBlockEntity.kt | 2 +- .../block/entity/MatteryWorkerBlockEntity.kt | 1 - .../block/entity/PatternStorageBlockEntity.kt | 18 +- .../otm/block/entity/PlatePressBlockEntity.kt | 2 +- .../entity/blackhole/BlackHoleBlockEntity.kt | 2 +- .../otm/block/entity/blackhole/Explosions.kt | 1 - .../entity/matter/MatterBottlerBlockEntity.kt | 2 +- .../matter/MatterCapacitorBankBlockEntity.kt | 2 +- .../matter/MatterDecomposerBlockEntity.kt | 2 +- .../matter/MatterRecyclerBlockEntity.kt | 2 +- .../matter/MatterReplicatorBlockEntity.kt | 2 +- .../entity/storage/DriveRackBlockEntity.kt | 2 +- .../entity/storage/DriveViewerBlockEntity.kt | 2 +- .../entity/storage/ItemMonitorBlockEntity.kt | 4 +- .../StoragePowerSupplierBlockEntity.kt | 2 +- .../mc/otm/capability/EnergyStorageImpl.kt | 2 +- .../ru/dbotthepony/mc/otm/capability/Ext.kt | 1 + .../capability/drive/AbstractMatteryDrive.kt | 2 +- .../otm/capability/drive/ItemMatteryDrive.kt | 2 +- .../capability/matter/MatterHandlerImpl.kt | 2 +- .../ru/dbotthepony/mc/otm/container/Ext.kt | 69 +++++++ .../mc/otm/container/ItemFilter.kt | 2 +- .../dbotthepony/mc/otm/container/Iterators.kt | 188 ++++++++++++------ .../mc/otm/container/MatteryContainer.kt | 133 +------------ .../kotlin/ru/dbotthepony/mc/otm/core/Ext.kt | 4 - .../dbotthepony/mc/otm/item/MatterDustItem.kt | 2 +- .../mc/otm/menu/ItemMonitorMenu.kt | 7 +- .../ru/dbotthepony/mc/otm/recipe/Helpers.kt | 2 +- .../mc/otm/recipe/PlatePressRecipe.kt | 2 +- .../mc/otm/saveddata/SavedCountingMap.kt | 2 +- 39 files changed, 252 insertions(+), 234 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt index 6fa6c91d5..2161c17e1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt @@ -9,7 +9,7 @@ import net.minecraft.core.Direction import net.minecraft.resources.ResourceLocation import net.minecraftforge.client.model.generators.ModelBuilder import net.minecraftforge.common.data.ExistingFileHelper -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set data class TextureSize(val width: Float, val height: Float) { constructor(arr: JsonArray) : this(arr[0].asFloat, arr[1].asFloat) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt index 89e9017b7..63bc0b607 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt @@ -7,7 +7,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.RecipeSerializer import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe import ru.dbotthepony.mc.otm.recipe.PlatePressRecipeFactory -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class PlatePressFinishedRecipe(private val recipe: PlatePressRecipe) : FinishedRecipe { override fun serializeRecipeData(it: JsonObject) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt index 8d2995144..c66373f78 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt @@ -5,7 +5,7 @@ import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.event.entity.living.LivingHurtEvent import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.core.readNbt -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.writeNbt import java.io.InputStream import java.io.OutputStream diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt index 877147834..265b2300d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt @@ -8,7 +8,7 @@ import net.minecraftforge.common.util.INBTSerializable import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.core.readNbt -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.writeNbt import java.io.InputStream import java.io.OutputStream 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 11404474b..6084ce9d9 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,7 @@ 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.iterator +import ru.dbotthepony.mc.otm.container.nonEmptyIterator import ru.dbotthepony.mc.otm.registry.MRegistry import kotlin.collections.ArrayList @@ -260,7 +260,7 @@ class AndroidResearchBuilder( for (item in items) { var required = item.count - val iterator = capability.ply.inventory.iterator() + val iterator = capability.ply.inventory.nonEmptyIterator() for (invItem in iterator) { if (ItemStack.isSameItemSameTags(invItem, item)) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt index 28adbae4e..02634802f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt @@ -9,7 +9,7 @@ import ru.dbotthepony.mc.otm.capability.extractEnergyInnerExact import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import kotlin.math.roundToInt class NanobotsArmor(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_ARMOR, android) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt index aa25381df..035e9682a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt @@ -8,7 +8,7 @@ import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import kotlin.math.roundToInt class NanobotsRegeneration(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_REGENERATION, android) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt index 8c1017719..16bf06923 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt @@ -17,7 +17,7 @@ import ru.dbotthepony.mc.otm.block.CargoCrateBlock import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.menu.CargoCrateMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class CargoCrateBlockEntity( p_155229_: BlockPos, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt index b3015f563..101207242 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt @@ -24,7 +24,7 @@ import net.minecraft.world.level.Level import net.minecraftforge.common.capabilities.Capability import ru.dbotthepony.mc.otm.addPreWorldTickerOnce import ru.dbotthepony.mc.otm.core.ifHas -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : BlockEntity(p_155228_, p_155229_, p_155230_), MenuProvider { var customDisplayName: Component? = null diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt index 1a6992a54..dc51e3aec 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt @@ -13,7 +13,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.core.ifPresentK -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set abstract class MatteryPoweredBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : MatteryBlockEntity(p_155228_, p_155229_, p_155230_) { abstract val energy: BlockEnergyStorageImpl diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt index 8444518c4..7c1c07db1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt @@ -8,7 +8,6 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.block.Block import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.map -import ru.dbotthepony.mc.otm.core.set private fun isReason(status: Any?, reason: Any) = status == null || status == reason 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 ea0ff7f61..7ab535bbe 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 @@ -21,13 +21,17 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraftforge.common.capabilities.Capability +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.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 @@ -130,9 +134,9 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override fun getCapability(cap: Capability, side: Direction?): LazyOptional { if (valid) { - if (cap === MatteryCapability.PATTERN) return resolverPatterns.cast() - if (cap === MatteryCapability.MATTER_NODE) return resolverNode.cast() - if (cap === CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return resolverItem.get().cast() + if (cap == MatteryCapability.PATTERN) return resolverPatterns.cast() + if (cap == MatteryCapability.MATTER_NODE) return resolverNode.cast() + if (cap == ForgeCapabilities.ITEM_HANDLER) return resolverItem.get().cast() } return super.getCapability(cap, side) @@ -147,14 +151,14 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override val storedPatterns: Collection get() { val list = ArrayList() - patterns.consumeCapability(MatteryCapability.PATTERN) { capability: IPatternStorage -> list.addAll(capability.storedPatterns) } + patterns.forEachCapability(MatteryCapability.PATTERN) { capability: IPatternStorage -> list.addAll(capability.storedPatterns) } return list } override val capacity: Int get() { var stored = 0L - for (pattern in patterns.capabilityIterator(MatteryCapability.PATTERN)) + for ((_, pattern) in patterns.iterator(MatteryCapability.PATTERN)) stored += pattern.capacity.toLong() return if (stored > Int.MAX_VALUE) Int.MAX_VALUE else stored.toInt() @@ -163,7 +167,7 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override val stored: Int get() { var stored = 0L - for (pattern in patterns.capabilityIterator(MatteryCapability.PATTERN)) + for ((_, pattern) in patterns.iterator(MatteryCapability.PATTERN)) stored += pattern.stored.toLong() return if (stored > Int.MAX_VALUE) Int.MAX_VALUE else stored.toInt() @@ -175,7 +179,7 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } override fun insertPattern(pattern: PatternState, only_update: Boolean, simulate: Boolean): PatternInsertStatus { - for (storage in patterns.capabilityIterator(MatteryCapability.PATTERN)) { + for ((_, storage) in patterns.iterator(MatteryCapability.PATTERN)) { val status = storage.insertPattern(pattern, only_update, simulate) if (!status.isFailed) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt index b11e4198a..11b53bd64 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt @@ -20,7 +20,7 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.menu.PlatePressMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MRecipes -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class PlatePressBlockEntity( p_155229_: BlockPos, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt index 9a9a0e7e5..4a2d7a605 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt @@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import kotlin.math.roundToInt import kotlin.math.sqrt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt index 6658bee64..128e2bd75 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt @@ -23,7 +23,6 @@ import ru.dbotthepony.mc.otm.block.BlockExplosionDebugger import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.Vector import ru.dbotthepony.mc.otm.registry.MRegistry -import ru.dbotthepony.mc.otm.core.set import java.util.* import kotlin.collections.ArrayList import kotlin.collections.HashMap diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt index 3df8e9272..b532fdfd9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt @@ -33,7 +33,7 @@ import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.MatterBottlerMenu import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.MATTER_BOTTLER, p_155229_, p_155230_), IMatterGraphNode { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt index 16a61ba03..32e578c82 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt @@ -28,7 +28,7 @@ import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph import ru.dbotthepony.mc.otm.menu.MatterCapacitorBankMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import javax.annotation.ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt index e0424ec1f..137f61053 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt @@ -26,7 +26,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainerFilter import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.getImpreciseFraction -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt index 32ad74dc3..f2a05c9bb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt @@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.item.MatterDustItem import ru.dbotthepony.mc.otm.core.map import ru.dbotthepony.mc.otm.menu.MatterRecyclerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.MATTER_RECYCLER, blockPos, blockState, ::Job), IMatterGraphNode { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt index ea4739a2a..dc507cba0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt @@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.matter.baselineComplexityReplicateTicks import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.menu.MatterReplicatorMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.MATTER_REPLICATOR, p_155229_, p_155230_, ::ReplicatorJob), IMatterGraphNode { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt index bdbf858b5..e6eccd271 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt @@ -22,7 +22,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.DriveRackMenu -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.storage.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt index d59a2ded3..550e0e9c0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt @@ -20,7 +20,7 @@ import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.menu.DriveViewerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import javax.annotation.ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt index eae1e3bd4..053f12a74 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt @@ -32,14 +32,14 @@ import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.container.MatteryContainer -import ru.dbotthepony.mc.otm.core.get +import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.graph.storage.BasicStorageGraphNode import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt index ab7eec48b..0f60e574a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt @@ -24,7 +24,7 @@ import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.menu.StoragePowerSupplierMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MNames -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class StoragePowerSupplierBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.STORAGE_POWER_SUPPLIER, blockPos, blockState) { override val defaultDisplayName: Component diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt index 661685bea..ea34cb555 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt @@ -15,7 +15,7 @@ import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.compat.mekanism.MatteryToMekanismEnergyWrapper import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.tagNotNull private enum class EnergyFlow { 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 171556ca2..314235255 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.capability import net.minecraft.core.Direction import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.player.Player import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.LazyOptional diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt index 66af62358..ba8b3f94c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt @@ -11,7 +11,7 @@ import ru.dbotthepony.mc.otm.core.BigInteger import ru.dbotthepony.mc.otm.core.isPositive import ru.dbotthepony.mc.otm.core.serializeNBT import ru.dbotthepony.mc.otm.core.ifHas -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.ArrayList diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt index f9b5eec28..34915f30c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt @@ -9,7 +9,7 @@ import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.core.BigInteger import ru.dbotthepony.mc.otm.core.serializeNBT -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.storage.IStorageTuple import ru.dbotthepony.mc.otm.storage.ItemStackWrapper import ru.dbotthepony.mc.otm.storage.StorageStackType diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt index 056bbfc91..957363eb0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt @@ -4,7 +4,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set open class MatterHandlerImpl @JvmOverloads constructor( protected val listener: Runnable?, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt new file mode 100644 index 000000000..4968ceb58 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt @@ -0,0 +1,69 @@ +package ru.dbotthepony.mc.otm.container + +import net.minecraft.world.Container +import net.minecraft.world.item.ItemStack + +operator fun Container.set(index: Int, value: ItemStack) = setItem(index, value) +operator fun Container.get(index: Int): ItemStack = getItem(index) + +fun Container.addItem(stack: ItemStack, range: IntRange, simulate: Boolean = false): ItemStack { + if (this is MatteryContainer) { + return this.addItem(stack, range, simulate) + } + + if (range.last >= containerSize || range.first < 0) + throw IllegalArgumentException("Invalid range: $range") + + if (stack.isEmpty) + return stack + + val copy = stack.copy() + + // двигаем в одинаковые слоты + for (slot in range) { + if (ItemStack.isSameItemSameTags(this[slot], copy)) { + val slotStack = this[slot] + val slotLimit = maxStackSize.coerceAtMost(slotStack.maxStackSize) + + if (slotStack.count < slotLimit) { + val newCount = (slotStack.count + copy.count).coerceAtMost(slotLimit) + val diff = newCount - slotStack.count + + if (!simulate) { + slotStack.count = newCount + setChanged() + } + + copy.shrink(diff) + + if (copy.isEmpty) { + return copy + } + } + } + } + + // двигаем в пустые слоты + for (slot in range) { + if (this[slot].isEmpty) { + val diff = copy.count.coerceAtMost(maxStackSize.coerceAtMost(copy.maxStackSize)) + + if (!simulate) { + val copyToPut = copy.copy() + copyToPut.count = diff + this[slot] = copyToPut + setChanged() + } + + copy.shrink(diff) + + if (copy.isEmpty) { + return copy + } + } + } + + return copy +} + +fun Container.addItem(stack: ItemStack, simulate: Boolean): ItemStack = addItem(stack, 0 until containerSize, simulate) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt index cca0c9991..a0bcb3fbc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt @@ -14,7 +14,7 @@ import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.MatteryMenu import ru.dbotthepony.mc.otm.network.MatteryPacket -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import java.util.Arrays import java.util.LinkedList import java.util.function.Supplier diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt index 4d80d79e6..815fc66b7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt @@ -3,95 +3,163 @@ package ru.dbotthepony.mc.otm.container import net.minecraft.world.Container import net.minecraft.world.item.ItemStack import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.core.ifPresentK import java.util.function.Consumer -class ContainerIteratorItemStack(private val container: Container) : MutableIterator, Iterable { - private var scanIndex = 0 - private var nextStack: ItemStack? = null - private var nextIndex = 0 +class ContainerIterator(private val container: Container) : MutableIterator { + private var index = 0 override fun hasNext(): Boolean { - if (scanIndex >= container.containerSize && nextStack == null) - return false - - while (nextStack == null && scanIndex < container.containerSize) { - val get = container.getItem(scanIndex) - - if (!get.isEmpty) { - nextStack = get - nextIndex = scanIndex - } - - scanIndex++ - } - - return nextStack != null + return index < container.containerSize } override fun next(): ItemStack { - if (!hasNext()) { - throw NoSuchElementException() + if (index >= container.containerSize) { + throw IllegalStateException("Already finished iterating") } - val nextStack = nextStack!! - this.nextStack = null - return nextStack + return container[index++] } override fun remove() { - container[nextIndex] = ItemStack.EMPTY - } - - override fun iterator(): Iterator { - return this - } - - fun consume(consumer: Consumer) { - for (t in this) { - consumer.accept(t) + if (index == 0) { + throw IllegalStateException("Never called next()") } + + container[index - 1] = ItemStack.EMPTY } } -fun Container.iterator() = ContainerIteratorItemStack(this) +fun Container.iterator() = ContainerIterator(this) -class ContainerIteratorCapability(private val container: Container, private val cap: Capability) : Iterator, Iterable { - private var index = 0 - private var nextStack: T? = null +class NonEmptyContainerIterator(container: Container) : MutableIterator { + private val parent = ContainerIterator(container) + 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 (index >= container.containerSize && nextStack == null) - return false + if (!searched) { + search() + } - while (nextStack == null && index < container.containerSize) { - val get = container.getItem(index) + return itemStack != null + } - if (!get.isEmpty) { - get.getCapability(cap).ifPresent { t: T -> nextStack = t } + override fun next(): ItemStack { + if (!searched) { + search() + } + + val itemStack = itemStack ?: throw IllegalStateException("No next element") + this.itemStack = null + this.searched = false + return itemStack + } + + override fun remove() { + parent.remove() + } +} + +fun Container.nonEmptyIterator() = NonEmptyContainerIterator(this) + +class ContainerIteratorCapability(container: Container, private val cap: Capability) : MutableIterator> { + private val parent = NonEmptyContainerIterator(container) + private var itemStack: ItemStack? = null + private var capability: T? = null + private var searched = false + + private fun search() { + searched = true + + if (itemStack != null) { + return + } + + for (item in parent) { + item.getCapability(cap).ifPresentK { + itemStack = item + capability = it + return } + } + } - index++ + override fun hasNext(): Boolean { + if (!searched) { + search() } - return nextStack != null + return itemStack != null } - override fun next(): T { - val nextStack = nextStack!! - this.nextStack = null - return nextStack - } - - override fun iterator(): Iterator { - return this - } - - fun consume(consumer: Consumer) { - for (t in this) { - consumer.accept(t) + override fun next(): Pair { + if (!searched) { + search() } + + val itemStack = itemStack ?: throw IllegalStateException("No next element") + val capability = capability ?: throw IllegalStateException("No next element") + this.itemStack = null + this.capability = null + this.searched = false + return itemStack to capability + } + + override fun remove() { + parent.remove() } } fun Container.iterator(cap: Capability) = ContainerIteratorCapability(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/container/MatteryContainer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt index fb41c3afe..f0b721bcd 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt @@ -8,12 +8,8 @@ import net.minecraft.world.Container import kotlin.jvm.JvmOverloads import net.minecraft.world.entity.player.Player import net.minecraft.world.level.block.entity.BlockEntity -import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.ifHas -import ru.dbotthepony.mc.otm.core.set import java.util.* -import java.util.function.Consumer @Suppress("UNUSED") open class MatteryContainer(val watcher: Runnable, private val size: Int) : Container, Iterable { @@ -71,7 +67,6 @@ open class MatteryContainer(val watcher: Runnable, private val size: Int) : Cont return } - // нам не интересен размер for (i in 0 until tag.size.coerceAtMost(size)) { slots[i] = ItemStack.of(tag[i] as CompoundTag) } @@ -80,46 +75,16 @@ open class MatteryContainer(val watcher: Runnable, private val size: Int) : Cont } fun deserializeNBT(tag: Tag?) { - if (tag is CompoundTag) { - deserializeNBT(tag) - } else if (tag is ListTag) { - deserializeNBT(tag) - } else { - Arrays.fill(slots, ItemStack.EMPTY) - setChanged() - } - } - - fun stacks(): ContainerIteratorItemStack { - return ContainerIteratorItemStack(this) - } - - fun forEachNonEmpty(consumer: (ItemStack) -> Unit) { - for (item in slots) { - if (!item.isEmpty) { - consumer(item) + when (tag) { + is CompoundTag -> deserializeNBT(tag) + is ListTag -> deserializeNBT(tag) + else -> { + Arrays.fill(slots, ItemStack.EMPTY) + setChanged() } } } - fun forEachNonEmpty(consumer: (ItemStack, Int) -> Unit) { - for (i in 0 until size) { - val item = slots[i] - - if (!item.isEmpty) { - consumer(item, i) - } - } - } - - fun capabilityIterator(cap: Capability): ContainerIteratorCapability { - return ContainerIteratorCapability(this, cap) - } - - fun consumeCapability(cap: Capability, consumer: Consumer) { - capabilityIterator(cap).consume(consumer) - } - open fun setChanged(slot: Int, new: ItemStack, old: ItemStack) { if (ignoreChangeNotifications == 0) watcher.run() } @@ -345,90 +310,6 @@ open class MatteryContainer(val watcher: Runnable, private val size: Int) : Cont } final override fun iterator(): MutableIterator { - return object : MutableIterator { - private var index = 0 - - override fun hasNext(): Boolean { - return index < size - } - - override fun next(): ItemStack { - if (index >= size) { - throw IllegalStateException("Already finished iterating") - } - - return slots[index++] - } - - override fun remove() { - if (index == 0) { - throw IllegalStateException("Never called next()") - } - - set(index - 1, ItemStack.EMPTY) - } - } + return ContainerIterator(this) } } - -fun Container.addItem(stack: ItemStack, range: IntRange, simulate: Boolean = false): ItemStack { - if (this is MatteryContainer) { - return this.addItem(stack, range, simulate) - } - - if (range.last >= containerSize || range.first < 0) - throw IllegalArgumentException("Invalid range: $range") - - if (stack.isEmpty) - return stack - - val copy = stack.copy() - - // двигаем в одинаковые слоты - for (slot in range) { - if (ItemStack.isSameItemSameTags(this[slot], copy)) { - val slotStack = this[slot] - val slotLimit = maxStackSize.coerceAtMost(slotStack.maxStackSize) - - if (slotStack.count < slotLimit) { - val newCount = (slotStack.count + copy.count).coerceAtMost(slotLimit) - val diff = newCount - slotStack.count - - if (!simulate) { - slotStack.count = newCount - setChanged() - } - - copy.shrink(diff) - - if (copy.isEmpty) { - return copy - } - } - } - } - - // двигаем в пустые слоты - for (slot in range) { - if (this[slot].isEmpty) { - val diff = copy.count.coerceAtMost(maxStackSize.coerceAtMost(copy.maxStackSize)) - - if (!simulate) { - val copyToPut = copy.copy() - copyToPut.count = diff - this[slot] = copyToPut - setChanged() - } - - copy.shrink(diff) - - if (copy.isEmpty) { - return copy - } - } - } - - return copy -} - -fun Container.addItem(stack: ItemStack, simulate: Boolean): ItemStack = addItem(stack, 0 until containerSize, simulate) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt index c9a9e6c94..668d540bf 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt @@ -10,7 +10,6 @@ import net.minecraft.nbt.ByteArrayTag import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.Tag import net.minecraft.network.FriendlyByteBuf -import net.minecraft.world.Container import net.minecraft.world.entity.Entity import net.minecraft.world.item.ItemStack import net.minecraft.world.phys.Vec3 @@ -220,9 +219,6 @@ fun FriendlyByteBuf.writeBigInteger(value: BigInteger) { fun FriendlyByteBuf.readBigInteger(byteLimit: Int = 128) = BigInteger(readByteArray(byteLimit)) -operator fun Container.set(index: Int, value: ItemStack) = setItem(index, value) -operator fun Container.get(index: Int): ItemStack = getItem(index) - operator fun IItemHandler.get(index: Int): ItemStack = getStackInSlot(index) operator fun JsonObject.set(s: String, value: JsonElement) = add(s, value) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt index 8461b09f3..e85d9e570 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt @@ -11,7 +11,7 @@ import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.matter.IMatterItem import ru.dbotthepony.mc.otm.matter.MatterTuple -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class MatterDustItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB).stacksTo(64)), IMatterItem { private fun matter(stack: ItemStack): ImpreciseFraction { 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 f19022acb..41d888b5f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt @@ -10,7 +10,8 @@ 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.core.get +import ru.dbotthepony.mc.otm.container.get +import ru.dbotthepony.mc.otm.container.nonEmptyIterator import ru.dbotthepony.mc.otm.menu.data.INetworkedItemViewProvider import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView import ru.dbotthepony.mc.otm.network.MenuNetworkChannel @@ -197,7 +198,7 @@ class ItemMonitorMenu @JvmOverloads constructor( var maxStack = 64 if (settings.craftingAmount == ItemMonitorPlayerSettings.Amount.FULL) { - for (gridItem in tile.craftingGrid.stacks()) { + for (gridItem in tile.craftingGrid.nonEmptyIterator()) { if (!gridItem.isStackable) { hasUnstackables = true break @@ -206,7 +207,7 @@ class ItemMonitorMenu @JvmOverloads constructor( } else { maxStack = 0 - for (gridItem in tile.craftingGrid.stacks()) { + for (gridItem in tile.craftingGrid.nonEmptyIterator()) { maxStack = maxStack.coerceAtLeast(gridItem.maxStackSize) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt index b4a9b54ca..87036055d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt @@ -8,7 +8,7 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.core.registryName -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set fun stackFromJson(obj: JsonElement, field: String = ""): ItemStack { if (obj is JsonPrimitive) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt index 88e403183..9b365def3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt @@ -15,7 +15,7 @@ import net.minecraft.world.level.Level import org.apache.logging.log4j.LogManager import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.block.entity.PlatePressBlockEntity -import ru.dbotthepony.mc.otm.core.get +import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.registry.MRecipes import ru.dbotthepony.mc.otm.core.registryName diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt index 60031c7de..083855b66 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt @@ -8,7 +8,7 @@ import net.minecraft.nbt.ListTag import net.minecraft.nbt.Tag import net.minecraft.world.level.saveddata.SavedData import org.apache.logging.log4j.LogManager -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class SavedMapDelegate(val parent: SavedCountingMap>?, val index: Int, value: V) { constructor(value: V) : this(null, -1, value)