//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Monday, October 09, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; using System.Collections.Generic; using System; using System.Text.RegularExpressions; namespace vnxbqy.UI { public class TreasureModel : Model, IBeforePlayerDataInitialize, IAfterPlayerDataInitialize, IPlayerLoginOk { Dictionary treasures = new Dictionary(); Dictionary> treasureCategory = new Dictionary>(); Dictionary treasureMapDict = new Dictionary(); Dictionary treasureDungeons = new Dictionary(); Dictionary>> treasureClues = new Dictionary>>(); Dictionary> treasureTasks = new Dictionary>(); Dictionary treasureUnlockShowDict = new Dictionary(); Dictionary treasureTaskCompletedCounts = new Dictionary(); Dictionary treasureSignInPropertys = new Dictionary(); Dictionary> treasureInductionTasks = new Dictionary>(); List eightFurnacesAchievements = new List(); List treasureUnOpens = new List(); Dictionary awardsToFaboClue = new Dictionary(); //奖励对应的法宝和线索 List awardsSort = new List(); // 奖励排序 public const int CLIENTDATAMAP = 4000; public const int TREASURE_DATAMAPID = 41110; public const int TREASURE_MAPID = 41110; public const int TREASURE_GUIDE_ID = 102; const int TREASURE_REDPOINTID = 7000; public readonly static int[] CATEGORY_REDPOINTIDS = { 7001, 7002, 7003, 7004, 7005 }; const int TREASURE_REDPOINTBASE = 7100; public static int redpointIndex = 1; public bool isClickInduction = false; //用于前往的特殊引导 Redpoint treasureRedpoint = new Redpoint(1, TREASURE_REDPOINTID); Redpoint humanRedpoint = new Redpoint(TREASURE_REDPOINTID, CATEGORY_REDPOINTIDS[(int)TreasureCategory.Human - 1]); Redpoint demonRedpoint = new Redpoint(TREASURE_REDPOINTID, CATEGORY_REDPOINTIDS[(int)TreasureCategory.Demon - 1]); Redpoint fairypoint = new Redpoint(TREASURE_REDPOINTID, CATEGORY_REDPOINTIDS[(int)TreasureCategory.Fairy - 1]); Redpoint elderGodRedpoint = new Redpoint(TREASURE_REDPOINTID, CATEGORY_REDPOINTIDS[(int)TreasureCategory.King - 1]); Redpoint zergRedpoint = new Redpoint(TREASURE_REDPOINTID, CATEGORY_REDPOINTIDS[(int)TreasureCategory.Zerg - 1]); public event Action treasureCollectProgressRefresh; public event Action treasureSelectedEvent; public event Action collectingTreasureChangeEvent; public event Action treasureStateChangeEvent; public event Action vipKillNPCTreasureEvent; public event Action treasureStageUpEvent; public event Action demonTreasureDungeonUpdate; public event Action demonDungeonChallengeNext; public event Action onInductionTaskComplete; int m_SelectedTreasure = 0; public int selectedTreasure { get { return m_SelectedTreasure; } set { if (m_SelectedTreasure != value) { m_SelectedTreasure = value; if (treasureSelectedEvent != null) { treasureSelectedEvent(m_SelectedTreasure); } } } } public bool treasureStageUpShow { get; set; } TreasureCategory m_CurrentCategory = TreasureCategory.Human; public TreasureCategory currentCategory { get { return m_CurrentCategory; } set { m_CurrentCategory = value; } } int m_CollectingHuman = 0; public int collectingHuman { get { return m_CollectingHuman; } set { if (m_CollectingHuman != value) { m_CollectingHuman = value; if (collectingTreasureChangeEvent != null) { collectingTreasureChangeEvent(TreasureCategory.Human); } } } } int m_CollectingDemon = 0; public int collectingDemon { get { return m_CollectingDemon; } set { if (m_CollectingDemon != value) { m_CollectingDemon = value; if (collectingTreasureChangeEvent != null) { collectingTreasureChangeEvent(TreasureCategory.Demon); } } } } public Dictionary fairyTreasureGetDict { get; private set; } public bool isServerReady { get; private set; } public int newGotTreasureId { get { return LocalSave.GetInt(StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "_NewGotTreasureId")); } set { LocalSave.SetInt(StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "_NewGotTreasureId"), value); } } public bool newGotShowing { get { return newGotTreasureId > 0; } } public int treasureCollectingShowId { get { return LocalSave.GetInt(StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "_TreasureCollectingShowId")); } set { LocalSave.SetInt(StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "_TreasureCollectingShowId"), value); } } public int treasureGotoId { get; set; } public bool openFromTreasureList { get; set; } public List guideTreasures { get; private set; } public int treasureBackLvLimit { get; private set; } public int exitRecord { get; set; } public int entranceOpenCondition { get; private set; } public int treasureChapterId { get; set; } public int displayInductionId { get; private set; } TaskModel taskModel { get { return ModelCenter.Instance.GetModel(); } } RoleModel roleModel { get { return ModelCenter.Instance.GetModel(); } } VIPKillNPCTreasure m_VIPKillNPCTreasure; public VIPKillNPCTreasure vipKillNPCTreasure { get { return m_VIPKillNPCTreasure; } set { m_VIPKillNPCTreasure = value; if (vipKillNPCTreasureEvent != null) { vipKillNPCTreasureEvent(); } } } bool playerLevelRefresh = false; bool needDisplayReguluLevelUp = false; public int m_jumpAwardID; //跳转奖励ID ,快速领取的奖励ID public int gotoAwardClue; //跳转奖励线索 public bool quickGetAward = false; //是否快速领取奖励 public override void Init() { ParseConfigs(); PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshInfoEvent; WindowCenter.Instance.windowAfterOpenEvent += OnWindowOpen; WindowCenter.Instance.windowAfterCloseEvent += OnWindowClose; NewBieCenter.Instance.guideCompletedEvent += GuideComplete; StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; GlobalTimeEvent.Instance.secondEvent += PerSecond; TaskModel.Event_MainlineTask += OnTaskRefresh; roleModel.OnCustomAwardsEvent += OnCustomAwardsEvent; } public void OnBeforePlayerDataInitialize() { isServerReady = false; playerLevelRefresh = false; needDisplayReguluLevelUp = false; treasureUnlockShowDict.Clear(); treasureTaskCompletedCounts.Clear(); foreach (var treasure in treasures.Values) { treasure.state = TreasureState.Locked; treasure.RefreshLevel(0, 0); } foreach (var treasureDungeon in treasureDungeons.Values) { treasureDungeon.currentLevel = 0; } m_jumpAwardID = -1; gotoAwardClue = -1; quickGetAward = false; } public void OnAfterPlayerDataInitialize() { collectingDemon = 0; collectingHuman = 0; } public void OnPlayerLoginOk() { isServerReady = true; RefreshDemonDungeonRedpoints(); } public override void UnInit() { NewBieCenter.Instance.guideCompletedEvent -= GuideComplete; PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshInfoEvent; WindowCenter.Instance.windowAfterOpenEvent -= OnWindowOpen; WindowCenter.Instance.windowAfterCloseEvent -= OnWindowClose; StageLoad.Instance.onStageLoadFinish -= OnStageLoadFinish; GlobalTimeEvent.Instance.secondEvent -= PerSecond; TaskModel.Event_MainlineTask -= OnTaskRefresh; roleModel.OnCustomAwardsEvent -= OnCustomAwardsEvent; } private void PerSecond() { if (isServerReady) { if (playerLevelRefresh) { playerLevelRefresh = false; RefreshTreasureCollectState(); } } } private void OnStageLoadFinish() { if (!(StageLoad.Instance.currentStage is DungeonStage)) { exitRecord = 0; treasureChapterId = 0; } } private void ParseConfigs() { var treasureConfigs = TreasureConfig.GetValues(); foreach (var config in treasureConfigs) { var category = (TreasureCategory)config.Category; List categoryTreasures = null; if (!treasureCategory.ContainsKey(category)) { treasureCategory[category] = categoryTreasures = new List(); } else { categoryTreasures = treasureCategory[category]; } categoryTreasures.Add(config.ID); Treasure treasure = new Treasure(config.ID); treasures[config.ID] = treasure; if (!treasureMapDict.ContainsKey(config.ID)) { treasureMapDict.Add(config.ID, config.MapId); } if (config.ID == 301) { List list = null; SuccessConfig.TryGetTreasureExpAchievements(config.ID, out list); if (list != null) { eightFurnacesAchievements.AddRange(list); } } } var treasureUpConfigs = TreasureUpConfig.GetValues(); foreach (var config in treasureUpConfigs) { Treasure treasure; if (TryGetTreasure(config.MWID, out treasure)) { treasure.ParseStage(config); } } var funcConfig = FuncConfigConfig.Get("GuideMission"); guideTreasures = new List(); guideTreasures.AddRange(ConfigParse.GetMultipleStr(funcConfig.Numerical2)); funcConfig = FuncConfigConfig.Get("TreasureGetVipLv"); fairyTreasureGetDict = ConfigParse.GetDic(funcConfig.Numerical1); funcConfig = FuncConfigConfig.Get("TreasureSkip"); treasureBackLvLimit = int.Parse(funcConfig.Numerical1); funcConfig = FuncConfigConfig.Get("TreasureNoOpen"); treasureUnOpens.AddRange(ConfigParse.GetMultipleStr(funcConfig.Numerical1)); funcConfig = FuncConfigConfig.Get("OpenFabao"); entranceOpenCondition = int.Parse(funcConfig.Numerical1); var treasureDungeonConfigs = TreasureDungeonConfig.GetValues(); foreach (var config in treasureDungeonConfigs) { TreasureDungeon treasureDungeon; if (!treasureDungeons.TryGetValue(config.MWID, out treasureDungeon)) { var treasureConfig = TreasureConfig.Get(config.MWID); var challengeRedpoint = new Redpoint(CATEGORY_REDPOINTIDS[treasureConfig.Category - 1], TREASURE_REDPOINTBASE + redpointIndex++); treasureDungeon = new TreasureDungeon(config.MWID, challengeRedpoint); treasureDungeons.Add(config.MWID, treasureDungeon); } treasureDungeon.ParseDungeonInfo(config); } var taskConfigs = TaskListConfig.GetValues(); foreach (var config in taskConfigs) { if (config.FabaoID == 0) { continue; } if (config.clue != 0) { Dictionary> clues = null; if (!treasureClues.TryGetValue(config.FabaoID, out clues)) { clues = new Dictionary>(); treasureClues.Add(config.FabaoID, clues); } List tasks = null; if (!clues.TryGetValue(config.clue, out tasks)) { tasks = new List(); clues.Add(config.clue, tasks); } tasks.Add(config.TaskID); if (!treasureTasks.TryGetValue(config.FabaoID, out tasks)) { tasks = new List(); treasureTasks.Add(config.FabaoID, tasks); } tasks.Add(config.TaskID); awardsToFaboClue[config.AwardID] = new Int2(config.FabaoID, config.clue); awardsSort.Add(config.AwardID); } if (config.induction == 1) { if (!treasureInductionTasks.ContainsKey(config.FabaoID)) { treasureInductionTasks.Add(config.FabaoID, new List()); } treasureInductionTasks[config.FabaoID].Add(config.TaskID); } } funcConfig = FuncConfigConfig.Get("MWSignDayAttr"); var jsonData = LitJson.JsonMapper.ToObject(funcConfig.Numerical1); foreach (var _key in jsonData.Keys) { treasureSignInPropertys.Add(int.Parse(_key), int.Parse(jsonData[_key].ToString())); } } public void TryOpenRegulusPopWindow() { if (isServerReady) { if (WindowCenter.Instance.IsOpen() && !WindowCenter.Instance.ExistAnyFullScreenOrMaskWin()) { if (!WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Open(); } needDisplayReguluLevelUp = false; } else { needDisplayReguluLevelUp = true; } } } public int IsRequireUnlockAnim(TreasureCategory _type) { if (!treasureUnlockShowDict.ContainsKey(_type)) { var _playerId = PlayerDatas.Instance.baseData.PlayerID; var _id = LocalSave.GetInt(StringUtility.Contact(_playerId, _type, "_TreasureUnlockShow")); treasureUnlockShowDict.Add(_type, _id); } return treasureUnlockShowDict[_type]; } public bool TryGetUnlockShowTreasure(out int _id) { _id = 0; if ((_id = IsRequireUnlockAnim(TreasureCategory.Human)) != 0) { return true; } else if ((_id = IsRequireUnlockAnim(TreasureCategory.Demon)) != 0) { return true; } else if ((_id = IsRequireUnlockAnim(TreasureCategory.Fairy)) != 0) { return true; } return false; } public void SetUnlockAnim(TreasureCategory _type, int _id) { if (treasureUnlockShowDict.ContainsKey(_type)) { treasureUnlockShowDict[_type] = _id; } var _playerId = PlayerDatas.Instance.baseData.PlayerID; LocalSave.SetInt(StringUtility.Contact(_playerId, _type, "_TreasureUnlockShow"), _id); } public bool TryGetTreasure(int _id, out Treasure _treasure) { return treasures.TryGetValue(_id, out _treasure); } public bool TryGetTreasureDungeon(int _id, out TreasureDungeon _treasureDungeon) { return treasureDungeons.TryGetValue(_id, out _treasureDungeon); } public bool TryGetTreasureDungeon(int _mapId, int lineId, out TreasureDungeon treasureDungeon) { treasureDungeon = null; if (_mapId != 41110) { return false; } var list = GetTreasureCategory(TreasureCategory.Demon); for (int i = 0; i < list.Count; i++) { if (TryGetTreasureDungeon(list[i], out treasureDungeon)) { if (treasureDungeon.dungeonInfos.Count > 0) { if (treasureDungeon.dungeonInfos[0].lineId == lineId) { return true; } } } } return false; } public bool TryGetTreasureClues(int id, out Dictionary> clues) { return treasureClues.TryGetValue(id, out clues); } public bool TryGetTreasureCluesByAwardID(int id, out Dictionary> clues) { if (!awardsToFaboClue.ContainsKey(id)) { clues = null; return false; } return treasureClues.TryGetValue(awardsToFaboClue[id].x, out clues); } public bool TryGetTreasureClueTasks(int id, int clue, out List tasks) { tasks = null; if (treasureClues.ContainsKey(id)) { return treasureClues[id].TryGetValue(clue, out tasks); } return false; } public bool TryGetTreasureTasks(int id,out List tasks) { return treasureTasks.TryGetValue(id, out tasks); } public List GetAllTreasure() { return new List(treasures.Keys); } public List GetTreasureCategory(TreasureCategory _category) { if (treasureCategory.ContainsKey(_category)) { return treasureCategory[_category]; } else { return null; } } // 获取下一个法宝ID,不能直接法宝ID + 1,要从表读取 public int GetNextTreasureID(int curID, TreasureCategory _category) { var list = GetTreasureCategory(_category); if (list != null) { int index = list.IndexOf(curID); if (index >= 0 && index < list.Count-1) { return list[index + 1]; } } return 0; } public int GetPreTreasureID(int curID, TreasureCategory _category) { var list = GetTreasureCategory(_category); if (list != null) { int index = list.IndexOf(curID); if (index > 0 && index <= list.Count) { return list[index - 1]; } } return 0; } public int GetCollectedTreasureCount(TreasureCategory _category) { var treasureIds = GetTreasureCategory(_category); var count = 0; foreach (var id in treasureIds) { if (treasures[id].state == TreasureState.Collected) { count++; } } return count; } public int GetCompleteTaskCount(int id) { var count = 0; Dictionary> clues = null; if (TryGetTreasureClues(id, out clues)) { var taskId = taskModel.GetLatestMainTaskId(); var taskState = taskModel.GetQuestState(taskId); var clueCount = 0; int curTaskIndex = TaskListConfig.GetMissionIndex(taskId); foreach (var clue in clues.Keys) { clueCount++; List tasks = clues[clue]; var lastTask = tasks[tasks.Count - 1]; int lastTaskIndex = TaskListConfig.GetMissionIndex(lastTask); if (curTaskIndex > lastTaskIndex) { count = clueCount; } else if (taskId == lastTask && taskState == 3) { count = clueCount; } } count = Mathf.Min(count, clues.Count); } return count; } public int GetTreasureIdByMapIdAndLineId(int _mapId, int _lineId) { var dungeonModel = ModelCenter.Instance.GetModel(); var dataMapId = dungeonModel.GetDataMapIdByMapId(_mapId); var allConfigs = TreasureConfig.GetValues(); foreach (var config in allConfigs) { if (config.MapId == dataMapId && config.LineId == _lineId) { return config.ID; } } return 0; } public int GetTreasureBySkillId(int skillId) { foreach (var id in treasures.Keys) { if (treasures[id].skillId == skillId) { return id; } } return 0; } public List GetFurnacesAchievements() { return eightFurnacesAchievements; } public Dictionary GetSignInPropertys() { return treasureSignInPropertys; } private void PlayerDataRefreshInfoEvent(PlayerDataType refreshType) { switch (refreshType) { case PlayerDataType.LV: playerLevelRefresh = true; break; case PlayerDataType.FightPoint: case PlayerDataType.FightPower: case PlayerDataType.DEF: RefreshDemonDungeonRedpoints(); break; } } private void RefreshTreasureCollectState() { RefreshTreasureCollectState(TreasureCategory.Human); RefreshTreasureCollectState(TreasureCategory.Demon); } private void RefreshTreasureCollectState(TreasureCategory category) { var treasureIds = GetTreasureCategory(category); foreach (var id in treasureIds) { var treasure = treasures[id]; if (treasure.state != TreasureState.Locked) { continue; } var config = TreasureConfig.Get(id); if (config.PreTreasure != 0 && treasures[config.PreTreasure].state != TreasureState.Collected) { continue; } var satisfyCollect = false; switch (category) { case TreasureCategory.Human: { List tasks; if (TryGetTreasureTasks(id, out tasks)) { var firstTask = tasks[0]; var taskId = taskModel.GetLatestMainTaskId(); var taskState = taskModel.GetQuestState(taskId); int curTaskIndex = TaskListConfig.GetMissionIndex(taskId); int lastTaskIndex = TaskListConfig.GetMissionIndex(firstTask); if (curTaskIndex >= lastTaskIndex) { satisfyCollect = true; collectingHuman = id; } } } break; case TreasureCategory.Demon: { if (PlayerDatas.Instance.baseData.LV >= config.ChallengeLevel) { satisfyCollect = true; collectingDemon = id; } } break; } if (satisfyCollect) { if (isServerReady) { SetUnlockAnim((TreasureCategory)config.Category, id); } treasure.state = TreasureState.Collecting; if (category == TreasureCategory.Demon) { RefreshDemonDungeonRedpoint(id); } } if (treasureStateChangeEvent != null) { treasureStateChangeEvent(id); } } } private void RefreshDemonDungeonRedpoints() { foreach (var treasureId in treasureDungeons.Keys) { RefreshDemonDungeonRedpoint(treasureId); } } private void RefreshDemonDungeonRedpoint(int treasureId) { TreasureDungeon treasureDungeon; if (TryGetTreasureDungeon(treasureId, out treasureDungeon)) { treasureDungeon.challengeRedpoint.state = RedPointState.None; Treasure treasure; if (TryGetTreasure(treasureId, out treasure) && treasure.state != TreasureState.Collecting) { return; } var dungeonInfo = treasureDungeon.Get(treasureDungeon.currentLevel + 1); if (!dungeonInfo.Equals(default(TreasureDungeonInfo))) { if (PlayerDatas.Instance.baseData.FightPoint >= (ulong)dungeonInfo.fightPower && (int)UIHelper.GetPropertyValue(PropertyType.DEF) >= dungeonInfo.defense) { treasureDungeon.challengeRedpoint.state = RedPointState.Simple; } } } } #region 法宝新获得表现 private void OnWindowOpen(Window _window) { if (_window is MainInterfaceWin) { SnxxzGame.Instance.StartCoroutine(Co_OpenTreasureNewGot()); if (needDisplayReguluLevelUp) { TryOpenRegulusPopWindow(); } } } private void OnWindowClose(Window win) { if (win is LoginAdWin) { SnxxzGame.Instance.StartCoroutine(Co_OpenTreasureNewGot()); } } void GuideComplete(int _id) { if (newGotTreasureId != 0) { SnxxzGame.Instance.StartCoroutine(Co_OpenTreasureNewGot()); } } public void TryOpenNewGotTreasureWin() { SnxxzGame.Instance.StartCoroutine(Co_OpenTreasureNewGot()); } IEnumerator Co_OpenTreasureNewGot() { yield return null; OpenTreasureNewGot(); } private void OpenTreasureNewGot() { if (!(StageLoad.Instance.currentStage is DungeonStage) || !isServerReady) { return; } if (!PreFightMission.Instance.IsFinished() || newGotTreasureId == 0 || NewBieCenter.Instance.inGuiding || !WindowCenter.Instance.IsOpen() || WindowCenter.Instance.ExistAnyFullScreenOrMaskWinLEqual(WindowType.Base) || WindowCenter.Instance.IsOpen()) { return; } var dungeonModel = ModelCenter.Instance.GetModel(); var mapConfig = MapConfig.Get(PlayerDatas.Instance.baseData.MapID); if (mapConfig == null || mapConfig.MapFBType != (int)MapType.OpenCountry) { return; } WindowCenter.Instance.Open(); } #endregion public void ReceivePackage(HA352_tagMCMagicWeaponLVInfo package) { for (int i = 0; i < package.Count; i++) { var data = package.InfoList[i]; Treasure treasure; if (TryGetTreasure((int)data.MWID, out treasure)) { bool levelUp = false; if (treasure.level < data.LV) { levelUp = true; } treasure.RefreshLevel(data.LV, (int)data.Exp); if (isServerReady && levelUp && treasureStageUpEvent != null) { treasureStageUpEvent(treasure.id); } } if (treasure.level > 0 && treasure.state != TreasureState.Collected) { treasure.state = TreasureState.Collected; var config = TreasureConfig.Get(treasure.id); if (IsRequireUnlockAnim((TreasureCategory)config.Category) == treasure.id) { SetUnlockAnim((TreasureCategory)config.Category, 0); } if (isServerReady) { newGotTreasureId = treasure.id; OpenTreasureNewGot(); } if (treasureCollectingShowId == treasure.id) { treasureCollectingShowId = 0; } if (treasureStateChangeEvent != null) { treasureStateChangeEvent(treasure.id); } } TreasureDungeon treasureDungeon; if (TryGetTreasureDungeon((int)data.MWID, out treasureDungeon)) { treasureDungeon.currentLevel = data.FBPassLV; RefreshDemonDungeonRedpoint(treasureDungeon.treasureId); if (demonTreasureDungeonUpdate != null) { demonTreasureDungeonUpdate(treasureDungeon.treasureId); } } } RefreshTreasureCollectState(); } void OnCustomAwardsEvent() { m_jumpAwardID = -1; foreach (var awardID in awardsSort) { if (roleModel.GetCustomAwardState(awardID) == 1) { m_jumpAwardID = awardID; break; } } } //领取该法宝全部任务奖励 public void RequestTheTreasureAllAward(Dictionary> clues) { foreach (var tmpTasks in clues.Values) { for (int i = 0; i < tmpTasks.Count; i++) { var task = tmpTasks[i]; var taskConfig1 = TaskListConfig.Get(task); if (taskConfig1.AwardID != 0) { if (roleModel.GetCustomAwardState(taskConfig1.AwardID) == 1) roleModel.GetCustomAward(taskConfig1.AwardID); } } } } public Int2 GetFabaoAwardInfo(int awardID) { Int2 fabaoInfo; if (awardsToFaboClue.TryGetValue(awardID, out fabaoInfo)) { return fabaoInfo; } return new Int2(0, 0); } private void OnTaskRefresh(int MissionID, int MissionState) { RefreshTreasureCollectState(TreasureCategory.Human); var treasureIds = GetTreasureCategory(TreasureCategory.Human); foreach (var id in treasureIds) { var count = GetCompleteTaskCount(id); if (!treasureTaskCompletedCounts.ContainsKey(id) || treasureTaskCompletedCounts[id] != count) { treasureTaskCompletedCounts[id] = count; if (treasureCollectProgressRefresh != null) { treasureCollectProgressRefresh(id); } } } } public bool IsVersionUnOpenTreasure(int _id) { return treasureUnOpens.Contains(_id); } public int GetMapIdByTreasure(int _treasureId) { if (treasureMapDict.ContainsKey(_treasureId)) { return treasureMapDict[_treasureId]; } return 0; } public bool IsTreasureCollected(int _treasureId) { Treasure treasure; if (TryGetTreasure(_treasureId, out treasure)) { return treasure.state == TreasureState.Collected; } return false; } public int GetTreasureFightPower(int _treasureId, bool _real = true) { Treasure treasure; if (!TryGetTreasure(_treasureId, out treasure)) { return 0; } var _fightPower = 0; if (treasure.state != TreasureState.Collected) { return _fightPower; } for (int i = 0; i < treasure.treasureStages.Count; i++) { var _stage = treasure.treasureStages[i]; if (_real && treasure.level < _stage.stage) { break; } _fightPower += _stage.GetFightPower(); _fightPower += _stage.powerEx; } _fightPower += GetExtensionPower(_treasureId); return _fightPower; } public int GetExtensionPower(int _treasureId) { return 0; } public bool SatisfyChallenge(int id) { if (treasures.ContainsKey(id)) { var treasure = treasures[id]; var config = TreasureConfig.Get(id); switch ((TreasureCategory)config.Category) { case TreasureCategory.Human: { if (treasure.state != TreasureState.Collecting) { return false; } List tasks = null; if (TryGetTreasureTasks(id, out tasks)) { var lastTask = tasks[tasks.Count - 1]; var taskId = taskModel.GetLatestMainTaskId(); var taskState = taskModel.GetQuestState(taskId); int curTaskIndex = TaskListConfig.GetMissionIndex(taskId); int lastTaskIndex = TaskListConfig.GetMissionIndex(lastTask); if (curTaskIndex > lastTaskIndex || (taskId == lastTask && taskState == 3)) { return true; } } } break; } } return false; } public bool SatisfyEntranceOpen() { var list = GetTreasureCategory(TreasureCategory.Human); if (list != null && list.Count > 1) { if (treasures.ContainsKey(list[1])) { if (treasures[list[1]].state != TreasureState.Locked) { return true; } } } var taskModel = ModelCenter.Instance.GetModel(); var missions = taskModel.MainTaskDic; if (missions != null) { foreach (var missionId in missions.Keys) { if (missionId > entranceOpenCondition) { return true; } else if (missionId == entranceOpenCondition) { return missions[missionId].MissionState == 3; } } return false; } return true; } public void DisplayEntranceLimitHint() { var taskConfig = PyTaskConfig.Get(entranceOpenCondition); if (taskConfig != null) { SysNotifyMgr.Instance.ShowTip("OpenFabaoHint", taskConfig.lv); } } public void DemonDungeonChallengeNext(int lineId) { CA508_tagCMDoFBAction pak = new CA508_tagCMDoFBAction(); pak.ActionType = 0; pak.ActionInfo = 0; GameNetSystem.Instance.SendInfo(pak); var dungeonModel = ModelCenter.Instance.GetModel(); dungeonModel.UpdateCoolDown(DungeonCoolDownType.LeaveMap, 0); dungeonModel.UpdateCoolDown(DungeonCoolDownType.FightStart, 0); WindowCenter.Instance.Close(); TreasureDungeon treasureDungeon; if (TryGetTreasureDungeon(41110, lineId, out treasureDungeon)) { if (treasureDungeon.currentLevel == treasureDungeon.maxLevel - 1) { BossShowModel.Instance.StartBossShow(41110, lineId); } } if (demonDungeonChallengeNext != null) { demonDungeonChallengeNext(); } } public void ReceivePackage(H0827_tagMissionDesc vNetData) { if (isServerReady) { } } public void ReceivePackage(H0823_tagDelMission package) { if (isServerReady) { foreach (var id in treasureInductionTasks.Keys) { if (treasureInductionTasks[id].Contains((int)package.MissionID)) { if (onInductionTaskComplete != null) { displayInductionId = (int)package.MissionID; onInductionTaskComplete(id); } break; } } TryShowTreasureChapter((int)package.MissionID); } } public bool TryGetLatestInductionTask(int id, out int taskId) { taskId = 0; var latestTask = taskModel.GetLatestMainTaskId(); int curTaskIndex = TaskListConfig.GetMissionIndex(latestTask); if (treasureInductionTasks.ContainsKey(id)) { var count = treasureInductionTasks[id].Count; foreach (var _taskId in treasureInductionTasks[id]) { int lastTaskIndex = TaskListConfig.GetMissionIndex(_taskId); if (curTaskIndex <= lastTaskIndex) { taskId = _taskId; return true; } } taskId = treasureInductionTasks[id][count - 1]; return true; } return false; } public int GetTreasureInductionState(int treasurId) { if (treasures[treasurId].state == TreasureState.Collected) { return 1; } var latestTask = taskModel.GetLatestMainTaskId(); var inductionTask = 0; if (TryGetLatestInductionTask(treasurId, out inductionTask)) { int curTaskIndex = TaskListConfig.GetMissionIndex(latestTask); int lastTaskIndex = TaskListConfig.GetMissionIndex(inductionTask); return curTaskIndex.CompareTo(lastTaskIndex); } return 1; } public int GetClueState(int treasureId,int clue) { var treasure = treasures[treasureId]; if (treasure.state == TreasureState.Collected) { return 2; } else { var taskId = taskModel.GetLatestMainTaskId(); var taskState = taskModel.GetQuestState(taskId); Dictionary> clues; if(TryGetTreasureClues(treasureId, out clues)) { var tasks = clues[clue]; var lastTask = tasks[tasks.Count - 1]; int curTaskIndex = TaskListConfig.GetMissionIndex(taskId); int lastTaskIndex = TaskListConfig.GetMissionIndex(lastTask); if (curTaskIndex > lastTaskIndex || (taskId == lastTask && taskState == 3)) { return 2; } else { if (tasks.Contains(taskId)) { return 1; } } } } return 0; } void TryShowTreasureChapter(int taskId) { var configs = TreasureChapterConfig.GetValues(); foreach (var config in configs) { if (config.taskId == taskId) { treasureChapterId = config.id; PopupWindowsProcessor.Instance.Add("TreasureChapterWin"); break; } } } } }