Rebalance and update matter recycler
update matter replicator internal capacity
This commit is contained in:
parent
ab97d9f051
commit
bda1da86d5
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user