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.level.Level
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.JobStatus
import ru.dbotthepony.mc.otm.block.entity.Job
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
import ru.dbotthepony.mc.otm.capability.FlowDirection
import ru.dbotthepony.mc.otm.capability.MatteryCapability
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.WorkerEnergyStorage
import ru.dbotthepony.mc.otm.capability.matter.MatterStorageImpl
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.container.HandlerFilter
import ru.dbotthepony.mc.otm.container.MatteryContainer
import ru.dbotthepony.mc.otm.container.UpgradeContainer
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.minRange
import ru.dbotthepony.mc.otm.graph.matter.MatterGraph
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.menu.matter.MatterDecomposerMenu
import ru.dbotthepony.mc.otm.registry.MBlockEntities
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)
: 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) {
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)
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.menu.matter.MatterReplicatorMenu
import ru.dbotthepony.mc.otm.registry.MBlockEntities
import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MNames
import java.util.*
@ -113,7 +114,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
val job = status.job
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) {
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.level.Level
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.math.Decimal
import ru.dbotthepony.mc.otm.matter.IMatterItem
import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.matter.IMatterValue
import ru.dbotthepony.mc.otm.matter.MatterValue
import ru.dbotthepony.mc.otm.registry.MItems
class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem {
private fun matter(stack: ItemStack): Decimal {
@ -32,6 +34,59 @@ class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem {
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 appendHoverText(

View File

@ -206,7 +206,7 @@ object MItems {
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_DUST: Item by registry.register(MNames.TRITANIUM_DUST) { Item(DEFAULT_PROPERTIES) }