diff options
author | KonaeAkira <longtruong2411@gmail.com> | 2022-01-30 20:28:35 +0100 |
---|---|---|
committer | KonaeAkira <longtruong2411@gmail.com> | 2022-01-30 20:28:35 +0100 |
commit | 5112df4833c24908548e4d9a681bf57277d9c957 (patch) | |
tree | 39b459e506398a2ac723f4507496922bd318eb9c /src | |
parent | c474866731e454fa6271e513dcde38b7ffe6c665 (diff) | |
download | Skyblocker-5112df4833c24908548e4d9a681bf57277d9c957.tar.gz Skyblocker-5112df4833c24908548e4d9a681bf57277d9c957.tar.bz2 Skyblocker-5112df4833c24908548e4d9a681bf57277d9c957.zip |
Add recipe-view to item list
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java | 2 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java | 110 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java (renamed from src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java) | 50 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java | 4 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java | 61 |
5 files changed, 164 insertions, 63 deletions
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<Entry> registry = new TreeSet<>(); - protected static JsonObject petNums; + protected static List<ItemStack> items = new ArrayList<>(); + protected static Map<String, ItemStack> itemsMap = new HashMap<>(); + protected static List<Recipe> 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<JsonObject> 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<Recipe> getRecipes(String internalName) { + List<Recipe> 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<ItemStack> 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/Entry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java index 1ddabb35..6781f99c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java @@ -3,30 +3,33 @@ 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.item.Items; import net.minecraft.nbt.*; import net.minecraft.text.Text; import net.minecraft.util.Pair; -import org.jetbrains.annotations.NotNull; +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 final class Entry implements Comparable<Entry> { - final ItemStack itemStack; - final String internalName; - final String familyName; - final int tierNumber; - final String clickCommand; +public class ItemStackBuilder { + private final static String PETNUMS_PATH = ItemRegistry.LOCAL_ITEM_REPO_DIR + "constants/petnums.json"; + private static JsonObject petNums; - 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+)$", ""); + 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<Pair<String, String>> injectors = new ArrayList<>(); injectors.addAll(petData(internalName)); @@ -36,7 +39,7 @@ public final class Entry implements Comparable<Entry> { String id = obj.get("itemid").getAsString(); int damage = obj.get("damage").getAsInt(); - root.put("id", NbtString.of(ItemFixerUpper.convert(id, damage))); + root.put("id", NbtString.of(ItemFixerUpper.convertItemId(id, damage))); NbtCompound tag = new NbtCompound(); root.put("tag", tag); @@ -72,7 +75,7 @@ public final class Entry implements Comparable<Entry> { tag.put("SkullOwner", skullOwner); UUID uuid = UUID.fromString(skullMatcher.group(1)); skullOwner.put("Id", NbtHelper.fromUuid(uuid)); - skullOwner.put("Name", NbtString.of(this.internalName)); + skullOwner.put("Name", NbtString.of(internalName)); NbtCompound properties = new NbtCompound(); skullOwner.put("Properties", properties); @@ -89,10 +92,7 @@ public final class Entry implements Comparable<Entry> { 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 + ")"); - } + return ItemStack.fromNbt(root); } // TODO: fix stats for GOLDEN_DRAGON (lv1 -> lv200) @@ -100,7 +100,7 @@ public final class Entry implements Comparable<Entry> { List<Pair<String, String>> list = new ArrayList<>(); String petName = internalName.split(";")[0]; - if (!internalName.contains(";") || !ItemRegistry.petNums.has(petName)) return list; + if (!internalName.contains(";") || !petNums.has(petName)) return list; list.add(new Pair<>("\\{LVL\\}", "1 ➡ 100")); @@ -113,7 +113,7 @@ public final class Entry implements Comparable<Entry> { "MYTHIC" }; String rarity = rarities[Integer.parseInt(internalName.split(";")[1])]; - JsonObject data = ItemRegistry.petNums.get(petName).getAsJsonObject().get(rarity).getAsJsonObject(); + 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(); @@ -141,10 +141,4 @@ public final class Entry implements Comparable<Entry> { 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/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<Entry> searchResults = new ArrayList<>(); + private final List<ItemStack> searchResults = new ArrayList<>(); + private List<Recipe> recipeResults = new ArrayList<>(); private String searchText = null; private List<ResultButtonWidget> 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<Recipe> 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(); |