From 8a683bc8281c20ef3f06f430c7772127ec01079a Mon Sep 17 00:00:00 2001 From: SeRaid <77941535+SeRaid743@users.noreply.github.com> Date: Wed, 22 May 2024 18:45:51 +1200 Subject: [PATCH] more files --- .../at/hannibal2/skyhanni/data/MaxwellAPI.kt | 4 +- .../java/at/hannibal2/skyhanni/data/PetAPI.kt | 13 ++--- .../at/hannibal2/skyhanni/data/SackAPI.kt | 22 +++++--- .../skyhanni/data/mob/MobDetection.kt | 14 ++--- .../skyhanni/data/mob/MobFactories.kt | 12 ++--- .../hannibal2/skyhanni/data/mob/MobFilter.kt | 52 +++++++++++++------ .../skyhanni/features/chat/Translator.kt | 14 ++++- .../skyhanni/features/combat/BestiaryData.kt | 30 +++++++++-- .../combat/ghostcounter/GhostCounter.kt | 9 +++- .../skyhanni/features/dungeon/DungeonAPI.kt | 7 +-- .../features/dungeon/DungeonBossMessages.kt | 10 ++-- .../features/dungeon/DungeonDeathCounter.kt | 4 +- .../features/fame/AccountUpgradeReminder.kt | 36 +++++++++---- .../fishing/tracker/SeaCreatureTracker.kt | 4 +- .../features/garden/pests/PestSpawn.kt | 12 ++--- .../features/inventory/HighlightBonzoMasks.kt | 9 ++-- .../inventory/ItemDisplayOverlayFeatures.kt | 4 +- .../features/mining/GoldenGoblinHighlight.kt | 4 +- .../features/mining/MiningNotifications.kt | 16 +++--- .../misc/items/enchants/EnchantParser.kt | 7 ++- .../features/misc/trevor/TrevorFeatures.kt | 12 ++--- .../misc/visualwords/ModifyVisualWords.kt | 2 - .../rift/everywhere/CruxTalismanDisplay.kt | 14 +++-- .../at/hannibal2/skyhanni/utils/MobUtils.kt | 4 +- 24 files changed, 203 insertions(+), 112 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/MaxwellAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/MaxwellAPI.kt index e7ae08eee69d..1e0243ddb4d6 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/MaxwellAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/MaxwellAPI.kt @@ -108,7 +108,7 @@ object MaxwellAPI { "gui.noselectedpower", "(?:§.)*Visit Maxwell in the Hub to learn" ) - private val accessoryBagStack by patternGroup.pattern( + private val accessoryBagStackPattern by patternGroup.pattern( "stack.accessorybag", "§.Accessory Bag" ) @@ -164,7 +164,7 @@ object MaxwellAPI { if (yourBagsGuiPattern.matches(event.inventoryName)) { for (stack in event.inventoryItems.values) { - if (accessoryBagStack.matches(stack.displayName)) processStack(stack) + if (accessoryBagStackPattern.matches(stack.displayName)) processStack(stack) } } if (statsTuningGuiPattern.matches(event.inventoryName)) { diff --git a/src/main/java/at/hannibal2/skyhanni/data/PetAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/PetAPI.kt index 61b22a7d7f30..83e98063e7d5 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/PetAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/PetAPI.kt @@ -10,11 +10,11 @@ object PetAPI { "menu.title", "Pets(?: \\(\\d+/\\d+\\) )?" ) - private val petItemName by patternGroup.pattern( + private val petItemNamePattern by patternGroup.pattern( "item.name", "(?:§.)*\\[Lvl (?\\d+)] (?.*)" ) - private val neuRepoPetItemName by patternGroup.pattern( + private val neuRepoPetItemNamePattern by patternGroup.pattern( "item.name.neu.format", "(§f§f)?§7\\[Lvl 1➡(100|200)] (?.*)" ) @@ -40,19 +40,20 @@ object PetAPI { fun isCurrentPet(petName: String): Boolean = currentPet?.contains(petName) ?: false fun getCleanName(nameWithLevel: String): String? { - petItemName.matchMatcher(nameWithLevel) { + petItemNamePattern.matchMatcher(nameWithLevel) { return group("name") } - neuRepoPetItemName.matchMatcher(nameWithLevel) { + neuRepoPetItemNamePattern.matchMatcher(nameWithLevel) { return group("name") } return null } - fun getPetLevel(nameWithLevel: String): Int? = petItemName.matchMatcher(nameWithLevel) { + fun getPetLevel(nameWithLevel: String): Int? = petItemNamePattern.matchMatcher(nameWithLevel) { group("level").toInt() } - fun hasPetName(name: String): Boolean = petItemName.matches(name) && !ignoredPetStrings.any { name.contains(it) } + fun hasPetName(name: String): Boolean = + petItemNamePattern.matches(name) && !ignoredPetStrings.any { name.contains(it) } } diff --git a/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt index df9d6fea1b99..227262eff2a5 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt @@ -25,6 +25,7 @@ import at.hannibal2.skyhanni.utils.NEUItems.getNpcPriceOrNull import at.hannibal2.skyhanni.utils.NEUItems.getPrice import at.hannibal2.skyhanni.utils.NumberUtil.formatInt import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimal +import at.hannibal2.skyhanni.utils.StringUtils.findMatcher import at.hannibal2.skyhanni.utils.StringUtils.matchAll import at.hannibal2.skyhanni.utils.StringUtils.matchFirst import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher @@ -57,6 +58,10 @@ object SackAPI { "gemstone", " §[0-9a-f](?[A-z]*): §[0-9a-f](?\\d+(?:\\.\\d+)?(?:(?:,\\d+)?)+[kKmM]?)(?: §[0-9a-f]\\(\\d+(?:\\.\\d+)?(?:(?:,\\d+)?)+[kKmM]?\\))?" ) + private val sackChangePattern by patternGroup.pattern( + "sackchange", + "(?[+-][\\d,]+) (?.+) \\((?.+)\\)" + ) private var isRuneSack = false private var isGemstoneSack = false @@ -228,8 +233,6 @@ object SackAPI { data class SackChange(val delta: Int, val internalName: NEUInternalName, val sacks: List) - private val sackChangeRegex = Regex("""([+-][\d,]+) (.+) \((.+)\)""") - @SubscribeEvent fun onChat(event: LorenzChatEvent) { if (!event.message.removeColor().startsWith("[Sacks]")) return @@ -252,13 +255,16 @@ object SackAPI { val otherItemsRemoved = sackRemoveText.contains("other items") val sackChanges = ArrayList() - for (match in sackChangeRegex.findAll(sackChangeText)) { - val delta = match.groups[1]!!.value.formatInt() - val item = match.groups[2]!!.value - val sacks = match.groups[3]!!.value.split(", ") - val internalName = NEUInternalName.fromItemName(item) - sackChanges.add(SackChange(delta, internalName, sacks)) + for (line in sackChangeText.lines()) { + sackChangePattern.findMatcher(line) { + val amount = group("amount").formatInt() + val item = group("name") + val sacks = group("sacks").split(", ") + + val internalName = NEUInternalName.fromItemName(item) + sackChanges.add(SackChange(amount, internalName, sacks)) + } } val sackEvent = SackChangeEvent(sackChanges, otherItemsAdded, otherItemsRemoved) updateSacks(sackEvent) diff --git a/src/main/java/at/hannibal2/skyhanni/data/mob/MobDetection.kt b/src/main/java/at/hannibal2/skyhanni/data/mob/MobDetection.kt index 6497fddfb3e8..0ffcd927fd92 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/mob/MobDetection.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/mob/MobDetection.kt @@ -58,18 +58,18 @@ class MobDetection { private var shouldClear: AtomicBoolean = AtomicBoolean(false) init { - MobFilter.bossMobNameFilter - MobFilter.mobNameFilter - MobFilter.dojoFilter - MobFilter.summonFilter - MobFilter.dungeonNameFilter + MobFilter.bossMobNamePattern + MobFilter.mobNamePattern + MobFilter.dojoPattern + MobFilter.summonPattern + MobFilter.dungeonNamePattern MobFilter.petCareNamePattern - MobFilter.slayerNameFilter + MobFilter.slayerNamePattern MobFilter.summonOwnerPattern MobFilter.wokeSleepingGolemPattern MobFilter.jerryPattern MobFilter.jerryMagmaCubePattern - MobUtils.defaultArmorStandName + MobUtils.defaultArmorStandNamePattern } private fun mobDetectionReset() { diff --git a/src/main/java/at/hannibal2/skyhanni/data/mob/MobFactories.kt b/src/main/java/at/hannibal2/skyhanni/data/mob/MobFactories.kt index bf8dc10979f5..46e660c71f52 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/mob/MobFactories.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/mob/MobFactories.kt @@ -14,7 +14,7 @@ object MobFactories { armorStand: EntityArmorStand, extraEntityList: List ): Mob? = - MobFilter.slayerNameFilter.findMatcher(armorStand.cleanName()) { + MobFilter.slayerNamePattern.findMatcher(armorStand.cleanName()) { Mob( baseEntity = baseEntity, mobType = Mob.Type.SLAYER, @@ -31,7 +31,7 @@ object MobFactories { extraEntityList: List = emptyList(), overriddenName: String? = null ): Mob? = - MobFilter.bossMobNameFilter.matchMatcher(armorStand.cleanName()) { + MobFilter.bossMobNamePattern.matchMatcher(armorStand.cleanName()) { Mob( baseEntity = baseEntity, mobType = Mob.Type.BOSS, @@ -47,7 +47,7 @@ object MobFactories { armorStand: EntityArmorStand, extraEntityList: List = emptyList() ): Mob? = - MobFilter.dungeonNameFilter.matchMatcher(armorStand.cleanName()) { + MobFilter.dungeonNamePattern.matchMatcher(armorStand.cleanName()) { Mob( baseEntity = baseEntity, mobType = Mob.Type.DUNGEON, @@ -67,7 +67,7 @@ object MobFactories { armorStand: EntityArmorStand, extraEntityList: List? = null ): Mob? = - MobFilter.mobNameFilter.findMatcher(armorStand.cleanName()) { + MobFilter.mobNamePattern.findMatcher(armorStand.cleanName()) { Mob( baseEntity = baseEntity, mobType = Mob.Type.BASIC, @@ -89,7 +89,7 @@ object MobFactories { armorStand: EntityArmorStand, extraEntityList: List ): Mob? = - MobFilter.summonFilter.findMatcher(armorStand.cleanName()) { + MobFilter.summonPattern.findMatcher(armorStand.cleanName()) { Mob( baseEntity = baseEntity, mobType = Mob.Type.SUMMON, @@ -118,7 +118,7 @@ object MobFactories { private fun String.removeCorruptedSuffix(case: Boolean) = if (case) this.dropLast(1) else this fun dojo(baseEntity: EntityLivingBase, armorStand: EntityArmorStand): Mob? = - MobFilter.dojoFilter.matchMatcher(armorStand.cleanName()) { + MobFilter.dojoPattern.matchMatcher(armorStand.cleanName()) { Mob( baseEntity = baseEntity, mobType = Mob.Type.SPECIAL, diff --git a/src/main/java/at/hannibal2/skyhanni/data/mob/MobFilter.kt b/src/main/java/at/hannibal2/skyhanni/data/mob/MobFilter.kt index 26782d9b44e9..030f6be8984a 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/mob/MobFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/mob/MobFilter.kt @@ -47,14 +47,17 @@ import net.minecraft.entity.player.EntityPlayer @Suppress("RegExpRedundantEscape") object MobFilter { - private val repoGroup = RepoPattern.group("mob.detection.new") + private val patternGroup = RepoPattern.group("mob.detection.new") /** REGEX-TEST: Wither Husk 500M❤ */ - val mobNameFilter by repoGroup.pattern( + val mobNamePattern by patternGroup.pattern( "filter.basic", "(?:\\[\\w+(?\\d+)\\] )?(?.Corrupted )?(?[^ᛤ]*)(?: ᛤ)? [\\dBMk.,❤]+" ) - val slayerNameFilter by repoGroup.pattern("filter.slayer", "^. (?.*) (?[IV]+) \\d+") + val slayerNamePattern by patternGroup.pattern( + "filter.slayer", + "^. (?.*) (?[IV]+) \\d+" + ) /** REGEX-TEST: ﴾ Storm ﴿ * REGEX-TEST: ﴾ [Lv200] aMage Outlawa 70M/70M❤ ﴿ @@ -65,28 +68,46 @@ object MobFilter { * REGEX-TEST: ﴾ [Lv200] Barbarian Duke X 70M/70M❤ ﴿ * REGEX-TEST: ﴾ [Lv100] Endstone Protector 4.6M/5M❤ ﴿ * */ - val bossMobNameFilter by repoGroup.pattern( + val bossMobNamePattern by patternGroup.pattern( "filter.boss", "^. (?:\\[Lv(?\\d+)\\] )?(?[^ᛤ\n]*)(?: ᛤ)?(?: [\\d\\/BMk.,❤]+|█+)? .$" ) - val dungeonNameFilter by repoGroup.pattern( + val dungeonNamePattern by patternGroup.pattern( "filter.dungeon", "^(?:(?✯)\\s)?(?:(?${DungeonAttribute.toRegexLine})\\s)?(?:\\[[\\w\\d]+\\]\\s)?(?[^ᛤ]+)(?: ᛤ)?\\s[^\\s]+$" ) - val summonFilter by repoGroup.pattern("filter.summon", "^(?\\w+)'s (?.*) \\d+") - val dojoFilter by repoGroup.pattern("filter.dojo", "^(?:(?\\d+) pts|(?\\w+))$") - val jerryPattern by repoGroup.pattern( + val summonPattern by patternGroup.pattern( + "filter.summon", + "^(?\\w+)'s (?.*) \\d+" + ) + val dojoPattern by patternGroup.pattern( + "filter.dojo", + "^(?:(?\\d+) pts|(?\\w+))$" + ) + val jerryPattern by patternGroup.pattern( "jerry", "(?:\\[\\w+(?\\d+)\\] )?(?\\w+)'s (?\\w+ Jerry) \\d+ Hits" ) - - val petCareNamePattern by repoGroup.pattern("pattern.petcare", "^\\[\\w+ (?\\d+)\\] (?.*)") - val wokeSleepingGolemPattern by repoGroup.pattern("pattern.dungeon.woke.golem", "(?:§c§lWoke|§5§lSleeping) Golem§r") - val jerryMagmaCubePattern by repoGroup.pattern( + val petCareNamePattern by patternGroup.pattern( + "pattern.petcare", + "^\\[\\w+ (?\\d+)\\] (?.*)" + ) + val wokeSleepingGolemPattern by patternGroup.pattern( + "pattern.dungeon.woke.golem", + "(?:§c§lWoke|§5§lSleeping) Golem§r" + ) + val jerryMagmaCubePattern by patternGroup.pattern( "pattern.jerry.magma.cube", "§c(?:Cubie|Maggie|Cubert|Cübe|Cubette|Magmalene|Lucky 7|8ball|Mega Cube|Super Cube)(?: ᛤ)? §a\\d+§8\\/§a\\d+§c❤" ) - val summonOwnerPattern by repoGroup.pattern("pattern.summon.owner", "Spawned by: (?.*)") + val summonOwnerPattern by patternGroup.pattern( + "pattern.summon.owner", + "Spawned by: (?.*)" + ) + val isGuardianPattern by patternGroup.pattern( + "isgaurdian", + "^\\d+" + ) internal const val RAT_SKULL = "ewogICJ0aW1lc3RhbXAiIDogMTYxODQxOTcwMTc1MywKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdUlJZXQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYThhYmI0NzFkYjBhYjc4NzAzMDExOTc5ZGM4YjQwNzk4YTk0MWYzYTRkZWMzZWM2MWNiZWVjMmFmOGNmZmU4IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=" @@ -125,7 +146,7 @@ object MobFilter { "anrrtqytsl", // Weaponsmith ) - private val displayNPCCompressedNamePattern by repoGroup.pattern("displaynpc.name", "[a-z0-9]{10}") + private val displayNPCCompressedNamePattern by patternGroup.pattern("displaynpc.name", "[a-z0-9]{10}") private fun displayNPCNameCheck(name: String) = name.startsWith('§') || displayNPCCompressedNamePattern.matches(name) @@ -287,8 +308,7 @@ object MobFilter { baseEntity is EntityHorse && armorStand.name.endsWith("'s Horse") -> MobResult.illegal // Horse Pet - baseEntity is EntityGuardian && armorStand.cleanName() - .matches("^\\d+".toRegex()) -> MobResult.illegal // Wierd Sea Guardian Ability + baseEntity is EntityGuardian && isGuardianPattern.matches(armorStand.cleanName()) -> MobResult.illegal // Wierd Sea Guardian Ability else -> null } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/Translator.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/Translator.kt index e513871fe441..57e8cfec6608 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/Translator.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/Translator.kt @@ -7,8 +7,10 @@ import at.hannibal2.skyhanni.utils.APIUtil import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.ConditionalUtils.transformIf import at.hannibal2.skyhanni.utils.OSUtils +import at.hannibal2.skyhanni.utils.StringUtils.findMatcher import at.hannibal2.skyhanni.utils.StringUtils.getPlayerNameFromChatMessage import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import com.google.gson.JsonArray import kotlinx.coroutines.launch import net.minecraft.event.ClickEvent @@ -23,7 +25,12 @@ import java.net.URLEncoder // TODO split into two classes: TranslatorCommand and GoogleTransaltor. only communicates via getTranslationFromEnglish and getTranslationToEnglish class Translator { - private val messageContentRegex = Regex(".*: (.*)") + private val patternGroup = RepoPattern.group("translator") + private val messageContentPattern by patternGroup.pattern( + "messagecontent", + ".*: (?.*)" + ) + // Logic for listening for a user click on a chat message is from NotEnoughUpdates @@ -43,7 +50,10 @@ class Translator { } private fun createClickStyle(message: String, style: ChatStyle): ChatStyle { - val text = messageContentRegex.find(message)!!.groupValues[1].removeColor() + //TODO seraid + val text = messageContentPattern.findMatcher(message) { + group("content").removeColor() + } style.setChatClickEvent(ClickEvent(ClickEvent.Action.RUN_COMMAND, "/shtranslate $text")) style.setChatHoverEvent(HoverEvent(HoverEvent.Action.SHOW_TEXT, ChatComponentText("§bClick to translate!"))) return style diff --git a/src/main/java/at/hannibal2/skyhanni/features/combat/BestiaryData.kt b/src/main/java/at/hannibal2/skyhanni/features/combat/BestiaryData.kt index 437f193ccca6..d87f08fd2081 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/combat/BestiaryData.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/combat/BestiaryData.kt @@ -25,6 +25,7 @@ import at.hannibal2.skyhanni.utils.NumberUtil.toRoman import at.hannibal2.skyhanni.utils.RenderUtils.highlight import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.find +import at.hannibal2.skyhanni.utils.StringUtils.findMatcher import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.StringUtils.removeColor @@ -110,6 +111,22 @@ object BestiaryData { "results", "^§7Results: §a" ) + private val namePattern by patternGroup.pattern( + "name", + " [IVX0-9]+$" + ) + private val levelPattern by patternGroup.pattern( + "level", + " (?[IVX0-9]+$)" + ) + private val spacePattern by patternGroup.pattern( + "space", + "^ {20}" + ) + private val actualRealTotalKillPattern by patternGroup.pattern( + "actualrealtotalkill", + "(?[0-9,.]+)" + ) private var display = emptyList>() private val mobList = mutableListOf() @@ -211,7 +228,7 @@ object BestiaryData { var familiesCompleted: Long = 0 for ((lineIndex, loreLine) in stack.getLore().withIndex()) { val line = loreLine.removeColor() - if (!line.startsWith(" ")) continue + if (!spacePattern.find(loreLine)) continue val previousLine = stack.getLore()[lineIndex - 1] val progress = line.substring(line.lastIndexOf(' ') + 1) if (familiesFoundContainsPattern.find(previousLine)) { @@ -235,8 +252,10 @@ object BestiaryData { if (stack.displayName == " ") continue if (!indexes.contains(index)) continue inInventory = true - val name = " [IVX0-9]+$".toPattern().matcher(stack.displayName).replaceFirst("") - val level = " ([IVX0-9]+$)".toRegex().find(stack.displayName)?.groupValues?.get(1) ?: "0" + val name = namePattern.matcher(stack.displayName).replaceFirst("") + val level = levelPattern.findMatcher(stack.displayName) { + group("level") + } ?: "0" var totalKillToMax: Long = 0 var currentTotalKill: Long = 0 var totalKillToTier: Long = 0 @@ -245,8 +264,9 @@ object BestiaryData { for ((lineIndex, line) in stack.getLore().withIndex()) { val loreLine = line.removeColor() if (killsPattern.find(loreLine)) { - actualRealTotalKill = "([0-9,.]+)".toRegex().find(loreLine)?.groupValues?.get(1)?.formatLong() - ?: 0 + actualRealTotalKill = actualRealTotalKillPattern.findMatcher(loreLine) { + group("kills").formatLong() + } ?: 0 } if (!loreLine.startsWith(" ")) continue val previousLine = stack.getLore()[lineIndex - 1] diff --git a/src/main/java/at/hannibal2/skyhanni/features/combat/ghostcounter/GhostCounter.kt b/src/main/java/at/hannibal2/skyhanni/features/combat/ghostcounter/GhostCounter.kt index 3e12152ced19..c8ff442b6c76 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/combat/ghostcounter/GhostCounter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/combat/ghostcounter/GhostCounter.kt @@ -97,6 +97,10 @@ object GhostCounter { "skilllevel", "§e§lSkills: §r§a(?.*) (?\\d+)" ) + private val partPattern by patternGroup.pattern( + "part", + "(?[0-9]{3,}[^,]+)" + ) private val format = NumberFormat.getInstance() private var percent: Float = 0.0f @@ -163,7 +167,10 @@ object GhostCounter { xpHourFormatting.noData } else { xpInterp = interp(xpGainHour, xpGainHourLast, lastUpdate) - val part = "([0-9]{3,}[^,]+)".toRegex().find(format.format(xpInterp))?.groupValues?.get(1) ?: "N/A" + + val part = partPattern.findMatcher(format.format(xpInterp)) { + group("xp") + } ?: "N/A" "$part ${if (isKilling) "" else xpHourFormatting.paused}" } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonAPI.kt index 9667e8a55219..c09005a058ff 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonAPI.kt @@ -43,7 +43,7 @@ object DungeonAPI { val bossStorage: MutableMap? get() = ProfileStorageData.profileSpecific?.dungeons?.bosses private val patternGroup = RepoPattern.group("dungeon.new") - private val dungeonComplete by patternGroup.pattern( + private val dungeonCompletePattern by patternGroup.pattern( "complete", "§.\\s+§.§.(?:The|Master Mode) Catacombs §.§.- §.§.(?:Floor )?(?M?[IV]{1,3}|Entrance)" ) @@ -247,7 +247,8 @@ object DungeonAPI { started = true DungeonStartEvent(floor).postAndCatch() } - if (event.message.removeColor().matches(uniqueClassBonusPattern.toRegex())) { + + if (uniqueClassBonusPattern.matches(event.message.removeColor())) { isUniqueClass = true } @@ -260,7 +261,7 @@ object DungeonAPI { } return } - dungeonComplete.matchMatcher(event.message) { + dungeonCompletePattern.matchMatcher(event.message) { DungeonCompleteEvent(floor).postAndCatch() return } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonBossMessages.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonBossMessages.kt index a4fe42752da0..6e8736cfb2ac 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonBossMessages.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonBossMessages.kt @@ -44,7 +44,7 @@ class DungeonBossMessages { " Necron§r§c: ", " §r§4§kWither King§r§c:", ) - private val messageEndsWithList by patternGroup.list( + private val messageEndsWithPatterns by patternGroup.list( "messageendswith", " Necron§r§c: That is enough, fool!$", " Necron§r§c: Adventurers! Be careful of who you are messing with..$", @@ -70,19 +70,19 @@ class DungeonBossMessages { * @see excludedMessagesPattern * @see messagePattern * @see messageContainsPattern - * @see messageEndsWithList + * @see messageEndsWithPatterns */ private fun isBoss(message: String): Boolean { // Cases that match below but should not be blocked - if (excludedMessagesPattern.any { it.matches(message) }) return false + if (excludedMessagesPatterns.any { it.matches(message) }) return false // Exact Matches - if (messagePattern.any { it.matches(message) }) return true + if (messagePatterns.any { it.matches(message) }) return true // Matches Regex for Boss Prefix bossPattern.matchMatcher(message) { - return messageContainsPattern.any { it.matches(message) } || messageEndsWithList.any { it.find(message) } + return messageContainsPatterns.any { it.matches(message) } || messageEndsWithPatterns.any { it.find(message) } } return false } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonDeathCounter.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonDeathCounter.kt index ba0ce17fc23d..fab554b5c1f3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonDeathCounter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonDeathCounter.kt @@ -19,7 +19,7 @@ class DungeonDeathCounter { private val patternGroup = RepoPattern.group("dungeondeathcounter") - private val deathPatternsList by patternGroup.list( + private val deathPatterns by patternGroup.list( "deathpatterns", "§c ☠ §r§7You were killed by (.*)§r§7 and became a ghost§r§7.", "§c ☠ §r§7(.*) was killed by (.*) and became a ghost§r§7.", @@ -51,7 +51,7 @@ class DungeonDeathCounter { ) private fun isDeathMessage(message: String): Boolean = - deathPatternsList.any { it.matches(message) } + deathPatterns.any { it.matches(message) } @SubscribeEvent(receiveCanceled = true) fun onChat(event: LorenzChatEvent) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/fame/AccountUpgradeReminder.kt b/src/main/java/at/hannibal2/skyhanni/features/fame/AccountUpgradeReminder.kt index b26a05094b4d..81c7b1295bcf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/fame/AccountUpgradeReminder.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/fame/AccountUpgradeReminder.kt @@ -12,6 +12,9 @@ import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.SimpleTimeMark.Companion.asTimeMark +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.StringUtils.matches +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.time.Duration import kotlin.time.Duration.Companion.days @@ -19,6 +22,20 @@ import kotlin.time.Duration.Companion.seconds class AccountUpgradeReminder { + private val patternGroup = RepoPattern.group("accountupgradereminder") + private val durationPattern by patternGroup.pattern( + "duration", + "§8Duration: (?\\d{1,3})d" + ) + private val startedPattern by patternGroup.pattern( + "started", + "§eYou started the §r§a(?.+) §r§eupgrade!" + ) + private val claimedPattern by patternGroup.pattern( + "claimed", + "§eYou claimed the §r§a.+ §r§eupgrade!" + ) + private var inInventory = false private var duration: Duration? = null private var lastReminderSend = SimpleTimeMark.farPast() @@ -74,18 +91,22 @@ class AccountUpgradeReminder { if (!inInventory) return val clickedItemLore = event.slot?.stack?.getLore() ?: return if (clickedItemLore.getOrNull(0) != "§8Account Upgrade") return - val result = clickedItemLore.firstNotNullOfOrNull { - durationRegex.matchEntire(it) + + clickedItemLore.firstNotNullOfOrNull { + durationPattern.matchMatcher(it) { + duration = group("duration").toInt().days + } } ?: return - duration = result.groups[1]!!.value.toInt().days } @SubscribeEvent fun onChat(event: LorenzChatEvent) { - if (claimedRegex.matches(event.message)) { + if (claimedPattern.matches(event.message)) { clearUpgrade() } else { - val upgrade = startedRegex.matchEntire(event.message)?.groups?.get(1)?.value ?: return + val upgrade = startedPattern.matchMatcher(event.message) { + group("upgrade") + } ?: return startUpgrade(upgrade) } } @@ -105,11 +126,6 @@ class AccountUpgradeReminder { } companion object { - - private val durationRegex = "§8Duration: (\\d{1,3})d".toRegex() - private val startedRegex = "§eYou started the §r§a(.+) §r§eupgrade!".toRegex() - private val claimedRegex = "§eYou claimed the §r§a.+ §r§eupgrade!".toRegex() - private fun isEnabled() = SkyHanniMod.feature.misc.accountUpgradeReminder fun disable() { diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/SeaCreatureTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/SeaCreatureTracker.kt index 847449e773ab..60d4ccd84558 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/SeaCreatureTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/SeaCreatureTracker.kt @@ -32,7 +32,7 @@ object SeaCreatureTracker { private val config get() = SkyHanniMod.feature.fishing.seaCreatureTracker - private val trophyArmorNames by RepoPattern.pattern( + private val trophyArmorNamesPattern by RepoPattern.pattern( "fishing.trophyfishing.armor", "(BRONZE|SILVER|GOLD|DIAMOND)_HUNTER_(HELMET|CHESTPLATE|LEGGINGS|BOOTS)" ) @@ -174,7 +174,7 @@ object SeaCreatureTracker { private fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled && !isTrophyFishing && !LorenzUtils.inKuudraFight private fun isWearingTrophyArmor(): Boolean = InventoryUtils.getArmor().all { - trophyArmorNames.matches(it?.getInternalName()?.asString()) + trophyArmorNamesPattern.matches(it?.getInternalName()?.asString()) } @SubscribeEvent diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestSpawn.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestSpawn.kt index acf23f51bb7f..3594ca4c73dd 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestSpawn.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestSpawn.kt @@ -42,7 +42,7 @@ class PestSpawn { /** * REGEX-TEST: §6§lEWW! §62 Pests §7have spawned in §aPlot §7- §b2§7! */ - private val multiplePestsSpawn by patternGroup.pattern( + private val multiplePestsSpawnPattern by patternGroup.pattern( "multiple", "§6§l.*! §6(?\\d) Pests §7have spawned in §aPlot §7- §b(?.*)§7!" ) @@ -50,7 +50,7 @@ class PestSpawn { /** * REGEX-TEST: §6§lEWW! §62 Pests §7have spawned in §aThe Barn§7! */ - private val multiplePestsBarnSpawn by patternGroup.pattern( + private val multiplePestsBarnSpawnPattern by patternGroup.pattern( "multiplebarn", "§6§l.*! §6(?\\d) Pests §7have spawned in §a(?The Barn)§7!" ) @@ -58,7 +58,7 @@ class PestSpawn { /** * REGEX-TEST: §6§lGROSS! §7While you were offline, §6Pests §7spawned in §aPlots §r§b12§r§7, §r§b9§r§7, §r§b5§r§7, §r§b11§r§7 and §r§b3§r§r§7! */ - private val offlinePestsSpawn by patternGroup.pattern( + private val offlinePestsSpawnPattern by patternGroup.pattern( "offline", "§6§l.*! §7While you were offline, §6Pests §7spawned in §aPlots (?.*)!" ) @@ -84,21 +84,21 @@ class PestSpawn { pestSpawn(1, plotNames, false) blocked = true } - multiplePestsSpawn.matchMatcher(message) { + multiplePestsSpawnPattern.matchMatcher(message) { val plotName = group("plot") plotNames.add(plotName) val amount = group("amount").toInt() pestSpawn(amount, plotNames, false) blocked = true } - multiplePestsBarnSpawn.matchMatcher(message) { + multiplePestsBarnSpawnPattern.matchMatcher(message) { val plotName = group("plot") plotNames.add(plotName) val amount = group("amount").toInt() pestSpawn(amount, plotNames, false) blocked = true } - offlinePestsSpawn.matchMatcher(message) { + offlinePestsSpawnPattern.matchMatcher(message) { val plots = group("plots") plotNames = plots.removeColor().split(", ", " and ").toMutableList() pestSpawn(0, plotNames, true) diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/HighlightBonzoMasks.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/HighlightBonzoMasks.kt index e64e003c29d8..b6fd4f0ba8f7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/HighlightBonzoMasks.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/HighlightBonzoMasks.kt @@ -8,6 +8,7 @@ import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName import at.hannibal2.skyhanni.utils.RenderUtils.highlight import at.hannibal2.skyhanni.utils.RenderUtils.interpolate +import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.item.ItemStack @@ -38,11 +39,11 @@ class HighlightBonzoMasks { private val redHue = Color.RGBtoHSB(255, 0, 0, null)[0].toDouble() private val patternGroup = RepoPattern.group("highlightbonzomask") - private val spiritMaskMessage by patternGroup.pattern( + private val spiritMaskMessagePattern by patternGroup.pattern( "spiritmask", "^Second Wind Activated! Your Spirit Mask saved your life!$" ) - private val bonzoMaskMessage by patternGroup.pattern( + private val bonzoMaskMessagePattern by patternGroup.pattern( "bonzomask", "^Your (.*Bonzo's Mask) saved your life!$" ) @@ -74,9 +75,9 @@ class HighlightBonzoMasks { @SubscribeEvent fun onChat(event: LorenzChatEvent) { val message = event.message.removeColor() - if (bonzoMaskMessage.toRegex().matches(message)) { + if (bonzoMaskMessagePattern.matches(message)) { maskTimers["BONZO_MASK"] = CooldownTimer(TimeSource.Monotonic.markNow(), bonzoMaskCooldown) - } else if (spiritMaskMessage.toRegex().matches(message)) { + } else if (spiritMaskMessagePattern.matches(message)) { maskTimers["SPIRIT_MASK"] = CooldownTimer(TimeSource.Monotonic.markNow(), spiritMaskCooldown) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/ItemDisplayOverlayFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/ItemDisplayOverlayFeatures.kt index baf10c1c9536..3f8311926a6e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/ItemDisplayOverlayFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/ItemDisplayOverlayFeatures.kt @@ -65,7 +65,7 @@ object ItemDisplayOverlayFeatures { "masterskull", "(.*)Master Skull - Tier ." ) - private val gardenVacuumPatterm by patternGroup.pattern( + private val gardenVacuumPattern by patternGroup.pattern( "vacuum", "§7Vacuum Bag: §6(?\\d*) Pests?" ) @@ -237,7 +237,7 @@ object ItemDisplayOverlayFeatures { } if (VACUUM_GARDEN.isSelected() && internalName in PestAPI.vacuumVariants && isOwnVacuum(lore)) { - lore.matchFirst(gardenVacuumPatterm) { + lore.matchFirst(gardenVacuumPattern) { val pests = group("amount").formatLong() return if (config.vacuumBagCap) { if (pests > 39) "§640+" else "$pests" diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/GoldenGoblinHighlight.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/GoldenGoblinHighlight.kt index f471bb282382..9d60d1da61d5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/GoldenGoblinHighlight.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/GoldenGoblinHighlight.kt @@ -29,8 +29,8 @@ class GoldenGoblinHighlight { @SubscribeEvent fun onChatEvent(event: LorenzChatEvent) { if (!isEnabled()) return - if (!MiningNotifications.goldenGoblinSpawn.matches(event.message) && - !MiningNotifications.diamondGoblinSpawn.matches(event.message) + if (!MiningNotifications.goldenGoblinSpawnPattern.matches(event.message) && + !MiningNotifications.diamondGoblinSpawnPattern.matches(event.message) ) return lastChatMessage = SimpleTimeMark.now() handle() diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/MiningNotifications.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/MiningNotifications.kt index 6119bce6d380..96c79b7ba050 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/MiningNotifications.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/MiningNotifications.kt @@ -38,19 +38,19 @@ object MiningNotifications { } private val patternGroup = RepoPattern.group("mining.notifications") - private val mineshaftSpawn by patternGroup.pattern( + private val mineshaftSpawnPattern by patternGroup.pattern( "mineshaft.spawn", "§5§lWOW! §r§aYou found a §r§bGlacite Mineshaft §r§aportal!" ) - private val scrapDrop by patternGroup.pattern( + private val scrapDropPattern by patternGroup.pattern( "scrapdrop", "§6§lEXCAVATOR! §r§fYou found a §r§9Suspicious Scrap§r§f!" ) - val goldenGoblinSpawn by patternGroup.pattern( + val goldenGoblinSpawnPattern by patternGroup.pattern( "goblin.goldspawn", "§6A Golden Goblin has spawned!" ) - val diamondGoblinSpawn by patternGroup.pattern( + val diamondGoblinSpawnPattern by patternGroup.pattern( "goblin.diamondspawn", "§6A §r§bDiamond Goblin §r§6has spawned!" ) @@ -69,10 +69,10 @@ object MiningNotifications { if (!config.enabled) return val message = event.message when { - mineshaftSpawn.matches(message) -> sendNotification(MiningNotificationList.MINESHAFT_SPAWN) - scrapDrop.matches(message) -> sendNotification(MiningNotificationList.SCRAP) - goldenGoblinSpawn.matches(message) -> sendNotification(MiningNotificationList.GOLDEN_GOBLIN) - diamondGoblinSpawn.matches(message) -> sendNotification(MiningNotificationList.DIAMOND_GOBLIN) + mineshaftSpawnPattern.matches(message) -> sendNotification(MiningNotificationList.MINESHAFT_SPAWN) + scrapDropPattern.matches(message) -> sendNotification(MiningNotificationList.SCRAP) + goldenGoblinSpawnPattern.matches(message) -> sendNotification(MiningNotificationList.GOLDEN_GOBLIN) + diamondGoblinSpawnPattern.matches(message) -> sendNotification(MiningNotificationList.DIAMOND_GOBLIN) frostbitePattern.matches(message) -> { if (IslandType.MINESHAFT.isInIsland() && config.getAscensionRope) { runDelayed(0.5.seconds) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/items/enchants/EnchantParser.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/items/enchants/EnchantParser.kt index c6a0552bd943..83595458b573 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/items/enchants/EnchantParser.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/items/enchants/EnchantParser.kt @@ -18,6 +18,7 @@ import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimal import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getEnchantments import at.hannibal2.skyhanni.utils.StringUtils.find +import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.event.HoverEvent @@ -42,6 +43,9 @@ object EnchantParser { private val grayEnchantPattern by patternGroup.pattern( "grayenchants", "^(Respiration|Aqua Affinity|Depth Strider|Efficiency)" ) + private val stackingPattern by patternGroup.pattern( + "stacking", "[\\d,]+\$" + ) private var currentItem: ItemStack? = null @@ -240,7 +244,8 @@ object EnchantParser { // Pull enchant, enchant level and stacking amount if applicable val enchant = this.enchants.getFromLore(matcher.group("enchant")) val level = matcher.group("levelNumeral").romanToDecimal() - val stacking = if (matcher.group("stacking").trimStart().matches("[\\d,]+\$".toRegex())) { + + val stacking = if (stackingPattern.matches(matcher.group("stacking").trimStart())) { shouldBeSingleColumn = true matcher.group("stacking") } else "empty" diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorFeatures.kt index 614dcb7e73bf..b2bc5a104a76 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorFeatures.kt @@ -53,15 +53,15 @@ object TrevorFeatures { "trapper", "\\[NPC] Trevor: You can find your (?.*) animal near the (?.*)." ) - private val talbotPatternAbove by patternGroup.pattern( + private val talbotAbovePattern by patternGroup.pattern( "above", "The target is around (?.*) blocks above, at a (?.*) degrees angle!" ) - private val talbotPatternBelow by patternGroup.pattern( + private val talbotBelowPattern by patternGroup.pattern( "below", "The target is around (?.*) blocks below, at a (?.*) degrees angle!" ) - private val talbotPatternAt by patternGroup.pattern( + private val talbotAtPattern by patternGroup.pattern( "at", "You are at the exact height!", ) @@ -151,15 +151,15 @@ object TrevorFeatures { lastChatPromptTime = SimpleTimeMark.farPast() } - talbotPatternAbove.matchMatcher(formattedMessage) { + talbotAbovePattern.matchMatcher(formattedMessage) { val height = group("height").toInt() TrevorSolver.findMobHeight(height, true) } - talbotPatternBelow.matchMatcher(formattedMessage) { + talbotBelowPattern.matchMatcher(formattedMessage) { val height = group("height").toInt() TrevorSolver.findMobHeight(height, false) } - talbotPatternAt.matchMatcher(formattedMessage) { + talbotAtPattern.matchMatcher(formattedMessage) { TrevorSolver.averageHeight = LocationUtils.playerLocation().y } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/visualwords/ModifyVisualWords.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/visualwords/ModifyVisualWords.kt index 2c31f078c643..3c06f116f3cf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/visualwords/ModifyVisualWords.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/visualwords/ModifyVisualWords.kt @@ -17,8 +17,6 @@ object ModifyVisualWords { var modifiedWords = mutableListOf() - val reverseRegex = "(§.|^|[\\s:()+-])([^§\\s:()+-]*)".toRegex() - fun modifyText(originalText: String?): String? { var modifiedText = originalText ?: return null if (!LorenzUtils.onHypixel) return originalText diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/CruxTalismanDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/CruxTalismanDisplay.kt index 45f243b19968..c8cc6339371e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/CruxTalismanDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/CruxTalismanDisplay.kt @@ -31,6 +31,10 @@ object CruxTalismanDisplay { "bonuses", "^§7Total Bonuses" ) + private val maxedPattern by patternGroup.pattern( + "maxed", + "(?\\d+)/\\d+" + ) private val partialName = "CRUX_TALISMAN" private var display = emptyList>() @@ -69,15 +73,17 @@ object CruxTalismanDisplay { displayLine.forEach { percent += if (config.compactWhenMaxed) { if (!it.maxed) { - "(?\\d+)/\\d+".toRegex().find(it.progress.removeColor())?.groupValues?.get(1) - ?.toInt() ?: 0 + maxedPattern.findMatcher(it.progress.removeColor()) { + group("progress").toInt() + } ?: 0 } else 100 } else { if (it.progress.contains("MAXED")) 100 else { - "(?\\d+)/\\d+".toRegex().find(it.progress.removeColor())?.groupValues?.get(1) - ?.toInt() ?: 0 + maxedPattern.findMatcher(it.progress.removeColor()) { + group("progress").toInt() + } ?: 0 } } addAsSingletonList(" ${it.tier} ${it.name}: ${it.progress}") diff --git a/src/main/java/at/hannibal2/skyhanni/utils/MobUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/MobUtils.kt index 6aff6406dcde..a42ba61a4090 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/MobUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/MobUtils.kt @@ -13,7 +13,7 @@ import net.minecraft.entity.item.EntityArmorStand import net.minecraft.entity.player.EntityPlayer object MobUtils { - val defaultArmorStandName by RepoPattern.pattern("armorstand.default", "Armou?r Stand") + val defaultArmorStandNamePattern by RepoPattern.pattern("armorstand.default", "Armou?r Stand") // The corresponding ArmorStand for a mob has always the ID + 1 (with some exceptions) fun getArmorStand(entity: Entity, offset: Int = 1) = getNextEntity(entity, offset) as? EntityArmorStand @@ -30,7 +30,7 @@ object MobUtils { getArmorStandByRangeAll(entity, range).filter { it.cleanName().startsWith(name) } .sortedBy { it.distanceTo(entity) }.firstOrNull() - fun EntityArmorStand.isDefaultValue() = defaultArmorStandName.matches(this.name) + fun EntityArmorStand.isDefaultValue() = defaultArmorStandNamePattern.matches(this.name) fun EntityArmorStand?.takeNonDefault() = this?.takeIf { !it.isDefaultValue() }