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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
package at.hannibal2.skyhanni.data
import at.hannibal2.skyhanni.data.jsonobjects.repo.MaxwellPowersJson
import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.events.RepositoryReloadEvent
import at.hannibal2.skyhanni.test.command.ErrorManager
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland
import at.hannibal2.skyhanni.utils.NumberUtil.formatInt
import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher
import at.hannibal2.skyhanni.utils.StringUtils.matches
import at.hannibal2.skyhanni.utils.StringUtils.removeColor
import at.hannibal2.skyhanni.utils.StringUtils.removeResets
import at.hannibal2.skyhanni.utils.StringUtils.trimWhiteSpace
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraft.enchantment.Enchantment
import net.minecraft.enchantment.Enchantment.power
import net.minecraft.item.ItemStack
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
object MaxwellAPI {
private val storage get() = ProfileStorageData.profileSpecific
var currentPower: String?
get() = storage?.maxwell?.currentPower
set(value) {
storage?.maxwell?.currentPower = value ?: return
}
var magicalPower: Int?
get() = storage?.maxwell?.magicalPower
set(value) {
storage?.maxwell?.magicalPower = value ?: return
}
private var powers = mutableListOf<String>()
private val group = RepoPattern.group("data.maxwell")
private val chatPowerpattern by group.pattern(
"chat.power",
"§eYou selected the §a(?<power>.*) §e(power )?for your §aAccessory Bag§e!"
)
private val inventoryPowerPattern by group.pattern(
"inventory.power",
"§7Selected Power: §a(?<power>.*)"
)
private val inventoryMPPattern by group.pattern(
"inventory.magicalpower",
"§7Magical Power: §6(?<mp>[\\d,]+)"
)
private val thaumaturgyGuiPattern by group.pattern(
"gui.thaumaturgy",
"Accessory Bag Thaumaturgy"
)
private val yourBagsGuiPattern by group.pattern(
"gui.yourbags",
"Your Bags"
)
private val powerSelectedPattern by group.pattern(
"gui.selectedpower",
"§aPower is selected!"
)
@SubscribeEvent
fun onChat(event: LorenzChatEvent) {
if (!isEnabled()) return
val message = event.message.trimWhiteSpace().removeResets()
chatPowerpattern.matchMatcher(message) {
val power = group("power")
currentPower = getPowerByNameOrNull(power)
?: return ErrorManager.logErrorWithData(
UnknownMaxwellPower("Unknown power: $power"),
"Unknown power: $power",
"power" to power,
"message" to message
)
}
}
@SubscribeEvent
fun onInventoryFullyLoaded(event: InventoryFullyOpenedEvent) {
if (!isEnabled()) return
if (thaumaturgyGuiPattern.matches(event.inventoryName)) {
val selectedPowerStack =
event.inventoryItems.values.find {
powerSelectedPattern.matches(it.getLore().lastOrNull())
} ?: return
val displayName = selectedPowerStack.displayName.removeColor()
currentPower = getPowerByNameOrNull(displayName)
?: return ErrorManager.logErrorWithData(
UnknownMaxwellPower("Unknown power: $power"),
"Unknown power: $power",
"power" to power,
"displayName" to displayName,
"lore" to selectedPowerStack.getLore()
)
return
}
if (yourBagsGuiPattern.matches(event.inventoryName)) {
val stacks = event.inventoryItems
for (stack in stacks.values) {
processStack(stack)
}
}
}
private fun processStack(stack: ItemStack) {
for (line in stack.getLore()) {
inventoryMPPattern.matchMatcher(line) {
// MagicalPower is boosted in catacombs
if (IslandType.CATACOMBS.isInIsland()) return@matchMatcher
val mp = group("mp")
magicalPower = mp.formatInt()
return@matchMatcher
}
inventoryPowerPattern.matchMatcher(line) {
val power = group("power")
currentPower = getPowerByNameOrNull(power)
?: return@matchMatcher ErrorManager.logErrorWithData(
UnknownMaxwellPower("Unknown power: ${Enchantment.power}"),
"Unknown power: ${Enchantment.power}",
"power" to Enchantment.power,
"displayName" to stack.displayName,
"lore" to stack.getLore()
)
return@matchMatcher
}
}
}
private fun getPowerByNameOrNull(name: String) = powers.find { it == name }
fun isEnabled() = LorenzUtils.inSkyBlock && storage != null
// Load powers from repo
@SubscribeEvent
fun onRepoLoad(event: RepositoryReloadEvent) {
val data = event.getConstant<MaxwellPowersJson>("MaxwellPowers")
powers = data.powers
}
class UnknownMaxwellPower(message: String) : Exception(message)
}
|