using LitJson; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; namespace vnxbqy.UI { public class MissionActModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk, IOpenServerActivity { public event Action onStateUpdate; public const int redPointID = MainRedDot.NewDayActionRedPoint * 10 + 1; public Redpoint redPoint = new Redpoint(MainRedDot.RankActRepoint, redPointID); //可能挂多个父红点 private uint[] AwardRecordList; //领取状态 public int roundNum { get; private set; } //当前轮次 从1开始 public Dictionary missionValueDict = new Dictionary(); //类型:任务进度 public const int activityType = (int)OpenServerActivityCenter.ActivityType.AT_Activity2; public const int activityID = (int)NewDayActivityID.MissionAct; public static Operation operaType = Operation.default30; public int actNum; //对应界面 public event Action UpdateMissionEvent; public Dictionary missionJumpIDs = new Dictionary(); public override void Init() { OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent; OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent; OpenServerActivityCenter.Instance.Register(activityID, this, activityType); var json = JsonMapper.ToObject(FuncConfigConfig.Get("MissionAction").Numerical1); var keys = json.Keys.ToList(); for (int i = 0; i < keys.Count; i++) { missionJumpIDs.Add(int.Parse(keys[i]), int.Parse(json[keys[i]].ToString())); } } public void OnBeforePlayerDataInitialize() { missionValueDict.Clear(); roundNum = 0; AwardRecordList = new uint[0]; } public void OnPlayerLoginOk() { } public override void UnInit() { } public bool IsOpen { get { return OperationTimeHepler.Instance.SatisfyOpenCondition(operaType); } } public bool priorityOpen { get { return redPoint.state == RedPointState.Simple; } } public bool IsAdvance { get { return OperationTimeHepler.Instance.SatisfyAdvanceCondition(operaType); } } private void OperationEndEvent(Operation type, int state) { if (type == operaType && state == 0) { if (onStateUpdate != null) { onStateUpdate(activityID); } UpdateRedpoint(); } } private void OperationAdvanceEvent(Operation type) { if (type == operaType) { if (onStateUpdate != null) { onStateUpdate(activityID); } } } private void OperationStartEvent(Operation type, int state) { if (type == operaType && state == 0) { if (onStateUpdate != null) { onStateUpdate(activityID); } } } //0 不可领取 1 可领取 2 已领取 public int GetMissionAwardState(int id) { if (AwardRecordList.IsNullOrEmpty()) return 0; OperationMissionAct missionAct; OperationTimeHepler.Instance.TryGetOperation(operaType, out missionAct); if (missionAct == null) return 0; if (!missionAct.missionInfo.ContainsKey(id)) return 0; var mission = missionAct.missionInfo[id]; if (!missionValueDict.ContainsKey(mission.TaskType)) return 0; if (missionValueDict[mission.TaskType] < mission.NeedValue) { return 0; } var listIndex = id / 31; var bitIndex = id % 31; if (listIndex >= AwardRecordList.Length) { //超过服务端下发的长度 认为未领取 return 1; } if (((int)Math.Pow(2, bitIndex) & (int)AwardRecordList[listIndex]) == 0) { return 1; } return 2; } void UpdateRedpoint() { redPoint.state = RedPointState.None; if (!IsOpen) return; OperationMissionAct missionAct; OperationTimeHepler.Instance.TryGetOperation(operaType, out missionAct); if (missionAct == null) return; //封包顺序如果有问题 此处为空 var keys = missionAct.missionInfo.Keys.ToList(); for (int i = 0; i < keys.Count; i++) { if (GetMissionAwardState(keys[i]) == 1) { redPoint.state = RedPointState.Simple; return; } } } public void UpdateMissionPlayerInfo(HAA73_tagMCActTaskPlayerInfo netPack) { if (netPack.ActNum != 30) return; actNum = netPack.ActNum; AwardRecordList = netPack.AwardRecordList; bool isNewRound = false; if (roundNum != netPack.RoundNum) { roundNum = netPack.RoundNum; isNewRound = true; } UpdateMissionEvent?.Invoke(isNewRound); UpdateRedpoint(); } public void UpdateMissionPlayerValueInfo(HAA72_tagMCActTaskPlayerValueInfo netPack) { if (netPack.ActNum != 30) return; actNum = netPack.ActNum; for (int i = 0; i < netPack.TaskValueList.Length; i++) { missionValueDict[netPack.TaskValueList[i].TaskType] = (int)netPack.TaskValueList[i].TaskValue; } UpdateMissionEvent?.Invoke(false); UpdateRedpoint(); } public void SendGetAward(int id) { CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward(); getReward.RewardType = 71; getReward.DataEx = (uint)id; getReward.DataExStr = actNum.ToString(); getReward.DataExStrLen = (byte)getReward.DataExStr.Length; GameNetSystem.Instance.SendInfo(getReward); } } }