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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
package at.hannibal2.skyhanni.api
import at.hannibal2.skyhanni.events.CollectionUpdateEvent
import at.hannibal2.skyhanni.events.InventoryOpenEvent
import at.hannibal2.skyhanni.events.ProfileApiDataLoadedEvent
import at.hannibal2.skyhanni.events.ProfileJoinEvent
import at.hannibal2.skyhanni.features.bazaar.BazaarApi
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.ItemUtils.name
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NEUItems
import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher
import at.hannibal2.skyhanni.utils.StringUtils.removeColor
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
class CollectionAPI {
private val counterPattern = "(?:.*) §e(?<amount>.*)§6\\/(?:.*)".toPattern()
private val singleCounterPattern = "§7Total Collected: §e(?<amount>.*)".toPattern()
// private val hypixelApiHasWrongItems = listOf(
// "WOOL",
// "CORRUPTED_FRAGMENT",
// "EGG",
// "POISONOUS_POTATO",
// "REDSTONE_BLOCK",
// "MUSHROOM_COLLECTION",
// "RAW_SOULFLOW",
// "GEMSTONE_COLLECTION",
// )
@SubscribeEvent
fun onProfileDataLoad(event: ProfileApiDataLoadedEvent) {
val profileData = event.profileData
val jsonElement = profileData["collection"] ?: return
val asJsonObject = jsonElement.asJsonObject ?: return
for ((hypixelId, rawCounter) in asJsonObject.entrySet()) {
val counter = rawCounter.asLong
val neuItemId = NEUItems.transHypixelNameToInternalName(hypixelId)
val itemName = BazaarApi.getBazaarDataByInternalName(neuItemId)?.displayName
// Hypixel moment
// if (hypixelApiHasWrongItems.contains(neuItemId)) continue
if (itemName == null) {
// LorenzUtils.debug("collection name is null for '$neuItemId'")
continue
}
collectionValue[neuItemId] = counter
}
CollectionUpdateEvent().postAndCatch()
}
@SubscribeEvent
fun onProfileJoin(event: ProfileJoinEvent) {
collectionValue.clear()
}
@SubscribeEvent
fun onTick(event: InventoryOpenEvent) {
val inventoryName = event.inventoryName
if (inventoryName.endsWith(" Collection")) {
val stack = event.inventoryItems[4] ?: return
for (line in stack.getLore()) {
singleCounterPattern.matchMatcher(line) {
val counter = group("amount").replace(",", "").toLong()
val name = inventoryName.split(" ").dropLast(1).joinToString(" ")
collectionValue[name] = counter
}
}
CollectionUpdateEvent().postAndCatch()
}
if (inventoryName.endsWith(" Collections")) {
if (inventoryName == "Boss Collections") return
for ((_, stack) in event.inventoryItems) {
var name = stack.name?.removeColor() ?: continue
if (name.contains("Collections")) continue
val lore = stack.getLore()
if (!lore.any { it.contains("Click to view!") }) continue
if (!isCollectionTier0(lore)) {
name = name.split(" ").dropLast(1).joinToString(" ")
}
for (line in lore) {
counterPattern.matchMatcher(line) {
val counter = group("amount").replace(",", "").toLong()
collectionValue[name] = counter
}
}
}
CollectionUpdateEvent().postAndCatch()
}
}
companion object {
private val collectionValue = mutableMapOf<String, Long>()
private val collectionTier0Pattern = "§7Progress to .* I: .*".toPattern()
fun isCollectionTier0(lore: List<String>) = lore.map { collectionTier0Pattern.matcher(it) }.any { it.matches() }
fun getCollectionCounter(searchName: String): Pair<String, Long>? {
for ((collectionName, counter) in collectionValue) {
if (collectionName.equals(searchName, true)) {
return Pair(collectionName, counter)
}
}
return null
}
// TODO add support for replenish (higher collection than actual items in inv)
fun addFromInventory(internalName: String, amount: Int) {
val stack = NEUItems.getItemStackOrNull(internalName)
if (stack == null) {
LorenzUtils.debug("CollectionAPI.addFromInventory: internalName is null for '$internalName'")
return
}
val name = stack.name!!.removeColor()
val oldValue = collectionValue[name] ?: return
val newValue = oldValue + amount
collectionValue[name] = newValue
}
}
}
|