aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFix3d <serhanduzce@gmail.com>2023-03-29 17:03:42 +0300
committerFix3d <serhanduzce@gmail.com>2023-03-29 17:03:42 +0300
commit2a1afe98fab7aea1fa1841fb6de4a0dc3130ad13 (patch)
tree45e551f7bbcf994b1e0d476e1d8535f289562b06 /src
parent71d1c240fbde9372afa8e2a2388218fff33eb04b (diff)
parentea05cbb827c06ec7480a3006e39ccfec1c7bf137 (diff)
downloadSkyblocker-2a1afe98fab7aea1fa1841fb6de4a0dc3130ad13.tar.gz
Skyblocker-2a1afe98fab7aea1fa1841fb6de4a0dc3130ad13.tar.bz2
Skyblocker-2a1afe98fab7aea1fa1841fb6de4a0dc3130ad13.zip
Merge branch '1.19.x'
# Conflicts: # src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java # src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java
Diffstat (limited to 'src')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java18
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java285
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java29
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java47
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java38
5 files changed, 192 insertions, 225 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
index e487c209..4d3ce5e9 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -1,8 +1,5 @@
package me.xmrvizzy.skyblocker.config;
-import java.util.ArrayList;
-import java.util.List;
-
import me.shedaniel.autoconfig.AutoConfig;
import me.shedaniel.autoconfig.ConfigData;
import me.shedaniel.autoconfig.annotation.Config;
@@ -10,6 +7,9 @@ import me.shedaniel.autoconfig.annotation.ConfigEntry;
import me.shedaniel.autoconfig.serializer.GsonConfigSerializer;
import me.xmrvizzy.skyblocker.chat.ChatFilterResult;
+import java.util.ArrayList;
+import java.util.List;
+
@Config(name = "skyblocker")
public class SkyblockerConfig implements ConfigData {
@@ -66,7 +66,7 @@ public class SkyblockerConfig implements ConfigData {
@ConfigEntry.Category("button8")
@ConfigEntry.Gui.CollapsibleObject(startExpanded = false)
- public QuickNavItem button8 = new QuickNavItem(true, new ItemData("player_head", 1, "tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}"), "none", "/warp dungeon_hub");
+ public QuickNavItem button8 = new QuickNavItem(true, new ItemData("player_head", 1, "tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}"), "none", "/warp dungeon");
@ConfigEntry.Category("button9")
@ConfigEntry.Gui.CollapsibleObject(startExpanded = false)
@@ -174,8 +174,7 @@ public class SkyblockerConfig implements ConfigData {
RIGHT,
NONE;
- @Override
- public String toString() {
+ public String toString() {
return switch (this) {
case LAYER1 -> "Layer 1";
case LAYER2 -> "Layer 2";
@@ -217,11 +216,10 @@ public class SkyblockerConfig implements ConfigData {
THREE_DAY,
BOTH;
- @Override
- public String toString() {
+ public String toString() {
return switch (this) {
- case ONE_DAY -> "1 day price";
- case THREE_DAY -> "3 day price";
+ case ONE_DAY -> "1 day avg";
+ case THREE_DAY -> "3 day avg";
case BOTH -> "Both";
};
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
index dfc498a1..608122ad 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
@@ -9,10 +9,8 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
-import net.minecraft.text.LiteralTextContent;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
-import net.minecraft.text.TranslatableTextContent;
import net.minecraft.util.Formatting;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -25,8 +23,10 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.zip.GZIPInputStream;
@@ -42,6 +42,7 @@ public class PriceInfoTooltip {
private static JsonObject isMuseumJson;
private static boolean nullMsgSend = false;
private final static Gson gson = new Gson();
+ private static final Map<String, String> apiAddresses;
public static void onInjectTooltip(ItemStack stack, TooltipContext context, List<Text> lines) {
if (!Utils.isOnSkyblock || client.player == null) return;
@@ -55,11 +56,9 @@ public class PriceInfoTooltip {
if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice) {
if (npcPricesJson == null) {
- if (!nullMsgSend) {
- client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false);
- nullMsgSend = true;
- }
- } else if (npcPricesJson.has(name)) {
+ nullWarning();
+ }
+ else if (npcPricesJson.has(name)) {
lines.add(Text.literal(String.format("%-21s", "NPC Price:"))
.formatted(Formatting.YELLOW)
.append(getCoinsMessage(npcPricesJson.get(name).getAsDouble(), count)));
@@ -69,11 +68,9 @@ public class PriceInfoTooltip {
boolean bazaarExist = false;
if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice && !bazaarOpened) {
if (bazaarPricesJson == null) {
- if (!nullMsgSend) {
- client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false);
- nullMsgSend = true;
- }
- } else if (bazaarPricesJson.has(name)) {
+ nullWarning();
+ }
+ else if (bazaarPricesJson.has(name)) {
JsonObject getItem = bazaarPricesJson.getAsJsonObject(name);
lines.add(Text.literal(String.format("%-18s", "Bazaar buy Price:"))
.formatted(Formatting.GOLD)
@@ -92,11 +89,9 @@ public class PriceInfoTooltip {
// bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api
if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN && !bazaarOpened && !bazaarExist) {
if (lowestPricesJson == null) {
- if (!nullMsgSend) {
- client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false);
- nullMsgSend = true;
- }
- } else if (lowestPricesJson.has(name)) {
+ 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)));
@@ -105,11 +100,9 @@ public class PriceInfoTooltip {
if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN) {
if (threeDayAvgPricesJson == null || oneDayAvgPricesJson == null) {
- if (!nullMsgSend) {
- client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false);
- nullMsgSend = true;
- }
- } else if (threeDayAvgPricesJson.has(name) || oneDayAvgPricesJson.has(name)) {
+ nullWarning();
+ }
+ else if (threeDayAvgPricesJson.has(name) || oneDayAvgPricesJson.has(name)) {
/*
We are skipping check average prices for potions and runes
because there is no data for their in API.
@@ -155,11 +148,9 @@ public class PriceInfoTooltip {
if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate && !bazaarOpened) {
if (isMuseumJson == null) {
- if (!nullMsgSend) {
- client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false);
- nullMsgSend = true;
- }
- } else if (isMuseumJson.has(name)) {
+ nullWarning();
+ }
+ else if (isMuseumJson.has(name)) {
String itemCategory = isMuseumJson.get(name).toString().replaceAll("\"", "");
String format = switch (itemCategory) {
case "Weapons" -> "%-18s";
@@ -169,22 +160,30 @@ public class PriceInfoTooltip {
lines.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")"))
.formatted(Formatting.LIGHT_PURPLE)
.append(Text.literal(timestamp != null ? timestamp : "").formatted(Formatting.RED)));
- } else if (timestamp != null) {
+ }
+ else if (timestamp != null) {
lines.add(Text.literal(String.format("%-21s", "Obtained: "))
.formatted(Formatting.LIGHT_PURPLE)
.append(Text.literal(timestamp).formatted(Formatting.RED)));
}
}
}
+
+ private static void nullWarning() {
+ if (!nullMsgSend && client.player != null) {
+ client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false);
+ nullMsgSend = true;
+ }
+ }
- public static NbtCompound getInternalNameForItem(ItemStack stack) {
+ public static NbtCompound getItemNBT(ItemStack stack) {
if (stack == null) return null;
return stack.getNbt();
}
/**
* this method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum.
- * Currently there are two types of timestamps the legacy which is built like this
+ * Currently, there are two types of timestamps the legacy which is built like this
* "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this
* "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without
* taking into account of their formats, we do the same. The final result looks like this
@@ -194,83 +193,88 @@ public class PriceInfoTooltip {
* This causes the museum rank to be much worse than it should be.
*
* @param stack the item under the pointer
- * @return if the item have an "Timestamp" it will be shown formated on the tooltip
+ * @return if the item have a "Timestamp" it will be shown formated on the tooltip
*/
public static String getTimestamp(ItemStack stack) {
- NbtCompound tag = getInternalNameForItem(stack);
- String internalName = null;
+ NbtCompound tag = getItemNBT(stack);
+
if (tag != null && tag.contains("ExtraAttributes", 10)) {
NbtCompound ea = tag.getCompound("ExtraAttributes");
if (ea.contains("timestamp", 8)) {
- internalName = ea.getString("timestamp");
- SimpleDateFormat dt = new SimpleDateFormat("MM/dd/yy");
+ SimpleDateFormat nbtFormat = new SimpleDateFormat("MM/dd/yy");
try {
- Date date = dt.parse(internalName);
- SimpleDateFormat dt1 = new SimpleDateFormat("MMMM dd, yyyy", Locale.ENGLISH);
- internalName = dt1.format(date);
+ Date date = nbtFormat.parse(ea.getString("timestamp"));
+ SimpleDateFormat skyblockerFormat = new SimpleDateFormat("MMMM dd, yyyy", Locale.ENGLISH);
+ return skyblockerFormat.format(date);
} catch (ParseException e) {
LOGGER.warn("[Skyblocker-tooltip] getTimestamp", e);
}
}
}
- return internalName;
+
+ return null;
}
public static String getInternalNameFromNBT(ItemStack stack) {
- NbtCompound tag = getInternalNameForItem(stack);
- String internalName = null;
+ NbtCompound tag = getItemNBT(stack);
if (tag != null && tag.contains("ExtraAttributes", 10)) {
NbtCompound ea = tag.getCompound("ExtraAttributes");
if (ea.contains("id", 8)) {
- internalName = ea.getString("id");
- } else {
- return null;
- }
+ String internalName = ea.getString("id");
- if ("ENCHANTED_BOOK".equals(internalName)) {
- if (ea.contains("enchantments")) {
- NbtCompound enchants = ea.getCompound("enchantments");
- String enchant = enchants.getKeys().stream().findFirst().get();
- internalName += "-" + enchant.toUpperCase(Locale.ENGLISH) + "-" + enchants.getInt(enchant);
- }
- } else if ("PET".equals(internalName)) {
- if (ea.contains("petInfo")) {
- JsonObject petInfo = gson.fromJson(ea.getString("petInfo"), JsonObject.class);
- internalName += "-" + petInfo.get("type").getAsString() + "-" + petInfo.get("tier").getAsString();
- }
- } else if ("POTION".equals(internalName)) {
- String enhanced = ea.contains("enhanced") ? "-ENHANCED" : "";
- String extended = ea.contains("extended") ? "-EXTENDED" : "";
- String splash = ea.contains("splash") ? "-SPLASH" : "";
- if (ea.contains("potion") && ea.contains("potion_level")) {
- internalName += "-" + ea.getString("potion").toUpperCase(Locale.ENGLISH) + "-" + ea.getInt("potion_level")
- + enhanced + extended + splash;
- }
- } else if ("RUNE".equals(internalName)) {
- if (ea.contains("runes")) {
- NbtCompound runes = ea.getCompound("runes");
- String rune = runes.getKeys().stream().findFirst().get();
- internalName += "-" + rune.toUpperCase(Locale.ENGLISH) + "-" + runes.getInt(rune);
+ // Transformation to API format.
+ if ("ENCHANTED_BOOK".equals(internalName)) {
+ if (ea.contains("enchantments")) {
+ NbtCompound enchants = ea.getCompound("enchantments");
+ String enchant = enchants.getKeys().stream().findFirst().get();
+ return internalName + "-" + enchant.toUpperCase(Locale.ENGLISH) + "-" + enchants.getInt(enchant);
+ }
+ } else if ("PET".equals(internalName)) {
+ if (ea.contains("petInfo")) {
+ JsonObject petInfo = gson.fromJson(ea.getString("petInfo"), JsonObject.class);
+ return internalName + "-" + petInfo.get("type").getAsString() + "-" + petInfo.get("tier").getAsString();
+ }
+ } else if ("POTION".equals(internalName)) {
+ String enhanced = ea.contains("enhanced") ? "-ENHANCED" : "";
+ String extended = ea.contains("extended") ? "-EXTENDED" : "";
+ String splash = ea.contains("splash") ? "-SPLASH" : "";
+ if (ea.contains("potion") && ea.contains("potion_level")) {
+ return internalName + "-" + ea.getString("potion").toUpperCase(Locale.ENGLISH) + "-" + ea.getInt("potion_level")
+ + enhanced + extended + splash;
+ }
+ } else if ("RUNE".equals(internalName)) {
+ if (ea.contains("runes")) {
+ NbtCompound runes = ea.getCompound("runes");
+ String rune = runes.getKeys().stream().findFirst().get();
+ return internalName + "-" + rune.toUpperCase(Locale.ENGLISH) + "-" + runes.getInt(rune);
+ }
}
- }
+ return internalName;
+ }
+ else
+ return null;
}
- return internalName;
+ else
+ return null;
}
private static Text getCoinsMessage(double price, int count) {
if (count == 1) {
String priceString = String.format(Locale.ENGLISH, "%1$,.1f", price);
return Text.literal(priceString + " Coins").formatted(Formatting.DARK_AQUA);
- } else {
- String priceString = String.format(Locale.ENGLISH, "%1$,.1f", price * count);
- MutableText priceText = Text.literal(priceString + " Coins ").formatted(Formatting.DARK_AQUA);
- priceString = String.format(Locale.ENGLISH, "%1$,.1f", price);
- MutableText priceText2 = Text.literal( "(" + priceString + " each)").formatted(Formatting.GRAY);
- return priceText.append(priceText2);
+ }
+ else {
+ String priceStringTotal = String.format(Locale.ENGLISH, "%1$,.1f", price * count);
+ MutableText priceTextTotal = Text.literal(priceStringTotal + " Coins ").formatted(Formatting.DARK_AQUA);
+
+ String priceStringEach = String.format(Locale.ENGLISH, "%1$,.1f", price);
+ MutableText priceTextEach = Text.literal( "(" + priceStringEach + " each)").formatted(Formatting.GRAY);
+
+ return priceTextTotal.append(priceTextEach);
}
}
@@ -289,108 +293,59 @@ public class PriceInfoTooltip {
SkyblockerConfig.Average type = SkyblockerConfig.get().general.itemTooltip.avg;
if (type == SkyblockerConfig.Average.BOTH || oneDayAvgPricesJson == null || threeDayAvgPricesJson == null) {
- futureList.add(CompletableFuture.runAsync(() -> downloadAvgPrices(SkyblockerConfig.Average.THREE_DAY)));
- futureList.add(CompletableFuture.runAsync(() -> downloadAvgPrices(SkyblockerConfig.Average.ONE_DAY)));
- } else {
- futureList.add(CompletableFuture.runAsync(() -> downloadAvgPrices(type)));
+ futureList.add(CompletableFuture.runAsync(() -> oneDayAvgPricesJson = downloadPrices("1 day avg")));
+ futureList.add(CompletableFuture.runAsync(() -> threeDayAvgPricesJson = downloadPrices("3 day avg")));
+ }
+ else if (type == SkyblockerConfig.Average.ONE_DAY) {
+ futureList.add(CompletableFuture.runAsync(() -> oneDayAvgPricesJson = downloadPrices("1 day avg")));
+ }
+ else if (type == SkyblockerConfig.Average.THREE_DAY) {
+ futureList.add(CompletableFuture.runAsync(() -> threeDayAvgPricesJson = downloadPrices("3 day avg")));
}
}
- if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN) {
- futureList.add(CompletableFuture.runAsync(PriceInfoTooltip::downloadLowestPrices));
- }
- if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice) {
- futureList.add(CompletableFuture.runAsync(PriceInfoTooltip::downloadBazaarPrices));
- }
- if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice && npcPricesJson == null) {
- futureList.add(CompletableFuture.runAsync(PriceInfoTooltip::downloadNPCPrices));
- }
- if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate && isMuseumJson == null) {
- futureList.add(CompletableFuture.runAsync(PriceInfoTooltip::downloadIsMuseum));
- }
+ if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN)
+ futureList.add(CompletableFuture.runAsync(() -> lowestPricesJson = downloadPrices("lowest bin")));
+
+ if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice)
+ futureList.add(CompletableFuture.runAsync(() -> bazaarPricesJson = downloadPrices("bazaar")));
+
+ if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice && npcPricesJson == null)
+ futureList.add(CompletableFuture.runAsync(() -> npcPricesJson = downloadPrices("npc")));
+
+ if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate && isMuseumJson == null)
+ futureList.add(CompletableFuture.runAsync(() -> isMuseumJson = downloadPrices("museum")));
+
minute++;
CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]))
.whenComplete((unused, throwable) -> nullMsgSend = false);
}, 1200);
}
- private static void downloadAvgPrices(SkyblockerConfig.Average type) {
- JsonObject result = null;
- String avgDay = null;
- switch (type) {
- case ONE_DAY -> avgDay = "1day.json.gz";
- case THREE_DAY -> avgDay = "3day.json.gz";
- }
+ private static JsonObject downloadPrices(String type) {
try {
- URL apiAddr = new URL("https://moulberry.codes/auction_averages_lbin/" + avgDay);
- try (InputStream src = apiAddr.openStream()) {
- try (GZIPInputStream gzipOutput = new GZIPInputStream(src)) {
- try (InputStreamReader reader = new InputStreamReader(gzipOutput)) {
- result = new Gson().fromJson(reader, JsonObject.class);
- }
- }
- }
+ String url = apiAddresses.get(type);
+ URL apiAddress = new URL(url);
+ InputStream src = apiAddress.openStream();
+ InputStreamReader reader = new InputStreamReader(url.contains(".gz") ? new GZIPInputStream(src) : src);
+ return new Gson().fromJson(reader, JsonObject.class);
} catch (IOException e) {
- LOGGER.warn("[Skyblocker] Failed to download average BIN prices!", e);
- }
- switch (type) {
- case ONE_DAY -> oneDayAvgPricesJson = result;
- case THREE_DAY -> threeDayAvgPricesJson = result;
- }
- }
+ LOGGER.warn("[Skyblocker] Failed to download " + type + " prices!", e);
- private static void downloadBazaarPrices() {
- JsonObject result = null;
- try {
- URL apiAddr = new URL("https://hysky.de/api/bazaar");
- InputStreamReader reader = new InputStreamReader(apiAddr.openStream());
- result = new Gson().fromJson(reader, JsonObject.class);
- } catch (IOException e) {
- LOGGER.warn("[Skyblocker] Failed to download bazaar prices!", e);
- }
- bazaarPricesJson = result;
- }
+ if (type.equals("lowest bin"))
+ lowestPricesJson = downloadPrices("lowest bin backup");
- private static void downloadLowestPrices() {
- JsonObject result = null;
- try {
- URL apiAddr = new URL("https://lb.tricked.pro/lowestbins");
- InputStreamReader reader = new InputStreamReader(apiAddr.openStream());
- result = new Gson().fromJson(reader, JsonObject.class);
- } catch (IOException e) {
- LOGGER.warn("[Skyblocker] Failed to download lowest BIN prices from the main source!", e);
- try {
- URL apiAddr = new URL("https://lb2.tricked.pro/lowestbins");
- InputStreamReader reader = new InputStreamReader(apiAddr.openStream());
- result = new Gson().fromJson(reader, JsonObject.class);
- } catch (IOException e2) {
- LOGGER.warn("[Skyblocker] Failed to download lowest BIN prices from the backup source!", e2);
- }
+ return null;
}
- lowestPricesJson = result;
}
- private static void downloadNPCPrices() {
- JsonObject result = null;
- try {
- URL apiAddr = new URL("https://hysky.de/api/npcprice");
- InputStreamReader reader = new InputStreamReader(apiAddr.openStream());
- result = new Gson().fromJson(reader, JsonObject.class);
- } catch (IOException e) {
- LOGGER.warn("[Skyblocker] Failed to download NPC prices!", e);
- }
- npcPricesJson = result;
+ static {
+ apiAddresses = new HashMap<>();
+ apiAddresses.put("1 day avg", "https://moulberry.codes/auction_averages_lbin/1day.json.gz");
+ apiAddresses.put("3 day avg", "https://moulberry.codes/auction_averages_lbin/3day.json.gz");
+ apiAddresses.put("bazaar", "https://hysky.de/api/bazaar");
+ apiAddresses.put("lowest bin", "https://lb.tricked.pro/lowestbins");
+ apiAddresses.put("lowest bin backup", "https://lb2.tricked.pro/lowestbins");
+ apiAddresses.put("npc", "https://hysky.de/api/npcprice");
+ apiAddresses.put("museum", "https://hysky.de/api/museum");
}
-
- private static void downloadIsMuseum() {
- JsonObject result = null;
- try {
- URL apiAddr = new URL("https://hysky.de/api/museum");
- InputStreamReader reader = new InputStreamReader(apiAddr.openStream());
- result = new Gson().fromJson(reader, JsonObject.class);
- } catch (IOException e) {
- LOGGER.warn("[Skyblocker] Failed to download museum items!", e);
- }
- isMuseumJson = result;
- }
-
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java
index afaf487f..76b4e7c3 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java
@@ -1,9 +1,7 @@
package me.xmrvizzy.skyblocker.skyblock.item;
import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
+import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry;
import me.xmrvizzy.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.MinecraftClient;
@@ -16,11 +14,7 @@ import net.minecraft.text.Text;
import net.minecraft.util.Util;
import org.lwjgl.glfw.GLFW;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.net.URLConnection;
+import java.util.concurrent.CompletableFuture;
public class WikiLookup {
public static KeyBinding wikiLookup;
@@ -51,23 +45,12 @@ public class WikiLookup {
if (Utils.isOnSkyblock) {
id = getSkyblockId(slot);
try {
- //Setting up a connection with the repo
- String urlString = "https://raw.githubusercontent.com/NotEnoughUpdates/NotEnoughUpdates-REPO/master/items/" + id + ".json";
- URL url = new URL(urlString);
- URLConnection request = url.openConnection();
- request.connect();
-
- //yoinking the wiki link
- JsonElement root = JsonParser.parseReader(new InputStreamReader((InputStream) request.getContent()));
- JsonObject rootobj = root.getAsJsonObject();
- String wikiLink = rootobj.get("info").getAsJsonArray().get(1).getAsString();
- Util.getOperatingSystem().open(wikiLink);
- } catch (IOException | NullPointerException e) {
- e.printStackTrace();
- client.player.sendMessage(Text.of("Can't locate a wiki article for this item..."), false);
+ String wikiLink = ItemRegistry.getWikiLink(id);
+ CompletableFuture.runAsync(() -> Util.getOperatingSystem().open(wikiLink));
} catch (IndexOutOfBoundsException | IllegalStateException e) {
e.printStackTrace();
- client.player.sendMessage(Text.of("Error while retrieving wiki article..."), false);
+ if (client.player != null)
+ client.player.sendMessage(Text.of("Error while retrieving wiki article..."), false);
}
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java
index ce567b67..75d53323 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java
@@ -1,7 +1,6 @@
package me.xmrvizzy.skyblocker.skyblock.itemlist;
import com.mojang.blaze3d.systems.RenderSystem;
-
import me.xmrvizzy.skyblocker.mixin.RecipeBookWidgetAccessor;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -39,8 +38,10 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select
this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField();
int x = (this.parentWidth - 147) / 2 - this.leftOffset;
int y = (this.parentHeight - 166) / 2;
- this.results = new SearchResultsWidget(this.client, x , y);
- this.updateSearchResult();
+ if (ItemRegistry.filesImported) {
+ this.results = new SearchResultsWidget(this.client, x, y);
+ this.updateSearchResult();
+ }
}
@Override
@@ -48,7 +49,7 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select
if (this.isOpen()) {
matrices.push();
matrices.translate(0.0D, 0.0D, 100.0D);
- RenderSystem.setShader(GameRenderer::getPositionTexProgram);
+ RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderTexture(0, TEXTURE);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField();
@@ -56,36 +57,40 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select
int j = (this.parentHeight - 166) / 2;
this.drawTexture(matrices, i, j, 1, 1, 147, 166);
this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField();
- if (!this.searchField.isFocused() && this.searchField.getText().isEmpty()) {
+
+ if (!ItemRegistry.filesImported && !this.searchField.isFocused() && this.searchField.getText().isEmpty()) {
+ Text hintText = (Text.literal("Loading...")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY);
+ drawTextWithShadow(matrices, this.client.textRenderer, hintText, i + 25, j + 14, -1);
+ } else if (!this.searchField.isFocused() && this.searchField.getText().isEmpty()) {
Text hintText = (Text.translatable("gui.recipebook.search_hint")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY);
drawTextWithShadow(matrices, this.client.textRenderer, hintText, i + 25, j + 14, -1);
} else {
this.searchField.render(matrices, mouseX, mouseY, delta);
}
- this.updateSearchResult();
- this.results.render(matrices, mouseX, mouseY, delta);
+ if (ItemRegistry.filesImported && results != null){
+ this.updateSearchResult();
+ this.results.render(matrices, mouseX, mouseY, delta);
+ }
matrices.pop();
}
}
@Override
public void drawTooltip(MatrixStack matrices, int x, int y, int mouseX, int mouseY) {
- if (this.isOpen()) {
+ if (this.isOpen() && ItemRegistry.filesImported && results != null) {
this.results.drawTooltip(matrices, mouseX, mouseY);
}
}
@Override
- public boolean mouseClicked(double mouseX, double mouseY, int button) {
- if (!this.isOpen() || this.client.player.isSpectator()) {
- return false;
- }
- if (this.searchField != null && this.searchField.mouseClicked(mouseX, mouseY, button)) {
- this.results.closeRecipeView();
- return true;
- }
- if (this.results.mouseClicked(mouseX, mouseY, button))
- return true;
- return false;
- }
-} \ No newline at end of file
+ public boolean mouseClicked(double mouseX, double mouseY, int button) {
+ if (this.isOpen() && !this.client.player.isSpectator() && ItemRegistry.filesImported && results != null) {
+ if (this.searchField.mouseClicked(mouseX, mouseY, button)) {
+ this.results.closeRecipeView();
+ return true;
+ }
+ return this.results.mouseClicked(mouseX, mouseY, button);
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java
index 17e9aebc..f0958514 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java
@@ -4,19 +4,24 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import net.fabricmc.loader.api.FabricLoader;
+import net.minecraft.client.MinecraftClient;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
+import net.minecraft.text.Text;
import org.eclipse.jgit.api.Git;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
+import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
+import java.util.concurrent.CompletableFuture;
public class ItemRegistry {
- protected static final String REMOTE_ITEM_REPO = "https://github.com/KonaeAkira/NotEnoughUpdates-REPO.git";
+ private static final Logger LOGGER = LoggerFactory.getLogger(ItemRegistry.class);
+ protected static final String REMOTE_ITEM_REPO = "https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO";
protected static final Path LOCAL_ITEM_REPO_DIR = FabricLoader.getInstance().getConfigDir().resolve("skyblocker/item-repo");
private static final Path ITEM_LIST_DIR = LOCAL_ITEM_REPO_DIR.resolve("items");
@@ -24,12 +29,20 @@ public class ItemRegistry {
protected static List<ItemStack> items = new ArrayList<>();
protected static Map<String, ItemStack> itemsMap = new HashMap<>();
protected static List<Recipe> recipes = new ArrayList<>();
+ protected static final MinecraftClient client = MinecraftClient.getInstance();
+ static boolean filesImported = false;
- // TODO: make async
public static void init() {
- updateItemRepo();
- ItemStackBuilder.init();
- importItemFiles();
+ CompletableFuture.runAsync(ItemRegistry::updateItemRepo)
+ .whenComplete((result, ex) -> {
+ if (ex == null) {
+ ItemStackBuilder.init();
+ importItemFiles();
+ }
+ else {
+ LOGGER.error("[Skyblocker-ItemRegistry] " + ex);
+ }
+ });
}
private static void updateItemRepo() {
@@ -93,6 +106,19 @@ public class ItemRegistry {
}
return lhsFamilyName.compareTo(rhsFamilyName);
});
+ filesImported = true;
+ }
+
+ public static String getWikiLink(String internalName) {
+ try {
+ String fileContent = Files.readString(ITEM_LIST_DIR.resolve(internalName + ".json"));
+ JsonObject fileJson = JsonParser.parseString(fileContent).getAsJsonObject();
+ return fileJson.get("info").getAsJsonArray().get(1).getAsString();
+ } catch (IOException | NullPointerException e) {
+ e.printStackTrace();
+ client.player.sendMessage(Text.of("Can't locate a wiki article for this item..."), false);
+ return null;
+ }
}
public static List<Recipe> getRecipes(String internalName) {
@@ -135,7 +161,7 @@ class Recipe {
private static ItemStack getItemStack(String internalName) {
try {
if (internalName.length() > 0) {
- int count = Integer.parseInt(internalName.split(":")[1]);
+ int count = Integer.parseInt(internalName.split(":").length > 1 ? internalName.split(":")[1] : "1");
internalName = internalName.split(":")[0];
ItemStack itemStack = ItemRegistry.itemsMap.get(internalName).copy();
itemStack.setCount(count);