From 4d51ed5210ef9b739f97bcb0cba9b6071c2821c7 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Wed, 26 Mar 2025 22:46:12 +0700 Subject: [PATCH] Optimize battery bank --- .../entity/tech/BatteryBankBlockEntity.kt | 66 +++++++++++++------ 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt index d50def635..882eea52d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.block.entity.tech +import it.unimi.dsi.fastutil.ints.IntArrayList import net.minecraft.core.BlockPos import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player @@ -12,6 +13,7 @@ import ru.dbotthepony.kommons.util.setValue import ru.dbotthepony.kommons.util.value import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity import ru.dbotthepony.mc.otm.capability.FlowDirection +import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.energy import ru.dbotthepony.mc.otm.capability.energy.IMatteryEnergyStorage import ru.dbotthepony.mc.otm.capability.energy.ProfiledEnergyStorage @@ -19,10 +21,12 @@ import ru.dbotthepony.mc.otm.capability.energyStoredMattery import ru.dbotthepony.mc.otm.capability.matteryEnergy import ru.dbotthepony.mc.otm.capability.maxEnergyStoredMattery import ru.dbotthepony.mc.otm.capability.transcieveEnergy +import ru.dbotthepony.mc.otm.container.slotRange import ru.dbotthepony.mc.otm.container.slotted.ContainerSlot import ru.dbotthepony.mc.otm.container.slotted.FilteredContainerSlot import ru.dbotthepony.mc.otm.container.slotted.SlottedContainer import ru.dbotthepony.mc.otm.core.immutableList +import ru.dbotthepony.mc.otm.core.isNotEmpty import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.shuffle @@ -34,6 +38,8 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte var gaugeLevel by syncher.float() private set + private var containerSlotIndices = IntArray(0) + private inner class Slot(container: SlottedContainer, slot: Int) : FilteredContainerSlot(container, slot) { override fun canAutomationPlaceItem(itemStack: ItemStack): Boolean { return super.canAutomationPlaceItem(itemStack) && itemStack.getCapability(Capabilities.EnergyStorage.ITEM)?.let { it.canExtract() && it.extractEnergy(Int.MAX_VALUE, true) > 0 } == true @@ -47,15 +53,30 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte super.notifyChanged(old) batteryStatus[slot].value = item.getCapability(Capabilities.EnergyStorage.ITEM) != null - gaugeLevel = batteryLevel.percentage(maxBatteryLevel) + updateGaugeLevel() } override val maxStackSize: Int get() = 1 } + private fun containerUpdated() { + markDirtyFast() + + val newSlots = IntArrayList() + + for (i in 0 until container.containerSize) { + val stack = container[i] + + if (stack.isNotEmpty && stack.energy != null) + newSlots.add(i) + } + + containerSlotIndices = newSlots.toIntArray() + } + // 6 на 2 - val container = SlottedContainer.simple(CAPACITY, ::Slot, ::markDirtyFast).also(::addDroppableContainer) + val container = SlottedContainer.simple(CAPACITY, ::Slot, ::containerUpdated).also(::addDroppableContainer) val batteryStatus = immutableList(CAPACITY) { syncher.boolean(false) } val itemConfig = ConfigurableItemHandler(inputOutput = container) @@ -64,10 +85,26 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte savetables.stateful(::container, INVENTORY_KEY) } - private val containerSlotIndices = IntArray(CAPACITY) { it } + private fun updateGaugeLevel() { + var stored = Decimal.ZERO + var maxStored = Decimal.ZERO + + for (stack in container) { + val cap = stack.energy ?: continue + stored += cap.energyStoredMattery + maxStored += cap.maxEnergyStoredMattery + } + + gaugeLevel = stored.percentage(maxStored) + } + + override fun tick() { + super.tick() + updateGaugeLevel() + } private fun distributeEnergy(isReceiving: Boolean, howMuch: Decimal, simulate: Boolean): Decimal { - if (!howMuch.isPositive) + if (!howMuch.isPositive || containerSlotIndices.isEmpty()) return Decimal.ZERO containerSlotIndices.shuffle(level!!.otmRandom) @@ -94,7 +131,6 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte if (!simulate && !summ.isZero) { markDirtyFast() - gaugeLevel = batteryLevel.percentage(maxBatteryLevel) } return summ @@ -118,13 +154,9 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte get() { var result = Decimal.ZERO - for (i in 0 until container.containerSize) { - val stack = container.getItem(i) - - if (!stack.isEmpty) { - stack.energy?.let { - result += it.energyStoredMattery - } + for (stack in container) { + stack.energy?.let { + result += it.energyStoredMattery } } @@ -138,13 +170,9 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte get() { var result = Decimal.ZERO - for (i in 0 until container.containerSize) { - val stack = container.getItem(i) - - if (!stack.isEmpty) { - stack.energy?.let { - result += it.maxEnergyStoredMattery - } + for (stack in container) { + stack.energy?.let { + result += it.maxEnergyStoredMattery } }