aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/data
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/data')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt100
1 files changed, 65 insertions, 35 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt b/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt
index da505f409..d6bd2d892 100644
--- a/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt
+++ b/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt
@@ -1,59 +1,90 @@
package at.hannibal2.skyhanni.data
import at.hannibal2.skyhanni.events.InventoryCloseEvent
-import at.hannibal2.skyhanni.events.OwnInventoryItemUpdateEvent
+import at.hannibal2.skyhanni.events.LorenzTickEvent
+import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent
import at.hannibal2.skyhanni.events.PacketEvent
import at.hannibal2.skyhanni.events.entity.ItemAddInInventoryEvent
import at.hannibal2.skyhanni.features.bazaar.BazaarApi
+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.NEUItems
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
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
-class OwnInventoryData {
+typealias SlotNumber = Int
+typealias ItemName = String
+typealias ItemData = Pair<ItemName, Int>
- private var itemNames = mutableMapOf<Int, String>()
- private var itemAmount = mutableMapOf<Int, Int>()
+class OwnInventoryData {
+ private var items = mapOf<SlotNumber, ItemData>()
+ private var dirty = false
@SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true)
fun onChatPacket(event: PacketEvent.ReceiveEvent) {
if (!LorenzUtils.inSkyBlock) return
- val packet = event.packet
- if (packet is S2FPacketSetSlot) {
- val windowId = packet.func_149175_c()
- if (windowId == 0) {
- val item = packet.func_149174_e() ?: return
- OwnInventoryItemUpdateEvent(item).postAndCatch()
+ if (event.packet.let { it is S2FPacketSetSlot || it is S0DPacketCollectItem }) {
+ dirty = true
+ }
+ }
+
+ @SubscribeEvent
+ fun onTick(event: LorenzTickEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (items.isEmpty()) {
+ initInventory()
+ }
+
+ if (!dirty) return
+
+ dirty = false
+ for ((slot, itemStack) in InventoryUtils.getItemsInOwnInventoryWithNull().withIndex()) {
+ val old = items[slot]
+ val new = itemStack.itemToPair()
+ if (old != new) {
+ item(slot, new, itemStack)
+ }
+ }
+ }
+
+ private fun initInventory() {
+ items = items.editCopy {
+ for ((slot, itemStack) in InventoryUtils.getItemsInOwnInventoryWithNull().withIndex()) {
+ this[slot] = itemStack.itemToPair()
}
}
- if (packet is S2FPacketSetSlot) {
- val windowId = packet.func_149175_c()
- val item = packet.func_149174_e()
- val slot = packet.func_149173_d()
- if (windowId != 0) return
- val name = item?.name ?: "null"
-
- val oldItem = itemNames.getOrDefault(slot, "null")
- val oldAmount = itemAmount.getOrDefault(slot, 0)
-
- val amount = item?.stackSize ?: 0
- if (name == oldItem) {
- val diff = amount - oldAmount
- if (amount > oldAmount) {
- add(item, diff)
- }
- } else {
- if (name != "null") {
- add(item, amount)
- }
+ }
+
+ @SubscribeEvent
+ fun onWorldChange(event: LorenzWorldChangeEvent) {
+ items = emptyMap()
+ }
+
+ private fun ItemStack?.itemToPair(): ItemData = this?.let { (name ?: "null") to stackSize } ?: Pair("null", 0)
+
+ private fun item(slot: SlotNumber, new: ItemData, itemStack: ItemStack?) {
+ val (oldItem, oldAmount) = items[slot] ?: Pair("null", 0)
+ val (name, amount) = new
+
+ if (name == oldItem) {
+ val diff = amount - oldAmount
+ if (amount > oldAmount) {
+ add(itemStack, diff)
}
- itemNames[slot] = name
- itemAmount[slot] = amount
+ } else {
+ if (name != "null") {
+ add(itemStack!!, amount)
+ }
+ }
+ items = items.editCopy {
+ this[slot] = new
}
}
@@ -65,9 +96,8 @@ class OwnInventoryData {
private var lastClose = 0L
- private fun add(item: ItemStack?, add: Int) {
- if (item == null) return
-
+ private fun add(item_: ItemStack?, add: Int) {
+ val item = item_ ?: return
val diffClose = System.currentTimeMillis() - lastClose
if (diffClose < 500) return