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 2713dfe01..8038cab58 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 @@ -9,36 +9,29 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState -import net.minecraftforge.common.ForgeConfigSpec -import ru.dbotthepony.mc.otm.config.EnergyBalanceValues import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.capability.FlowDirection -import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.energy.ProfiledEnergyStorage import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.matter.IMatterStorage import ru.dbotthepony.mc.otm.capability.matter.MatterStorageImpl import ru.dbotthepony.mc.otm.capability.matter.ProfiledMatterStorage +import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.HandlerFilter -import ru.dbotthepony.mc.otm.graph.matter.MatterGraph import ru.dbotthepony.mc.otm.menu.matter.MatterBottlerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.core.* -import ru.dbotthepony.mc.otm.registry.MNames -import ru.dbotthepony.mc.otm.core.util.WriteOnce import ru.dbotthepony.mc.otm.core.math.Decimal -import ru.dbotthepony.mc.otm.core.math.DecimalConfigValue -import ru.dbotthepony.mc.otm.core.math.defineDecimal import ru.dbotthepony.mc.otm.graph.matter.SimpleMatterNode -class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : - MatteryPoweredBlockEntity(MBlockEntities.MATTER_BOTTLER, p_155229_, p_155230_) { +class MatterBottlerBlockEntity(blockPos: BlockPos, blockState: BlockState) : + MatteryPoweredBlockEntity(MBlockEntities.MATTER_BOTTLER, blockPos, blockState) { - val energy = ProfiledEnergyStorage(WorkerEnergyStorage(this, ENERGY_VALUES)) + val energy = ProfiledEnergyStorage(WorkerEnergyStorage(this, MachinesConfig.MatterBottler.VALUES)) var isBottling: Boolean = true set(value) { @@ -99,7 +92,7 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } }) - val matter: ProfiledMatterStorage = ProfiledMatterStorage(object : MatterStorageImpl(this::setChangedLight, FlowDirection.BI_DIRECTIONAL, ::CAPACITY) { + val matter: ProfiledMatterStorage = ProfiledMatterStorage(object : MatterStorageImpl(this::setChangedLight, FlowDirection.BI_DIRECTIONAL, MachinesConfig.MatterBottler.VALUES::matterCapacity) { override val matterFlow: FlowDirection get() { return if (this@MatterBottlerBlockEntity.isBottling) FlowDirection.INPUT else FlowDirection.OUTPUT } @@ -172,10 +165,10 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : return } - var work_stack: ItemStack? = null + var workStack: ItemStack? = null var capability: IMatterStorage? = null val align = if (isBottling) 0 else 3 - var work_slot = -1 + var workSlot = -1 val unexpectedDirection = if (isBottling) FlowDirection.OUTPUT else FlowDirection.INPUT for (i in align until align + 3) { @@ -186,50 +179,52 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : if (cap.matterFlow != unexpectedDirection) { if (this.isBottling && cap.missingMatter > Decimal.ZERO || !this.isBottling && cap.storedMatter > Decimal.ZERO) { - work_stack = itemStack + workStack = itemStack capability = cap - work_slot = i + workSlot = i break } } } } - if (work_stack == null) { + if (workStack == null) { lastWorkStack = null initialCapacity = null - } else if (work_stack != lastWorkStack) { - lastWorkStack = work_stack + } else if (workStack != lastWorkStack) { + lastWorkStack = workStack initialCapacity = capability!!.storedMatter } - val graph = matterNode.graph as MatterGraph? - if (capability != null) { if (blockState.getValue(WorkerState.SEMI_WORKER_STATE) !== WorkerState.WORKING) { level?.setBlock(blockPos, blockState.setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS) } + val rate = MachinesConfig.MatterBottler.RATE + val consumption = MachinesConfig.MatterBottler.VALUES.energyConsumption + if (isBottling) { - if (matter.storedMatter < MATTER_EXCHANGE_RATE && graph != null) { - val extracted = graph.extractMatter( - matter.missingMatter.coerceAtMost(MATTER_EXCHANGE_RATE * EXTRACTION_TICKS).coerceAtMost(capability.missingMatter - matter.storedMatter), true - ) + if (matter.storedMatter < rate) { + val extracted = matterNode.graph.extractMatter( + matter.missingMatter + .coerceAtMost(rate * 200) + .coerceAtMost(capability.missingMatter - matter.storedMatter), true) if (extracted > Decimal.ZERO) { val received = matter.receiveMatter(extracted, false) - graph.extractMatter(received, false) + matterNode.graph.extractMatter(received, false) } } if (matter.storedMatter > Decimal.ZERO) { - val energyExtracted = energy.extractEnergy(ENERGY_CONSUMPTION, true) + val energyExtracted = energy.extractEnergy(consumption, true) if (!energyExtracted.isZero) { - val matter = capability.receiveMatter(MATTER_EXCHANGE_RATE.coerceAtMost(matter.storedMatter) * energyExtracted / ENERGY_CONSUMPTION, true) + val matter = capability.receiveMatter(rate.coerceAtMost(matter.storedMatter) * energyExtracted / consumption, true) if (!matter.isZero) { - energy.extractEnergy(ENERGY_CONSUMPTION * matter / MATTER_EXCHANGE_RATE, false) + energy.extractEnergy(consumption * matter / rate, false) capability.receiveMatter(matter, false) this.matter.extractMatter(matter, false) @@ -237,8 +232,8 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : if (capability.missingMatter.isZero) { for (i in 3..5) { if (container.getItem(i).isEmpty) { - container.setItem(work_slot, ItemStack.EMPTY) - container.setItem(i, work_stack!!) + container.setItem(workSlot, ItemStack.EMPTY) + container.setItem(i, workStack!!) break } } @@ -247,13 +242,13 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } } } else { - val energyExtracted = energy.extractEnergy(ENERGY_CONSUMPTION, true) + val energyExtracted = energy.extractEnergy(consumption, true) if (!energyExtracted.isZero) { - val matter = capability.extractMatter(MATTER_EXCHANGE_RATE.coerceAtMost(matter.missingMatter) * energyExtracted / ENERGY_CONSUMPTION, true) + val matter = capability.extractMatter(rate.coerceAtMost(matter.missingMatter) * energyExtracted / consumption, true) if (!matter.isZero) { - this.energy.extractEnergy(ENERGY_CONSUMPTION * matter / MATTER_EXCHANGE_RATE,false) + this.energy.extractEnergy(consumption * matter / rate, false) capability.extractMatter(matter, false) this.matter.receiveMatter(matter, false) @@ -261,8 +256,8 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : if (capability.storedMatter.isZero) { for (i in 2 downTo 0) { if (container.getItem(i).isEmpty) { - container.setItem(work_slot, ItemStack.EMPTY) - container.setItem(i, work_stack!!) + container.setItem(workSlot, ItemStack.EMPTY) + container.setItem(i, workStack!!) break } } @@ -271,42 +266,14 @@ class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } } } else { - level!!.setBlock(blockPos, blockState.setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS) + level?.setBlock(blockPos, blockState.setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS) } - if (!isBottling && !matter.storedMatter.isZero && graph != null) { + if (!isBottling && !matter.storedMatter.isZero) { val diff = matter.extractMatter(matter.storedMatter, true) - val diff2 = graph.receiveMatter(diff, true) + val diff2 = matterNode.graph.receiveMatter(diff, true) matter.extractMatter(diff2, false) - graph.receiveMatter(diff2, false) - } - } - - companion object { - val MATTER_EXCHANGE_RATE get() = _MATTER_EXCHANGE_RATE.get() - val ENERGY_CONSUMPTION get() = _ENERGY_CONSUMPTION.get() - val EXTRACTION_TICKS get() = _EXTRACTION_TICKS.get() - val CAPACITY get() = _CAPACITY.get() - - private var _MATTER_EXCHANGE_RATE: DecimalConfigValue by WriteOnce() - private var _ENERGY_CONSUMPTION: DecimalConfigValue by WriteOnce() - private var _EXTRACTION_TICKS: DecimalConfigValue by WriteOnce() - private var _CAPACITY: DecimalConfigValue by WriteOnce() - - var ENERGY_VALUES: EnergyBalanceValues by WriteOnce() - private set - - fun registerConfig(builder: ForgeConfigSpec.Builder) { - builder.push(MNames.MATTER_BOTTLER) - - ENERGY_VALUES = BlockEnergyStorageImpl.makeConfigEntry(builder) - - _MATTER_EXCHANGE_RATE = builder.defineDecimal("matterExchangeRate", Decimal("0.04"), Decimal("0.0001")) - _ENERGY_CONSUMPTION = builder.defineDecimal("energyConsumption", Decimal(20), Decimal.ONE) - _EXTRACTION_TICKS = builder.defineDecimal("extractionTicks", Decimal(200), Decimal.ONE) - _CAPACITY = builder.defineDecimal("matterCapacity", Decimal(4_000), Decimal.ONE_TENTH) - - builder.pop() + matterNode.graph.receiveMatter(diff2, false) } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/config/MachinesConfig.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/config/MachinesConfig.kt index 875f885ff..d42274729 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/config/MachinesConfig.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/config/MachinesConfig.kt @@ -1,6 +1,5 @@ package ru.dbotthepony.mc.otm.config -import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity import ru.dbotthepony.mc.otm.block.entity.tech.AndroidStationBlockEntity import ru.dbotthepony.mc.otm.block.entity.tech.ChemicalGeneratorBlockEntity import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl @@ -12,7 +11,6 @@ object MachinesConfig : AbstractConfig("machines") { init { AndroidStationBlockEntity.registerConfig(builder) ChemicalGeneratorBlockEntity.registerConfig(builder) - MatterBottlerBlockEntity.registerConfig(builder) } val PLATE_PRESS = workerValues( @@ -56,6 +54,21 @@ object MachinesConfig : AbstractConfig("machines") { MatterRecycler } + private val MATTER_BOTTLER = workerValues( + MNames.MATTER_BOTTLER, + energyStorage = Decimal(40_000), + energyConsumption = Decimal(10), + energyThroughput = Decimal(200), + matterCapacity = Decimal(400) + ) { + MatterBottler + } + + object MatterBottler { + val VALUES by ::MATTER_BOTTLER + val RATE by builder.comment("Matter transferred per tick").defineDecimal("RATE", Decimal("2.0"), Decimal.ONE_TENTH) + } + object MatterRecycler { val VALUES by ::MATTER_RECYCLER val MATTER_PER_TICK by builder.defineDecimal("MATTER_PER_TICK", Decimal("0.5"))