aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt
blob: f366f0aed5d3efd76766c81c2167ba17e082f823 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package at.hannibal2.skyhanni.data

import at.hannibal2.skyhanni.api.CollectionAPI
import at.hannibal2.skyhanni.events.InventoryCloseEvent
import at.hannibal2.skyhanni.events.OwnInventorItemUpdateEvent
import at.hannibal2.skyhanni.events.PacketEvent
import at.hannibal2.skyhanni.features.bazaar.BazaarApi
import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName
import at.hannibal2.skyhanni.utils.ItemUtils.name
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NEUItems
import net.minecraft.item.ItemStack
import net.minecraft.network.play.server.S2FPacketSetSlot
import net.minecraftforge.fml.common.eventhandler.EventPriority
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

class OwnInventoryData {

    private var itemNames = mutableMapOf<Int, String>()
    private var itemAmount = mutableMapOf<Int, Int>()

    @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
                OwnInventorItemUpdateEvent(item).postAndCatch()
            }
        }
        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)
                }
            }
            itemNames[slot] = name
            itemAmount[slot] = amount
        }
    }

    @SubscribeEvent
    fun onInventoryClose(event: InventoryCloseEvent) {
        BazaarApi.inBazaarInventory = false
        lastClose = System.currentTimeMillis()
    }

    private var lastClose = 0L

    private fun add(item: ItemStack?, add: Int) {
        if (item == null) return

        val diffClose = System.currentTimeMillis() - lastClose
        if (diffClose < 500) return

        val diffWorld = System.currentTimeMillis() - LorenzUtils.lastWorldSwitch
        if (diffWorld < 3_000) return

        val internalName = item.getInternalName()
        if (internalName.startsWith("MAP-")) return

        val (_, amount) = NEUItems.getMultiplier(internalName)
        if (amount > 1) return

        if (internalName == "") {
            LorenzUtils.debug("OwnInventoryData add is empty for: '$internalName'")
            return
        }

        addMultiplier(internalName, add)
    }

    private fun addMultiplier(internalName: String, amount: Int) {
        CollectionAPI.addFromInventory(internalName, amount)
    }
}