using System;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
|
namespace vnxbqy.UI
|
{
|
public class HolidayTravelModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk, IOpenServerActivity
|
{
|
public event Action<int> 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<byte, int> playerTravelAwards = new Dictionary<byte, int>();
|
//【任务ID,此任务总进度,完成次数】
|
public Dictionary<byte, List<int>> travelTaskProcess = new Dictionary<byte, List<int>>();
|
//记录收包时的任务顺序 用于排序参考
|
List<byte> taskPackSort = new List<byte>();
|
//排序后
|
public List<byte> travelTaskSort = new List<byte>();
|
|
public event Action onTravelAwards;
|
public event Action onTaskProcess;
|
|
PackModel playerPack { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
|
|
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> { (int)task.TravelValue, (int)task.FinishCount };
|
}
|
else
|
{
|
travelTaskProcess.Add(task.TravelTaskID, new List<int> { (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;
|
}
|
}
|
}
|