diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt index 24fc3c4cf..2cc112b88 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt @@ -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(MBlockEntities.MATTER_DECOMPOSER, pos, state, DecomposerJob.CODEC) { @@ -162,7 +100,7 @@ class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState) override fun onJobFinish(status: JobStatus, 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() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt index 23ef6a790..5df4e5218 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt @@ -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() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt index f70db8db5..d2ae858c3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt @@ -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( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index 3afedaf0e..9986f0f96 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -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) }