diff options
| author | Aiden Powers <powersajbusiness@protonmail.com> | 2024-07-30 23:03:47 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-31 14:03:47 +0800 |
| commit | c31cdee817dab3657528325947ce9429a138b30e (patch) | |
| tree | 113524b9ff7dffd74aa1098af8d9d1cba5c42850 /src/main/java | |
| parent | 6715d16bd530f972b2ad8dcacc00106ebf3b422f (diff) | |
| download | Skyblocker-c31cdee817dab3657528325947ce9429a138b30e.tar.gz Skyblocker-c31cdee817dab3657528325947ce9429a138b30e.tar.bz2 Skyblocker-c31cdee817dab3657528325947ce9429a138b30e.zip | |
Add slot text to Rabbit levels in the Chocolate Factory (#827)
Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
Diffstat (limited to 'src/main/java')
3 files changed, 44 insertions, 11 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index faaee6a4..087d1663 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -1,10 +1,13 @@ package de.hysky.skyblocker.skyblock.chocolatefactory; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.slottext.SlotText; import de.hysky.skyblocker.skyblock.item.tooltip.adders.LineSmoothener; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RegexUtils; +import de.hysky.skyblocker.utils.RomanNumerals; import de.hysky.skyblocker.utils.container.SimpleContainerSolver; +import de.hysky.skyblocker.utils.container.SlotTextAdder; import de.hysky.skyblocker.utils.container.TooltipAdder; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -21,6 +24,7 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.text.NumberFormat; @@ -28,11 +32,13 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class ChocolateFactorySolver extends SimpleContainerSolver implements TooltipAdder { +public class ChocolateFactorySolver extends SimpleContainerSolver implements TooltipAdder, SlotTextAdder { //Patterns private static final Pattern CPS_PATTERN = Pattern.compile("([\\d,.]+) Chocolate per second"); private static final Pattern CPS_INCREASE_PATTERN = Pattern.compile("\\+([\\d,]+) Chocolate per second"); private static final Pattern COST_PATTERN = Pattern.compile("Cost ([\\d,]+) Chocolate"); + private static final Pattern LEVEL_PATTERN = Pattern.compile("\\[(\\d+)]"); + private static final Pattern COACH_LEVEL_PATTERN = Pattern.compile("Coach Jackrabbit (\\w+)"); private static final Pattern TOTAL_MULTIPLIER_PATTERN = Pattern.compile("Total Multiplier: ([\\d.]+)x"); private static final Pattern MULTIPLIER_INCREASE_PATTERN = Pattern.compile("\\+([\\d.]+)x Chocolate per second"); private static final Pattern CHOCOLATE_PATTERN = Pattern.compile("^([\\d,]+) Chocolate$"); @@ -181,6 +187,10 @@ public class ChocolateFactorySolver extends SimpleContainerSolver implements Too cpsIncreaseFactors.sort(Comparator.comparingDouble(rabbit -> rabbit.cost() / rabbit.cpsIncrease())); //Ascending order, lower = better } + /** + * @param coachItem Represents the coach item. + * @return An optional containing the rabbit if the item is a coach, empty otherwise. + */ private Optional<Rabbit> getCoach(ItemStack coachItem) { if (!coachItem.isOf(Items.PLAYER_HEAD)) return Optional.empty(); String coachLore = ItemUtils.getConcatenatedLore(coachItem); @@ -198,13 +208,17 @@ public class ChocolateFactorySolver extends SimpleContainerSolver implements Too } Matcher costMatcher = COST_PATTERN.matcher(coachLore); + Matcher levelMatcher = COACH_LEVEL_PATTERN.matcher(coachItem.getName().getString()); OptionalLong cost = RegexUtils.getLongFromMatcher(costMatcher, multiplierIncreaseMatcher.hasMatch() ? multiplierIncreaseMatcher.end() : 0); //Cost comes after the multiplier line + int level = -1; + if (levelMatcher.find()) { + level = RomanNumerals.romanToDecimal(levelMatcher.group(1)); + } if (cost.isEmpty()) return Optional.empty(); - - return Optional.of(new Rabbit(totalCps / totalCpsMultiplier * (nextCpsMultiplier.getAsDouble() - currentCpsMultiplier.getAsDouble()), cost.getAsLong(), COACH_SLOT)); + return Optional.of(new Rabbit(totalCps / totalCpsMultiplier * (nextCpsMultiplier.getAsDouble() - currentCpsMultiplier.getAsDouble()), cost.getAsLong(), COACH_SLOT, level)); } - private Optional<Rabbit> getRabbit(ItemStack item, int slot) { + private Optional<Rabbit> getRabbit(ItemStack item, int slot) { String lore = ItemUtils.getConcatenatedLore(item); Matcher cpsMatcher = CPS_INCREASE_PATTERN.matcher(lore); OptionalInt currentCps = RegexUtils.getIntFromMatcher(cpsMatcher); @@ -217,8 +231,10 @@ public class ChocolateFactorySolver extends SimpleContainerSolver implements Too Matcher costMatcher = COST_PATTERN.matcher(lore); OptionalLong cost = RegexUtils.getLongFromMatcher(costMatcher, cpsMatcher.hasMatch() ? cpsMatcher.end() : 0); //Cost comes after the cps line + Matcher levelMatcher = LEVEL_PATTERN.matcher(lore); + int level = RegexUtils.getIntFromMatcher(levelMatcher).orElse(0) - 1; if (cost.isEmpty()) return Optional.empty(); - return Optional.of(new Rabbit((nextCps.getAsInt() - currentCps.getAsInt()) * (totalCpsMultiplier < 0 ? 1 : totalCpsMultiplier), cost.getAsLong(), slot)); + return Optional.of(new Rabbit((nextCps.getAsInt() - currentCps.getAsInt()) * (totalCpsMultiplier < 0 ? 1 : totalCpsMultiplier), cost.getAsLong(), slot, level)); } private Optional<ColorHighlight> getPrestigeHighlight() { @@ -375,6 +391,20 @@ public class ChocolateFactorySolver extends SimpleContainerSolver implements Too return 0; //The priority doesn't really matter here as this is the only tooltip adder for the Chocolate Factory. } + // ======== Slot Text Adder ======== + + @Override + public @NotNull List<SlotText> getText(@Nullable Slot slot, @NotNull ItemStack stack, int slotId) { + for (ChocolateFactorySolver.Rabbit rabbit : cpsIncreaseFactors) { + if (slotId == rabbit.slot()) { + // Use SlotText#topLeft for positioning and add color to the text. + Text levelText = Text.literal(String.valueOf(rabbit.level())).formatted(Formatting.GOLD); + return List.of(SlotText.topLeft(levelText)); + } + } + return List.of(); // Return an empty list if the slot does not correspond to a rabbit slot. + } + // ======== Reset and Other Classes ======== @Override @@ -400,5 +430,5 @@ public class ChocolateFactorySolver extends SimpleContainerSolver implements Too GOLDEN } - private record Rabbit(double cpsIncrease, long cost, int slot) {} + public record Rabbit(double cpsIncrease, long cost, int slot, int level) {} } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java index a28e204c..eb3d211d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.item.slottext; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.bazaar.BazaarHelper; +import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; import de.hysky.skyblocker.skyblock.item.slottext.adders.*; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.container.SlotTextAdder; @@ -42,7 +43,8 @@ public class SlotTextManager { new YourEssenceAdder(), new PowerStonesGuideAdder(), new BazaarHelper(), - new StatsTuningAdder() + new StatsTuningAdder(), + ChocolateFactorySolver.INSTANCE }; private static final ArrayList<SlotTextAdder> currentScreenAdders = new ArrayList<>(); private static final KeyBinding keyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.skyblocker.slottext", GLFW.GLFW_KEY_LEFT_ALT, "key.categories.skyblocker")); diff --git a/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java b/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java index 007cb0b1..ce2e6067 100644 --- a/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java +++ b/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java @@ -1,8 +1,8 @@ package de.hysky.skyblocker.utils; public class RomanNumerals { - private RomanNumerals() { - } + private RomanNumerals() {} + private static int getDecimalValue(char romanChar) { return switch (romanChar) { case 'I' -> 1; @@ -35,7 +35,8 @@ public class RomanNumerals { * Converts a roman numeral to a decimal number. * * @param romanNumeral The roman numeral to convert. - * @return The decimal number, or 0 if the roman numeral string has non-roman characters in it, or if the string is empty or null. + * @return The decimal number, or 0 if the string is empty or null. + * @throws IllegalArgumentException If the roman numeral is malformed. */ public static int romanToDecimal(String romanNumeral) { if (romanNumeral == null || romanNumeral.isEmpty()) return 0; @@ -45,7 +46,7 @@ public class RomanNumerals { for (int i = romanNumeral.length() - 1; i >= 0; i--) { char ch = romanNumeral.charAt(i); int number = getDecimalValue(ch); - if (number == 0) return 0; //Malformed roman numeral + if (number == 0) throw new IllegalArgumentException("Malformed roman numeral: " + romanNumeral); decimal = number >= lastNumber ? decimal + number : decimal - number; lastNumber = number; } |
