| //--------------------------------------------------------  | 
| //    [Author]:           第二世界  | 
| //    [  Date ]:           Wednesday, September 06, 2017  | 
| //--------------------------------------------------------  | 
| using UnityEngine;  | 
| using System.Collections;  | 
| using System.Collections.Generic;  | 
|   | 
| using System;  | 
|   | 
| namespace vnxbqy.UI  | 
| {  | 
|   | 
|       | 
|     public class MapModel : Model, IBeforePlayerDataInitialize, IAfterPlayerDataInitialize, IPlayerLoginOk, IMapInitOk  | 
|     {  | 
|         Dictionary<int, WorldMapArea> worldMapAreas = new Dictionary<int, WorldMapArea>();  | 
|         Dictionary<int, bool> worldMapUnLockStates = new Dictionary<int, bool>();  | 
|         Dictionary<int, List<int>> localMapEventPoints = new Dictionary<int, List<int>>();  | 
|         Dictionary<int, List<string>> mapFunctionNPCsToRefreshID = new Dictionary<int, List<string>>();  | 
|         Dictionary<int, List<string>> mapCollectNPCsToRefreshID = new Dictionary<int, List<string>>();  | 
|         Dictionary<int, List<MapLine>> allMapLines = new Dictionary<int, List<MapLine>>();  | 
|         List<int> sortedMapEventPoints = new List<int>();  | 
|         List<int> sortedHangUpPoints = new List<int>();  | 
|         List<int> sortedMaps = new List<int>();  | 
|   | 
|         TaskModel taskModel { get { return ModelCenter.Instance.GetModel<TaskModel>(); } }  | 
|   | 
|         int m_NewUnlockedMap = 0;  | 
|         public int newUnlockedMap {  | 
|             get { return m_NewUnlockedMap; }  | 
|             set { m_NewUnlockedMap = value; }  | 
|         }  | 
|   | 
|         public int newUnlockMapTip {  | 
|             get { return LocalSave.GetInt(StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "NewUnLockMapsTip")); }  | 
|             set { LocalSave.SetInt(StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "NewUnLockMapsTip"), value); }  | 
|         }  | 
|   | 
|         int m_SelectedMapEventPoint;  | 
|         public int selectedMapEventPoint {  | 
|             get { return this.m_SelectedMapEventPoint; }  | 
|             set {  | 
|                 if (m_SelectedMapEventPoint != value)  | 
|                 {  | 
|                     m_SelectedMapEventPoint = value;  | 
|                     if (selectMapEventPointEvent != null)  | 
|                     {  | 
|                         selectMapEventPointEvent(this.m_SelectedMapEventPoint);  | 
|                     }  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         public int wannaLookLocalMap { get; set; }  | 
|         int mapUnLockIndex = 0;  | 
|   | 
|         public event Action<int> selectMapEventPointEvent;  | 
|         public event Action<int> mapLinesUpdateEvent;  | 
|   | 
|         public override void Init()  | 
|         {  | 
|             ParseWorldMaps();  | 
|             ParseLocalMaps();  | 
|   | 
|             PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataChange;  | 
|             TaskModel.Event_TaskInformation += OnMainLineTaskInfoUpdate;  | 
|         }  | 
|   | 
|         public override void UnInit()  | 
|         {  | 
|             PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataChange;  | 
|             TaskModel.Event_TaskInformation -= OnMainLineTaskInfoUpdate;  | 
|         }  | 
|   | 
|         public void OnBeforePlayerDataInitialize()  | 
|         {  | 
|             mapUnLockIndex = 0;  | 
|             newUnlockedMap = 0;  | 
|         }  | 
|   | 
|         public void OnAfterPlayerDataInitialize()  | 
|         {  | 
|         }  | 
|   | 
|         public void OnPlayerLoginOk()  | 
|         {  | 
|             UpdateMapsUnlockedState();  | 
|             newUnlockedMap = 0;  | 
|         }  | 
|   | 
|         public void OnMapInitOk()  | 
|         {  | 
|             if (newUnlockMapTip == PlayerDatas.Instance.baseData.MapID)  | 
|             {  | 
|                 newUnlockMapTip = 0;  | 
|             }  | 
|         }  | 
|   | 
|         public void RequestMapTransport(int _mapId, int _lineId = 255)  | 
|         {  | 
|             if (PlayerDatas.Instance.extersion.pkState == 1)  | 
|             {  | 
|                 SysNotifyMgr.Instance.ShowTip("PK_Leave");  | 
|                 return;  | 
|             }  | 
|   | 
|             var currentMapConfig = MapConfig.Get(PlayerDatas.Instance.baseData.MapID);  | 
|             if (currentMapConfig.MapFBType != 0)  | 
|             {  | 
|                 SysNotifyMgr.Instance.ShowTip("DungeonNoGO");  | 
|                 return;  | 
|             }  | 
|   | 
|             if (!worldMapUnLockStates.ContainsKey(_mapId))  | 
|             {  | 
|                 return;  | 
|             }  | 
|   | 
|             if (!worldMapUnLockStates[_mapId])  | 
|             {  | 
|                 SysNotifyMgr.Instance.ShowTip("Map_Delivery");  | 
|                 return;  | 
|             }  | 
|   | 
|             InGameDownLoad.Instance.UnRegisterMapAssetDownLoadOk();  | 
|             var map = MapConfig.Get(_mapId);  | 
|             var position = new Vector3(map.BornPoints[0].x, 0, map.BornPoints[0].y);  | 
|             MapTransferUtility.Send_WorldTransfer(_mapId, position, MapTransferType.WorldTransport, (byte)_lineId, 0);  | 
|         }  | 
|   | 
|         public void RequestSelectedLine(int _lineId)  | 
|         {  | 
|             var hero = PlayerDatas.Instance.hero;  | 
|             if (hero != null)  | 
|             {  | 
|                 hero.Behaviour.StopHandupAI();  | 
|                 hero.Behaviour.StopKillUntilDieAI();  | 
|             }  | 
|   | 
|             if (PlayerDatas.Instance.baseData.FBID != _lineId)  | 
|             {  | 
|                 var sendInfo = new C010B_tagCChangeLine();  | 
|                 sendInfo.Line = (short)_lineId;  | 
|                 GameNetSystem.Instance.SendInfo(sendInfo);  | 
|             }  | 
|         }  | 
|   | 
|         public void RequestQueryMapLineState(int _mapId, byte[] _lineIds = null, bool _isAllLine = true)  | 
|         {  | 
|             var config = MapConfig.Get(_mapId);  | 
|             if (config.MapFBType == (int)MapType.OpenCountry)  | 
|             {  | 
|                 var lineState = new CA003_tagPyGetLineState();  | 
|                 lineState.MapID = (uint)_mapId;  | 
|                 GameNetSystem.Instance.SendInfo(lineState);  | 
|             }  | 
|             else  | 
|             {  | 
|                 var lineState = new CA004_tagCGGetFBLinePlayerCnt();  | 
|                 lineState.MapID = (uint)_mapId;  | 
|                 lineState.LineCount = (byte)(_isAllLine ? 0 : _lineIds.Length);  | 
|                 if (_isAllLine)  | 
|                 {  | 
|                     lineState.LineIDList = new byte[0];  | 
|                 }  | 
|                 GameNetSystem.Instance.SendInfo(lineState);  | 
|             }  | 
|         }  | 
|   | 
|         public List<MapLine> GetMapLines(int _mapId)  | 
|         {  | 
|             var mapLines = new List<MapLine>();  | 
|             if (allMapLines.ContainsKey(_mapId))  | 
|             {  | 
|                 mapLines.AddRange(allMapLines[_mapId]);  | 
|                 //CheckActivityLine(_mapId, mapLines);  | 
|                 mapLines.Sort(SortMaplines);  | 
|                 return mapLines;  | 
|             }  | 
|             else  | 
|             {  | 
|                 return null;  | 
|             }  | 
|         }  | 
|   | 
|         public void UpdateMapLines(HA006_tagGCPyServerMapState _serverInfo)  | 
|         {  | 
|             for (int i = 0; i < _serverInfo.MapCount; i++)  | 
|             {  | 
|                 var mapState = _serverInfo.MapStateList[i];  | 
|                 var mapId = (int)mapState.MapID;  | 
|                 var lines = allMapLines[mapId] = new List<MapLine>();  | 
|                 for (int j = 0; j < mapState.LineCnt; j++)  | 
|                 {  | 
|                     var playerCount = (int)mapState.LineCurPlayerCntList[j];  | 
|                     var playerMaxCount = (int)mapState.LineMaxPlayerCntList[j];  | 
|                     lines.Add(new MapLine(mapId, j + 1, playerCount, playerMaxCount));  | 
|                 }  | 
|   | 
|                 if (mapLinesUpdateEvent != null)  | 
|                 {  | 
|                     mapLinesUpdateEvent(mapId);  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         public void UpdateDungeonMapLines(HA007_tagGCFBLinePlayerCnt _serverInfo)  | 
|         {  | 
|             var mapId = (int)_serverInfo.MapID;  | 
|             var lines = allMapLines[mapId] = new List<MapLine>();  | 
|   | 
|             for (int i = 0; i < _serverInfo.Count; i++)  | 
|             {  | 
|                 var mapState = _serverInfo.FBLineInfoList[i];  | 
|                 lines.Add(new MapLine(mapId, mapState.FBLineID, mapState.PlayerCnt));  | 
|             }  | 
|   | 
|             if (mapLinesUpdateEvent != null)  | 
|             {  | 
|                 mapLinesUpdateEvent(mapId);  | 
|             }  | 
|         }  | 
|   | 
|         public bool TryGetWorldMapArea(int _id, out WorldMapArea _area)  | 
|         {  | 
|             return worldMapAreas.TryGetValue(_id, out _area);  | 
|         }  | 
|   | 
|         public List<int> GetWorldMapAreas()  | 
|         {  | 
|             return new List<int>(worldMapAreas.Keys);  | 
|         }  | 
|   | 
|         public List<int> GetMapEventPoints(int dataMapId, int lineId)  | 
|         {  | 
|             var key = dataMapId * 100 + lineId;  | 
|             if (!localMapEventPoints.ContainsKey(key))  | 
|             {  | 
|                 key = dataMapId * 100;  | 
|             }  | 
|   | 
|             if (localMapEventPoints.ContainsKey(key))  | 
|             {  | 
|                 return localMapEventPoints[key];  | 
|             }  | 
|             else  | 
|             {  | 
|                 return null;  | 
|             }  | 
|         }  | 
|   | 
|         public List<string> GetMapNPCRefreshIds(int _mapId)  | 
|         {  | 
|             if (mapFunctionNPCsToRefreshID.ContainsKey(_mapId))  | 
|             {  | 
|                 return mapFunctionNPCsToRefreshID[_mapId];  | 
|             }  | 
|   | 
|             return null;  | 
|         }  | 
|   | 
|         public List<string> GetMapCollectNPCRefreshIds(int _mapId)  | 
|         {  | 
|             if (mapCollectNPCsToRefreshID.ContainsKey(_mapId))  | 
|             {  | 
|                 return mapCollectNPCsToRefreshID[_mapId];  | 
|             }  | 
|   | 
|             return null;  | 
|         }  | 
|   | 
|         public bool CanOpenLocalMapWin(int mapId)  | 
|         {  | 
|             var dataMapId = MapUtility.GetDataMapId(mapId);  | 
|             var lineId = MapUtility.GetLineId();  | 
|             var mapResConfig = MapResourcesConfig.GetConfig(dataMapId, lineId);  | 
|             var config = MapConfig.Get(mapId);  | 
|             if (string.IsNullOrEmpty(mapResConfig.BigMap)  | 
|                 || mapId == FairyLeagueModel.FAIRY_LEAGUE_DUNGEON)  | 
|             {  | 
|                 return false;  | 
|             }  | 
|             else  | 
|             {  | 
|                 return true;  | 
|             }  | 
|         }  | 
|   | 
|         public int GetRecommendHangPoint(int _mapId, int lineId)  | 
|         {  | 
|             var eventPoints = new List<int>(GetMapEventPoints(_mapId, lineId));  | 
|             for (int i = eventPoints.Count - 1; i >= 0; i--)  | 
|             {  | 
|                 var config = MapEventPointConfig.Get(eventPoints[i]);  | 
|                 if (config.IsShowInfo == 0)  | 
|                 {  | 
|                     eventPoints.RemoveAt(i);  | 
|                 }  | 
|             }  | 
|   | 
|             eventPoints.Sort((int a, int b) =>  | 
|             {  | 
|                 var configA = MapEventPointConfig.Get(a);  | 
|                 var configB = MapEventPointConfig.Get(b);  | 
|                 return configA.LowLV < configB.LowLV ? -1 : 1;  | 
|             });  | 
|   | 
|             var playerLevel = PlayerDatas.Instance.baseData.LV;  | 
|             var eventPointsPool = new List<int>();  | 
|             var levelMatchPointIndex = 0;  | 
|             for (int i = eventPoints.Count - 1; i >= 0; i--)  | 
|             {  | 
|                 var config = MapEventPointConfig.Get(eventPoints[i]);  | 
|                 if (playerLevel >= config.LowLV)  | 
|                 {  | 
|                     levelMatchPointIndex = i;  | 
|                     break;  | 
|                 }  | 
|             }  | 
|   | 
|             if (levelMatchPointIndex < eventPoints.Count - 1)  | 
|             {  | 
|                 eventPointsPool.Add(eventPoints[levelMatchPointIndex + 1]);  | 
|             }  | 
|   | 
|             eventPointsPool.Add(eventPoints[levelMatchPointIndex]);  | 
|   | 
|             if (levelMatchPointIndex > 0)  | 
|             {  | 
|                 eventPointsPool.Add(eventPoints[levelMatchPointIndex - 1]);  | 
|             }  | 
|   | 
|             var recommendPoint = 0;  | 
|             if (eventPointsPool.Count > 0)  | 
|             {  | 
|                 recommendPoint = eventPointsPool[eventPointsPool.Count - 1];  | 
|                 for (int i = 0; i < eventPointsPool.Count; i++)  | 
|                 {  | 
|                     var config = MapEventPointConfig.Get(eventPointsPool[i]);  | 
|                     if (PlayerDatas.Instance.extersion.DEF >= config.Defense)  | 
|                     {  | 
|                         recommendPoint = eventPointsPool[i];  | 
|                         break;  | 
|                     }  | 
|                 }  | 
|             }  | 
|             else  | 
|             {  | 
|                 var lowest = MapEventPointConfig.Get(eventPoints[0]);  | 
|                 if (playerLevel < lowest.LowLV)  | 
|                 {  | 
|                     recommendPoint = lowest.Key;  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     var hightest = MapEventPointConfig.Get(eventPoints[eventPoints.Count - 1]);  | 
|                     recommendPoint = hightest.Key;  | 
|                 }  | 
|             }  | 
|   | 
|             return recommendPoint;  | 
|         }  | 
|   | 
|         public int GetRecommendHangPoint()  | 
|         {  | 
|             var unLockedHangeUpPoints = new List<int>();  | 
|   | 
|             for (int i = 0; i < sortedHangUpPoints.Count; i++)  | 
|             {  | 
|                 var config = MapEventPointConfig.Get(sortedHangUpPoints[i]);  | 
|                 if (IsMapUnlocked(MapUtility.GetMapId(config.DataMapID, config.LineId)))  | 
|                 {  | 
|                     unLockedHangeUpPoints.Add(sortedHangUpPoints[i]);  | 
|                 }  | 
|             }  | 
|   | 
|             var playerLevel = PlayerDatas.Instance.baseData.LV;  | 
|             var eventPointsPool = new List<int>();  | 
|             var levelMatchPointIndex = 0;  | 
|             for (int i = unLockedHangeUpPoints.Count - 1; i >= 0; i--)  | 
|             {  | 
|                 var config = MapEventPointConfig.Get(unLockedHangeUpPoints[i]);  | 
|                 if (playerLevel >= config.LowLV)  | 
|                 {  | 
|                     levelMatchPointIndex = i;  | 
|                     break;  | 
|                 }  | 
|             }  | 
|   | 
|             if (levelMatchPointIndex < unLockedHangeUpPoints.Count - 1)  | 
|             {  | 
|                 eventPointsPool.Add(unLockedHangeUpPoints[levelMatchPointIndex + 1]);  | 
|             }  | 
|   | 
|             eventPointsPool.Add(unLockedHangeUpPoints[levelMatchPointIndex]);  | 
|             if (levelMatchPointIndex > 0)  | 
|             {  | 
|                 eventPointsPool.Add(unLockedHangeUpPoints[levelMatchPointIndex - 1]);  | 
|             }  | 
|   | 
|             var recommendPoint = 0;  | 
|             if (eventPointsPool.Count > 0)  | 
|             {  | 
|                 recommendPoint = eventPointsPool[eventPointsPool.Count - 1];  | 
|                 for (int i = 0; i < eventPointsPool.Count; i++)  | 
|                 {  | 
|                     var config = MapEventPointConfig.Get(eventPointsPool[i]);  | 
|                     if (PlayerDatas.Instance.extersion.DEF >= config.Defense)  | 
|                     {  | 
|                         recommendPoint = eventPointsPool[i];  | 
|                         break;  | 
|                     }  | 
|                 }  | 
|             }  | 
|             else  | 
|             {  | 
|                 var lowest = MapEventPointConfig.Get(unLockedHangeUpPoints[0]);  | 
|                 if (playerLevel < lowest.LowLV)  | 
|                 {  | 
|                     recommendPoint = lowest.Key;  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     var count = unLockedHangeUpPoints.Count;  | 
|                     var hightest = MapEventPointConfig.Get(unLockedHangeUpPoints[count - 1]);  | 
|                     recommendPoint = hightest.Key;  | 
|                 }  | 
|             }  | 
|   | 
|             return recommendPoint;  | 
|         }  | 
|   | 
|         public bool IsMapUnlocked(int _mapId)  | 
|         {  | 
|             if (worldMapUnLockStates.ContainsKey(_mapId))  | 
|             {  | 
|                 return worldMapUnLockStates[_mapId];  | 
|             }  | 
|             else  | 
|             {  | 
|                 return false;  | 
|             }  | 
|         }  | 
|   | 
|         private void UpdateMapsUnlockedState()  | 
|         {  | 
|             foreach (var mapId in worldMapAreas.Keys)  | 
|             {  | 
|                 var canUnlock = CanMapUnlock(mapId);  | 
|                 if (worldMapUnLockStates.ContainsKey(mapId)  | 
|                     && !worldMapUnLockStates[mapId]  | 
|                     && canUnlock && mapId != 10010)  | 
|                 {  | 
|                     newUnlockedMap = mapId;  | 
|                     newUnlockMapTip = mapId;  | 
|                 }  | 
|   | 
|                 worldMapUnLockStates[mapId] = canUnlock;  | 
|             }  | 
|         }  | 
|   | 
|         private bool CanMapUnlock(int _mapId)  | 
|         {  | 
|             var config = MapConfig.Get(_mapId);  | 
|             if (config.LV != 0 && PlayerDatas.Instance.baseData.LV < config.LV)  | 
|             {  | 
|                 return false;  | 
|             }  | 
|   | 
|             if (config.MainTaskID != 0 && mapUnLockIndex < config.MainTaskID)  | 
|             {  | 
|                 return false;  | 
|             }  | 
|   | 
|             if (config.realmLevel != 0 && PlayerDatas.Instance.baseData.realmLevel < config.realmLevel)  | 
|             {  | 
|                 return false;  | 
|             }  | 
|   | 
|             return true;  | 
|         }  | 
|   | 
|         private void OnPlayerDataChange(PlayerDataType refreshType)  | 
|         {  | 
|             switch (refreshType)  | 
|             {  | 
|                 case PlayerDataType.LV:  | 
|                 case PlayerDataType.RealmLevel:  | 
|                     UpdateMapsUnlockedState();  | 
|                     break;  | 
|             }  | 
|         }  | 
|   | 
|         private void OnMainLineTaskInfoUpdate(int _id, Dictionary<int, Dictionary<string, string>> _Dic)  | 
|         {  | 
|             if (_id == 1)  | 
|             {  | 
|                 if (taskModel._DicTaskInformation.ContainsKey(1) && taskModel._DicTaskInformation[1].ContainsKey("OpenMap"))  | 
|                 {  | 
|                     int.TryParse(taskModel._DicTaskInformation[1]["OpenMap"], out mapUnLockIndex);  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     mapUnLockIndex = 0;  | 
|                 }  | 
|   | 
|                 UpdateMapsUnlockedState();  | 
|             }  | 
|         }  | 
|   | 
|         private void ParseWorldMaps()  | 
|         {  | 
|             var mapConfigs = MapConfig.GetValues();  | 
|             foreach (var mapConfig in mapConfigs)  | 
|             {  | 
|                 if (mapConfig.MapFBType == 0)  | 
|                 {  | 
|                     worldMapAreas.Add(mapConfig.MapID, new WorldMapArea(mapConfig.MapID, true));  | 
|                     sortedMaps.Add(mapConfig.MapID);  | 
|                 }  | 
|             }  | 
|   | 
|             sortedMaps.Sort(  | 
|                 (int a, int b) =>  | 
|                 {  | 
|                     var configA = MapConfig.Get(a);  | 
|                     var configB = MapConfig.Get(b);  | 
|   | 
|                     return configA.LV > configB.LV ? -1 : 1;  | 
|                 }  | 
|                 );  | 
|         }  | 
|   | 
|         private void ParseLocalMaps()  | 
|         {  | 
|             var mapEventConfigs = MapEventPointConfig.GetValues();  | 
|             foreach (var config in mapEventConfigs)  | 
|             {  | 
|                 var mapId = MapUtility.GetMapId(config.DataMapID, config.LineId);  | 
|                 var key = config.DataMapID * 100 + config.LineId;  | 
|                 List<int> eventPointIds = null;  | 
|                 if (!localMapEventPoints.ContainsKey(key))  | 
|                 {  | 
|                     localMapEventPoints[key] = eventPointIds = new List<int>();  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     eventPointIds = localMapEventPoints[key];  | 
|                 }  | 
|   | 
|                 eventPointIds.Add(config.Key);  | 
|                 if (config.IsShowInfo == 1 && GeneralDefine.autoOnHookMap.Contains(mapId))  | 
|                 {  | 
|                     sortedMapEventPoints.Add(config.Key);  | 
|                 }  | 
|             }  | 
|   | 
|             sortedMapEventPoints.Sort((int a, int b) =>  | 
|             {  | 
|                 var configA = MapEventPointConfig.Get(a);  | 
|                 var configB = MapEventPointConfig.Get(b);  | 
|   | 
|                 return configA.LowLV < configB.LowLV ? -1 : 1;  | 
|             });  | 
|   | 
|             for (int i = 0; i < sortedMapEventPoints.Count; i++)  | 
|             {  | 
|                 var eventPoint = sortedMapEventPoints[i];  | 
|                 var config = MapEventPointConfig.Get(eventPoint);  | 
|                 var mapId = MapUtility.GetMapId(config.DataMapID, config.LineId);  | 
|                 if (GeneralDefine.autoOnHookMap.Contains(mapId))  | 
|                 {  | 
|                     sortedHangUpPoints.Add(eventPoint);  | 
|                 }  | 
|             }  | 
|   | 
|             var mapNpcConfigs = mapnpcConfig.GetValues();  | 
|             foreach (var config in mapNpcConfigs)  | 
|             {  | 
|                 var mapId = config.MapID;  | 
|                 if (config.NPCID != 0)  | 
|                 {  | 
|                     if (config.NPCType == (int)E_NpcType.Func)  | 
|                     {  | 
|                         List<string> npcRefreshIs;  | 
|                         if (!mapFunctionNPCsToRefreshID.ContainsKey(mapId))  | 
|                         {  | 
|                             mapFunctionNPCsToRefreshID[mapId] = npcRefreshIs = new List<string>();  | 
|                         }  | 
|                         else  | 
|                         {  | 
|                             npcRefreshIs = mapFunctionNPCsToRefreshID[mapId];  | 
|                         }  | 
|   | 
|                         npcRefreshIs.Add(config.RefreshID.ToString());  | 
|                     }  | 
|                     else if (config.NPCType == (int)E_NpcType.Flag)  | 
|                     {  | 
|                         List<string> npcRefreshIs;  | 
|                         if (!mapCollectNPCsToRefreshID.ContainsKey(mapId))  | 
|                         {  | 
|                             mapCollectNPCsToRefreshID[mapId] = npcRefreshIs = new List<string>();  | 
|                         }  | 
|                         else  | 
|                         {  | 
|                             npcRefreshIs = mapCollectNPCsToRefreshID[mapId];  | 
|                         }  | 
|   | 
|                         npcRefreshIs.Add(config.RefreshID.ToString());  | 
|                     }  | 
|                 }  | 
|             }  | 
|   | 
|         }  | 
|   | 
|         int SortMaplines(MapLine x, MapLine y)  | 
|         {  | 
|             return x.lineIndex.CompareTo(y.lineIndex);  | 
|         }  | 
|     }  | 
|   | 
|     public struct WorldMapArea  | 
|     {  | 
|         public int id;  | 
|         public bool unLocked;  | 
|   | 
|         public WorldMapArea(int _id, bool _unLocked)  | 
|         {  | 
|             this.id = _id;  | 
|             this.unLocked = _unLocked;  | 
|         }  | 
|   | 
|     }  | 
|   | 
|     public struct MapLine  | 
|     {  | 
|         public int mapId;  | 
|         public int lineIndex;  | 
|         public int playerCount;  | 
|         public int playerMaxCount;  | 
|   | 
|         public MapLine(int _mapId, int _lineIndex, int _playerCount, int _playerMaxCount)  | 
|         {  | 
|             this.mapId = _mapId;  | 
|             this.lineIndex = _lineIndex;  | 
|             this.playerCount = _playerCount;  | 
|             this.playerMaxCount = _playerMaxCount;  | 
|         }  | 
|   | 
|         public MapLine(int _mapId, int _lineId, int _playerCount)  | 
|         {  | 
|             this.mapId = _mapId;  | 
|             this.lineIndex = _lineId;  | 
|             this.playerCount = _playerCount;  | 
|             this.playerMaxCount = 99999;  | 
|         }  | 
|   | 
|     }  | 
|   | 
|   | 
| }  | 
|   | 
|   | 
|   |