From 5ff6d2c2e51e1e503f5f7929668074ec2f276ecc Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Thu, 27 Jan 2022 14:10:30 +0100 Subject: Import itemlist from https://github.com/KonaeAkira/Skypixel --- .../xmrvizzy/skyblocker/SkyblockerInitializer.java | 2 + .../skyblocker/mixin/HandledScreenMixin.java | 22 +++ .../skyblocker/skyblock/itemlist/Entry.java | 138 +++++++++++++++ .../skyblock/itemlist/ItemFixerUpper.java | 152 ++++++++++++++++ .../skyblock/itemlist/ItemListWidget.java | 192 +++++++++++++++++++++ .../skyblocker/skyblock/itemlist/ItemRegistry.java | 78 +++++++++ 6 files changed, 584 insertions(+) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java (limited to 'src/main/java/me') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java index 93eac100..46cd0bb2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java @@ -4,6 +4,7 @@ import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import net.fabricmc.api.ClientModInitializer; public class SkyblockerInitializer implements ClientModInitializer { @@ -13,5 +14,6 @@ public class SkyblockerInitializer implements ClientModInitializer { SkyblockerConfig.init(); PriceInfoTooltip.init(); WikiLookup.init(); + ItemRegistry.init(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java new file mode 100644 index 00000000..a1683701 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -0,0 +1,22 @@ +package me.xmrvizzy.skyblocker.mixin; + +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemListWidget; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(HandledScreen.class) +public abstract class HandledScreenMixin extends Screen { + protected HandledScreenMixin(Text title) { + super(title); + } + + @Inject(method = "init()V", at = @At("TAIL")) + private void init(CallbackInfo ci) { + super.addDrawableChild(new ItemListWidget((HandledScreen)(Object)this)); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java new file mode 100644 index 00000000..4260aa4a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java @@ -0,0 +1,138 @@ +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); + + 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(); + Matcher matcher = Pattern.compile("SkullOwner:\\{Id:\"(.{36})\",Properties:\\{textures:\\[0:\\{Value:\"(.+)\"\\}\\]\\}\\}").matcher(nbttag); + if (matcher.find()) { + NbtCompound skullOwner = new NbtCompound(); + tag.put("SkullOwner", skullOwner); + UUID uuid = UUID.fromString(matcher.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(matcher.group(2))); + } + + 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 new file mode 100644 index 00000000..c0ba1262 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java @@ -0,0 +1,152 @@ +package me.xmrvizzy.skyblocker.skyblock.itemlist; + +import net.minecraft.item.Items; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +import java.util.Map; + +public class ItemFixerUpper { + private final static Map MAPPING = Map.ofEntries( + Map.entry("minecraft:golden_rail", "minecraft:powered_rail"), + Map.entry("minecraft:lit_pumpkin", "minecraft:jack_o_lantern"), + Map.entry("minecraft:snow_layer", "minecraft:snow"), + Map.entry("minecraft:hardened_clay", "minecraft:terracotta"), + Map.entry("minecraft:speckled_melon", "minecraft:glistering_melon_slice"), + Map.entry("minecraft:mob_spawner", "minecraft:spawner"), + Map.entry("minecraft:brick_block", "minecraft:bricks"), + Map.entry("minecraft:deadbush", "minecraft:dead_bush"), + Map.entry("minecraft:slime", "minecraft:slime_block"), + Map.entry("minecraft:melon_block", "minecraft:melon"), + Map.entry("minecraft:reeds", "minecraft:sugar_cane"), + Map.entry("minecraft:yellow_flower", "minecraft:dandelion"), + Map.entry("minecraft:firework_charge", "minecraft:firework_star"), + Map.entry("minecraft:noteblock", "minecraft:note_block"), + Map.entry("minecraft:web", "minecraft:cobweb"), + Map.entry("minecraft:fireworks", "minecraft:firework_rocket"), + Map.entry("minecraft:netherbrick", "minecraft:nether_brick"), + Map.entry("minecraft:stained_hardened_clay", "minecraft:terracotta"), + Map.entry("minecraft:quartz_ore", "minecraft:nether_quartz_ore"), + Map.entry("minecraft:skull", "minecraft:player_head"), + Map.entry("minecraft:fish", "minecraft:cod"), + Map.entry("minecraft:cooked_fish", "minecraft:cooked_cod"), + Map.entry("minecraft:red_flower", "minecraft:poppy"), + Map.entry("minecraft:tallgrass", "minecraft:grass"), + Map.entry("minecraft:stone_slab2", "minecraft:red_sandstone_slab"), + Map.entry("minecraft:waterlily", "minecraft:lily_pad") + ); + + private final static String[] DYE_COLORS = { + "minecraft:ink_sac", + "minecraft:red_dye", + "minecraft:green_dye", + "minecraft:cocoa_beans", + "minecraft:lapis_lazuli", + "minecraft:purple_dye", + "minecraft:cyan_dye", + "minecraft:light_gray_dye", + "minecraft:gray_dye", + "minecraft:pink_dye", + "minecraft:lime_dye", + "minecraft:yellow_dye", + "minecraft:light_blue_dye", + "minecraft:magenta_dye", + "minecraft:orange_dye", + "minecraft:bone_meal" + }; + + private final static String[] BLOCK_COLORS = { + "white_", + "orange_", + "magenta_", + "light_blue_", + "yellow_", + "lime_", + "pink_", + "gray_", + "light_gray_", + "cyan_", + "purple_", + "blue_", + "brown_", + "green_", + "red_", + "black_" + }; + + private final static String[] TREE_VARIANTS = { + "oak_", + "spruce_", + "birch_", + "jungle_", + "acacia_", + "dark_oak_" + }; + + private final static String[] STONE_BRICK_VARIANTS = { + "minecraft:stone_bricks", + "minecraft:mossy_stone_bricks", + "minecraft:cracked_stone_bricks", + "minecraft:chiseled_stone_bricks" + }; + + private final static String[] DOUBLE_PLANT_VARIANTS = { + "minecraft:sunflower", + "minecraft:lilac", + "minecraft:tall_grass", + "minecraft:large_fern", + "minecraft:rose_bush", + "minecraft:peony" + }; + + private final static Map SPAWN_EGG_VARIANTS = Map.ofEntries( + Map.entry(50, "minecraft:creeper_spawn_egg"), + Map.entry(51, "minecraft:skeleton_spawn_egg"), + Map.entry(52, "minecraft:spider_spawn_egg"), + Map.entry(54, "minecraft:zombie_spawn_egg"), + Map.entry(55, "minecraft:slime_spawn_egg"), + Map.entry(56, "minecraft:ghast_spawn_egg"), + Map.entry(57, "minecraft:zombified_piglin_spawn_egg"), + Map.entry(58, "minecraft:enderman_spawn_egg"), + Map.entry(59, "minecraft:cave_spider_spawn_egg"), + Map.entry(60, "minecraft:silverfish_spawn_egg"), + Map.entry(61, "minecraft:blaze_spawn_egg"), + Map.entry(62, "minecraft:magma_cube_spawn_egg"), + Map.entry(65, "minecraft:bat_spawn_egg"), + Map.entry(66, "minecraft:witch_spawn_egg"), + Map.entry(67, "minecraft:endermite_spawn_egg"), + Map.entry(68, "minecraft:guardian_spawn_egg"), + Map.entry(90, "minecraft:pig_spawn_egg"), + Map.entry(91, "minecraft:sheep_spawn_egg"), + Map.entry(92, "minecraft:cow_spawn_egg"), + Map.entry(93, "minecraft:chicken_spawn_egg"), + Map.entry(94, "minecraft:squid_spawn_egg"), + Map.entry(95, "minecraft:wolf_spawn_egg"), + Map.entry(96, "minecraft:mooshroom_spawn_egg"), + Map.entry(98, "minecraft:ocelot_spawn_egg"), + Map.entry(100, "minecraft:horse_spawn_egg"), + Map.entry(101, "minecraft:rabbit_spawn_egg"), + Map.entry(120, "minecraft:villager_spawn_egg") + ); + + public static String convert(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"; + if (id.equals("minecraft:stonebrick")) return STONE_BRICK_VARIANTS[damage]; + if (id.equals("minecraft:double_plant")) return DOUBLE_PLANT_VARIANTS[damage]; + if (id.equals("minecraft:spawn_egg")) return SPAWN_EGG_VARIANTS.getOrDefault(damage, "minecraft:ghast_spawn_egg"); + if (id.equals("minecraft:banner")) return "minecraft:" + BLOCK_COLORS[15 - damage] + "banner"; + id = MAPPING.getOrDefault(id, id); + if (Registry.ITEM.get(new Identifier(id)).equals(Items.AIR)) { + String shortId = id.split(":")[1]; + if (damage < BLOCK_COLORS.length && !Registry.ITEM.get(new Identifier("minecraft:" + BLOCK_COLORS[damage] + shortId)).equals(Items.AIR)) + return "minecraft:" + BLOCK_COLORS[damage] + shortId; + if (damage < TREE_VARIANTS.length && !Registry.ITEM.get(new Identifier("minecraft:" + TREE_VARIANTS[damage] + shortId)).equals(Items.AIR)) + return "minecraft:" + TREE_VARIANTS[damage] + shortId; + if (id.contains("wooden_")) return id.replaceFirst("wooden_", TREE_VARIANTS[damage]); + if (id.contains("minecraft:record")) return id.replaceFirst("minecraft:record", "minecraft:music_disc"); + } + return id; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java new file mode 100644 index 00000000..f7e196d5 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -0,0 +1,192 @@ +package me.xmrvizzy.skyblocker.skyblock.itemlist; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.systems.RenderSystem; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.AbstractParentElement; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +@Environment(value= EnvType.CLIENT) +public class ItemListWidget extends AbstractParentElement implements Drawable, Selectable { + private static final List entries = new ArrayList<>(); + private static String searchString = ""; + private static double scroll = 0.0; + + private final int gridX; + private final int gridY; + private final int rows; + private final int cols; + + private double maxScroll; + + private final HandledScreen screen; + private final MinecraftClient client; + private final List children = Lists.newArrayList(); + private final List selectables = Lists.newArrayList(); + private final List drawables = Lists.newArrayList(); + private final TextFieldWidget search; + + public ItemListWidget(HandledScreen screen) { + this.client = MinecraftClient.getInstance(); + this.screen = screen; + + this.cols = (screen.width - 200) / 2 / 16; + this.rows = (screen.height - 40) / 16; + this.gridX = 8; + this.gridY = 40; + + this.maxScroll = Math.max(0, entries.size() / this.cols - this.rows + 1); + + int searchX = this.gridX + 1; + int searchY = 18; + int searchWidth = this.cols * 16 - 2; + int searchHeight = 16; + + this.search = new TextFieldWidget(this.client.textRenderer, searchX, searchY, searchWidth, searchHeight, Text.of("Search")); + this.search.setText(searchString); + this.search.setChangedListener(this::setSearch); + this.addDrawableChild(search); + + this.setSearch(searchString); + } + + private void setSearch(String search) { + searchString = search; + entries.clear(); + search = search.toLowerCase(); + for (Entry entry : ItemRegistry.registry) { + String name = entry.itemStack.getName().toString().toLowerCase(); + String lore = entry.itemStack.getNbt().toString().toLowerCase(); + if (name.contains(search) || lore.contains(search)) + entries.add(entry); + } + this.maxScroll = Math.max(0, entries.size() / this.cols - this.rows + 1); + scroll = Math.min(scroll, this.maxScroll); + } + + protected T addDrawableChild(T drawableElement) { + this.drawables.add((Drawable)drawableElement); + return this.addSelectableChild(drawableElement); + } + + protected T addDrawable(T drawable) { + this.drawables.add(drawable); + return drawable; + } + + protected T addSelectableChild(T child) { + this.children.add(child); + this.selectables.add((Selectable)child); + return child; + } + + @Override + public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + ItemRenderer itemRenderer = client.getItemRenderer(); + RenderSystem.disableDepthTest(); + // search box title + client.textRenderer.drawWithShadow(matrices, "Search", this.gridX, 6, 0xff9e9e9e); + // slot hover + int mouseOverIndex = getMouseOverIndex(mouseX, mouseY); + if (mouseOverIndex != -1) { + int x = this.gridX + mouseOverIndex % this.cols * 16; + int y = this.gridY + (mouseOverIndex / this.cols - (int)scroll) * 16; + fill(matrices, x, y, x + 16, y + 16, 0x20ffffff); + } + // item list + for (int i = 0; i < rows; ++i) + for (int j = 0; j < cols; ++j) { + int index = (i + (int)scroll) * cols + j; + if (index < entries.size()) { + int x = gridX + j * 16; + int y = gridY + i * 16; + itemRenderer.renderInGui(entries.get(index).itemStack, x, y); + } + } + // item tooltip + if (mouseOverIndex != -1) { + ItemStack stack = entries.get(mouseOverIndex).itemStack; + List tooltip = this.screen.getTooltipFromItem(stack); + this.screen.renderTooltip(matrices, tooltip, mouseX, mouseY); + } + RenderSystem.enableDepthTest(); + // render children + Iterator iter = this.drawables.iterator(); + while(iter.hasNext()) { + Drawable drawable = (Drawable)iter.next(); + drawable.render(matrices, mouseX, mouseY, delta); + } + } + + private boolean isMouseOverList(double mouseX, double mouseY) { + return gridX <= mouseX && mouseX < gridX + cols * 16 && gridY <= mouseY && mouseY < gridY + rows * 16; + } + + private int getMouseOverIndex(double mouseX, double mouseY) { + if (isMouseOverList(mouseX, mouseY)) { + int i = (int)(mouseY - this.gridY) / 16; + int j = (int)(mouseX - this.gridX) / 16; + int index = (i + (int)scroll) * this.cols + j; + if (index < entries.size()) return index; + } + return -1; + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double amount) { + if (super.mouseScrolled(mouseX, mouseY, amount)) { + return true; + } else if (this.isMouseOverList(mouseX, mouseY)) { + scroll = Math.min(this.maxScroll, Math.max(0.0, scroll - amount)); + return true; + } + return false; + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (super.keyPressed(keyCode, scanCode, modifiers)) return true; + return this.getFocused() instanceof TextFieldWidget && ((TextFieldWidget) this.getFocused()).isFocused() && keyCode != 256; + } + + @Override + public List children() { + return this.children; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (super.mouseClicked(mouseX, mouseY, button)) return true; + int index = getMouseOverIndex(mouseX, mouseY); + if (index != -1 && entries.get(index).clickCommand != null) { + this.client.player.sendChatMessage(entries.get(index).clickCommand); + return true; + } + return false; + } + + @Override + public void appendNarrations(NarrationMessageBuilder builder) { + + } + + @Override + public SelectionType getType() { + return SelectionType.NONE; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java new file mode 100644 index 00000000..b94ea72d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java @@ -0,0 +1,78 @@ +package me.xmrvizzy.skyblocker.skyblock.itemlist; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.SortedSet; +import java.util.TreeSet; + +public class ItemRegistry { + private static final String ITEM_REPO_URI = "https://github.com/KonaeAkira/NotEnoughUpdates-REPO.git"; + + private static final String ITEM_REPO_DIR = "./config/skypixel/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 JsonParser JSON_PARSER = new JsonParser(); + + protected static SortedSet registry = new TreeSet(); + protected static JsonObject petNums; + + // TODO: make async + public static void init() { + updateItemRepo(); + try { + petNums = JSON_PARSER.parse(Files.readString(Paths.get(PETNUMS_FILE))).getAsJsonObject(); + } catch (IOException e) { + e.printStackTrace(); + } + importItemFiles(); + } + + private static void updateItemRepo() { + if (!Files.isDirectory(Paths.get(ITEM_REPO_DIR))) { + try { + Git.cloneRepository() + .setURI(ITEM_REPO_URI) + .setDirectory(new File(ITEM_REPO_DIR)) + .setBranchesToClone(Arrays.asList("refs/heads/master")) + .setBranch("refs/heads/master") + .call(); + } catch (GitAPIException e) { + e.printStackTrace(); + } + } else { + try { + Git.open(new File(ITEM_REPO_DIR)).pull().call(); + } catch (GitAPIException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static void importItemFiles() { + File dir = new File(ITEM_LIST_DIR); + File[] files = dir.listFiles(); + for (File file : files) { + String path = ITEM_LIST_DIR + "/" + file.getName(); + try { + String fileContent = Files.readString(Paths.get(path)); + JsonObject json = JSON_PARSER.parse(fileContent).getAsJsonObject(); + registry.add(new Entry(json)); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} + -- cgit From 7b9791c08aac408279f8c4365f26ff057a6be293 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Thu, 27 Jan 2022 15:19:07 +0100 Subject: Fix missing armor dye color in item list + Fixed usage of deprecated JsonParser methods. + Combined search bar and search title into single class. + Rename local repo dir from "Skypixel/item-repo" to "Skyblocker/item-repo" --- .../skyblocker/skyblock/itemlist/Entry.java | 20 +++++++++++------ .../skyblock/itemlist/ItemListWidget.java | 25 ++++++---------------- .../skyblocker/skyblock/itemlist/ItemRegistry.java | 19 +++++++--------- .../skyblocker/skyblock/itemlist/SearchWidget.java | 25 ++++++++++++++++++++++ 4 files changed, 54 insertions(+), 35 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchWidget.java (limited to 'src/main/java/me') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java index 4260aa4a..d9a541bb 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java @@ -41,6 +41,7 @@ public final class Entry implements Comparable { NbtCompound tag = new NbtCompound(); root.put("tag", tag); + // add enchantment glint if (internalName.contains("ENCHANTED")) { NbtList enchantments = new NbtList(); enchantments.add(new NbtCompound()); @@ -60,11 +61,12 @@ public final class Entry implements Comparable { ); String nbttag = obj.get("nbttag").getAsString(); - Matcher matcher = Pattern.compile("SkullOwner:\\{Id:\"(.{36})\",Properties:\\{textures:\\[0:\\{Value:\"(.+)\"\\}\\]\\}\\}").matcher(nbttag); - if (matcher.find()) { + // 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(matcher.group(1)); + UUID uuid = UUID.fromString(skullMatcher.group(1)); skullOwner.put("Id", NbtHelper.fromUuid(uuid)); skullOwner.put("Name", NbtString.of(this.internalName)); @@ -74,7 +76,13 @@ public final class Entry implements Comparable { properties.put("textures", textures); NbtCompound texture = new NbtCompound(); textures.add(texture); - texture.put("Value", NbtString.of(matcher.group(2))); + 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); @@ -90,7 +98,7 @@ public final class Entry implements Comparable { String petName = internalName.split(";")[0]; if (!internalName.contains(";") || !ItemRegistry.petNums.has(petName)) return list; - list.add(new Pair("\\{LVL\\}", "1 ➡ 100")); + list.add(new Pair<>("\\{LVL\\}", "1 ➡ 100")); final String[] rarities = { "COMMON", @@ -110,7 +118,7 @@ public final class Entry implements Comparable { String key = entry.getKey(); String left = "\\{" + key+ "\\}"; String right = statNumsMin.get(key).getAsString() + " ➡ " + statNumsMax.get(key).getAsString(); - list.add(new Pair(left, right)); + list.add(new Pair<>(left, right)); } JsonArray otherNumsMin = data.get("1").getAsJsonObject().get("otherNums").getAsJsonArray(); 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 f7e196d5..9f053d8b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -18,7 +18,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; @Environment(value= EnvType.CLIENT) @@ -39,11 +38,10 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S private final List children = Lists.newArrayList(); private final List selectables = Lists.newArrayList(); private final List drawables = Lists.newArrayList(); - private final TextFieldWidget search; public ItemListWidget(HandledScreen screen) { - this.client = MinecraftClient.getInstance(); this.screen = screen; + this.client = MinecraftClient.getInstance(); this.cols = (screen.width - 200) / 2 / 16; this.rows = (screen.height - 40) / 16; @@ -52,14 +50,9 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S this.maxScroll = Math.max(0, entries.size() / this.cols - this.rows + 1); - int searchX = this.gridX + 1; - int searchY = 18; - int searchWidth = this.cols * 16 - 2; - int searchHeight = 16; - - this.search = new TextFieldWidget(this.client.textRenderer, searchX, searchY, searchWidth, searchHeight, Text.of("Search")); - this.search.setText(searchString); - this.search.setChangedListener(this::setSearch); + SearchWidget search = new SearchWidget(this.client.textRenderer, 8, 8, this.cols * 16); + search.setText(searchString); + search.setChangedListener(this::setSearch); this.addDrawableChild(search); this.setSearch(searchString); @@ -80,7 +73,7 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S } protected T addDrawableChild(T drawableElement) { - this.drawables.add((Drawable)drawableElement); + this.drawables.add(drawableElement); return this.addSelectableChild(drawableElement); } @@ -91,7 +84,7 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S protected T addSelectableChild(T child) { this.children.add(child); - this.selectables.add((Selectable)child); + this.selectables.add(child); return child; } @@ -99,8 +92,6 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { ItemRenderer itemRenderer = client.getItemRenderer(); RenderSystem.disableDepthTest(); - // search box title - client.textRenderer.drawWithShadow(matrices, "Search", this.gridX, 6, 0xff9e9e9e); // slot hover int mouseOverIndex = getMouseOverIndex(mouseX, mouseY); if (mouseOverIndex != -1) { @@ -126,9 +117,7 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S } RenderSystem.enableDepthTest(); // render children - Iterator iter = this.drawables.iterator(); - while(iter.hasNext()) { - Drawable drawable = (Drawable)iter.next(); + for (Drawable drawable : this.drawables) { drawable.render(matrices, mouseX, mouseY, delta); } } 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 b94ea72d..40a9148e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java @@ -9,28 +9,26 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.Arrays; +import java.util.List; import java.util.SortedSet; import java.util.TreeSet; public class ItemRegistry { private static final String ITEM_REPO_URI = "https://github.com/KonaeAkira/NotEnoughUpdates-REPO.git"; - private static final String ITEM_REPO_DIR = "./config/skypixel/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 JsonParser JSON_PARSER = new JsonParser(); - - protected static SortedSet registry = new TreeSet(); + protected static SortedSet registry = new TreeSet<>(); protected static JsonObject petNums; // TODO: make async public static void init() { updateItemRepo(); try { - petNums = JSON_PARSER.parse(Files.readString(Paths.get(PETNUMS_FILE))).getAsJsonObject(); + petNums = JsonParser.parseString(Files.readString(Paths.get(PETNUMS_FILE))).getAsJsonObject(); } catch (IOException e) { e.printStackTrace(); } @@ -43,7 +41,7 @@ public class ItemRegistry { Git.cloneRepository() .setURI(ITEM_REPO_URI) .setDirectory(new File(ITEM_REPO_DIR)) - .setBranchesToClone(Arrays.asList("refs/heads/master")) + .setBranchesToClone(List.of("refs/heads/master")) .setBranch("refs/heads/master") .call(); } catch (GitAPIException e) { @@ -52,9 +50,7 @@ public class ItemRegistry { } else { try { Git.open(new File(ITEM_REPO_DIR)).pull().call(); - } catch (GitAPIException e) { - e.printStackTrace(); - } catch (IOException e) { + } catch (GitAPIException | IOException e) { e.printStackTrace(); } } @@ -63,11 +59,12 @@ public class ItemRegistry { private static void importItemFiles() { File dir = new File(ITEM_LIST_DIR); File[] files = dir.listFiles(); + assert files != null; for (File file : files) { String path = ITEM_LIST_DIR + "/" + file.getName(); try { String fileContent = Files.readString(Paths.get(path)); - JsonObject json = JSON_PARSER.parse(fileContent).getAsJsonObject(); + JsonObject json = JsonParser.parseString(fileContent).getAsJsonObject(); registry.add(new Entry(json)); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchWidget.java new file mode 100644 index 00000000..4acf91b2 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchWidget.java @@ -0,0 +1,25 @@ +package me.xmrvizzy.skyblocker.skyblock.itemlist; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; + +public class SearchWidget extends TextFieldWidget { + protected final int x; + protected final int y; + protected final TextRenderer textRenderer; + + public SearchWidget(TextRenderer textRenderer, int x, int y, int width) { + super(textRenderer, x + 1, y + 12, width - 2, 16, Text.of("Search")); + this.x = x; + this.y = y; + this.textRenderer = textRenderer; + } + + @Override + public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + super.renderButton(matrices, mouseX, mouseY, delta); + this.textRenderer.drawWithShadow(matrices, "Search", this.x, this.y, 0xff9e9e9e); + } +} -- cgit From 871952e17a63bb22391ee0a969c41cd6f0fbf038 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Thu, 27 Jan 2022 15:53:41 +0100 Subject: Fix itemlist scroll not working --- .../skyblocker/skyblock/itemlist/ItemListWidget.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/main/java/me') 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 9f053d8b..e01d58a5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -32,6 +32,7 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S private final int cols; private double maxScroll; + private boolean isHovered; private final HandledScreen screen; private final MinecraftClient client; @@ -90,6 +91,7 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S @Override public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + this.isHovered = this.isMouseOver(mouseX, mouseY); ItemRenderer itemRenderer = client.getItemRenderer(); RenderSystem.disableDepthTest(); // slot hover @@ -136,6 +138,14 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S return -1; } + @Override + public boolean isMouseOver(double mouseX, double mouseY) { + for (Element child : this.children) { + if (child.isMouseOver(mouseX, mouseY)) return true; + } + return this.isMouseOverList(mouseX, mouseY); + } + @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { if (super.mouseScrolled(mouseX, mouseY, amount)) { @@ -176,6 +186,9 @@ public class ItemListWidget extends AbstractParentElement implements Drawable, S @Override public SelectionType getType() { + for (Selectable selectable : selectables) + if (selectable.getType().isFocused()) return SelectionType.FOCUSED; + if (this.isHovered) return SelectionType.HOVERED; return SelectionType.NONE; } } -- cgit From fefe1c0f0b40cafbc265c139f2c986745a44f9a3 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Thu, 27 Jan 2022 16:13:02 +0100 Subject: Add internalName to NBT tag for PriceInfoTooltip --- src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main/java/me') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java index d9a541bb..1ddabb35 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/Entry.java @@ -41,6 +41,10 @@ public final class Entry implements Comparable { 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(); -- cgit From 054c35355b7440b611f80d9a45611a08e6b567f8 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Thu, 27 Jan 2022 16:24:04 +0100 Subject: Fix some skulls being converted to the wrong type --- .../skyblocker/skyblock/itemlist/ItemFixerUpper.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src/main/java/me') 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 c0ba1262..99483468 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java @@ -27,7 +27,6 @@ public class ItemFixerUpper { Map.entry("minecraft:netherbrick", "minecraft:nether_brick"), Map.entry("minecraft:stained_hardened_clay", "minecraft:terracotta"), Map.entry("minecraft:quartz_ore", "minecraft:nether_quartz_ore"), - Map.entry("minecraft:skull", "minecraft:player_head"), Map.entry("minecraft:fish", "minecraft:cod"), Map.entry("minecraft:cooked_fish", "minecraft:cooked_cod"), Map.entry("minecraft:red_flower", "minecraft:poppy"), @@ -129,6 +128,14 @@ public class ItemFixerUpper { Map.entry(120, "minecraft:villager_spawn_egg") ); + private final static String[] SKULL_VARIANTS = { + "minecraft:skeleton_skull", + "minecraft:wither_skeleton_skull", + "minecraft:zombie_head", + "minecraft:player_head", + "minecraft:creeper_head" + }; + public static String convert(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"; @@ -137,6 +144,8 @@ public class ItemFixerUpper { if (id.equals("minecraft:double_plant")) return DOUBLE_PLANT_VARIANTS[damage]; if (id.equals("minecraft:spawn_egg")) return SPAWN_EGG_VARIANTS.getOrDefault(damage, "minecraft:ghast_spawn_egg"); if (id.equals("minecraft:banner")) return "minecraft:" + BLOCK_COLORS[15 - damage] + "banner"; + if (id.equals("minecraft:skull")) return SKULL_VARIANTS[damage]; + id = MAPPING.getOrDefault(id, id); if (Registry.ITEM.get(new Identifier(id)).equals(Items.AIR)) { String shortId = id.split(":")[1]; @@ -144,6 +153,7 @@ public class ItemFixerUpper { return "minecraft:" + BLOCK_COLORS[damage] + shortId; if (damage < TREE_VARIANTS.length && !Registry.ITEM.get(new Identifier("minecraft:" + TREE_VARIANTS[damage] + shortId)).equals(Items.AIR)) return "minecraft:" + TREE_VARIANTS[damage] + shortId; + if (id.contains("wooden_")) return id.replaceFirst("wooden_", TREE_VARIANTS[damage]); if (id.contains("minecraft:record")) return id.replaceFirst("minecraft:record", "minecraft:music_disc"); } -- cgit From fe5e15db3678007c35980b4f04b6879d0c996eb3 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Thu, 27 Jan 2022 17:36:27 +0100 Subject: Add item list toggle config & isSkyblock check --- src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java | 8 ++++++++ .../java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 6 +++++- src/main/resources/assets/skyblocker/lang/en_us.json | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) (limited to 'src/main/java/me') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 74cff226..9c817d44 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -31,6 +31,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) public Bars bars = new Bars(); + @ConfigEntry.Category("itemList") + @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + public ItemList itemList = new ItemList(); + @ConfigEntry.Gui.Excluded public List lockedSlots = new ArrayList<>(); } @@ -39,6 +43,10 @@ public class SkyblockerConfig implements ConfigData { public boolean enableBars = true; } + public static class ItemList { + public boolean enableItemList = true; + } + public static class Locations { @ConfigEntry.Category("dungeons") @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index a1683701..0ed976f3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -1,6 +1,8 @@ package me.xmrvizzy.skyblocker.mixin; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemListWidget; +import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.text.Text; @@ -17,6 +19,8 @@ public abstract class HandledScreenMixin extends Screen { @Inject(method = "init()V", at = @At("TAIL")) private void init(CallbackInfo ci) { - super.addDrawableChild(new ItemListWidget((HandledScreen)(Object)this)); + if (Utils.isSkyblock && SkyblockerConfig.get().general.itemList.enableItemList) { + super.addDrawableChild(new ItemListWidget((HandledScreen)(Object)this)); + } } } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 680787e8..cdca7822 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -9,6 +9,8 @@ "text.autoconfig.skyblocker.option.general.apiKey": "Hypixel API Key (WIP)", "text.autoconfig.skyblocker.option.general.bars": "Health, Mana, Defence & XP Bars", "text.autoconfig.skyblocker.option.general.bars.enableBars": "Enable Bars", + "text.autoconfig.skyblocker.option.general.itemList": "Item List", + "text.autoconfig.skyblocker.option.general.itemList.enableItemList": "Enable Item List", "text.autoconfig.skyblocker.category.locations": "Locations", "text.autoconfig.skyblocker.option.locations.dungeons": "Dungeons", -- cgit