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.energy.IEnergyStorage
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.mekanismEnergy
import ru.dbotthepony.mc.otm.container.iterator
@ -148,14 +150,24 @@ fun ICapabilityProvider.getMatteryEnergySided(side: Direction? = null): LazyOpti
return LazyOptional.empty()
}
/**
* DO NOT modify returned ItemStacks!
*/
fun Player.itemStream(): Stream<out ItemStack> {
val streams = ArrayList<Stream<out ItemStack>>()
streams.add(inventory.stream())
matteryPlayer?.let {
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> {

View File

@ -1,14 +1,18 @@
package ru.dbotthepony.mc.otm.compat.curios
import com.google.common.collect.Streams
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap
import net.minecraft.world.entity.player.Player
import net.minecraft.world.inventory.Slot
import net.minecraft.world.item.ItemStack
import net.minecraftforge.fml.ModList
import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.container.stream
import ru.dbotthepony.mc.otm.core.orNull
import top.theillusivec4.curios.api.CuriosApi
import top.theillusivec4.curios.common.inventory.CosmeticCurioSlot
import top.theillusivec4.curios.common.inventory.CurioSlot
import java.util.stream.Stream
val isCuriosLoaded by lazy {
ModList.get().isLoaded(CuriosApi.MODID)
@ -50,3 +54,27 @@ val Player.curiosSlots: Collection<Pair<Slot, Slot?>> get() {
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
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 {
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 {
override fun test(t: LootContext): Boolean {
val matches = t[LootContextParams.LAST_DAMAGE_PLAYER]?.itemStream()?.filter {
if (it.isEmpty) {
return@filter false
}
if (matchDamage && matchNBT) {
it.item == item.item && it.tag == item.tag && it.damageValue == item.damageValue
} else if (matchDamage) {