blob: 369c6984f5b7c718241a4c3fd11cec4c6f7e5e70 (
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
|
package at.hannibal2.skyhanni.features.misc
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.hypixel.chat.event.SystemMessageEvent
import at.hannibal2.skyhanni.events.ChatHoverEvent
import at.hannibal2.skyhanni.events.LorenzToolTipEvent
import at.hannibal2.skyhanni.features.inventory.patternGroup
import at.hannibal2.skyhanni.mixins.hooks.GuiChatHook
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimal
import at.hannibal2.skyhanni.utils.RegexUtils.matches
import at.hannibal2.skyhanni.utils.StringUtils.applyIfPossible
import at.hannibal2.skyhanni.utils.StringUtils.isRoman
import at.hannibal2.skyhanni.utils.StringUtils.removeColor
import net.minecraft.event.HoverEvent
import net.minecraft.util.ChatComponentText
import net.minecraftforge.fml.common.eventhandler.EventPriority
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
@SkyHanniModule
object ReplaceRomanNumerals {
// Using toRegex here since toPattern doesn't seem to provide the necessary functionality
private val splitRegex = "((§\\w)|(\\s+)|(\\W))+|(\\w*)".toRegex()
//
/**
* REGEX-TEST: §eSelect an option: §r§a[§aOk, then what?§a]
*/
private val isSelectOptionPattern by patternGroup.pattern(
"string.isselectoption",
"§eSelect an option: .*"
)
// TODO: Remove after pr 1717 is ready and switch to ItemHoverEvent
@SubscribeEvent(priority = EventPriority.LOWEST)
fun onTooltip(event: LorenzToolTipEvent) {
if (!isEnabled()) return
event.toolTip.replaceAll { it.transformLine() }
}
@SubscribeEvent(priority = EventPriority.LOWEST)
fun onChatHover(event: ChatHoverEvent) {
if (event.getHoverEvent().action != HoverEvent.Action.SHOW_TEXT) return
if (!isEnabled()) return
val lore = event.getHoverEvent().value.formattedText.split("\n").toMutableList()
lore.replaceAll { it.transformLine() }
val chatComponentText = ChatComponentText(lore.joinToString("\n"))
val hoverEvent = HoverEvent(event.component.chatStyle.chatHoverEvent.action, chatComponentText)
GuiChatHook.replaceOnlyHoverEvent(hoverEvent)
}
@SubscribeEvent
fun onSystemMessage(event: SystemMessageEvent) {
if (!isEnabled() || event.message.isSelectOption()) return
event.applyIfPossible { it.transformLine() }
}
private fun String.isSelectOption(): Boolean = isSelectOptionPattern.matches(this)
private fun String.transformLine() = splitRegex.findAll(this).map { it.value }.joinToString("") {
it.takeIf { it.isValidRomanNumeral() && it.removeFormatting().romanToDecimal() != 2000 }?.coloredRomanToDecimal() ?: it
}
private fun String.removeFormatting() = removeColor().replace(",", "")
private fun String.isValidRomanNumeral() = removeFormatting()
.let { it.isRoman() && it.isNotEmpty() }
private fun String.coloredRomanToDecimal() = removeFormatting()
.let { replace(it, it.romanToDecimal().toString()) }
private fun isEnabled() = LorenzUtils.inSkyBlock && SkyHanniMod.feature.misc.replaceRomanNumerals
}
|