Optimize battery bank
This commit is contained in:
parent
39a996f79f
commit
4d51ed5210
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user