From 1829187fd20c43c79810688729fde4ff40f51757 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Wed, 31 Jul 2024 17:57:43 -0400 Subject: Fix: Hoppity Goal Levels Off-by-One (#2280) Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> --- .../chocolatefactory/ChocolateFactoryAPI.kt | 35 ++++++++++++++++++++++ .../ChocolateFactoryCustomReminder.kt | 3 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/chocolatefactory/ChocolateFactoryAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/chocolatefactory/ChocolateFactoryAPI.kt index 36e8a206a..57b572fe4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/chocolatefactory/ChocolateFactoryAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/chocolatefactory/ChocolateFactoryAPI.kt @@ -12,8 +12,12 @@ import at.hannibal2.skyhanni.features.event.hoppity.HoppityCollectionStats import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.CollectionUtils.nextAfter import at.hannibal2.skyhanni.utils.DelayedRun +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.NumberUtil.formatLong +import at.hannibal2.skyhanni.utils.RegexUtils.firstMatcher +import at.hannibal2.skyhanni.utils.RegexUtils.groupOrNull import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher import at.hannibal2.skyhanni.utils.RegexUtils.matches import at.hannibal2.skyhanni.utils.SkyblockSeason @@ -21,6 +25,7 @@ import at.hannibal2.skyhanni.utils.SoundUtils import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.UtilsPatterns import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern +import net.minecraft.item.ItemStack import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.time.Duration import kotlin.time.Duration.Companion.hours @@ -42,6 +47,25 @@ object ChocolateFactoryAPI { "Hoppity|Chocolate Factory Milestones", ) + /** + * REGEX-TEST: §a§lPROMOTE §8➜ §7[208§7] §dExecutive + * REGEX-TEST: §a§lUPGRADE §8➜ §aRabbit Barn CCXXI + */ + private val upgradeLorePattern by patternGroup.pattern( + "item.lore.upgrade", + "§a§l(?:UPGRADE|PROMOTE) §8➜ (?:§7\\[(?\\d+)§7] )?(?.*?) ?(?[IVXLCDM]*)\$", + ) + + /** + * REGEX-TEST: §bRabbit Bro§8 - §7[220§7] §bBoard Member + * REGEX-TEST: §6Rabbit Dog§8 - §7[190§7] §6Director + * REGEX-TEST: §dRabbit Daddy§8 - §7[201§7] §dExecutive + */ + private val employeeNamePattern by patternGroup.pattern( + "item.name.employee", + "(?(?:§.+)+Rabbit .*)§8 - §7\\[\\d*§7] .*", + ) + var rabbitSlots = mapOf() var otherUpgradeSlots = setOf() var noPickblockSlots = setOf() @@ -155,6 +179,17 @@ object ChocolateFactoryAPI { } } + fun getNextLevelName(stack: ItemStack): String? = + upgradeLorePattern.firstMatcher(stack.getLore()) { + val upgradeName = if (stack.getLore().any { it == "§8Employee" }) employeeNamePattern.matchMatcher(stack.name) { + groupOrNull("employee") + } else groupOrNull("upgradename") + val nextLevel = groupOrNull("nextlevel") ?: groupOrNull("nextlevelalt") + if (upgradeName == null || nextLevel == null) null + else "$upgradeName $nextLevel" + } + + fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled // TODO add debug toggle diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/chocolatefactory/ChocolateFactoryCustomReminder.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/chocolatefactory/ChocolateFactoryCustomReminder.kt index 10c9ce24a..1f7de017c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/chocolatefactory/ChocolateFactoryCustomReminder.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/chocolatefactory/ChocolateFactoryCustomReminder.kt @@ -67,13 +67,14 @@ object ChocolateFactoryCustomReminder { // TODO add support for prestige and for Chocolate Milestone val cost = ChocolateFactoryAPI.getChocolateBuyCost(item.getLore()) ?: return val duration = ChocolateAmount.CURRENT.timeUntilGoal(cost) + val nextLevelName = ChocolateFactoryAPI.getNextLevelName(item) ?: return // the user has enough chocolate, and just bought something if (duration.isNegative()) { reset() return } - setReminder(cost, item.name) + setReminder(cost, nextLevelName) } @SubscribeEvent -- cgit