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 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<ItemStack> = Spliterators.iterator(spliterator())
fun IItemHandler.spliterator(): Spliterator<out ItemStack> = ItemHandlerSpliterator(this)
fun IItemHandler.awareSpliterator(): Spliterator<out AwareItemStack> = ItemHandlerAwareSpliterator(this)
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.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<ItemStackWrapper>).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<ResolvedRecipe>
}
/**
* Please use exclusively inside recipe finder
*/
@JvmStatic
fun getDirect(value: Item): IMatterValue {
return Registry.direct(value)