Move MapleEmptyItemWzChecker to main module

This commit is contained in:
P0nk
2021-07-10 22:10:21 +02:00
parent 08d2b40cc4
commit e6fef246cb
4 changed files with 147 additions and 335 deletions

View File

@@ -21,7 +21,6 @@ import java.util.*;
* Estimated parse time: 1 minute * Estimated parse time: 1 minute
*/ */
public class CashCosmeticsChecker { public class CashCosmeticsChecker {
private static final String HANDBOOK_PATH = "handbook";
private static final String INPUT_DIRECTORY_PATH = ToolConstants.getInputFile("care").getPath(); 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 File OUTPUT_FILE = ToolConstants.getOutputFile("cash_cosmetics_result.txt");
private static final boolean IGNORE_CURRENT_SCRIPT_COSMETICS = false; // Toggle to preference 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) { private static String getHandbookFileName(String fileName) {
return HANDBOOK_PATH + fileName; return ToolConstants.HANDBOOK_PATH + fileName;
} }
private static List<Integer> fetchExpectedCosmetics(String[] cosmeticList, boolean gender) { private static List<Integer> fetchExpectedCosmetics(String[] cosmeticList, boolean gender) {

View File

@@ -1,71 +1,37 @@
/* package tools.mapletools;
This file is part of the HeavenMS MapleStory Server
Copyleft (L) 2016 - 2019 RonanLana
This program is free software: you can redistribute it and/or modify import provider.wz.WZFiles;
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.
This program is distributed in the hope that it will be useful, import java.io.*;
but WITHOUT ANY WARRANTY; without even the implied warranty of import java.nio.charset.StandardCharsets;
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the import java.util.*;
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 <http://www.gnu.org/licenses/>.
*/
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;
/** /**
*
* @author RonanLana * @author RonanLana
* * <p>
This application has two objectives: it reports in a detailed file all itemids which is * 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; * 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. * And it removes from the String.wz XMLs all entries which misses properties on Item.wz.
*/ */
public class MapleEmptyItemWzChecker { 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;
static String newFile = "lib/Report.txt"; private static final Stack<String> currentPath = new Stack<>();
static String outputWzPath = "lib"; private static final Map<Integer, String> stringWzItems = new HashMap<>();
static PrintWriter printWriter = null; private static final Map<Integer, String> contentWzItems = new HashMap<>();
static InputStreamReader fileReader = null; private static final Set<Integer> handbookItems = new HashSet<>();
static BufferedReader bufferedReader = null;
static String wzPath = "../../wz"; private static PrintWriter printWriter = null;
static String handbookPath = "../../handbook"; private static InputStreamReader fileReader = null;
static int initialStringLength = 50; private static BufferedReader bufferedReader = null;
static int itemFileNameSize = 13; private static byte status = 0;
private static int currentItemid = 0;
static byte status = 0; private static int currentDepth = 0;
static int currentItemid = 0; private static String currentFile;
static int currentDepth = 0; private static Set<Integer> nonPropItems;
static Stack<String> currentPath = new Stack<>();
static String currentFile;
static Map<Integer, String> stringWzItems = new HashMap<>();
static Map<Integer, String> contentWzItems = new HashMap<>();
static Set<Integer> handbookItems = new HashSet<>();
static Set<Integer> nonPropItems;
private static String getName(String token) { private static String getName(String token) {
int i, j; int i, j;
@@ -76,7 +42,7 @@ public class MapleEmptyItemWzChecker {
i = token.indexOf("\"", i) + 1; //lower bound of the string i = token.indexOf("\"", i) + 1; //lower bound of the string
j = token.indexOf("\"", i); //upper bound j = token.indexOf("\"", i); //upper bound
dest = new char[initialStringLength]; dest = new char[INITIAL_STRING_LENGTH];
token.getChars(i, j, dest, 0); token.getChars(i, j, dest, 0);
d = new String(dest); d = new String(dest);
@@ -90,8 +56,7 @@ public class MapleEmptyItemWzChecker {
while (status >= st && (line = bufferedReader.readLine()) != null) { while (status >= st && (line = bufferedReader.readLine()) != null) {
simpleToken(line); simpleToken(line);
} }
} } catch (Exception e) {
catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -99,8 +64,7 @@ public class MapleEmptyItemWzChecker {
private static void simpleToken(String token) { private static void simpleToken(String token) {
if (token.contains("/imgdir")) { if (token.contains("/imgdir")) {
status -= 1; status -= 1;
} } else if (token.contains("imgdir")) {
else if(token.contains("imgdir")) {
status += 1; status += 1;
} }
} }
@@ -121,7 +85,7 @@ public class MapleEmptyItemWzChecker {
private static int getItemIdFromFilename(String name) { private static int getItemIdFromFilename(String name) {
try { try {
return Integer.valueOf(name.substring(0, name.indexOf('.'))); return Integer.parseInt(name.substring(0, name.indexOf('.')));
} catch (Exception e) { } catch (Exception e) {
return -1; return -1;
} }
@@ -134,8 +98,7 @@ public class MapleEmptyItemWzChecker {
while ((line = bufferedReader.readLine()) != null) { while ((line = bufferedReader.readLine()) != null) {
translateItemToken(line); translateItemToken(line);
} }
} } catch (Exception e) {
catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -155,13 +118,12 @@ public class MapleEmptyItemWzChecker {
status -= 1; status -= 1;
currentPath.pop(); currentPath.pop();
} } else if (token.contains("imgdir")) {
else if(token.contains("imgdir")) {
status += 1; status += 1;
String d = getName(token); String d = getName(token);
if (status == 2) { if (status == 2) {
currentItemid = Integer.valueOf(d); currentItemid = Integer.parseInt(d);
contentWzItems.put(currentItemid, currentItemPath()); contentWzItems.put(currentItemid, currentItemPath());
forwardCursor(status); forwardCursor(status);
@@ -178,8 +140,7 @@ public class MapleEmptyItemWzChecker {
while ((line = bufferedReader.readLine()) != null) { while ((line = bufferedReader.readLine()) != null) {
translateStringToken(line); translateStringToken(line);
} }
} } catch (Exception e) {
catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -188,13 +149,12 @@ public class MapleEmptyItemWzChecker {
if (token.contains("/imgdir")) { if (token.contains("/imgdir")) {
status -= 1; status -= 1;
currentPath.pop(); currentPath.pop();
} } else if (token.contains("imgdir")) {
else if(token.contains("imgdir")) {
status += 1; status += 1;
String d = getName(token); String d = getName(token);
if (status == currentDepth) { if (status == currentDepth) {
currentItemid = Integer.valueOf(d); currentItemid = Integer.parseInt(d);
stringWzItems.put(currentItemid, currentItemPath()); stringWzItems.put(currentItemid, currentItemPath());
//if (currentItemid >= 4000000) System.out.println(" " + currentItemid); //if (currentItemid >= 4000000) System.out.println(" " + currentItemid);
@@ -206,7 +166,7 @@ public class MapleEmptyItemWzChecker {
} }
private static void loadStringWzFile(String filePath, int depth) throws IOException { 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); bufferedReader = new BufferedReader(fileReader);
currentFile = filePath; currentFile = filePath;
@@ -220,12 +180,12 @@ public class MapleEmptyItemWzChecker {
private static void loadStringWz() throws IOException { private static void loadStringWz() throws IOException {
System.out.println("Reading String.wz ..."); System.out.println("Reading String.wz ...");
String stringWzFiles[][] = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; String[][] stringWzFiles = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}};
String stringWzPath = wzPath + "/String.wz/";
for (int i = 0; i < stringWzFiles.length; i++) { for (int i = 0; i < stringWzFiles.length; i++) {
for (String dirFile : stringWzFiles[i]) { for (String dirFile : stringWzFiles[i]) {
loadStringWzFile(stringWzPath + dirFile + ".img.xml", i); final String fileName = "/" + dirFile + ".img.xml";
loadStringWzFile(WZFiles.STRING.getFilePath() + fileName, i);
} }
} }
} }
@@ -233,18 +193,20 @@ public class MapleEmptyItemWzChecker {
private static void loadItemWz() throws IOException { private static void loadItemWz() throws IOException {
System.out.println("Reading Item.wz ..."); System.out.println("Reading Item.wz ...");
ArrayList<File> files = new ArrayList<>(); ArrayList<File> files = new ArrayList<>();
listFiles(wzPath + "/Item.wz", files); listFiles(WZFiles.ITEM.getFilePath(), files);
for (File f : files) { for (File f : files) {
if (f.getParentFile().getName().contentEquals("Special")) continue; if (f.getParentFile().getName().contentEquals("Special")) {
continue;
}
//System.out.println("Parsing " + f.getAbsolutePath()); //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); bufferedReader = new BufferedReader(fileReader);
currentFile = f.getCanonicalPath(); currentFile = f.getCanonicalPath();
if(f.getName().length() <= itemFileNameSize) { if (f.getName().length() <= ITEM_FILE_NAME_SIZE) {
inspectItemWzEntry(); inspectItemWzEntry();
} else { // pet file structure is similar to equips, maybe there are other item-types following this behaviour? } else { // pet file structure is similar to equips, maybe there are other item-types following this behaviour?
int itemid = getItemIdFromFilename(f.getName()); int itemid = getItemIdFromFilename(f.getName());
@@ -264,10 +226,12 @@ public class MapleEmptyItemWzChecker {
private static void loadCharacterWz() throws IOException { private static void loadCharacterWz() throws IOException {
System.out.println("Reading Character.wz ..."); System.out.println("Reading Character.wz ...");
ArrayList<File> files = new ArrayList<>(); ArrayList<File> files = new ArrayList<>();
listFiles(wzPath + "/Character.wz", files); listFiles(WZFiles.CHARACTER.getFilePath(), files);
for (File f : files) { for (File f : files) {
if (f.getParentFile().getName().contentEquals("Character.wz")) continue; if (f.getParentFile().getName().contentEquals("Character.wz")) {
continue;
}
int itemid = getItemIdFromFilename(f.getName()); int itemid = getItemIdFromFilename(f.getName());
if (itemid < 0) { if (itemid < 0) {
@@ -299,7 +263,7 @@ public class MapleEmptyItemWzChecker {
String[] handbookPaths = {"Equip", "Cash.txt", "Etc.txt", "Pet.txt", "Setup.txt", "Use.txt"}; String[] handbookPaths = {"Equip", "Cash.txt", "Etc.txt", "Pet.txt", "Setup.txt", "Use.txt"};
for (String path : handbookPaths) { for (String path : handbookPaths) {
readHandbookPath(handbookPath + "/" + path); readHandbookPath(ToolConstants.HANDBOOK_PATH + "/" + path);
} }
} }
@@ -314,7 +278,7 @@ public class MapleEmptyItemWzChecker {
} }
for (File f : files) { 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); bufferedReader = new BufferedReader(fileReader);
String line = null; String line = null;
@@ -324,12 +288,11 @@ public class MapleEmptyItemWzChecker {
String[] tokens = line.split(" - "); String[] tokens = line.split(" - ");
if (tokens[0].length() > 0) { if (tokens[0].length() > 0) {
int itemid = Integer.valueOf(tokens[0]); int itemid = Integer.parseInt(tokens[0]);
handbookItems.add(itemid); handbookItems.add(itemid);
} }
} }
} } catch (Exception e) {
catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -375,7 +338,7 @@ public class MapleEmptyItemWzChecker {
private static void reportItemNameDiff(Set<Integer> emptyItemNames, Set<Integer> emptyNameItems) throws IOException { private static void reportItemNameDiff(Set<Integer> emptyItemNames, Set<Integer> emptyNameItems) throws IOException {
System.out.println("Reporting results..."); System.out.println("Reporting results...");
printWriter = new PrintWriter(newFile, "UTF-8"); printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8);
printReportFileHeader(); printReportFileHeader();
printReportFileResults(emptyItemNames, emptyNameItems); printReportFileResults(emptyItemNames, emptyNameItems);
@@ -408,8 +371,7 @@ public class MapleEmptyItemWzChecker {
while ((line = bufferedReader.readLine()) != null) { while ((line = bufferedReader.readLine()) != null) {
updateStringToken(line); updateStringToken(line);
} }
} } catch (Exception e) {
catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -418,8 +380,7 @@ public class MapleEmptyItemWzChecker {
if (token.contains("/imgdir")) { if (token.contains("/imgdir")) {
status -= 1; status -= 1;
} } else if (token.contains("imgdir")) {
else if(token.contains("imgdir")) {
status += 1; status += 1;
if (status == currentDepth && nonPropItems.contains(Integer.valueOf(getName(token)))) { if (status == currentDepth && nonPropItems.contains(Integer.valueOf(getName(token)))) {
@@ -432,9 +393,9 @@ public class MapleEmptyItemWzChecker {
} }
private static void generateStringWzFile(String filePath, int depth) throws IOException { 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); bufferedReader = new BufferedReader(fileReader);
printWriter = new PrintWriter(outputWzPath + filePath, "UTF-8"); printWriter = new PrintWriter(OUTPUT_PATH + filePath, StandardCharsets.UTF_8);
currentDepth = 2 + depth; currentDepth = 2 + depth;
//System.out.println(filePath + " depth " + depth); //System.out.println(filePath + " depth " + depth);
@@ -447,10 +408,10 @@ public class MapleEmptyItemWzChecker {
private static void generateStringWz() throws IOException { private static void generateStringWz() throws IOException {
System.out.println("Generating clean String.wz ..."); 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/"; String stringWzPath = "/String.wz/";
File folder = new File(outputWzPath + "/String.wz/"); File folder = new File(OUTPUT_PATH + "/String.wz/");
if (!folder.exists()) { if (!folder.exists()) {
folder.mkdirs(); folder.mkdirs();
} }

View File

@@ -6,6 +6,7 @@ public class ToolConstants {
public static final File INPUT_DIRECTORY = new File("tools/input"); public static final File INPUT_DIRECTORY = new File("tools/input");
public static final File OUTPUT_DIRECTORY = new File("tools/output"); public static final File OUTPUT_DIRECTORY = new File("tools/output");
public static final String SCRIPTS_PATH = "scripts"; public static final String SCRIPTS_PATH = "scripts";
public static final String HANDBOOK_PATH = "handbook";
public static File getInputFile(String fileName) { public static File getInputFile(String fileName) {
return new File(INPUT_DIRECTORY, fileName); return new File(INPUT_DIRECTORY, fileName);

View File

@@ -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