Rebalance and update matter recycler

update matter replicator internal capacity
This commit is contained in:
DBotThePony 2022-11-24 21:07:06 +07:00
parent ab97d9f051
commit bda1da86d5
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 64 additions and 24 deletions

View File

@ -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 {

View File

@ -22,10 +22,18 @@ abstract class MatteryWorkerBlockEntity<JobType : MatteryWorkerBlockEntity.Job>(
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<JobType : MatteryWorkerBlockEntity.Job>(
*/
protected abstract fun computeNextJob(): Pair<JobType?, Any?>
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<JobType : MatteryWorkerBlockEntity.Job>(
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

View File

@ -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<MatteryWorkerBlockEntity.Job>(MBlockEntities.MATTER_RECYCLER, blockPos, blockState, ::Job), IMatterGraphNode, IDroppableContainer {
: MatteryWorkerBlockEntity<MatterRecyclerBlockEntity.RecyclerJob>(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<Job?, IdleReason?> {
override fun computeNextJob(): Pair<RecyclerJob?, IdleReason?> {
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<Double> 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)
}
}

View File

@ -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()
}

View File

@ -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)
}
}