From e6fef246cbfe611760a03f39f0ee6af202cb8dfe Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 22:10:21 +0200 Subject: [PATCH] Move MapleEmptyItemWzChecker to main module --- .../mapletools/CashCosmeticsChecker.java | 3 +- .../tools/mapletools/EmptyItemWzChecker.java | 329 ++++++++---------- .../java/tools/mapletools/ToolConstants.java | 1 + tools/MapleEmptyItemWzChecker/lib/Report.txt | 149 -------- 4 files changed, 147 insertions(+), 335 deletions(-) rename tools/MapleEmptyItemWzChecker/src/mapleemptyitemwzchecker/MapleEmptyItemWzChecker.java => src/main/java/tools/mapletools/EmptyItemWzChecker.java (65%) delete mode 100644 tools/MapleEmptyItemWzChecker/lib/Report.txt diff --git a/src/main/java/tools/mapletools/CashCosmeticsChecker.java b/src/main/java/tools/mapletools/CashCosmeticsChecker.java index 37641bf0e2..696f3218b1 100644 --- a/src/main/java/tools/mapletools/CashCosmeticsChecker.java +++ b/src/main/java/tools/mapletools/CashCosmeticsChecker.java @@ -21,7 +21,6 @@ import java.util.*; * Estimated parse time: 1 minute */ public class CashCosmeticsChecker { - private static final String HANDBOOK_PATH = "handbook"; private static final String INPUT_DIRECTORY_PATH = ToolConstants.getInputFile("care").getPath(); private static final File OUTPUT_FILE = ToolConstants.getOutputFile("cash_cosmetics_result.txt"); private static final boolean IGNORE_CURRENT_SCRIPT_COSMETICS = false; // Toggle to preference @@ -481,7 +480,7 @@ public class CashCosmeticsChecker { } private static String getHandbookFileName(String fileName) { - return HANDBOOK_PATH + fileName; + return ToolConstants.HANDBOOK_PATH + fileName; } private static List fetchExpectedCosmetics(String[] cosmeticList, boolean gender) { diff --git a/tools/MapleEmptyItemWzChecker/src/mapleemptyitemwzchecker/MapleEmptyItemWzChecker.java b/src/main/java/tools/mapletools/EmptyItemWzChecker.java similarity index 65% rename from tools/MapleEmptyItemWzChecker/src/mapleemptyitemwzchecker/MapleEmptyItemWzChecker.java rename to src/main/java/tools/mapletools/EmptyItemWzChecker.java index 6636bbcf50..f696d319a1 100644 --- a/tools/MapleEmptyItemWzChecker/src/mapleemptyitemwzchecker/MapleEmptyItemWzChecker.java +++ b/src/main/java/tools/mapletools/EmptyItemWzChecker.java @@ -1,72 +1,38 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as - published by the Free Software Foundation version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ -package mapleemptyitemwzchecker; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Stack; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.*; /** - * * @author RonanLana - * - This application has two objectives: it reports in a detailed file all itemids which is - currently missing either a name entry in the String.wz or an item entry in the Item.wz; - And it removes from the String.wz XMLs all entries which misses properties on Item.wz. + *

+ * This application has two objectives: it reports in a detailed file all itemids which is + * currently missing either a name entry in the String.wz or an item entry in the Item.wz; + * And it removes from the String.wz XMLs all entries which misses properties on Item.wz. */ -public class MapleEmptyItemWzChecker { - - static String newFile = "lib/Report.txt"; - static String outputWzPath = "lib"; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static String wzPath = "../../wz"; - static String handbookPath = "../../handbook"; - static int initialStringLength = 50; - static int itemFileNameSize = 13; - - static byte status = 0; - static int currentItemid = 0; - static int currentDepth = 0; - static Stack currentPath = new Stack<>(); - static String currentFile; - - static Map stringWzItems = new HashMap<>(); - static Map contentWzItems = new HashMap<>(); - - static Set handbookItems = new HashSet<>(); - static Set nonPropItems; - +public class EmptyItemWzChecker { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("empty_item_wz_report.txt"); + private static final String OUTPUT_PATH = ToolConstants.OUTPUT_DIRECTORY.getPath(); + private static final int INITIAL_STRING_LENGTH = 50; + private static final int ITEM_FILE_NAME_SIZE = 13; + + private static final Stack currentPath = new Stack<>(); + private static final Map stringWzItems = new HashMap<>(); + private static final Map contentWzItems = new HashMap<>(); + private static final Set handbookItems = new HashSet<>(); + + private static PrintWriter printWriter = null; + private static InputStreamReader fileReader = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int currentItemid = 0; + private static int currentDepth = 0; + private static String currentFile; + private static Set nonPropItems; + private static String getName(String token) { int i, j; char[] dest; @@ -76,35 +42,33 @@ public class MapleEmptyItemWzChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void listFiles(String directoryName, ArrayList files) { File directory = new File(directoryName); @@ -118,137 +82,135 @@ public class MapleEmptyItemWzChecker { } } } - + private static int getItemIdFromFilename(String name) { try { - return Integer.valueOf(name.substring(0, name.indexOf('.'))); - } catch(Exception e) { + return Integer.parseInt(name.substring(0, name.indexOf('.'))); + } catch (Exception e) { return -1; } } - + private static void inspectItemWzEntry() { String line = null; try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateItemToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static String currentItemPath() { String s = currentFile + " -> "; - + for (String p : currentPath) { s += (p + "\\"); } - + return s; } - + private static void translateItemToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - + currentPath.pop(); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; String d = getName(token); - - if(status == 2) { - currentItemid = Integer.valueOf(d); + + if (status == 2) { + currentItemid = Integer.parseInt(d); contentWzItems.put(currentItemid, currentItemPath()); - + forwardCursor(status); } else { currentPath.push(d); } } } - + private static void inspectStringWzEntry() { String line = null; - + try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateStringToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateStringToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; currentPath.pop(); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; String d = getName(token); - - if(status == currentDepth) { - currentItemid = Integer.valueOf(d); + + if (status == currentDepth) { + currentItemid = Integer.parseInt(d); stringWzItems.put(currentItemid, currentItemPath()); //if (currentItemid >= 4000000) System.out.println(" " + currentItemid); - + forwardCursor(status); } else { currentPath.push(d); } } } - + private static void loadStringWzFile(String filePath, int depth) throws IOException { - fileReader = new InputStreamReader(new FileInputStream(filePath), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); currentFile = filePath; currentDepth = 2 + depth; //System.out.println(filePath + " depth " + depth); inspectStringWzEntry(); - + bufferedReader.close(); fileReader.close(); } - + private static void loadStringWz() throws IOException { System.out.println("Reading String.wz ..."); - String stringWzFiles[][] = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; - String stringWzPath = wzPath + "/String.wz/"; - + String[][] stringWzFiles = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; + for (int i = 0; i < stringWzFiles.length; i++) { for (String dirFile : stringWzFiles[i]) { - loadStringWzFile(stringWzPath + dirFile + ".img.xml", i); + final String fileName = "/" + dirFile + ".img.xml"; + loadStringWzFile(WZFiles.STRING.getFilePath() + fileName, i); } } } - + private static void loadItemWz() throws IOException { System.out.println("Reading Item.wz ..."); ArrayList files = new ArrayList<>(); - listFiles(wzPath + "/Item.wz", files); + listFiles(WZFiles.ITEM.getFilePath(), files); + + for (File f : files) { + if (f.getParentFile().getName().contentEquals("Special")) { + continue; + } - for(File f : files) { - if (f.getParentFile().getName().contentEquals("Special")) continue; - //System.out.println("Parsing " + f.getAbsolutePath()); - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + currentFile = f.getCanonicalPath(); - if(f.getName().length() <= itemFileNameSize) { + if (f.getName().length() <= ITEM_FILE_NAME_SIZE) { inspectItemWzEntry(); } else { // pet file structure is similar to equips, maybe there are other item-types following this behaviour? int itemid = getItemIdFromFilename(f.getName()); - if(itemid < 0) { + if (itemid < 0) { continue; } @@ -260,17 +222,19 @@ public class MapleEmptyItemWzChecker { fileReader.close(); } } - + private static void loadCharacterWz() throws IOException { System.out.println("Reading Character.wz ..."); ArrayList files = new ArrayList<>(); - listFiles(wzPath + "/Character.wz", files); + listFiles(WZFiles.CHARACTER.getFilePath(), files); + + for (File f : files) { + if (f.getParentFile().getName().contentEquals("Character.wz")) { + continue; + } - for(File f : files) { - if (f.getParentFile().getName().contentEquals("Character.wz")) continue; - int itemid = getItemIdFromFilename(f.getName()); - if(itemid < 0) { + if (itemid < 0) { continue; } @@ -279,57 +243,56 @@ public class MapleEmptyItemWzChecker { contentWzItems.put(currentItemid, currentItemPath()); } } - + private static void calculateItemNameDiff(Set emptyItemNames, Set emptyNameItems) { for (Integer i : contentWzItems.keySet()) { if (!stringWzItems.containsKey(i)) { emptyNameItems.add(i); } } - + for (Integer i : stringWzItems.keySet()) { if (!contentWzItems.containsKey(i)) { emptyItemNames.add(i); } } } - + private static void readHandbookItems() throws IOException { System.out.println("Reading handbook ..."); String[] handbookPaths = {"Equip", "Cash.txt", "Etc.txt", "Pet.txt", "Setup.txt", "Use.txt"}; - + for (String path : handbookPaths) { - readHandbookPath(handbookPath + "/" + path); + readHandbookPath(ToolConstants.HANDBOOK_PATH + "/" + path); } } - + private static void readHandbookPath(String filePath) throws IOException { ArrayList files = new ArrayList<>(); - + File testFile = new File(filePath); if (testFile.isDirectory()) { listFiles(filePath, files); } else { files.add(testFile); } - + for (File f : files) { - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); String line = null; try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { String[] tokens = line.split(" - "); if (tokens[0].length() > 0) { - int itemid = Integer.valueOf(tokens[0]); + int itemid = Integer.parseInt(tokens[0]); handbookItems.add(itemid); } } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } @@ -337,60 +300,60 @@ public class MapleEmptyItemWzChecker { fileReader.close(); } } - + private static void printReportFileHeader() { printWriter.println(" # Report File autogenerated from the MapleEmptyItemWzChecker feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); printWriter.println(); } - + private static List getSortedItems(Set items) { List sortedItems = new ArrayList<>(items); Collections.sort(sortedItems); - + return sortedItems; } - + private static void printReportFileResults(Set emptyItemNames, Set emptyNameItems) { if (!emptyItemNames.isEmpty()) { printWriter.println("String.wz NAMES with no Item.wz node, " + emptyItemNames.size() + " entries:"); - - for(Integer itemid : getSortedItems(emptyItemNames)) { + + for (Integer itemid : getSortedItems(emptyItemNames)) { printWriter.println(" " + itemid + " " + stringWzItems.get(itemid) + (handbookItems.contains(itemid) ? "" : " NOT FOUND")); } - + printWriter.println(); } - + if (!emptyNameItems.isEmpty()) { printWriter.println("Item.wz ITEMS with no String.wz node, " + emptyNameItems.size() + " entries:"); - - for(Integer itemid : getSortedItems(emptyNameItems)) { + + for (Integer itemid : getSortedItems(emptyNameItems)) { printWriter.println(" " + itemid + " " + contentWzItems.get(itemid) + (handbookItems.contains(itemid) ? "" : " NOT FOUND")); } - + printWriter.println(); } } - + private static void reportItemNameDiff(Set emptyItemNames, Set emptyNameItems) throws IOException { System.out.println("Reporting results..."); - printWriter = new PrintWriter(newFile, "UTF-8"); - + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + printReportFileHeader(); printReportFileResults(emptyItemNames, emptyNameItems); - + printWriter.close(); } - + private static void locateItemStringWzDiff() throws IOException { Set emptyItemNames = new HashSet<>(), emptyNameItems = new HashSet<>(); calculateItemNameDiff(emptyItemNames, emptyNameItems); - + reportItemNameDiff(emptyItemNames, emptyNameItems); nonPropItems = emptyItemNames; } - + private static void runEmptyItemWzChecker() throws IOException { readHandbookItems(); @@ -400,77 +363,75 @@ public class MapleEmptyItemWzChecker { locateItemStringWzDiff(); } - + private static void generateStringWzEntry() { String line = null; - + try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { updateStringToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void updateStringToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - - } - else if(token.contains("imgdir")) { + + } else if (token.contains("imgdir")) { status += 1; - + if (status == currentDepth && nonPropItems.contains(Integer.valueOf(getName(token)))) { forwardCursor(status); return; } } - + printWriter.println(token); } - + private static void generateStringWzFile(String filePath, int depth) throws IOException { - fileReader = new InputStreamReader(new FileInputStream(wzPath + filePath), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(WZFiles.DIRECTORY + filePath), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - printWriter = new PrintWriter(outputWzPath + filePath, "UTF-8"); + printWriter = new PrintWriter(OUTPUT_PATH + filePath, StandardCharsets.UTF_8); currentDepth = 2 + depth; - + //System.out.println(filePath + " depth " + depth); generateStringWzEntry(); - + printWriter.close(); bufferedReader.close(); fileReader.close(); } - + private static void generateStringWz() throws IOException { System.out.println("Generating clean String.wz ..."); - String stringWzFiles[][] = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; + String[][] stringWzFiles = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; String stringWzPath = "/String.wz/"; - - File folder = new File(outputWzPath + "/String.wz/"); + + File folder = new File(OUTPUT_PATH + "/String.wz/"); if (!folder.exists()) { folder.mkdirs(); } - + for (int i = 0; i < stringWzFiles.length; i++) { for (String dirFile : stringWzFiles[i]) { generateStringWzFile(stringWzPath + dirFile + ".img.xml", i); } } } - + public static void main(String[] args) { try { runEmptyItemWzChecker(); generateStringWz(); - + System.out.println("Done!"); } catch (IOException ioe) { ioe.printStackTrace(); } } - + } diff --git a/src/main/java/tools/mapletools/ToolConstants.java b/src/main/java/tools/mapletools/ToolConstants.java index 0b9015e28f..33cc681300 100644 --- a/src/main/java/tools/mapletools/ToolConstants.java +++ b/src/main/java/tools/mapletools/ToolConstants.java @@ -6,6 +6,7 @@ public class ToolConstants { public static final File INPUT_DIRECTORY = new File("tools/input"); public static final File OUTPUT_DIRECTORY = new File("tools/output"); public static final String SCRIPTS_PATH = "scripts"; + public static final String HANDBOOK_PATH = "handbook"; public static File getInputFile(String fileName) { return new File(INPUT_DIRECTORY, fileName); diff --git a/tools/MapleEmptyItemWzChecker/lib/Report.txt b/tools/MapleEmptyItemWzChecker/lib/Report.txt deleted file mode 100644 index 2d4b275314..0000000000 --- a/tools/MapleEmptyItemWzChecker/lib/Report.txt +++ /dev/null @@ -1,149 +0,0 @@ - # Report File autogenerated from the MapleEmptyItemWzChecker feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -String.wz NAMES with no Item.wz node, 130 entries: - 20816 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 20817 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 21817 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 21820 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 1002655 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1002657 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1002658 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003028 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003029 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003030 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003043 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1022096 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1042180 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Coat\ - 1052226 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Longcoat\ - 1060115 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1060138 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1061125 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1061160 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1062036 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1062037 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1072248 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072249 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072418 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072425 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1080002 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082217 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082221 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082261 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1142152 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1142155 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1302032 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1302069 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1322030 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1322034 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1332058 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1382013 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1452047 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1462020 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1462042 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1472057 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1702113 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 2002012 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2002013 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2002014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2012004 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022034 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022036 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022046 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022114 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2070014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2083000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2084000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101016 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101017 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101018 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101019 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101022 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101058 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2210023 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2210024 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240004 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240005 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240006 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240007 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240008 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240009 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240010 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240011 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240012 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240013 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240015 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2290109 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2390000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 3010044 ../../wz/String.wz/Ins.img.xml -> Ins.img\ - 3994016 ../../wz/String.wz/Ins.img.xml -> Ins.img\ - 4000275 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4001150 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031294 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031627 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031628 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031629 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031630 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031631 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031632 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031633 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031634 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031635 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031636 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031637 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031638 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031639 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031640 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031641 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031642 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031643 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031644 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031645 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031646 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031647 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031648 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031795 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031867 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4032526 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 5000040 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5000043 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5000046 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5201000 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5201001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210000 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210002 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210003 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210004 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210005 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211002 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211003 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211047 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5240016 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5240019 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251004 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251005 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251006 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360009 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360010 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360011 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360012 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360013 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360014 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - -Item.wz ITEMS with no String.wz node, 12 entries: - 1942000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942000.img.xml -> NOT FOUND - 1942001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942001.img.xml -> NOT FOUND - 1942002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942002.img.xml -> NOT FOUND - 1952000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952000.img.xml -> NOT FOUND - 1952001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952001.img.xml -> NOT FOUND - 1952002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952002.img.xml -> NOT FOUND - 1962000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962000.img.xml -> NOT FOUND - 1962001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962001.img.xml -> NOT FOUND - 1962002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962002.img.xml -> NOT FOUND - 1972000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972000.img.xml -> NOT FOUND - 1972001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972001.img.xml -> NOT FOUND - 1972002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972002.img.xml -> NOT FOUND -