aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de
diff options
context:
space:
mode:
authorAiden Powers <powersajbusiness@protonmail.com>2024-07-30 23:03:47 -0700
committerGitHub <noreply@github.com>2024-07-31 14:03:47 +0800
commitc31cdee817dab3657528325947ce9429a138b30e (patch)
tree113524b9ff7dffd74aa1098af8d9d1cba5c42850 /src/main/java/de
parent6715d16bd530f972b2ad8dcacc00106ebf3b422f (diff)
downloadSkyblocker-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/de')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java42
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java9
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;
}