From 66f8380ec2f2589b94188e8b084910d2bc72299c Mon Sep 17 00:00:00 2001 From: hannibal2 <24389977+hannibal00212@users.noreply.github.com> Date: Sat, 25 Nov 2023 13:33:51 +0100 Subject: fixed bug with wrongly detecting item pickups --- .../at/hannibal2/skyhanni/data/OwnInventoryData.kt | 76 +++++++--------------- 1 file changed, 22 insertions(+), 54 deletions(-) (limited to 'src/main') diff --git a/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt b/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt index 9be617546..6e128b776 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt @@ -10,13 +10,11 @@ import at.hannibal2.skyhanni.features.bazaar.BazaarApi import at.hannibal2.skyhanni.features.bazaar.BazaarApi.Companion.isBazaarItem import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.ItemUtils.getInternalNameOrNull -import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.editCopy +import at.hannibal2.skyhanni.utils.LorenzUtils.addOrPut import at.hannibal2.skyhanni.utils.NEUInternalName import at.hannibal2.skyhanni.utils.SimpleTimeMark import net.minecraft.client.Minecraft -import net.minecraft.item.ItemStack import net.minecraft.network.play.server.S0DPacketCollectItem import net.minecraft.network.play.server.S2FPacketSetSlot import net.minecraftforge.fml.common.eventhandler.EventPriority @@ -24,12 +22,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds -typealias SlotNumber = Int -typealias ItemName = String -typealias ItemData = Pair - class OwnInventoryData { - private var items = mapOf() + private var itemAmounts = mapOf() private var dirty = false @SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true) @@ -52,55 +46,40 @@ class OwnInventoryData { @SubscribeEvent fun onTick(event: LorenzTickEvent) { if (!LorenzUtils.inSkyBlock) return - if (items.isEmpty()) { - initInventory() + if (itemAmounts.isEmpty()) { + itemAmounts = getCurrentItems() } if (!dirty) return - dirty = false - for ((slot, itemStack) in InventoryUtils.getItemsInOwnInventoryWithNull().withIndex()) { - val old = items[slot] - val new = itemStack.itemToPair() - if (old != new) { - itemStack?.let { - calculateDifference(slot, new, it) - } - items = items.editCopy { - this[slot] = new - } - } + + val map = getCurrentItems() + for ((internalName, amount) in map) { + calculateDifference(internalName, amount) } + itemAmounts = map } - private fun initInventory() { - items = items.editCopy { - for ((slot, itemStack) in InventoryUtils.getItemsInOwnInventoryWithNull().withIndex()) { - this[slot] = itemStack.itemToPair() - } + private fun getCurrentItems(): MutableMap { + val map = mutableMapOf() + for (itemStack in InventoryUtils.getItemsInOwnInventory()) { + val internalName = itemStack.getInternalNameOrNull() ?: continue + map.addOrPut(internalName, itemStack.stackSize) } + return map } @SubscribeEvent fun onWorldChange(event: LorenzWorldChangeEvent) { - items = emptyMap() + itemAmounts = emptyMap() } - private fun ItemStack?.itemToPair(): ItemData = this?.let { (name ?: "null") to stackSize } ?: Pair("null", 0) - - private fun calculateDifference(slot: SlotNumber, new: ItemData, itemStack: ItemStack) { - val (oldItem, oldAmount) = items[slot] ?: Pair("null", 0) - val (name, amount) = new + private fun calculateDifference(internalName: NEUInternalName, newAmount: Int) { + val oldAmount = itemAmounts[internalName] ?: 0 - if (name == oldItem) { - val diff = amount - oldAmount - if (diff > 0) { - addItem(itemStack, diff) - } - } else { - if (name != "null") { - addItem(itemStack, amount) - } + val diff = newAmount - oldAmount + if (diff > 0) { + addItem(internalName, diff) } } @@ -126,21 +105,10 @@ class OwnInventoryData { class IgnoredItem(val condition: (NEUInternalName) -> Boolean, val blockedUntil: SimpleTimeMark) - private fun addItem(item: ItemStack, add: Int) { + private fun addItem(internalName: NEUInternalName, add: Int) { val diffWorld = System.currentTimeMillis() - LorenzUtils.lastWorldSwitch if (diffWorld < 3_000) return - item.name?.let { - if (it == "ยง8Quiver Arrow") { - return - } - } - - val internalName = item.getInternalNameOrNull() ?: run { - LorenzUtils.debug("OwnInventoryData add is null for: '${item.name}'") - return - } - ignoredItemsUntil.removeIf { it.blockedUntil.isInPast() } if (ignoredItemsUntil.any { it.condition(internalName) }) return -- cgit