aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKonaeAkira <longtruong2411@gmail.com>2022-01-30 20:28:35 +0100
committerKonaeAkira <longtruong2411@gmail.com>2022-01-30 20:28:35 +0100
commit5112df4833c24908548e4d9a681bf57277d9c957 (patch)
tree39b459e506398a2ac723f4507496922bd318eb9c /src
parentc474866731e454fa6271e513dcde38b7ffe6c665 (diff)
downloadSkyblocker-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.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java110
-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.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java61
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();