From 9ddc3fe9a52efcbd32e7671a4070ea0a371b5570 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 11 Jul 2024 01:50:27 -0400 Subject: Exotic Tooltip Enhancements/Fixes --- .../skyblock/item/tooltip/adders/ColorTooltip.java | 57 +++++++++++++++++----- .../item/tooltip/adders/ObtainedDateTooltip.java | 18 +++++++ .../java/de/hysky/skyblocker/utils/Constants.java | 29 ++++++++++- 3 files changed, 89 insertions(+), 15 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java index 8d9d8fbb..5b78e2cb 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java @@ -20,6 +20,7 @@ import java.util.List; public class ColorTooltip extends SimpleTooltipAdder { private static final Logger LOGGER = LoggerFactory.getLogger(ColorTooltip.class); + private static final long WITHER_GLITCHED_AFTER_DATE = 1605830400000L; public ColorTooltip(int priority) { super(priority); @@ -45,25 +46,29 @@ public class ColorTooltip extends SimpleTooltipAdder { if (existingTooltip.startsWith("Color: ")) { correctLine = true; - addExoticTooltip(lines, internalID, ItemUtils.getCustomData(stack), colorHex, expectedHex, existingTooltip); + addExoticTooltip(lines, stack, internalID, colorHex, expectedHex, existingTooltip); break; } } if (!correctLine) { - addExoticTooltip(lines, internalID, ItemUtils.getCustomData(stack), colorHex, expectedHex, ""); + addExoticTooltip(lines, stack, internalID, colorHex, expectedHex, ""); } } } - private static void addExoticTooltip(List lines, String internalID, NbtCompound customData, String colorHex, String expectedHex, String existingTooltip) { - if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !isException(internalID, colorHex) && !intendedDyed(customData)) { - final DyeType type = checkDyeType(colorHex); - lines.add(1, Text.literal(existingTooltip + Formatting.DARK_GRAY + "(").append(type.getTranslatedText()).append(Formatting.DARK_GRAY + ")")); + private static void addExoticTooltip(List lines, ItemStack stack, String internalID, String colorHex, String expectedHex, String existingTooltip) { + if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !isException(internalID, colorHex) && !intendedDyed(ItemUtils.getCustomData(stack))) { + final DyeType type = checkDyeType(stack, colorHex); + lines.add(1, Text.literal(existingTooltip + Formatting.DARK_GRAY + "(") + .append(type.getTranslatedText()) + .append(Text.literal(" - ")) + .append(Text.literal("#" + colorHex).withColor(Integer.decode("0x" + colorHex))) + .append(Text.literal(")").formatted(Formatting.DARK_GRAY))); } } - public static String getExpectedHex(String id) { + private static String getExpectedHex(String id) { String color = TooltipInfoType.COLOR.getData().get(id).getAsString(); if (color != null) { String[] RGBValues = color.split(","); @@ -74,7 +79,7 @@ public class ColorTooltip extends SimpleTooltipAdder { } } - public static boolean isException(String id, String hex) { + private static boolean isException(String id, String hex) { return switch (id) { case String it when it.startsWith("LEATHER") || it.equals("GHOST_BOOTS") || Constants.SEYMOUR_IDS.contains(it) -> true; case String it when it.startsWith("RANCHER") -> Constants.RANCHERS.contains(hex); @@ -88,28 +93,54 @@ public class ColorTooltip extends SimpleTooltipAdder { }; } - public static DyeType checkDyeType(String hex) { + private static DyeType checkDyeType(ItemStack stack, String hex) { return switch (hex) { case String it when Constants.CRYSTAL_HEXES.contains(it) -> DyeType.CRYSTAL; case String it when Constants.FAIRY_HEXES.contains(it) -> DyeType.FAIRY; case String it when Constants.OG_FAIRY_HEXES.contains(it) -> DyeType.OG_FAIRY; - case String it when Constants.SPOOK.contains(it) -> DyeType.SPOOK; - case String it when Constants.GLITCHED.contains(it) -> DyeType.GLITCHED; + case String it when Constants.SPOOK.contains(it) && stack.getSkyblockId().startsWith("FAIRY_") -> DyeType.SPOOK; + case String it when Constants.GLITCHED.contains(it) && isGlitched(stack, hex) -> DyeType.GLITCHED; default -> DyeType.EXOTIC; }; } - public static boolean intendedDyed(NbtCompound customData) { + private static boolean intendedDyed(NbtCompound customData) { return customData.contains("dye_item"); } - public enum DyeType implements StringIdentifiable { + //Thanks to TGWaffles' guidance on how to make this more accurate + private static boolean isGlitched(ItemStack stack, String hex) { + String id = stack.getSkyblockId(); + + if (id.contains("WITHER")) { + return isWitherGlitched(id, hex, ObtainedDateTooltip.getLongTimestamp(stack)); + } + + String miscGlitchedId = Constants.MISC_GLITCHED_HEXES.get(hex); + + return miscGlitchedId != null && id.startsWith(miscGlitchedId); + } + + private static boolean isWitherGlitched(String id, String hex, long obtained) { + if (hex.equals("000000") && obtained < WITHER_GLITCHED_AFTER_DATE) return false; //Too old to be glitched + + return switch (id) { + case String it when it.contains("CHESTPLATE") -> Constants.WITHER_CHESTPLATE_HEXES.containsKey(hex) && Constants.WITHER_CHESTPLATE_HEXES.containsValue(it) && !Constants.WITHER_CHESTPLATE_HEXES.get(hex).equals(it); + case String it when it.contains("LEGGINGS") -> Constants.WITHER_LEGGINGS_HEXES.containsKey(hex) && Constants.WITHER_LEGGINGS_HEXES.containsValue(it) && !Constants.WITHER_LEGGINGS_HEXES.get(hex).equals(it); + case String it when it.contains("BOOTS") -> Constants.WITHER_BOOTS_HEXES.containsKey(hex) && Constants.WITHER_BOOTS_HEXES.containsValue(it) && !Constants.WITHER_BOOTS_HEXES.get(hex).equals(it); + + default -> false; + }; + } + + private 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; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java index 31aa3de4..e7e79966 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java @@ -72,4 +72,22 @@ public class ObtainedDateTooltip extends SimpleTooltipAdder { return ""; } + + /** + * @see #getTimestamp(ItemStack) + */ + public static long getLongTimestamp(ItemStack stack) { + NbtCompound customData = ItemUtils.getCustomData(stack); + + if (customData != null && customData.contains("timestamp", NbtElement.LONG_TYPE)) { + return customData.getLong("timestamp"); + } + + if (customData != null && customData.contains("timestamp", NbtElement.STRING_TYPE)) { + TemporalAccessor date = OLD_OBTAINED_DATE_FORMAT.parse(customData.getString("timestamp")); + return Instant.from(date).toEpochMilli(); + } + + return 0L; + } } diff --git a/src/main/java/de/hysky/skyblocker/utils/Constants.java b/src/main/java/de/hysky/skyblocker/utils/Constants.java index c002be57..50c79638 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Constants.java +++ b/src/main/java/de/hysky/skyblocker/utils/Constants.java @@ -6,6 +6,7 @@ import net.minecraft.util.Formatting; import java.time.LocalDate; import java.util.List; +import java.util.Map; import java.util.function.Supplier; /** @@ -62,11 +63,35 @@ public interface Constants { List 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 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 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"); + // Exotic - Glitched Hexes + Map MISC_GLITCHED_HEXES = Map.of( + "FFDC51", "SHARK_SCALE", + "F7DA33", "FROZEN_BLAZE", + "606060", "BAT_PERSON"); + Map WITHER_CHESTPLATE_HEXES = Map.of( + "E7413C", "POWER_WITHER_CHESTPLATE", + "45413C", "TANK_WITHER_CHESTPLATE", + "4A14B7", "SPEED_WITHER_CHESTPLATE", + "1793C4", "WISE_WITHER_CHESTPLATE", + "000000", "WITHER_CHESTPLATE"); + Map WITHER_LEGGINGS_HEXES = Map.of( + "E75C3C", "POWER_WITHER_LEGGINGS", + "65605A", "TANK_WITHER_LEGGINGS", + "5D2FB9", "SPEED_WITHER_LEGGINGS", + "17A8C4", "WISE_WITHER_LEGGINGS", + "000000", "WITHER_LEGGINGS"); + Map WITHER_BOOTS_HEXES = Map.of( + "E76E3C", "POWER_WITHER_BOOTS", + "88837E", "TANK_WITHER_BOOTS", + "8969C8", "SPEED_WITHER_BOOTS", + "1CD4E4", "WISE_WITHER_BOOTS", + "000000", "WITHER_BOOTS"); + //All glitched hexes + List 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 of exceptions List RANCHERS = List.of("CC5500", "000000", "0"); -- cgit