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<int> 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<int, int> missionValueDict = new Dictionary<int, int>(); //类型:任务进度
|
|
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<bool> UpdateMissionEvent;
|
public Dictionary<int, int> missionJumpIDs = new Dictionary<int, int>();
|
|
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);
|
}
|
|
}
|
}
|