package server.maps; import com.mysql.jdbc.Connection; import constants.GameConstants; import database.DatabaseConnection; import java.awt.Point; import java.awt.Rectangle; import java.io.File; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.locks.ReentrantLock; import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import server.MaplePortal; import server.Randomizer; import server.life.AbstractLoadedMapleLife; import server.life.MapleLifeFactory; import server.life.MapleMonster; import server.life.MapleNPC; import tools.Pair; import tools.StringUtil; public class MapleMapFactory { private final MapleDataProvider source = MapleDataProviderFactory.getDataProvider(new File("wz/Map.wz")); private final MapleData nameData = MapleDataProviderFactory.getDataProvider(new File("wz/String.wz")).getData("Map.img"); private final HashMap<Integer, MapleMap> maps = new HashMap(); private final HashMap<Integer, MapleMap> instanceMap = new HashMap(); private final ReentrantLock lock = new ReentrantLock(); private static final Map<Integer, List<AbstractLoadedMapleLife>> customLife = new HashMap(); private int channel; public static int loadCustomLife() { customLife.clear(); // init try { Connection con = (Connection) DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("SELECT * FROM `wz_customlife`"); ResultSet rs = ps.executeQuery(); while (rs.next()) { final int mapid = rs.getInt("mid"); final AbstractLoadedMapleLife myLife = loadLife(rs.getInt("dataid"), rs.getInt("f"), rs.getByte("hide") > 0, rs.getInt("fh"), rs.getInt("cy"), rs.getInt("rx0"), rs.getInt("rx1"), rs.getInt("x"), rs.getInt("y"), rs.getString("type"), rs.getInt("mobtime")); if (myLife == null) { continue; } final List<AbstractLoadedMapleLife> entries = customLife.get(mapid); final List<AbstractLoadedMapleLife> collections = new ArrayList<>(); if (entries == null) { collections.add(myLife); customLife.put(mapid, collections); } else { collections.addAll(entries); //re-add collections.add(myLife); customLife.put(mapid, collections); } } rs.close(); ps.close(); return customLife.size(); //System.out.println("Successfully loaded " + customLife.size() + " maps with custom life."); } catch (SQLException e) { System.out.println("Error loading custom life..." + e); } return -1; } public MapleMapFactory(int channel) { this.channel = channel; } public final MapleMap getMap(int mapid) { return getMap(mapid, true, true, true); } private static AbstractLoadedMapleLife loadLife(int id, int f, boolean hide, int fh, int cy, int rx0, int rx1, int x, int y, String type, int mtime) { AbstractLoadedMapleLife myLife = MapleLifeFactory.getLife(id, type); if (myLife == null) { System.out.println(new StringBuilder().append("Custom npc ").append(id).append(" is null...").toString()); return null; } myLife.setCy(cy); myLife.setF(f); myLife.setFh(fh); myLife.setRx0(rx0); myLife.setRx1(rx1); myLife.setPosition(new Point(x, y)); myLife.setHide(hide); myLife.setMTime(mtime); myLife.setCType(type); return myLife; } public final MapleMap getMap(int mapid, boolean respawns, boolean npcs) { return getMap(mapid, respawns, npcs, true); } public final MapleMap getMap(int mapid, boolean respawns, boolean npcs, boolean reactors) { List<AbstractLoadedMapleLife> custom = customLife.get(mapid); Integer omapid = Integer.valueOf(mapid); MapleMap map = (MapleMap) this.maps.get(omapid); if (map == null) { this.lock.lock(); try { map = (MapleMap) this.maps.get(omapid); if (map != null) { return map; } MapleData mapData = null; try { mapData = this.source.getData(getMapName(mapid)); } catch (Exception e) { return null; } if (mapData == null) { return null; } MapleData link = mapData.getChildByPath("info/link"); if (link != null) { mapData = this.source.getData(getMapName(MapleDataTool.getIntConvert("info/link", mapData))); } float monsterRate = 0; if (respawns) { MapleData mobRate = mapData.getChildByPath("info/mobRate"); if (mobRate != null) { monsterRate = ((Float) mobRate.getData()).floatValue(); } } map = new MapleMap(mapid, this.channel, MapleDataTool.getInt("info/returnMap", mapData), monsterRate); loadPortals(map, mapData.getChildByPath("portal")); map.setTop(MapleDataTool.getInt(mapData.getChildByPath("info/VRTop"), 0)); map.setLeft(MapleDataTool.getInt(mapData.getChildByPath("info/VRLeft"), 0)); map.setBottom(MapleDataTool.getInt(mapData.getChildByPath("info/VRBottom"), 0)); map.setRight(MapleDataTool.getInt(mapData.getChildByPath("info/VRRight"), 0)); List<MapleFoothold> allFootholds = new LinkedList(); Point lBound = new Point(); Point uBound = new Point(); for (MapleData footRoot : mapData.getChildByPath("foothold")) { for (MapleData footCat : footRoot) { for (MapleData footHold : footCat) { MapleFoothold fh = new MapleFoothold(new Point(MapleDataTool.getInt(footHold.getChildByPath("x1"), 0), MapleDataTool.getInt(footHold.getChildByPath("y1"), 0)), new Point(MapleDataTool.getInt(footHold.getChildByPath("x2"), 0), MapleDataTool.getInt(footHold.getChildByPath("y2"), 0)), Integer.parseInt(footHold.getName())); fh.setPrev((short) MapleDataTool.getInt(footHold.getChildByPath("prev"), 0)); fh.setNext((short) MapleDataTool.getInt(footHold.getChildByPath("next"), 0)); if (fh.getX1() < lBound.x) { lBound.x = fh.getX1(); } if (fh.getX2() > uBound.x) { uBound.x = fh.getX2(); } if (fh.getY1() < lBound.y) { lBound.y = fh.getY1(); } if (fh.getY2() > uBound.y) { uBound.y = fh.getY2(); } allFootholds.add(fh); } } } MapleFootholdTree fTree = new MapleFootholdTree(lBound, uBound); for (MapleFoothold foothold : allFootholds) { fTree.insert(foothold); } map.setFootholds(fTree); if (map.getTop() == 0) { map.setTop(lBound.y); } if (map.getBottom() == 0) { map.setBottom(uBound.y); } if (map.getLeft() == 0) { map.setLeft(lBound.x); } if (map.getRight() == 0) { map.setRight(uBound.x); } int bossid = -1; String msg = null; if (mapData.getChildByPath("info/timeMob") != null) { bossid = MapleDataTool.getInt(mapData.getChildByPath("info/timeMob/id"), 0); msg = MapleDataTool.getString(mapData.getChildByPath("info/timeMob/message"), null); } if (custom != null) { for (AbstractLoadedMapleLife n : custom) { if (n.getCType().equals("n")) { map.addMapObject(n); } else if (n.getCType().equals("m")) { final MapleMonster monster = (MapleMonster) n; map.addMonsterSpawn(monster, n.getMTime(), (byte) -1, null); } } } List herbRocks = new ArrayList(); int lowestLevel = 200; int highestLevel = 0; for (MapleData life : mapData.getChildByPath("life")) { String type = MapleDataTool.getString(life.getChildByPath("type")); String limited = MapleDataTool.getString("limitedname", life, ""); if (((npcs) || (!type.equals("n"))) && (!limited.equals("Stage0"))) { AbstractLoadedMapleLife myLife = loadLife(life, MapleDataTool.getString(life.getChildByPath("id")), type); if (((myLife instanceof MapleMonster)) && (!GameConstants.isNoSpawn(mapid))) { MapleMonster mob = (MapleMonster) myLife; herbRocks.add(map.addMonsterSpawn(mob, MapleDataTool.getInt("mobTime", life, 0), (byte) MapleDataTool.getInt("team", life, -1), mob.getId() == bossid ? msg : null).getPosition()); if ((mob.getStats().getLevel() > highestLevel) && (!mob.getStats().isBoss())) { highestLevel = mob.getStats().getLevel(); } if ((mob.getStats().getLevel() < lowestLevel) && (!mob.getStats().isBoss())) { lowestLevel = mob.getStats().getLevel(); } } else if ((myLife instanceof MapleNPC)) { map.addMapObject(myLife); } } } addAreaBossSpawn(map); map.setCreateMobInterval((short) MapleDataTool.getInt(mapData.getChildByPath("info/createMobInterval"), 9000)); map.setFixedMob(MapleDataTool.getInt(mapData.getChildByPath("info/fixedMobCapacity"), 0)); map.setPartyBonusRate(GameConstants.getPartyPlay(mapid, MapleDataTool.getInt(mapData.getChildByPath("info/partyBonusR"), 0))); map.loadMonsterRate(true); map.setNodes(loadNodes(mapid, mapData)); if ((reactors) && (mapData.getChildByPath("reactor") != null)) { for (MapleData reactor : mapData.getChildByPath("reactor")) { String id = MapleDataTool.getString(reactor.getChildByPath("id")); if (id != null) { map.spawnReactor(loadReactor(reactor, id, (byte) MapleDataTool.getInt(reactor.getChildByPath("f"), 0))); } } } map.setFirstUserEnter(MapleDataTool.getString(mapData.getChildByPath("info/onFirstUserEnter"), "")); map.setUserEnter(mapid == GameConstants.JAIL ? "jail" : MapleDataTool.getString(mapData.getChildByPath("info/onUserEnter"), "")); if ((reactors) && (herbRocks.size() > 0) && (highestLevel >= 30) && (map.getFirstUserEnter().equals("")) && (map.getUserEnter().equals(""))) { List allowedSpawn = new ArrayList(24); allowedSpawn.add(Integer.valueOf(100011)); allowedSpawn.add(Integer.valueOf(200011)); if (highestLevel >= 100) { for (int i = 0; i < 10; i++) { for (int x = 0; x < 4; x++) { allowedSpawn.add(Integer.valueOf(100000 + i)); allowedSpawn.add(Integer.valueOf(200000 + i)); } } } else { for (int i = lowestLevel % 10 > highestLevel % 10 ? 0 : lowestLevel % 10; i < highestLevel % 10; i++) { for (int x = 0; x < 4; x++) { allowedSpawn.add(Integer.valueOf(100000 + i)); allowedSpawn.add(Integer.valueOf(200000 + i)); } } } int numSpawn = Randomizer.nextInt(allowedSpawn.size()) / 6; for (int i = 0; (i < numSpawn) && (!herbRocks.isEmpty()); i++) { int idd = ((Integer) allowedSpawn.get(Randomizer.nextInt(allowedSpawn.size()))).intValue(); int theSpawn = Randomizer.nextInt(herbRocks.size()); MapleReactor myReactor = new MapleReactor(MapleReactorFactory.getReactor(idd), idd); myReactor.setPosition((Point) herbRocks.get(theSpawn)); myReactor.setDelay(idd % 100 == 11 ? 60000 : 5000); map.spawnReactor(myReactor); herbRocks.remove(theSpawn); } } try { map.setMapName(MapleDataTool.getString("mapName", this.nameData.getChildByPath(getMapStringName(omapid.intValue())), "")); map.setStreetName(MapleDataTool.getString("streetName", this.nameData.getChildByPath(getMapStringName(omapid.intValue())), "")); } catch (Exception e) { map.setMapName(""); map.setStreetName(""); } map.setClock(mapData.getChildByPath("clock") != null); map.setEverlast(MapleDataTool.getInt(mapData.getChildByPath("info/everlast"), 0) > 0); map.setTown(MapleDataTool.getInt(mapData.getChildByPath("info/town"), 0) > 0); map.setSoaring(MapleDataTool.getInt(mapData.getChildByPath("info/needSkillForFly"), 0) > 0); map.setPersonalShop(MapleDataTool.getInt(mapData.getChildByPath("info/personalShop"), 0) > 0); map.setForceMove(MapleDataTool.getInt(mapData.getChildByPath("info/lvForceMove"), 0)); map.setHPDec(MapleDataTool.getInt(mapData.getChildByPath("info/decHP"), 0)); map.setHPDecInterval(MapleDataTool.getInt(mapData.getChildByPath("info/decHPInterval"), 10000)); map.setHPDecProtect(MapleDataTool.getInt(mapData.getChildByPath("info/protectItem"), 0)); map.setForcedReturnMap(mapid == 0 ? 999999999 : MapleDataTool.getInt(mapData.getChildByPath("info/forcedReturn"), 999999999)); map.setTimeLimit(MapleDataTool.getInt(mapData.getChildByPath("info/timeLimit"), -1)); map.setFieldLimit(MapleDataTool.getInt(mapData.getChildByPath("info/fieldLimit"), 0)); map.setRecoveryRate(MapleDataTool.getFloat(mapData.getChildByPath("info/recovery"), 1.0F)); map.setFixedMob(MapleDataTool.getInt(mapData.getChildByPath("info/fixedMobCapacity"), 0)); map.setPartyBonusRate(GameConstants.getPartyPlay(mapid, MapleDataTool.getInt(mapData.getChildByPath("info/partyBonusR"), 0))); map.setConsumeItemCoolTime(MapleDataTool.getInt(mapData.getChildByPath("info/consumeItemCoolTime"), 0)); this.maps.put(omapid, map); } finally { this.lock.unlock(); } } return map; } public MapleMap getInstanceMap(int instanceid) { return (MapleMap) this.instanceMap.get(Integer.valueOf(instanceid)); } public void removeInstanceMap(int instanceid) { this.lock.lock(); try { if (isInstanceMapLoaded(instanceid)) { getInstanceMap(instanceid).checkStates(""); this.instanceMap.remove(Integer.valueOf(instanceid)); } } finally { this.lock.unlock(); } } public void removeMap(int instanceid) { this.lock.lock(); try { if (isMapLoaded(instanceid)) { getMap(instanceid).checkStates(""); this.maps.remove(Integer.valueOf(instanceid)); } } finally { this.lock.unlock(); } } public MapleMap CreateInstanceMap(int mapid, boolean respawns, boolean npcs, boolean reactors, int instanceid) { this.lock.lock(); try { if (isInstanceMapLoaded(instanceid)) { return getInstanceMap(instanceid); } } finally { this.lock.unlock(); } MapleData mapData = null; try { mapData = this.source.getData(getMapName(mapid)); } catch (Exception e) { return null; } if (mapData == null) { return null; } MapleData link = mapData.getChildByPath("info/link"); if (link != null) { mapData = this.source.getData(getMapName(MapleDataTool.getIntConvert("info/link", mapData))); } float monsterRate = 0.0F; if (respawns) { MapleData mobRate = mapData.getChildByPath("info/mobRate"); if (mobRate != null) { monsterRate = ((Float) mobRate.getData()).floatValue(); } } MapleMap map = new MapleMap(mapid, this.channel, MapleDataTool.getInt("info/returnMap", mapData), monsterRate); loadPortals(map, mapData.getChildByPath("portal")); map.setTop(MapleDataTool.getInt(mapData.getChildByPath("info/VRTop"), 0)); map.setLeft(MapleDataTool.getInt(mapData.getChildByPath("info/VRLeft"), 0)); map.setBottom(MapleDataTool.getInt(mapData.getChildByPath("info/VRBottom"), 0)); map.setRight(MapleDataTool.getInt(mapData.getChildByPath("info/VRRight"), 0)); List<MapleFoothold> allFootholds = new LinkedList(); Point lBound = new Point(); Point uBound = new Point(); for (MapleData footRoot : mapData.getChildByPath("foothold")) { for (MapleData footCat : footRoot) { for (MapleData footHold : footCat) { MapleFoothold fh = new MapleFoothold(new Point(MapleDataTool.getInt(footHold.getChildByPath("x1")), MapleDataTool.getInt(footHold.getChildByPath("y1"))), new Point(MapleDataTool.getInt(footHold.getChildByPath("x2")), MapleDataTool.getInt(footHold.getChildByPath("y2"))), Integer.parseInt(footHold.getName())); fh.setPrev((short) MapleDataTool.getInt(footHold.getChildByPath("prev"))); fh.setNext((short) MapleDataTool.getInt(footHold.getChildByPath("next"))); if (fh.getX1() < lBound.x) { lBound.x = fh.getX1(); } if (fh.getX2() > uBound.x) { uBound.x = fh.getX2(); } if (fh.getY1() < lBound.y) { lBound.y = fh.getY1(); } if (fh.getY2() > uBound.y) { uBound.y = fh.getY2(); } allFootholds.add(fh); } } } MapleFootholdTree fTree = new MapleFootholdTree(lBound, uBound); for (MapleFoothold fh : allFootholds) { fTree.insert(fh); } map.setFootholds(fTree); if (map.getTop() == 0) { map.setTop(lBound.y); } if (map.getBottom() == 0) { map.setBottom(uBound.y); } if (map.getLeft() == 0) { map.setLeft(lBound.x); } if (map.getRight() == 0) { map.setRight(uBound.x); } int bossid = -1; String msg = null; if (mapData.getChildByPath("info/timeMob") != null) { bossid = MapleDataTool.getInt(mapData.getChildByPath("info/timeMob/id"), 0); msg = MapleDataTool.getString(mapData.getChildByPath("info/timeMob/message"), null); } for (MapleData life : mapData.getChildByPath("life")) { String type = MapleDataTool.getString(life.getChildByPath("type")); String limited = MapleDataTool.getString("limitedname", life, ""); if (((npcs) || (!type.equals("n"))) && (limited.equals(""))) { AbstractLoadedMapleLife myLife = loadLife(life, MapleDataTool.getString(life.getChildByPath("id")), type); if (((myLife instanceof MapleMonster)) && (!GameConstants.isNoSpawn(mapid))) { MapleMonster mob = (MapleMonster) myLife; map.addMonsterSpawn(mob, MapleDataTool.getInt("mobTime", life, 0), (byte) MapleDataTool.getInt("team", life, -1), mob.getId() == bossid ? msg : null); } else if ((myLife instanceof MapleNPC)) { map.addMapObject(myLife); } } } addAreaBossSpawn(map); map.setCreateMobInterval((short) MapleDataTool.getInt(mapData.getChildByPath("info/createMobInterval"), 9000)); map.setFixedMob(MapleDataTool.getInt(mapData.getChildByPath("info/fixedMobCapacity"), 0)); map.setPartyBonusRate(GameConstants.getPartyPlay(mapid, MapleDataTool.getInt(mapData.getChildByPath("info/partyBonusR"), 0))); map.loadMonsterRate(true); map.setNodes(loadNodes(mapid, mapData)); if ((reactors) && (mapData.getChildByPath("reactor") != null)) { for (MapleData reactor : mapData.getChildByPath("reactor")) { String id = MapleDataTool.getString(reactor.getChildByPath("id")); if (id != null) { map.spawnReactor(loadReactor(reactor, id, (byte) MapleDataTool.getInt(reactor.getChildByPath("f"), 0))); } } } try { map.setMapName(MapleDataTool.getString("mapName", this.nameData.getChildByPath(getMapStringName(mapid)), "")); map.setStreetName(MapleDataTool.getString("streetName", this.nameData.getChildByPath(getMapStringName(mapid)), "")); } catch (Exception e) { map.setMapName(""); map.setStreetName(""); } map.setClock(MapleDataTool.getInt(mapData.getChildByPath("info/clock"), 0) > 0); map.setEverlast(MapleDataTool.getInt(mapData.getChildByPath("info/everlast"), 0) > 0); map.setTown(MapleDataTool.getInt(mapData.getChildByPath("info/town"), 0) > 0); map.setSoaring(MapleDataTool.getInt(mapData.getChildByPath("info/needSkillForFly"), 0) > 0); map.setForceMove(MapleDataTool.getInt(mapData.getChildByPath("info/lvForceMove"), 0)); map.setHPDec(MapleDataTool.getInt(mapData.getChildByPath("info/decHP"), 0)); map.setHPDecInterval(MapleDataTool.getInt(mapData.getChildByPath("info/decHPInterval"), 10000)); map.setHPDecProtect(MapleDataTool.getInt(mapData.getChildByPath("info/protectItem"), 0)); map.setForcedReturnMap(MapleDataTool.getInt(mapData.getChildByPath("info/forcedReturn"), 999999999)); map.setTimeLimit(MapleDataTool.getInt(mapData.getChildByPath("info/timeLimit"), -1)); map.setFieldLimit(MapleDataTool.getInt(mapData.getChildByPath("info/fieldLimit"), 0)); map.setFirstUserEnter(MapleDataTool.getString(mapData.getChildByPath("info/onFirstUserEnter"), "")); map.setUserEnter(MapleDataTool.getString(mapData.getChildByPath("info/onUserEnter"), "")); map.setRecoveryRate(MapleDataTool.getFloat(mapData.getChildByPath("info/recovery"), 1.0F)); map.setConsumeItemCoolTime(MapleDataTool.getInt(mapData.getChildByPath("info/consumeItemCoolTime"), 0)); map.setInstanceId(instanceid); this.lock.lock(); try { this.instanceMap.put(Integer.valueOf(instanceid), map); } finally { this.lock.unlock(); } return map; } public int getLoadedMaps() { return this.maps.size(); } public boolean isMapLoaded(int mapId) { return this.maps.containsKey(Integer.valueOf(mapId)); } public boolean isInstanceMapLoaded(int instanceid) { return this.instanceMap.containsKey(Integer.valueOf(instanceid)); } public void clearLoadedMap() { this.lock.lock(); try { this.maps.clear(); } finally { this.lock.unlock(); } } public List<MapleMap> getAllLoadedMaps() { List ret = new ArrayList(); this.lock.lock(); try { ret.addAll(this.maps.values()); ret.addAll(this.instanceMap.values()); } finally { this.lock.unlock(); } return ret; } public Collection<MapleMap> getAllMaps() { return this.maps.values(); } private AbstractLoadedMapleLife loadLife(MapleData life, String id, String type) { AbstractLoadedMapleLife myLife = MapleLifeFactory.getLife(Integer.parseInt(id), type); if (myLife == null) { return null; } myLife.setCy(MapleDataTool.getInt(life.getChildByPath("cy"))); MapleData dF = life.getChildByPath("f"); if (dF != null) { myLife.setF(MapleDataTool.getInt(dF)); } myLife.setFh(MapleDataTool.getInt(life.getChildByPath("fh"))); myLife.setRx0(MapleDataTool.getInt(life.getChildByPath("rx0"))); myLife.setRx1(MapleDataTool.getInt(life.getChildByPath("rx1"))); myLife.setPosition(new Point(MapleDataTool.getInt(life.getChildByPath("x")), MapleDataTool.getInt(life.getChildByPath("y")))); if ((MapleDataTool.getInt("hide", life, 0) == 1) && ((myLife instanceof MapleNPC))) { myLife.setHide(true); } return myLife; } private final MapleReactor loadReactor(MapleData reactor, String id, byte FacingDirection) { MapleReactor myReactor = new MapleReactor(MapleReactorFactory.getReactor(Integer.parseInt(id)), Integer.parseInt(id)); myReactor.setFacingDirection(FacingDirection); myReactor.setPosition(new Point(MapleDataTool.getInt(reactor.getChildByPath("x")), MapleDataTool.getInt(reactor.getChildByPath("y")))); myReactor.setDelay(MapleDataTool.getInt(reactor.getChildByPath("reactorTime")) * 1000); myReactor.setName(MapleDataTool.getString(reactor.getChildByPath("name"), "")); return myReactor; } private String getMapName(int mapid) { String mapName = StringUtil.getLeftPaddedStr(Integer.toString(mapid), '0', 9); StringBuilder builder = new StringBuilder("Map/Map"); builder.append(mapid / 100000000); builder.append("/"); builder.append(mapName); builder.append(".img"); mapName = builder.toString(); return mapName; } private String getMapStringName(int mapid) { StringBuilder builder = new StringBuilder(); if (mapid < 100000000) { builder.append("maple"); } else if (((mapid >= 100000000) && (mapid < 200000000)) || (mapid / 100000 == 5540)) { builder.append("victoria"); } else if ((mapid >= 200000000) && (mapid < 300000000)) { builder.append("ossyria"); } else if ((mapid >= 300000000) && (mapid < 400000000)) { builder.append("3rd"); } else if ((mapid >= 500000000) && (mapid < 510000000)) { builder.append(GameConstants.GMS ? "thai" : "TH"); } else if ((mapid >= 555000000) && (mapid < 556000000)) { builder.append("SG"); } else if ((mapid >= 540000000) && (mapid < 600000000)) { builder.append(GameConstants.GMS ? "singapore" : "SG"); } else if ((mapid >= 682000000) && (mapid < 683000000)) { builder.append(GameConstants.GMS ? "HalloweenGL" : "GL"); } else if ((mapid >= 600000000) && (mapid < 670000000)) { builder.append(GameConstants.GMS ? "MasteriaGL" : "GL"); } else if ((mapid >= 677000000) && (mapid < 678000000)) { builder.append(GameConstants.GMS ? "Episode1GL" : "GL"); } else if ((mapid >= 670000000) && (mapid < 682000000)) { builder.append(GameConstants.GMS ? "weddingGL" : "GL"); } else if ((mapid >= 687000000) && (mapid < 688000000)) { builder.append("Gacha_GL"); } else if ((mapid >= 689000000) && (mapid < 690000000)) { builder.append("CTF_GL"); } else if ((mapid >= 683000000) && (mapid < 684000000)) { builder.append("event"); } else if ((mapid >= 684000000) && (mapid < 685000000)) { builder.append("event_5th"); } else if ((mapid >= 700000000) && (mapid < 700000300)) { builder.append("wedding"); } else if ((mapid >= 701000000) && (mapid < 701020000)) { builder.append("china"); } else if (((mapid >= 702090000) && (mapid <= 702100000)) || ((mapid >= 740000000) && (mapid < 741000000))) { builder.append("TW"); } else if ((mapid >= 702000000) && (mapid < 742000000)) { builder.append("CN"); } else if ((mapid >= 800000000) && (mapid < 900000000)) { builder.append(GameConstants.GMS ? "jp" : "JP"); } else { builder.append("etc"); } builder.append("/"); builder.append(mapid); return builder.toString(); } public void setChannel(int channel) { this.channel = channel; } private void addAreaBossSpawn(MapleMap map) { int monsterid = -1; int mobtime = -1; String msg = null; boolean shouldSpawn = true; Point pos1 = null; Point pos2 = null; Point pos3 = null; switch (map.getId()) { case 104010200: mobtime = 1200; monsterid = 2220000; msg = "A cool breeze was felt when Mano appeared."; pos1 = new Point(189, 2); pos2 = new Point(478, 250); pos3 = new Point(611, 489); break; case 102020500: mobtime = 1200; monsterid = 3220000; msg = "Stumpy has appeared with a stumping sound that rings the Stone Mountain."; pos1 = new Point(1121, 2130); pos2 = new Point(483, 2171); pos3 = new Point(1474, 1706); break; case 100020101: mobtime = 1200; monsterid = 6130101; msg = "Mushmom has appeared."; pos1 = new Point(-311, 201); pos2 = new Point(-903, 197); pos3 = new Point(-568, 196); break; case 100020301: mobtime = 1200; monsterid = 8220007; msg = "Blue Mushmom has appeared."; pos1 = new Point(-188, -657); pos2 = new Point(625, -660); pos3 = new Point(508, -648); break; case 100020401: mobtime = 1200; monsterid = 6300005; msg = "Zombie Mushmom has appeared."; pos1 = new Point(-130, -773); pos2 = new Point(504, -760); pos3 = new Point(608, -641); break; case 120030500: mobtime = 1200; monsterid = 5220001; msg = "A strange turban shell has appeared on the beach."; pos1 = new Point(-355, 179); pos2 = new Point(-1283, -113); pos3 = new Point(-571, -593); break; case 250010304: mobtime = 2100; monsterid = 7220000; msg = "Tae Roon appeared with a loud growl."; pos1 = new Point(-210, 33); pos2 = new Point(-234, 393); pos3 = new Point(-654, 33); break; case 200010300: mobtime = 1200; monsterid = 8220000; msg = "Eliza has appeared with a black whirlwind."; pos1 = new Point(665, 83); pos2 = new Point(672, -217); pos3 = new Point(-123, -217); break; case 250010503: mobtime = 1800; monsterid = 7220002; msg = "The area fills with an unpleasant force of evil.. even the occasional ones of the cats sound disturbing"; pos1 = new Point(-303, 543); pos2 = new Point(227, 543); pos3 = new Point(719, 543); break; case 222010310: mobtime = 2700; monsterid = 7220001; msg = "As the moon light dims,a long fox cry can be heard and the presence of the old fox can be felt."; pos1 = new Point(-169, -147); pos2 = new Point(-517, 93); pos3 = new Point(247, 93); break; case 103030400: mobtime = 1800; monsterid = 6220000; msg = "The huge crocodile Dyle has come out from the swamp."; pos1 = new Point(-831, 109); pos2 = new Point(1525, -75); pos3 = new Point(-511, 107); break; case 101040300: mobtime = 1800; monsterid = 5220002; msg = "The blue fog became darker when Faust appeared."; pos1 = new Point(600, -600); pos2 = new Point(600, -800); pos3 = new Point(600, -300); break; case 220050100: mobtime = 1500; monsterid = 5220003; msg = "Click clock! Timer has appeared with an irregular clock sound."; pos1 = new Point(-467, 1032); pos2 = new Point(532, 1032); pos3 = new Point(-47, 1032); break; case 221040301: mobtime = 2400; monsterid = 6220001; msg = "Zeno has appeared with a heavy sound of machinery."; pos1 = new Point(-4134, 416); pos2 = new Point(-4283, 776); pos3 = new Point(-3292, 776); break; case 240040401: mobtime = 7200; monsterid = 8220003; msg = "Leviathan has appeared with a cold wind from over the gorge."; pos1 = new Point(-15, 2481); pos2 = new Point(127, 1634); pos3 = new Point(159, 1142); break; case 260010201: mobtime = 3600; monsterid = 3220001; msg = "Deo slowly appeared out of the sand dust."; pos1 = new Point(-215, 275); pos2 = new Point(298, 275); pos3 = new Point(592, 275); break; case 251010102: mobtime = 3600; monsterid = 5220004; msg = "A giant centipede appeared."; pos1 = new Point(-41, 124); pos2 = new Point(-173, 126); pos3 = new Point(79, 118); break; case 261030000: mobtime = 2700; monsterid = 8220002; msg = "Chimera has appeared out of the darkness of the underground with a glitter in her eyes."; pos1 = new Point(-1094, -405); pos2 = new Point(-772, -116); pos3 = new Point(-108, 181); break; case 230020100: mobtime = 2700; monsterid = 4220000; msg = "A strange shell has appeared from a grove of seaweed."; pos1 = new Point(-291, -20); pos2 = new Point(-272, -500); pos3 = new Point(-462, 640); break; case 103020320: mobtime = 1800; monsterid = 5090000; msg = "Shade has appeared."; pos1 = new Point(79, 174); pos2 = new Point(-223, 296); pos3 = new Point(80, 275); break; case 103020420: mobtime = 1800; monsterid = 5090000; msg = "Shade has appeared."; pos1 = new Point(2241, 301); pos2 = new Point(1990, 301); pos3 = new Point(1684, 307); break; case 261020300: mobtime = 2700; monsterid = 7090000; msg = "A camera has appeared."; pos1 = new Point(312, 157); pos2 = new Point(539, 136); pos3 = new Point(760, 141); break; case 261020401: mobtime = 2700; monsterid = 8090000; msg = "Deet and Roi has appeared."; pos1 = new Point(-263, 155); pos2 = new Point(-436, 122); pos3 = new Point(22, 144); break; case 250020300: mobtime = 2700; monsterid = 5090001; msg = "Master Dummy has appeared."; pos1 = new Point(1208, 27); pos2 = new Point(1654, 40); pos3 = new Point(927, -502); break; case 211050000: mobtime = 2700; monsterid = 6090001; msg = "The witch of snow has appeared."; pos1 = new Point(-233, -431); pos2 = new Point(-370, -426); pos3 = new Point(-526, -420); break; case 261010003: mobtime = 2700; monsterid = 6090004; msg = "Rurumo has appeared."; pos1 = new Point(-861, 301); pos2 = new Point(-703, 301); pos3 = new Point(-426, 287); break; case 222010300: mobtime = 2700; monsterid = 6090003; msg = "A wise ghost has appeared."; pos1 = new Point(1300, -400); pos2 = new Point(1100, -100); pos3 = new Point(1100, 100); break; case 251010101: mobtime = 2700; monsterid = 6090002; msg = "A warrior with bamboo has appeared."; pos1 = new Point(-15, -449); pos2 = new Point(-114, -442); pos3 = new Point(-255, -446); break; case 211041400: mobtime = 2700; monsterid = 6090000; msg = "Riche has appeared."; pos1 = new Point(1672, 82); pos2 = new Point(2071, 10); pos3 = new Point(1417, 57); break; case 105030500: mobtime = 2700; monsterid = 8130100; msg = "Jr. Balrog has appeared."; pos1 = new Point(1275, -399); pos2 = new Point(1254, -412); pos3 = new Point(1058, -427); break; case 105020400: mobtime = 2700; monsterid = 8220008; msg = "A mysterious shop appeared."; pos1 = new Point(-163, 82); pos2 = new Point(958, 107); pos3 = new Point(706, -206); break; case 211040101: mobtime = 3600; monsterid = 8220001; msg = "A snowman covered in ice has appeared."; pos1 = new Point(485, 244); pos2 = new Point(-60, 249); pos3 = new Point(208, 255); break; case 910000000: if (this.channel == 7) { mobtime = 3600; monsterid = 9420015; msg = "NooNoo has appeared out of anger."; pos1 = new Point(498, 4); pos2 = new Point(498, 4); pos3 = new Point(498, 4); } else if (this.channel == 8) { mobtime = 3600; monsterid = 9400734; msg = "Coco has appeared."; pos1 = new Point(498, 4); pos2 = new Point(498, 4); pos3 = new Point(498, 4); } else if (this.channel == 9) { mobtime = 3600; monsterid = 9400800; msg = "Black dragon has appeared."; pos1 = new Point(498, 4); pos2 = new Point(498, 4); pos3 = new Point(498, 4); } break; case 209000000: mobtime = 300; monsterid = 9500317; msg = "Little Snowman has appeared!"; pos1 = new Point(-115, 154); pos2 = new Point(-115, 154); pos3 = new Point(-115, 154); break; case 677000001: mobtime = 60; monsterid = 9400612; msg = "Marbas has appeared."; pos1 = new Point(99, 60); pos2 = new Point(99, 60); pos3 = new Point(99, 60); break; case 677000003: mobtime = 60; monsterid = 9400610; msg = "Amdusias has appeared."; pos1 = new Point(6, 35); pos2 = new Point(6, 35); pos3 = new Point(6, 35); break; case 677000005: mobtime = 60; monsterid = 9400609; msg = "Andras has appeared."; pos1 = new Point(-277, 78); pos2 = new Point(547, 86); pos3 = new Point(-347, 80); break; case 677000007: mobtime = 60; monsterid = 9400611; msg = "Crocell has appeared."; pos1 = new Point(117, 73); pos2 = new Point(117, 73); pos3 = new Point(117, 73); break; case 677000009: mobtime = 60; monsterid = 9400613; msg = "Valefor has appeared."; pos1 = new Point(85, 66); pos2 = new Point(85, 66); pos3 = new Point(85, 66); break; case 931000500: mobtime = 108000; monsterid = 9304005; msg = "Jaira has appeared."; pos1 = new Point(-872, -332); pos2 = new Point(409, -572); pos3 = new Point(-131, 0); shouldSpawn = false; } if (monsterid > 0) { map.addAreaMonsterSpawn(MapleLifeFactory.getMonster(monsterid), pos1, pos2, pos3, mobtime, msg, shouldSpawn); } } private void loadPortals(MapleMap map, MapleData port) { if (port == null) { return; } int nextDoorPortal = 128; for (MapleData portal : port.getChildren()) { MaplePortal myPortal = new MaplePortal(MapleDataTool.getInt(portal.getChildByPath("pt"))); myPortal.setName(MapleDataTool.getString(portal.getChildByPath("pn"))); myPortal.setTarget(MapleDataTool.getString(portal.getChildByPath("tn"))); myPortal.setTargetMapId(MapleDataTool.getInt(portal.getChildByPath("tm"))); myPortal.setPosition(new Point(MapleDataTool.getInt(portal.getChildByPath("x")), MapleDataTool.getInt(portal.getChildByPath("y")))); String script = MapleDataTool.getString("script", portal, null); if ((script != null) && (script.equals(""))) { script = null; } myPortal.setScriptName(script); if (myPortal.getType() == 6) { myPortal.setId(nextDoorPortal); nextDoorPortal++; } else { myPortal.setId(Integer.parseInt(portal.getName())); } map.addPortal(myPortal); } } private MapleNodes loadNodes(int mapid, MapleData mapData) { MapleNodes nodeInfo = new MapleNodes(mapid); if (mapData.getChildByPath("nodeInfo") != null) { for (MapleData node : mapData.getChildByPath("nodeInfo")) { try { if (node.getName().equals("start")) { nodeInfo.setNodeStart(MapleDataTool.getInt(node, 0)); } else { List edges = new ArrayList(); if (node.getChildByPath("edge") != null) { for (MapleData edge : node.getChildByPath("edge")) { edges.add(Integer.valueOf(MapleDataTool.getInt(edge, -1))); } } MapleNodes.MapleNodeInfo mni = new MapleNodes.MapleNodeInfo(Integer.parseInt(node.getName()), MapleDataTool.getIntConvert("key", node, 0), MapleDataTool.getIntConvert("x", node, 0), MapleDataTool.getIntConvert("y", node, 0), MapleDataTool.getIntConvert("attr", node, 0), edges); nodeInfo.addNode(mni); } } catch (NumberFormatException e) { } } nodeInfo.sortNodes(); } for (int i = 1; i <= 7; i++) { if ((mapData.getChildByPath(String.valueOf(i)) != null) && (mapData.getChildByPath(new StringBuilder().append(i).append("/obj").toString()) != null)) { for (MapleData node : mapData.getChildByPath(new StringBuilder().append(i).append("/obj").toString())) { if ((node.getChildByPath("SN_count") != null) && (node.getChildByPath("speed") != null)) { int sn_count = MapleDataTool.getIntConvert("SN_count", node, 0); String name = MapleDataTool.getString("name", node, ""); int speed = MapleDataTool.getIntConvert("speed", node, 0); if ((sn_count > 0) && (speed > 0) && (!name.equals(""))) { List SN = new ArrayList(); for (int x = 0; x < sn_count; x++) { SN.add(Integer.valueOf(MapleDataTool.getIntConvert(new StringBuilder().append("SN").append(x).toString(), node, 0))); } MapleNodes.MaplePlatform mni = new MapleNodes.MaplePlatform(name, MapleDataTool.getIntConvert("start", node, 2), speed, MapleDataTool.getIntConvert("x1", node, 0), MapleDataTool.getIntConvert("y1", node, 0), MapleDataTool.getIntConvert("x2", node, 0), MapleDataTool.getIntConvert("y2", node, 0), MapleDataTool.getIntConvert("r", node, 0), SN); nodeInfo.addPlatform(mni); } } else if (node.getChildByPath("tags") != null) { String name = MapleDataTool.getString("tags", node, ""); nodeInfo.addFlag(new Pair(name, Integer.valueOf(name.endsWith("3") ? 1 : 0))); } } } } if (mapData.getChildByPath("area") != null) { for (MapleData area : mapData.getChildByPath("area")) { int x1 = MapleDataTool.getInt(area.getChildByPath("x1")); int y1 = MapleDataTool.getInt(area.getChildByPath("y1")); int x2 = MapleDataTool.getInt(area.getChildByPath("x2")); int y2 = MapleDataTool.getInt(area.getChildByPath("y2")); Rectangle mapArea = new Rectangle(x1, y1, x2 - x1, y2 - y1); nodeInfo.addMapleArea(mapArea); } } if (mapData.getChildByPath("CaptureTheFlag") != null) { MapleData mc = mapData.getChildByPath("CaptureTheFlag"); for (MapleData area : mc) { nodeInfo.addGuardianSpawn(new Point(MapleDataTool.getInt(area.getChildByPath("FlagPositionX")), MapleDataTool.getInt(area.getChildByPath("FlagPositionY"))), area.getName().startsWith("Red") ? 0 : 1); } } if (mapData.getChildByPath("directionInfo") != null) { MapleData mc = mapData.getChildByPath("directionInfo"); for (MapleData area : mc) { MapleNodes.DirectionInfo di = new MapleNodes.DirectionInfo(Integer.parseInt(area.getName()), MapleDataTool.getInt("x", area, 0), MapleDataTool.getInt("y", area, 0), MapleDataTool.getInt("forcedInput", area, 0) > 0); MapleData mc2 = area.getChildByPath("eventQ"); if (mc2 != null) { for (MapleData event : mc2) { di.eventQ.add(MapleDataTool.getString(event)); } } nodeInfo.addDirection(Integer.parseInt(area.getName()), di); } } if (mapData.getChildByPath("monsterCarnival") != null) { MapleData mc = mapData.getChildByPath("monsterCarnival"); if (mc.getChildByPath("mobGenPos") != null) { for (MapleData area : mc.getChildByPath("mobGenPos")) { nodeInfo.addMonsterPoint(MapleDataTool.getInt(area.getChildByPath("x")), MapleDataTool.getInt(area.getChildByPath("y")), MapleDataTool.getInt(area.getChildByPath("fh")), MapleDataTool.getInt(area.getChildByPath("cy")), MapleDataTool.getInt("team", area, -1)); } } if (mc.getChildByPath("mob") != null) { for (MapleData area : mc.getChildByPath("mob")) { nodeInfo.addMobSpawn(MapleDataTool.getInt(area.getChildByPath("id")), MapleDataTool.getInt(area.getChildByPath("spendCP"))); } } if (mc.getChildByPath("guardianGenPos") != null) { for (MapleData area : mc.getChildByPath("guardianGenPos")) { nodeInfo.addGuardianSpawn(new Point(MapleDataTool.getInt(area.getChildByPath("x")), MapleDataTool.getInt(area.getChildByPath("y"))), MapleDataTool.getInt("team", area, -1)); } } if (mc.getChildByPath("skill") != null) { for (MapleData area : mc.getChildByPath("skill")) { nodeInfo.addSkillId(MapleDataTool.getInt(area)); } } } return nodeInfo; } }