blob: 0f029a1f2e2e7c2781fef9059173537aecff27d9 (
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
|
package at.hannibal2.skyhanni.data
import at.hannibal2.skyhanni.events.InventoryCloseEvent
import at.hannibal2.skyhanni.events.PurseChangeCause
import at.hannibal2.skyhanni.events.PurseChangeEvent
import at.hannibal2.skyhanni.events.ScoreboardUpdateEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.NumberUtil.formatDouble
import at.hannibal2.skyhanni.utils.NumberUtil.million
import at.hannibal2.skyhanni.utils.RegexUtils.matchFirst
import at.hannibal2.skyhanni.utils.SimpleTimeMark
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraft.client.Minecraft
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import kotlin.time.Duration.Companion.seconds
@SkyHanniModule
object PurseAPI {
private val patternGroup = RepoPattern.group("data.purse")
val coinsPattern by patternGroup.pattern(
"coins",
"(§.)*(Piggy|Purse): §6(?<coins>[\\d,.]+)( ?(§.)*\\([+-](?<earned>[\\d,.]+)\\)?|.*)?$",
)
val piggyPattern by patternGroup.pattern(
"piggy",
"Piggy: (?<coins>.*)",
)
private var inventoryCloseTime = SimpleTimeMark.farPast()
var currentPurse = 0.0
private set
@SubscribeEvent
fun onInventoryClose(event: InventoryCloseEvent) {
inventoryCloseTime = SimpleTimeMark.now()
}
@SubscribeEvent
fun onScoreboardChange(event: ScoreboardUpdateEvent) {
event.scoreboard.matchFirst(coinsPattern) {
val newPurse = group("coins").formatDouble()
val diff = newPurse - currentPurse
if (diff == 0.0) return
currentPurse = newPurse
PurseChangeEvent(diff, getCause(diff)).postAndCatch()
}
}
// TODO add more causes in the future (e.g. ah/bz/bank)
private fun getCause(diff: Double): PurseChangeCause {
if (diff > 0) {
if (diff == 1.0) {
return PurseChangeCause.GAIN_TALISMAN_OF_COINS
}
// TODO relic of coins support
if (diff == 15.million || diff == 100.million) {
return PurseChangeCause.GAIN_DICE_ROLL
}
if (Minecraft.getMinecraft().currentScreen == null) {
if (inventoryCloseTime.passedSince() > 2.seconds) {
return PurseChangeCause.GAIN_MOB_KILL
}
}
return PurseChangeCause.GAIN_UNKNOWN
} else {
if (SlayerAPI.questStartTime.passedSince() < 1.5.seconds) {
return PurseChangeCause.LOSE_SLAYER_QUEST_STARTED
}
if (diff == -6_666_666.0 || diff == -666_666.0) {
return PurseChangeCause.LOSE_DICE_ROLL_COST
}
return PurseChangeCause.LOSE_UNKNOWN
}
}
fun getPurse(): Double = currentPurse
}
|