using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
|
using LitJson;
|
using System.Linq;
|
|
namespace Snxxz.UI
|
{
|
[XLua.LuaCallCSharp]
|
public class ActivityModel : Model, IPlayerLoginOk, IBeforePlayerDataInitialize
|
{
|
HeavenBattleModel battleModel { get { return ModelCenter.Instance.GetModel<HeavenBattleModel>(); } }
|
FairyModel fairyModel { get { return ModelCenter.Instance.GetModel<FairyModel>(); } }
|
AllianceBossModel allianceBossModel { get { return ModelCenter.Instance.GetModel<AllianceBossModel>(); } }
|
public override void Init()
|
{
|
var dic = DailyQuestConfig.GetValues();
|
foreach (var cfg in dic)
|
{
|
DailyQuestOpenTime dailyQuestOpenTime;
|
if (dailyQuestModel.TryGetOpenTime(cfg.ID, out dailyQuestOpenTime))
|
{
|
dailyQuests.Add(dailyQuestOpenTime);
|
m_NotifyDict.Add(cfg.ID, false);
|
}
|
}
|
|
for (int i = (int)SpecialActivity.None + 1; i < (int)SpecialActivity.max; i++)
|
{
|
m_NotifyDict.Add(i, false);
|
}
|
|
fairyLeagueModel.OnRefreshFairyLeagueEvent += CheckActivity;
|
fairyLeagueModel.onFairyLeagueBattleEvent += CheckActivity;
|
PlayerDatas.Instance.fairyData.OnRefreshFairyBoss += CheckActivity;
|
StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish;
|
NewBieCenter.Instance.guideCompletedEvent += GuideCompletedEvent;
|
AdventureStage.Instance.onLoadAdventureStage += OnLoadAdventureStageFinish;
|
|
var _funcCfg = FuncConfigConfig.Get("SpecialActivitys");
|
var _json = LitJson.JsonMapper.ToObject(_funcCfg.Numerical1);
|
foreach (var _key in _json.Keys)
|
{
|
var _type = int.Parse(_key);
|
specialActivityDict.Add(_type, JsonMapper.ToObject<SpecialActivityData>(_json[_key].ToJson()));
|
}
|
|
activityNotifies = new List<int>();
|
}
|
|
private void GuideCompletedEvent(int _id)
|
{
|
SnxxzGame.Instance.StartCoroutine(Co_GuideComplete());
|
}
|
|
public override void UnInit()
|
{
|
fairyLeagueModel.onFairyLeagueBattleEvent -= CheckActivity;
|
fairyLeagueModel.OnRefreshFairyLeagueEvent -= CheckActivity;
|
PlayerDatas.Instance.fairyData.OnRefreshFairyBoss -= CheckActivity;
|
AdventureStage.Instance.onLoadAdventureStage -= OnLoadAdventureStageFinish;
|
}
|
|
IEnumerator Co_GuideComplete()
|
{
|
yield return null;
|
CheckActivity();
|
}
|
|
public void OnPlayerLoginOk()
|
{
|
CheckActivity();
|
TimeMgr.Instance.OnMinuteEvent -= CheckActivity;
|
TimeMgr.Instance.OnMinuteEvent += CheckActivity;
|
}
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
TimeMgr.Instance.OnMinuteEvent -= CheckActivity;
|
var _list = m_NotifyDict.Keys.ToList();
|
if (_list != null)
|
{
|
for (int i = 0; i < _list.Count; i++)
|
{
|
int id = _list[i];
|
m_NotifyDict[id] = false;
|
}
|
}
|
activityNotifies.Clear();
|
if (WindowCenter.Instance.IsOpen<ActivityNotifyWin>())
|
{
|
WindowCenter.Instance.Close<ActivityNotifyWin>();
|
}
|
}
|
private bool mainStage = false;
|
|
private Dictionary<int, bool> m_NotifyDict = new Dictionary<int, bool>();
|
private List<DailyQuestOpenTime> dailyQuests = new List<DailyQuestOpenTime>();
|
public List<int> activityNotifies { get; private set; }
|
|
public event Action<int> OnActivityBehaviourCloseEvent;
|
|
DailyQuestModel m_DailyQuestModel;
|
DailyQuestModel dailyQuestModel
|
{
|
get
|
{
|
return m_DailyQuestModel ?? (m_DailyQuestModel = ModelCenter.Instance.GetModel<DailyQuestModel>());
|
}
|
}
|
DungeonModel m_DungeonModel;
|
DungeonModel dungeonModel
|
{
|
get
|
{
|
return m_DungeonModel ?? (m_DungeonModel = ModelCenter.Instance.GetModel<DungeonModel>());
|
}
|
}
|
FairyLeagueModel fairyLeagueModel
|
{
|
get
|
{
|
return ModelCenter.Instance.GetModel<FairyLeagueModel>();
|
}
|
}
|
|
private void OnStageLoadFinish()
|
{
|
if (StageLoad.Instance.currentStage is DungeonStage)
|
{
|
var _mapConfig = MapConfig.Get(PlayerDatas.Instance.baseData.MapID);
|
if (_mapConfig.MapFBType == 0)
|
{
|
mainStage = true;
|
SnxxzGame.Instance.StartCoroutine(Co_StageLoad());
|
}
|
else
|
{
|
mainStage = false;
|
activityNotifies.Clear();
|
if (WindowCenter.Instance.IsOpen<ActivityNotifyWin>())
|
{
|
WindowCenter.Instance.Close<ActivityNotifyWin>();
|
}
|
}
|
}
|
else
|
{
|
ancientRandomName.Clear();
|
nameRandomIndexs.Clear();
|
}
|
}
|
|
private void OnLoadAdventureStageFinish()
|
{
|
if (AdventureStage.Instance.IsInAdventureStage)
|
{
|
mainStage = false;
|
activityNotifies.Clear();
|
if (WindowCenter.Instance.IsOpen<ActivityNotifyWin>())
|
{
|
WindowCenter.Instance.Close<ActivityNotifyWin>();
|
}
|
}
|
}
|
|
IEnumerator Co_StageLoad()
|
{
|
yield return null;
|
yield return null;
|
CheckActivity();
|
}
|
|
private void CheckActivity()
|
{
|
if (!mainStage || !(StageLoad.Instance.currentStage is DungeonStage)
|
|| AdventureStage.Instance.IsInAdventureStage)
|
{
|
return;
|
}
|
for (int i = 0; i < dailyQuests.Count; i++)
|
{
|
if (dailyQuests[i].always)
|
{
|
continue;
|
}
|
int _id = dailyQuests[i].id;
|
if (!dailyQuests[i].InOpenTime() || !dailyQuests[i].IsValidServerOpenTime())
|
{
|
m_NotifyDict[_id] = false;
|
if (OnActivityBehaviourCloseEvent != null)
|
{
|
OnActivityBehaviourCloseEvent(_id);
|
}
|
continue;
|
}
|
if (!CheckActivity(_id))
|
{
|
m_NotifyDict[_id] = false;
|
if (OnActivityBehaviourCloseEvent != null)
|
{
|
OnActivityBehaviourCloseEvent(_id);
|
}
|
continue;
|
}
|
if (!m_NotifyDict[_id] && !activityNotifies.Contains(_id))
|
{
|
activityNotifies.Add(_id);
|
}
|
}
|
|
CheckSpecialActivity();
|
|
if (activityNotifies.Count > 0)
|
{
|
NotifyActivity();
|
}
|
}
|
|
private bool CheckActivity(int type)
|
{
|
if (CheckLimit(type))
|
{
|
return false;
|
}
|
if (type == (int)DailyQuestType.FairyGrabBoss)
|
{
|
return false;
|
}
|
DailyQuestConfig cfg = DailyQuestConfig.Get(type);
|
if (cfg == null)
|
{
|
return false;
|
}
|
if (cfg.RelatedType == 2 && PlayerDatas.Instance.baseData.MapID == cfg.RelatedID)
|
{
|
return false;
|
}
|
return true;
|
}
|
|
public bool CheckLimit(int type)
|
{
|
DailyQuestConfig config = DailyQuestConfig.Get(type);
|
if (config == null)
|
{
|
return true;
|
}
|
switch ((DailyQuestType)type)
|
{
|
case DailyQuestType.FairyGrabBoss:
|
case DailyQuestType.FairyFeast:
|
{
|
if (!PlayerDatas.Instance.fairyData.HasFairy)
|
{
|
return true;
|
}
|
}
|
break;
|
case DailyQuestType.GuardSky:
|
{
|
if (!PlayerDatas.Instance.fairyData.HasFairy)
|
{
|
return true;
|
}
|
if (ModelCenter.Instance.GetModel<FairyModel>().completeGuardSky)
|
{
|
return true;
|
}
|
}
|
break;
|
case DailyQuestType.FairyLeague:
|
{
|
int _error = 0;
|
if (!fairyModel.SatisfyOpenFairyLeagueLv())
|
{
|
return true;
|
}
|
if (!fairyLeagueModel.SatisfyEnterLeague(out _error))
|
{
|
return true;
|
}
|
}
|
break;
|
case DailyQuestType.WyTaiChi:
|
{
|
if (VersionConfig.Get().isBanShu)
|
{
|
return true;
|
}
|
}
|
break;
|
case DailyQuestType.CrossServerPk:
|
{
|
bool isStatify = CrossServerOneVsOnePKSeason.Instance.isSatisfyMatch;
|
if (!isStatify)
|
{
|
return true;
|
}
|
}
|
break;
|
case DailyQuestType.AllianceBoss:
|
{
|
if (!PlayerDatas.Instance.fairyData.HasFairy)
|
{
|
return true;
|
}
|
if (allianceBossModel.isActivityOver)
|
{
|
return true;
|
}
|
}
|
break;
|
}
|
if (config.UnLockFuncID != 0)
|
{
|
if (!FuncOpen.Instance.IsFuncOpen(config.UnLockFuncID))
|
{
|
return true;
|
}
|
}
|
|
int entertimes = dailyQuestModel.GetDailyQuestCompletedTimes(type);
|
if (dailyQuestModel.GetDailyQuestTotalTimes(config.ID) <= entertimes)
|
{
|
return true;
|
}
|
return false;
|
}
|
|
private void NotifyActivity()
|
{
|
if (!WindowCenter.Instance.IsOpen<ActivityNotifyWin>())
|
{
|
if (!NewBieCenter.Instance.inGuiding)
|
{
|
WindowCenter.Instance.Open<ActivityNotifyWin>();
|
}
|
}
|
}
|
|
public void SetActivityNotifty(int _type)
|
{
|
if (m_NotifyDict.ContainsKey(_type))
|
{
|
m_NotifyDict[_type] = true;
|
}
|
}
|
|
#region 特殊活动
|
private Dictionary<int, SpecialActivityData> specialActivityDict = new Dictionary<int, SpecialActivityData>();
|
|
public bool TryGetSpecialActivityData(int _index, out SpecialActivityData _data)
|
{
|
return specialActivityDict.TryGetValue(_index, out _data);
|
}
|
|
public void CheckSpecialActivity()
|
{
|
for (int i = (int)SpecialActivity.None + 1; i < (int)SpecialActivity.max; i++)
|
{
|
var _open = CheckSpecialActivity((SpecialActivity)i);
|
if (!_open)
|
{
|
m_NotifyDict[i] = false;
|
if (OnActivityBehaviourCloseEvent != null)
|
{
|
OnActivityBehaviourCloseEvent(i);
|
}
|
}
|
else
|
{
|
if (!m_NotifyDict[i] && !activityNotifies.Contains(i))
|
{
|
activityNotifies.Add(i);
|
}
|
}
|
}
|
}
|
|
private bool CheckSpecialActivity(SpecialActivity _type)
|
{
|
switch (_type)
|
{
|
case SpecialActivity.FairyBoss:
|
return ModelCenter.Instance.GetModel<FairyBossModel>().IsFairyBossOpen();
|
}
|
return false;
|
}
|
|
public enum SpecialActivity
|
{
|
None = 1000,
|
FairyBoss,
|
max = 1002,
|
}
|
|
public struct SpecialActivityData
|
{
|
public string Title;
|
public string Icon;
|
}
|
#endregion
|
|
Dictionary<int, Dictionary<int, string>> ancientRandomName = new Dictionary<int, Dictionary<int, string>>();
|
List<int> nameRandomIndexs = new List<int>();
|
public string GetAncientRobotName(int objId, int npcId)
|
{
|
if (ancientRandomName.ContainsKey(objId)
|
&& ancientRandomName[objId].ContainsKey(npcId))
|
{
|
return ancientRandomName[objId][npcId];
|
}
|
var configs = AncientRobotNameConfig.GetValues();
|
if (nameRandomIndexs.Count == 0)
|
{
|
for (int i = 0; i < configs.Count; i++)
|
{
|
nameRandomIndexs.Add(configs[i].id);
|
}
|
}
|
var index = UnityEngine.Random.Range(0, nameRandomIndexs.Count);
|
var name = AncientRobotNameConfig.Get(nameRandomIndexs[index]).Name;
|
nameRandomIndexs.RemoveAt(index);
|
Dictionary<int, string> dict;
|
if (!ancientRandomName.ContainsKey(objId))
|
{
|
dict = new Dictionary<int, string>();
|
dict.Add(npcId, name);
|
ancientRandomName.Add(objId, dict);
|
}
|
else
|
{
|
ancientRandomName[objId].Add(npcId, name);
|
}
|
return name;
|
}
|
}
|
}
|
|