aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock
diff options
context:
space:
mode:
authorKevin <92656833+kevinthegreat1@users.noreply.github.com>2023-10-17 19:53:55 -0400
committerGitHub <noreply@github.com>2023-10-17 19:53:55 -0400
commit00340f5d7df495f7351159e9da86e74b1b5fd2a9 (patch)
tree6911922ecc8bb6704f3eaa55bb7d44e329b38826 /src/main/java/de/hysky/skyblocker/skyblock
parente5679e02586d591c4c059b80b749809b60efe843 (diff)
downloadSkyblocker-00340f5d7df495f7351159e9da86e74b1b5fd2a9.tar.gz
Skyblocker-00340f5d7df495f7351159e9da86e74b1b5fd2a9.tar.bz2
Skyblocker-00340f5d7df495f7351159e9da86e74b1b5fd2a9.zip
Refactor NEU Repo (#364)
Add RepoParser Fix Golden Dragon stats leveling Add wiki option Fix recipe output count
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java28
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java30
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRegistry.java129
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java136
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java94
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java28
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java51
9 files changed, 248 insertions, 262 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java b/src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java
index 24465e06..b2ea2b16 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java
@@ -1,6 +1,5 @@
package de.hysky.skyblocker.skyblock;
-import com.google.common.collect.ImmutableSet;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -9,7 +8,7 @@ import com.mojang.brigadier.CommandDispatcher;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.NEURepo;
+import de.hysky.skyblocker.utils.NEURepoManager;
import de.hysky.skyblocker.utils.PosUtils;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.RenderHelper;
@@ -32,6 +31,7 @@ import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.*;
import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
@@ -64,25 +64,10 @@ public class FairySouls {
}
private static void loadFairySouls() {
- fairySoulsLoaded = NEURepo.runAsyncAfterLoad(() -> {
- try (BufferedReader reader = new BufferedReader(new FileReader(NEURepo.LOCAL_REPO_DIR.resolve("constants").resolve("fairy_souls.json").toFile()))) {
- for (Map.Entry<String, JsonElement> fairySoulJson : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) {
- if (fairySoulJson.getKey().equals("//") || fairySoulJson.getKey().equals("Max Souls")) {
- if (fairySoulJson.getKey().equals("Max Souls")) {
- maxSouls = fairySoulJson.getValue().getAsInt();
- }
- continue;
- }
- ImmutableSet.Builder<BlockPos> fairySoulsForLocation = ImmutableSet.builder();
- for (JsonElement fairySoul : fairySoulJson.getValue().getAsJsonArray().asList()) {
- fairySoulsForLocation.add(PosUtils.parsePosString(fairySoul.getAsString()));
- }
- fairySouls.put(fairySoulJson.getKey(), fairySoulsForLocation.build());
- }
- LOGGER.debug("[Skyblocker] Loaded fairy soul locations");
- } catch (IOException e) {
- LOGGER.error("[Skyblocker] Failed to load fairy soul locations", e);
- }
+ fairySoulsLoaded = NEURepoManager.runAsyncAfterLoad(() -> {
+ maxSouls = NEURepoManager.NEU_REPO.getConstants().getFairySouls().getMaxSouls();
+ NEURepoManager.NEU_REPO.getConstants().getFairySouls().getSoulLocations().forEach((location, fairySoulsForLocation) -> fairySouls.put(location, fairySoulsForLocation.stream().map(coordinate -> new BlockPos(coordinate.getX(), coordinate.getY(), coordinate.getZ())).collect(Collectors.toUnmodifiableSet())));
+ LOGGER.debug("[Skyblocker] Loaded {} fairy souls across {} locations", fairySouls.values().stream().mapToInt(Set::size).sum(), fairySouls.size());
try (BufferedReader reader = new BufferedReader(new FileReader(SkyblockerMod.CONFIG_DIR.resolve("found_fairy_souls.json").toFile()))) {
for (Map.Entry<String, JsonElement> foundFairiesForProfileJson : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) {
@@ -101,6 +86,7 @@ public class FairySouls {
} catch (IOException e) {
LOGGER.error("[Skyblocker] Failed to load found fairy souls", e);
}
+ LOGGER.info("[Skyblocker] Loaded {} fairy souls across {} locations and {} found fairy souls across {} locations in {} profiles", fairySouls.values().stream().mapToInt(Set::size).sum(), fairySouls.size(), foundFairies.values().stream().map(Map::values).flatMap(Collection::stream).mapToInt(Set::size).sum(), foundFairies.values().stream().mapToInt(Map::size).sum(), foundFairies.size());
});
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java
index 7f5b96b9..1e3dd7d2 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java
@@ -1,7 +1,7 @@
package de.hysky.skyblocker.skyblock.item;
import de.hysky.skyblocker.mixin.accessor.DrawContextInvoker;
-import de.hysky.skyblocker.skyblock.itemlist.ItemRegistry;
+import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.utils.ItemUtils;
import it.unimi.dsi.fastutil.ints.IntIntPair;
import it.unimi.dsi.fastutil.ints.IntObjectPair;
@@ -43,7 +43,7 @@ public class CompactorDeletorPreview {
NbtCompound extraAttributes = ItemUtils.getExtraAttributes(stack);
if (extraAttributes == null) return false;
// Get the slots and their items from the nbt, which is in the format personal_compact_<slot_number> or personal_deletor_<slot_number>
- List<IntObjectPair<ItemStack>> slots = extraAttributes.getKeys().stream().filter(slot -> slot.contains(type.toLowerCase().substring(0, 7))).map(slot -> IntObjectPair.of(Integer.parseInt(slot.substring(17)), ItemRegistry.getItemStack(extraAttributes.getString(slot)))).toList();
+ List<IntObjectPair<ItemStack>> slots = extraAttributes.getKeys().stream().filter(slot -> slot.contains(type.toLowerCase().substring(0, 7))).map(slot -> IntObjectPair.of(Integer.parseInt(slot.substring(17)), ItemRepository.getItemStack(extraAttributes.getString(slot)))).toList();
List<TooltipComponent> components = tooltips.stream().map(Text::asOrderedText).map(TooltipComponent::of).collect(Collectors.toList());
IntIntPair dimensions = DIMENSIONS.getOrDefault(size, DEFAULT_DIMENSION);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java b/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java
index d4e6a0df..38121ea3 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java
@@ -1,23 +1,25 @@
package de.hysky.skyblocker.skyblock.item;
-import de.hysky.skyblocker.skyblock.itemlist.ItemRegistry;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
-import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.screen.slot.Slot;
import net.minecraft.text.Text;
import net.minecraft.util.Util;
import org.lwjgl.glfw.GLFW;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.concurrent.CompletableFuture;
public class WikiLookup {
+ private static final Logger LOGGER = LoggerFactory.getLogger(WikiLookup.class);
public static KeyBinding wikiLookup;
- static final MinecraftClient client = MinecraftClient.getInstance();
- static String id;
+ private static String id;
public static void init() {
wikiLookup = KeyBindingHelper.registerKeyBinding(new KeyBinding(
@@ -28,22 +30,22 @@ public class WikiLookup {
));
}
- public static String getSkyblockId(Slot slot) {
+ public static void getSkyblockId(Slot slot) {
//Grabbing the skyblock NBT data
ItemUtils.getItemIdOptional(slot.getStack()).ifPresent(newId -> id = newId);
- return id;
}
- public static void openWiki(Slot slot) {
- if (Utils.isOnSkyblock()) {
- id = getSkyblockId(slot);
+ public static void openWiki(Slot slot, PlayerEntity player) {
+ if (SkyblockerConfigManager.get().general.wikiLookup.enableWikiLookup) {
+ getSkyblockId(slot);
try {
- String wikiLink = ItemRegistry.getWikiLink(id);
+ String wikiLink = ItemRepository.getWikiLink(id, player);
CompletableFuture.runAsync(() -> Util.getOperatingSystem().open(wikiLink));
} catch (IndexOutOfBoundsException | IllegalStateException e) {
- e.printStackTrace();
- if (client.player != null)
- client.player.sendMessage(Text.of("Error while retrieving wiki article..."), false);
+ LOGGER.error("[Skyblocker] Error while retrieving wiki article...", e);
+ if (player != null) {
+ player.sendMessage(Text.of("[Skyblocker] Error while retrieving wiki article, see logs..."), false);
+ }
}
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
index afdcaca8..5570c4f7 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
@@ -38,7 +38,7 @@ public class ItemListWidget extends RecipeBookWidget {
this.searchField = ((RecipeBookWidgetAccessor) this).getSearchField();
int x = (this.parentWidth - 147) / 2 - this.leftOffset;
int y = (this.parentHeight - 166) / 2;
- if (ItemRegistry.filesImported) {
+ if (ItemRepository.filesImported()) {
this.results = new SearchResultsWidget(this.client, x, y);
this.updateSearchResult();
}
@@ -57,7 +57,7 @@ public class ItemListWidget extends RecipeBookWidget {
context.drawTexture(TEXTURE, i, j, 1, 1, 147, 166);
this.searchField = ((RecipeBookWidgetAccessor) this).getSearchField();
- if (!ItemRegistry.filesImported && !this.searchField.isFocused() && this.searchField.getText().isEmpty()) {
+ if (!ItemRepository.filesImported() && !this.searchField.isFocused() && this.searchField.getText().isEmpty()) {
Text hintText = (Text.literal("Loading...")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY);
context.drawTextWithShadow(this.client.textRenderer, hintText, i + 25, j + 14, -1);
} else if (!this.searchField.isFocused() && this.searchField.getText().isEmpty()) {
@@ -66,7 +66,7 @@ public class ItemListWidget extends RecipeBookWidget {
} else {
this.searchField.render(context, mouseX, mouseY, delta);
}
- if (ItemRegistry.filesImported) {
+ if (ItemRepository.filesImported()) {
if (results == null) {
int x = (this.parentWidth - 147) / 2 - this.leftOffset;
int y = (this.parentHeight - 166) / 2;
@@ -81,14 +81,14 @@ public class ItemListWidget extends RecipeBookWidget {
@Override
public void drawTooltip(DrawContext context, int x, int y, int mouseX, int mouseY) {
- if (this.isOpen() && ItemRegistry.filesImported && results != null) {
+ if (this.isOpen() && ItemRepository.filesImported() && results != null) {
this.results.drawTooltip(context, mouseX, mouseY);
}
}
@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
- if (this.isOpen() && this.client.player != null && !this.client.player.isSpectator() && ItemRegistry.filesImported && this.searchField != null && results != null) {
+ if (this.isOpen() && this.client.player != null && !this.client.player.isSpectator() && ItemRepository.filesImported() && this.searchField != null && results != null) {
if (this.searchField.mouseClicked(mouseX, mouseY, button)) {
this.results.closeRecipeView();
this.searchField.setFocused(true);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRegistry.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRegistry.java
deleted file mode 100644
index b958a85d..00000000
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRegistry.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package de.hysky.skyblocker.skyblock.itemlist;
-
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.NEURepo;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
-import net.minecraft.text.Text;
-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.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Stream;
-
-public class ItemRegistry {
- protected static final Logger LOGGER = LoggerFactory.getLogger(ItemRegistry.class);
- protected static final Path ITEM_LIST_DIR = NEURepo.LOCAL_REPO_DIR.resolve("items");
-
- protected static final List<ItemStack> items = new ArrayList<>();
- protected static final Map<String, ItemStack> itemsMap = new HashMap<>();
- protected static final List<SkyblockCraftingRecipe> recipes = new ArrayList<>();
- public static final MinecraftClient client = MinecraftClient.getInstance();
- public static boolean filesImported = false;
-
- public static void init() {
- NEURepo.runAsyncAfterLoad(ItemStackBuilder::loadPetNums);
- NEURepo.runAsyncAfterLoad(ItemRegistry::importItemFiles);
- }
-
- private static void importItemFiles() {
- List<JsonObject> jsonObjs = new ArrayList<>();
-
- File dir = ITEM_LIST_DIR.toFile();
- File[] files = dir.listFiles();
- if (files == null) {
- return;
- }
- for (File file : files) {
- Path path = ITEM_LIST_DIR.resolve(file.getName());
- try {
- String fileContent = Files.readString(path);
- jsonObjs.add(JsonParser.parseString(fileContent).getAsJsonObject());
- } catch (Exception e) {
- LOGGER.error("Failed to read file " + path, e);
- }
- }
-
- for (JsonObject jsonObj : jsonObjs) {
- String internalName = jsonObj.get("internalname").getAsString();
- ItemStack itemStack = ItemStackBuilder.parseJsonObj(jsonObj);
- items.add(itemStack);
- itemsMap.put(internalName, itemStack);
- }
- for (JsonObject jsonObj : jsonObjs)
- if (jsonObj.has("recipe")) {
- recipes.add(SkyblockCraftingRecipe.fromJsonObject(jsonObj));
- }
-
- items.sort((lhs, rhs) -> {
- String lhsInternalName = ItemUtils.getItemId(lhs);
- String lhsFamilyName = lhsInternalName.replaceAll(".\\d+$", "");
- String rhsInternalName = ItemUtils.getItemId(rhs);
- String rhsFamilyName = rhsInternalName.replaceAll(".\\d+$", "");
- if (lhsFamilyName.equals(rhsFamilyName)) {
- if (lhsInternalName.length() != rhsInternalName.length())
- return lhsInternalName.length() - rhsInternalName.length();
- else return lhsInternalName.compareTo(rhsInternalName);
- }
- 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();
- //TODO optional official or unofficial wiki link
- try {
- return fileJson.get("info").getAsJsonArray().get(1).getAsString();
- } catch (IndexOutOfBoundsException e) {
- return fileJson.get("info").getAsJsonArray().get(0).getAsString();
- }
- } catch (IOException | NullPointerException e) {
- LOGGER.error("Failed to read item file " + internalName + ".json", e);
- if (client.player != null) {
- client.player.sendMessage(Text.of("Can't locate a wiki article for this item..."), false);
- }
- return null;
- }
- }
-
- public static List<SkyblockCraftingRecipe> getRecipes(String internalName) {
- List<SkyblockCraftingRecipe> result = new ArrayList<>();
- for (SkyblockCraftingRecipe recipe : recipes) {
- if (ItemUtils.getItemId(recipe.result).equals(internalName)) result.add(recipe);
- }
- for (SkyblockCraftingRecipe recipe : recipes)
- for (ItemStack ingredient : recipe.grid) {
- if (!ingredient.getItem().equals(Items.AIR) && ItemUtils.getItemId(ingredient).equals(internalName)) {
- result.add(recipe);
- break;
- }
- }
- return result;
- }
-
- public static Stream<SkyblockCraftingRecipe> getRecipesStream() {
- return recipes.stream();
- }
-
- public static Stream<ItemStack> getItemsStream() {
- return items.stream();
- }
-
- public static ItemStack getItemStack(String internalName) {
- return itemsMap.get(internalName);
- }
-}
-
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java
new file mode 100644
index 00000000..a8e92104
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java
@@ -0,0 +1,136 @@
+package de.hysky.skyblocker.skyblock.itemlist;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.NEURepoManager;
+import io.github.moulberry.repo.data.NEUCraftingRecipe;
+import io.github.moulberry.repo.data.NEUItem;
+import io.github.moulberry.repo.data.NEURecipe;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.text.Text;
+import org.jetbrains.annotations.Nullable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
+
+public class ItemRepository {
+ protected static final Logger LOGGER = LoggerFactory.getLogger(ItemRepository.class);
+
+ private static final List<ItemStack> items = new ArrayList<>();
+ private static final Map<String, ItemStack> itemsMap = new HashMap<>();
+ private static final List<SkyblockCraftingRecipe> recipes = new ArrayList<>();
+ private static boolean filesImported = false;
+
+ public static void init() {
+ NEURepoManager.runAsyncAfterLoad(ItemStackBuilder::loadPetNums);
+ NEURepoManager.runAsyncAfterLoad(ItemRepository::importItemFiles);
+ }
+
+ private static void importItemFiles() {
+ NEURepoManager.NEU_REPO.getItems().getItems().values().forEach(ItemRepository::loadItem);
+ NEURepoManager.NEU_REPO.getItems().getItems().values().forEach(ItemRepository::loadRecipes);
+
+ items.sort((lhs, rhs) -> {
+ String lhsInternalName = ItemUtils.getItemId(lhs);
+ String lhsFamilyName = lhsInternalName.replaceAll(".\\d+$", "");
+ String rhsInternalName = ItemUtils.getItemId(rhs);
+ String rhsFamilyName = rhsInternalName.replaceAll(".\\d+$", "");
+ if (lhsFamilyName.equals(rhsFamilyName)) {
+ if (lhsInternalName.length() != rhsInternalName.length())
+ return lhsInternalName.length() - rhsInternalName.length();
+ else return lhsInternalName.compareTo(rhsInternalName);
+ }
+ return lhsFamilyName.compareTo(rhsFamilyName);
+ });
+ filesImported = true;
+ }
+
+ private static void loadItem(NEUItem item) {
+ ItemStack stack = ItemStackBuilder.fromNEUItem(item);
+ items.add(stack);
+ itemsMap.put(item.getSkyblockItemId(), stack);
+ }
+
+ private static void loadRecipes(NEUItem item) {
+ for (NEURecipe recipe : item.getRecipes()) {
+ if (recipe instanceof NEUCraftingRecipe neuCraftingRecipe) {
+ recipes.add(SkyblockCraftingRecipe.fromNEURecipe(neuCraftingRecipe));
+ }
+ }
+ }
+
+ public static String getWikiLink(String internalName, PlayerEntity player) {
+ NEUItem item = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(internalName);
+ if (item == null || item.getInfo().isEmpty()) {
+ warnNoWikiLink(player);
+ return null;
+ }
+
+ List<String> info = item.getInfo();
+ String wikiLink0 = info.get(0);
+ String wikiLink1 = info.size() > 1 ? info.get(1) : "";
+ String wikiDomain = SkyblockerConfigManager.get().general.wikiLookup.officialWiki ? "https://wiki.hypixel.net" : "https://hypixel-skyblock.fandom.com";
+ if (wikiLink0.startsWith(wikiDomain)) {
+ return wikiLink0;
+ } else if (wikiLink1.startsWith(wikiDomain)) {
+ return wikiLink1;
+ }
+ warnNoWikiLink(player);
+ return null;
+ }
+
+ private static void warnNoWikiLink(PlayerEntity player) {
+ if (player != null) {
+ player.sendMessage(Text.of("[Skyblocker] Unable to locate a wiki article for this item..."), false);
+ }
+ }
+
+ public static List<SkyblockCraftingRecipe> getRecipes(String internalName) {
+ List<SkyblockCraftingRecipe> result = new ArrayList<>();
+ for (SkyblockCraftingRecipe recipe : recipes) {
+ if (ItemUtils.getItemId(recipe.getResult()).equals(internalName)) result.add(recipe);
+ }
+ for (SkyblockCraftingRecipe recipe : recipes) {
+ for (ItemStack ingredient : recipe.getGrid()) {
+ if (!ingredient.getItem().equals(Items.AIR) && ItemUtils.getItemId(ingredient).equals(internalName)) {
+ result.add(recipe);
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ public static boolean filesImported() {
+ return filesImported;
+ }
+
+ public static void setFilesImported(boolean filesImported) {
+ ItemRepository.filesImported = filesImported;
+ }
+
+ public static List<ItemStack> getItems() {
+ return items;
+ }
+
+ public static Stream<ItemStack> getItemsStream() {
+ return items.stream();
+ }
+
+ @Nullable
+ public static ItemStack getItemStack(String internalName) {
+ return itemsMap.get(internalName);
+ }
+
+ public static Stream<SkyblockCraftingRecipe> getRecipesStream() {
+ return recipes.stream();
+ }
+}
+
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java
index 4a6d3474..cc7c0bc1 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java
@@ -1,45 +1,41 @@
package de.hysky.skyblocker.skyblock.itemlist;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.NEURepo;
+import de.hysky.skyblocker.utils.NEURepoManager;
+import io.github.moulberry.repo.constants.PetNumbers;
+import io.github.moulberry.repo.data.NEUItem;
+import io.github.moulberry.repo.data.Rarity;
import net.minecraft.item.FireworkRocketItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.*;
import net.minecraft.text.Text;
import net.minecraft.util.Pair;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ItemStackBuilder {
- private final static Path PETNUMS_PATH = NEURepo.LOCAL_REPO_DIR.resolve("constants/petnums.json");
- private static JsonObject petNums;
+ private static Map<String, Map<Rarity, PetNumbers>> petNums;
public static void loadPetNums() {
try {
- petNums = JsonParser.parseString(Files.readString(PETNUMS_PATH)).getAsJsonObject();
+ petNums = NEURepoManager.NEU_REPO.getConstants().getPetNumbers();
} catch (Exception e) {
- ItemRegistry.LOGGER.error("Failed to load petnums.json");
+ ItemRepository.LOGGER.error("Failed to load petnums.json");
}
}
- public static ItemStack parseJsonObj(JsonObject obj) {
- String internalName = obj.get("internalname").getAsString();
+ public static ItemStack fromNEUItem(NEUItem item) {
+ String internalName = item.getSkyblockItemId();
List<Pair<String, String>> injectors = new ArrayList<>(petData(internalName));
NbtCompound root = new NbtCompound();
- root.put("Count", NbtByte.of((byte)1));
+ root.put("Count", NbtByte.of((byte) 1));
- String id = obj.get("itemid").getAsString();
- int damage = obj.get("damage").getAsInt();
+ String id = item.getMinecraftItemId();
+ int damage = item.getDamage();
root.put("id", NbtString.of(ItemFixerUpper.convertItemId(id, damage)));
NbtCompound tag = new NbtCompound();
@@ -52,16 +48,14 @@ public class ItemStackBuilder {
NbtCompound display = new NbtCompound();
tag.put("display", display);
- String name = injectData(obj.get("displayname").getAsString(), injectors);
+ String name = injectData(item.getDisplayName(), injectors);
display.put("Name", NbtString.of(Text.Serializer.toJson(Text.of(name))));
NbtList lore = new NbtList();
display.put("Lore", lore);
- obj.get("lore").getAsJsonArray().forEach(el ->
- lore.add(NbtString.of(Text.Serializer.toJson(Text.of(injectData(el.getAsString(), injectors)))))
- );
+ item.getLore().forEach(el -> lore.add(NbtString.of(Text.Serializer.toJson(Text.of(injectData(el, injectors))))));
- String nbttag = obj.get("nbttag").getAsString();
+ String nbttag = item.getNbttag();
// add skull texture
Matcher skullUuid = Pattern.compile("(?<=SkullOwner:\\{)Id:\"(.{36})\"").matcher(nbttag);
Matcher skullTexture = Pattern.compile("(?<=Properties:\\{textures:\\[0:\\{Value:)\"(.+?)\"").matcher(nbttag);
@@ -92,55 +86,56 @@ public class ItemStackBuilder {
enchantments.add(new NbtCompound());
tag.put("Enchantments", enchantments);
}
-
+
// Add firework star color
- Matcher explosionColorMatcher = Pattern.compile("\\{Explosion:\\{(?:Type:[0-9a-z]+,)?Colors:\\[(?<color>[0-9]+)\\]\\}").matcher(nbttag);
+ Matcher explosionColorMatcher = Pattern.compile("\\{Explosion:\\{(?:Type:[0-9a-z]+,)?Colors:\\[(?<color>[0-9]+)]\\}").matcher(nbttag);
if (explosionColorMatcher.find()) {
NbtCompound explosion = new NbtCompound();
-
+
explosion.putInt("Type", FireworkRocketItem.Type.SMALL_BALL.getId()); //Forget about the actual ball type because it probably doesn't matter
- explosion.putIntArray("Colors", new int[] { Integer.parseInt(explosionColorMatcher.group("color")) });
+ explosion.putIntArray("Colors", new int[]{Integer.parseInt(explosionColorMatcher.group("color"))});
tag.put("Explosion", explosion);
}
return ItemStack.fromNbt(root);
}
- // TODO: fix stats for GOLDEN_DRAGON (lv1 -> lv200)
private static List<Pair<String, String>> petData(String internalName) {
List<Pair<String, String>> list = new ArrayList<>();
String petName = internalName.split(";")[0];
- if (!internalName.contains(";") || !petNums.has(petName)) return list;
-
- list.add(new Pair<>("\\{LVL\\}", "1 ➡ 100"));
-
- final String[] rarities = {
- "COMMON",
- "UNCOMMON",
- "RARE",
- "EPIC",
- "LEGENDARY",
- "MYTHIC"
+ if (!internalName.contains(";") || !petNums.containsKey(petName)) return list;
+
+ final Rarity[] rarities = {
+ Rarity.COMMON,
+ Rarity.UNCOMMON,
+ Rarity.RARE,
+ Rarity.EPIC,
+ Rarity.LEGENDARY,
+ Rarity.MYTHIC,
};
- String rarity = rarities[Integer.parseInt(internalName.split(";")[1])];
- JsonObject data = petNums.get(petName).getAsJsonObject().get(rarity).getAsJsonObject();
+ Rarity rarity = rarities[Integer.parseInt(internalName.split(";")[1])];
+ PetNumbers data = petNums.get(petName).get(rarity);
+
+ int minLevel = data.getLowLevel();
+ int maxLevel = data.getHighLevel();
+ list.add(new Pair<>("\\{LVL\\}", minLevel + " ➡ " + maxLevel));
- JsonObject statNumsMin = data.get("1").getAsJsonObject().get("statNums").getAsJsonObject();
- JsonObject statNumsMax = data.get("100").getAsJsonObject().get("statNums").getAsJsonObject();
- Set<Map.Entry<String, JsonElement>> entrySet = statNumsMin.entrySet();
- for (Map.Entry<String, JsonElement> entry : entrySet) {
+ Map<String, Double> statNumsMin = data.getStatsAtLowLevel().getStatNumbers();
+ Map<String, Double> statNumsMax = data.getStatsAtHighLevel().getStatNumbers();
+ Set<Map.Entry<String, Double>> entrySet = statNumsMin.entrySet();
+ for (Map.Entry<String, Double> entry : entrySet) {
String key = entry.getKey();
- String left = "\\{" + key+ "\\}";
- String right = statNumsMin.get(key).getAsString() + " ➡ " + statNumsMax.get(key).getAsString();
+ String left = "\\{" + key + "\\}";
+ String right = statNumsMin.get(key) + " ➡ " + statNumsMax.get(key);
list.add(new Pair<>(left, right));
}
- JsonArray otherNumsMin = data.get("1").getAsJsonObject().get("otherNums").getAsJsonArray();
- JsonArray otherNumsMax = data.get("100").getAsJsonObject().get("otherNums").getAsJsonArray();
+ List<Double> otherNumsMin = data.getStatsAtLowLevel().getOtherNumbers();
+ List<Double> otherNumsMax = data.getStatsAtHighLevel().getOtherNumbers();
for (int i = 0; i < otherNumsMin.size(); ++i) {
String left = "\\{" + i + "\\}";
- String right = otherNumsMin.get(i).getAsString() + " ➡ " + otherNumsMax.get(i).getAsString();
+ String right = otherNumsMin.get(i) + " ➡ " + otherNumsMax.get(i);
list.add(new Pair<>(left, right));
}
@@ -148,8 +143,9 @@ public class ItemStackBuilder {
}
private static String injectData(String string, List<Pair<String, String>> injectors) {
- for (Pair<String, String> injector : injectors)
+ for (Pair<String, String> injector : injectors) {
string = string.replaceAll(injector.getLeft(), injector.getRight());
+ }
return string;
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java
index 8a266d65..44e336d9 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java
@@ -72,7 +72,7 @@ public class SearchResultsWidget implements Drawable {
if (!searchText.equals(this.searchText)) {
this.searchText = searchText;
this.searchResults.clear();
- for (ItemStack entry : ItemRegistry.items) {
+ for (ItemStack entry : ItemRepository.getItems()) {
String name = entry.getName().toString().toLowerCase(Locale.ENGLISH);
if (entry.getNbt() == null) {
continue;
@@ -93,16 +93,16 @@ public class SearchResultsWidget implements Drawable {
SkyblockCraftingRecipe recipe = this.recipeResults.get(this.currentPage);
for (ResultButtonWidget button : resultButtons)
button.clearItemStack();
- resultButtons.get(5).setItemStack(recipe.grid.get(0));
- resultButtons.get(6).setItemStack(recipe.grid.get(1));
- resultButtons.get(7).setItemStack(recipe.grid.get(2));
- resultButtons.get(10).setItemStack(recipe.grid.get(3));
- resultButtons.get(11).setItemStack(recipe.grid.get(4));
- resultButtons.get(12).setItemStack(recipe.grid.get(5));
- resultButtons.get(15).setItemStack(recipe.grid.get(6));
- resultButtons.get(16).setItemStack(recipe.grid.get(7));
- resultButtons.get(17).setItemStack(recipe.grid.get(8));
- resultButtons.get(14).setItemStack(recipe.result);
+ resultButtons.get(5).setItemStack(recipe.getGrid().get(0));
+ resultButtons.get(6).setItemStack(recipe.getGrid().get(1));
+ resultButtons.get(7).setItemStack(recipe.getGrid().get(2));
+ resultButtons.get(10).setItemStack(recipe.getGrid().get(3));
+ resultButtons.get(11).setItemStack(recipe.getGrid().get(4));
+ resultButtons.get(12).setItemStack(recipe.getGrid().get(5));
+ resultButtons.get(15).setItemStack(recipe.getGrid().get(6));
+ resultButtons.get(16).setItemStack(recipe.getGrid().get(7));
+ resultButtons.get(17).setItemStack(recipe.getGrid().get(8));
+ resultButtons.get(14).setItemStack(recipe.getResult());
} else {
for (int i = 0; i < resultButtons.size(); ++i) {
int index = this.currentPage * resultButtons.size() + i;
@@ -122,7 +122,7 @@ public class SearchResultsWidget implements Drawable {
RenderSystem.disableDepthTest();
if (this.displayRecipes) {
//Craft text - usually a requirement for the recipe
- String craftText = this.recipeResults.get(this.currentPage).craftText;
+ String craftText = this.recipeResults.get(this.currentPage).getCraftText();
if (textRenderer.getWidth(craftText) > MAX_TEXT_WIDTH) {
drawTooltip(textRenderer, context, craftText, this.parentX + 11, this.parentY + 31, mouseX, mouseY);
craftText = textRenderer.trimToWidth(craftText, MAX_TEXT_WIDTH) + ELLIPSIS;
@@ -130,7 +130,7 @@ public class SearchResultsWidget implements Drawable {
context.drawTextWithShadow(textRenderer, craftText, this.parentX + 11, this.parentY + 31, 0xffffffff);
//Item name
- Text resultText = this.recipeResults.get(this.currentPage).result.getName();
+ Text resultText = this.recipeResults.get(this.currentPage).getResult().getName();
if (textRenderer.getWidth(Formatting.strip(resultText.getString())) > MAX_TEXT_WIDTH) {
drawTooltip(textRenderer, context, resultText, this.parentX + 11, this.parentY + 43, mouseX, mouseY);
resultText = Text.literal(getLegacyFormatting(resultText.getString()) + textRenderer.trimToWidth(Formatting.strip(resultText.getString()), MAX_TEXT_WIDTH) + ELLIPSIS).setStyle(resultText.getStyle());
@@ -202,7 +202,7 @@ public class SearchResultsWidget implements Drawable {
if (internalName.isEmpty()) {
continue;
}
- List<SkyblockCraftingRecipe> recipes = ItemRegistry.getRecipes(internalName);
+ List<SkyblockCraftingRecipe> recipes = ItemRepository.getRecipes(internalName);
if (!recipes.isEmpty()) {
this.recipeResults = recipes;
this.currentPage = 0;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java
index b738dfef..f5b379dc 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java
@@ -1,6 +1,7 @@
package de.hysky.skyblocker.skyblock.itemlist;
-import com.google.gson.JsonObject;
+import io.github.moulberry.repo.data.NEUCraftingRecipe;
+import io.github.moulberry.repo.data.NEUIngredient;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import org.slf4j.Logger;
@@ -11,37 +12,31 @@ import java.util.List;
public class SkyblockCraftingRecipe {
private static final Logger LOGGER = LoggerFactory.getLogger(SkyblockCraftingRecipe.class);
- String craftText = "";
- final List<ItemStack> grid = new ArrayList<>(9);
- ItemStack result;
-
- public static SkyblockCraftingRecipe fromJsonObject(JsonObject jsonObj) {
- SkyblockCraftingRecipe recipe = new SkyblockCraftingRecipe();
- if (jsonObj.has("crafttext")) recipe.craftText = jsonObj.get("crafttext").getAsString();
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A1").getAsString()));
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A2").getAsString()));
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A3").getAsString()));
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B1").getAsString()));
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B2").getAsString()));
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B3").getAsString()));
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C1").getAsString()));
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C2").getAsString()));
- recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C3").getAsString()));
- recipe.result = ItemRegistry.itemsMap.get(jsonObj.get("internalname").getAsString());
+ private final String craftText;
+ private final List<ItemStack> grid = new ArrayList<>(9);
+ private ItemStack result;
+
+ public SkyblockCraftingRecipe(String craftText) {
+ this.craftText = craftText;
+ }
+
+ public static SkyblockCraftingRecipe fromNEURecipe(NEUCraftingRecipe neuCraftingRecipe) {
+ SkyblockCraftingRecipe recipe = new SkyblockCraftingRecipe(neuCraftingRecipe.getExtraText() != null ? neuCraftingRecipe.getExtraText() : "");
+ for (NEUIngredient input : neuCraftingRecipe.getInputs()) {
+ recipe.grid.add(getItemStack(input));
+ }
+ recipe.result = getItemStack(neuCraftingRecipe.getOutput());
return recipe;
}
- private static ItemStack getItemStack(String internalName) {
- try {
- if (internalName.length() > 0) {
- int count = internalName.split(":").length == 1 ? 1 : Integer.parseInt(internalName.split(":")[1]);
- internalName = internalName.split(":")[0];
- ItemStack itemStack = ItemRegistry.itemsMap.get(internalName).copy();
- itemStack.setCount(count);
- return itemStack;
+ private static ItemStack getItemStack(NEUIngredient input) {
+ if (input != NEUIngredient.SENTINEL_EMPTY) {
+ ItemStack stack = ItemRepository.getItemStack(input.getItemId());
+ if (stack != null) {
+ return stack.copyWithCount((int) input.getAmount());
+ } else {
+ LOGGER.warn("[Skyblocker Recipe] Unable to find item {}", input.getItemId());
}
- } catch (Exception e) {
- LOGGER.error("[Skyblocker-Recipe] " + internalName, e);
}
return Items.AIR.getDefaultStack();
}