public void Insert(MapleFoothold f) { if (m_depth == 0) { if (f.Point1.X > MaxDropX) { MaxDropX = f.Point1.X; } if (f.Point1.X < MinDropX) { MinDropX = f.Point1.X; } if (f.Point2.X > MaxDropX) { MaxDropX = f.Point2.X; } if (f.Point2.X < MinDropX) { MinDropX = f.Point2.X; } } if (m_depth == MaxDepth || (f.Point1.X >= Point1.X && f.Point2.X <= Point2.X && f.Point1.Y >= Point1.Y && f.Point2.Y <= Point2.Y)) { m_footholds.Add(f); } else { if (m_nw == null) { m_nw = new MapleFootholdTree(Point1, m_center, m_depth + 1); m_ne = new MapleFootholdTree(new Point(m_center.X, Point1.Y), new Point(Point2.X, m_center.Y), m_depth + 1); m_sw = new MapleFootholdTree(new Point(Point1.X, m_center.Y), new Point(m_center.X, Point2.Y), m_depth + 1); m_se = new MapleFootholdTree(m_center, Point2, m_depth + 1); } if (f.Point2.X <= m_center.X && f.Point2.Y <= m_center.Y) { m_nw.Insert(f); } else if (f.Point1.X > m_center.X && f.Point2.Y <= m_center.Y) { m_ne.Insert(f); } else if (f.Point2.X <= m_center.X && f.Point1.Y > m_center.Y) { m_sw.Insert(f); } else { m_se.Insert(f); } } }
public MapleMap GetMap(int mapid) { var omapid = mapid; MapleMap map; if (!Maps.TryGetValue(omapid, out map)) { lock (this) { // check if someone else who was also synchronized has loaded the map already if (Maps.ContainsKey(omapid)) { return(Maps[omapid]); } var mapName = GetMapName(mapid); var mapData = m_mSource.GetData(mapName); var link = MapleDataTool.GetString(mapData.GetChildByPath("info/link"), ""); if (!link.Equals("")) { mapName = GetMapName(int.Parse(link)); mapData = m_mSource.GetData(mapName); } float monsterRate = 0; var mobRate = mapData.GetChildByPath("info/mobRate"); if (mobRate != null) { monsterRate = (float)mobRate.Data; } map = new MapleMap(mapid, ChannelId, MapleDataTool.GetInt("info/returnMap", mapData), monsterRate) { OnFirstUserEnter = MapleDataTool.GetString(mapData.GetChildByPath("info/onFirstUserEnter"), mapid.ToString()), OnUserEnter = MapleDataTool.GetString(mapData.GetChildByPath("info/onUserEnter"), mapid.ToString()), TimeMobId = MapleDataTool.GetInt(mapData.GetChildByPath("info/timeMob/id"), -1), TimeMobMessage = MapleDataTool.GetString(mapData.GetChildByPath("info/timeMob/message"), "") }; var portalFactory = new PortalFactory(); foreach (var portal in mapData.GetChildByPath("portal")) { var portalresult = portalFactory.MakePortal((PortalType)MapleDataTool.GetInt(portal.GetChildByPath("pt")), portal); map.Portals.Add(portalresult.PortalId, portalresult); } var allFootholds = new List <MapleFoothold>(); var lBound = new Point(); var uBound = new Point(); foreach (var footRoot in mapData.GetChildByPath("foothold")) { foreach (var footCat in footRoot) { foreach (var footHold in footCat) { var x1 = MapleDataTool.GetInt(footHold.GetChildByPath("x1")); var y1 = MapleDataTool.GetInt(footHold.GetChildByPath("y1")); var x2 = MapleDataTool.GetInt(footHold.GetChildByPath("x2")); var y2 = MapleDataTool.GetInt(footHold.GetChildByPath("y2")); var fh = new MapleFoothold(new Point(x1, y1), new Point(x2, y2), int.Parse(footHold.Name)); fh.PrevFootholdId = MapleDataTool.GetInt(footHold.GetChildByPath("prev")); fh.NextFootholdId = MapleDataTool.GetInt(footHold.GetChildByPath("next")); if (fh.Point1.X < lBound.X) { lBound.X = fh.Point1.X; } if (fh.Point2.X > uBound.X) { uBound.X = fh.Point2.X; } if (fh.Point1.Y < lBound.Y) { lBound.Y = fh.Point1.Y; } if (fh.Point2.Y > uBound.Y) { uBound.Y = fh.Point2.Y; } allFootholds.Add(fh); } } } var fTree = new MapleFootholdTree(lBound, uBound); foreach (var fh in allFootholds) { fTree.Insert(fh); } map.Footholds = fTree; // load areas (EG PQ platforms) if (mapData.GetChildByPath("area") != null) { foreach (var area in mapData.GetChildByPath("area")) { var x1 = MapleDataTool.GetInt(area.GetChildByPath("x1")); var y1 = MapleDataTool.GetInt(area.GetChildByPath("y1")); var x2 = MapleDataTool.GetInt(area.GetChildByPath("x2")); var y2 = MapleDataTool.GetInt(area.GetChildByPath("y2")); var mapArea = new Rectangle(x1, y1, x2 - x1, y2 - y1); map.Areas.Add(mapArea); } } // load life data (npc, monsters) foreach (var life in mapData.GetChildByPath("life")) { var id = MapleDataTool.GetString(life.GetChildByPath("id")); var type = MapleDataTool.GetString(life.GetChildByPath("type")); var myLife = LoadLife(life, id, type); var mapleMonster = myLife as MapleMonster; if (mapleMonster != null) { var monster = mapleMonster; var mobTime = MapleDataTool.GetInt("mobTime", life, 0); if (mobTime == -1) { //does not respawn, force spawn once map.SpawnMonster(monster); } else { map.AddMonsterSpawn(monster, mobTime); } } else { map.AddMapObject(myLife); } } //load reactor data if (mapData.GetChildByPath("reactor") != null) { foreach (var reactor in mapData.GetChildByPath("reactor")) { var id = MapleDataTool.GetString(reactor.GetChildByPath("id")); if (id != null) { var newReactor = LoadReactor(reactor, id); map.SpawnReactor(newReactor); } } } //try //{ map.MapName = MapleDataTool.GetString("mapName", m_mNameData.GetChildByPath(GetMapStringName(omapid)), ""); map.StreetName = MapleDataTool.GetString("streetName", m_mNameData.GetChildByPath(GetMapStringName(omapid)), ""); //} //catch //{ //map.MapName = ""; //map.StreetName = ""; //} map.Clock = mapData.GetChildByPath("clock") != null; map.Everlast = mapData.GetChildByPath("everlast") != null; map.Town = mapData.GetChildByPath("town") != null; map.AllowShops = MapleDataTool.GetInt(mapData.GetChildByPath("info/personalShop"), 0) == 1; map.DecHp = MapleDataTool.ConvertToInt("decHP", mapData, 0); map.ProtectItem = MapleDataTool.ConvertToInt("protectItem", mapData, 0); map.ForcedReturnMapId = MapleDataTool.GetInt(mapData.GetChildByPath("info/forcedReturn"), 999999999); map.OnFirstUserEnter = MapleDataTool.GetString(mapData.GetChildByPath("info/onFirstUserEnter"), ""); map.OnUserEnter = MapleDataTool.GetString(mapData.GetChildByPath("info/onUserEnter"), ""); map.HasBoat = mapData.GetChildByPath("shipObj") != null; map.FieldLimit = MapleDataTool.GetInt(mapData.GetChildByPath("info/fieldLimit"), 0); map.TimeLimit = MapleDataTool.ConvertToInt("timeLimit", mapData.GetChildByPath("info"), -1); map.FieldType = MapleDataTool.ConvertToInt("info/fieldType", mapData, 0); Maps.Add(omapid, map); //try //{ // PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("SELECT * FROM spawns WHERE mid = ?"); // ps.setInt(1, omapid); // ResultSet rs = ps.executeQuery(); // while (rs.next()) // { // int id = rs.getInt("idd"); // int f = rs.getInt("f"); // bool hide = false; // string type = rs.getString("type"); // int fh = rs.getInt("fh"); // int cy = rs.getInt("cy"); // int rx0 = rs.getInt("rx0"); // int rx1 = rs.getInt("rx1"); // int x = rs.getInt("x"); // int y = rs.getInt("y"); // int mobTime = rs.getInt("mobtime"); // AbstractLoadedMapleLife myLife = loadLife(id, f, hide, fh, cy, rx0, rx1, x, y, type); // if (type.equals("n")) // { // map.addMapObject(myLife); // } // else if (type.equals("m")) // { // MapleMonster monster = (MapleMonster)myLife; // map.addMonsterSpawn(monster, mobTime); // } // } //} //catch (SQLException e) //{ // log.info(e.toString()); //} } } return(map); }