From 471ddb49e55fd50a66c42cb90018ad4568f0b684 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 19 Nov 2022 15:01:57 +0700 Subject: [PATCH] Matter value calculation now account for itemhandler --- .../otm/container/ItemHandlerSpliterator.kt | 3 +- .../mc/otm/matter/MatterManager.kt | 36 ++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemHandlerSpliterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemHandlerSpliterator.kt index bd8cffb9d..4482d0efc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemHandlerSpliterator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemHandlerSpliterator.kt @@ -6,7 +6,7 @@ import net.minecraft.world.item.ItemStack import net.minecraftforge.items.IItemHandler import ru.dbotthepony.mc.otm.core.AwareItemStack import ru.dbotthepony.mc.otm.core.ItemHandlerItemStackEntry -import java.util.Spliterator +import java.util.* import java.util.stream.Stream import java.util.stream.StreamSupport @@ -48,6 +48,7 @@ class ItemHandlerAwareSpliterator(private val handler: IItemHandler, offset: Int } } +fun IItemHandler.iterator(): Iterator = Spliterators.iterator(spliterator()) fun IItemHandler.spliterator(): Spliterator = ItemHandlerSpliterator(this) fun IItemHandler.awareSpliterator(): Spliterator = ItemHandlerAwareSpliterator(this) fun IItemHandler.stream(): Stream = StreamSupport.stream(spliterator(), false) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt index 13a4b3df4..8fa9a5281 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt @@ -38,6 +38,7 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.level.ItemLike +import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.event.AddReloadListenerEvent import net.minecraftforge.event.OnDatapackSyncEvent import net.minecraftforge.event.RegisterCommandsEvent @@ -60,12 +61,16 @@ import ru.dbotthepony.mc.otm.SystemTime import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.drive.IMatteryDrive import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.container.iterator +import ru.dbotthepony.mc.otm.container.spliterator +import ru.dbotthepony.mc.otm.container.stream import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.filterNotNull import ru.dbotthepony.mc.otm.core.formatMatterFull import ru.dbotthepony.mc.otm.core.formatSiComponent +import ru.dbotthepony.mc.otm.core.ifPresentK import ru.dbotthepony.mc.otm.core.isActuallyEmpty import ru.dbotthepony.mc.otm.core.isZero import ru.dbotthepony.mc.otm.core.orNull @@ -962,7 +967,7 @@ object MatterManager { return get(value).hasMatterValue } - private fun get(value: ItemStack, level: Int): IMatterValue { + private fun get(value: ItemStack, level: Int, accountForStackSize: Boolean): IMatterValue { if (value.isEmpty) { return IMatterValue.Companion } @@ -994,7 +999,7 @@ object MatterManager { if (drive != null && drive.storageType === OverdriveThatMatters.INSTANCE.ITEM_STORAGE()) { for (item in (drive as IMatteryDrive).stacks) { - val tuple = get(item.stack.stack, level + 1) + val tuple = get(item.stack.stack, level + 1, true) if (tuple.hasMatterValue) { matter += tuple @@ -1003,7 +1008,24 @@ object MatterManager { } } - if (matter.hasMatterValue && value.count > 1) { + value.getCapability(ForgeCapabilities.ITEM_HANDLER).ifPresentK { + it.stream().filter { !it.isEmpty }.map { get(it, level + 1, true) }.reduce { a, b -> + if (a.hasMatterValue && b.hasMatterValue) { + return@reduce MatterValue(a.matter + b.matter, a.complexity + b.complexity) + } else if (a.hasMatterValue) { + return@reduce a + } else if (b.hasMatterValue) { + return@reduce b + } else { + return@reduce IMatterValue.Companion + } + }.ifPresent { + matter += it + undamagedMatterValue += it + } + } + + if (matter.hasMatterValue && value.count > 1 && accountForStackSize) { return MatterValue(matter.matter + undamagedMatterValue.matter * (value.count - 1), matter.complexity + undamagedMatterValue.complexity * (value.count - 1)) } @@ -1014,8 +1036,9 @@ object MatterManager { * Matter value for itemstack, accounting for capabilities and stack size */ @JvmStatic - fun get(value: ItemStack): IMatterValue { - return get(value, 0) + @JvmOverloads + fun get(value: ItemStack, accountForStackSize: Boolean = true): IMatterValue { + return get(value, 0, accountForStackSize) } @JvmStatic @@ -1159,6 +1182,9 @@ object MatterManager { fun find(server: MinecraftServer, json: JsonObject): Stream } + /** + * Please use exclusively inside recipe finder + */ @JvmStatic fun getDirect(value: Item): IMatterValue { return Registry.direct(value)