From 644866a24b1a82ac45ae067740468740cbe633c1 Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 26 Jan 2024 01:24:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9F=A5=E7=9C=8B=20NBT=20?= =?UTF-8?q?=E6=96=87=E4=BB=B6=20(#2402)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * init * fix checkstyle * update RootPage * fix build * update * update --- .../org/jackhuang/hmcl/ui/main/RootPage.java | 29 +++- .../jackhuang/hmcl/ui/nbt/NBTEditorPage.java | 91 +++++++++++ .../jackhuang/hmcl/ui/nbt/NBTFileType.java | 148 +++++++++++++++++ .../org/jackhuang/hmcl/ui/nbt/NBTHelper.java | 12 ++ .../org/jackhuang/hmcl/ui/nbt/NBTTagType.java | 59 +++++++ .../jackhuang/hmcl/ui/nbt/NBTTreeView.java | 152 ++++++++++++++++++ .../resources/assets/img/nbt/TAG_Byte.png | Bin 0 -> 1245 bytes .../resources/assets/img/nbt/TAG_Byte@2x.png | Bin 0 -> 1839 bytes .../assets/img/nbt/TAG_Byte_Array.png | Bin 0 -> 1293 bytes .../assets/img/nbt/TAG_Byte_Array@2x.png | Bin 0 -> 2011 bytes .../resources/assets/img/nbt/TAG_Compound.png | Bin 0 -> 1305 bytes .../assets/img/nbt/TAG_Compound@2x.png | Bin 0 -> 2230 bytes .../resources/assets/img/nbt/TAG_Double.png | Bin 0 -> 1269 bytes .../assets/img/nbt/TAG_Double@2x.png | Bin 0 -> 1944 bytes .../resources/assets/img/nbt/TAG_Float.png | Bin 0 -> 1275 bytes .../resources/assets/img/nbt/TAG_Float@2x.png | Bin 0 -> 1647 bytes .../main/resources/assets/img/nbt/TAG_Int.png | Bin 0 -> 1299 bytes .../resources/assets/img/nbt/TAG_Int@2x.png | Bin 0 -> 1613 bytes .../assets/img/nbt/TAG_Int_Array.png | Bin 0 -> 1299 bytes .../assets/img/nbt/TAG_Int_Array@2x.png | Bin 0 -> 1951 bytes .../resources/assets/img/nbt/TAG_List.png | Bin 0 -> 1293 bytes .../resources/assets/img/nbt/TAG_List@2x.png | Bin 0 -> 1961 bytes .../resources/assets/img/nbt/TAG_Long.png | Bin 0 -> 1227 bytes .../resources/assets/img/nbt/TAG_Long@2x.png | Bin 0 -> 1409 bytes .../assets/img/nbt/TAG_Long_Array.png | Bin 0 -> 1290 bytes .../assets/img/nbt/TAG_Long_Array@2x.png | Bin 0 -> 1879 bytes .../resources/assets/img/nbt/TAG_Short.png | Bin 0 -> 1227 bytes .../resources/assets/img/nbt/TAG_Short@2x.png | Bin 0 -> 2017 bytes .../resources/assets/img/nbt/TAG_String.png | Bin 0 -> 980 bytes .../assets/img/nbt/TAG_String@2x.png | Bin 0 -> 1537 bytes .../resources/assets/lang/I18N.properties | 5 + .../resources/assets/lang/I18N_zh.properties | 5 + .../assets/lang/I18N_zh_CN.properties | 5 + 33 files changed, 500 insertions(+), 6 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTEditorPage.java create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTFileType.java create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTHelper.java create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTTagType.java create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTTreeView.java create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Byte.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Byte@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Byte_Array.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Byte_Array@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Compound.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Compound@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Double.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Double@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Float.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Float@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Int.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Int@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Int_Array.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Int_Array@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_List.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_List@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Long.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Long@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Long_Array.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Long_Array@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Short.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_Short@2x.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_String.png create mode 100644 HMCL/src/main/resources/assets/img/nbt/TAG_String@2x.png diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java index e4b4b5cfa..d6dd1c5fb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java @@ -39,9 +39,12 @@ import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import org.jackhuang.hmcl.ui.decorator.DecoratorAnimatedPage; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; import org.jackhuang.hmcl.ui.download.ModpackInstallWizardProvider; +import org.jackhuang.hmcl.ui.nbt.NBTEditorPage; +import org.jackhuang.hmcl.ui.nbt.NBTHelper; import org.jackhuang.hmcl.ui.versions.GameAdvancedListItem; import org.jackhuang.hmcl.ui.versions.Versions; import org.jackhuang.hmcl.upgrade.hmcl.UpdateChecker; +import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.TaskCancellationAction; import org.jackhuang.hmcl.util.io.CompressingUtils; import org.jackhuang.hmcl.util.versioning.VersionNumber; @@ -51,10 +54,12 @@ import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.logging.Level; import java.util.stream.Collectors; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.ui.versions.VersionPage.wrap; +import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class RootPage extends DecoratorAnimatedPage implements DecoratorPage { @@ -85,12 +90,24 @@ public class RootPage extends DecoratorAnimatedPage implements DecoratorPage { public MainPage getMainPage() { if (mainPage == null) { MainPage mainPage = new MainPage(); - FXUtils.applyDragListener(mainPage, ModpackHelper::isFileModpackByExtension, modpacks -> { - File modpack = modpacks.get(0); - Controllers.getDecorator().startWizard( - new ModpackInstallWizardProvider(Profiles.getSelectedProfile(), modpack), - i18n("install.modpack")); - }); + FXUtils.applyDragListener(mainPage, + file -> ModpackHelper.isFileModpackByExtension(file) || NBTHelper.isNBTFileByExtension(file), + modpacks -> { + File file = modpacks.get(0); + if (ModpackHelper.isFileModpackByExtension(file)) { + Controllers.getDecorator().startWizard( + new ModpackInstallWizardProvider(Profiles.getSelectedProfile(), file), + i18n("install.modpack")); + } else if (NBTHelper.isNBTFileByExtension(file)) { + try { + Controllers.navigate(new NBTEditorPage(file)); + } catch (Throwable e) { + LOG.log(Level.WARNING, "Fail to open nbt file", e); + Controllers.dialog(i18n("nbt.open.failed") + "\n\n" + StringUtils.getStackTrace(e), + i18n("message.error"), MessageDialogPane.MessageType.ERROR); + } + } + }); FXUtils.onChangeAndOperate(Profiles.selectedVersionProperty(), mainPage::setCurrentGame); mainPage.showUpdateProperty().bind(UpdateChecker.outdatedProperty()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTEditorPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTEditorPage.java new file mode 100644 index 000000000..3840c693d --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTEditorPage.java @@ -0,0 +1,91 @@ +package org.jackhuang.hmcl.ui.nbt; + +import com.jfoenix.controls.JFXButton; +import javafx.beans.property.ReadOnlyObjectProperty; +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.ProgressIndicator; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; +import org.jackhuang.hmcl.task.Schedulers; +import org.jackhuang.hmcl.ui.Controllers; +import org.jackhuang.hmcl.ui.construct.MessageDialogPane; +import org.jackhuang.hmcl.ui.construct.PageCloseEvent; +import org.jackhuang.hmcl.ui.decorator.DecoratorPage; +import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.StringUtils; + +import java.io.*; +import java.util.concurrent.CompletableFuture; +import java.util.logging.Level; + +import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; +import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + +public class NBTEditorPage extends BorderPane implements DecoratorPage { + private final ReadOnlyObjectWrapper state; + private final File file; + private final NBTFileType type; + + public NBTEditorPage(File file) throws IOException { + getStyleClass().add("gray-background"); + + this.state = new ReadOnlyObjectWrapper<>(DecoratorPage.State.fromTitle(i18n("nbt.title", file.getAbsolutePath()))); + this.file = file; + this.type = NBTFileType.ofFile(file); + + if (type == null) { + throw new IOException("Unknown type of file " + file); + } + + setCenter(new ProgressIndicator()); + + HBox actions = new HBox(8); + actions.setPadding(new Insets(8)); + actions.setAlignment(Pos.CENTER_RIGHT); + + JFXButton saveButton = new JFXButton(i18n("button.save")); + saveButton.getStyleClass().add("jfx-button-raised"); + saveButton.setButtonType(JFXButton.ButtonType.RAISED); + saveButton.setOnAction(e -> { + try { + save(); + } catch (IOException ex) { + LOG.log(Level.WARNING, "Failed to save NBT file", ex); + Controllers.dialog(i18n("nbt.save.failed") + "\n\n" + StringUtils.getStackTrace(ex)); + } + }); + + JFXButton cancelButton = new JFXButton(i18n("button.cancel")); + cancelButton.getStyleClass().add("jfx-button-raised"); + cancelButton.setButtonType(JFXButton.ButtonType.RAISED); + cancelButton.setOnAction(e -> fireEvent(new PageCloseEvent())); + onEscPressed(this, cancelButton::fire); + + actions.getChildren().setAll(saveButton, cancelButton); + + CompletableFuture.supplyAsync(Lang.wrap(() -> type.readAsTree(file))) + .thenAcceptAsync(tree -> { + setCenter(new NBTTreeView(tree)); + // setBottom(actions); + }, Schedulers.javafx()) + .handleAsync((result, e) -> { + if (e != null) { + LOG.log(Level.WARNING, "Fail to open nbt file", e); + Controllers.dialog(i18n("nbt.open.failed") + "\n\n" + StringUtils.getStackTrace(e), null, MessageDialogPane.MessageType.WARNING, cancelButton::fire); + } + return null; + }, Schedulers.javafx()); + } + + public void save() throws IOException { + // TODO + } + + @Override + public ReadOnlyObjectProperty stateProperty() { + return state; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTFileType.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTFileType.java new file mode 100644 index 000000000..4b35a6693 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTFileType.java @@ -0,0 +1,148 @@ +package org.jackhuang.hmcl.ui.nbt; + +import com.github.steveice10.opennbt.NBTIO; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.IntTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.apache.commons.compress.utils.BoundedInputStream; +import org.jackhuang.hmcl.util.io.FileUtils; + +import java.io.*; +import java.util.zip.GZIPInputStream; +import java.util.zip.Inflater; +import java.util.zip.InflaterInputStream; + +public enum NBTFileType { + COMPRESSED("dat", "dat_old") { + @Override + public Tag read(File file) throws IOException { + try (InputStream in = new GZIPInputStream(new FileInputStream(file))) { + Tag tag = NBTIO.readTag(in); + if (!(tag instanceof CompoundTag)) + throw new IOException("Unexpected tag: " + tag); + return tag; + } + } + }, + ANVIL("mca") { + @Override + public Tag read(File file) throws IOException { + return REGION.read(file); + } + + @Override + public NBTTreeView.Item readAsTree(File file) throws IOException { + return REGION.readAsTree(file); + } + }, + REGION("mcr") { + @Override + public Tag read(File file) throws IOException { + try (RandomAccessFile r = new RandomAccessFile(file, "r")) { + byte[] header = new byte[4096]; + byte[] buffer = new byte[1 * 1024 * 1024]; // The maximum size of each chunk is 1MiB + Inflater inflater = new Inflater(); + + ListTag tag = new ListTag(file.getName(), CompoundTag.class); + + r.readFully(header); + for (int i = 0; i < 4096; i += 4) { + int offset = ((header[i] & 0xff) << 16) + ((header[i + 1] & 0xff) << 8) + (header[i + 2] & 0xff); + int length = header[i + 3] & 0xff; + + if (offset == 0 || length == 0) { + continue; + } + + r.seek(offset * 4096L); + r.readFully(buffer, 0, length * 4096); + + int chunkLength = ((buffer[0] & 0xff) << 24) + ((buffer[1] & 0xff) << 16) + ((buffer[2] & 0xff) << 8) + (buffer[3] & 0xff); + + InputStream input = new ByteArrayInputStream(buffer); + input.skip(5); + input = new BoundedInputStream(input, chunkLength - 1); + + switch (buffer[4]) { + case 0x01: + // GZip + input = new GZIPInputStream(input); + break; + case 0x02: + // Zlib + inflater.reset(); + input = new InflaterInputStream(input, inflater); + break; + case 0x03: + // Uncompressed + break; + default: + throw new IOException("Unsupported compression method: " + Integer.toHexString(buffer[4] & 0xff)); + } + + try (InputStream in = input) { + Tag chunk = NBTIO.readTag(in); + if (!(chunk instanceof CompoundTag)) + throw new IOException("Unexpected tag: " + chunk); + + tag.add(chunk); + } + } + return tag; + } + } + + @Override + public NBTTreeView.Item readAsTree(File file) throws IOException { + NBTTreeView.Item item = new NBTTreeView.Item(read(file)); + + for (Tag tag : ((ListTag) item.getValue())) { + CompoundTag chunk = (CompoundTag) tag; + + NBTTreeView.Item tree = NBTTreeView.buildTree(chunk); + + Tag xPos = chunk.get("xPos"); + Tag zPos = chunk.get("zPos"); + + if (xPos instanceof IntTag && zPos instanceof IntTag) { + tree.setText(String.format("Chunk: %d %d", xPos.getValue(), zPos.getValue())); + } else { + tree.setText("Chunk: Unknown"); + } + + item.getChildren().add(tree); + } + + return item; + } + }; + + static final NBTFileType[] types = values(); + + public static NBTFileType ofFile(File file) { + String ext = FileUtils.getExtension(file); + for (NBTFileType type : types) { + for (String extension : type.extensions) { + if (extension.equals(ext)) + return type; + } + } + + return null; + } + + private final String[] extensions; + + NBTFileType(String... extensions) { + this.extensions = extensions; + } + + public abstract Tag read(File file) throws IOException; + + public NBTTreeView.Item readAsTree(File file) throws IOException { + NBTTreeView.Item root = NBTTreeView.buildTree(read(file)); + root.setName(file.getName()); + return root; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTHelper.java new file mode 100644 index 000000000..84a533a07 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTHelper.java @@ -0,0 +1,12 @@ +package org.jackhuang.hmcl.ui.nbt; + +import java.io.File; + +public final class NBTHelper { + private NBTHelper() { + } + + public static boolean isNBTFileByExtension(File file) { + return NBTFileType.ofFile(file) != null; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTTagType.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTTagType.java new file mode 100644 index 000000000..65c4de7b9 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTTagType.java @@ -0,0 +1,59 @@ +package org.jackhuang.hmcl.ui.nbt; + +import com.github.steveice10.opennbt.tag.builtin.Tag; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public enum NBTTagType { + BYTE, SHORT, INT, LONG, FLOAT, DOUBLE, + BYTE_ARRAY, INT_ARRAY, LONG_ARRAY, + STRING, + LIST, COMPOUND; + + private static final Map lookupTable = new HashMap<>(); + + static { + for (NBTTagType type : values()) { + lookupTable.put(type.getTagClassName(), type); + } + } + + public static NBTTagType typeOf(Tag tag) { + NBTTagType type = lookupTable.get(tag.getClass().getSimpleName()); + if (type == null) { + throw new IllegalArgumentException("Unknown tag: " + type); + } + return type; + } + + private final String iconUrl; + private final String tagClassName; + + NBTTagType() { + String tagName; + String className; + + int idx = name().indexOf('_'); + if (idx < 0) { + tagName = name().charAt(0) + name().substring(1).toLowerCase(Locale.ROOT); + className = tagName + "Tag"; + } else { + tagName = name().charAt(0) + name().substring(1, idx + 1).toLowerCase(Locale.ROOT) + + name().charAt(idx + 1) + name().substring(idx + 2).toLowerCase(Locale.ROOT); + className = tagName.substring(0, idx) + tagName.substring(idx + 1) + "Tag"; + } + + this.iconUrl = "/assets/img/nbt/TAG_" + tagName + ".png"; + this.tagClassName = className; + } + + public String getIconUrl() { + return iconUrl; + } + + public String getTagClassName() { + return tagClassName; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTTreeView.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTTreeView.java new file mode 100644 index 000000000..ff61fb57c --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTTreeView.java @@ -0,0 +1,152 @@ +package org.jackhuang.hmcl.ui.nbt; + +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; +import javafx.scene.control.*; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.util.Callback; +import org.jackhuang.hmcl.util.Holder; + +import java.lang.reflect.Array; +import java.util.EnumMap; + +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + +public class NBTTreeView extends TreeView { + + public NBTTreeView(NBTTreeView.Item tree) { + this.setRoot(tree); + this.setCellFactory(cellFactory()); + } + + private static Callback, TreeCell> cellFactory() { + Holder lastCell = new Holder<>(); + EnumMap icons = new EnumMap<>(NBTTagType.class); + + return view -> new TreeCell() { + private void setTagText(String text) { + String name = ((Item) getTreeItem()).getName(); + + if (name == null) { + setText(text); + } else if (text == null) { + setText(name); + } else { + setText(name + ": " + text); + } + } + + private void setTagText(int nEntries) { + setTagText(i18n("nbt.entries", nEntries)); + } + + @Override + public void updateItem(Tag item, boolean empty) { + super.updateItem(item, empty); + + // https://mail.openjdk.org/pipermail/openjfx-dev/2022-July/034764.html + if (this == lastCell.value && !isVisible()) + return; + lastCell.value = this; + + ImageView imageView = (ImageView) this.getGraphic(); + if (imageView == null) { + imageView = new ImageView(); + this.setGraphic(imageView); + } + + if (item == null) { + imageView.setImage(null); + setText(null); + return; + } + + NBTTagType tagType = NBTTagType.typeOf(item); + imageView.setImage(icons.computeIfAbsent(tagType, type -> new Image(type.getIconUrl()))); + + if (((Item) getTreeItem()).getText() != null) { + setText(((Item) getTreeItem()).getText()); + } else { + switch (tagType) { + case BYTE: + case SHORT: + case INT: + case LONG: + case FLOAT: + case DOUBLE: + case STRING: + setTagText(item.getValue().toString()); + break; + case BYTE_ARRAY: + case INT_ARRAY: + case LONG_ARRAY: + setTagText(Array.getLength(item.getValue())); + break; + case LIST: + setTagText(((ListTag) item).size()); + break; + case COMPOUND: + setTagText(((CompoundTag) item).size()); + break; + default: + setTagText(null); + } + } + } + }; + } + + public static Item buildTree(Tag tag) { + Item item = new Item(tag); + + if (tag instanceof CompoundTag) { + for (Tag subTag : ((CompoundTag) tag)) { + item.getChildren().add(buildTree(subTag)); + } + } else if (tag instanceof ListTag) { + int idx = 0; + for (Tag subTag : ((ListTag) tag)) { + Item subTree = buildTree(subTag); + subTree.setName(String.valueOf(idx++)); + item.getChildren().add(subTree); + } + } + + return item; + } + + public CompoundTag getRootTag() { + return ((CompoundTag) getRoot().getValue()); + } + + public static class Item extends TreeItem { + + private String text; + private String name; + + public Item() { + } + + public Item(Tag value) { + super(value); + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name == null ? getValue().getName() : name; + } + } +} diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Byte.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Byte.png new file mode 100644 index 0000000000000000000000000000000000000000..02ef065ad5c359671e4d6f28dd9f355d9e22d986 GIT binary patch literal 1245 zcmZ{iX;4#F7=}*>SqQmFNbbE!Fc2gS5VGAQ>J_S0BnXJ0AZ@LsEr|O@)S!Y?h%sye zmaVd=Y>J?ege-*MR$CBhZD|X%wbhFKQ>W9Jwsx?JN_sofKmE~j=KG#`-F!@1dGV27HWgUfJiz$p!Kgw<d&6RSgB1PjXcwX$gwE`b+V4$FJh*H*H>pWR>M*&svLkZ2TyK*XcYl`E2{7a zurYJP)Z~<-tz*pLdOG{$*O{4)n3Qf#lnc=sAo|HbK^HZ2^mv`Mwe2u1)WQtAT3kNT ze6EEhaU$F-rDs{vMxLyWCu!h@pMfKLQI(Uca`F@|SncFSA7s%AcngbolB0ZS5iBW2BqlVn z2#F}*hZUmYLT*SQTX>iyG%^?LXNDdM5N7i@>hqEw;vbVXrzGleY-lKv5Hw?QY69(N zlGu+IGx6{-pRhQ&IcbLouKc$M0D#HdL?!!3fG12!j`hLPEtLY+<z7B9h<#>Bq5Y`Nw&uwrH0 zs(4(Vuo_QHN?wz)7Nn-dty_<$XKcuP{f#%*Y%m+`)StIa+D98Q;e&@<#6 zzH;^2^6NJ~0yjVYWMuT#*zNI8KfCk!7ZYECufCp~n*Qe7@9uv8!@c`IKA1`8>=7y- zip|8Hq{f7e#w|IbFuCl`z<&aJ^S12V WR`CCUO-3U`1VC~^n%=r9`}p6#61IT= literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Byte@2x.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Byte@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d74c1bd5679c68c632bdfacebc709994da979c6c GIT binary patch literal 1839 zcmV+~2hjM5P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Compound.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Compound.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd9d695b7b21ca7196e4d05b0504e37e64d3740 GIT binary patch literal 1305 zcmZXUdsLHk7{`BH3{yxDL&H=wQNqwMES0pxKtKf%C^aiVM5Qv#rXU&ulEfWh>>_Lo zc*kzsFCvH_APhwu$TluxgE6*uDr{pHVH>dCPW{vAoacGI=lh)V`RjY0CnYG**JhdH zG5~;$zn^z7qPBncQVV3dxUC35#PYmXfENJOSbn#3un@KvwZ` z0Is3{cpV0SCjo%fmkXMX?FGPmEa*t6Pf-yQDygASYscH2-R!J>PS4}<@p!yet1V-dk;!DSSWF}kWH4-$ z$>i5!RC)MC-iT4D(du;Sx4K1>X-qUuCXsYH9g#?sN~IJErJvJhtZNcmE}ycnmN~mC z(sNAn2K|EJ@#8i+ojz}zXE9kg98M0yl;UE3_cQ77GgH9aWWJIEoH!V4f3K#hRw$Ov zwRdzf7>tF5g@S^Drp87r9DX*o8U!y6m{SVtt9FO;+ALj?uV?#pd?( zJg=yzXl-r9=3)gC!_`9kt*ZS;an{>QU93aSo3Ek(%fgt1o~dbNUtfQDdHJMtvV>C7 zz^*?%5aiHq;mEPt)Mvjc;SjLT1ps$4lHJ_GW-w@ay&i&~%*;%IKtLuHKI1-35@GDy zf!zz>&}-pX=(g1lzwhAvH>OG`5{GPpc$US6JPT*MGT8=KzS#I{Cv zIi7kR+&(reh3BW#MlO$Eke@G?%c)dqdU`sS%S}s98=D(?^?~w`_I!*mc_{ zZrgVNlsnpE=ck|T+P!O!tLNu?_kl0I-0yYZD{r5JzJC6P4jW+U$6Xzxq2-+=6Wm$xN-CMxLffF ziMNyfxPwmq6QEO4)6z3Cv$F5zn6mcQ+6B zP!!q|wa0TOdK(Jmi9%&x0OkJyE?zntb?*BA0gv7P07v5$2N3}H`viJd90*JN3oT~B Ah5!Hn literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Compound@2x.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Compound@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..efa4da374979ee01c6099837e5ca8caa0c088ca0 GIT binary patch literal 2230 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 eGdMaiH!CnOIxsLW2lyiZ0000s}E literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Float.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Float.png new file mode 100644 index 0000000000000000000000000000000000000000..0f972a8c22b86a5e9228638c517256378edebe03 GIT binary patch literal 1275 zcmZ`%c~n$Y7{4f{NhEGyE{SY2y!&R}V?Yx^1sYOR2$jri6LHDXR6Oj5MYF8$|8`E8}H4$eO978r_(8c>3UB8^hf7>-~HY1cfQ~Ge&@UQU}nbB zz=<;_0ssQjmT6Zb40@Oo#-dZHnzROi|JLO6WB|?|4H(WIhw9LrWvkNx*dGPJfdT;j zM$`c(0DDLP+#3K$&;by#i)vhz2*8-u%#~TGhmBYTHQQjGt}hRvOfxBCC}o;MnL`Yw zV1scsWehf!O)oW1)tjfB)M-vvM6&&HtPQg>I7?&PfRdx5Ia+}_g(ha^Ivp^hR;tYJJuxCQ8SAFjJtW-)2nE-kp!5Yt@0 zu&p&tU}C&H8jb0yBRrl%O--iGj%2qhO%{{9&P2DUky*mc;XD&vVj%R@5j;cMZD{Th zpYOqg2Y-%^iawufc=&F2*LoYRmN}J+$2kTop$MubN@Pek4><;Uy+uCXuq+83UCq7y zEgkI_td+}cHjRT<$O0^(R8&o*NE03&;~CuJF1lE!H(Fv_S`!=V<8O4ti-Ow0g*yZ# zYg6hdNS%q|2h<)O3do74u&Ke^)us8(Gv6Z-4pAj>n1faF4AdEjvf3z*fQt-1=qhZi zH*{WwZdom|3MY#@?a;*$!hl+DAdR*2L>hW{QW_wJoW~j(jO|x259;Kg#6kICs2u_+ z(3n9F%g=^87&yoiZkBY~v)ivzrn0TKdI`6TOFWbXT(B$j$YgB~~6@O0v$#b8NNa>_H> z)MuA2OIyBTWqJm9E^}4NYVDe==hwcl?#1;lWq_9v@rw4<*EVEt%-OVg%U1CEwpDMu zxqZi5J9q8QeLHW@UhvMl`}V*0{s$j^bl~IsPYNb~3O+0R{9uvx&=-e~96fft_{2$Y z>U4>&RI4{oWk!=Zue<_O7FJoT+UlA!XU(-=es%6^@Xh%P7wfd&eplb{ePdJer5`}c zkFA&6u3Y`;+Vz6=X1t>lblvFg>HYa;W?%m=w{G9Ldk+lIjLpt+ydX-l!|8HQYsih; z-OXP|+ltIfU6;2hJ8yGBPVQy|KtpO`Rb-4RHYSVIB#;Xd=97>l6Hu&OUh*Hoj-8vf YZQ1w#f)xSx;ll?>OU=-pOWBbB5C5liUH||9 literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Float@2x.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Float@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed909054afa47f9c79bc76da3a9ae7c2e55397d GIT binary patch literal 1647 zcmV-#29WuQP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Ri0UrVeGH-^>ivR!s5MyCZb^rhXfB*mhfB*mh zKmY&$0L}VZy#N3OS4l)cR7l5lmc6eeM-|0?=T`O1yzzc`Sz#LqTb2O}5m6+?$ z>z;egxuqZf>dhCQ++W$K9ZE}Kg-jS+@d`i<5+yX#ao`mM8X;lXuRKIrkVv6Y50_u7 zMGo~^M&~Zoq=Y~b0D&q1xgADEzvbE5Wp4OdFP#bKly}S<2N(9ky*}rd_3w1URj;9OeKW zBntGXhxPVqwSA~CG)-!7jnJy6=FU!hvCab3m@-I`=p1{HI%+u5c{o(_*|CSS1Swju zt7UBMQH=?-NC>0rVAQndiu_asaim&k^OK*xb>q1QDmya-hz1}3=cD(p9)GCK1Gp^5 z4+X?>K59XQrz-$X%{OUo-+BdJgbu?Zy8nLgmtU{fm#@C&i>=56GV;WZ#ZM$f80Wcp zrkv0qF%e-KR

0V<<2@e84zvR92EuL+u*8%4;kNW_AVVmCS;A`|V$>HY2f{6i|9C zdh+j&K79T&8@o>y5@b@7C}*En9lLz)|Bi5+v2J(okH7uuo15FWc0miLqKfwAujJ=n ziCP{98AqqmWF~XUnmx1k%*^aXPwQbSOwv&IZ@lrs^SAfKrC3-nkn8ou7}aUVfttc^;#P&W1PbL&SnkB23dlQSQqPnd_*=fg!UC8CrPA<9wWF%9vP zk|W6Cv9JqeaJ&N?tBmO_rZk~gK&~mC@#Lw=ZX!!k5>6Uq?vq3F{+OAWg1`kL{%?%T z*eUDsnrCovR##m6;Hd=`R?cHt30dU`GtG*iL8K#S&G+E}Jc1jLQ9Klt zs!TpDPsDtAX^^ROrj;q`Jh>caXo6Z@UHJ{h-Bbf@{{O z+2#^*i58Nog;ml+ja8=6lzE5p;>OhvzIS)Ouh~5eFK;g%MFCu%8hP_2Fmr<1F?cxS zDqO=+M_R_v^P&uc-KGRUD$3fohP|>+*CoZ;C;zzSyf~x+6HOv>)%%7RaMY+}zxN;R z{Y|aas6eV&NX4nlqO_fku$yAJnN4ARYDaHozQ7@esUt(Hs`cvS-dAJGLUESa0HF1L zY)od>Qd;j(OJ*+7J^i)(4!chYNLjQ}dcXNUd~!CdzB(z20000bbVXQnWMOn=I%9HW zVRU5xGB7eTEif@HGci;!F*-CjIx{&dFfckWFnW6_JOBUyC3HntbYx+4WjbwdWNBu3 t05UK#Gc7PNEi*AxFflqaI65&mD=;uRFfcF&_#*%S002ovPDHLkV1hDg>GS{q literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Int.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Int.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8dba8fef65b6fca74e3dc5e32f126fbb523669 GIT binary patch literal 1299 zcmZ`&X;c$e7=5@U1dt^t$%G(FB*`SRPm-C$uqaeep)Rzws~{k*#U&`vfN`(gltNpr z+KO800$FD!0jaiX)z+f8wTfD+wSv;t)>eD8bs5j;pZ@5N@7;6ndG~zhyWe|jCl-#4 zl0h;6KvaHS&SVi|o|JT;c5VslenT$a*%Cn@`MtSUX zYX%dr(_SdtrHY-I!L-}0oi=lbr8`)X%eJ+SvA1Q}y%{#2h2mM0U^NSNTW1!-D<$=+ z=rTJUu$hBail>qGOxAy+|IQzG|GIns-lfZb=GeAbj9!)!EkQfkrk2#GVk%gYx6nZg zCYTK&682Uv*?a%*hkZBuSFPEZW!*#>JQh4?BSS3VQ%al+Aso&Gr`{2aM9@@}^q;j}c zAYjgf@@CAdkkqN-W?K-B!U7n~p_-sB$!ADw>FaxVy!$)}HyDxwSUQjEIT{g6s3&2F z(}D;T#$kF6P2-Pu_mH|qILVJ`{Dd|@8^vpGh15x5JPPxOhS#YB22D$^*uDEAp>NbD z`3NmX899}F9)ku=sDOzRr3>%~-Z*k+S62_FYcizpxF$eo1qumTP_I%}55>=6Fy4ak zgi*lt?Qk*=YnuCd@0~k$jm8?_R4=LJDL7=p+8N9TMbxW?S1^R1B{&ntBXGMJ^Bg&N z{n4XGN00QIiDne`n~)9*(GEpARS9!hGBk<~v1E`!LpI9Yvi)%D?)~mv`*t)R$j#VF z8+kLamoarPlwT3K6dG2^5J4LqUQF^3QcEkQ-I1*j zUw_#2@nds3$DO)*OC%CUenGCJH*CZJIeX&D?F3PZDJ>~nEMnHbC4LkD8l+LHMXM@5 zC%Z^-IxHsa)wM{4Np)gAyuL}X#_}4Nlnv?OxNo4 zu)&C+7{CdVqD^KC!&+^l>=~ILD|_^qoZP3z=H-tYKcS%TX^=c|(&Q;c&pi9w)aPG# z@uinv0n>_0rk9qL�I=YxbPE^Iip&^A{{!Z^R2hvS+~C7-Nw~T?}@_uA8gq8;ik>&w|w;R*5+;7cYse?KHa%%_ny`^ zx5w-A2ROhB!BBh0-pN`tA4Id1tFHq;^Gih-r;<grQG}CL+-#*y1{}BI_>M#6?*AC(RhG?~QS<+Xvl}nPJy}S8Zefmlbn)`X DFkjTt literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Int@2x.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Int@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f6675ee4a0759dcf59c5a73bf7b9d3c0ee865e51 GIT binary patch literal 1613 zcmV-T2D15yP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_List.png b/HMCL/src/main/resources/assets/img/nbt/TAG_List.png new file mode 100644 index 0000000000000000000000000000000000000000..37a8d367252bacce88f743eb649483887fde3a33 GIT binary patch literal 1293 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 AOaK4? literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Long@2x.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Long@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3e77c4bff1967dd831a7a8dbcd3baea95b81aaaa GIT binary patch literal 1409 zcmV-{1%CR8P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Ri0UrVeFARX8QUCw|5MyCZb^rhXfB*mhfB*mh z00000Ag*U3JOBU$X-PyuR7l62mcNcQtln(l@_xsv>1ooQ<7qxdKk5OkbDPS%Eepleo!L z%FVtKhg1IcyFWm6)ghJ9`n6&y2!T^Ai7lX{prsGElUH{D(*hZpV)Xg~Mv3S(G+Sb3 z$r2F@q%uc3$3#hUQqrQFJx1OEB1#EFLJV?J5GgIyWtGLwv06qy-M-}Ckl#s}avWNvmM3MxjpZpZQ2=Bv};q4dC9(%SJyd_f5{+y3eN@0=0rO;89 zZE=v4BC|r`_2LME$73AFRGTWoPJGc*DL&h7HR7yaDt!}}poW!%1kc+4BRIg-bc+>M zG44eYpb9A4fK_?5jym`*ly7iW2si8!u*fb4rMBv0<)JnOx~RuJ?e1v42H-n>OQh?r zIyU$V!bORd&dx)u1y078V~j0^=T?!||FvXY0Q`UFe6^H^nE`z%NG^@}ujelPcmMJ* z02hr@7omM)DXI#aAl+kG+Umrw#7?hZ1d?c-yxOrv1pAXcN6xnQ``5kckr0$N-8*@2 zeD@GZO8qZ&u(f4TAhyqK68#6e_5u0tFMY))BfTE%bNjn*@_GDLuq1FP(Y<&GXua)? zAd}#zA2J3NRfCeWf+mC{ZS&wk?w6;vlG94d%OYvY9MzkJlZVq(std`wmup%*z>(BR zMG=$OYpS@a)0C|VX&ZT|GXNGo=h8(|o!iWJzWuGQK6(1=c$Bj;d-c50+V4O9(_f$c zU3z(GP#{5^i_A+U385pa1IDzxd5>PraSg zQwFuwR7)xK^RD1M(YF;3j~732~r%d;O*1(TlnvL{YUo2oa@~+QdXg& z8cED-?fR;J2JgXP_oQFcQ8=va!lH$PIY$3fRtou|+w^;Gf|yk|t$+Wck3RV9`O`U) zskpl~p(SBCwtRf_Y4YNDHEN*?Wnb=GxQ`BHHC1n(tSRovZR?+m`TWU~<8(4B#WtNr zQ@}V-u6AARrq}J&feNHZ7d0oIHD^Zy=yL#>NwTJ~MbvKk;qy*1Nm;!@F{B75iACvz zC>_+gQ<);n@hEvtggdz*$CrQp7!J5dkYS)Y4dEi76Ef+f$lMIHNs#bF4H{E>w;wO? zT9*1(Za!Jdw`k2JXBML%RpBtZ@X%@PeMz>>S57kLET|btGp*b!AkUULPdJbL^k0+} z$ySWk%2@ya03~!qSaf7zbY(hYa%Ew3WdJfTGBYhOF)cGOR4_3*G&njlIV&(QIxsML zdnr5s001R)MObuXVRU6WZEs|0W_bWIFfubOFflDNF;p-yIx{#rF*hqPFgh?WFbDV} P00000NkvXXu0mjf{5gWx literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Long_Array.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Long_Array.png new file mode 100644 index 0000000000000000000000000000000000000000..8b962bc5c36389655c3574aeba7de6be3989b897 GIT binary patch literal 1290 zcmZ{iSx{4V6vqGAxFLX9Ac9NP3RqFmfNiZ{TT!T>f{JLhRV$)c7ZfpWVGV>3Kny4( zH@VppiYtnu34|qVk_xV9i{J)C5>X*qwG}Ye>r7wz(1&w=^L;bl%$aje?#ieoZj|v9 z0DxOWcxW_6+NUBDus+?Nx*7v%`OIbcT)B?;($EI@@1s>dZi_Cu*;eG%Wxz1=rovT8EU6tf_Y%G8C26Y!xL# z10h$G-MynI+VP|(@nktpP)bm?;MGk)Y+7vSF!tEq3=iM7KA&8m@!%npG%X~pQa-S} z{^xygVrrQ5TybZwuc8*fEjVQ>L2C5mYt5E{&VH*8U&`bml$Ixdxob4B$5M2~(5pmCGRo zNpxlQk-|X~T`w%d=hqMjW&B{e?OfIJMWh{iS^oU%h2e^^i-i8MRU&U!_U-*8*clRT_YFi8=t-E!Uhu{ z&ifGvHfXvngTwDa!{Px`t>L_Wt!OTKhpAC8oq_hmN%RVtAH7L3) zDC%e*c$s7{&&h;?1=0lq$-Iohgj1L5UcCGpMY}9dr{zlNX$W->3@Hs;TJM~>b+@wf zetcO4RB)cGXdo(U09?KB^3BtomWyp2MOCIr1u9y)jJ_LoQyN|6dS;%|D@QRgzl`ZZSbsIwkG&;lG zgE`jIYuxw=6F-|Y8BF8^70M!@Qfsuj(%;HXo;rQztm0fbIDety;-$*VSM-LeYGX}p9jG@oG&VK2 zTx~V~eyy$j`VDaN*6lkTckli2XXpK{?gtMafyYmJdiyL-`>nQT1J7T)9F#c@UJ$^TE1v==0^kIN+AFM literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_Long_Array@2x.png b/HMCL/src/main/resources/assets/img/nbt/TAG_Long_Array@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a66fab0e71ee04fe07f7629f0fbda563bda57859 GIT binary patch literal 1879 zcmV-d2dMaoP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_String.png b/HMCL/src/main/resources/assets/img/nbt/TAG_String.png new file mode 100644 index 0000000000000000000000000000000000000000..732baeeac90f13d594fcf33497516d520a102ee9 GIT binary patch literal 980 zcmZvZYfPGV6vqE-Yl_-howYR0lKN${$>Mxf)^?^Jv_h=uG+t1*w9P=o&MaiC;-y=b zIA=jERIG9p%1s54%lndLZKg46yd^qQ9SBamfS@Ac1@V5}+iYK!>?F^5a?Z)`d^o2* zJ1hNs=#@|a!1;_jgk01k-U|CJnycm6==CzA;f2BQ!f22i4GNP{3BxJ` zRwIZSF{{mHwMHw2Rpz<5Ij?tldV1RH_4@s*Yin!k>+2gEfxt#!Gq8z9a5L!ht-vs1 zRGOBSmTWfL=;-M7_V&)s&febM{{H^a;nDH&@yW?aFc>r=X1(0ta=A<97eYzh}mrJ>FLo*IyoGUOePx~ z9F#~TQmM4FvlBMKZNiS(*;%{YzP!A=u&}VWxajx$jYgx2uXap31_lP&+S=4=b$fez zM@NUjU{EwGr>3U*`udbgrO)SEU0v0q7vae#Cnudwr^Df}TCFQ9D_vb((q}T8-6j%= z#9}d*%aw3iCnhHP`}?(8txl&K9v-f%s}nsHcXxMtJf5MUA&bQ#tQU=pj99Ezr_1%% z)Rac675u~!a(@xCl?x2VxwBDkqb^wPhZ|E zMIQ(-MR(H)4NtzVtU!yi%#2Lp*(J=?ccMOf+LAzU&Wvv;s2_EjG`Aa z2&tsY7Al!sTvS4#(5OpJk7s_-Lvb#+aS<2azZ4lAC5#ZZJTKuj@tX^?Nx8WNIr;hd zd3N%c^-tS4f6S6MR(KsE@u4E2}Fj_uwjjL_%k(%-xVocTJL4nMe$4K|L=!M-kL{h{~sKEUCG)3-31qnM}nSvC5q-o2`@ z2l1(|Yj4we)zX3GTIbrcv|C z?tXLchxAzBElY{NdhPTIdZ!PW#4nh|6eca1`iO=aNQ4rT;-G}Mqy!R_m<-)a#^3lD nf|4O9?l}SfAAtUCacRlp{{is-0QA_!XcPb$#4LjGHo4|+kx2Td literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/img/nbt/TAG_String@2x.png b/HMCL/src/main/resources/assets/img/nbt/TAG_String@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5f534e240993fd1cb5d28a8625e15c65bda1099f GIT binary patch literal 1537 zcmZ9MSya*q6vqFVnPrxhqc%0hF>A_f!ZcG_COw!-QAw88X&Th9#WaUeE36b`5nK}m zStL<*Tu@0;b0cjzxTa<pr%)@to=YIEmZ}(o(`LpiE>wjDi0D!Tl z2NbR&=(`M8>nfB>ex-x{4HuXT02C%0E%~qcJ`D7L!vFxi2LNJl0I;C5VnzTU0t^6S z2mpX&0DyTItIYct0IV84f5yixFN-M<5_o)^fQJ+E@jNb8z#|CxM1e3)BqE8$WU(Yp zA|~@iaa=)KVVXQACx^q~WM^k*Wo2=>Tpo`n5{ZODVG%_>Gcz+gJFC%Xv|8=L!ovLg z{LB}PfSd(+3c@hzow<7$K0ZDn zA)%|QtFyDSySuxmr$?ny4Gs>DkB`e_G8_&^Bof=(+dqB!M4?a!1VTzmijX9x(P(31 zV+{=radB}UKYmO~N)p70s8s6c=xB0sazR0XSS;odg-WIJ`Sa&>b#+{VAT>30cz8Gm z&#$PcC@U+gs;a84uCA%6sjaPj`}S=%j+ceWPE1T>$8ZJ)2IO*iNlA%9p~#HR8X6j6 zJ$_0ek^1}lb8~Y`OG|rud!wVH8yg#$kJ!!4&5S5keSQ7Ackk$EW>Zs>R4S!M(P>fi z^z?LE6qELV!Fa&rJR&i$AsI2jR7@}p8%mG8%OarIqzDcvGMjvl8-HJr{7{(kD3=nG zmyRi7;0kHjqKw#L22sRGTv=J6*(5mYwqaGkX?JM0RMnTDYu1K)!rayluiB|+Xlt}y z6{NFF0{zcM>KOB{PU;BKq@g1KKyTg?>f+<1yqLP^OF>w??kk$O78~-*hn}m=cfhs* zhaGGj?T^?6kOJ}Pm$;Xyc}kQUGVte$|oyx^uV_u~PRYK?xg zn&`15WS0dMIXda*Q5UF=1hsIBa}Ho5xz5x9dl|^k&bB(CYV{VdzdK_fWAZnL6!I&0 z;fE>%v&g9}bQPS6yooV`xA@p-ntt;8P)sxb6LqiY1fD-41c?1d8D3U&=;Eg7L6^%7 z=7)CFebrcwO&;CwWp2)VD3i4D++Ou+u}yHSyVJ6e?@36$8U#5Cp==Jn^TyVAJHy&{ z!AT-UWA%kdOGmt7M7yrr);PfeAL=bTM|k-*u1OT@P`mEumeHJ&0NSb7jTs4VfE}m3 zugP7b>X~60)}WJPH4VBEvF|Dg#2x%&1h*k;7U?cWbxvrZk%M|cDAbHq*e!DG!L5cI zB~mpe@k-^32nNC{l+A1Q#DpQCa}e6Th)P>Z{rh`g5~-paK{Jepsevx{txKPs$}upF zPjM$+Xh?Fo>mwsCv;A%UdWf6D4Z~_^V-YuN zF?LCmeGK-rYw&Z6-!bo`1AD#R5EN-3k{P#aXHA6K5{xi5HLBaXO@`2_)zN;UkF%}q zPf)%cOH0kom@oO^4Cp~~bK13vD_79V3&zqHOB&VUrk%e&UidPvq!sj4u4w0t;ItLj z(y=z(5dgcx-TcC@`-dYTfheR7z#;G<`vYLR1NL@4U^|F|6U5$mKNt)FgV9m@bZ_=Q kfsnh`Zv{R0U%=i8Vt3@90C=r-mo5N!x}AmQyCSfE1An6$Z~y=R literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 1644d6606..89b3eabcf 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -906,6 +906,11 @@ multiplayer=Multiplayer online multiplayer.hint=Multiplayer online function is under maintenance. multiplayer.hint.details=View details +nbt.entries=%s entries +nbt.open.failed=Fail to open file +nbt.save.failed=Fail to save file +nbt.title=View File - %s + datapack=Datapacks datapack.add=Install datapack datapack.choose_datapack=Select a datapack to import diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 8c184bcc5..18747cb7f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -780,6 +780,11 @@ multiplayer=多人聯機 multiplayer.hint=多人聯機服務正在維護中。 multiplayer.hint.details=查看詳情 +nbt.entries=%s 個條目 +nbt.open.failed=打開檔案失敗 +nbt.save.failed=保存檔案失敗 +nbt.title=查看檔案 - %s + datapack=資料包 datapack.add=加入資料包 datapack.choose_datapack=選擇要匯入的資料包壓縮檔 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 7d02fddce..7008c8293 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -779,6 +779,11 @@ multiplayer=多人联机 multiplayer.hint=多人联机服务正在维护中。 multiplayer.hint.details=查看详情 +nbt.entries=%s 个条目 +nbt.open.failed=打开文件失败 +nbt.save.failed=保存文件失败 +nbt.title=查看文件 - %s + datapack=数据包 datapack.add=添加数据包 datapack.choose_datapack=选择要导入的数据包压缩包