package tools.wztosql; import database.DatabaseConnection; import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.LinkedList; import java.util.List; import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import server.quest.MapleQuestActionType; import server.quest.MapleQuestRequirementType; import tools.Pair; public class DumpQuests { private MapleDataProvider quest; protected boolean hadError = false; protected boolean update = false; protected int id = 0; private Connection con = DatabaseConnection.getConnection(); public DumpQuests(boolean update) throws Exception { this.update = update; this.quest = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Quest.wz")); if (quest == null) { hadError = true; } } public boolean isHadError() { return hadError; } public void dumpQuests() throws Exception { if (!hadError) { PreparedStatement psai = con.prepareStatement("INSERT INTO wz_questactitemdata(uniqueid, itemid, count, period, gender, job, jobEx, prop) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); PreparedStatement psas = con.prepareStatement("INSERT INTO wz_questactskilldata(uniqueid, skillid, skillLevel, masterLevel) VALUES (?, ?, ?, ?)"); PreparedStatement psaq = con.prepareStatement("INSERT INTO wz_questactquestdata(uniqueid, quest, state) VALUES (?, ?, ?)"); PreparedStatement ps = con.prepareStatement("INSERT INTO wz_questdata(questid, name, autoStart, autoPreComplete, viewMedalItem, selectedSkillID, blocked, autoAccept, autoComplete) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); PreparedStatement psr = con.prepareStatement("INSERT INTO wz_questreqdata(questid, type, name, stringStore, intStoresFirst, intStoresSecond) VALUES (?, ?, ?, ?, ?, ?)"); PreparedStatement psq = con.prepareStatement("INSERT INTO wz_questpartydata(questid, rank, mode, property, value) VALUES(?,?,?,?,?)"); PreparedStatement psa = con.prepareStatement("INSERT INTO wz_questactdata(questid, type, name, intStore, applicableJobs, uniqueid) VALUES (?, ?, ?, ?, ?, ?)"); try { dumpQuests(psai, psas, psaq, ps, psr, psq, psa); } catch (Exception e) { System.out.println(id + " quest."); e.printStackTrace(); hadError = true; } finally { psai.executeBatch(); psai.close(); psas.executeBatch(); psas.close(); psaq.executeBatch(); psaq.close(); psa.executeBatch(); psa.close(); psr.executeBatch(); psr.close(); psq.executeBatch(); psq.close(); ps.executeBatch(); ps.close(); } } } public void delete(String sql) throws Exception { PreparedStatement ps = con.prepareStatement(sql); ps.executeUpdate(); ps.close(); } public boolean doesExist(String sql) throws Exception { PreparedStatement ps = con.prepareStatement(sql); ResultSet rs = ps.executeQuery(); boolean ret = rs.next(); rs.close(); ps.close(); return ret; } public void dumpQuests(PreparedStatement psai, PreparedStatement psas, PreparedStatement psaq, PreparedStatement ps, PreparedStatement psr, PreparedStatement psq, PreparedStatement psa) throws Exception { if (!update) { delete("DELETE FROM wz_questdata"); delete("DELETE FROM wz_questactdata"); delete("DELETE FROM wz_questactitemdata"); delete("DELETE FROM wz_questactskilldata"); delete("DELETE FROM wz_questactquestdata"); delete("DELETE FROM wz_questreqdata"); delete("DELETE FROM wz_questpartydata"); System.out.println("Deleted wz_questdata successfully."); } final MapleData checkz = quest.getData("Check.img"); final MapleData actz = quest.getData("Act.img"); final MapleData infoz = quest.getData("QuestInfo.img"); final MapleData pinfoz = quest.getData("PQuest.img"); System.out.println("Adding into wz_questdata....."); int uniqueid = 0; for (MapleData qz : checkz.getChildren()) { //requirements first this.id = Integer.parseInt(qz.getName()); if (update && doesExist("SELECT * FROM wz_questdata WHERE questid = " + id)) { continue; } ps.setInt(1, id); for (int i = 0; i < 2; i++) { MapleData reqData = qz.getChildByPath(String.valueOf(i)); if (reqData != null) { psr.setInt(1, id); psr.setInt(2, i); //0 = start for (MapleData req : reqData.getChildren()) { if (MapleQuestRequirementType.getByWZName(req.getName()) == MapleQuestRequirementType.UNDEFINED) { continue; //un-needed } psr.setString(3, req.getName()); if (req.getName().equals("fieldEnter")) { //diff psr.setString(4, String.valueOf(MapleDataTool.getIntConvert("0", req, 0))); } else if (req.getName().equals("end") || req.getName().equals("startscript") || req.getName().equals("endscript")) { psr.setString(4, MapleDataTool.getString(req, "")); } else { psr.setString(4, String.valueOf(MapleDataTool.getInt(req, 0))); } StringBuilder intStore1 = new StringBuilder(); StringBuilder intStore2 = new StringBuilder(); List<Pair<Integer, Integer>> dataStore = new LinkedList<Pair<Integer, Integer>>(); if (req.getName().equals("job")) { final List<MapleData> child = req.getChildren(); for (int x = 0; x < child.size(); x++) { dataStore.add(new Pair<Integer, Integer>(i, MapleDataTool.getInt(child.get(x), -1))); } } else if (req.getName().equals("skill")) { final List<MapleData> child = req.getChildren(); for (int x = 0; x < child.size(); x++) { final MapleData childdata = child.get(x); if (childdata == null) { continue; } dataStore.add(new Pair<Integer, Integer>(MapleDataTool.getInt(childdata.getChildByPath("id"), 0), MapleDataTool.getInt(childdata.getChildByPath("acquire"), 0))); } } else if (req.getName().equals("quest")) { final List<MapleData> child = req.getChildren(); for (int x = 0; x < child.size(); x++) { final MapleData childdata = child.get(x); if (childdata == null) { continue; } dataStore.add(new Pair<Integer, Integer>(MapleDataTool.getInt(childdata.getChildByPath("id"), 0), MapleDataTool.getInt(childdata.getChildByPath("state"), 0))); } } else if (req.getName().equals("item") || req.getName().equals("mob")) { final List<MapleData> child = req.getChildren(); for (int x = 0; x < child.size(); x++) { final MapleData childdata = child.get(x); if (childdata == null) { continue; } dataStore.add(new Pair<Integer, Integer>(MapleDataTool.getInt(childdata.getChildByPath("id"), 0), MapleDataTool.getInt(childdata.getChildByPath("count"), 0))); } } else if (req.getName().equals("mbcard")) { final List<MapleData> child = req.getChildren(); for (int x = 0; x < child.size(); x++) { final MapleData childdata = child.get(x); if (childdata == null) { continue; } dataStore.add(new Pair<Integer, Integer>(MapleDataTool.getInt(childdata.getChildByPath("id"), 0), MapleDataTool.getInt(childdata.getChildByPath("min"), 0))); } } else if (req.getName().equals("pet")) { final List<MapleData> child = req.getChildren(); for (int x = 0; x < child.size(); x++) { final MapleData childdata = child.get(x); if (childdata == null) { continue; } dataStore.add(new Pair<Integer, Integer>(i, MapleDataTool.getInt(childdata.getChildByPath("id"), 0))); } } for (Pair<Integer, Integer> data : dataStore) { if (intStore1.length() > 0) { intStore1.append(", "); intStore2.append(", "); } intStore1.append(data.getLeft()); intStore2.append(data.getRight()); } psr.setString(5, intStore1.toString()); psr.setString(6, intStore2.toString()); psr.addBatch(); } } MapleData actData = actz.getChildByPath(id + "/" + i); if (actData != null) { psa.setInt(1, id); psa.setInt(2, i); //0 = start for (MapleData act : actData.getChildren()) { if (MapleQuestActionType.getByWZName(act.getName()) == MapleQuestActionType.UNDEFINED) { continue; //un-needed } psa.setString(3, act.getName()); if (act.getName().equals("sp")) { psa.setInt(4, MapleDataTool.getIntConvert("0/sp_value", act, 0)); } else { psa.setInt(4, MapleDataTool.getInt(act, 0)); } StringBuilder applicableJobs = new StringBuilder(); if (act.getName().equals("sp") || act.getName().equals("skill")) { int index = 0; while(true) { if (act.getChildByPath(index + "/job") != null) { for (MapleData d : act.getChildByPath(index + "/job")) { if (applicableJobs.length() > 0) { applicableJobs.append(", "); } applicableJobs.append(MapleDataTool.getInt(d,0)); } index++; } else { break; } } } else { if (act.getChildByPath("job") != null) { for (MapleData d : act.getChildByPath("job")) { if (applicableJobs.length() > 0) { applicableJobs.append(", "); } applicableJobs.append(MapleDataTool.getInt(d,0)); } } } psa.setString(5, applicableJobs.toString()); psa.setInt(6, -1); if (act.getName().equals("item")) { //prop, job, gender, id, count uniqueid++; psa.setInt(6, uniqueid); psai.setInt(1, uniqueid); for (MapleData iEntry : act.getChildren()) { psai.setInt(2, MapleDataTool.getInt("id", iEntry, 0)); psai.setInt(3, MapleDataTool.getInt("count", iEntry, 0)); psai.setInt(4, MapleDataTool.getInt("period", iEntry, 0)); psai.setInt(5, MapleDataTool.getInt("gender", iEntry, 2)); psai.setInt(6, MapleDataTool.getInt("job", iEntry, -1)); psai.setInt(7, MapleDataTool.getInt("jobEx", iEntry, -1)); if (iEntry.getChildByPath("prop") == null) { psai.setInt(8, -2); } else { psai.setInt(8, MapleDataTool.getInt("prop", iEntry, -1)); } psai.addBatch(); } } else if (act.getName().equals("skill")) { uniqueid++; psa.setInt(6, uniqueid); psas.setInt(1, uniqueid); for (MapleData sEntry : act) { psas.setInt(2, MapleDataTool.getInt("id", sEntry, 0)); psas.setInt(3, MapleDataTool.getInt("skillLevel", sEntry, 0)); psas.setInt(4, MapleDataTool.getInt("masterLevel", sEntry, 0)); psas.addBatch(); } } else if (act.getName().equals("quest")) { uniqueid++; psa.setInt(6, uniqueid); psaq.setInt(1, uniqueid); for (MapleData sEntry : act) { psaq.setInt(2, MapleDataTool.getInt("id", sEntry, 0)); psaq.setInt(3, MapleDataTool.getInt("state", sEntry, 0)); psaq.addBatch(); } } psa.addBatch(); } } } MapleData infoData = infoz.getChildByPath(String.valueOf(id)); if (infoData != null) { ps.setString(2, MapleDataTool.getString("name", infoData, "")); ps.setInt(3, MapleDataTool.getInt("autoStart", infoData, 0) > 0 ? 1 : 0); ps.setInt(4, MapleDataTool.getInt("autoPreComplete", infoData, 0) > 0 ? 1 : 0); ps.setInt(5, MapleDataTool.getInt("viewMedalItem", infoData, 0)); ps.setInt(6, MapleDataTool.getInt("selectedSkillID", infoData, 0)); ps.setInt(7, MapleDataTool.getInt("blocked", infoData, 0)); ps.setInt(8, MapleDataTool.getInt("autoAccept", infoData, 0)); ps.setInt(9, MapleDataTool.getInt("autoComplete", infoData, 0)); } else { ps.setString(2, ""); ps.setInt(3, 0); ps.setInt(4, 0); ps.setInt(5, 0); ps.setInt(6, 0); ps.setInt(7, 0); ps.setInt(8, 0); ps.setInt(9, 0); } ps.addBatch(); MapleData pinfoData = pinfoz.getChildByPath(String.valueOf(id)); if (pinfoData != null && pinfoData.getChildByPath("rank") != null) { psq.setInt(1, id); for (MapleData d : pinfoData.getChildByPath("rank")) { psq.setString(2, d.getName()); for (MapleData c : d) { psq.setString(3, c.getName()); for (MapleData b : c) { psq.setString(4, b.getName()); psq.setInt(5, MapleDataTool.getInt(b, 0)); psq.addBatch(); } } } } System.out.println("Added quest: " + id); } System.out.println("Done wz_questdata..."); } public int currentId() { return id; } public static void main(String[] args) { boolean hadError = false; boolean update = false; long startTime = System.currentTimeMillis(); for (String file : args) { if (file.equalsIgnoreCase("-update")) { update = true; } } int currentQuest = 0; try { final DumpQuests dq = new DumpQuests(update); System.out.println("Dumping quests"); dq.dumpQuests(); hadError |= dq.isHadError(); currentQuest = dq.currentId(); } catch (Exception e) { hadError = true; e.printStackTrace(); System.out.println(currentQuest + " quest."); } long endTime = System.currentTimeMillis(); double elapsedSeconds = (endTime - startTime) / 1000.0; int elapsedSecs = (((int) elapsedSeconds) % 60); int elapsedMinutes = (int) (elapsedSeconds / 60.0); String withErrors = ""; if (hadError) { withErrors = " with errors"; } System.out.println("Finished" + withErrors + " in " + elapsedMinutes + " minutes " + elapsedSecs + " seconds"); } }