// *********************************************************************** // Assembly : Unity // Author : Kimch // Created : 2017-10-24 // // Last Modified By : Kimch // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System.Collections; using System.Collections.Generic; namespace G { /// /// /// partial class MissionProxy : F.GameProxy { #region FIELD private readonly Dictionary _missions = new Dictionary(); private readonly Dictionary> _eventMissions = new Dictionary>(); private readonly List _achievementMissions = new List(); private readonly List _dailyMissions = new List(); private readonly List _weeklyMissions = new List(); private Mission _mainMission; private readonly List _mainMissions = new List(); private bool _eventChanged; #endregion #region PROPERTY public override int priority => 998; /// /// 日常任务 /// public IReadOnlyList dailyMissions { get { //if (_dailyMissions.Count == 0) //{ // foreach (var mission in _missions) // { // if (mission.Value.type == 1) // { // _dailyMissions.Add(mission.Value); // } // } //} CheckMission(); _dailyMissions.Sort(); return _dailyMissions; } } /// /// 每周任务 /// public IReadOnlyList weeklyMissions { get { //if (_weeklyMissions.Count == 0) //{ // foreach (var mission in _missions) // { // if (mission.Value.type == 5) // { // _weeklyMissions.Add(mission.Value); // } // } //} CheckMission(); _weeklyMissions.Sort(); return _weeklyMissions; } } /// /// 成就 /// public IReadOnlyList achievements { get { //if (_achievementMissions.Count == 0) //{ // LoadMission(); // foreach (var mission in _missions) // { // if (mission.Value.type == 2) // { // _achievementMissions.Add(mission.Value); // } // } //} _achievementMissions.Sort(); return _achievementMissions; } } /// /// 主线任务 /// public Mission mainMission { get { //if (_mainMissions.Count == 0) //{ // LoadMission(); // foreach (var mission in _missions) // { // if (mission.Value.type == 3) // { // _mainMissions.Add(mission.Value); // var prev = mission.Value.prevMission; // if (prev != null) // { // prev.nextMission = mission.Value; // } // } // } // _mainMission = _mainMissions[0]; //} while (_mainMission != null && _mainMission.isRewarded) { _mainMission = _mainMission.nextMission; } return _mainMission; } } #endregion #region METHOD /// /// /// /// /// public Mission GetMission(int id) { Mission result = null; if (id > 0) _missions.TryGetValue(id, out result); return result; } /// /// 是否完成的任务 /// /// /// public bool IsCompletedMission(int id) { var mission = GetMission(id); return mission != null ? mission.isCompleted : false; } /// /// /// public void CheckMission() { CheckWeekMission(); CheckDailyMission(); } /// /// /// private void CheckDailyMission() { //if (_dailyMissions.Count > 0 && TimeProxy.Instance.TryTimeKey(TimeProxy.每日任务)) //{ // foreach (var mission in _dailyMissions) // { // mission.Reset(); // } // OnEvent(MissionProxy.每日累计登录次数); // SaveLocal(); //} if (TimeProxy.Instance.TryTimeKey(TimeProxy.每日任务)) { foreach (var mission in _missions.Values) { if (mission.item.reset == 1) mission.Reset(); } OnEvent(MissionProxy.每日累计登录次数); SaveLocal(); } } private void CheckWeekMission() { //if (_weeklyMissions.Count > 0 && TimeProxy.Instance.TryTimeKey(TimeProxy.每周任务)) //{ // foreach (var mission in _weeklyMissions) // { // mission.Reset(); // } // SaveLocal(); //} if (TimeProxy.Instance.TryTimeKey(TimeProxy.每周任务)) { foreach (var mission in _missions.Values) { if (mission.item.reset == 2) mission.Reset(); } SaveLocal(); } } /// /// 月清 /// private void CheckMonthMission() { //if (TimeProxy.Instance.TryTimeKey(TimeProxy.每周任务)) //{ // foreach (var mission in _missions.Values) // { // if (mission.item.reset == 3) // mission.Reset(); // } // SaveLocal(); //} } /// /// /// /// public bool JumpMission(Mission mission) { #if !UNITY_WEBGL && (UNITY_EDITOR || DEBUG_MY) if (KGMOptions.Instance.任务跳过完成) { mission.curValue = mission.maxValue; return true; } #endif switch (mission.eventId) { case 通关成功: case 闯关次数:// case 角色达到X: case 击杀小怪数量: // case 击杀大怪数量:// case 使用指定技能: { var level = ItemProxy.Instance.GetStaticItem(LevelProxy.Instance.currentUnlockedLevel); if (level != null) KUIWindow.OpenWindow(level); } break; case 装备累计获得_数量: case 装备累计穿戴_等级_品质_数量: case 装备累计回收_数量: case 累计强化次数: case 装备累计重铸_次数: PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, null, "3"); break; case 饰品宝箱加速次数: case 装备宝箱加速次数: case 开启宝箱次数: PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, null, "4"); break; case 游历次数: PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, null, "0"); break; case 武学升级次数: PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, null, "1"); break; case 处理江湖事件次数: case 红颜问候X次: case 红颜送礼X次: case 指定红颜亲密度达到X: case 指定红颜的X技能达到X级: case 红颜技能累计提升X次: //PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, 0, ""); KUIWindow.OpenWindow(); break; case 境界系统任务完成X次: case 境界达到X级: case 累计境界修炼X次: KUIWindow.OpenWindow(); break; case 完成指定类型任务: var missionType = mission.eventArg1; if (missionType == 1 || missionType == 2) KUIWindow.OpenWindow(missionType == 1 ? UI.MissionWindow.DAILY_PANEL : UI.MissionWindow.ACHIEVEMENT_PANEL); break; case 宠物升级次数: KUIWindow.OpenWindow(); break; } return true; } /// /// 领取奖励 /// /// /// public void GainReward(int id, Callback2 callback) { if (AntiCheatProxy.Instance.isCheat) { callback?.Invoke(ErrorCode.TIME_CHEAT, "请检查手机时间"); return; } var mission = GetMission(id); if (mission.isRewarding) { mission.isRewarded = true; RewardProxy.Instance.GetRewardsWithUI(mission.rewards, (error, message) => { if (error ==0) { PostNotification(GlobalDefine.EVENT_MONEY_CHANGED); } }); OnEvent(完成指定类型任务, 1, mission.item.type); OnEvent(领取指定任务奖励, 1, mission.id); _eventChanged = true; OnMissionRewarded(); //SaveLocal(); //PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); callback?.Invoke(0, ""); } else { callback?.Invoke(1, ""); } } /// /// 一键 /// /// 1,2,3 public void OneKeyGainRewards(int type, Callback2 callback) { if (AntiCheatProxy.Instance.isCheat) { callback?.Invoke(ErrorCode.TIME_CHEAT, "请检查手机时间"); return; } var rewards = F.ListPool.Get(); int compC = 0; if (type == 1) { foreach (var item in _dailyMissions) { if (item.isRewarding) { compC += 1; item.isRewarded = true; rewards.AddRange(item.rewards); OnEvent(领取指定任务奖励, 1, item.id); } } } else if (type == 2) { foreach (var item in _achievementMissions) { if (item.isRewarding) { compC += 1; item.isRewarded = true; rewards.AddRange(item.rewards); OnEvent(领取指定任务奖励, 1, item.id); } } } else if (type == 5) { foreach (var item in _weeklyMissions) { if (item.isRewarding) { compC += 1; item.isRewarded = true; rewards.AddRange(item.rewards); OnEvent(领取指定任务奖励, 1, item.id); } } } if (compC > 0) { OnEvent(完成指定类型任务, compC, type); RewardProxy.Instance.GetRewardsWithUI(rewards, (error, message) => { PostNotification(GlobalDefine.EVENT_MONEY_CHANGED); }); _eventChanged = true; OnMissionRewarded(); callback?.Invoke(0, ""); //SaveLocal(); //PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { callback?.Invoke(1, ""); PostNotification(GlobalDefine.EVENT_SHOW_TOAST, "暂无可领取的奖励"); } F.ListPool.Release(rewards); } public void OnMissionCompleted(Mission mission) { #if UNITY_EDITOR UnityEngine.Debug.Log(StringLoggingExtensions.Colored($"{mission.id} 任务完成", Colors.fuchsia)); #endif PostNotification(GlobalDefine.EVENT_MISSION_COMPLETED, mission); KStatistics.Instance.ReportEvent_Mission(mission.item.type.ToString(), mission.id, mission.name, mission.description, 1, mission.rewardText); } private void OnMissionRewarded() { } /// /// /// /// public int GetRedPointDay() { if (_dailyMissions != null) { CheckMission(); for (int i = 0; i < _dailyMissions.Count; i++) { if (_dailyMissions[i].isRewarding) { return 1; } } } return 0; } /// /// /// /// public int GetRedPointAch() { if (_achievementMissions != null) for (int i = 0; i < _achievementMissions.Count; i++) { if (_achievementMissions[i].isRewarding) { return 1; } } return 0; } /// /// /// /// public int GetRedPointWeek() { if (_weeklyMissions != null) for (int i = 0; i < _weeklyMissions.Count; i++) { if (_weeklyMissions[i].isRewarding) { return 1; } } return 0; } private const string MISSION_KEY_V1 = "missions"; private void LoadLocal() { var dataList = ArchiveProxy.Instance.GetIntList(MISSION_KEY_V1); if (dataList != null && dataList.Count > 0) { int index = 0; Label: var id = dataList[index++]; int data = dataList[index++]; if (_missions.TryGetValue(id, out Mission mission)) { mission.Set(data); } if (index < dataList.Count) goto Label; } } private void SaveLocal() { var dataList = ArchiveProxy.Instance.GetIntList(MISSION_KEY_V1); if (dataList != null) { dataList.Clear(); foreach (var mission in _missions.Values) { if (mission.curValue > 0) { dataList.Add(mission.id); dataList.Add(mission.Get()); } } ArchiveProxy.Instance.SetIntList(MISSION_KEY_V1, dataList); } } private void LoadMission() { if (_missions.Count == 0) { var missionItems = ItemProxy.Instance.GetStaticItems(); foreach (var item in missionItems) { _missions.Add(item.id, new Mission(item)); } foreach (var mission in _missions.Values) { if (_eventMissions.TryGetValue(mission.eventId, out var missions)) { missions.Add(mission); } else { missions = new List { mission }; _eventMissions.Add(mission.eventId, missions); } switch (mission.item.type) { case 1: _dailyMissions.Add(mission); break; case 2: _achievementMissions.Add(mission); break; case 3: _mainMissions.Add(mission); var prev = mission.prevMission; if (prev != null) { prev.nextMission = mission; } break; case 5: _weeklyMissions.Add(mission); break; } } if (_mainMissions.Count > 0) _mainMission = _mainMissions[0]; } else { foreach (var mission in _missions.Values) { mission.Reset(); } if (_mainMissions.Count > 0) _mainMission = _mainMissions[0]; } } private void SyncMission() { } /// /// 累加事件1 /// /// public void OnEvent(int eventId, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid) { mission.curValue += 1; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } /// /// 累加事件1 /// /// /// public void OnEvent(int eventId, int eventTarget, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid) { mission.curValue += eventTarget; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } /// /// 累加事件1 /// /// /// /// public void OnEvent(int eventId, int eventTarget, int eventArg1, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid && mission.CheckEventArg1(eventArg1)) { mission.curValue += eventTarget; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } /// /// 累加事件1 /// /// /// /// /// public void OnEvent(int eventId, int eventTarget, int eventArg1, int eventArg2, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid && mission.CheckEventArg2(eventArg1, eventArg2)) { mission.curValue += eventTarget; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } /// /// 达到事件 /// /// /// public void OnEvent2(int eventId, int eventTarget, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid /*&& mission.maxValue <= eventTarget*/) { mission.curValue = eventTarget; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } /// /// 达到事件 /// /// /// public void OnClampEvent2(int eventId, int eventTarget, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid && mission.maxValue <= eventTarget) { mission.curValue = eventTarget; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } /// /// 达到事件 /// /// /// public void OnEvent2(int eventId, int eventTarget, int eventArg1, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid && mission.CheckEventArg1(eventArg1) && mission.curValue < eventTarget) { mission.curValue = eventTarget; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } /// /// 达到事件 /// /// /// /// /// public void OnEvent2(int eventId, int eventTarget, int eventArg1, int eventArg2, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid && mission.CheckEventArg2(eventArg1, eventArg2) && mission.curValue < eventTarget) { mission.curValue = eventTarget; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } /// /// 累计over事件 /// /// /// /// /// /// public void OnOverEvent(int eventId, int eventTarget, int eventArg1, int eventArg2, bool immediately = false) { if (_eventMissions.TryGetValue(eventId, out var missions)) { bool flag = false; foreach (var mission in missions) { if (mission.isValid && mission.OverEventArg2(eventArg1, eventArg2)) { mission.curValue += eventTarget; flag = true; } } if (flag) { if (immediately) { SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } else { _eventChanged = true; } } } } #endregion #region Unity private void Awake() { Instance = this; } private void LateUpdate() { if (_eventChanged) { _eventChanged = false; SaveLocal(); PostNotification(GlobalDefine.EVENT_MISSION_CHANGED); } } public override void ReadArchive() { LoadMission(); LoadLocal(); SyncMission(); } public override void OnRegister() { } public override void OnRemove() { } #endregion #region STATIC public static MissionProxy Instance; #endregion } }