From 5112df4833c24908548e4d9a681bf57277d9c957 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Sun, 30 Jan 2022 20:28:35 +0100 Subject: Add recipe-view to item list --- .../skyblocker/skyblock/itemlist/Entry.java | 150 --------------------- .../skyblock/itemlist/ItemFixerUpper.java | 2 +- .../skyblocker/skyblock/itemlist/ItemRegistry.java | 110 ++++++++++++--- .../skyblock/itemlist/ItemStackBuilder.java | 144 ++++++++++++++++++++ .../skyblock/itemlist/ResultButtonWidget.java | 4 +- .../skyblock/itemlist/SearchResultsWidget.java | 61 +++++++-- 6 files changed, 286 insertions(+), 185 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java deleted file mode 100644 index 1ddabb35..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java +++ /dev/null @@ -1,150 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.itemlist; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.*; -import net.minecraft.text.Text; -import net.minecraft.util.Pair; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class Entry implements Comparable { - final ItemStack itemStack; - final String internalName; - final String familyName; - final int tierNumber; - final String clickCommand; - - public Entry(JsonObject obj) { - this.internalName = obj.get("internalname").getAsString(); - this.familyName = this.internalName.replaceAll(".(\\d+)$", ""); - this.tierNumber = Integer.parseInt("0" + this.internalName.replaceAll("[^\\d]", "")); - String cmd = obj.get("clickcommand").getAsString(); - this.clickCommand = cmd.isBlank() ? null : "/" + cmd + " " + this.internalName.replaceAll(";(\\d+)$", ""); - - List> injectors = new ArrayList<>(); - injectors.addAll(petData(internalName)); - - NbtCompound root = new NbtCompound(); - root.put("Count", NbtByte.of((byte)1)); - - String id = obj.get("itemid").getAsString(); - int damage = obj.get("damage").getAsInt(); - root.put("id", NbtString.of(ItemFixerUpper.convert(id, damage))); - - NbtCompound tag = new NbtCompound(); - root.put("tag", tag); - - NbtCompound extra = new NbtCompound(); - tag.put("ExtraAttributes", extra); - extra.put("id", NbtString.of(internalName)); - - // add enchantment glint - if (internalName.contains("ENCHANTED")) { - NbtList enchantments = new NbtList(); - enchantments.add(new NbtCompound()); - tag.put("Enchantments", enchantments); - } - - NbtCompound display = new NbtCompound(); - tag.put("display", display); - - String name = injectData(obj.get("displayname").getAsString(), 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))))) - ); - - String nbttag = obj.get("nbttag").getAsString(); - // add skull texture - Matcher skullMatcher = Pattern.compile("SkullOwner:\\{Id:\"(.{36})\",Properties:\\{textures:\\[0:\\{Value:\"(.+)\"}]}}").matcher(nbttag); - if (skullMatcher.find()) { - NbtCompound skullOwner = new NbtCompound(); - tag.put("SkullOwner", skullOwner); - UUID uuid = UUID.fromString(skullMatcher.group(1)); - skullOwner.put("Id", NbtHelper.fromUuid(uuid)); - skullOwner.put("Name", NbtString.of(this.internalName)); - - NbtCompound properties = new NbtCompound(); - skullOwner.put("Properties", properties); - NbtList textures = new NbtList(); - properties.put("textures", textures); - NbtCompound texture = new NbtCompound(); - textures.add(texture); - texture.put("Value", NbtString.of(skullMatcher.group(2))); - } - // add leather armor dye color - Matcher colorMatcher = Pattern.compile("color:(\\d+)").matcher(nbttag); - if (colorMatcher.find()) { - NbtInt color = NbtInt.of(Integer.parseInt(colorMatcher.group(1))); - display.put("color", color); - } - - this.itemStack = ItemStack.fromNbt(root); - if (this.itemStack.getItem().equals(Items.AIR)) { - System.err.println("ItemList: cannot register: " + this.internalName + " (" + id + ")"); - } - } - - // TODO: fix stats for GOLDEN_DRAGON (lv1 -> lv200) - private static List> petData(String internalName) { - List> list = new ArrayList<>(); - - String petName = internalName.split(";")[0]; - if (!internalName.contains(";") || !ItemRegistry.petNums.has(petName)) return list; - - list.add(new Pair<>("\\{LVL\\}", "1 ➡ 100")); - - final String[] rarities = { - "COMMON", - "UNCOMMON", - "RARE", - "EPIC", - "LEGENDARY", - "MYTHIC" - }; - String rarity = rarities[Integer.parseInt(internalName.split(";")[1])]; - JsonObject data = ItemRegistry.petNums.get(petName).getAsJsonObject().get(rarity).getAsJsonObject(); - - JsonObject statNumsMin = data.get("1").getAsJsonObject().get("statNums").getAsJsonObject(); - JsonObject statNumsMax = data.get("100").getAsJsonObject().get("statNums").getAsJsonObject(); - Set> entrySet = statNumsMin.entrySet(); - for (Map.Entry entry : entrySet) { - String key = entry.getKey(); - String left = "\\{" + key+ "\\}"; - String right = statNumsMin.get(key).getAsString() + " ➡ " + statNumsMax.get(key).getAsString(); - list.add(new Pair<>(left, right)); - } - - JsonArray otherNumsMin = data.get("1").getAsJsonObject().get("otherNums").getAsJsonArray(); - JsonArray otherNumsMax = data.get("100").getAsJsonObject().get("otherNums").getAsJsonArray(); - for (int i = 0; i < otherNumsMin.size(); ++i) { - String left = "\\{" + i + "\\}"; - String right = otherNumsMin.get(i).getAsString() + " ➡ " + otherNumsMax.get(i).getAsString(); - list.add(new Pair(left, right)); - } - - return list; - } - - private static String injectData(String string, List> injectors) { - for (Pair injector : injectors) - string = string.replaceAll(injector.getLeft(), injector.getRight()); - return string; - } - - @Override - public int compareTo(@NotNull Entry rhs) { - if (this.familyName.equals(rhs.familyName)) return this.tierNumber - rhs.tierNumber; - else return this.familyName.compareTo(rhs.familyName); - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java index 99483468..b694f451 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java @@ -136,7 +136,7 @@ public class ItemFixerUpper { "minecraft:creeper_head" }; - public static String convert(String id, int damage) { + public static String convertItemId(String id, int damage) { if (id.equals("minecraft:dye")) return DYE_COLORS[damage]; if (id.equals("minecraft:log2")) return "minecraft:" + TREE_VARIANTS[damage + 4] + "log"; if (id.equals("minecraft:leaves2")) return "minecraft:" + TREE_VARIANTS[damage + 4] + "leaves"; 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 40a9148e..c664bb9e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java @@ -2,6 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; @@ -9,38 +11,31 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.*; public class ItemRegistry { - private static final String ITEM_REPO_URI = "https://github.com/KonaeAkira/NotEnoughUpdates-REPO.git"; + protected static final String REMOTE_ITEM_REPO_DIR = "https://github.com/KonaeAkira/NotEnoughUpdates-REPO.git"; + protected static final String LOCAL_ITEM_REPO_DIR = "./config/skyblocker/items-repo/"; - private static final String ITEM_REPO_DIR = "./config/skyblocker/items-repo/"; - private static final String ITEM_LIST_DIR = ITEM_REPO_DIR + "items/"; - private static final String CONSTANTS_DIR = ITEM_REPO_DIR + "constants/"; - private static final String PETNUMS_FILE = CONSTANTS_DIR + "petnums.json"; + private static final String ITEM_LIST_DIR = LOCAL_ITEM_REPO_DIR + "items/"; - protected static SortedSet registry = new TreeSet<>(); - protected static JsonObject petNums; + protected static List items = new ArrayList<>(); + protected static Map itemsMap = new HashMap<>(); + protected static List recipes = new ArrayList<>(); // TODO: make async public static void init() { updateItemRepo(); - try { - petNums = JsonParser.parseString(Files.readString(Paths.get(PETNUMS_FILE))).getAsJsonObject(); - } catch (IOException e) { - e.printStackTrace(); - } + ItemStackBuilder.init(); importItemFiles(); } private static void updateItemRepo() { - if (!Files.isDirectory(Paths.get(ITEM_REPO_DIR))) { + if (!Files.isDirectory(Paths.get(LOCAL_ITEM_REPO_DIR))) { try { Git.cloneRepository() - .setURI(ITEM_REPO_URI) - .setDirectory(new File(ITEM_REPO_DIR)) + .setURI(REMOTE_ITEM_REPO_DIR) + .setDirectory(new File(LOCAL_ITEM_REPO_DIR)) .setBranchesToClone(List.of("refs/heads/master")) .setBranch("refs/heads/master") .call(); @@ -49,7 +44,7 @@ public class ItemRegistry { } } else { try { - Git.open(new File(ITEM_REPO_DIR)).pull().call(); + Git.open(new File(LOCAL_ITEM_REPO_DIR)).pull().call(); } catch (GitAPIException | IOException e) { e.printStackTrace(); } @@ -57,6 +52,8 @@ public class ItemRegistry { } private static void importItemFiles() { + List jsonObjs = new ArrayList<>(); + File dir = new File(ITEM_LIST_DIR); File[] files = dir.listFiles(); assert files != null; @@ -64,12 +61,83 @@ public class ItemRegistry { String path = ITEM_LIST_DIR + "/" + file.getName(); try { String fileContent = Files.readString(Paths.get(path)); - JsonObject json = JsonParser.parseString(fileContent).getAsJsonObject(); - registry.add(new Entry(json)); + jsonObjs.add(JsonParser.parseString(fileContent).getAsJsonObject()); } catch (IOException e) { + System.err.println("Couldn't import " + path); e.printStackTrace(); } } + + 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(Recipe.fromJsonObject(jsonObj)); + } + + items.sort((lhs, rhs) -> { + String lhsInternalName = lhs.getNbt().getCompound("ExtraAttributes").getString("id"); + String lhsFamilyName = lhsInternalName.replaceAll(".\\d+$", ""); + String rhsInternalName = rhs.getNbt().getCompound("ExtraAttributes").getString("id"); + 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); + }); + } + + public static List getRecipes(String internalName) { + List result = new ArrayList<>(); + for (Recipe recipe : recipes) + if (recipe.result.getNbt().getCompound("ExtraAttributes").getString("id").equals(internalName)) + result.add(recipe); + for (Recipe recipe : recipes) + for (ItemStack ingredient : recipe.grid) + if (!ingredient.getItem().equals(Items.AIR) && ingredient.getNbt().getCompound("ExtraAttributes").getString("id").equals(internalName)) { + result.add(recipe); + break; + } + return result; } } +class Recipe { + String text = ""; + List grid = new ArrayList<>(9); + ItemStack result; + + public static Recipe fromJsonObject(JsonObject jsonObj) { + Recipe recipe = new Recipe(); + if (jsonObj.has("crafttext")) recipe.text = 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()); + return recipe; + } + + private static ItemStack getItemStack(String internalName) { + if (internalName.length() > 0) { + int count = Integer.parseInt(internalName.split(":")[1]); + internalName = internalName.split(":")[0]; + ItemStack itemStack = ItemRegistry.itemsMap.get(internalName).copy(); + itemStack.setCount(count); + return itemStack; + } + return Items.AIR.getDefaultStack(); + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java new file mode 100644 index 00000000..6781f99c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java @@ -0,0 +1,144 @@ +package me.xmrvizzy.skyblocker.skyblock.itemlist; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.*; +import net.minecraft.text.Text; +import net.minecraft.util.Pair; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ItemStackBuilder { + private final static String PETNUMS_PATH = ItemRegistry.LOCAL_ITEM_REPO_DIR + "constants/petnums.json"; + private static JsonObject petNums; + + public static void init() { + try { + petNums = JsonParser.parseString(Files.readString(Paths.get(PETNUMS_PATH))).getAsJsonObject(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static ItemStack parseJsonObj(JsonObject obj) { + String internalName = obj.get("internalname").getAsString(); + + List> injectors = new ArrayList<>(); + injectors.addAll(petData(internalName)); + + NbtCompound root = new NbtCompound(); + root.put("Count", NbtByte.of((byte)1)); + + String id = obj.get("itemid").getAsString(); + int damage = obj.get("damage").getAsInt(); + root.put("id", NbtString.of(ItemFixerUpper.convertItemId(id, damage))); + + NbtCompound tag = new NbtCompound(); + root.put("tag", tag); + + NbtCompound extra = new NbtCompound(); + tag.put("ExtraAttributes", extra); + extra.put("id", NbtString.of(internalName)); + + // add enchantment glint + if (internalName.contains("ENCHANTED")) { + NbtList enchantments = new NbtList(); + enchantments.add(new NbtCompound()); + tag.put("Enchantments", enchantments); + } + + NbtCompound display = new NbtCompound(); + tag.put("display", display); + + String name = injectData(obj.get("displayname").getAsString(), 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))))) + ); + + String nbttag = obj.get("nbttag").getAsString(); + // add skull texture + Matcher skullMatcher = Pattern.compile("SkullOwner:\\{Id:\"(.{36})\",Properties:\\{textures:\\[0:\\{Value:\"(.+)\"}]}}").matcher(nbttag); + if (skullMatcher.find()) { + NbtCompound skullOwner = new NbtCompound(); + tag.put("SkullOwner", skullOwner); + UUID uuid = UUID.fromString(skullMatcher.group(1)); + skullOwner.put("Id", NbtHelper.fromUuid(uuid)); + skullOwner.put("Name", NbtString.of(internalName)); + + NbtCompound properties = new NbtCompound(); + skullOwner.put("Properties", properties); + NbtList textures = new NbtList(); + properties.put("textures", textures); + NbtCompound texture = new NbtCompound(); + textures.add(texture); + texture.put("Value", NbtString.of(skullMatcher.group(2))); + } + // add leather armor dye color + Matcher colorMatcher = Pattern.compile("color:(\\d+)").matcher(nbttag); + if (colorMatcher.find()) { + NbtInt color = NbtInt.of(Integer.parseInt(colorMatcher.group(1))); + display.put("color", color); + } + + return ItemStack.fromNbt(root); + } + + // TODO: fix stats for GOLDEN_DRAGON (lv1 -> lv200) + private static List> petData(String internalName) { + List> 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" + }; + String rarity = rarities[Integer.parseInt(internalName.split(";")[1])]; + JsonObject data = petNums.get(petName).getAsJsonObject().get(rarity).getAsJsonObject(); + + JsonObject statNumsMin = data.get("1").getAsJsonObject().get("statNums").getAsJsonObject(); + JsonObject statNumsMax = data.get("100").getAsJsonObject().get("statNums").getAsJsonObject(); + Set> entrySet = statNumsMin.entrySet(); + for (Map.Entry entry : entrySet) { + String key = entry.getKey(); + String left = "\\{" + key+ "\\}"; + String right = statNumsMin.get(key).getAsString() + " ➡ " + statNumsMax.get(key).getAsString(); + list.add(new Pair<>(left, right)); + } + + JsonArray otherNumsMin = data.get("1").getAsJsonObject().get("otherNums").getAsJsonArray(); + JsonArray otherNumsMax = data.get("100").getAsJsonObject().get("otherNums").getAsJsonArray(); + for (int i = 0; i < otherNumsMin.size(); ++i) { + String left = "\\{" + i + "\\}"; + String right = otherNumsMin.get(i).getAsString() + " ➡ " + otherNumsMax.get(i).getAsString(); + list.add(new Pair(left, right)); + } + + return list; + } + + private static String injectData(String string, List> injectors) { + for (Pair injector : injectors) + string = string.replaceAll(injector.getLeft(), injector.getRight()); + return string; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java index 65558ac3..299f9e50 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java @@ -7,6 +7,7 @@ import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -15,13 +16,14 @@ import java.util.List; public class ResultButtonWidget extends ClickableWidget { private static final Identifier BACKGROUND_TEXTURE = new Identifier("textures/gui/recipe_book.png"); - private ItemStack itemStack = null; + protected ItemStack itemStack = null; public ResultButtonWidget(int x, int y) { super(x, y, 25, 25, Text.of("")); } protected void setItemStack(ItemStack itemStack) { + this.active = !itemStack.getItem().equals(Items.AIR); this.visible = true; this.itemStack = itemStack; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java index a5d5917b..ef8ba444 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -5,6 +5,8 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.widget.ToggleButtonWidget; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import java.util.ArrayList; @@ -19,13 +21,15 @@ public class SearchResultsWidget implements Drawable { private final int rows = 4; private final int cols = 5; - private final List searchResults = new ArrayList<>(); + private final List searchResults = new ArrayList<>(); + private List recipeResults = new ArrayList<>(); private String searchText = null; private List resultButtons = new ArrayList<>(); private ToggleButtonWidget nextPageButton; private ToggleButtonWidget prevPageButton; private int currentPage = 0; private int pageCount = 0; + private boolean displayRecipes = false; public SearchResultsWidget(MinecraftClient client, int parentX, int parentY) { this.client = client; @@ -49,25 +53,42 @@ public class SearchResultsWidget implements Drawable { if (!searchText.equals(this.searchText)) { this.searchText = searchText; this.searchResults.clear(); - for (Entry entry : ItemRegistry.registry) { - String name = entry.itemStack.getName().toString().toLowerCase(); - String lore = entry.itemStack.getNbt().toString().toLowerCase(); + for (ItemStack entry : ItemRegistry.items) { + String name = entry.getName().toString().toLowerCase(); + String lore = entry.getNbt().getCompound("display").getCompound("Lore").toString().toLowerCase(); if (name.contains(this.searchText) || lore.contains(this.searchText)) this.searchResults.add(entry); } this.currentPage = 0; this.pageCount = (this.searchResults.size() - 1) / resultButtons.size() + 1; + this.displayRecipes = false; this.updateButtons(); } } private void updateButtons() { - for (int i = 0; i < resultButtons.size(); ++i) { - int index = this.currentPage * resultButtons.size() + i; - if (index < this.searchResults.size()) { - resultButtons.get(i).setItemStack(this.searchResults.get(index).itemStack); - } else { - resultButtons.get(i).clearItemStack(); + if (this.displayRecipes) { + Recipe 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); + } else { + for (int i = 0; i < resultButtons.size(); ++i) { + int index = this.currentPage * resultButtons.size() + i; + if (index < this.searchResults.size()) { + resultButtons.get(i).setItemStack(this.searchResults.get(index)); + } else { + resultButtons.get(i).clearItemStack(); + } } } this.prevPageButton.active = this.currentPage > 0; @@ -76,6 +97,12 @@ public class SearchResultsWidget implements Drawable { public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { RenderSystem.disableDepthTest(); + if (this.displayRecipes) { + String craftText = this.recipeResults.get(this.currentPage).text; + this.client.textRenderer.drawWithShadow(matrices, craftText, this.parentX + 11, this.parentY + 31, 0xffffffff); + Text resultText = this.recipeResults.get(this.currentPage).result.getName(); + this.client.textRenderer.drawWithShadow(matrices, resultText, this.parentX + 11, this.parentY + 43, 0xffffffff); + } for (ResultButtonWidget button : resultButtons) button.render(matrices, mouseX, mouseY, delta); if (this.pageCount > 1) { @@ -96,10 +123,20 @@ public class SearchResultsWidget implements Drawable { RenderSystem.enableDepthTest(); } - public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { for (ResultButtonWidget button : resultButtons) - if (button.mouseClicked(mouseX, mouseY, mouseButton)) return true; + if (button.mouseClicked(mouseX, mouseY, mouseButton)) { + String internalName = button.itemStack.getNbt().getCompound("ExtraAttributes").getString("id"); + List recipes = ItemRegistry.getRecipes(internalName); + if (!recipes.isEmpty()) { + this.recipeResults = recipes; + this.currentPage = 0; + this.pageCount = recipes.size(); + this.displayRecipes = true; + this.updateButtons(); + } + return true; + } if (this.prevPageButton.mouseClicked(mouseX, mouseY, mouseButton)) { --this.currentPage; this.updateButtons(); -- cgit From c542ca3021e40dc50484eba81453f25b3e9f2629 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Sun, 30 Jan 2022 20:57:58 +0100 Subject: Exit recipe view when clicking on search bar --- .../me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java | 5 ++++- .../xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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 0b42ece8..a7adb4f7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -78,7 +78,10 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (this.isOpen() && !this.client.player.isSpectator()) { - if (this.searchField.mouseClicked(mouseX, mouseY, button)) return true; + if (this.searchField.mouseClicked(mouseX, mouseY, button)) { + this.results.closeRecipeView(); + return true; + } if (this.results.mouseClicked(mouseX, mouseY, button)) return true; } return false; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java index ef8ba444..50475297 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -49,6 +49,11 @@ public class SearchResultsWidget implements Drawable { this.prevPageButton.setTextureUV(1, 208, 13, 18, TEXTURE); } + public void closeRecipeView() { + this.displayRecipes = false; + this.updateButtons(); + } + protected void updateSearchResult(String searchText) { if (!searchText.equals(this.searchText)) { this.searchText = searchText; -- cgit From aae67d887c3f2d3807d9dc3ec04298cd32042316 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Sun, 30 Jan 2022 21:08:43 +0100 Subject: Add crafting arrow to recipe view --- .../me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java index 50475297..554b3ff4 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -107,6 +107,7 @@ public class SearchResultsWidget implements Drawable { this.client.textRenderer.drawWithShadow(matrices, craftText, this.parentX + 11, this.parentY + 31, 0xffffffff); Text resultText = this.recipeResults.get(this.currentPage).result.getName(); this.client.textRenderer.drawWithShadow(matrices, resultText, this.parentX + 11, this.parentY + 43, 0xffffffff); + this.client.textRenderer.drawWithShadow(matrices, "▶", this.parentX + 96, this.parentY + 90, 0xaaffffff); } for (ResultButtonWidget button : resultButtons) button.render(matrices, mouseX, mouseY, delta); -- cgit From 2018b63c4ecd6072413717c9dc846d98a41134a8 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Sun, 30 Jan 2022 21:42:14 +0100 Subject: Update page count after closing recipe view --- .../me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java index 554b3ff4..05372816 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -50,6 +50,8 @@ public class SearchResultsWidget implements Drawable { } public void closeRecipeView() { + this.currentPage = 0; + this.pageCount = (this.searchResults.size() - 1) / resultButtons.size() + 1; this.displayRecipes = false; this.updateButtons(); } -- cgit From dd7353abb67ff4eaea0367aaf7041818fe742cf2 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Sun, 30 Jan 2022 22:07:56 +0100 Subject: Fix item count now showing --- .../me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java index 299f9e50..57fcbcd2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java @@ -40,6 +40,7 @@ public class ResultButtonWidget extends ClickableWidget { RenderSystem.setShaderTexture(0, BACKGROUND_TEXTURE); this.drawTexture(matrices, this.x, this.y, 29, 206, this.width, this.height); client.getItemRenderer().renderInGui(this.itemStack, this.x + 4, this.y + 4); + client.getItemRenderer().renderGuiItemOverlay(client.textRenderer, itemStack, this.x + 4, this.y + 4); } @Override -- cgit