diff options
author | CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> | 2024-02-16 21:21:43 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-16 11:21:43 +0100 |
commit | f91973d60948d449cc45a4add901e6fe43aebd62 (patch) | |
tree | 4c8c77ec4a9585a821651a034ebe5bed3308a6af /src/main/java/at/hannibal2/skyhanni/features/garden | |
parent | 26fe548fa9a5cfe29b130a0a5585278df3429ee9 (diff) | |
download | skyhanni-f91973d60948d449cc45a4add901e6fe43aebd62.tar.gz skyhanni-f91973d60948d449cc45a4add901e6fe43aebd62.tar.bz2 skyhanni-f91973d60948d449cc45a4add901e6fe43aebd62.zip |
Moved many regex patterns in the repo and code cleanup. #871
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features/garden')
25 files changed, 464 insertions, 265 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt index 5b066b142..46cd544a1 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt @@ -29,23 +29,69 @@ import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getFarmingForDummie import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getHoeCounter import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.item.ItemStack import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.math.floor import kotlin.math.log10 import kotlin.time.Duration.Companion.seconds -class FarmingFortuneDisplay { - - private val tabFortuneUniversalPattern = " Farming Fortune: §r§6☘(?<fortune>\\d+)".toPattern() - private val tabFortuneCropPattern = - " (?<crop>Wheat|Carrot|Potato|Pumpkin|Sugar Cane|Melon|Cactus|Cocoa Beans|Mushroom|Nether Wart) Fortune: §r§6☘(?<fortune>\\d+)".toPattern() +object FarmingFortuneDisplay { + private val config get() = GardenAPI.config.farmingFortunes + + private val patternGroup = RepoPattern.group("garden.fortunedisplay") + private val universalTabFortunePattern by patternGroup.pattern( + "tablist.universal", + " Farming Fortune: §r§6☘(?<fortune>\\d+)" + ) + private val cropSpecificTabFortunePattern by patternGroup.pattern( + "tablist.cropspecific", + " (?<crop>Wheat|Carrot|Potato|Pumpkin|Sugar Cane|Melon|Cactus|Cocoa Beans|Mushroom|Nether Wart) Fortune: §r§6☘(?<fortune>\\d+)" + ) + private val collectionPattern by patternGroup.pattern( + "collection", + "§7You have §6\\+(?<ff>\\d{1,3})☘ .*" + ) + private val tooltipFortunePattern by patternGroup.pattern( + "tooltip", + "^§7Farming Fortune: §a\\+([\\d.]+)(?: §2\\(\\+\\d\\))?(?: §9\\(\\+(\\d+)\\))?\$" + ) + private val armorAbilityPattern by patternGroup.pattern( + "armorability", + "Tiered Bonus: .* [(](?<pieces>.*)/4[)]" + ) + private val lotusAbilityPattern by patternGroup.pattern( + "lotusability", + "§7Piece Bonus: §6+(?<bonus>.*)☘" + ) + // todo make pattern work on Melon and Cropie armor + private val armorAbilityFortunePattern by patternGroup.pattern( + "armorabilityfortune", + "§7.*§7Grants §6(?<bonus>.*)☘.*" + ) private var display = emptyList<List<Any>>() private var accessoryProgressDisplay = "" private var lastToolSwitch = SimpleTimeMark.farPast() + private val latestFF: MutableMap<CropType, Double>? get() = GardenAPI.storage?.latestTrueFarmingFortune + + private var currentCrop: CropType? = null + + private var tabFortuneUniversal: Double = 0.0 + private var tabFortuneCrop: Double = 0.0 + private val upgradeFortune: Double? get() = currentCrop?.getUpgradeLevel()?.let { it * 5.0 } + private val accessoryFortune: Double? + get() = currentCrop?.let { + CropAccessoryData.cropAccessory?.getFortune(it) + } + + var displayedFortune = 0.0 + var reforgeFortune = 0.0 + var itemBaseFortune = 0.0 + var greenThumbFortune = 0.0 + @SubscribeEvent fun onPreProfileSwitch(event: PreProfileSwitchEvent) { display = emptyList() @@ -56,10 +102,10 @@ class FarmingFortuneDisplay { fun onTabListUpdate(event: TabListUpdateEvent) { if (!GardenAPI.inGarden()) return event.tabList.firstNotNullOfOrNull { - tabFortuneUniversalPattern.matchMatcher(it) { + universalTabFortunePattern.matchMatcher(it) { tabFortuneUniversal = group("fortune").toDouble() } - tabFortuneCropPattern.matchMatcher(it) { + cropSpecificTabFortunePattern.matchMatcher(it) { currentCrop = CropType.getByName(group("crop")) tabFortuneCrop = group("fortune").toDouble() } @@ -170,131 +216,102 @@ class FarmingFortuneDisplay { else -> 75 } - companion object { - - private val config get() = GardenAPI.config.farmingFortunes - private val latestFF: MutableMap<CropType, Double>? get() = GardenAPI.storage?.latestTrueFarmingFortune - - private var currentCrop: CropType? = null + fun getToolFortune(tool: ItemStack?): Double = getToolFortune(tool?.getInternalName()) + fun getToolFortune(internalName: NEUInternalName?): Double { + if (internalName == null) return 0.0 + if (internalName.equals("THEORETICAL_HOE")) { + return 0.0 + } + return if (internalName.startsWith("THEORETICAL_HOE")) { + listOf(10.0, 25.0, 50.0)[internalName.asString().last().digitToInt() - 1] + } else when (internalName.asString()) { + "FUNGI_CUTTER" -> 30.0 + "COCO_CHOPPER" -> 20.0 + else -> 0.0 + } + } - private var tabFortuneUniversal: Double = 0.0 - private var tabFortuneCrop: Double = 0.0 - private val upgradeFortune: Double? get() = currentCrop?.getUpgradeLevel()?.let { it * 5.0 } - private val accessoryFortune: Double? - get() = currentCrop?.let { - CropAccessoryData.cropAccessory?.getFortune(it) - } + fun getTurboCropFortune(tool: ItemStack?, cropType: CropType?): Double { + val crop = cropType ?: return 0.0 + return tool?.getEnchantments()?.get(crop.getTurboCrop())?.let { it * 5.0 } ?: 0.0 + } - private val collectionPattern = "§7You have §6\\+(?<ff>\\d{1,3})☘ .*".toPattern() - private val tooltipFortunePattern = - "^§7Farming Fortune: §a\\+([\\d.]+)(?: §2\\(\\+\\d\\))?(?: §9\\(\\+(\\d+)\\))?$".toRegex() - private val armorAbilityPattern = "Tiered Bonus: .* [(](?<pieces>.*)/4[)]".toPattern() - - var displayedFortune = 0.0 - var reforgeFortune = 0.0 - var itemBaseFortune = 0.0 - var greenThumbFortune = 0.0 - - fun getToolFortune(tool: ItemStack?): Double = getToolFortune(tool?.getInternalName()) - fun getToolFortune(internalName: NEUInternalName?): Double { - if (internalName == null) return 0.0 - if (internalName.equals("THEORETICAL_HOE")) { - return 0.0 - } - return if (internalName.startsWith("THEORETICAL_HOE")) { - listOf(10.0, 25.0, 50.0)[internalName.asString().last().digitToInt() - 1] - } else when (internalName.asString()) { - "FUNGI_CUTTER" -> 30.0 - "COCO_CHOPPER" -> 20.0 - else -> 0.0 - } - } + fun getCollectionFortune(tool: ItemStack?): Double { + val string = tool?.getLore()?.nextAfter("§6Collection Analysis", 3) ?: return 0.0 + return collectionPattern.matchMatcher(string) { group("ff").toDoubleOrNull() } ?: 0.0 + } - fun getTurboCropFortune(tool: ItemStack?, cropType: CropType?): Double { - val crop = cropType ?: return 0.0 - return tool?.getEnchantments()?.get(crop.getTurboCrop())?.let { it * 5.0 } ?: 0.0 - } + fun getCounterFortune(tool: ItemStack?): Double { + val counter = tool?.getHoeCounter() ?: return 0.0 + val digits = floor(log10(counter.toDouble())) + return (16 * digits - 48).coerceAtLeast(0.0) + } - fun getCollectionFortune(tool: ItemStack?): Double { - val string = tool?.getLore()?.nextAfter("§6Collection Analysis", 3) ?: return 0.0 - return collectionPattern.matchMatcher(string) { group("ff").toDoubleOrNull() } ?: 0.0 - } + fun getDedicationFortune(tool: ItemStack?, cropType: CropType?): Double { + if (cropType == null) return 0.0 + val dedicationLevel = tool?.getEnchantments()?.get("dedication") ?: 0 + val dedicationMultiplier = listOf(0.0, 0.5, 0.75, 1.0, 2.0)[dedicationLevel] + val cropMilestone = GardenCropMilestones.getTierForCropCount( + cropType.getCounter(), cropType + ) + return dedicationMultiplier * cropMilestone + } - fun getCounterFortune(tool: ItemStack?): Double { - val counter = tool?.getHoeCounter() ?: return 0.0 - val digits = floor(log10(counter.toDouble())) - return (16 * digits - 48).coerceAtLeast(0.0) - } + fun getSunderFortune(tool: ItemStack?) = (tool?.getEnchantments()?.get("sunder") ?: 0) * 12.5 + fun getHarvestingFortune(tool: ItemStack?) = (tool?.getEnchantments()?.get("harvesting") ?: 0) * 12.5 + fun getCultivatingFortune(tool: ItemStack?) = (tool?.getEnchantments()?.get("cultivating") ?: 0) * 2.0 - fun getDedicationFortune(tool: ItemStack?, cropType: CropType?): Double { - if (cropType == null) return 0.0 - val dedicationLevel = tool?.getEnchantments()?.get("dedication") ?: 0 - val dedicationMultiplier = listOf(0.0, 0.5, 0.75, 1.0, 2.0)[dedicationLevel] - val cropMilestone = GardenCropMilestones.getTierForCropCount( - cropType.getCounter(), cropType - ) - return dedicationMultiplier * cropMilestone - } + fun getAbilityFortune(item: ItemStack?) = item?.let { + getAbilityFortune(it.getInternalName(), it.getLore()) + } ?: 0.0 - fun getSunderFortune(tool: ItemStack?) = (tool?.getEnchantments()?.get("sunder") ?: 0) * 12.5 - fun getHarvestingFortune(tool: ItemStack?) = (tool?.getEnchantments()?.get("harvesting") ?: 0) * 12.5 - fun getCultivatingFortune(tool: ItemStack?) = (tool?.getEnchantments()?.get("cultivating") ?: 0) * 2.0 - - fun getAbilityFortune(item: ItemStack?) = item?.let { - getAbilityFortune(it.getInternalName(), it.getLore()) - } ?: 0.0 - - fun getAbilityFortune(internalName: NEUInternalName, lore: List<String>): Double { - val lotusAbilityPattern = "§7Piece Bonus: §6+(?<bonus>.*)☘".toPattern() - // todo make it work on Melon and Cropie armor - val armorAbilityFortune = "§7.*§7Grants §6(?<bonus>.*)☘.*".toPattern() - var pieces = 0 - - lore.forEach { line -> - if (internalName.contains("LOTUS")) { - lotusAbilityPattern.matchMatcher(line) { - return group("bonus").toDouble() - } - } - armorAbilityPattern.matchMatcher(line.removeColor()) { - pieces = group("pieces").toInt() - } + fun getAbilityFortune(internalName: NEUInternalName, lore: List<String>): Double { + var pieces = 0 - armorAbilityFortune.matchMatcher(line) { - return if (pieces < 2) 0.0 else group("bonus").toDouble() / pieces + lore.forEach { line -> + if (internalName.contains("LOTUS")) { + lotusAbilityPattern.matchMatcher(line) { + return group("bonus").toDouble() } } + armorAbilityPattern.matchMatcher(line.removeColor()) { + pieces = group("pieces").toInt() + } - return 0.0 + armorAbilityFortunePattern.matchMatcher(line) { + return if (pieces < 2) 0.0 else group("bonus").toDouble() / pieces + } } - fun loadFortuneLineData(tool: ItemStack?, enchantmentFortune: Double) { - displayedFortune = 0.0 - reforgeFortune = 0.0 - itemBaseFortune = 0.0 - greenThumbFortune = 0.0 - for (line in tool?.getLore()!!) { - val match = tooltipFortunePattern.matchEntire(line)?.groups ?: continue - - displayedFortune = match[1]!!.value.toDouble() - reforgeFortune = match[2]?.value?.toDouble() ?: 0.0 - - itemBaseFortune = if (tool.getInternalName().contains("LOTUS")) { - 5.0 - } else { - val dummiesFF = (tool.getFarmingForDummiesCount() ?: 0) * 1.0 - displayedFortune - reforgeFortune - enchantmentFortune - dummiesFF - } - greenThumbFortune = if (tool.getInternalName().contains("LOTUS")) { - displayedFortune - reforgeFortune - itemBaseFortune - } else 0.0 + return 0.0 + } + + fun loadFortuneLineData(tool: ItemStack?, enchantmentFortune: Double) { + displayedFortune = 0.0 + reforgeFortune = 0.0 + itemBaseFortune = 0.0 + greenThumbFortune = 0.0 + for (line in tool?.getLore()!!) { + tooltipFortunePattern.matchMatcher(line) { + displayedFortune = group(1)!!.toDouble() + reforgeFortune = group(2)?.toDouble() ?: 0.0 + } ?: continue + + itemBaseFortune = if (tool.getInternalName().contains("LOTUS")) { + 5.0 + } else { + val dummiesFF = (tool.getFarmingForDummiesCount() ?: 0) * 1.0 + displayedFortune - reforgeFortune - enchantmentFortune - dummiesFF } + greenThumbFortune = if (tool.getInternalName().contains("LOTUS")) { + displayedFortune - reforgeFortune - itemBaseFortune + } else 0.0 } + } - fun getCurrentFarmingFortune() = tabFortuneUniversal + tabFortuneCrop + fun getCurrentFarmingFortune() = tabFortuneUniversal + tabFortuneCrop - fun CropType.getLatestTrueFarmingFortune() = latestFF?.get(this) - } + fun CropType.getLatestTrueFarmingFortune() = latestFF?.get(this) @SubscribeEvent fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneFix.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneFix.kt index 838b3f6ce..bba86c595 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneFix.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneFix.kt @@ -11,12 +11,19 @@ import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimalIfNecessary import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class GardenCropMilestoneFix { - - private val tabListPattern = " Milestone: §r§a(?<crop>.*) (?<tier>.*): §r§3(?<percentage>.*)%".toPattern() - private val levelUpPattern = " {2}§r§b§lGARDEN MILESTONE §3(?<crop>.*) §8.*➜§3(?<tier>.*)".toPattern() + private val patternGroup = RepoPattern.group("garden.cropmilestone.fix") + private val tabListPattern by patternGroup.pattern( + "tablist", + " Milestone: §r§a(?<crop>.*) (?<tier>.*): §r§3(?<percentage>.*)%" + ) + private val levelUpPattern by patternGroup.pattern( + "levelup", + " {2}§r§b§lGARDEN MILESTONE §3(?<crop>.*) §8.*➜§3(?<tier>.*)" + ) private val tabListCropProgress = mutableMapOf<CropType, Long>() diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenLevelDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenLevelDisplay.kt index 21fb1a78a..d69b92bb3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenLevelDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenLevelDisplay.kt @@ -21,21 +21,27 @@ import kotlin.time.Duration.Companion.milliseconds class GardenLevelDisplay { private val config get() = GardenAPI.config.gardenLevels - private val expToNextLevelPattern by RepoPattern.pattern( - "garden.level.inventory.nextxp", + + private val patternGroup = RepoPattern.group("garden.level") + private val expToNextLevelPattern by patternGroup.pattern( + "inventory.nextxp", ".* §e(?<nextLevelExp>.*)§6/.*" ) - private val overflowPattern by RepoPattern.pattern("garden.level.inventory.overflow", ".*§r §6(?<overflow>.*)") - private val currentLevelPattern by RepoPattern.pattern( - "garden.level.inventory.currentlevel", + private val overflowPattern by patternGroup.pattern( + "inventory.overflow", + ".*§r §6(?<overflow>.*)" + ) + private val currentLevelPattern by patternGroup.pattern( + "inventory.currentlevel", "Garden Level (?<currentLevel>.*)" ) - private var display = "" - private val visitorRewardPattern by RepoPattern.pattern( - "garden.level.chat.increase", + private val visitorRewardPattern by patternGroup.pattern( + "chat.increase", " {4}§r§8\\+§r§2(?<exp>.*) §r§7Garden Experience" ) + private var display = "" + @SubscribeEvent fun onProfileJoin(event: ProfileJoinEvent) { update() diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt index 22c6cb7fc..2ad7d11fd 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt @@ -27,6 +27,7 @@ import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.utils.TimeUtils.format +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import com.google.gson.Gson import io.github.moulberry.notenoughupdates.util.SkyBlockTime import kotlinx.coroutines.Dispatchers @@ -54,9 +55,19 @@ object GardenNextJacobContest { var contests = mutableMapOf<SimpleTimeMark, FarmingContest>() private var inCalendar = false - private val patternDay = "§aDay (?<day>.*)".toPattern() - private val patternMonth = "(?<month>.*), Year (?<year>.*)".toPattern() - private val patternCrop = "§(e○|6☘) §7(?<crop>.*)".toPattern() + private val patternGroup = RepoPattern.group("garden.nextcontest") + private val dayPattern by patternGroup.pattern( + "day", + "§aDay (?<day>.*)" + ) + private val monthPattern by patternGroup.pattern( + "month", + "(?<month>.*), Year (?<year>.*)" + ) + private val cropPattern by patternGroup.pattern( + "crop", + "§(e○|6☘) §7(?<crop>.*)" + ) private val closeToNewYear = "§7Close to new SB year!" private const val maxContestsPerYear = 124 @@ -140,7 +151,7 @@ object GardenNextJacobContest { inCalendar = true - patternMonth.matchMatcher(event.inventoryName) { + monthPattern.matchMatcher(event.inventoryName) { val month = LorenzUtils.getSBMonthByName(group("month")) val year = group("year").toInt() @@ -175,13 +186,13 @@ object GardenNextJacobContest { if (!lore.any { it.contains("§6§eJacob's Farming Contest") }) continue val name = item.name ?: continue - val day = patternDay.matchMatcher(name) { group("day").toInt() } ?: continue + val day = dayPattern.matchMatcher(name) { group("day").toInt() } ?: continue val startTime = SkyBlockTime(year, month, day).asTimeMark() val crops = mutableListOf<CropType>() for (line in lore) { - patternCrop.matchMatcher(line) { crops.add(CropType.getByName(group("crop"))) } + cropPattern.matchMatcher(line) { crops.add(CropType.getByName(group("crop"))) } } contests[startTime] = FarmingContest(startTime + contestDuration, crops) diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenOptimalSpeed.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenOptimalSpeed.kt index 56d3fe17d..3f1021bcb 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenOptimalSpeed.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenOptimalSpeed.kt @@ -15,6 +15,7 @@ import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.renderables.Renderable import io.github.moulberry.moulconfig.observer.Property +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.client.Minecraft import net.minecraft.client.gui.inventory.GuiEditSign import net.minecraftforge.client.event.GuiOpenEvent @@ -26,6 +27,12 @@ import kotlin.time.Duration.Companion.seconds class GardenOptimalSpeed { private val config get() = GardenAPI.config.optimalSpeeds + + private val currentSpeedPattern by RepoPattern.pattern( + "garden.optimalspeed.currentspeed", + " Speed: §r§f✦(?<speed>.*)" + ) + private val configCustomSpeed get() = config.customSpeed private var sneakingTime = 0.seconds private val sneaking get() = Minecraft.getMinecraft().thePlayer.isSneaking @@ -37,7 +44,6 @@ class GardenOptimalSpeed { _currentSpeed = value } private var optimalSpeed = -1 - private val currentSpeedPattern = " Speed: §r§f✦(?<speed>.*)".toPattern() private var lastWarnTime = 0L private var cropInHand: CropType? = null private var rancherOverlayList: List<List<Any?>> = emptyList() diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenPlotAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenPlotAPI.kt index f1edf26e9..58a56c400 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenPlotAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenPlotAPI.kt @@ -23,10 +23,13 @@ import kotlin.time.Duration.Companion.minutes object GardenPlotAPI { - private val plotNamePattern by RepoPattern.pattern("garden.plot.name", "§.Plot §7- §b(?<name>.*)") - - private val plotSprayedPattern by RepoPattern.pattern( - "garden.plot.spray.target", + private val patternGroup = RepoPattern.group("garden.plot") + private val plotNamePattern by patternGroup.pattern( + "name", + "§.Plot §7- §b(?<name>.*)" + ) + private val plotSprayedPattern by patternGroup.pattern( + "spray.target", "§a§lSPRAYONATOR! §r§7You sprayed §r§aPlot §r§7- §r§b(?<plot>.*) §r§7with §r§a(?<spray>.*)§r§7!" ) diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenWarpCommands.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenWarpCommands.kt index 563258b95..fc30e3651 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenWarpCommands.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenWarpCommands.kt @@ -8,6 +8,7 @@ import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.NEUItems import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +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 @@ -16,8 +17,11 @@ class GardenWarpCommands { private val config get() = GardenAPI.config.gardenCommands - // TODO repo - private val tpPlotPattern = "/tp (?<plot>.*)".toPattern() + private val tpPlotPattern by RepoPattern.pattern( + "garden.warpcommand.tpplot", + "/tp (?<plot>.*)" + ) + private var lastWarpTime = SimpleTimeMark.farPast() @SubscribeEvent diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/ToolTooltipTweaks.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/ToolTooltipTweaks.kt index 56568f017..70dbcb1e8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/ToolTooltipTweaks.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/ToolTooltipTweaks.kt @@ -3,7 +3,7 @@ package at.hannibal2.skyhanni.features.garden import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.config.features.garden.TooltipTweaksConfig.CropTooltipFortuneEntry import at.hannibal2.skyhanni.events.LorenzToolTipEvent -import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay.Companion.getAbilityFortune +import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay.getAbilityFortune import at.hannibal2.skyhanni.features.garden.GardenAPI.getCropType import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI import at.hannibal2.skyhanni.utils.ConfigUtils diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterInventoryNumbers.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterInventoryNumbers.kt index f883f5de1..acb62abe2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterInventoryNumbers.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterInventoryNumbers.kt @@ -8,12 +8,20 @@ import at.hannibal2.skyhanni.utils.NumberUtil import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class ComposterInventoryNumbers { - private val valuePattern = ".* §e(?<having>.*)§6/(?<total>.*)".toPattern() - private val compostsPattern = "§7§7Compost Available: §a(?<amount>.*)".toPattern() + private val patternGroup = RepoPattern.group("garden.composter.inventory.numbers") + private val valuePattern by patternGroup.pattern( + "value", + ".* §e(?<having>.*)§6/(?<total>.*)" + ) + private val amountPattern by patternGroup.pattern( + "amount", + "§7§7Compost Available: §a(?<amount>.*)" + ) @SubscribeEvent fun onRenderItemTip(event: RenderInventoryItemTipEvent) { @@ -29,7 +37,7 @@ class ComposterInventoryNumbers { // Composts Available if (slotNumber == 13) { for (line in stack.getLore()) { - compostsPattern.matchMatcher(line) { + amountPattern.matchMatcher(line) { val total = group("amount").replace(",", "").toInt() event.offsetY = -2 event.offsetX = -20 diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/ContestBracket.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/ContestBracket.kt index 9ee04d3fc..eb091668a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/ContestBracket.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/ContestBracket.kt @@ -1,5 +1,7 @@ package at.hannibal2.skyhanni.features.garden.contest +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern + enum class ContestBracket(val color: String) { DIAMOND("b"), PLATINUM("3"), @@ -9,5 +11,8 @@ enum class ContestBracket(val color: String) { ; val displayName = "§$color§l$name" - val pattern = "$displayName §7\\(§bTop \\d{1,2}%§7\\): §6(?<amount>.*)".toPattern() + val bracketPattern by RepoPattern.pattern( + "garden.farming.contest.bracket" + this.name.lowercase(), + "$displayName §7\\(§bTop \\d{1,2}%§7\\): §6(?<amount>.*)" + ) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/FarmingContestAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/FarmingContestAPI.kt index b70fc9934..727c86ef0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/FarmingContestAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/FarmingContestAPI.kt @@ -15,6 +15,7 @@ import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import io.github.moulberry.notenoughupdates.util.SkyBlockTime import net.minecraft.item.ItemStack import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -22,16 +23,30 @@ import kotlin.time.Duration.Companion.minutes object FarmingContestAPI { - private val timePattern = "§a(?<month>.*) (?<day>.*)(?:rd|st|nd|th), Year (?<year>.*)".toPattern() + private val patternGroup = RepoPattern.group("garden.farming.contest") + private val timePattern by patternGroup.pattern( + "time", + "§a(?<month>.*) (?<day>.*)(?:rd|st|nd|th), Year (?<year>.*)" + ) + private val cropPattern by patternGroup.pattern( + "crop", + "§8(?<crop>.*) Contest" + ) + private val sidebarCropPattern by patternGroup.pattern( + "sidebarcrop", + "(?:§e○|§6☘) §f(?<crop>.*) §a.*" + ) + private val contests = mutableMapOf<Long, FarmingContest>() - private val cropPattern = "§8(?<crop>.*) Contest".toPattern() var inContest = false var contestCrop: CropType? = null private var startTime = SimpleTimeMark.farPast() - private val sidebarCropPattern = "(?:§e○|§6☘) §f(?<crop>.*) §a.*".toPattern() - var inInventory = false + init { + ContestBracket.entries.forEach { it.bracketPattern } + } + @SubscribeEvent fun onTick(event: LorenzTickEvent) { if (event.repeatSeconds(1)) { @@ -116,7 +131,7 @@ object FarmingContestAPI { val brackets = buildMap { for (bracket in ContestBracket.entries) { val amount = lore.firstNotNullOfOrNull { - bracket.pattern.matchMatcher(it) { + bracket.bracketPattern.matchMatcher(it) { group("amount").replace(",", "").toInt() } } ?: continue diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestFFNeededDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestFFNeededDisplay.kt index 8b8150cc8..da38c318b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestFFNeededDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestFFNeededDisplay.kt @@ -4,7 +4,7 @@ import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.InventoryCloseEvent import at.hannibal2.skyhanni.events.RenderItemTooltipEvent import at.hannibal2.skyhanni.features.garden.CropType -import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay.Companion.getLatestTrueFarmingFortune +import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay.getLatestTrueFarmingFortune import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.farming.GardenCropSpeed.getLatestBlocksPerSecond import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestTimeNeeded.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestTimeNeeded.kt index 7f6a91c33..c493bd6ca 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestTimeNeeded.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestTimeNeeded.kt @@ -3,7 +3,7 @@ package at.hannibal2.skyhanni.features.garden.contest import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.InventoryUpdatedEvent import at.hannibal2.skyhanni.features.garden.CropType -import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay.Companion.getLatestTrueFarmingFortune +import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay.getLatestTrueFarmingFortune import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.farming.GardenCropSpeed.getLatestBlocksPerSecond import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/ArmorDropTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/ArmorDropTracker.kt index 7e91764dd..f4e48b626 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/ArmorDropTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/ArmorDropTracker.kt @@ -19,6 +19,7 @@ import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.SimpleTimeMark +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker import at.hannibal2.skyhanni.utils.tracker.TrackerData import com.google.gson.JsonObject @@ -28,10 +29,15 @@ import kotlin.time.Duration.Companion.seconds object ArmorDropTracker { - private var hasArmor = false - private val armorPattern = "(FERMENTO|CROPIE|SQUASH|MELON)_(LEGGINGS|CHESTPLATE|BOOTS|HELMET)".toPattern() private val config get() = GardenAPI.config.farmingArmorDrop + private val armorPattern by RepoPattern.pattern( + "garden.armordrops.armor", + "(FERMENTO|CROPIE|SQUASH|MELON)_(LEGGINGS|CHESTPLATE|BOOTS|HELMET)" + ) + + private var hasArmor = false + private val tracker = SkyHanniTracker("Armor Drop Tracker", { Data() }, { it.garden.armorDropTracker }) { drawDisplay(it) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/DicerRngDropTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/DicerRngDropTracker.kt index 000772cbc..592705bb7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/DicerRngDropTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/DicerRngDropTracker.kt @@ -13,6 +13,7 @@ import at.hannibal2.skyhanni.utils.CollectionUtils.sortedDesc import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker import at.hannibal2.skyhanni.utils.tracker.TrackerData import com.google.gson.annotations.Expose @@ -36,24 +37,41 @@ object DicerRngDropTracker { var drops: MutableMap<CropType, MutableMap<DropRarity, Int>> = mutableMapOf() } - // TODO USE SH-REPO - private val melonUncommonDropPattern = - "§a§lUNCOMMON DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Melon§r§e!".toPattern() - private val melonRareDropPattern = - "§9§lRARE DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Melon§r§e!".toPattern() - private val melonCrazyRareDropPattern = - "§d§lCRAZY RARE DROP! §r§eDicer dropped §r§[a|9](\\d+)x §r§[a|9]Enchanted Melon(?: Block)?§r§e!".toPattern() - private val melonRngesusDropPattern = - "§5§lPRAY TO RNGESUS DROP! §r§eDicer dropped §r§9(\\d+)x §r§9Enchanted Melon Block§r§e!".toPattern() - - private val pumpkinUncommonDropPattern = - "§a§lUNCOMMON DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Pumpkin§r§e!".toPattern() - private val pumpkinRareDropPattern = - "§9§lRARE DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Pumpkin§r§e!".toPattern() - private val pumpkinCrazyRareDropPattern = - "§d§lCRAZY RARE DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Pumpkin§r§e!".toPattern() - private val pumpkinRngesusDropPattern = - "§5§lPRAY TO RNGESUS DROP! §r§eDicer dropped §r§[a|9](\\d+)x §r§(aEnchanted|9Polished) Pumpkin§r§e!".toPattern() + private val melonPatternGroup = RepoPattern.group("garden.dicer.melon") + private val melonUncommonDropPattern by melonPatternGroup.pattern( + "uncommon", + "§a§lUNCOMMON DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Melon§r§e!" + ) + private val melonRareDropPattern by melonPatternGroup.pattern( + "rare", + "§9§lRARE DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Melon§r§e!" + ) + private val melonCrazyRareDropPattern by melonPatternGroup.pattern( + "crazyrare", + "§d§lCRAZY RARE DROP! §r§eDicer dropped §r§[a|9](\\d+)x §r§[a|9]Enchanted Melon(?: Block)?§r§e!" + ) + private val melonRngesusDropPattern by melonPatternGroup.pattern( + "rngesus", + "§5§lPRAY TO RNGESUS DROP! §r§eDicer dropped §r§9(\\d+)x §r§9Enchanted Melon Block§r§e!" + ) + + private val pumpkinPatternGroup = RepoPattern.group("garden.dicer.pumpkin") + private val pumpkinUncommonDropPattern by pumpkinPatternGroup.pattern( + "uncommon", + "§a§lUNCOMMON DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Pumpkin§r§e!" + ) + private val pumpkinRareDropPattern by pumpkinPatternGroup.pattern( + "rare", + "§9§lRARE DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Pumpkin§r§e!" + ) + private val pumpkinCrazyRareDropPattern by pumpkinPatternGroup.pattern( + "crazyrare", + "§d§lCRAZY RARE DROP! §r§eDicer dropped §r§a(\\d+)x §r§aEnchanted Pumpkin§r§e!" + ) + private val pumpkinRngesusDropPattern by pumpkinPatternGroup.pattern( + "rngesus", + "§5§lPRAY TO RNGESUS DROP! §r§eDicer dropped §r§[a|9](\\d+)x §r§(aEnchanted|9Polished) Pumpkin§r§e!" + ) init { itemDrops.add(ItemDrop(CropType.MELON, DropRarity.UNCOMMON, melonUncommonDropPattern)) diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt index 89cac9417..c9e872d1d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt @@ -27,23 +27,44 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.math.round import kotlin.time.Duration.Companion.days -class CaptureFarmingGear { - +object CaptureFarmingGear { private val farmingItems get() = GardenAPI.storage?.fortune?.farmingItems private val outdatedItems get() = GardenAPI.storage?.fortune?.outdatedItems - // TODO USE SH-REPO - private val farmingLevelUpPattern = "SKILL LEVEL UP Farming .*➜(?<level>.*)".toPattern() - private val fortuneUpgradePattern = "You claimed the Garden Farming Fortune (?<level>.*) upgrade!".toPattern() - private val anitaBuffPattern = "You tiered up the Extra Farming Drops upgrade to [+](?<level>.*)%!".toPattern() - private val anitaMenuPattern = "§7You have: §6\\+(?<level>.*)☘ Farming Fortune".toPattern() - - private val lotusUpgradePattern = "Lotus (?<piece>.*) upgraded to [+].*☘!".toPattern() - private val petLevelUpPattern = "Your (?<pet>.*) leveled up to level .*!".toPattern() - - private val cakePattern = "(?:Big )?Yum! You (?:gain|refresh) [+]5☘ Farming Fortune for 48 hours!".toPattern() - private val patternGroup = RepoPattern.group("garden.fortuneguide.capture") + private val farmingLevelUpPattern by patternGroup.pattern( + "farminglevel", + "SKILL LEVEL UP Farming .*➜(?<level>.*)" + ) + private val fortuneUpgradePattern by patternGroup.pattern( + "fortuneupgrade", + "You claimed the Garden Farming Fortune (?<level>.*) upgrade!" + ) + private val anitaBuffPattern by patternGroup.pattern( + "anitabuff", + "You tiered up the Extra Farming Drops upgrade to [+](?<level>.*)%!" + ) + private val anitaMenuPattern by patternGroup.pattern( + "anitamenu", + "§7You have: §6\\+(?<level>.*)☘ Farming Fortune" + ) + private val lotusUpgradePattern by patternGroup.pattern( + "lotusupgrade", + "Lotus (?<piece>.*) upgraded to [+].*☘!" + ) + private val petLevelUpPattern by patternGroup.pattern( + "petlevelup", + "Your (?<pet>.*) leveled up to level .*!" + ) + private val cakePattern by patternGroup.pattern( + "cake", + "(?:Big )?Yum! You (?:gain|refresh) [+]5☘ Farming Fortune for 48 hours!" + ) + private val strengthPattern by patternGroup.pattern( + "strength", + " Strength: §r§c❁(?<strength>.*)" + ) + private val tierPattern by patternGroup.pattern( "uniquevisitors.tier", "§7Progress to Tier (?<nextTier>\\w+):.*" @@ -53,69 +74,64 @@ class CaptureFarmingGear { ".* §e(?<having>.*)§6/(?<total>.*)" ) - companion object { - - private val strengthPattern = " Strength: §r§c❁(?<strength>.*)".toPattern() - private val farmingSets = arrayListOf( - "FERMENTO", "SQUASH", "CROPIE", "MELON", "FARM", - "RANCHERS", "FARMER", "RABBIT" - ) - private val farmingItems get() = GardenAPI.storage?.fortune?.farmingItems + private val farmingSets = arrayListOf( + "FERMENTO", "SQUASH", "CROPIE", "MELON", "FARM", + "RANCHERS", "FARMER", "RABBIT" + ) - fun captureFarmingGear() { - val farmingItems = farmingItems ?: return - val itemStack = InventoryUtils.getItemInHand() ?: return + fun captureFarmingGear() { + val farmingItems = farmingItems ?: return + val itemStack = InventoryUtils.getItemInHand() ?: return - val currentCrop = itemStack.getCropType() + val currentCrop = itemStack.getCropType() - if (currentCrop == null) { - // todo better fall back items - // todo Daedalus axe - } else { - for (item in FarmingItems.entries) { - if (item.name == currentCrop.name) { - farmingItems[item] = itemStack - } + if (currentCrop == null) { + //todo better fall back items + //todo Daedalus axe + } else { + for (item in FarmingItems.entries) { + if (item.name == currentCrop.name) { + farmingItems[item] = itemStack } } - for (armor in InventoryUtils.getArmor()) { - if (armor == null) continue - val split = armor.getInternalName().asString().split("_") - if (split.first() in farmingSets) { - for (item in FarmingItems.entries) { - if (item.name == split.last()) { - farmingItems[item] = armor - } + } + for (armor in InventoryUtils.getArmor()) { + if (armor == null) continue + val split = armor.getInternalName().asString().split("_") + if (split.first() in farmingSets) { + for (item in FarmingItems.entries) { + if (item.name == split.last()) { + farmingItems[item] = armor } } } - for (line in TabListData.getTabList()) { - strengthPattern.matchMatcher(line) { - GardenAPI.storage?.fortune?.farmingStrength = group("strength").toInt() - } + } + for (line in TabListData.getTabList()) { + strengthPattern.matchMatcher(line) { + GardenAPI.storage?.fortune?.farmingStrength = group("strength").toInt() } } + } - fun reverseCarrotFortune() { - val storage = GardenAPI.storage?.fortune ?: return - storage.carrotFortune = !storage.carrotFortune - ChatUtils.chat("Toggled exportable carrot fortune to: ${storage.carrotFortune}") - } + fun reverseCarrotFortune() { + val storage = GardenAPI.storage?.fortune ?: return + storage.carrotFortune = !storage.carrotFortune + ChatUtils.chat("Toggled exportable carrot fortune to: ${storage.carrotFortune}") + } - fun reversePumpkinFortune() { - val storage = GardenAPI.storage?.fortune ?: return - storage.pumpkinFortune = !storage.pumpkinFortune - ChatUtils.chat("Toggled expired pumpkin fortune to: ${storage.pumpkinFortune}") - } + fun reversePumpkinFortune() { + val storage = GardenAPI.storage?.fortune ?: return + storage.pumpkinFortune = !storage.pumpkinFortune + ChatUtils.chat("Toggled expired pumpkin fortune to: ${storage.pumpkinFortune}") + } - private fun getUniqueVisitorsForTier(tier: Int): Int { - return when { - tier == 0 -> 0 - tier == 1 -> 1 - tier == 2 -> 5 - tier >= 3 -> 10 * (tier - 2) - else -> throw IllegalStateException("Unexpected unique visitors tier: $tier") - } + private fun getUniqueVisitorsForTier(tier: Int): Int { + return when { + tier == 0 -> 0 + tier == 1 -> 1 + tier == 2 -> 5 + tier >= 3 -> 10 * (tier - 2) + else -> throw IllegalStateException("Unexpected unique visitors tier: $tier") } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/AnitaExtraFarmingFortune.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/AnitaExtraFarmingFortune.kt index c9271231c..1ebc5be3b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/AnitaExtraFarmingFortune.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/AnitaExtraFarmingFortune.kt @@ -14,11 +14,18 @@ import at.hannibal2.skyhanni.utils.NumberUtil import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.NumberUtil.formatNumber import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class AnitaExtraFarmingFortune { private val config get() = GardenAPI.config.anitaShop + + private val realAmountPattern by RepoPattern.pattern( + "garden.inventory.anita.extrafortune.realamount", + "§5§o§aJacob's Ticket §8x(?<realAmount>.*)" + ) + private var levelPrice = mapOf<Int, Price>() @SubscribeEvent @@ -34,7 +41,7 @@ class AnitaExtraFarmingFortune { var contributionFactor = 1.0 val baseAmount = levelPrice[anitaUpgrade + 1]?.jacob_tickets ?: return for (line in event.toolTip) { - "§5§o§aJacob's Ticket §8x(?<realAmount>.*)".toPattern().matchMatcher(line) { + realAmountPattern.matchMatcher(line) { val realAmount = group("realAmount").formatNumber().toDouble() contributionFactor = realAmount / baseAmount } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/GardenInventoryNumbers.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/GardenInventoryNumbers.kt index b87b7bf33..98e2ffb41 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/GardenInventoryNumbers.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/GardenInventoryNumbers.kt @@ -11,13 +11,17 @@ import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimalIfNecessary import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class GardenInventoryNumbers { private val config get() = GardenAPI.config.number - private var patternUpgradeTier = "§7Current Tier: §[ea](?<tier>.*)§7/§a.*".toPattern() + private val upgradeTierPattern by RepoPattern.pattern( + "garden.inventory.numbers.upgradetier", + "§7Current Tier: §[ea](?<tier>.*)§7/§a.*" + ) @SubscribeEvent fun onRenderItemTip(event: RenderItemTipEvent) { @@ -36,7 +40,7 @@ class GardenInventoryNumbers { if (!config.cropUpgrades) return event.stack.getLore() - .map { patternUpgradeTier.matcher(it) } + .map { upgradeTierPattern.matcher(it) } .filter { it.matches() } .map { it.group("tier") } .forEach { event.stackTip = "" + it } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/SkyMartCopperPrice.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/SkyMartCopperPrice.kt index b304dd43e..81d01f2dd 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/SkyMartCopperPrice.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/SkyMartCopperPrice.kt @@ -17,12 +17,17 @@ import at.hannibal2.skyhanni.utils.NEUItems.getPriceOrNull import at.hannibal2.skyhanni.utils.NumberUtil import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.item.ItemStack import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class SkyMartCopperPrice { - private val copperPattern = "§c(?<amount>.*) Copper".toPattern() + private val copperPattern by RepoPattern.pattern( + "garden.inventory.skymart.copper", + "§c(?<amount>.*) Copper" + ) + private var display = emptyList<List<Any>>() private val config get() = GardenAPI.config.skyMart diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestFinder.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestFinder.kt index c46b73f01..976dc7ad7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestFinder.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestFinder.kt @@ -30,6 +30,7 @@ import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.StringUtils import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.renderables.Renderable +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.client.Minecraft import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -39,8 +40,15 @@ class PestFinder { private val config get() = PestAPI.config.pestFinder - // TODO repo pattern - private val pestsInScoreboardPattern = " §7⏣ §[ac]The Garden §4§lൠ§7 x(?<pests>.*)".toPattern() + private val patternGroup = RepoPattern.group("garden.pests.finder") + private val pestsInScoreboardPattern by patternGroup.pattern( + "scoreboard", + " §7⏣ §[ac]The Garden §4§lൠ§7 x(?<pests>.*)" + ) + private val pestInventoryPattern by patternGroup.pattern( + "inventory", + "§4§lൠ §cThis plot has §6(?<amount>\\d) Pests?§c!" + ) private var display = emptyList<Renderable>() private var lastTimeVacuumHold = SimpleTimeMark.farPast() @@ -63,8 +71,6 @@ class PestFinder { if (!isEnabled()) return if (event.inventoryName != "Configure Plots") return - val pestInventoryPattern = "§4§lൠ §cThis plot has §6(?<amount>\\d) Pests?§c!".toPattern() - for (plot in GardenPlotAPI.plots) { plot.pests = 0 val item = event.inventoryItems[plot.inventorySlot] ?: continue 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 bc1ae651c..8a4fd511b 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 @@ -11,6 +11,7 @@ import at.hannibal2.skyhanni.utils.ConfigUtils import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.StringUtils import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.time.Duration.Companion.seconds @@ -18,9 +19,15 @@ class PestSpawn { private val config get() = PestAPI.config.pestSpawn - private val patternOnePest = "§6§l.*! §7A §6Pest §7has appeared in §aPlot §7- §b(?<plot>.*)§7!".toPattern() - private val patternMultiplePests = - "§6§l.*! §6(?<amount>\\d) Pests §7have spawned in §aPlot §7- §b(?<plot>.*)§7!".toPattern() + private val patternGroup = RepoPattern.group("garden.pests.spawn") + private val onePestPattern by patternGroup.pattern( + "one", + "§6§l.*! §7A §6Pest §7has appeared in §aPlot §7- §b(?<plot>.*)§7!" + ) + private val multiplePestSpawn by patternGroup.pattern( + "multiple", + "§6§l.*! §6(?<amount>\\d) Pests §7have spawned in §aPlot §7- §b(?<plot>.*)§7!" + ) @SubscribeEvent fun onChat(event: LorenzChatEvent) { @@ -28,11 +35,11 @@ class PestSpawn { var blocked = false - patternOnePest.matchMatcher(event.message) { + onePestPattern.matchMatcher(event.message) { pestSpawn(1, group("plot")) blocked = true } - patternMultiplePests.matchMatcher(event.message) { + multiplePestSpawn.matchMatcher(event.message) { pestSpawn(group("amount").toInt(), group("plot")) blocked = true } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt index d8042272e..c34fcf433 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt @@ -22,6 +22,7 @@ import at.hannibal2.skyhanni.utils.NumberUtil.formatNumber import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent object GardenVisitorDropStatistics { @@ -36,13 +37,36 @@ object GardenVisitorDropStatistics { var lastAccept = 0L - private val acceptPattern = "OFFER ACCEPTED with (?<visitor>.*) [(](?<rarity>.*)[)]".toPattern() - private val copperPattern = "[+](?<amount>.*) Copper".toPattern() - private val gardenExpPattern = "[+](?<amount>.*) Garden Experience".toPattern() - private val farmingExpPattern = "[+](?<amount>.*) Farming XP".toPattern() - private val bitsPattern = "[+](?<amount>.*) Bits".toPattern() - private val mithrilPowderPattern = "[+](?<amount>.*) Mithril Powder".toPattern() - private val gemstonePowderPattern = "[+](?<amount>.*) Gemstone Powder".toPattern() + private val patternGroup = RepoPattern.group("garden.visitor.droptracker") + private val acceptPattern by patternGroup.pattern( + "accept", + "OFFER ACCEPTED with (?<visitor>.*) [(](?<rarity>.*)[)]" + ) + private val copperPattern by patternGroup.pattern( + "copper", + "[+](?<amount>.*) Copper" + ) + private val gardenExpPattern by patternGroup.pattern( + "gardenexp", + "[+](?<amount>.*) Garden Experience" + ) + private val farmingExpPattern by patternGroup.pattern( + "farmingexp", + "[+](?<amount>.*) Farming XP" + ) + private val bitsPattern by patternGroup.pattern( + "bits", + "[+](?<amount>.*) Bits" + ) + private val mithrilPowderPattern by patternGroup.pattern( + "powder.mithril", + "[+](?<amount>.*) Mithril Powder" + ) + private val gemstonePowderPattern by patternGroup.pattern( + "powder.gemstone", + "[+](?<amount>.*) Gemstone Powder" + ) + private var rewardsCount = mapOf<VisitorReward, Int>() private fun formatDisplay(map: List<List<Any>>): List<List<Any>> { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt index 1672857ff..d32b8e75d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt @@ -73,12 +73,26 @@ private val config get() = VisitorAPI.config class GardenVisitorFeatures { private var display = emptyList<List<Any>>() - private val newVisitorArrivedMessage = ".* §r§ehas arrived on your §r§bGarden§r§e!".toPattern() - private val copperPattern = " §8\\+§c(?<amount>.*) Copper".toPattern() - private val gardenExperiencePattern = " §8\\+§2(?<amount>.*) §7Garden Experience".toPattern() - private val visitorChatMessagePattern = "§e\\[NPC] (§.)?(?<name>.*)§f: §r.*".toPattern() - private val partialAcceptedPattern by RepoPattern.pattern( - "garden.visitor.partialaccepted", + + private val patternGroup = RepoPattern.group("garden.visitor") + private val visitorArrivePattern by patternGroup.pattern( + "visitorarrive", + ".* §r§ehas arrived on your §r§bGarden§r§e!" + ) + private val copperPattern by patternGroup.pattern( + "copper", + " §8\\+§c(?<amount>.*) Copper" + ) + private val gardenExperiencePattern by patternGroup.pattern( + "gardenexperience", + " §8\\+§2(?<amount>.*) §7Garden Experience" + ) + private val visitorChatMessagePattern by patternGroup.pattern( + "visitorchat", + "§e\\[NPC] (§.)?(?<name>.*)§f: §r.*" + ) + private val partialAcceptedPattern by patternGroup.pattern( + "partialaccepted", "§aYou gave some of the required items!" ) @@ -456,8 +470,8 @@ class GardenVisitorFeatures { } @SubscribeEvent - fun onChat(event: LorenzChatEvent) { - if (config.hypixelArrivedMessage && newVisitorArrivedMessage.matcher(event.message).matches()) { + fun onChatMessage(event: LorenzChatEvent) { + if (config.hypixelArrivedMessage && visitorArrivePattern.matcher(event.message).matches()) { event.blockedReason = "new_visitor_arrived" } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorTimer.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorTimer.kt index 6518a2bd7..6d82115a6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorTimer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorTimer.kt @@ -18,6 +18,7 @@ import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.utils.TimeUtils import at.hannibal2.skyhanni.utils.TimeUtils.format +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.concurrent.fixedRateTimer import kotlin.time.Duration @@ -30,7 +31,12 @@ import kotlin.time.toDuration class GardenVisitorTimer { private val config get() = GardenAPI.config.visitors.timer - private val pattern = "§b§lVisitors: §r§f\\((?<time>.*)\\)".toPattern() + + private val timePattern by RepoPattern.pattern( + "garden.visitor.timer.time", + "§b§lVisitors: §r§f\\((?<time>.*)\\)" + ) + private var display = "" private var lastMillis = 0.seconds private var sixthVisitorArrivalTime = SimpleTimeMark.farPast() @@ -99,7 +105,7 @@ class GardenVisitorTimer { return } - pattern.matchMatcher(line) { + timePattern.matchMatcher(line) { val rawTime = group("time").removeColor() if (lastTimerValue != rawTime) { lastTimerUpdate = SimpleTimeMark.now() diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/NPCVisitorFix.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/NPCVisitorFix.kt index 19edd0d28..ba4a5c80e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/NPCVisitorFix.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/NPCVisitorFix.kt @@ -27,7 +27,11 @@ object NPCVisitorFix { private val storage get() = ProfileStorageData.profileSpecific?.garden private val staticVisitors = listOf("Jacob", "Anita") - private val barnSkinChangePattern by RepoPattern.pattern("garden.barn.skin.change", "§aChanging Barn skin to §r.*") + + private val barnSkinChangePattern by RepoPattern.pattern( + "garden.barn.skin.change", + "§aChanging Barn skin to §r.*" + ) @SubscribeEvent fun onInventoryOpen(event: InventoryOpenEvent) { |