Matter value calculation now account for itemhandler

This commit is contained in:
DBotThePony 2022-11-19 15:01:57 +07:00
parent f68a927773
commit 471ddb49e5
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 33 additions and 6 deletions

View File

@ -6,7 +6,7 @@ import net.minecraft.world.item.ItemStack
import net.minecraftforge.items.IItemHandler import net.minecraftforge.items.IItemHandler
import ru.dbotthepony.mc.otm.core.AwareItemStack import ru.dbotthepony.mc.otm.core.AwareItemStack
import ru.dbotthepony.mc.otm.core.ItemHandlerItemStackEntry import ru.dbotthepony.mc.otm.core.ItemHandlerItemStackEntry
import java.util.Spliterator import java.util.*
import java.util.stream.Stream import java.util.stream.Stream
import java.util.stream.StreamSupport import java.util.stream.StreamSupport
@ -48,6 +48,7 @@ class ItemHandlerAwareSpliterator(private val handler: IItemHandler, offset: Int
} }
} }
fun IItemHandler.iterator(): Iterator<ItemStack> = Spliterators.iterator(spliterator())
fun IItemHandler.spliterator(): Spliterator<out ItemStack> = ItemHandlerSpliterator(this) fun IItemHandler.spliterator(): Spliterator<out ItemStack> = ItemHandlerSpliterator(this)
fun IItemHandler.awareSpliterator(): Spliterator<out AwareItemStack> = ItemHandlerAwareSpliterator(this) fun IItemHandler.awareSpliterator(): Spliterator<out AwareItemStack> = ItemHandlerAwareSpliterator(this)
fun IItemHandler.stream(): Stream<out ItemStack> = StreamSupport.stream(spliterator(), false) fun IItemHandler.stream(): Stream<out ItemStack> = StreamSupport.stream(spliterator(), false)

View File

@ -38,6 +38,7 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.Recipe
import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.item.crafting.RecipeType
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.minecraftforge.common.capabilities.ForgeCapabilities
import net.minecraftforge.event.AddReloadListenerEvent import net.minecraftforge.event.AddReloadListenerEvent
import net.minecraftforge.event.OnDatapackSyncEvent import net.minecraftforge.event.OnDatapackSyncEvent
import net.minecraftforge.event.RegisterCommandsEvent 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.MatteryCapability
import ru.dbotthepony.mc.otm.capability.drive.IMatteryDrive import ru.dbotthepony.mc.otm.capability.drive.IMatteryDrive
import ru.dbotthepony.mc.otm.client.minecraft 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.ImpreciseFraction
import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.filterNotNull import ru.dbotthepony.mc.otm.core.filterNotNull
import ru.dbotthepony.mc.otm.core.formatMatterFull import ru.dbotthepony.mc.otm.core.formatMatterFull
import ru.dbotthepony.mc.otm.core.formatSiComponent 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.isActuallyEmpty
import ru.dbotthepony.mc.otm.core.isZero import ru.dbotthepony.mc.otm.core.isZero
import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.core.orNull
@ -962,7 +967,7 @@ object MatterManager {
return get(value).hasMatterValue 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) { if (value.isEmpty) {
return IMatterValue.Companion return IMatterValue.Companion
} }
@ -994,7 +999,7 @@ object MatterManager {
if (drive != null && drive.storageType === OverdriveThatMatters.INSTANCE.ITEM_STORAGE()) { if (drive != null && drive.storageType === OverdriveThatMatters.INSTANCE.ITEM_STORAGE()) {
for (item in (drive as IMatteryDrive<ItemStackWrapper>).stacks) { for (item in (drive as IMatteryDrive<ItemStackWrapper>).stacks) {
val tuple = get(item.stack.stack, level + 1) val tuple = get(item.stack.stack, level + 1, true)
if (tuple.hasMatterValue) { if (tuple.hasMatterValue) {
matter += tuple 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)) 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 * Matter value for itemstack, accounting for capabilities and stack size
*/ */
@JvmStatic @JvmStatic
fun get(value: ItemStack): IMatterValue { @JvmOverloads
return get(value, 0) fun get(value: ItemStack, accountForStackSize: Boolean = true): IMatterValue {
return get(value, 0, accountForStackSize)
} }
@JvmStatic @JvmStatic
@ -1159,6 +1182,9 @@ object MatterManager {
fun find(server: MinecraftServer, json: JsonObject): Stream<ResolvedRecipe> fun find(server: MinecraftServer, json: JsonObject): Stream<ResolvedRecipe>
} }
/**
* Please use exclusively inside recipe finder
*/
@JvmStatic @JvmStatic
fun getDirect(value: Item): IMatterValue { fun getDirect(value: Item): IMatterValue {
return Registry.direct(value) return Registry.direct(value)