allItemsStream, update quantum battery ticker

This commit is contained in:
DBotThePony 2022-09-15 20:59:24 +07:00
parent a1e6d28aff
commit 89c7adad8b
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 35 additions and 14 deletions

View File

@ -15,9 +15,9 @@ import ru.dbotthepony.mc.otm.compat.mekanism.getMekanismEnergySided
import ru.dbotthepony.mc.otm.compat.mekanism.mekanismEnergy
import ru.dbotthepony.mc.otm.container.iterator
import ru.dbotthepony.mc.otm.container.stream
import ru.dbotthepony.mc.otm.core.iterator
import ru.dbotthepony.mc.otm.core.ImpreciseFraction
import ru.dbotthepony.mc.otm.core.orNull
import java.util.IdentityHashMap
import java.util.stream.Stream
val ICapabilityProvider.matteryPlayer: MatteryPlayerCapability? get() = getCapability(MatteryCapability.MATTERY_PLAYER).orNull()
@ -152,8 +152,10 @@ fun ICapabilityProvider.getMatteryEnergySided(side: Direction? = null): LazyOpti
/**
* DO NOT modify returned ItemStacks!
*
* Contains all items that player might carry
*/
fun Player.itemStream(): Stream<out ItemStack> {
fun Player.itemsStream(): Stream<out ItemStack> {
val streams = ArrayList<Stream<out ItemStack>>()
streams.add(inventory.stream())
@ -170,6 +172,27 @@ fun Player.itemStream(): Stream<out ItemStack> {
return Streams.concat(*streams.toTypedArray())
}
/**
* DO NOT modify returned ItemStacks!
*
* Contains all items that player might see/access ([itemsStream] + open container's items)
*/
fun Player.allItemsStream(): Stream<out ItemStack> {
if (containerMenu == inventoryMenu) {
return itemsStream()
}
val seen = IdentityHashMap<ItemStack, Unit>(containerMenu.slots.size)
for (slot in containerMenu.slots) {
seen[slot.item] = Unit
}
return Streams.concat(
itemsStream().filter { it.isEmpty || it !in seen },
containerMenu.slots.stream().map { it.item })
}
fun Player.extendedItemIterator(): MutableIterator<ItemStack> {
return object : MutableIterator<ItemStack> {
private val regular = this@extendedItemIterator.inventory.iterator()

View File

@ -14,7 +14,7 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType
import net.minecraftforge.registries.ForgeRegistries
import ru.dbotthepony.mc.otm.capability.itemStream
import ru.dbotthepony.mc.otm.capability.itemsStream
import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.registry.MLootItemConditions
@ -25,7 +25,7 @@ class ItemInInventoryCondition(
val matchNBT: Boolean = false
) : LootItemCondition, LootItemCondition.Builder {
override fun test(t: LootContext): Boolean {
val matches = t[LootContextParams.LAST_DAMAGE_PLAYER]?.itemStream()?.filter {
val matches = t[LootContextParams.LAST_DAMAGE_PLAYER]?.itemsStream()?.filter {
if (it.isEmpty) {
return@filter false
}

View File

@ -380,19 +380,17 @@ class QuantumBatteryItem : Item {
for (ply in event.server.playerList.players) {
val networkedChannels = IntAVLTreeSet()
for (item in ply.containerMenu.itemStackIterator().nonEmpty()) {
if (item.item is QuantumBatteryItem) {
val power = item.getCapability(MatteryCapability.ENERGY).orThrow() as Power
for (item in ply.allItemsStream().filter { !it.isEmpty && it.item is QuantumBatteryItem }) {
val power = item.getCapability(MatteryCapability.ENERGY).orThrow() as Power
power.determineQuantumLinkWeak()
power.determineQuantumLinkWeak()
if (power.data.index < 0) {
continue
}
if (power.data.index < 0) {
continue
}
if (networkedChannels.add(power.data.index)) {
GenericNetworkChannel.send(ply, ChargePacket(item.item as QuantumBatteryItem, power.data.index, power.batteryLevel, power.data.passed, power.data.received))
}
if (networkedChannels.add(power.data.index)) {
GenericNetworkChannel.send(ply, ChargePacket(item.item as QuantumBatteryItem, power.data.index, power.batteryLevel, power.data.passed, power.data.received))
}
}
}