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_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_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)
|
val PATTERN_DRIVE_NORMAL: Int by specBuilder.defineInRange(MNames.PATTERN_DRIVE_NORMAL, 4, 1, Int.MAX_VALUE)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -22,10 +22,18 @@ abstract class MatteryWorkerBlockEntity<JobType : MatteryWorkerBlockEntity.Job>(
|
|||||||
blockState: BlockState,
|
blockState: BlockState,
|
||||||
val jobDeserializer: (tag: CompoundTag) -> JobType?
|
val jobDeserializer: (tag: CompoundTag) -> JobType?
|
||||||
) : MatteryPoweredBlockEntity(type, blockPos, blockState) {
|
) : MatteryPoweredBlockEntity(type, blockPos, blockState) {
|
||||||
open class Job(
|
open class Job {
|
||||||
open val ticks: Double,
|
open val ticks: Double
|
||||||
open val powerUsage: ImpreciseFraction = ImpreciseFraction.ZERO
|
open val powerUsage: ImpreciseFraction
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
ticks: Double,
|
||||||
|
powerUsage: ImpreciseFraction = ImpreciseFraction.ZERO
|
||||||
) {
|
) {
|
||||||
|
this.ticks = ticks
|
||||||
|
this.powerUsage = powerUsage
|
||||||
|
}
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
tag: CompoundTag
|
tag: CompoundTag
|
||||||
) : this(tag.getDouble(TICKS_KEY), tag.getImpreciseFraction(POWER_KEY))
|
) : 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 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
|
return Status.SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,7 +311,7 @@ abstract class MatteryWorkerBlockEntity<JobType : MatteryWorkerBlockEntity.Job>(
|
|||||||
break
|
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) {
|
if (!status.success) {
|
||||||
throttleTicks += status.throttleTicks
|
throttleTicks += status.throttleTicks
|
||||||
|
@ -13,6 +13,7 @@ import net.minecraft.world.item.ItemStack
|
|||||||
import net.minecraft.world.level.Level
|
import net.minecraft.world.level.Level
|
||||||
import net.minecraft.world.level.block.state.BlockState
|
import net.minecraft.world.level.block.state.BlockState
|
||||||
import net.minecraftforge.common.ForgeConfigSpec
|
import net.minecraftforge.common.ForgeConfigSpec
|
||||||
|
import net.minecraftforge.common.ForgeConfigSpec.ConfigValue
|
||||||
import net.minecraftforge.common.capabilities.Capability
|
import net.minecraftforge.common.capabilities.Capability
|
||||||
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||||
import net.minecraftforge.common.util.LazyOptional
|
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.MBlocks
|
||||||
import ru.dbotthepony.mc.otm.registry.MNames
|
import ru.dbotthepony.mc.otm.registry.MNames
|
||||||
import ru.dbotthepony.mc.otm.core.WriteOnce
|
import ru.dbotthepony.mc.otm.core.WriteOnce
|
||||||
|
import ru.dbotthepony.mc.otm.core.getImpreciseFraction
|
||||||
|
|
||||||
class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
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(
|
val matter = MatterHandlerImpl(
|
||||||
this::matterLevelUpdated,
|
this::matterLevelUpdated,
|
||||||
@ -131,12 +159,12 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
return MatterRecyclerMenu(containerID, inventory, this)
|
return MatterRecyclerMenu(containerID, inventory, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onJobFinish(job: Job): Status {
|
override fun onJobFinish(job: RecyclerJob): Status {
|
||||||
// вся логика в onWorkTick
|
// вся логика в onWorkTick
|
||||||
return Status.SUCCESS
|
return Status.SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun computeNextJob(): Pair<Job?, IdleReason?> {
|
override fun computeNextJob(): Pair<RecyclerJob?, IdleReason?> {
|
||||||
if (matter.missingMatter.isZero)
|
if (matter.missingMatter.isZero)
|
||||||
return null to IdleReason.ITEM
|
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
|
val dustMatter = (stack.item as MatterDustItem).getMatterValue(stack.copy().also { it.count = 1 }) ?: return null to IdleReason.ITEM
|
||||||
stack.shrink(1)
|
stack.shrink(1)
|
||||||
container.setChanged(0)
|
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 {
|
override fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double, job: RecyclerJob): Status {
|
||||||
if ((level?.random?.nextDouble() ?: 1.0) <= 0.4)
|
val receive = job.totalMatter / job.ticks
|
||||||
|
|
||||||
|
if (receive.isZero)
|
||||||
return Status.SUCCESS
|
return Status.SUCCESS
|
||||||
|
|
||||||
val receive = MATTER_PER_TICK * ticksAdvanced
|
|
||||||
val received = matter.receiveMatterInner(receive, true)
|
val received = matter.receiveMatterInner(receive, true)
|
||||||
|
|
||||||
if (receive != received)
|
if (receive != received)
|
||||||
return Status.FAILURE_MATTER
|
return Status.FAILURE_MATTER
|
||||||
|
|
||||||
matter.receiveMatterInner(receive, false)
|
matter.receiveMatterInner(receive, false)
|
||||||
|
job.totalMatter -= received
|
||||||
return Status.SUCCESS
|
return Status.SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,25 +210,25 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
companion object {
|
companion object {
|
||||||
private var _CAPACITY: ImpreciseFractionConfigValue by WriteOnce()
|
private var _CAPACITY: ImpreciseFractionConfigValue by WriteOnce()
|
||||||
private var _POWER_CONSUMPTION: 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()
|
var ENERGY_CONFIG: ConciseBalanceValues by WriteOnce()
|
||||||
private set
|
private set
|
||||||
|
|
||||||
private val CAPACITY get() = _CAPACITY.get()
|
private val CAPACITY get() = _CAPACITY.get()
|
||||||
private val POWER_CONSUMPTION get() = _POWER_CONSUMPTION.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) {
|
fun registerConfig(builder: ForgeConfigSpec.Builder) {
|
||||||
builder.push(MNames.MATTER_RECYCLER)
|
builder.push(MNames.MATTER_RECYCLER)
|
||||||
|
|
||||||
ENERGY_CONFIG = BlockEnergyStorageImpl.makeConfigEntry(builder, capacity = ImpreciseFraction(80_000))
|
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)
|
_POWER_CONSUMPTION = builder.defineImpreciseFraction("powerConsumption", ImpreciseFraction(80), ImpreciseFraction.ONE)
|
||||||
|
_TICKS_PER_MATTER = builder.define("ticksPerMatter", 2.0)
|
||||||
|
|
||||||
builder.pop()
|
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
|
) 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 drainPerTick = currentJob!!.matterPerTick * ticksAdvanced
|
||||||
val graph = matterNode.graph as MatterNetworkGraph? ?: return Status.FAILURE_WAIT_FAST
|
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)
|
_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)
|
_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()
|
builder.pop()
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import net.minecraft.world.item.ItemStack
|
|||||||
import net.minecraft.world.item.TooltipFlag
|
import net.minecraft.world.item.TooltipFlag
|
||||||
import net.minecraft.world.level.Level
|
import net.minecraft.world.level.Level
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
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.TranslatableComponent
|
||||||
import ru.dbotthepony.mc.otm.core.ImpreciseFraction
|
import ru.dbotthepony.mc.otm.core.ImpreciseFraction
|
||||||
import ru.dbotthepony.mc.otm.matter.IMatterItem
|
import ru.dbotthepony.mc.otm.matter.IMatterItem
|
||||||
@ -56,10 +57,10 @@ class MatterDustItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREAT
|
|||||||
|
|
||||||
val matterThis = matter(stack)
|
val matterThis = matter(stack)
|
||||||
|
|
||||||
if (matterThis >= MAX_MATTER_IN_ITEM)
|
if (matterThis >= ServerConfig.MATTER_DUST_CAPACITY)
|
||||||
return ImpreciseFraction.ZERO
|
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
|
val diff = newMatter - matterThis
|
||||||
|
|
||||||
if (!simulate)
|
if (!simulate)
|
||||||
@ -69,13 +70,12 @@ class MatterDustItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREAT
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun isFull(stack: ItemStack): Boolean {
|
fun isFull(stack: ItemStack): Boolean {
|
||||||
return matter(stack) >= MAX_MATTER_IN_ITEM
|
return matter(stack) >= ServerConfig.MATTER_DUST_CAPACITY
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val DESC = TranslatableComponent("item.overdrive_that_matters.matter_dust.desc").withStyle(ChatFormatting.DARK_GRAY)
|
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 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)
|
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