aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/de/hysky/skyblocker/SkyblockerMod.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonChestProfit.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java (renamed from src/main/java/de/hysky/skyblocker/skyblock/item/BackpackPreview.java)3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java (renamed from src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java)2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorPreviewTooltipComponent.java (renamed from src/main/java/de/hysky/skyblocker/skyblock/item/CompactorPreviewTooltipComponent.java)2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java96
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java (renamed from src/main/java/de/hysky/skyblocker/skyblock/item/PriceInfoTooltip.java)282
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java145
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/Constants.java25
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/Utils.java4
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json9
15 files changed, 426 insertions, 178 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 5e23e2e2..5178a777 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -9,6 +9,8 @@ import de.hysky.skyblocker.skyblock.dungeon.*;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonSecrets;
import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud;
import de.hysky.skyblocker.skyblock.item.*;
+import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
+import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.skyblock.quicknav.QuickNav;
import de.hysky.skyblocker.skyblock.rift.TheRift;
@@ -73,7 +75,7 @@ public class SkyblockerMod implements ClientModInitializer {
NEURepoManager.init();
ItemRepository.init();
HotbarSlotLock.init();
- PriceInfoTooltip.init();
+ ItemTooltip.init();
WikiLookup.init();
FairySouls.init();
Relics.init();
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
index 8905644f..15017995 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
@@ -178,7 +178,7 @@ public class SkyblockerConfig {
public FairySouls fairySouls = new FairySouls();
@SerialEntry
- public MythologicalRitual mythologicalRitual = new MythologicalRitual();
+ public MythologicalRitual mythologicalRitual = new MythologicalRitual();
@SerialEntry
public ItemCooldown itemCooldown = new ItemCooldown();
@@ -485,6 +485,9 @@ public class SkyblockerConfig {
@SerialEntry
public boolean enableMuseumDate = true;
+
+ @SerialEntry
+ public boolean enableExoticTooltip = true;
}
public static class ItemInfoDisplay {
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
index 10b21891..3cbb1b94 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
@@ -356,6 +356,14 @@ public class GeneralCategory {
newValue -> config.general.itemTooltip.enableMuseumDate = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableExoticTooltip"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.enableExoticTooltip.@Tooltip")))
+ .binding(defaults.general.itemTooltip.enableExoticTooltip,
+ () -> config.general.itemTooltip.enableExoticTooltip,
+ newValue -> config.general.itemTooltip.enableExoticTooltip = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
.build())
//Item Info Display
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
index 597faa3d..b25db7cf 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
@@ -6,7 +6,11 @@ import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver;
import de.hysky.skyblocker.skyblock.experiment.ExperimentSolver;
import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver;
import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver;
-import de.hysky.skyblocker.skyblock.item.*;
+import de.hysky.skyblocker.skyblock.item.ItemProtection;
+import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
+import de.hysky.skyblocker.skyblock.item.WikiLookup;
+import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
+import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
index 36e25d5c..c290e5b8 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
@@ -1,7 +1,7 @@
package de.hysky.skyblocker.skyblock;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.PriceInfoTooltip;
+import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.RenderHelper;
@@ -26,7 +26,7 @@ public class TeleportOverlay {
private static void render(WorldRenderContext wrc) {
if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.teleportOverlay.enableTeleportOverlays && client.player != null && client.world != null) {
ItemStack heldItem = client.player.getMainHandStack();
- String itemId = PriceInfoTooltip.getInternalNameFromNBT(heldItem, true);
+ String itemId = ItemTooltip.getInternalNameFromNBT(heldItem, true);
NbtCompound extraAttributes = ItemUtils.getExtraAttributes(heldItem);
if (itemId != null) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonChestProfit.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonChestProfit.java
index 4e6a5240..1e889af3 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonChestProfit.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonChestProfit.java
@@ -4,7 +4,8 @@ import com.google.gson.JsonObject;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.mixin.accessor.ScreenAccessor;
-import de.hysky.skyblocker.skyblock.item.PriceInfoTooltip;
+import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
+import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType;
import de.hysky.skyblocker.utils.Utils;
import it.unimi.dsi.fastutil.ints.IntBooleanPair;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
@@ -54,7 +55,7 @@ public class DungeonChestProfit {
if (!stack.isEmpty()) {
String name = stack.getName().getString();
- String id = PriceInfoTooltip.getInternalNameFromNBT(stack, false);
+ String id = ItemTooltip.getInternalNameFromNBT(stack, false);
//Regular item price
if (id != null) {
@@ -128,8 +129,8 @@ public class DungeonChestProfit {
* was based on complete data.
*/
private static IntBooleanPair getItemPrice(String id) {
- JsonObject bazaarPrices = PriceInfoTooltip.getBazaarPrices();
- JsonObject lbinPrices = PriceInfoTooltip.getLBINPrices();
+ JsonObject bazaarPrices = TooltipInfoType.BAZAAR.getData();
+ JsonObject lbinPrices = TooltipInfoType.LOWEST_BINS.getData();
if (bazaarPrices == null || lbinPrices == null) return IntBooleanPair.of(0, false);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/BackpackPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java
index 8782440c..5627b56d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/BackpackPreview.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java
@@ -1,8 +1,9 @@
-package de.hysky.skyblocker.skyblock.item;
+package de.hysky.skyblocker.skyblock.item.tooltip;
import com.mojang.blaze3d.systems.RenderSystem;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
import de.hysky.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.minecraft.client.MinecraftClient;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java
index 1e3dd7d2..9cf0356b 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java
@@ -1,4 +1,4 @@
-package de.hysky.skyblocker.skyblock.item;
+package de.hysky.skyblocker.skyblock.item.tooltip;
import de.hysky.skyblocker.mixin.accessor.DrawContextInvoker;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CompactorPreviewTooltipComponent.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorPreviewTooltipComponent.java
index 513d7d72..22498c02 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/CompactorPreviewTooltipComponent.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorPreviewTooltipComponent.java
@@ -1,4 +1,4 @@
-package de.hysky.skyblocker.skyblock.item;
+package de.hysky.skyblocker.skyblock.item.tooltip;
import de.hysky.skyblocker.SkyblockerMod;
import it.unimi.dsi.fastutil.ints.IntIntPair;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java
new file mode 100644
index 00000000..66d94890
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java
@@ -0,0 +1,96 @@
+package de.hysky.skyblocker.skyblock.item.tooltip;
+
+import de.hysky.skyblocker.utils.Constants;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.text.MutableText;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import net.minecraft.util.StringIdentifiable;
+
+public class ExoticTooltip {
+ public static String getExpectedHex(String id) {
+ String color = TooltipInfoType.COLOR.getData().get(id).getAsString();
+ if (color != null) {
+ String[] RGBValues = color.split(",");
+ return String.format("%02X%02X%02X", Integer.parseInt(RGBValues[0]), Integer.parseInt(RGBValues[1]), Integer.parseInt(RGBValues[2]));
+ } else {
+ ItemTooltip.LOGGER.warn("[Skyblocker Exotics] No expected color data found for id {}", id);
+ return null;
+ }
+ }
+
+ public static boolean isException(String id, String hex) {
+ if (id.startsWith("LEATHER") || id.equals("GHOST_BOOTS") || Constants.SEYMOUR_IDS.contains(id)) {
+ return true;
+ }
+ if (id.startsWith("RANCHER")) {
+ return Constants.RANCHERS.contains(hex);
+ }
+ if (id.contains("ADAPTIVE_CHESTPLATE")) {
+ return Constants.ADAPTIVE_CHEST.contains(hex);
+ } else if (id.contains("ADAPTIVE")) {
+ return Constants.ADAPTIVE.contains(hex);
+ }
+ if (id.startsWith("REAPER")) {
+ return Constants.REAPER.contains(hex);
+ }
+ if (id.startsWith("FAIRY")) {
+ return Constants.FAIRY_HEXES.contains(hex);
+ }
+ if (id.startsWith("CRYSTAL")) {
+ return Constants.CRYSTAL_HEXES.contains(hex);
+ }
+ if (id.contains("SPOOK")) {
+ return Constants.SPOOK.contains(hex);
+ }
+ return false;
+ }
+
+ public static DyeType checkDyeType(String hex) {
+ if (Constants.CRYSTAL_HEXES.contains(hex)) {
+ return DyeType.CRYSTAL;
+ }
+ if (Constants.FAIRY_HEXES.contains(hex)) {
+ return DyeType.FAIRY;
+ }
+ if (Constants.OG_FAIRY_HEXES.contains(hex)) {
+ return DyeType.OG_FAIRY;
+ }
+ if (Constants.SPOOK.contains(hex)) {
+ return DyeType.SPOOK;
+ }
+ if (Constants.GLITCHED.contains(hex)) {
+ return DyeType.GLITCHED;
+ }
+ return DyeType.EXOTIC;
+ }
+
+ public static boolean intendedDyed(NbtCompound ItemData) {
+ return ItemData.getCompound("ExtraAttributes").contains("dye_item");
+ }
+
+ public enum DyeType implements StringIdentifiable {
+ CRYSTAL("crystal", Formatting.AQUA),
+ FAIRY("fairy", Formatting.LIGHT_PURPLE),
+ OG_FAIRY("og_fairy", Formatting.DARK_PURPLE),
+ SPOOK("spook", Formatting.RED),
+ GLITCHED("glitched", Formatting.BLUE),
+ EXOTIC("exotic", Formatting.GOLD);
+ private final String name;
+ private final Formatting formatting;
+
+ DyeType(String name, Formatting formatting) {
+ this.name = name;
+ this.formatting = formatting;
+ }
+
+ @Override
+ public String asString() {
+ return name;
+ }
+
+ public MutableText getTranslatedText() {
+ return Text.translatable("skyblocker.exotic." + name).formatted(formatting);
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/PriceInfoTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
index 0885ae6b..e050aff5 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/PriceInfoTooltip.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
@@ -1,11 +1,10 @@
-package de.hysky.skyblocker.skyblock.item;
+package de.hysky.skyblocker.skyblock.item.tooltip;
-import com.google.gson.Gson;
import com.google.gson.JsonObject;
+import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Constants;
-import de.hysky.skyblocker.utils.Http;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
@@ -13,36 +12,25 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtElement;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.net.http.HttpHeaders;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CompletableFuture;
-public class PriceInfoTooltip {
- private static final Logger LOGGER = LoggerFactory.getLogger(PriceInfoTooltip.class.getName());
+public class ItemTooltip {
+ protected static final Logger LOGGER = LoggerFactory.getLogger(ItemTooltip.class.getName());
private static final MinecraftClient client = MinecraftClient.getInstance();
- private static JsonObject npcPricesJson;
- private static JsonObject bazaarPricesJson;
- private static JsonObject oneDayAvgPricesJson;
- private static JsonObject threeDayAvgPricesJson;
- private static JsonObject lowestPricesJson;
- private static JsonObject isMuseumJson;
- private static JsonObject motesPricesJson;
- private static volatile boolean nullMsgSend = false;
- private final static Gson gson = new Gson();
- private static final Map<String, String> apiAddresses;
- private static long npcHash = 0;
- private static long museumHash = 0;
- private static long motesHash = 0;
-
- public static void onInjectTooltip(ItemStack stack, TooltipContext context, List<Text> lines) {
+ protected static final SkyblockerConfig.ItemTooltip config = SkyblockerConfigManager.get().general.itemTooltip;
+ private static volatile boolean sentNullWarning = false;
+
+ public static void getTooltip(ItemStack stack, TooltipContext context, List<Text> lines) {
if (!Utils.isOnSkyblock() || client.player == null) return;
String name = getInternalNameFromNBT(stack, false);
@@ -55,65 +43,47 @@ public class PriceInfoTooltip {
neuName = internalID;
}
+ if (lines.isEmpty()) {
+ return;
+ }
+
int count = stack.getCount();
boolean bazaarOpened = lines.stream().anyMatch(each -> each.getString().contains("Buy price:") || each.getString().contains("Sell price:"));
- if (SkyblockerConfigManager.get().general.itemTooltip.enableNPCPrice) {
- if (npcPricesJson == null) {
- nullWarning();
- } else if (npcPricesJson.has(internalID)) {
- lines.add(Text.literal(String.format("%-21s", "NPC Price:"))
- .formatted(Formatting.YELLOW)
- .append(getCoinsMessage(npcPricesJson.get(internalID).getAsDouble(), count)));
- }
- }
-
- if (SkyblockerConfigManager.get().general.itemTooltip.enableMotesPrice && Utils.isInTheRift()) {
- if (motesPricesJson == null) {
- nullWarning();
- } else if (motesPricesJson.has(internalID)) {
- lines.add(Text.literal(String.format("%-20s", "Motes Price:"))
- .formatted(Formatting.LIGHT_PURPLE)
- .append(getMotesMessage(motesPricesJson.get(internalID).getAsInt(), count)));
- }
+ if (TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) {
+ lines.add(Text.literal(String.format("%-21s", "NPC Price:"))
+ .formatted(Formatting.YELLOW)
+ .append(getCoinsMessage(TooltipInfoType.NPC.getData().get(internalID).getAsDouble(), count)));
}
boolean bazaarExist = false;
- if (SkyblockerConfigManager.get().general.itemTooltip.enableBazaarPrice && !bazaarOpened) {
- if (bazaarPricesJson == null) {
- nullWarning();
- } else if (bazaarPricesJson.has(name)) {
- JsonObject getItem = bazaarPricesJson.getAsJsonObject(name);
- lines.add(Text.literal(String.format("%-18s", "Bazaar buy Price:"))
- .formatted(Formatting.GOLD)
- .append(getItem.get("buyPrice").isJsonNull()
- ? Text.literal("No data").formatted(Formatting.RED)
- : getCoinsMessage(getItem.get("buyPrice").getAsDouble(), count)));
- lines.add(Text.literal(String.format("%-19s", "Bazaar sell Price:"))
- .formatted(Formatting.GOLD)
- .append(getItem.get("sellPrice").isJsonNull()
- ? Text.literal("No data").formatted(Formatting.RED)
- : getCoinsMessage(getItem.get("sellPrice").getAsDouble(), count)));
- bazaarExist = true;
- }
+ if (TooltipInfoType.BAZAAR.isTooltipEnabledAndHasOrNullWarning(name) && !bazaarOpened) {
+ JsonObject getItem = TooltipInfoType.BAZAAR.getData().getAsJsonObject(name);
+ lines.add(Text.literal(String.format("%-18s", "Bazaar buy Price:"))
+ .formatted(Formatting.GOLD)
+ .append(getItem.get("buyPrice").isJsonNull()
+ ? Text.literal("No data").formatted(Formatting.RED)
+ : getCoinsMessage(getItem.get("buyPrice").getAsDouble(), count)));
+ lines.add(Text.literal(String.format("%-19s", "Bazaar sell Price:"))
+ .formatted(Formatting.GOLD)
+ .append(getItem.get("sellPrice").isJsonNull()
+ ? Text.literal("No data").formatted(Formatting.RED)
+ : getCoinsMessage(getItem.get("sellPrice").getAsDouble(), count)));
+ bazaarExist = true;
}
// bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api
boolean lbinExist = false;
- if (SkyblockerConfigManager.get().general.itemTooltip.enableLowestBIN && !bazaarOpened && !bazaarExist) {
- if (lowestPricesJson == null) {
- nullWarning();
- } else if (lowestPricesJson.has(name)) {
- lines.add(Text.literal(String.format("%-19s", "Lowest BIN Price:"))
- .formatted(Formatting.GOLD)
- .append(getCoinsMessage(lowestPricesJson.get(name).getAsDouble(), count)));
- lbinExist = true;
- }
+ if (TooltipInfoType.LOWEST_BINS.isTooltipEnabledAndHasOrNullWarning(name) && !bazaarOpened && !bazaarExist) {
+ lines.add(Text.literal(String.format("%-19s", "Lowest BIN Price:"))
+ .formatted(Formatting.GOLD)
+ .append(getCoinsMessage(TooltipInfoType.LOWEST_BINS.getData().get(name).getAsDouble(), count)));
+ lbinExist = true;
}
if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) {
- if (threeDayAvgPricesJson == null || oneDayAvgPricesJson == null) {
+ if (TooltipInfoType.ONE_DAY_AVERAGE.getData() == null || TooltipInfoType.THREE_DAY_AVERAGE.getData() == null) {
nullWarning();
} else {
/*
@@ -143,16 +113,16 @@ public class PriceInfoTooltip {
}
if (!neuName.isEmpty() && lbinExist) {
- SkyblockerConfig.Average type = SkyblockerConfigManager.get().general.itemTooltip.avg;
+ SkyblockerConfig.Average type = config.avg;
// "No data" line because of API not keeping old data, it causes NullPointerException
if (type == SkyblockerConfig.Average.ONE_DAY || type == SkyblockerConfig.Average.BOTH) {
lines.add(
Text.literal(String.format("%-19s", "1 Day Avg. Price:"))
.formatted(Formatting.GOLD)
- .append(oneDayAvgPricesJson.get(neuName) == null
+ .append(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName) == null
? Text.literal("No data").formatted(Formatting.RED)
- : getCoinsMessage(oneDayAvgPricesJson.get(neuName).getAsDouble(), count)
+ : getCoinsMessage(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), count)
)
);
}
@@ -160,9 +130,9 @@ public class PriceInfoTooltip {
lines.add(
Text.literal(String.format("%-19s", "3 Day Avg. Price:"))
.formatted(Formatting.GOLD)
- .append(threeDayAvgPricesJson.get(neuName) == null
+ .append(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName) == null
? Text.literal("No data").formatted(Formatting.RED)
- : getCoinsMessage(threeDayAvgPricesJson.get(neuName).getAsDouble(), count)
+ : getCoinsMessage(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), count)
)
);
}
@@ -170,35 +140,68 @@ public class PriceInfoTooltip {
}
}
- if (SkyblockerConfigManager.get().general.itemTooltip.enableMuseumDate && !bazaarOpened) {
- if (isMuseumJson == null) {
- nullWarning();
- } else {
- String timestamp = getTimestamp(stack);
-
- if (isMuseumJson.has(internalID)) {
- String itemCategory = isMuseumJson.get(internalID).getAsString();
- String format = switch (itemCategory) {
- case "Weapons" -> "%-18s";
- case "Armor" -> "%-19s";
- default -> "%-20s";
- };
- lines.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")"))
- .formatted(Formatting.LIGHT_PURPLE)
- .append(Text.literal(timestamp).formatted(Formatting.RED)));
- } else if (!timestamp.isEmpty()) {
- lines.add(Text.literal(String.format("%-21s", "Obtained: "))
- .formatted(Formatting.LIGHT_PURPLE)
- .append(Text.literal(timestamp).formatted(Formatting.RED)));
+ if (TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) {
+ lines.add(Text.literal(String.format("%-20s", "Motes Price:"))
+ .formatted(Formatting.LIGHT_PURPLE)
+ .append(getMotesMessage(TooltipInfoType.MOTES.getData().get(internalID).getAsInt(), count)));
+ }
+
+ if (TooltipInfoType.MUSEUM.isTooltipEnabled() && !bazaarOpened) {
+ String timestamp = getTimestamp(stack);
+
+ if (TooltipInfoType.MUSEUM.hasOrNullWarning(internalID)) {
+ String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString();
+ String format = switch (itemCategory) {
+ case "Weapons" -> "%-18s";
+ case "Armor" -> "%-19s";
+ default -> "%-20s";
+ };
+ lines.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")"))
+ .formatted(Formatting.LIGHT_PURPLE)
+ .append(Text.literal(timestamp).formatted(Formatting.RED)));
+ } else if (!timestamp.isEmpty()) {
+ lines.add(Text.literal(String.format("%-21s", "Obtained: "))
+ .formatted(Formatting.LIGHT_PURPLE)
+ .append(Text.literal(timestamp).formatted(Formatting.RED)));
+ }
+ }
+
+ if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && stack.getNbt() != null) {
+ final NbtElement color = stack.getNbt().getCompound("display").get("color");
+
+ if (color != null) {
+ String colorHex = String.format("%06X", Integer.parseInt(color.asString()));
+ String expectedHex = ExoticTooltip.getExpectedHex(internalID);
+
+ boolean correctLine = false;
+ for (Text text : lines) {
+ String existingTooltip = text.getString() + " ";
+ if (existingTooltip.startsWith("Color: ")) {
+ correctLine = true;
+
+ addExoticTooltip(lines, internalID, stack.getNbt(), colorHex, expectedHex, existingTooltip);
+ break;
+ }
+ }
+
+ if (!correctLine) {
+ addExoticTooltip(lines, internalID, stack.getNbt(), colorHex, expectedHex, "");
}
}
}
}
- private static void nullWarning() {
- if (!nullMsgSend && client.player != null) {
+ private static void addExoticTooltip(List<Text> lines, String internalID, NbtCompound nbt, String colorHex, String expectedHex, String existingTooltip) {
+ if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !ExoticTooltip.isException(internalID, colorHex) && !ExoticTooltip.intendedDyed(nbt)) {
+ final ExoticTooltip.DyeType type = ExoticTooltip.checkDyeType(colorHex);
+ lines.add(1, Text.literal(existingTooltip + Formatting.DARK_GRAY + "(").append(type.getTranslatedText()).append(Formatting.DARK_GRAY + ")"));
+ }
+ }
+
+ public static void nullWarning() {
+ if (!sentNullWarning && client.player != null) {
client.player.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.itemTooltip.nullMessage")), false);
- nullMsgSend = true;
+ sentNullWarning = true;
}
}
@@ -234,6 +237,7 @@ public class PriceInfoTooltip {
return "";
}
+ // TODO What in the world is this?
public static String getInternalNameFromNBT(ItemStack stack, boolean internalIDOnly) {
NbtCompound ea = ItemUtils.getExtraAttributes(stack);
@@ -262,7 +266,7 @@ public class PriceInfoTooltip {
}
case "PET" -> {
if (ea.contains("petInfo")) {
- JsonObject petInfo = gson.fromJson(ea.getString("petInfo"), JsonObject.class);
+ JsonObject petInfo = SkyblockerMod.GSON.fromJson(ea.getString("petInfo"), JsonObject.class);
return "LVL_1_" + petInfo.get("tier").getAsString() + "_" + petInfo.get("type").getAsString();
}
}
@@ -340,86 +344,36 @@ public class PriceInfoTooltip {
public static void init() {
Scheduler.INSTANCE.scheduleCyclic(() -> {
if (!Utils.isOnSkyblock() && 0 < minute++) {
- nullMsgSend = false;
+ sentNullWarning = false;
return;
}
List<CompletableFuture<Void>> futureList = new ArrayList<>();
- if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) {
- SkyblockerConfig.Average type = SkyblockerConfigManager.get().general.itemTooltip.avg;
-
- if (type == SkyblockerConfig.Average.BOTH || oneDayAvgPricesJson == null || threeDayAvgPricesJson == null || minute % 5 == 0) {
- futureList.add(CompletableFuture.runAsync(() -> {
- oneDayAvgPricesJson = downloadPrices("1 day avg");
- threeDayAvgPricesJson = downloadPrices("3 day avg");
- }));
+
+ TooltipInfoType.NPC.downloadIfEnabled(futureList);
+ TooltipInfoType.BAZAAR.downloadIfEnabled(futureList);
+ TooltipInfoType.LOWEST_BINS.downloadIfEnabled(futureList);
+
+ if (config.enableAvgBIN) {
+ SkyblockerConfig.Average type = config.avg;
+
+ if (type == SkyblockerConfig.Average.BOTH || TooltipInfoType.ONE_DAY_AVERAGE.getData() == null || TooltipInfoType.THREE_DAY_AVERAGE.getData() == null || minute % 5 == 0) {
+ TooltipInfoType.ONE_DAY_AVERAGE.download(futureList);
+ TooltipInfoType.THREE_DAY_AVERAGE.download(futureList);
} else if (type == SkyblockerConfig.Average.ONE_DAY) {
- futureList.add(CompletableFuture.runAsync(() -> oneDayAvgPricesJson = downloadPrices("1 day avg")));
+ TooltipInfoType.ONE_DAY_AVERAGE.download(futureList);
} else if (type == SkyblockerConfig.Average.THREE_DAY) {
- futureList.add(CompletableFuture.runAsync(() -> threeDayAvgPricesJson = downloadPrices("3 day avg")));
+ TooltipInfoType.THREE_DAY_AVERAGE.download(futureList);
}
}
- if (SkyblockerConfigManager.get().general.itemTooltip.enableLowestBIN || SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator)
- futureList.add(CompletableFuture.runAsync(() -> lowestPricesJson = downloadPrices("lowest bins")));
-
- if (SkyblockerConfigManager.get().general.itemTooltip.enableBazaarPrice || SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator)
- futureList.add(CompletableFuture.runAsync(() -> bazaarPricesJson = downloadPrices("bazaar")));
-
- if (SkyblockerConfigManager.get().general.itemTooltip.enableNPCPrice && npcPricesJson == null)
- futureList.add(CompletableFuture.runAsync(() -> npcPricesJson = downloadPrices("npc")));
-
- if (SkyblockerConfigManager.get().general.itemTooltip.enableMuseumDate && isMuseumJson == null)
- futureList.add(CompletableFuture.runAsync(() -> isMuseumJson = downloadPrices("museum")));
- if (SkyblockerConfigManager.get().general.itemTooltip.enableMotesPrice && motesPricesJson == null)
- futureList.add(CompletableFuture.runAsync(() -> motesPricesJson = downloadPrices("motes")));
+ TooltipInfoType.MOTES.downloadIfEnabled(futureList);
+ TooltipInfoType.MUSEUM.downloadIfEnabled(futureList);
+ TooltipInfoType.COLOR.downloadIfEnabled(futureList);
minute++;
- CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]))
- .whenComplete((unused, throwable) -> nullMsgSend = false);
+ CompletableFuture.allOf(futureList.toArray(CompletableFuture[]::new))
+ .whenComplete((unused, throwable) -> sentNullWarning = false);
}, 1200, true);
}
-
- private static JsonObject downloadPrices(String type) {
- try {
- String url = apiAddresses.get(type);
-
- if (type.equals("npc") || type.equals("museum") || type.equals("motes")) {
- HttpHeaders headers = Http.sendHeadRequest(url);
- long combinedHash = Http.getEtag(headers).hashCode() + Http.getLastModified(headers).hashCode();
-
- switch (type) {
- case "npc": if (npcHash == combinedHash) return npcPricesJson; else npcHash = combinedHash;
- case "museum": if (museumHash == combinedHash) return isMuseumJson; else museumHash = combinedHash;
- case "motes": if (motesHash == combinedHash) return motesPricesJson; else motesHash = combinedHash;
- }
- }
-
- String apiResponse = Http.sendGetRequest(url);
-
- return new Gson().fromJson(apiResponse, JsonObject.class);
- } catch (Exception e) {
- LOGGER.warn("[Skyblocker] Failed to download " + type + " prices!", e);
- return null;
- }
- }
-
- public static JsonObject getBazaarPrices() {
- return bazaarPricesJson;
- }
-
- public static JsonObject getLBINPrices() {
- return lowestPricesJson;
- }
-
- static {
- apiAddresses = new HashMap<>();
- apiAddresses.put("1 day avg", "https://moulberry.codes/auction_averages_lbin/1day.json");
- apiAddresses.put("3 day avg", "https://moulberry.codes/auction_averages_lbin/3day.json");
- apiAddresses.put("bazaar", "https://hysky.de/api/bazaar");
- apiAddresses.put("lowest bins", "https://hysky.de/api/auctions/lowestbins");
- apiAddresses.put("npc", "https://hysky.de/api/npcprice");
- apiAddresses.put("museum", "https://hysky.de/api/museum");
- apiAddresses.put("motes", "https://hysky.de/api/motesprice");
- }
} \ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java
new file mode 100644
index 00000000..086fcb00
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java
@@ -0,0 +1,145 @@
+package de.hysky.skyblocker.skyblock.item.tooltip;
+
+import com.google.gson.JsonObject;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.config.SkyblockerConfig;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Http;
+import de.hysky.skyblocker.utils.Utils;
+import org.jetbrains.annotations.Nullable;
+
+import java.net.http.HttpHeaders;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Predicate;
+
+public enum TooltipInfoType implements Runnable {
+ NPC("https://hysky.de/api/npcprice", itemTooltip -> itemTooltip.enableNPCPrice, true),
+ BAZAAR("https://hysky.de/api/bazaar", itemTooltip -> itemTooltip.enableBazaarPrice || SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator, itemTooltip -> itemTooltip.enableBazaarPrice, false),
+ LOWEST_BINS("https://hysky.de/api/auctions/lowestbins", itemTooltip -> itemTooltip.enableLowestBIN || SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator, itemTooltip -> itemTooltip.enableLowestBIN, false),
+ ONE_DAY_AVERAGE("https://moulberry.codes/auction_averages_lbin/1day.json", itemTooltip -> itemTooltip.enableAvgBIN, false),
+ THREE_DAY_AVERAGE("https://moulberry.codes/auction_averages_lbin/3day.json", itemTooltip -> itemTooltip.enableAvgBIN, false),
+ MOTES("https://hysky.de/api/motesprice", itemTooltip -> itemTooltip.enableMotesPrice, itemTooltip -> itemTooltip.enableMotesPrice && Utils.isInTheRift(), true),
+ MUSEUM("https://hysky.de/api/museum", itemTooltip -> itemTooltip.enableMuseumDate, true),
+ COLOR("https://hysky.de/api/color", itemTooltip -> itemTooltip.enableExoticTooltip, true);
+
+ private final String address;
+ private final Predicate<SkyblockerConfig.ItemTooltip> dataEnabled;
+ private final Predicate<SkyblockerConfig.ItemTooltip> tooltipEnabled;
+ private JsonObject data;
+ private final boolean cacheable;
+ private long hash;
+
+ /**
+ * @param address the address to download the data from
+ * @param enabled the predicate to check if the data should be downloaded and the tooltip should be shown
+ * @param cacheable whether the data should be cached
+ */
+ TooltipInfoType(String address, Predicate<SkyblockerConfig.ItemTooltip> enabled, boolean cacheable) {
+ this(address, enabled, enabled, null, cacheable);
+ }
+
+ /**
+ * @param address the address to download the data from
+ * @param dataEnabled the predicate to check if data should be downloaded
+ * @param tooltipEnabled the predicate to check if the tooltip should be shown
+ * @param cacheable whether the data should be cached
+ */
+ TooltipInfoType(String address, Predicate<SkyblockerConfig.ItemTooltip> dataEnabled, Predicate<SkyblockerConfig.ItemTooltip> tooltipEnabled, boolean cacheable) {
+ this(address, dataEnabled, tooltipEnabled, null, cacheable);
+ }
+
+ /**
+ * @param address the address to download the data from
+ * @param dataEnabled the predicate to check if data should be downloaded
+ * @param tooltipEnabled the predicate to check if the tooltip should be shown
+ * @param data the data
+ * @param cacheable whether the data should be cached
+ */
+ TooltipInfoType(String address, Predicate<SkyblockerConfig.ItemTooltip> dataEnabled, Predicate<SkyblockerConfig.ItemTooltip> tooltipEnabled, @Nullable JsonObject data, boolean cacheable) {
+ this.address = address;
+ this.dataEnabled = dataEnabled;
+ this.tooltipEnabled = tooltipEnabled;
+ this.data = data;
+ this.cacheable = cacheable;
+ }
+
+ /**
+ * @return whether the data should be downloaded
+ */
+ private boolean isDataEnabled() {
+ return dataEnabled.test(ItemTooltip.config);
+ }
+
+ /**
+ * @return whether the tooltip should be shown
+ */
+ public boolean isTooltipEnabled() {
+ return tooltipEnabled.test(ItemTooltip.config);
+ }
+
+ public JsonObject getData() {
+ return data;
+ }
+
+ /**
+ * Checks if the data has the given member name and sends a warning message if data is null.
+ *
+ * @param memberName the member name to check
+ * @return whether the data has the given member name or not
+ */
+ public boolean hasOrNullWarning(String memberName) {
+ if (data == null) {
+ ItemTooltip.nullWarning();
+ return false;
+ } else return data.has(memberName);
+ }
+
+ /**
+ * Checks if the tooltip is enabled and the data has the given member name and sends a warning message if data is null.
+ *
+ * @param memberName the member name to check
+ * @return whether the tooltip is enabled and the data has the given member name or not
+ */
+ public boolean isTooltipEnabledAndHasOrNullWarning(String memberName) {
+ return isTooltipEnabled() && hasOrNullWarning(memberName);
+ }
+
+ /**
+ * Downloads the data if it is enabled.
+ *
+ * @param futureList the list to add the future to
+ */
+ public void downloadIfEnabled(List<CompletableFuture<Void>> futureList) {
+ if (isDataEnabled()) {
+ download(futureList);
+ }
+ }
+
+ /**
+ * Downloads the data.
+ *
+ * @param futureList the list to add the future to
+ */
+ public void download(List<CompletableFuture<Void>> futureList) {
+ futureList.add(CompletableFuture.runAsync(this));
+ }
+
+ /**
+ * Downloads the data.
+ */
+ @Override
+ public void run() {
+ try {
+ if (cacheable) {
+ HttpHeaders headers = Http.sendHeadRequest(address);
+ long hash = Http.getEtag(headers).hashCode() + Http.getLastModified(headers).hashCode();
+ if (this.hash == hash) return;
+ else this.hash = hash;
+ }
+ data = SkyblockerMod.GSON.fromJson(Http.sendGetRequest(address), JsonObject.class);
+ } catch (Exception e) {
+ ItemTooltip.LOGGER.warn("[Skyblocker] Failed to download " + this + " prices!", e);
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/Constants.java b/src/main/java/de/hysky/skyblocker/utils/Constants.java
index f144b519..94eacf49 100644
--- a/src/main/java/de/hysky/skyblocker/utils/Constants.java
+++ b/src/main/java/de/hysky/skyblocker/utils/Constants.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.utils;
+import java.util.List;
import java.util.function.IntFunction;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
@@ -28,4 +29,28 @@ public interface Constants {
.append(Text.literal("e").styled(WITH_COLOR.apply(0x12d5eb)))
.append(Text.literal("r").styled(WITH_COLOR.apply(0x14d0ff)))
.append(Text.literal("] ").formatted(Formatting.GRAY));
+
+
+ List<String> SEYMOUR_IDS = List.of("VELVET_TOP_HAT", "CASHMERE_JACKET", "SATIN_TROUSERS", "OXFORD_SHOES");
+
+ // Exotic Hexes
+ List<String> CRYSTAL_HEXES = List.of("1F0030", "46085E", "54146E", "5D1C78", "63237D", "6A2C82", "7E4196", "8E51A6", "9C64B3", "A875BD",
+ "B88BC9", "C6A3D4", "D9C1E3", "E5D1ED", "EFE1F5", "FCF3FF");
+ List<String> FAIRY_HEXES = List.of("330066", "4C0099", "660033", "660066", "6600CC", "7F00FF", "99004C", "990099", "9933FF", "B266FF",
+ "CC0066", "CC00CC", "CC99FF", "E5CCFF", "FF007F", "FF00FF", "FF3399", "FF33FF", "FF66B2", "FF66FF", "FF99CC", "FF99FF", "FFCCE5",
+ "FFCCFF");
+ List<String> OG_FAIRY_HEXES = List.of("FF99FF", "FFCCFF", "E5CCFF", "CC99FF", "CC00CC", "FF00FF", "FF33FF", "FF66FF",
+ "B266FF", "9933FF", "7F00FF", "660066", "6600CC", "4C0099", "330066", "990099", "660033", "99004C", "CC0066",
+ "660033", "99004C", "FFCCE5", "660033", "FFCCE5", "FF99CC", "FFCCE5", "FF99CC", "FF66B2");
+ List<String> GLITCHED = List.of("FFDC51", "F7DA33", "606060", "E7413C", "45413C", "4A14B7", "1793C4", "000000", "E75C3C", "65605A",
+ "5D2FB9", "17A8C4", "E76E3C", "88837E", "8969C8", "1CD4E4"); // Glitched through other means such as Shark Scale upgrade color
+ List<String> SPOOK = List.of("000000", "070008", "0E000F", "150017", "1B001F", "220027", "29002E", "300036", "37003E", "3E0046",
+ "45004D", "4C0055", "52005D", "590065", "60006C", "670074", "6E007C", "750084", "7C008B", "830093",
+ "89009B", "9000A3", "9700AA", "993399", "9E00B2");
+
+ // List of exceptions
+ List<String> RANCHERS = List.of("CC5500", "000000", "0");
+ List<String> REAPER = List.of("1B1B1B", "FF0000");
+ List<String> ADAPTIVE_CHEST = List.of("3ABE78", "82E3D8", "BFBCB2", "D579FF", "FF4242", "FFC234");
+ List<String> ADAPTIVE = List.of("169F57", "2AB5A5", "6E00A0", "BB0000", "BFBCB2", "FFF7E6");
}
diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java
index ff406b61..b1a347f9 100644
--- a/src/main/java/de/hysky/skyblocker/utils/Utils.java
+++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java
@@ -4,7 +4,7 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.skyblock.item.MuseumItemCache;
-import de.hysky.skyblocker.skyblock.item.PriceInfoTooltip;
+import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
import de.hysky.skyblocker.skyblock.rift.TheRift;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -180,7 +180,7 @@ public class Utils {
if (!isOnSkyblock) {
if (!isInjected) {
isInjected = true;
- ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip);
+ ItemTooltipCallback.EVENT.register(ItemTooltip::getTooltip);
}
isOnSkyblock = true;
SkyblockEvents.JOIN.invoker().onSkyblockJoin();
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 8665ce45..c0f3c7ba 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -77,6 +77,8 @@
"text.autoconfig.skyblocker.option.general.itemTooltip.enableLowestBIN": "Enable Lowest BIN Price",
"text.autoconfig.skyblocker.option.general.itemTooltip.enableBazaarPrice": "Enable Bazaar buy/sell Price",
"text.autoconfig.skyblocker.option.general.itemTooltip.enableMuseumDate": "Enable Museum & Date",
+ "text.autoconfig.skyblocker.option.general.itemTooltip.enableExoticTooltip": "Enable Exotic Tooltip",
+ "text.autoconfig.skyblocker.option.general.itemTooltip.enableExoticTooltip.@Tooltip": "Displays the type of exotic below the item's name if an armor piece is exotic.",
"text.autoconfig.skyblocker.option.general.itemInfoDisplay": "Item Info Display",
"text.autoconfig.skyblocker.option.general.itemInfoDisplay.attributeShardInfo": "Attribute Shard Info",
"text.autoconfig.skyblocker.option.general.itemInfoDisplay.attributeShardInfo.@Tooltip": "Displays the attribute's level as the stack count and the initials of the attribute's name.",
@@ -279,6 +281,13 @@
"skyblocker.dungeons.secrets.customWaypointRemoved": "§rRemoved custom waypoint at X: %d, Y: %d, Z: %d for room %s secret #%d of category %s with name '%s'.",
"skyblocker.dungeons.secrets.customWaypointNotFound": "§cNo custom waypoint found at X: %d, Y: %d, Z: %d for room %s.",
+ "skyblocker.exotic.crystal": "CRYSTAL",
+ "skyblocker.exotic.fairy": "FAIRY",
+ "skyblocker.exotic.og_fairy": "OG_FAIRY",
+ "skyblocker.exotic.spook": "SPOOK",
+ "skyblocker.exotic.glitched": "GLITCHED",
+ "skyblocker.exotic.exotic": "EXOTIC",
+
"skyblocker.fishing.reelNow": "Reel in now!",
"skyblocker.rift.healNow": "Heal now!",
"skyblocker.rift.iceNow": "Ice now!",