Move top level matter dust function to matter dust item

This commit is contained in:
DBotThePony 2023-07-25 19:41:44 +07:00
parent c226a988c3
commit 9c74b62f10
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 60 additions and 66 deletions

View File

@ -9,91 +9,29 @@ import net.minecraft.world.inventory.AbstractContainerMenu
import net.minecraft.world.item.ItemStack 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 ru.dbotthepony.mc.otm.block.entity.Job
import ru.dbotthepony.mc.otm.block.entity.JobContainer import ru.dbotthepony.mc.otm.block.entity.JobContainer
import ru.dbotthepony.mc.otm.block.entity.JobStatus import ru.dbotthepony.mc.otm.block.entity.JobStatus
import ru.dbotthepony.mc.otm.block.entity.Job
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
import ru.dbotthepony.mc.otm.capability.FlowDirection import ru.dbotthepony.mc.otm.capability.FlowDirection
import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.capability.UpgradeType import ru.dbotthepony.mc.otm.capability.UpgradeType
import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl
import ru.dbotthepony.mc.otm.capability.energy.ProfiledEnergyStorage import ru.dbotthepony.mc.otm.capability.energy.ProfiledEnergyStorage
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
import ru.dbotthepony.mc.otm.capability.matter.MatterStorageImpl import ru.dbotthepony.mc.otm.capability.matter.MatterStorageImpl
import ru.dbotthepony.mc.otm.capability.matter.ProfiledMatterStorage import ru.dbotthepony.mc.otm.capability.matter.ProfiledMatterStorage
import ru.dbotthepony.mc.otm.config.EnergyBalanceValues
import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.config.MachinesConfig
import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.HandlerFilter
import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainer
import ru.dbotthepony.mc.otm.container.UpgradeContainer import ru.dbotthepony.mc.otm.container.UpgradeContainer
import ru.dbotthepony.mc.otm.core.math.Decimal 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.core.util.WriteOnce
import ru.dbotthepony.mc.otm.data.DecimalCodec import ru.dbotthepony.mc.otm.data.DecimalCodec
import ru.dbotthepony.mc.otm.data.minRange import ru.dbotthepony.mc.otm.data.minRange
import ru.dbotthepony.mc.otm.graph.matter.MatterGraph
import ru.dbotthepony.mc.otm.graph.matter.SimpleMatterNode import ru.dbotthepony.mc.otm.graph.matter.SimpleMatterNode
import ru.dbotthepony.mc.otm.item.matter.MatterDustItem
import ru.dbotthepony.mc.otm.matter.MatterManager import ru.dbotthepony.mc.otm.matter.MatterManager
import ru.dbotthepony.mc.otm.menu.matter.MatterDecomposerMenu import ru.dbotthepony.mc.otm.menu.matter.MatterDecomposerMenu
import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MBlockEntities
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MNames
fun moveMatterAsDustIntoContainer(_matterValue: Decimal, container: MatteryContainer, OUTPUT_DUST_MAIN: Int, OUTPUT_DUST_STACKING: Int): Decimal {
var matterValue = _matterValue
val item = MItems.MATTER_DUST as MatterDustItem
while (matterValue > Decimal.ZERO) {
val stack = container[OUTPUT_DUST_MAIN]
// первый слот пустой
if (stack.isEmpty) {
container[OUTPUT_DUST_MAIN] = ItemStack(item, 1).also {
matterValue -= item.addMatterValue(it, matterValue, false)
}
// первый слот не пустой, но мы можем влить туда материю
} else if (!item.isFull(stack) && stack.count == 1) {
matterValue -= item.addMatterValue(stack, matterValue, false)
container.setChanged(OUTPUT_DUST_MAIN)
// первый слот не пустой и мы не можем влить туда материю
} else {
val stack2 = container[OUTPUT_DUST_STACKING]
// второй слот пустой
if (stack2.isEmpty) {
container[OUTPUT_DUST_STACKING] = ItemStack(item, 1).also {
matterValue -= item.addMatterValue(it, matterValue, false)
}
// второй слот не пустой, но мы можем влить туда материю
} else if (!item.isFull(stack2)) {
if (stack2.count != 1) {
return matterValue
}
matterValue -= item.addMatterValue(stack2, matterValue, false)
container.setChanged(OUTPUT_DUST_STACKING)
}
// можем ли мы стакнуть материю из второго слота в первый?
if (!stack2.isEmpty && item.isFull(stack2)) {
if (ItemStack.isSameItemSameTags(stack, stack2) && container.getMaxStackSizeWithItem(OUTPUT_DUST_MAIN) >= stack.count + 1) {
stack.count++
stack2.count--
container.setChanged(OUTPUT_DUST_MAIN)
container.setChanged(OUTPUT_DUST_STACKING)
} else {
return matterValue
}
}
}
}
return Decimal.ZERO
}
class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState) class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState)
: MatteryWorkerBlockEntity<MatterDecomposerBlockEntity.DecomposerJob>(MBlockEntities.MATTER_DECOMPOSER, pos, state, DecomposerJob.CODEC) { : MatteryWorkerBlockEntity<MatterDecomposerBlockEntity.DecomposerJob>(MBlockEntities.MATTER_DECOMPOSER, pos, state, DecomposerJob.CODEC) {
@ -162,7 +100,7 @@ class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState)
override fun onJobFinish(status: JobStatus<DecomposerJob>, id: Int) { override fun onJobFinish(status: JobStatus<DecomposerJob>, id: Int) {
if (status.job.toDust) { if (status.job.toDust) {
status.job.matterValue = moveMatterAsDustIntoContainer(status.job.matterValue, outputContainer, 0, 1) status.job.matterValue = MItems.MATTER_DUST.moveIntoContainer(status.job.matterValue, outputContainer, 0, 1)
if (!status.job.matterValue.isZero) if (!status.job.matterValue.isZero)
status.throttleFast() status.throttleFast()

View File

@ -37,6 +37,7 @@ import ru.dbotthepony.mc.otm.graph.matter.MatterNode
import ru.dbotthepony.mc.otm.matter.MatterManager import ru.dbotthepony.mc.otm.matter.MatterManager
import ru.dbotthepony.mc.otm.menu.matter.MatterReplicatorMenu import ru.dbotthepony.mc.otm.menu.matter.MatterReplicatorMenu
import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MBlockEntities
import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MNames import ru.dbotthepony.mc.otm.registry.MNames
import java.util.* import java.util.*
@ -113,7 +114,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
val job = status.job val job = status.job
if (job.asDust) { if (job.asDust) {
job.matterValue = moveMatterAsDustIntoContainer(job.matterValue, container, OUTPUT_DUST_MAIN, OUTPUT_DUST_STACKING) job.matterValue = MItems.MATTER_DUST.moveIntoContainer(job.matterValue, container, OUTPUT_DUST_MAIN, OUTPUT_DUST_STACKING)
if (!job.matterValue.isZero) { if (!job.matterValue.isZero) {
return status.throttle() return status.throttle()

View File

@ -11,12 +11,14 @@ 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.config.ItemsConfig import ru.dbotthepony.mc.otm.config.ItemsConfig
import ru.dbotthepony.mc.otm.container.MatteryContainer
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.matter.IMatterItem import ru.dbotthepony.mc.otm.matter.IMatterItem
import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.matter.IMatterValue import ru.dbotthepony.mc.otm.matter.IMatterValue
import ru.dbotthepony.mc.otm.matter.MatterValue import ru.dbotthepony.mc.otm.matter.MatterValue
import ru.dbotthepony.mc.otm.registry.MItems
class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem { class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem {
private fun matter(stack: ItemStack): Decimal { private fun matter(stack: ItemStack): Decimal {
@ -32,6 +34,59 @@ class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem {
return MatterValue(Decimal.deserializeNBT(value), 1.0) return MatterValue(Decimal.deserializeNBT(value), 1.0)
} }
fun moveIntoContainer(matterValue: Decimal, container: MatteryContainer, mainSlot: Int, stackingSlot: Int): Decimal {
@Suppress("name_shadowing")
var matterValue = matterValue
while (matterValue > Decimal.ZERO) {
val stack = container[mainSlot]
// первый слот пустой
if (stack.isEmpty) {
container[mainSlot] = ItemStack(this, 1).also {
matterValue -= addMatterValue(it, matterValue, false)
}
// первый слот не пустой, но мы можем влить туда материю
} else if (!isFull(stack) && stack.count == 1) {
matterValue -= addMatterValue(stack, matterValue, false)
container.setChanged(mainSlot)
// первый слот не пустой и мы не можем влить туда материю
} else {
val stack2 = container[stackingSlot]
// второй слот пустой
if (stack2.isEmpty) {
container[stackingSlot] = ItemStack(this, 1).also {
matterValue -= addMatterValue(it, matterValue, false)
}
// второй слот не пустой, но мы можем влить туда материю
} else if (!isFull(stack2)) {
if (stack2.count != 1) {
return matterValue
}
matterValue -= addMatterValue(stack2, matterValue, false)
container.setChanged(stackingSlot)
}
// можем ли мы стакнуть материю из второго слота в первый?
if (!stack2.isEmpty && isFull(stack2)) {
if (ItemStack.isSameItemSameTags(stack, stack2) && container.getMaxStackSizeWithItem(mainSlot) >= stack.count + 1) {
stack.count++
stack2.count--
container.setChanged(mainSlot)
container.setChanged(stackingSlot)
} else {
return matterValue
}
}
}
}
return Decimal.ZERO
}
override fun canDecompose(stack: ItemStack) = false override fun canDecompose(stack: ItemStack) = false
override fun appendHoverText( override fun appendHoverText(

View File

@ -206,7 +206,7 @@ object MItems {
CreativeUpgrades CreativeUpgrades
} }
val MATTER_DUST: Item by registry.register(MNames.MATTER_DUST) { MatterDustItem() } val MATTER_DUST: MatterDustItem by registry.register(MNames.MATTER_DUST) { MatterDustItem() }
val TRITANIUM_ORE_CLUMP: Item by registry.register(MNames.TRITANIUM_ORE_CLUMP) { Item(DEFAULT_PROPERTIES) } val TRITANIUM_ORE_CLUMP: Item by registry.register(MNames.TRITANIUM_ORE_CLUMP) { Item(DEFAULT_PROPERTIES) }
val TRITANIUM_DUST: Item by registry.register(MNames.TRITANIUM_DUST) { Item(DEFAULT_PROPERTIES) } val TRITANIUM_DUST: Item by registry.register(MNames.TRITANIUM_DUST) { Item(DEFAULT_PROPERTIES) }