using System.Collections; using System.Collections.Generic; using UnityEngine; namespace vnxbqy.UI { public class TaskFeedbackModel : Model { Dictionary m_TaskFeedbacks = new Dictionary(); public readonly List taskFeedbackFuncs = new List(); public static Vector3 s_ClickPosition = Vector3.zero; ReikiRootModel reikiRootModel { get { return ModelCenter.Instance.GetModel(); } } PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } TaskModel taskModel { get { return ModelCenter.Instance.GetModel(); } } TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel(); } } AlchemyModel alchemyModel { get { return ModelCenter.Instance.GetModel(); } } EquipModel equipModel { get { return ModelCenter.Instance.GetModel(); } } EquipStrengthModel equipStrengthModel { get { return ModelCenter.Instance.GetModel(); } } TreasureSkillModel treasureSkillModel { get { return ModelCenter.Instance.GetModel(); } } public override void Init() { ParseConfig(); } public override void UnInit() { } void ParseConfig() { var configs = TaskFeedbackConfig.GetValues(); foreach (var config in configs) { if (config.type == 100) { continue; } var feedback = new TaskFeedback() { taskId = config.taskId, type = (TaskFeedbackType)config.type, }; switch (feedback.type) { case TaskFeedbackType.SideTask: case TaskFeedbackType.FightPowerSideTask: { var array = LitJson.JsonMapper.ToObject(config.sideTasks); if (array != null) { List sideTasks = new List(array.Length); for (int i = 0; i < array.Length; i++) { sideTasks.Add(array[i]); } feedback.sideTasks = sideTasks; } } break; case TaskFeedbackType.Equip: { var array = LitJson.JsonMapper.ToObject(config.equips); feedback.equipCondition = array; } break; case TaskFeedbackType.ItemCount: { var array = LitJson.JsonMapper.ToObject(config.items); if (array != null) { List items = new List(); for (int i = 0; i < array.Length; i++) { items.Add(new Item() { id = array[i][0], count = array[i][1], }); } feedback.items = items; } } break; case TaskFeedbackType.SkyTowerFightPoint: { if (!string.IsNullOrEmpty(config.reikiRoot)) { var point = 0; int.TryParse(config.reikiRoot, out point); feedback.totalPoints = point; } } break; case TaskFeedbackType.ReikiPoint: { if (!string.IsNullOrEmpty(config.reikiRoot)) { var json = LitJson.JsonMapper.ToObject(config.reikiRoot); feedback.reikiRoots = new Dictionary>(); foreach (var jobKey in json.Keys) { var job = int.Parse(jobKey); var intArray = LitJson.JsonMapper.ToObject(json[jobKey].ToJson()); feedback.reikiRoots.Add(job, new List()); for (int i = 0; i < intArray.Length; i++) { feedback.reikiRoots[job].Add(intArray[i]); } } } } break; } if (!string.IsNullOrEmpty(config.failFuncs)) { var funcArray = LitJson.JsonMapper.ToObject(config.failFuncs); if (funcArray != null) { List failFuncs = new List(funcArray.Length); for (int i = 0; i < funcArray.Length; i++) { failFuncs.Add(funcArray[i]); } feedback.failFuns = failFuncs; } } m_TaskFeedbacks.Add(config.taskId, feedback); } } public bool TryGetTaskFeedback(int taskId, out TaskFeedback feedback) { return m_TaskFeedbacks.TryGetValue(taskId, out feedback); } public void ExecuteTaskFeedback(int taskId) { if (NewBieCenter.Instance.inGuiding) { return; } if (!WindowCenter.Instance.IsOpen() && taskId != 3110) { //特殊写死3110限制105级开启宗门试炼 触发提示逻辑,如后续不需要,请果断删除 return; } TaskFeedback feedback; if (TryGetTaskFeedback(taskId, out feedback)) { var config = TaskFeedbackConfig.Get(taskId); switch (feedback.type) { case TaskFeedbackType.FightPower: case TaskFeedbackType.Copper: case TaskFeedbackType.ReikiPoint: case TaskFeedbackType.Guide: case TaskFeedbackType.Equip: case TaskFeedbackType.ItemCount: case TaskFeedbackType.SkyTowerFightPoint: case TaskFeedbackType.DemonTreasure: case TaskFeedbackType.AlchemyItem: case TaskFeedbackType.HasFairy: { int condition = 0; if (IsSatisfyCondition(feedback, out condition)) { ExecuteSuccFeedback(taskId); } else { if (config.remind != null && config.remind.Length > 0) { var index = Mathf.Min(condition, config.remind.Length - 1); SysNotifyMgr.Instance.ShowTip(config.remind[index]); } if (feedback.failFuns != null) { var index = Mathf.Min(condition, feedback.failFuns.Count - 1); var funcTitle = index < config.funcTitles.Length ? config.funcTitles[index] : string.Empty; List succFuncs; if (TryGetSatisfyConditionFuncs(feedback.failFuns[index], out succFuncs)) { taskFeedbackFuncs.Clear(); if (config.onlyOneFunc != null && index < config.onlyOneFunc.Length && config.onlyOneFunc[index] == 1) { taskFeedbackFuncs.Add(succFuncs[0]); } else { taskFeedbackFuncs.AddRange(succFuncs); } TaskFeedbackFuncWin.funcTitle = funcTitle; WindowCenter.Instance.Open(); } } } } break; case TaskFeedbackType.SideTask: { int condition = 0; if (IsSatisfyCondition(feedback, out condition)) { ExecuteSuccFeedback(taskId); } else { if (config.remind != null && config.remind.Length > 0) { var taskIndex = feedback.IndexOfSideTasks(condition); var index = Mathf.Min(taskIndex, config.remind.Length - 1); SysNotifyMgr.Instance.ShowTip(config.remind[index]); } if (feedback.failFuns != null) { var taskIndex = feedback.IndexOfSideTasks(condition); var index = Mathf.Min(taskIndex, feedback.failFuns.Count - 1); var funcTitle = index < config.funcTitles.Length ? config.funcTitles[index] : string.Empty; List succFuncs; if (TryGetSatisfyConditionFuncs(feedback.failFuns[index], out succFuncs)) { taskFeedbackFuncs.Clear(); if (config.onlyOneFunc != null && index < config.onlyOneFunc.Length && config.onlyOneFunc[index] == 1) { taskFeedbackFuncs.Add(succFuncs[0]); } else { taskFeedbackFuncs.AddRange(succFuncs); } TaskFeedbackFuncWin.funcTitle = funcTitle; WindowCenter.Instance.Open(); } } } } break; case TaskFeedbackType.FightPowerSideTask: { int condition = 0; if (IsSatisfyCondition(feedback, out condition)) { ExecuteSuccFeedback(taskId); } else { if (config.remind != null && config.remind.Length > 0) { var index = Mathf.Min(condition, config.remind.Length - 1); SysNotifyMgr.Instance.ShowTip(config.remind[index]); } if (feedback.failFuns != null) { var sideTaskId = 0; IsSatisfySideTask(feedback.sideTasks, out sideTaskId); var taskIndex = feedback.IndexOfSideTasks(sideTaskId); var index = Mathf.Min(taskIndex, feedback.failFuns.Count - 1); var funcTitle = index < config.funcTitles.Length ? config.funcTitles[index] : string.Empty; List succFuncs; if (TryGetSatisfyConditionFuncs(feedback.failFuns[index], out succFuncs)) { taskFeedbackFuncs.Clear(); if (config.onlyOneFunc != null && index < config.onlyOneFunc.Length && config.onlyOneFunc[index] == 1) { taskFeedbackFuncs.Add(succFuncs[0]); } else { taskFeedbackFuncs.AddRange(succFuncs); } TaskFeedbackFuncWin.funcTitle = funcTitle; WindowCenter.Instance.Open(); } } } } break; case TaskFeedbackType.OnekeyHangUp: { OnekeyHangUp(); } break; } } } public void OnekeyHangUp() { var mapModel = ModelCenter.Instance.GetModel(); var point = mapModel.GetRecommendHangPoint(); var config = MapEventPointConfig.Get(point); var mapId = MapUtility.GetMapId(config.DataMapID, config.LineId); MapTransferUtility.Instance.MissionFlyTo(mapId, config.NPCID, MapTransferType.WorldTransport); } public void ExecuteSuccFeedback(int id) { var config = TaskFeedbackConfig.Get(id); var guide = config.succGuide; if (guide != 0 && !NewBieCenter.Instance.IsGuideCompleted(guide)) { ExecuteGuide(guide); } else { if (config.jump != 0) { WindowJumpMgr.Instance.WindowJumpTo((JumpUIType)config.jump); } } } public void ExecuteGuide(int id) { if (id == 0) { return; } var config = GuideConfig.Get(id); if (config == null) { DebugEx.LogFormat("引导{0}未添加", id); return; } switch ((GuideType)config.Type) { case GuideType.Functional: if (FunctionalGuideCenter.Instance.ExistUnderwayGuide(id)) { FunctionalGuideCenter.Instance.RemoveGuide(id); NewBieCenter.Instance.ResetGuide(id); SnxxzGame.Instance.StartCoroutine(_ExecuteGuide(id)); } else { FunctionalGuideCenter.Instance.StartGuide(id); } break; default: NewBieCenter.Instance.StartNewBieGuideEx(id); break; } } IEnumerator _ExecuteGuide(int id) { yield return null; FunctionalGuideCenter.Instance.StartGuide(id); } public bool IsSatisfyCondition(TaskFeedback feedback, out int condition) { var config = TaskFeedbackConfig.Get(feedback.taskId); condition = 0; switch (feedback.type) { case TaskFeedbackType.FightPower: return PlayerDatas.Instance.baseData.FightPoint >= (ulong)config.condition; case TaskFeedbackType.SideTask: return IsSatisfySideTask(feedback.sideTasks, out condition); case TaskFeedbackType.ReikiPoint: { if (reikiRootModel.GetReikiRootTotalPointWithFree() < config.condition) { return false; } if (feedback.reikiRoots != null) { var job = PlayerDatas.Instance.baseData.Job; var reikiRoots = feedback.reikiRoots[job]; foreach (var reikiRoot in reikiRoots) { if (reikiRootModel.GetReikiRootPoint(reikiRoot[0]) < reikiRoot[1]) { condition = 1; return false; } } } } return true; case TaskFeedbackType.Equip: { var items = packModel.GetItems(PackType.Item, new SinglePack.FilterParams() { levels = new List() { feedback.equipCondition[0] }, qualitys = new List() { feedback.equipCondition[1] }, equipTypes = EquipModel.realmEquipTypes, jobs = new List() { PlayerDatas.Instance.baseData.Job }, }); return items != null && items.Count > 0; } case TaskFeedbackType.Copper: return PlayerDatas.Instance.baseData.allCopper >= (ulong)config.condition; case TaskFeedbackType.Guide: return true; case TaskFeedbackType.FightPowerSideTask: return PlayerDatas.Instance.baseData.FightPoint >= (ulong)config.condition; case TaskFeedbackType.ItemCount: { if (feedback.items != null) { foreach (var item in feedback.items) { if (packModel.GetItemCountByID(PackType.Item, item.id) < item.count) { return false; } } } return true; } case TaskFeedbackType.AlchemyItem: { if (!alchemyModel.IsGraspRecipe(config.condition)) { var error = 0; if (alchemyModel.TryLearn(config.condition, out error)) { return true; } return false; } Item material; return alchemyModel.GetStoveState(config.condition) != 0 || alchemyModel.IsAlchemyEnoughMaterial(config.condition, out material); } case TaskFeedbackType.SkyTowerFightPoint: { var skyTowerConfig = SkyTowerConfig.Get(config.condition); if (skyTowerConfig != null) { if (feedback.totalPoints > 0 && PlayerDatas.Instance.baseData.FightPoint < (ulong)NPCExConfig.Get(skyTowerConfig.bossId).SuppressFightPower) { condition = reikiRootModel.GetReikiRootTotalPointWithFree() >= feedback.totalPoints ? 0 : 1; return false; } else { return PlayerDatas.Instance.baseData.FightPoint >= (ulong)NPCExConfig.Get(skyTowerConfig.bossId).SuppressFightPower; } } } break; case TaskFeedbackType.DemonTreasure: { TreasureDungeon treasureDungeon; if (treasureModel.TryGetTreasureDungeon(config.condition, out treasureDungeon)) { var dungeonInfo = treasureDungeon.Get(treasureDungeon.currentLevel + 1); if (!dungeonInfo.Equals(default(TreasureDungeonInfo))) { return (int)UIHelper.GetPropertyValue(PropertyType.DEF) >= dungeonInfo.defense; } return true; } } break; case TaskFeedbackType.HasFairy: { return PlayerDatas.Instance.baseData.FamilyId > 0; } } return false; } public bool IsSatisfySideTask(List sideTasks, out int condition) { condition = 0; foreach (var taskId in taskModel.SideQuestsDic.Keys) { for (int i = 0; i < sideTasks.Count; i++) { if (taskId >= sideTasks[i][0] && taskId <= sideTasks[i][1]) { condition = taskId; return false; } } } return true; } public bool TryGetSatisfyConditionFuncs(int[] funcs, out List succFuncs) { succFuncs = null; if (funcs != null && funcs.Length > 0) { succFuncs = new List(); for (int i = 0; i < funcs.Length; i++) { if (IsSatisfyFuncConfition(funcs[i])) { succFuncs.Add(funcs[i]); } } return succFuncs.Count > 0; } return false; } public bool IsSatisfyFuncConfition(int func) { var config = TaskFeedbackFuncConfig.Get(func); if (config != null) { switch (config.type) { case 1: foreach (var item in config.itemCondition) { var count = packModel.GetItemCountByID(PackType.Item, item.x); if (count < item.y) { return false; } } return true; case 2: return reikiRootModel.freePoint > 0; case 3: foreach (var equipSet in equipModel.GetUnLockedEquipSets()) { if (equipModel.ExistBetterEquip(equipSet, EquipModel.realmEquipTypes)) { return true; } } return false; case 4: MissionDetailDates taskData; if (taskModel.TryGetTaskData(config.condition, out taskData)) { return taskData.MissionState != 3; } return false; case 5: return equipStrengthModel.ExistAnySatisfyStrengh(); case 6: if (!alchemyModel.IsGraspRecipe(config.condition)) { var error = 0; if (alchemyModel.TryLearn(config.condition, out error)) { return true; } return false; } Item material; return alchemyModel.GetStoveState(config.condition) != 0 || alchemyModel.IsAlchemyEnoughMaterial(config.condition, out material); case 7: { foreach (var funcId in config.excludeFuncs) { if (funcId == func) { continue; } if (IsSatisfyFuncConfition(funcId)) { return false; } } return true; } case 10: { if (config.expertSkills != null) { foreach (var skill in config.expertSkills) { if (treasureSkillModel.IsSatisfyLevelUpSkill(skill.x, skill.y, skill.z)) { return true; } } } return false; } case 11: { if (config.condition != 0) { Treasure treasure; if (treasureModel.TryGetTreasure(config.condition, out treasure) && treasure.state != TreasureState.Collected) { return true; } } } return false; default: return true; } } return false; } } public struct TaskFeedback { public int taskId; public TaskFeedbackType type; public List sideTasks; public int[] equipCondition; public List items; public Dictionary> reikiRoots; public List failFuns; public int totalPoints; public int IndexOfSideTasks(int taskId) { var index = 0; for (int i = 0; i < sideTasks.Count; i++) { if (taskId >= sideTasks[i][0] && taskId <= sideTasks[i][1]) { index += taskId - sideTasks[i][0]; break; } index += (sideTasks[i][1] - sideTasks[i][0] + 1); } return index; } } public enum TaskFeedbackType { FightPower = 1, SideTask = 2, ReikiPoint = 3, Equip = 4, Copper = 5, Guide = 6, FightPowerSideTask = 7, ItemCount = 8, SkyTowerFightPoint = 9, DemonTreasure = 10, AlchemyItem = 11, HasFairy = 12, OnekeyHangUp = 13, //后续IL开发添加预设 default1, default2, default3, default4, default5, default6, default7, default8, default9, default10, } }