using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace vnxbqy.UI { public class HolidayTravelModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk, IOpenServerActivity { public event Action onStateUpdate; public const int redPointID = 28004; public Redpoint redPoint = new Redpoint(MainRedDot.RedPoint_HolidayWishes, redPointID); public Operation operationType = Operation.HolidayTravel; //节日祝福 id从101开始和精彩活动区分 public const int activityType = (int)OpenServerActivityCenter.ActivityType.AT_JRZF; public const int activityID = 104; public int travelPoint; //当前获得的总游历值 //奖励索引:此任务奖励已领取次数 public Dictionary playerTravelAwards = new Dictionary(); //【任务ID,此任务总进度,完成次数】 public Dictionary> travelTaskProcess = new Dictionary>(); //记录收包时的任务顺序 用于排序参考 List taskPackSort = new List(); //排序后 public List travelTaskSort = new List(); public event Action onTravelAwards; public event Action onTaskProcess; PackModel playerPack { get { return ModelCenter.Instance.GetModel(); } } public override void Init() { OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent; OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent; OpenServerActivityCenter.Instance.Register(activityID, this, activityType); } public void OnBeforePlayerDataInitialize() { travelTaskProcess.Clear(); travelTaskSort.Clear(); taskPackSort.Clear(); playerTravelAwards.Clear(); travelPoint = 0; } public void OnPlayerLoginOk() { } public override void UnInit() { OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent; OperationTimeHepler.Instance.operationAdvanceEvent -= OperationAdvanceEvent; } public bool IsOpen { get { return OperationTimeHepler.Instance.SatisfyOpenCondition(operationType); } } public bool priorityOpen { get { return redPoint.state == RedPointState.Simple; } } public bool IsAdvance { get { return OperationTimeHepler.Instance.SatisfyAdvanceCondition(operationType); } } private void OperationEndEvent(Operation type, int state) { if (type == operationType && state == 0) { if (onStateUpdate != null) { onStateUpdate(activityID); } UpdateRedpoint(); } } private void OperationAdvanceEvent(Operation type) { if (type == operationType) { if (onStateUpdate != null) { onStateUpdate(activityID); } } } private void OperationStartEvent(Operation type, int state) { if (type == operationType && state == 0) { if (onStateUpdate != null) { onStateUpdate(activityID); } } } void UpdateRedpoint() { redPoint.state = RedPointState.None; if (GetCanGetAwardIndex() != -1) { redPoint.state = RedPointState.Simple; } } public void SendGetAward(uint index) { CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward(); getReward.RewardType = (byte)GotServerRewardType.Def_RewardType_HolidayTravel; getReward.DataEx = index; getReward.DataExStrLen = 0; getReward.DataExStr = string.Empty; GameNetSystem.Instance.SendInfo(getReward); } public void OnPlayerTravelInfo(HAA47_tagMCFeastTravelPlayerInfo netPack) { travelPoint = (int)netPack.TravelPoint; if (netPack.TravelPlayerAwardCount != 0) { foreach (var award in netPack.TravelPlayerAwardList) { if (playerTravelAwards.ContainsKey(award.AwardIndex)) { playerTravelAwards[award.AwardIndex] = (int)award.GetAwardCount; } else { playerTravelAwards.Add(award.AwardIndex, (int)award.GetAwardCount); } } if (onTravelAwards != null) { //刷新领奖信息(打开界面比较少能完成任务不做及时刷新) onTravelAwards(); } } if (netPack.TravelPlayerTaskCount != 0) { foreach (var task in netPack.TravelPlayerTaskList) { if (travelTaskProcess.ContainsKey(task.TravelTaskID)) { travelTaskProcess[task.TravelTaskID] = new List { (int)task.TravelValue, (int)task.FinishCount }; } else { travelTaskProcess.Add(task.TravelTaskID, new List { (int)task.TravelValue, (int)task.FinishCount }); taskPackSort.Add(task.TravelTaskID); travelTaskSort.Add(task.TravelTaskID); } } travelTaskSort.Sort(CompareState); if (onTaskProcess != null) { onTaskProcess(); } } UpdateRedpoint(); } // 已完成往后排 int CompareState(byte x, byte y) { OperationHolidayTravel holiday; if (OperationTimeHepler.Instance.TryGetOperation(operationType, out holiday)) { bool xfinish = IsTaskFinish(holiday, x); bool yfinish = IsTaskFinish(holiday, y); if (xfinish != yfinish) return xfinish.CompareTo(yfinish); return taskPackSort.IndexOf(x).CompareTo(taskPackSort.IndexOf(y)); } return 0; } public bool IsTaskFinish(OperationHolidayTravel holiday, byte taskID) { return holiday.travelTasks[taskID].FinishTimeMax <= travelTaskProcess[taskID][1]; } //指定任务的单次进度 public int GetTaskProcess(OperationHolidayTravel holiday, byte taskID) { return Math.Max(0, travelTaskProcess[taskID][0] - travelTaskProcess[taskID][1]*holiday.travelTasks[taskID].FinishNeedValue); } //指定档位的剩余领取次数,-1不限制 public int GetAwardRemindTimes(OperationHolidayTravel holiday, byte awardIndex) { var maxCnt = holiday.travelAwards[awardIndex].AwardCountMax; if (maxCnt == 0) { return -1; } return maxCnt - playerTravelAwards[awardIndex]; } //指定档位的剩余游历值 public int GetRemindTravelPoint(OperationHolidayTravel holiday, byte awardIndex) { return travelPoint - playerTravelAwards[awardIndex]*holiday.travelAwards[awardIndex].NeedTravelPoint; } // 指定档位领取状态0 未达成 1 可领取 2 已领取 public int GetAwardState(OperationHolidayTravel holiday, byte awardIndex) { var maxCnt = holiday.travelAwards[awardIndex].AwardCountMax; if (maxCnt == 0 || maxCnt > playerTravelAwards[awardIndex]) { if (travelPoint >= (playerTravelAwards[awardIndex] + 1) * holiday.travelAwards[awardIndex].NeedTravelPoint) { return 1; } else { return 0; } } return 2; } //获取第几个档位可领取 public int GetCanGetAwardIndex() { OperationHolidayTravel holiday; if (OperationTimeHepler.Instance.TryGetOperation(operationType, out holiday)) { int index = 0; foreach (var award in holiday.travelAwards) { if (GetAwardState(holiday, award.Value.AwardIndex) == 1) { return index; } index++; } } return -1; } } }