//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Wednesday, September 13, 2017 //-------------------------------------------------------- using DG.Tweening; using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections.Generic; using System; using Snxxz.UI; //任务系统 namespace Snxxz.UI { [XLua.Hotfix] public class TaskListTip : MonoBehaviour { public float ParentPosition = 74; public float TaskScrollViewTaskScrollView = 230f; public float m_SizeHeight = 72f;//单条任务的宽度 [SerializeField] Transform Parent;//父级 [SerializeField] TreasureCollectBriefInfoBehaviour m_HumanTreasure;//人族法宝 [SerializeField] Transform TaskScrollView;//任务条位置 [SerializeField] Transform Content;//任务条父节点 [SerializeField] ScrollRect m_ScrollRect; public int TaskId = 0;//任务ID List _list = new List();//用来控制进行排序 TreasureModel m_Model; TreasureModel model { get { return m_Model ?? (m_Model = ModelCenter.Instance.GetModel()); } } PlayerTaskDatas m_TaskModel; PlayerTaskDatas taskmodel { get { return m_TaskModel ?? (m_TaskModel = ModelCenter.Instance.GetModel()); } } PackModel _playerPack; PackModel playerPack { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel()); } } PlayerMainDate m_MainModel; PlayerMainDate mainModel { get { return m_MainModel ?? (m_MainModel = ModelCenter.Instance.GetModel()); } } List ListSort = new List();//用于排列顺序(未卡级) List ListSort1 = new List();//用于排序(卡级) private void Start() { } void DisplayTreasure(int _treasureIdHuman) { if (FuncOpen.Instance.IsFuncOpen(106) && model.newGotTreasureId != TreasureModel.TREASURE_GUIDE_ID) { m_HumanTreasure.gameObject.SetActive(true); m_HumanTreasure.Display(); } else { m_HumanTreasure.gameObject.SetActive(false); m_HumanTreasure.Dispose(); } } void UpdateControllerPosition()//更新控件位置 { if (m_HumanTreasure.gameObject.activeSelf) { (Parent as RectTransform).sizeDelta = (Parent as RectTransform).sizeDelta.SetY(ParentPosition); (TaskScrollView as RectTransform).sizeDelta = (TaskScrollView as RectTransform).sizeDelta.SetY(TaskScrollViewTaskScrollView - ParentPosition); } else { (Parent as RectTransform).sizeDelta = (Parent as RectTransform).sizeDelta.SetY(0); (TaskScrollView as RectTransform).sizeDelta = (TaskScrollView as RectTransform).sizeDelta.SetY(TaskScrollViewTaskScrollView); } } public void Init()//初始化 { var TaskSortType = FuncConfigConfig.Get("TaskSortType"); var RenzhuTaskID = FuncConfigConfig.Get("RenzhuTaskID"); if (ListSort.Count <= 0) { int[] TaskSortType1 = ConfigParse.GetMultipleStr(TaskSortType.Numerical1); for (int i = 0; i < TaskSortType1.Length; i++) { ListSort.Add(TaskSortType1[i]); } } if (ListSort1.Count <= 0) { int[] TaskSortType2 = ConfigParse.GetMultipleStr(TaskSortType.Numerical2); for (int i = 0; i < TaskSortType2.Length; i++) { ListSort1.Add(TaskSortType2[i]); } } PlayerTaskDatas.Event_TaskToAdd += TaskToAdd;//任务的添加 PlayerTaskDatas.Event_TaskRefreshes += TaskRefreshes;//任务的刷新 PlayerTaskDatas.Event_TaskToDelete += OnTaskToDelete;//任务的删除 PlayerTaskDatas.Event_TaskInformation += TaskInformation;//任务字典信息 PlayerTaskDatas.MainCardLevelChange += MainCardLevelChange;//卡级任务修改 PlayerTaskDatas.CardLevelChange += CardLevelChangeEvent;//卡级任务状态改变 model.collectingTreasureChangeEvent += OnCollectingTreasureChangeEvent; FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; TreasureNewGotWin.CloseTreasureNewGotWinEvent += CloseTreasureNewGotWinEvent; PlayerDatas.Instance.PlayerDataRefreshInfoEvent += Updatefighting;//数据的刷新(h0418) OnCollectingTreasureChangeEvent(TreasureCategory.Human); TaskScheduling();//任务排序 Selected();//任务选择 TheTaskToGenerate();//任务生成 TaskJump(); } private void CloseTreasureNewGotWinEvent() { DisplayTreasure(model.collectingHuman); UpdateControllerPosition(); } private void OnFuncStateChangeEvent(int obj) { OnCollectingTreasureChangeEvent(TreasureCategory.Human); } public void UnInit() { m_HumanTreasure.Dispose(); model.collectingTreasureChangeEvent -= OnCollectingTreasureChangeEvent; PlayerTaskDatas.Event_TaskRefreshes -= TaskRefreshes;//任务的刷新 PlayerTaskDatas.Event_TaskToAdd -= TaskToAdd;//任务的添加 PlayerTaskDatas.Event_TaskToDelete -= OnTaskToDelete;//任务的删除 PlayerTaskDatas.Event_TaskInformation -= TaskInformation;//任务字典信息 FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; TreasureNewGotWin.CloseTreasureNewGotWinEvent -= CloseTreasureNewGotWinEvent; PlayerTaskDatas.MainCardLevelChange -= MainCardLevelChange;//卡级任务修改 PlayerTaskDatas.CardLevelChange -= CardLevelChangeEvent;//卡级任务状态改变 PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= Updatefighting;//数据的刷新(h0418) StopAllCoroutines(); } private void Updatefighting(PlayerDataRefresh obj)//等级刷新 { if (obj == PlayerDataRefresh.FightPower) { foreach (var key in taskmodel.allMissionDict.Keys) { var TaskPower = TaskPowerConfig.Get(key); if (TaskPower != null) { int leng = Content.childCount; for (int i = 0; i < leng; i++) { GameObject childObj = Content.GetChild(i).gameObject; TaskType childObjTaskType = Content.GetChild(i).gameObject.GetComponent(); if (childObj.activeSelf && childObjTaskType.TaskID == key) { childObj.GetComponent().FlyingShoes_Task(key); } } } } } } private void CardLevelChangeEvent(int taskID)//卡级状态改变 { if (taskmodel.allMissionDict.ContainsKey(taskID) && taskmodel.allMissionDict[taskID].Type == 3) { TaskScheduling(); ChangeSort(); TaskJump(taskID); } } private void MainCardLevelChange(int _id)//主线任务卡级状态改变 { //TaskScheduling(); //ChangeSort(); //TaskJump(_id); } private void SetLength() { if (_list.Count >= 12) { (Content as RectTransform).sizeDelta = (Content as RectTransform).sizeDelta.SetY(m_SizeHeight * 12); } else { (Content as RectTransform).sizeDelta = (Content as RectTransform).sizeDelta.SetY(m_SizeHeight * _list.Count); } } void TheTaskToGenerate()//任务生成 { int leng = Content.childCount; for (int i = 0; i < leng; i++) { GameObject childObj = Content.GetChild(i).gameObject; TaskType childObjTaskType = Content.GetChild(i).gameObject.GetComponent(); childObjTaskType.ClearTaskName(); if (childObj.activeSelf) { childObj.SetActive(!childObj.activeSelf); } } SetLength(); for (int i = 0; i < _list.Count; i++) { if (i >= Content.childCount) { continue; } TaskType childObjTaskType = Content.GetChild(i).gameObject.GetComponent(); childObjTaskType.TaskID = _list[i]; childObjTaskType.IsGameObjectName(_list[i]); childObjTaskType.IsMysteriousTask(); GameObject childObj = Content.GetChild(i).gameObject; childObj.SetActive(true); childObj.GetComponent().FlyingShoes_Task(_list[i]); } } void TaskToAdd(int MissionID, int MissionState, int DiscriptionIndex)//添加任务 { if (MissionID == 2000 || MissionID == 3000 || MissionState == 3 || MissionState == 0) { return; } if (Parent.gameObject.activeInHierarchy) { StartCoroutine(WaitAddTask(MissionID, MissionState)); } } IEnumerator WaitAddTask(int MissionID, int MissionState) { yield return WaitingForSecondConst.WaitMS300;//缓冲0.3秒再进行 var inDungeon = IsDungeon(); TaskScheduling(); if (WindowCenter.Instance.IsOpen() && !inDungeon) { if (MissionState != 0 && MissionID != 1 && _list.Contains(MissionID)) { Selected();//选中逻辑 TaskAddAndDelete(MissionID); if (NewBieCenter.Instance.inGuiding || ModelCenter.Instance.GetModel().newGotShowing) { yield break ; } TaskJump(MissionID); yield break; } } } private void TaskAddAndDelete(int TaskID) { for (int i = 0; i < Content.childCount; i++) { GameObject childObj = Content.GetChild(i).gameObject; TaskType childObjTaskType = Content.GetChild(i).gameObject.GetComponent(); if (i < _list.Count) { if (!childObj.activeSelf) { childObj.SetActive(true); } childObjTaskType.TaskID = _list[i]; childObjTaskType.IsGameObjectName(_list[i]); childObjTaskType.IsMysteriousTask(); childObj.GetComponent().FlyingShoes_Task(_list[i]); } else { childObjTaskType.ClearTaskName(); if (childObj.activeSelf) { childObj.SetActive(false); } } } ChangeSort();//关于任务变更排序 SetLength(); } void TaskRefreshes(int MissionID)//任务的刷新 2 { if (MissionID == 2000 || MissionID == 3000) { return; } TaskScheduling(); bool _isBool = false; for (int i = 0; i < _list.Count; i++) { if (taskmodel.SideQuestState(_list[i]) == 2) { _isBool = true; } } if (_isBool) { TheTaskToGenerate(); return; } for (int i = 0; i < _list.Count; i++) { if (i <= Content.childCount - 1) { GameObject childObj = Content.GetChild(i).gameObject; TaskType childObjTaskType = Content.GetChild(i).gameObject.GetComponent(); if (childObj.activeSelf && childObjTaskType.TaskID == MissionID) { if (childObjTaskType.m_TypeBool) { childObj.GetComponent().FlyingShoes_Task(MissionID); } else { childObj.GetComponent().FlyingShoes_Task(MissionID); } } } } SetLength(); if (NewBieCenter.Instance.inGuiding || ModelCenter.Instance.GetModel().newGotShowing) { return; } TaskJump(); } void OnTaskToDelete(int _IdTask)//任务的删除 { var inDungeon = IsDungeon(); TaskScheduling(); if (WindowCenter.Instance.IsOpen() && !inDungeon) { DeleteSort(_IdTask); } TaskJump(); } private void DeleteSort(int taskID)//关于任务删除 { for (int i = 0; i < Content.childCount; i++) { GameObject obj = Content.GetChild(i).gameObject; TaskType taskType = obj.GetComponent(); if (obj.activeSelf && taskType.TaskID == taskID) { taskType.TaskID = 0; taskType.ClearTaskName(); obj.SetActive(false); obj.transform.SetAsLastSibling(); return; } } } private void ChangeSort()//关于任务变更排序 { for (int i = 0; i < _list.Count; i++) { for (int j = 0; j < Content.childCount; j++) { GameObject obj = Content.GetChild(j).gameObject; TaskType taskType = obj.GetComponent(); if (taskType.TaskID != 0 && taskType.TaskID == _list[i]) { int Inedx = _list.IndexOf(taskType.TaskID); obj.transform.SetSiblingIndex(Inedx); } } } } void TaskInformation(int _Taskid, Dictionary> _Dic)//任务字典信息 { int leng = Content.childCount; for (int i = 0; i < leng; i++) { GameObject childObj = Content.GetChild(i).gameObject; TaskType childObjTaskType = Content.GetChild(i).gameObject.GetComponent(); if (childObj.activeSelf && childObjTaskType.TaskID == _Taskid) { childObj.GetComponent().FlyingShoes_Task(_Taskid); } } } void TaskScheduling()//任务排序 { _list.Clear(); foreach (var key in taskmodel.allMissionDict.Keys) { //过滤未接任务和可完成任务 if (taskmodel.allMissionDict[key].MissionState != 0 && taskmodel.allMissionDict[key].MissionState != 3 && taskmodel.allMissionDict[key].Type != 13 && taskmodel.allMissionDict[key].Type != 14 && taskmodel.allMissionDict[key].Type != 16) { _list.Add(key); } } bool IsDefault = true; foreach (var key in taskmodel.SideQuestsDic.Keys) { var State = taskmodel.GetTaskStatus(key); if (State == PlayerTaskDatas.TaskStatus.CardLevel) { IsDefault = false; } } if (IsDefault) { _list.Sort(Compare);//默认的排序 } else { _list.Sort(Compare1);//卡级排序 } } int Compare(int x, int y)//默认排序(无卡级) { MissionDetailDates xPack = taskmodel.allMissionDict[x]; MissionDetailDates yPack = taskmodel.allMissionDict[y]; bool IsMainTaskx = xPack.Type == 0; bool IsMainTasky = yPack.Type == 0; if (IsMainTaskx.CompareTo(IsMainTasky) != 0)//优先主线 { return -IsMainTaskx.CompareTo(IsMainTasky); } bool IsStateTaskx = xPack.MissionState == 2; bool IsStateTasky = yPack.MissionState == 2; if (IsStateTaskx.CompareTo(IsStateTasky) != 0)//优先可领取 { return -IsStateTaskx.CompareTo(IsStateTasky); } var _index0 = ListSort.IndexOf(xPack.Type); var _index1 = ListSort.IndexOf(yPack.Type); if (_index0.CompareTo(_index1) != 0) { return _index0.CompareTo(_index1); } if (xPack.LV.CompareTo(yPack.LV) != 0) { return -xPack.LV.CompareTo(yPack.LV); } return 1; } int Compare1(int x, int y)//排序有卡级 { MissionDetailDates xPack = taskmodel.allMissionDict[x]; MissionDetailDates yPack = taskmodel.allMissionDict[y]; bool IsMainTaskx = xPack.Type == 0; bool IsMainTasky = yPack.Type == 0; if (IsMainTaskx.CompareTo(IsMainTasky) != 0)//优先主线 { return -IsMainTaskx.CompareTo(IsMainTasky); } bool IsStateTaskx = xPack.MissionState == 2; bool IsStateTasky = yPack.MissionState == 2; if (IsStateTaskx.CompareTo(IsStateTasky) != 0)//优先可领取 { return -IsStateTaskx.CompareTo(IsStateTasky); } var _index0 = ListSort1.IndexOf(xPack.Type); var _index1 = ListSort1.IndexOf(yPack.Type); if (_index0.CompareTo(_index1) != 0) { return _index0.CompareTo(_index1); } if (xPack.LV.CompareTo(yPack.LV) != 0) { return -xPack.LV.CompareTo(yPack.LV); } return 1; } private void OnCollectingTreasureChangeEvent(TreasureCategory _category) { DisplayTreasure(model.collectingHuman); UpdateControllerPosition(); } private bool IsDungeon()//判断是否在副本中 { var mapId = PlayerDatas.Instance.baseData.MapID; var mapConfig = MapConfig.Get(mapId); return mapConfig != null && mapConfig.MapFBType != 0; } private void TaskJump(int jumpTask = 0) { int type = 0; if (jumpTask == 0)//跳到默认选中 { if (taskmodel.GetNowTaskID != taskmodel.TaskupToDate)//默认的和最新选中的不一致时 { if (_list.Contains(taskmodel.TaskupToDate)) { type = _list.IndexOf(taskmodel.TaskupToDate); } taskmodel.TaskupToDate = taskmodel.GetNowTaskID; } else { if (_list.Contains(taskmodel.GetNowTaskID)) { type = _list.IndexOf(taskmodel.GetNowTaskID); } } } else { if (_list.Contains(jumpTask))//跳到最新添加 { type = _list.IndexOf(jumpTask); } } if (_list.Count <= 2 || type <= 0) { m_ScrollRect.verticalNormalizedPosition = 1; } else { float _position = 0f; if (_list.Count >= 12) { _position = (12 - type) * m_SizeHeight + (12 - type - 1) * 2; } else { _position = (_list.Count - type) * m_SizeHeight + (_list.Count - type - 1) * 2; } _position -= 196; m_ScrollRect.verticalNormalizedPosition = Mathf.Clamp01(_position / ((Content as RectTransform).sizeDelta.y - 196)); } } private void Selected()//选中逻辑修改 { if (taskmodel.GetTaskStatus(taskmodel.GetNowTaskID) == PlayerTaskDatas.TaskStatus.CardLevel) { bool _IsBool = false; var taskList = TaskListConfig.Get(taskmodel.GetNowTaskID); if (taskList!=null) { _IsBool = true; } for (int i = 0; i < _list.Count; i++) { if (taskmodel.GetTaskStatus(_list[i]) != PlayerTaskDatas.TaskStatus.CardLevel) { if (_IsBool)//主线卡级 { var task_List = TaskListConfig.Get(_list[i]); if (task_List==null) { taskmodel.GetNowTaskID = _list[i]; return; } } else//非主线卡级 { taskmodel.GetNowTaskID = _list[i]; return; } } } } } } }