aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky
diff options
context:
space:
mode:
authorKevin <92656833+kevinthegreat1@users.noreply.github.com>2024-07-08 14:03:05 +0800
committerGitHub <noreply@github.com>2024-07-08 14:03:05 +0800
commitf9c81292d7d6087eac2dba760a9ae3576fde4d3a (patch)
tree0c1156a05484e2bd537d5b116887f0ff3a640926 /src/main/java/de/hysky
parent438ff23df1e01e2d95ea3fa8ba77ccb975ad96f3 (diff)
parenta8de449aad9cb82e2fd936d9e2a60858947db99c (diff)
downloadSkyblocker-f9c81292d7d6087eac2dba760a9ae3576fde4d3a.tar.gz
Skyblocker-f9c81292d7d6087eac2dba760a9ae3576fde4d3a.tar.bz2
Skyblocker-f9c81292d7d6087eac2dba760a9ae3576fde4d3a.zip
Merge pull request #781 from BigloBot/Craft-Cost-Tooltip
Add Craft Cost Tooltip
Diffstat (limited to 'src/main/java/de/hysky')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/config/configs/GeneralConfig.java20
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipInfoType.java12
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java14
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CraftPriceTooltip.java115
6 files changed, 158 insertions, 15 deletions
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 bf6eefd5..96bb226d 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
@@ -4,6 +4,7 @@ import de.hysky.skyblocker.SkyblockerScreen;
import de.hysky.skyblocker.config.ConfigUtils;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.configs.GeneralConfig;
+import de.hysky.skyblocker.skyblock.item.tooltip.adders.CraftPriceTooltip;
import de.hysky.skyblocker.skyblock.shortcut.ShortcutsConfigScreen;
import dev.isxander.yacl3.api.*;
import dev.isxander.yacl3.api.controller.FloatSliderControllerBuilder;
@@ -163,6 +164,14 @@ public class GeneralCategory {
newValue -> config.general.itemTooltip.enableBazaarPrice = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
+ .option(Option.<GeneralConfig.Craft>createBuilder()
+ .name(Text.translatable("skyblocker.config.general.itemTooltip.craft"))
+ .binding(defaults.general.itemTooltip.enableCraftingCost,
+ () -> config.general.itemTooltip.enableCraftingCost,
+ newValue -> config.general.itemTooltip.enableCraftingCost = newValue)
+ .listener((Option<GeneralConfig.Craft> ignored, GeneralConfig.Craft ignored2) -> CraftPriceTooltip.clearCache())
+ .controller(ConfigUtils::createEnumCyclingListController)
+ .build())
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("skyblocker.config.general.itemTooltip.enableObtainedDate"))
.binding(defaults.general.itemTooltip.enableObtainedDate,
diff --git a/src/main/java/de/hysky/skyblocker/config/configs/GeneralConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/GeneralConfig.java
index 9f612028..754e15f1 100644
--- a/src/main/java/de/hysky/skyblocker/config/configs/GeneralConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/configs/GeneralConfig.java
@@ -115,6 +115,9 @@ public class GeneralConfig {
public boolean enableBazaarPrice = true;
@SerialEntry
+ public Craft enableCraftingCost = Craft.OFF;
+
+ @SerialEntry
public boolean enableObtainedDate = true;
@SerialEntry
@@ -139,6 +142,23 @@ public class GeneralConfig {
}
}
+ public enum Craft {
+ SELL_ORDER, BUY_ORDER, OFF;
+
+ @Override
+ public String toString() {
+ return I18n.translate("skyblocker.config.general.itemTooltip.craft." + name());
+ }
+
+ public String getOrder() {
+ return switch (this) {
+ case SELL_ORDER -> "sellPrice";
+ case BUY_ORDER -> "buyPrice";
+ case OFF -> null;
+ };
+ }
+ }
+
public static class ItemInfoDisplay {
@SerialEntry
public boolean slotText = true;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
index 49d170b9..955ebc87 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.configs.GeneralConfig;
+import de.hysky.skyblocker.skyblock.item.tooltip.adders.CraftPriceTooltip;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
@@ -129,6 +130,8 @@ public class ItemTooltip {
LOGGER.error("Encountered unknown error while downloading tooltip data", e);
return null;
});
+
+ CraftPriceTooltip.clearCache();
}, 1200, true);
}
} \ 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
index d82b2682..92adf49d 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
@@ -1,29 +1,23 @@
package de.hysky.skyblocker.skyblock.item.tooltip;
-import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import com.google.gson.stream.JsonReader;
import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.configs.GeneralConfig;
import de.hysky.skyblocker.utils.Http;
import de.hysky.skyblocker.utils.Utils;
+import org.jetbrains.annotations.Nullable;
-import java.io.StringReader;
import java.net.http.HttpHeaders;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.function.Predicate;
-import org.jetbrains.annotations.Nullable;
-
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().dungeons.dungeonChestProfit.enableProfitCalculator || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.croesusProfit || SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue, itemTooltip -> itemTooltip.enableBazaarPrice, false),
- LOWEST_BINS("https://hysky.de/api/auctions/lowestbins", itemTooltip -> itemTooltip.enableLowestBIN || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.enableProfitCalculator || SkyblockerConfigManager.get().dungeons.dungeonChestProfit.croesusProfit || SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue, itemTooltip -> itemTooltip.enableLowestBIN, 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 -> itemTooltip.enableBazaarPrice, false),
+ 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),
MOTES("https://hysky.de/api/motesprice", itemTooltip -> itemTooltip.enableMotesPrice, itemTooltip -> itemTooltip.enableMotesPrice && Utils.isInTheRift(), true),
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 e3a2ef04..cb8efb0c 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
@@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip;
import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver;
import de.hysky.skyblocker.skyblock.item.tooltip.adders.*;
+import de.hysky.skyblocker.skyblock.item.tooltip.adders.CraftPriceTooltip;
import de.hysky.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
@@ -27,12 +28,13 @@ public class TooltipManager {
new BazaarPriceTooltip(2),
new LBinTooltip(3),
new AvgBinTooltip(4),
- new DungeonQualityTooltip(5),
- new MotesTooltip(6),
- new ObtainedDateTooltip(7),
- new MuseumTooltip(8),
- new ColorTooltip(9),
- new AccessoryTooltip(10),
+ new CraftPriceTooltip(5),
+ new DungeonQualityTooltip(6),
+ new MotesTooltip(7),
+ new ObtainedDateTooltip(8),
+ new MuseumTooltip(9),
+ new ColorTooltip(10),
+ new AccessoryTooltip(11),
};
private static final ArrayList<TooltipAdder> currentScreenAdders = new ArrayList<>();
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CraftPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CraftPriceTooltip.java
new file mode 100644
index 00000000..f7af446e
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CraftPriceTooltip.java
@@ -0,0 +1,115 @@
+package de.hysky.skyblocker.skyblock.item.tooltip.adders;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.config.configs.GeneralConfig;
+import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
+import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder;
+import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType;
+import de.hysky.skyblocker.utils.NEURepoManager;
+import io.github.moulberry.repo.data.NEUIngredient;
+import io.github.moulberry.repo.data.NEUItem;
+import io.github.moulberry.repo.data.NEURecipe;
+import net.minecraft.item.ItemStack;
+import net.minecraft.screen.slot.Slot;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.jetbrains.annotations.Nullable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class CraftPriceTooltip extends TooltipAdder {
+ protected static final Logger LOGGER = LoggerFactory.getLogger(CraftPriceTooltip.class.getName());
+ private static final Map<String, Double> cachedCraftCosts = new ConcurrentHashMap<>();
+ private static final int MAX_RECURSION_DEPTH = 15;
+
+ public CraftPriceTooltip(int priority) {
+ super(priority);
+ }
+
+ @Override
+ public void addToTooltip(@Nullable Slot focusedSloFt, ItemStack stack, List<Text> lines) {
+ if (SkyblockerConfigManager.get().general.itemTooltip.enableCraftingCost == GeneralConfig.Craft.OFF) return;
+
+ String internalID = stack.getSkyblockId();
+ if (stack.getNeuName() == null || internalID == null) return;
+
+ if (TooltipInfoType.LOWEST_BINS.getData() == null || TooltipInfoType.BAZAAR.getData() == null) {
+ ItemTooltip.nullWarning();
+ return;
+ }
+
+ NEUItem neuItem = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(internalID);
+ if (neuItem == null) return;
+
+ List<NEURecipe> neuRecipes = neuItem.getRecipes();
+ if (neuRecipes.isEmpty() || neuRecipes.getFirst() instanceof io.github.moulberry.repo.data.NEUKatUpgradeRecipe) return;
+
+ try {
+ double totalCraftCost = getItemCost(neuRecipes.getFirst(), 0);
+
+ if (totalCraftCost == 0) return;
+
+ int amountInStack;
+ if (lines.get(1).getString().endsWith("Sack")) {
+ String line = lines.get(3).getSiblings().get(1).getString().replace(",", "");
+ amountInStack = NumberUtils.isParsable(line) && !line.equals("0") ? Integer.parseInt(line) : stack.getCount();
+ } else amountInStack = stack.getCount();
+
+ neuRecipes.getFirst().getAllOutputs().stream().findFirst().ifPresent(outputIngredient ->
+ lines.add(Text.literal(String.format("%-20s", "Crafting Price:")).formatted(Formatting.GOLD)
+ .append(ItemTooltip.getCoinsMessage(totalCraftCost / outputIngredient.getAmount(), amountInStack))));
+
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker Craft Price] Error calculating craftprice tooltip for: " + internalID, e);
+ }
+ }
+
+ private double getItemCost(NEURecipe recipe, int depth) {
+ if (depth >= MAX_RECURSION_DEPTH) return -1;
+
+ double totalCraftCost = 0;
+ for (NEUIngredient input : recipe.getAllInputs()) {
+ String inputItemName = input.getItemId();
+ double inputItemCount = input.getAmount();
+ if (cachedCraftCosts.containsKey(inputItemName)) {
+ totalCraftCost += cachedCraftCosts.get(inputItemName) * inputItemCount;
+ continue;
+ }
+
+ double itemCost = 0;
+
+ if (TooltipInfoType.BAZAAR.getData().has(inputItemName)) {
+ itemCost = TooltipInfoType.BAZAAR.getData().getAsJsonObject(inputItemName).get(SkyblockerConfigManager.get().general.itemTooltip.enableCraftingCost.getOrder()).getAsDouble();
+ } else if (TooltipInfoType.LOWEST_BINS.getData().has(inputItemName)) {
+ itemCost = TooltipInfoType.LOWEST_BINS.getData().get(inputItemName).getAsDouble();
+ }
+
+ if (itemCost > 0) {
+ cachedCraftCosts.put(inputItemName, itemCost);
+ }
+
+ NEUItem neuItem = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(inputItemName);
+ if (neuItem != null) {
+ List<NEURecipe> neuRecipes = neuItem.getRecipes();
+ if (!neuRecipes.isEmpty()) {
+ double craftCost = getItemCost(neuRecipes.getFirst(), depth + 1);
+ if (craftCost != -1) itemCost = Math.min(itemCost, craftCost);
+ cachedCraftCosts.put(inputItemName, itemCost);
+ }
+ }
+
+ totalCraftCost += itemCost * inputItemCount;
+ }
+ return totalCraftCost;
+ }
+
+ public static void clearCache() {
+ cachedCraftCosts.clear();
+ }
+}