From 6d49ab45c34a3b36ecd2c60f86454f9449d3038b Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 11:15:03 +0200 Subject: [PATCH] Move MapleWorldMapChecker to main module --- .../tools/mapletools/WorldmapChecker.java | 203 +++++++----------- tools/MapleWorldmapChecker/lib/Report.txt | 76 ------- .../src/mapleworldmapchecker/Pair.java | 121 ----------- 3 files changed, 83 insertions(+), 317 deletions(-) rename tools/MapleWorldmapChecker/src/mapleworldmapchecker/MapleWorldmapChecker.java => src/main/java/tools/mapletools/WorldmapChecker.java (60%) delete mode 100644 tools/MapleWorldmapChecker/lib/Report.txt delete mode 100644 tools/MapleWorldmapChecker/src/mapleworldmapchecker/Pair.java 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