Curios slots support inside itemStream

This commit is contained in:
DBotThePony 2022-09-15 20:47:06 +07:00
parent 38334ec9e7
commit a1e6d28aff
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 82 additions and 2 deletions

View File

@ -9,6 +9,8 @@ import net.minecraftforge.common.capabilities.ICapabilityProvider
import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.common.util.LazyOptional
import net.minecraftforge.energy.IEnergyStorage import net.minecraftforge.energy.IEnergyStorage
import net.minecraftforge.fml.ModList import net.minecraftforge.fml.ModList
import ru.dbotthepony.mc.otm.compat.curios.curiosStream
import ru.dbotthepony.mc.otm.compat.curios.isCuriosLoaded
import ru.dbotthepony.mc.otm.compat.mekanism.getMekanismEnergySided import ru.dbotthepony.mc.otm.compat.mekanism.getMekanismEnergySided
import ru.dbotthepony.mc.otm.compat.mekanism.mekanismEnergy import ru.dbotthepony.mc.otm.compat.mekanism.mekanismEnergy
import ru.dbotthepony.mc.otm.container.iterator import ru.dbotthepony.mc.otm.container.iterator
@ -148,14 +150,24 @@ fun ICapabilityProvider.getMatteryEnergySided(side: Direction? = null): LazyOpti
return LazyOptional.empty() return LazyOptional.empty()
} }
/**
* DO NOT modify returned ItemStacks!
*/
fun Player.itemStream(): Stream<out ItemStack> { fun Player.itemStream(): Stream<out ItemStack> {
val streams = ArrayList<Stream<out ItemStack>>()
streams.add(inventory.stream())
matteryPlayer?.let { matteryPlayer?.let {
if (it.hasExoSuit) { if (it.hasExoSuit) {
return Streams.concat(inventory.stream(), it.exoSuitContainer.stream()) streams.add(it.exoSuitContainer.stream())
} }
} }
return inventory.stream() if (isCuriosLoaded) {
streams.add(curiosStream())
}
return Streams.concat(*streams.toTypedArray())
} }
fun Player.extendedItemIterator(): MutableIterator<ItemStack> { fun Player.extendedItemIterator(): MutableIterator<ItemStack> {

View File

@ -1,14 +1,18 @@
package ru.dbotthepony.mc.otm.compat.curios package ru.dbotthepony.mc.otm.compat.curios
import com.google.common.collect.Streams
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap
import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.player.Player
import net.minecraft.world.inventory.Slot import net.minecraft.world.inventory.Slot
import net.minecraft.world.item.ItemStack
import net.minecraftforge.fml.ModList import net.minecraftforge.fml.ModList
import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.container.stream
import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.core.orNull
import top.theillusivec4.curios.api.CuriosApi import top.theillusivec4.curios.api.CuriosApi
import top.theillusivec4.curios.common.inventory.CosmeticCurioSlot import top.theillusivec4.curios.common.inventory.CosmeticCurioSlot
import top.theillusivec4.curios.common.inventory.CurioSlot import top.theillusivec4.curios.common.inventory.CurioSlot
import java.util.stream.Stream
val isCuriosLoaded by lazy { val isCuriosLoaded by lazy {
ModList.get().isLoaded(CuriosApi.MODID) ModList.get().isLoaded(CuriosApi.MODID)
@ -50,3 +54,27 @@ val Player.curiosSlots: Collection<Pair<Slot, Slot?>> get() {
return getCuriosSlotsImpl() return getCuriosSlotsImpl()
} }
private fun Player.curiosStreamImpl(includeCosmetics: Boolean): Stream<out ItemStack> {
val handler = getCapability(MatteryCapability.CURIOS_INVENTORY).orNull() ?: return Stream.empty()
val result = ArrayList<Stream<out ItemStack>>()
for ((identifier, curio) in handler.curios) {
result.add(curio.stacks.stream())
if (includeCosmetics && curio.hasCosmetic()) {
result.add(curio.cosmeticStacks.stream())
}
}
return Streams.concat(*result.toTypedArray())
}
fun Player.curiosStream(includeCosmetics: Boolean = true): Stream<out ItemStack> {
if (!isCuriosLoaded) {
return Stream.empty()
}
return curiosStreamImpl(includeCosmetics)
}

View File

@ -8,6 +8,11 @@ import java.util.stream.Stream
import java.util.stream.StreamSupport import java.util.stream.StreamSupport
class ContainerSpliterator(private val container: Container, offset: Int = 0, private val maxPos: Int = container.containerSize) : ObjectSpliterators.AbstractIndexBasedSpliterator<ItemStack>(offset) { class ContainerSpliterator(private val container: Container, offset: Int = 0, private val maxPos: Int = container.containerSize) : ObjectSpliterators.AbstractIndexBasedSpliterator<ItemStack>(offset) {
init {
require(offset >= 0) { "Invalid offset $offset" }
require(offset + maxPos <= container.containerSize) { "$offset -> $maxPos while having only size of ${container.containerSize}!" }
}
override fun get(location: Int): ItemStack { override fun get(location: Int): ItemStack {
return container[location] return container[location]
} }

View File

@ -0,0 +1,31 @@
package ru.dbotthepony.mc.otm.container
import it.unimi.dsi.fastutil.objects.ObjectSpliterator
import it.unimi.dsi.fastutil.objects.ObjectSpliterators
import net.minecraft.world.item.ItemStack
import net.minecraftforge.items.IItemHandler
import java.util.Spliterator
import java.util.stream.Stream
import java.util.stream.StreamSupport
class ItemHandlerSpliterator(private val handler: IItemHandler, offset: Int = 0, private val maxPos: Int = handler.slots) : ObjectSpliterators.AbstractIndexBasedSpliterator<ItemStack>(offset) {
init {
require(offset >= 0) { "Invalid offset $offset" }
require(offset + maxPos <= handler.slots) { "$offset -> $maxPos while having only size of ${handler.slots}!" }
}
override fun get(location: Int): ItemStack {
return handler.getStackInSlot(location)
}
override fun getMaxPos(): Int {
return maxPos
}
override fun makeForSplit(pos: Int, maxPos: Int): ObjectSpliterator<ItemStack> {
return ItemHandlerSpliterator(handler, pos, maxPos)
}
}
fun IItemHandler.spliterator(): Spliterator<out ItemStack> = ItemHandlerSpliterator(this)
fun IItemHandler.stream(): Stream<out ItemStack> = StreamSupport.stream(spliterator(), false)

View File

@ -26,6 +26,10 @@ class ItemInInventoryCondition(
) : LootItemCondition, LootItemCondition.Builder { ) : LootItemCondition, LootItemCondition.Builder {
override fun test(t: LootContext): Boolean { override fun test(t: LootContext): Boolean {
val matches = t[LootContextParams.LAST_DAMAGE_PLAYER]?.itemStream()?.filter { val matches = t[LootContextParams.LAST_DAMAGE_PLAYER]?.itemStream()?.filter {
if (it.isEmpty) {
return@filter false
}
if (matchDamage && matchNBT) { if (matchDamage && matchNBT) {
it.item == item.item && it.tag == item.tag && it.damageValue == item.damageValue it.item == item.item && it.tag == item.tag && it.damageValue == item.damageValue
} else if (matchDamage) { } else if (matchDamage) {