diff options
| author | UpFault <76474308+UpFault@users.noreply.github.com> | 2024-07-18 03:07:33 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-18 16:07:33 +0800 |
| commit | cceaa38e7c1783d0446a50dbb09e42b8287e38d1 (patch) | |
| tree | 5a4f94c94a8822bf262e5b465c384dd11686aac2 /src/main/java/de/hysky/skyblocker/skyblock/item | |
| parent | 50b7a167253683d1526ac16a46e36adf1f5300d5 (diff) | |
| download | Skyblocker-cceaa38e7c1783d0446a50dbb09e42b8287e38d1.tar.gz Skyblocker-cceaa38e7c1783d0446a50dbb09e42b8287e38d1.tar.bz2 Skyblocker-cceaa38e7c1783d0446a50dbb09e42b8287e38d1.zip | |
EssenceShopPrice feature (#737)
Added EssenceShopPrice Feature, moved concatenate methods from ChocolateFactorySolver to Utils as they most likely will be used many times
Co-authored-by: Rime <81419447+Emirlol@users.noreply.github.com>
Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
3 files changed, 87 insertions, 18 deletions
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 index 92adf49d..46f4cb58 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.GeneralConfig; +import de.hysky.skyblocker.skyblock.item.tooltip.adders.EssenceShopPrice; import de.hysky.skyblocker.utils.Http; import de.hysky.skyblocker.utils.Utils; import org.jetbrains.annotations.Nullable; @@ -16,7 +17,7 @@ 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 || itemTooltip.enableCraftingCost.getOrder() != null || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.enableProfitCalculator || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.croesusProfit || SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue, itemTooltip -> itemTooltip.enableBazaarPrice, false), + BAZAAR("https://hysky.de/api/bazaar", itemTooltip -> itemTooltip.enableBazaarPrice || itemTooltip.enableCraftingCost.getOrder() != null || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.enableProfitCalculator || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.croesusProfit || SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue || itemTooltip.showEssenceCost, itemTooltip -> itemTooltip.enableBazaarPrice, false, EssenceShopPrice::refreshEssencePrices), LOWEST_BINS("https://hysky.de/api/auctions/lowestbins", itemTooltip -> itemTooltip.enableLowestBIN || itemTooltip.enableCraftingCost.getOrder() != null || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.enableProfitCalculator || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.croesusProfit || SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue, itemTooltip -> itemTooltip.enableLowestBIN, false), ONE_DAY_AVERAGE("https://hysky.de/api/auctions/lowestbins/average/1day.json", itemTooltip -> itemTooltip.enableAvgBIN, false), THREE_DAY_AVERAGE("https://hysky.de/api/auctions/lowestbins/average/3day.json", itemTooltip -> itemTooltip.enableAvgBIN || SkyblockerConfigManager.get().uiAndVisuals.searchOverlay.enableAuctionHouse, itemTooltip -> itemTooltip.enableAvgBIN, false), @@ -29,10 +30,10 @@ public enum TooltipInfoType implements Runnable { private final String address; private final Predicate<GeneralConfig.ItemTooltip> dataEnabled; private final Predicate<GeneralConfig.ItemTooltip> tooltipEnabled; - private JsonObject data; + private @Nullable JsonObject data; private final boolean cacheable; private long hash; - private final Consumer<JsonObject> callback; + private final @Nullable Consumer<JsonObject> callback; /** * Use this for when you're adding tooltip info that has no data associated with it @@ -45,19 +46,19 @@ public enum TooltipInfoType implements Runnable { * @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 - * @param callback called when the {@code data} is refreshed */ - TooltipInfoType(String address, Predicate<GeneralConfig.ItemTooltip> enabled, boolean cacheable, Consumer<JsonObject> callback) { - this(address, enabled, enabled, cacheable, callback); + TooltipInfoType(String address, Predicate<GeneralConfig.ItemTooltip> enabled, boolean cacheable) { + this(address, enabled, enabled, cacheable, null); } /** * @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 + * @param callback called when the {@code data} is refreshed */ - TooltipInfoType(String address, Predicate<GeneralConfig.ItemTooltip> enabled, boolean cacheable) { - this(address, enabled, enabled, cacheable, null); + TooltipInfoType(String address, Predicate<GeneralConfig.ItemTooltip> enabled, boolean cacheable, Consumer<JsonObject> callback) { + this(address, enabled, enabled, cacheable, callback); } /** @@ -99,7 +100,7 @@ public enum TooltipInfoType implements Runnable { return tooltipEnabled.test(ItemTooltip.config); } - public JsonObject getData() { + public @Nullable JsonObject getData() { return data; } @@ -160,14 +161,14 @@ public enum TooltipInfoType implements Runnable { } String response = Http.sendGetRequest(address); if (response.trim().startsWith("<!DOCTYPE") || response.trim().startsWith("<html")) { - ItemTooltip.LOGGER.warn("[Skyblocker] Received HTML content for " + this.name() + ". Expected JSON."); + ItemTooltip.LOGGER.warn("[Skyblocker] Received HTML content for {}. Expected JSON.", this); return; } data = SkyblockerMod.GSON.fromJson(response, JsonObject.class); if (callback != null) callback.accept(data); } catch (Exception e) { - ItemTooltip.LOGGER.warn("[Skyblocker] Failed to download " + this + " prices!", e); + ItemTooltip.LOGGER.warn("[Skyblocker] Failed to download {} prices!", this, e); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index bd06acba..c3399b58 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -30,13 +30,14 @@ public class TooltipManager { new BazaarPriceTooltip(2), new LBinTooltip(3), new AvgBinTooltip(4), - new CraftPriceTooltip(5), - new DungeonQualityTooltip(6), - new MotesTooltip(7), - new ObtainedDateTooltip(8), - new MuseumTooltip(9), - new ColorTooltip(10), - new AccessoryTooltip(11), + new EssenceShopPrice(5), + new CraftPriceTooltip(6), + new DungeonQualityTooltip(7), + new MotesTooltip(8), + new ObtainedDateTooltip(9), + new MuseumTooltip(10), + new ColorTooltip(11), + new AccessoryTooltip(12), }; private static final ArrayList<TooltipAdder> currentScreenAdders = new ArrayList<>(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/EssenceShopPrice.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/EssenceShopPrice.java new file mode 100644 index 00000000..5a7051d3 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/EssenceShopPrice.java @@ -0,0 +1,67 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.RegexUtils; +import it.unimi.dsi.fastutil.objects.Object2LongArrayMap; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.jetbrains.annotations.Nullable; + +import java.text.NumberFormat; +import java.util.List; +import java.util.Locale; +import java.util.OptionalLong; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class EssenceShopPrice extends TooltipAdder { + private static final Pattern ESSENCE_PATTERN = Pattern.compile("Cost (?<amount>[\\d,]+) (?<type>[A-Za-z]+) Essence"); + private static final NumberFormat DECIMAL_FORMAT = NumberFormat.getInstance(Locale.US); + private static final String[] ESSENCE_TYPES = {"WITHER", "SPIDER", "UNDEAD", "DRAGON", "GOLD", "DIAMOND", "ICE", "CRIMSON"}; + private static final Object2LongArrayMap<String> ESSENCE_PRICES = new Object2LongArrayMap<>(ESSENCE_TYPES, new long[8]); + + public EssenceShopPrice(int priority) { + super("\\S+ Essence Shop", priority); + } + + public static void refreshEssencePrices(JsonObject data) { + for (String essenceType : ESSENCE_TYPES) { + JsonElement price = data.get("ESSENCE_" + essenceType); + if (price == null || !price.isJsonObject()) continue; + JsonElement sellPrice = price.getAsJsonObject().get("sellPrice"); + if (sellPrice == null) continue; + if (sellPrice.isJsonPrimitive()) { + ESSENCE_PRICES.put(essenceType, sellPrice.getAsLong()); + } + } + } + + //Todo: maybe move the price value right after the essence amount ex: "1,500 Wither Essence (645k coins)" + @Override + public void addToTooltip(@Nullable Slot focusedSlot, ItemStack stack, List<Text> lines) { + if (!SkyblockerConfigManager.get().general.itemTooltip.showEssenceCost) return; + + String lore = ItemUtils.concatenateLore(lines); + Matcher essenceMatcher = ESSENCE_PATTERN.matcher(lore); + OptionalLong cost = RegexUtils.getLongFromMatcher(essenceMatcher); + if (cost.isEmpty()) return; + + String type = essenceMatcher.group("type"); + long priceData = ESSENCE_PRICES.getLong(type.toUpperCase(Locale.ROOT)); + if (priceData == 0) return; //Default value for getLong is 0 if no value exists for that key + + lines.add(Text.empty() + .append(Text.literal("Essence Cost: ").formatted(Formatting.AQUA)) + .append(Text.literal(DECIMAL_FORMAT.format(priceData * cost.getAsLong()) + " coins").formatted(Formatting.DARK_AQUA)) + .append(Text.literal(" (").formatted(Formatting.GRAY)) + .append(Text.literal(DECIMAL_FORMAT.format(priceData) + " each").formatted(Formatting.GRAY)) + .append(Text.literal(")").formatted(Formatting.GRAY)) + ); + } +} |
