From bda1da86d5afcbe24254ae35289b91b8896f6288 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 24 Nov 2022 21:07:06 +0700 Subject: [PATCH] Rebalance and update matter recycler update matter replicator internal capacity --- .../ru/dbotthepony/mc/otm/ServerConfig.kt | 2 + .../block/entity/MatteryWorkerBlockEntity.kt | 20 ++++--- .../matter/MatterRecyclerBlockEntity.kt | 54 ++++++++++++++----- .../matter/MatterReplicatorBlockEntity.kt | 4 +- .../dbotthepony/mc/otm/item/MatterDustItem.kt | 8 +-- 5 files changed, 64 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/ServerConfig.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/ServerConfig.kt index ecbce63d1..c2e3cd520 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/ServerConfig.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/ServerConfig.kt @@ -112,6 +112,8 @@ object ServerConfig { val MATTER_CAPACITOR_NORMAL by specBuilder.defineImpreciseFraction(MNames.MATTER_CAPACITOR_NORMAL, ImpreciseFraction(40_000), minimum = ImpreciseFraction.ONE_TENTH) val MATTER_CAPACITOR_DENSE by specBuilder.defineImpreciseFraction(MNames.MATTER_CAPACITOR_DENSE, ImpreciseFraction(400_000), minimum = ImpreciseFraction.ONE_TENTH) + val MATTER_DUST_CAPACITY by specBuilder.comment("Maximal matter value one matter dust item can have").defineImpreciseFraction("matterDustCapacity", ImpreciseFraction(2_000), minimum = ImpreciseFraction.ONE_TENTH) + val PATTERN_DRIVE_NORMAL: Int by specBuilder.defineInRange(MNames.PATTERN_DRIVE_NORMAL, 4, 1, Int.MAX_VALUE) init { 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 2eddb08dc..459bb0239 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 @@ -22,10 +22,18 @@ abstract class MatteryWorkerBlockEntity( blockState: BlockState, val jobDeserializer: (tag: CompoundTag) -> JobType? ) : MatteryPoweredBlockEntity(type, blockPos, blockState) { - open class Job( - open val ticks: Double, - open val powerUsage: ImpreciseFraction = ImpreciseFraction.ZERO - ) { + open class Job { + open val ticks: Double + open val powerUsage: ImpreciseFraction + + constructor( + ticks: Double, + powerUsage: ImpreciseFraction = ImpreciseFraction.ZERO + ) { + this.ticks = ticks + this.powerUsage = powerUsage + } + constructor( tag: CompoundTag ) : this(tag.getDouble(TICKS_KEY), tag.getImpreciseFraction(POWER_KEY)) @@ -198,7 +206,7 @@ abstract class MatteryWorkerBlockEntity( */ protected abstract fun computeNextJob(): Pair - protected open fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double): Status { + protected open fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double, job: JobType): Status { return Status.SUCCESS } @@ -303,7 +311,7 @@ abstract class MatteryWorkerBlockEntity( break } - val status = onWorkTick(requiredPower ?: ImpreciseFraction.ZERO, extractedPower ?: ImpreciseFraction.ZERO, ticksAdvanced) + val status = onWorkTick(requiredPower ?: ImpreciseFraction.ZERO, extractedPower ?: ImpreciseFraction.ZERO, ticksAdvanced, currentJob) if (!status.success) { throttleTicks += status.throttleTicks 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 7eccf10be..0a6966dcf 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 @@ -13,6 +13,7 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.ForgeConfigSpec +import net.minecraftforge.common.ForgeConfigSpec.ConfigValue import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional @@ -41,9 +42,36 @@ import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MNames import ru.dbotthepony.mc.otm.core.WriteOnce +import ru.dbotthepony.mc.otm.core.getImpreciseFraction class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) - : MatteryWorkerBlockEntity(MBlockEntities.MATTER_RECYCLER, blockPos, blockState, ::Job), IMatterGraphNode, IDroppableContainer { + : MatteryWorkerBlockEntity(MBlockEntities.MATTER_RECYCLER, blockPos, blockState, ::RecyclerJob), IMatterGraphNode, IDroppableContainer { + + class RecyclerJob : Job { + var totalMatter: ImpreciseFraction + + constructor( + ticks: Double, + powerUsage: ImpreciseFraction, + totalMatter: ImpreciseFraction + ) : super(ticks, powerUsage) { + this.totalMatter = totalMatter + } + + constructor(tag: CompoundTag) : super(tag) { + this.totalMatter = tag.getImpreciseFraction(KEY) + } + + override fun serializeNBT(): CompoundTag { + return super.serializeNBT().also { + it[KEY] = totalMatter + } + } + + companion object { + const val KEY = "totalMatter" + } + } val matter = MatterHandlerImpl( this::matterLevelUpdated, @@ -131,12 +159,12 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) return MatterRecyclerMenu(containerID, inventory, this) } - override fun onJobFinish(job: Job): Status { + override fun onJobFinish(job: RecyclerJob): Status { // вся логика в onWorkTick return Status.SUCCESS } - override fun computeNextJob(): Pair { + override fun computeNextJob(): Pair { if (matter.missingMatter.isZero) return null to IdleReason.ITEM @@ -149,20 +177,22 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) val dustMatter = (stack.item as MatterDustItem).getMatterValue(stack.copy().also { it.count = 1 }) ?: return null to IdleReason.ITEM stack.shrink(1) container.setChanged(0) - return Job(dustMatter.matter.toDouble() * MATTER_TICKS, POWER_CONSUMPTION) to null + return RecyclerJob(dustMatter.matter.toDouble() * TICKS_PER_MATTER, POWER_CONSUMPTION, dustMatter.matter * (0.4 + level!!.random.nextDouble() * 0.6)) to null } - override fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double): Status { - if ((level?.random?.nextDouble() ?: 1.0) <= 0.4) + override fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double, job: RecyclerJob): Status { + val receive = job.totalMatter / job.ticks + + if (receive.isZero) return Status.SUCCESS - val receive = MATTER_PER_TICK * ticksAdvanced val received = matter.receiveMatterInner(receive, true) if (receive != received) return Status.FAILURE_MATTER matter.receiveMatterInner(receive, false) + job.totalMatter -= received return Status.SUCCESS } @@ -180,25 +210,25 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) companion object { private var _CAPACITY: ImpreciseFractionConfigValue by WriteOnce() private var _POWER_CONSUMPTION: ImpreciseFractionConfigValue by WriteOnce() + private var _TICKS_PER_MATTER: ConfigValue by WriteOnce() + var ENERGY_CONFIG: ConciseBalanceValues by WriteOnce() private set private val CAPACITY get() = _CAPACITY.get() private val POWER_CONSUMPTION get() = _POWER_CONSUMPTION.get() + private val TICKS_PER_MATTER: Double get() = _TICKS_PER_MATTER.get() fun registerConfig(builder: ForgeConfigSpec.Builder) { builder.push(MNames.MATTER_RECYCLER) ENERGY_CONFIG = BlockEnergyStorageImpl.makeConfigEntry(builder, capacity = ImpreciseFraction(80_000)) - _CAPACITY = builder.defineImpreciseFraction("matterCapacity", ImpreciseFraction(40_000), ImpreciseFraction.ONE) + _CAPACITY = builder.defineImpreciseFraction("matterCapacity", ImpreciseFraction(2_000), ImpreciseFraction.ONE) _POWER_CONSUMPTION = builder.defineImpreciseFraction("powerConsumption", ImpreciseFraction(80), ImpreciseFraction.ONE) + _TICKS_PER_MATTER = builder.define("ticksPerMatter", 2.0) builder.pop() } - - // TODO: config - private const val MATTER_TICKS = 0.8 - private val MATTER_PER_TICK = ImpreciseFraction(1.0 / MATTER_TICKS) } } 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 20c021e99..b2259c32a 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 @@ -212,7 +212,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : ) to null } - override fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double): Status { + override fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double, job: ReplicatorJob): Status { val drainPerTick = currentJob!!.matterPerTick * ticksAdvanced val graph = matterNode.graph as MatterNetworkGraph? ?: return Status.FAILURE_WAIT_FAST @@ -317,7 +317,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : _BASE_CONSUMPTION = builder.defineImpreciseFraction("basePowerConsumption", ImpreciseFraction(400), ImpreciseFraction.ONE) _DRAIN_MULT = builder.comment("How much 'ticks' of replication should replicator drain matter from network when running low on internal matter buffer. This is ultimately a performance value.").defineImpreciseFraction("drainMultiplier", ImpreciseFraction(200), ImpreciseFraction.ONE) - _MATTER_CAPACITY = builder.defineImpreciseFraction("matterCapacity", ImpreciseFraction(2_000), ImpreciseFraction.ONE_TENTH) + _MATTER_CAPACITY = builder.defineImpreciseFraction("matterCapacity", ImpreciseFraction(400), ImpreciseFraction.ONE_TENTH) builder.pop() } 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 a16a1d1da..3e3d57bdd 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt @@ -7,6 +7,7 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.level.Level import ru.dbotthepony.mc.otm.OverdriveThatMatters +import ru.dbotthepony.mc.otm.ServerConfig import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.matter.IMatterItem @@ -56,10 +57,10 @@ class MatterDustItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREAT val matterThis = matter(stack) - if (matterThis >= MAX_MATTER_IN_ITEM) + if (matterThis >= ServerConfig.MATTER_DUST_CAPACITY) return ImpreciseFraction.ZERO - val newMatter = (matterThis + matter).coerceAtMost(MAX_MATTER_IN_ITEM) + val newMatter = (matterThis + matter).coerceAtMost(ServerConfig.MATTER_DUST_CAPACITY) val diff = newMatter - matterThis if (!simulate) @@ -69,13 +70,12 @@ class MatterDustItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREAT } fun isFull(stack: ItemStack): Boolean { - return matter(stack) >= MAX_MATTER_IN_ITEM + return matter(stack) >= ServerConfig.MATTER_DUST_CAPACITY } companion object { private val DESC = TranslatableComponent("item.overdrive_that_matters.matter_dust.desc").withStyle(ChatFormatting.DARK_GRAY) private val DESC2 = TranslatableComponent("item.overdrive_that_matters.matter_dust.desc2").withStyle(ChatFormatting.GRAY) private val DESC3 = TranslatableComponent("item.overdrive_that_matters.matter_dust.desc3").withStyle(ChatFormatting.DARK_GRAY) - val MAX_MATTER_IN_ITEM = ImpreciseFraction(4) } }