Curios slots support inside itemStream
This commit is contained in:
parent
38334ec9e7
commit
a1e6d28aff
@ -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> {
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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]
|
||||
}
|
||||
|
@ -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)
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user