diff --git a/tools/MapleWorldmapChecker/src/mapleworldmapchecker/MapleWorldmapChecker.java b/src/main/java/tools/mapletools/WorldmapChecker.java
similarity index 60%
rename from tools/MapleWorldmapChecker/src/mapleworldmapchecker/MapleWorldmapChecker.java
rename to src/main/java/tools/mapletools/WorldmapChecker.java
index e4c4724518..5fda287730 100644
--- a/tools/MapleWorldmapChecker/src/mapleworldmapchecker/MapleWorldmapChecker.java
+++ b/src/main/java/tools/mapletools/WorldmapChecker.java
@@ -1,57 +1,32 @@
-/*
- 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.
-
- 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 mapleworldmapchecker;
+import provider.wz.WZFiles;
+import tools.Pair;
import java.io.*;
+import java.nio.charset.StandardCharsets;
import java.util.*;
-import java.util.Map.Entry;
/**
- *
* @author RonanLana
-
- This application parses the Map.wz file inputted and reports areas (mapids) that are supposed to be referenced
- throughout the map tree (area map -> continent map -> world map) but are currently missing.
-
+ *
+ * This application parses the Map.wz file inputted and reports areas (mapids) that are supposed to be referenced
+ * throughout the map tree (area map -> continent map -> world map) but are currently missing.
*/
-public class MapleWorldmapChecker {
-
- static String newFile = "lib/Report.txt";
- static PrintWriter printWriter = null;
- static InputStreamReader fileReader = null;
- static BufferedReader bufferedReader = null;
-
- static String worldmapPath = "../../wz/Map.wz/WorldMap";
- static int initialStringLength = 50;
-
- static Map> worldMapids = new HashMap<>();
- static Map parentWorldmaps = new HashMap<>();
- static Set rootWorldmaps = new HashSet<>();
- //static String rootWorldmap = "";
-
- static Set currentWorldMapids;
- static String currentParent;
-
- static byte status = 0;
- static boolean isInfo;
-
+public class WorldmapChecker {
+ private static final File OUTPUT_FILE = ToolConstants.getOutputFile("worldmap_report.txt");
+ private static final int INITIAL_STRING_LENGTH = 50;
+ private static final Map> worldMapids = new HashMap<>();
+ private static final Map parentWorldmaps = new HashMap<>();
+ private static final Set rootWorldmaps = new HashSet<>();
+
+ private static PrintWriter printWriter = null;
+ private static BufferedReader bufferedReader = null;
+ private static Set currentWorldMapids;
+ private static String currentParent;
+ private static byte status = 0;
+ private static boolean isInfo;
+
private static String getName(String token) {
int i, j;
char[] dest;
@@ -61,13 +36,13 @@ public class MapleWorldmapChecker {
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 String getValue(String token) {
int i, j;
char[] dest;
@@ -77,68 +52,57 @@ public class MapleWorldmapChecker {
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 translateToken(String token) {
String d;
-
- if(token.contains("/imgdir")) {
+
+ if (token.contains("/imgdir")) {
status -= 1;
- }
- else if(token.contains("imgdir")) {
+ } else if (token.contains("imgdir")) {
status += 1;
-
+
if (status == 2) {
d = getName(token);
-
+
switch (d) {
- case "MapList":
- isInfo = false;
- break;
-
- case "info":
- isInfo = true;
- break;
-
- default:
- forwardCursor(status);
+ case "MapList" -> isInfo = false;
+ case "info" -> isInfo = true;
+ default -> forwardCursor(status);
}
} else if (status == 4) {
d = getName(token);
-
+
if (!d.contentEquals("mapNo")) {
forwardCursor(status);
}
}
- }
- else {
+ } else {
if (status == 4) {
currentWorldMapids.add(Integer.valueOf(getValue(token)));
} else if (status == 2 && isInfo) {
@@ -151,64 +115,63 @@ public class MapleWorldmapChecker {
}
} catch (Exception e) {
System.out.println("failed '" + token + "'");
-
+
}
}
}
}
-
+
private static void parseWorldmapFile(File worldmapFile) throws IOException {
String line;
-
- fileReader = new InputStreamReader(new FileInputStream(worldmapFile), "UTF-8");
+
+ InputStreamReader fileReader = new InputStreamReader(new FileInputStream(worldmapFile), StandardCharsets.UTF_8);
bufferedReader = new BufferedReader(fileReader);
-
+
currentParent = "";
status = 0;
-
+
currentWorldMapids = new HashSet<>();
- while((line = bufferedReader.readLine()) != null) {
+ while ((line = bufferedReader.readLine()) != null) {
translateToken(line);
}
-
+
String worldmapName = worldmapFile.getName();
worldMapids.put(worldmapName, currentWorldMapids);
-
- if (!currentParent.isEmpty()) parentWorldmaps.put(worldmapName, currentParent);
- else rootWorldmaps.add(worldmapName);
+
+ if (!currentParent.isEmpty()) {
+ parentWorldmaps.put(worldmapName, currentParent);
+ } else {
+ rootWorldmaps.add(worldmapName);
+ }
bufferedReader.close();
fileReader.close();
}
-
+
private static void parseWorldmapDirectory() {
- System.out.println("Parsing directory '" + worldmapPath + "'");
- File folder = new File(worldmapPath);
+ File folder = new File(WZFiles.MAP.getFilePath(), "WorldMap");
+ System.out.println("Parsing directory '" + folder.getPath() + "'");
for (File file : folder.listFiles()) {
if (file.isFile()) {
try {
parseWorldmapFile(file);
- }
- catch(FileNotFoundException ex) {
+ } catch (FileNotFoundException ex) {
System.out.println("Unable to open worldmap file " + file.getAbsolutePath() + ".");
- }
- catch(IOException ex) {
+ } catch (IOException ex) {
System.out.println("Error reading worldmap file " + file.getAbsolutePath() + ".");
- }
-
- catch(Exception e) {
+ } catch (Exception e) {
e.printStackTrace();
}
}
}
}
-
+
private static void printReportFileHeader() {
printWriter.println(" # Report File autogenerated from the MapleWorldmapChecker feature by Ronan Lana.");
printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls.");
printWriter.println();
}
-
+
private static void printReportFileResults(List>>> results) {
printWriter.println("Missing mapid references in top hierarchy:\n");
for (Pair>> res : results) {
@@ -221,32 +184,32 @@ public class MapleWorldmapChecker {
printWriter.println("\n");
}
}
-
+
private static void verifyWorldmapTreeMapids() {
try {
- printWriter = new PrintWriter(newFile, "UTF-8");
+ printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8);
printReportFileHeader();
-
+
if (rootWorldmaps.size() > 1) {
printWriter.println("[WARNING] Detected several root worldmaps: " + rootWorldmaps + "\n");
}
-
+
Set worldmaps = new HashSet<>(parentWorldmaps.keySet());
worldmaps.addAll(rootWorldmaps);
-
+
Map> tempMapids = new HashMap<>(worldMapids.size());
- for (Entry> e : worldMapids.entrySet()) {
+ for (Map.Entry> e : worldMapids.entrySet()) {
tempMapids.put(e.getKey(), new HashSet<>(e.getValue()));
}
-
+
Map>> unreferencedMapids = new HashMap<>();
-
+
for (String s : worldmaps) {
List> currentUnreferencedMapids = new ArrayList<>();
for (Integer i : tempMapids.get(s)) {
String parent = parentWorldmaps.get(s);
-
+
while (parent != null) {
Set mapids = worldMapids.get(parent);
if (!mapids.contains(i)) {
@@ -255,39 +218,39 @@ public class MapleWorldmapChecker {
} else {
tempMapids.get(parent).remove(i);
}
-
+
parent = parentWorldmaps.get(parent);
}
}
-
+
if (!currentUnreferencedMapids.isEmpty()) {
unreferencedMapids.put(s, currentUnreferencedMapids);
}
}
-
+
if (!unreferencedMapids.isEmpty()) {
List>>> unreferencedEntries = new ArrayList<>(20);
- for (Entry>> e : unreferencedMapids.entrySet()) {
+ for (Map.Entry>> e : unreferencedMapids.entrySet()) {
List> list = new ArrayList<>(e.getValue());
- Collections.sort(list, (o1, o2) -> o1.getLeft().compareTo(o2.getLeft()));
+ list.sort((o1, o2) -> o1.getLeft().compareTo(o2.getLeft()));
unreferencedEntries.add(new Pair<>(e.getKey(), list));
}
-
- Collections.sort(unreferencedEntries, (o1, o2) -> o1.getLeft().compareTo(o2.getLeft()));
+
+ unreferencedEntries.sort((o1, o2) -> o1.getLeft().compareTo(o2.getLeft()));
printReportFileResults(unreferencedEntries);
}
-
+
printWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
-
+
public static void main(String[] args) {
parseWorldmapDirectory();
verifyWorldmapTreeMapids();
}
-
}
+
diff --git a/tools/MapleWorldmapChecker/lib/Report.txt b/tools/MapleWorldmapChecker/lib/Report.txt
deleted file mode 100644
index 781ea1284f..0000000000
--- a/tools/MapleWorldmapChecker/lib/Report.txt
+++ /dev/null
@@ -1,76 +0,0 @@
- # Report File autogenerated from the MapleWorldmapChecker feature by Ronan Lana.
- # Generated data takes into account several data info from the server-side WZ.xmls.
-
-Missing mapid references in top hierarchy:
-
-'WorldMap000.img.xml':
- 1020000:WorldMap.img.xml
-
-
-'WorldMap010.img.xml':
- 101000400:WorldMap.img.xml
- 105040306:WorldMap.img.xml
- 105050500:WorldMap.img.xml
- 193000000:WorldMap.img.xml
- 680000100:WorldMap.img.xml
- 680000110:WorldMap.img.xml
- 680000200:WorldMap.img.xml
- 680000210:WorldMap.img.xml
- 680000300:WorldMap.img.xml
- 680000400:WorldMap.img.xml
- 680000401:WorldMap.img.xml
- 680010000:WorldMap.img.xml
- 680010100:WorldMap.img.xml
-
-
-'WorldMap012.img.xml':
- 107000500:WorldMap010.img.xml
-
-
-'WorldMap014.img.xml':
- 106021401:WorldMap010.img.xml
- 106021402:WorldMap010.img.xml
- 106021800:WorldMap010.img.xml
-
-
-'WorldMap020.img.xml':
- 200080101:WorldMap.img.xml
- 200082301:WorldMap.img.xml
- 211040401:WorldMap.img.xml
-
-
-'WorldMap021.img.xml':
- 280030000:WorldMap020.img.xml
-
-
-'WorldMap030.img.xml':
- 220010001:WorldMap.img.xml
- 220011001:WorldMap.img.xml
- 221022100:WorldMap.img.xml
- 221022200:WorldMap.img.xml
- 222010310:WorldMap.img.xml
-
-
-'WorldMap050.img.xml':
- 240040201:WorldMap.img.xml
- 240040301:WorldMap.img.xml
-
-
-'WorldMap060.img.xml':
- 251000100:WorldMap.img.xml
- 251010404:WorldMap.img.xml
-
-
-'WorldMap100.img.xml':
- 140020110:WorldMap.img.xml
-
-
-'WorldMap142.img.xml':
- 600010002:WorldMap.img.xml
-
-
-'WorldMap211.img.xml':
- 801040100:WorldMap210.img.xml
- 801040101:WorldMap210.img.xml
-
-
diff --git a/tools/MapleWorldmapChecker/src/mapleworldmapchecker/Pair.java b/tools/MapleWorldmapChecker/src/mapleworldmapchecker/Pair.java
deleted file mode 100644
index 04c8fcdf39..0000000000
--- a/tools/MapleWorldmapChecker/src/mapleworldmapchecker/Pair.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
-This file is part of the OdinMS Maple Story Server
-Copyright (C) 2008 ~ 2010 Patrick Huy
-Matthias Butz
-Jan Christian Meyer
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License 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,
-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 mapleworldmapchecker;
-
-/**
- * Represents a pair of values.
- *
- * @author Frz
- * @since Revision 333
- * @version 1.0
- *
- * @param The type of the left value.
- * @param The type of the right value.
- */
-public class Pair {
-
- public E left;
- public F right;
-
- /**
- * Class constructor - pairs two objects together.
- *
- * @param left The left object.
- * @param right The right object.
- */
- public Pair(E left, F right) {
- this.left = left;
- this.right = right;
- }
-
- /**
- * Gets the left value.
- *
- * @return The left value.
- */
- public E getLeft() {
- return left;
- }
-
- /**
- * Gets the right value.
- *
- * @return The right value.
- */
- public F getRight() {
- return right;
- }
-
- /**
- * Turns the pair into a string.
- *
- * @return Each value of the pair as a string joined with a colon.
- */
- @Override
- public String toString() {
- return left.toString() + ":" + right.toString();
- }
-
- /**
- * Gets the hash code of this pair.
- */
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((left == null) ? 0 : left.hashCode());
- result = prime * result + ((right == null) ? 0 : right.hashCode());
- return result;
- }
-
- /**
- * Checks to see if two pairs are equal.
- */
- @SuppressWarnings("unchecked")
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- final Pair other = (Pair) obj;
- if (left == null) {
- if (other.left != null) {
- return false;
- }
- } else if (!left.equals(other.left)) {
- return false;
- }
- if (right == null) {
- if (other.right != null) {
- return false;
- }
- } else if (!right.equals(other.right)) {
- return false;
- }
- return true;
- }
-}
\ No newline at end of file