2025-05-18 01:04:31 +08:00

965 lines
30 KiB
C#

// ***********************************************************************
// Assembly : Unity
// Author : Kimch
// Created : 2017-10-24
//
// Last Modified By : Kimch
// Last Modified On :
// ***********************************************************************
// <copyright file= "MissionProxy" company=""></copyright>
// <summary></summary>
// ***********************************************************************
using System.Collections;
using System.Collections.Generic;
namespace G
{
/// <summary>
///
/// </summary>
partial class MissionProxy : F.GameProxy
{
#region FIELD
private readonly Dictionary<int, Mission> _missions = new Dictionary<int, Mission>();
private readonly Dictionary<int, List<Mission>> _eventMissions = new Dictionary<int, List<Mission>>();
private readonly List<Mission> _achievementMissions = new List<Mission>();
private readonly List<Mission> _dailyMissions = new List<Mission>();
private readonly List<Mission> _weeklyMissions = new List<Mission>();
private Mission _mainMission;
private readonly List<Mission> _mainMissions = new List<Mission>();
private bool _eventChanged;
#endregion
#region PROPERTY
public override int priority => 998;
/// <summary>
/// 日常任务
/// </summary>
public IReadOnlyList<Mission> dailyMissions
{
get
{
//if (_dailyMissions.Count == 0)
//{
// foreach (var mission in _missions)
// {
// if (mission.Value.type == 1)
// {
// _dailyMissions.Add(mission.Value);
// }
// }
//}
CheckMission();
_dailyMissions.Sort();
return _dailyMissions;
}
}
/// <summary>
/// 每周任务
/// </summary>
public IReadOnlyList<Mission> weeklyMissions
{
get
{
//if (_weeklyMissions.Count == 0)
//{
// foreach (var mission in _missions)
// {
// if (mission.Value.type == 5)
// {
// _weeklyMissions.Add(mission.Value);
// }
// }
//}
CheckMission();
_weeklyMissions.Sort();
return _weeklyMissions;
}
}
/// <summary>
/// 成就
/// </summary>
public IReadOnlyList<Mission> achievements
{
get
{
//if (_achievementMissions.Count == 0)
//{
// LoadMission();
// foreach (var mission in _missions)
// {
// if (mission.Value.type == 2)
// {
// _achievementMissions.Add(mission.Value);
// }
// }
//}
_achievementMissions.Sort();
return _achievementMissions;
}
}
/// <summary>
/// 主线任务
/// </summary>
public Mission mainMission
{
get
{
//if (_mainMissions.Count == 0)
//{
// LoadMission();
// foreach (var mission in _missions)
// {
// if (mission.Value.type == 3)
// {
// _mainMissions.Add(mission.Value);
// var prev = mission.Value.prevMission;
// if (prev != null)
// {
// prev.nextMission = mission.Value;
// }
// }
// }
// _mainMission = _mainMissions[0];
//}
while (_mainMission != null && _mainMission.isRewarded)
{
_mainMission = _mainMission.nextMission;
}
return _mainMission;
}
}
#endregion
#region METHOD
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Mission GetMission(int id)
{
Mission result = null;
if (id > 0)
_missions.TryGetValue(id, out result);
return result;
}
/// <summary>
/// 是否完成的任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool IsCompletedMission(int id)
{
var mission = GetMission(id);
return mission != null ? mission.isCompleted : false;
}
/// <summary>
///
/// </summary>
public void CheckMission()
{
CheckWeekMission();
CheckDailyMission();
}
/// <summary>
///
/// </summary>
private void CheckDailyMission()
{
//if (_dailyMissions.Count > 0 && TimeProxy.Instance.TryTimeKey(TimeProxy.每日任务))
//{
// foreach (var mission in _dailyMissions)
// {
// mission.Reset();
// }
// OnEvent(MissionProxy.每日累计登录次数);
// SaveLocal();
//}
if (TimeProxy.Instance.TryTimeKey(TimeProxy.))
{
foreach (var mission in _missions.Values)
{
if (mission.item.reset == 1)
mission.Reset();
}
OnEvent(MissionProxy.);
SaveLocal();
}
}
private void CheckWeekMission()
{
//if (_weeklyMissions.Count > 0 && TimeProxy.Instance.TryTimeKey(TimeProxy.每周任务))
//{
// foreach (var mission in _weeklyMissions)
// {
// mission.Reset();
// }
// SaveLocal();
//}
if (TimeProxy.Instance.TryTimeKey(TimeProxy.))
{
foreach (var mission in _missions.Values)
{
if (mission.item.reset == 2)
mission.Reset();
}
SaveLocal();
}
}
/// <summary>
/// 月清
/// </summary>
private void CheckMonthMission()
{
//if (TimeProxy.Instance.TryTimeKey(TimeProxy.每周任务))
//{
// foreach (var mission in _missions.Values)
// {
// if (mission.item.reset == 3)
// mission.Reset();
// }
// SaveLocal();
//}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public bool JumpMission(Mission mission)
{
#if !UNITY_WEBGL && (UNITY_EDITOR || DEBUG_MY)
if (KGMOptions.Instance.)
{
mission.curValue = mission.maxValue;
return true;
}
#endif
switch (mission.eventId)
{
case :
case ://
case X:
case : //
case ://
case 使:
{
var level = ItemProxy.Instance.GetStaticItem<ItemLevel>(LevelProxy.Instance.currentUnlockedLevel);
if (level != null)
KUIWindow.OpenWindow<UI.LevelDetailBox>(level);
}
break;
case _数量:
case 穿_等级_品质_数量:
case _数量:
case :
case _次数:
PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, null, "3");
break;
case :
case :
case :
PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, null, "4");
break;
case :
PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, null, "0");
break;
case :
PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, null, "1");
break;
case :
case X次:
case X次:
case X:
case X技能达到X级:
case X次:
//PostNotification(GlobalDefine.EVENT_MAIN_WINDOW_PAGE, 0, "");
KUIWindow.OpenWindow<UI.BusinessWindow>();
break;
case X次:
case X级:
case X次:
KUIWindow.OpenWindow<UI.SwordWindow>();
break;
case :
var missionType = mission.eventArg1;
if (missionType == 1 || missionType == 2)
KUIWindow.OpenWindow<UI.MissionWindow>(missionType == 1 ? UI.MissionWindow.DAILY_PANEL : UI.MissionWindow.ACHIEVEMENT_PANEL);
break;
case :
KUIWindow.OpenWindow<UI.PetWindow>();
break;
}
return true;
}
/// <summary>
/// 领取奖励
/// </summary>
/// <param name="id"></param>
/// <param name="callback"></param>
public void GainReward(int id, Callback2 callback)
{
if (AntiCheatProxy.Instance.isCheat)
{
callback?.Invoke(ErrorCode.TIME_CHEAT, "请检查手机时间");
return;
}
var mission = GetMission(id);
if (mission.isRewarding)
{
mission.isRewarded = true;
RewardProxy.Instance.GetRewardsWithUI(mission.rewards, (error, message) =>
{
if (error ==0)
{
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
}
});
OnEvent(, 1, mission.item.type);
OnEvent(, 1, mission.id);
_eventChanged = true;
OnMissionRewarded();
//SaveLocal();
//PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
callback?.Invoke(0, "");
}
else
{
callback?.Invoke(1, "");
}
}
/// <summary>
/// 一键
/// </summary>
/// <param name="type">1,2,3</param>
public void OneKeyGainRewards(int type, Callback2 callback)
{
if (AntiCheatProxy.Instance.isCheat)
{
callback?.Invoke(ErrorCode.TIME_CHEAT, "请检查手机时间");
return;
}
var rewards = F.ListPool<Item.ItemInfo>.Get();
int compC = 0;
if (type == 1)
{
foreach (var item in _dailyMissions)
{
if (item.isRewarding)
{
compC += 1;
item.isRewarded = true;
rewards.AddRange(item.rewards);
OnEvent(, 1, item.id);
}
}
}
else if (type == 2)
{
foreach (var item in _achievementMissions)
{
if (item.isRewarding)
{
compC += 1;
item.isRewarded = true;
rewards.AddRange(item.rewards);
OnEvent(, 1, item.id);
}
}
}
else if (type == 5)
{
foreach (var item in _weeklyMissions)
{
if (item.isRewarding)
{
compC += 1;
item.isRewarded = true;
rewards.AddRange(item.rewards);
OnEvent(, 1, item.id);
}
}
}
if (compC > 0)
{
OnEvent(, compC, type);
RewardProxy.Instance.GetRewardsWithUI(rewards, (error, message) =>
{
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
});
_eventChanged = true;
OnMissionRewarded();
callback?.Invoke(0, "");
//SaveLocal();
//PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
callback?.Invoke(1, "");
PostNotification(GlobalDefine.EVENT_SHOW_TOAST, "暂无可领取的奖励");
}
F.ListPool<Item.ItemInfo>.Release(rewards);
}
public void OnMissionCompleted(Mission mission)
{
#if UNITY_EDITOR
UnityEngine.Debug.Log(StringLoggingExtensions.Colored($"{mission.id} 任务完成", Colors.fuchsia));
#endif
PostNotification(GlobalDefine.EVENT_MISSION_COMPLETED, mission);
KStatistics.Instance.ReportEvent_Mission(mission.item.type.ToString(), mission.id, mission.name, mission.description, 1, mission.rewardText);
}
private void OnMissionRewarded()
{
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public int GetRedPointDay()
{
if (_dailyMissions != null)
{
CheckMission();
for (int i = 0; i < _dailyMissions.Count; i++)
{
if (_dailyMissions[i].isRewarding)
{
return 1;
}
}
}
return 0;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public int GetRedPointAch()
{
if (_achievementMissions != null)
for (int i = 0; i < _achievementMissions.Count; i++)
{
if (_achievementMissions[i].isRewarding)
{
return 1;
}
}
return 0;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public int GetRedPointWeek()
{
if (_weeklyMissions != null)
for (int i = 0; i < _weeklyMissions.Count; i++)
{
if (_weeklyMissions[i].isRewarding)
{
return 1;
}
}
return 0;
}
private const string MISSION_KEY_V1 = "missions";
private void LoadLocal()
{
var dataList = ArchiveProxy.Instance.GetIntList(MISSION_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
int index = 0;
Label:
var id = dataList[index++];
int data = dataList[index++];
if (_missions.TryGetValue(id, out Mission mission))
{
mission.Set(data);
}
if (index < dataList.Count)
goto Label;
}
}
private void SaveLocal()
{
var dataList = ArchiveProxy.Instance.GetIntList(MISSION_KEY_V1);
if (dataList != null)
{
dataList.Clear();
foreach (var mission in _missions.Values)
{
if (mission.curValue > 0)
{
dataList.Add(mission.id);
dataList.Add(mission.Get());
}
}
ArchiveProxy.Instance.SetIntList(MISSION_KEY_V1, dataList);
}
}
private void LoadMission()
{
if (_missions.Count == 0)
{
var missionItems = ItemProxy.Instance.GetStaticItems<ItemMission>();
foreach (var item in missionItems)
{
_missions.Add(item.id, new Mission(item));
}
foreach (var mission in _missions.Values)
{
if (_eventMissions.TryGetValue(mission.eventId, out var missions))
{
missions.Add(mission);
}
else
{
missions = new List<Mission>
{
mission
};
_eventMissions.Add(mission.eventId, missions);
}
switch (mission.item.type)
{
case 1:
_dailyMissions.Add(mission);
break;
case 2:
_achievementMissions.Add(mission);
break;
case 3:
_mainMissions.Add(mission);
var prev = mission.prevMission;
if (prev != null)
{
prev.nextMission = mission;
}
break;
case 5:
_weeklyMissions.Add(mission);
break;
}
}
if (_mainMissions.Count > 0)
_mainMission = _mainMissions[0];
}
else
{
foreach (var mission in _missions.Values)
{
mission.Reset();
}
if (_mainMissions.Count > 0)
_mainMission = _mainMissions[0];
}
}
private void SyncMission()
{
}
/// <summary>
/// 累加事件1
/// </summary>
/// <param name="eventId"></param>
public void OnEvent(int eventId, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid)
{
mission.curValue += 1;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
/// <summary>
/// 累加事件1
/// </summary>
/// <param name="eventId"></param>
/// <param name="eventTarget"></param>
public void OnEvent(int eventId, int eventTarget, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid)
{
mission.curValue += eventTarget;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
/// <summary>
/// 累加事件1
/// </summary>
/// <param name="eventId"></param>
/// <param name="eventTarget"></param>
/// <param name="eventArg1"></param>
public void OnEvent(int eventId, int eventTarget, int eventArg1, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid && mission.CheckEventArg1(eventArg1))
{
mission.curValue += eventTarget;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
/// <summary>
/// 累加事件1
/// </summary>
/// <param name="eventId"></param>
/// <param name="eventTarget"></param>
/// <param name="eventArg1"></param>
/// <param name="eventArg2"></param>
public void OnEvent(int eventId, int eventTarget, int eventArg1, int eventArg2, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid && mission.CheckEventArg2(eventArg1, eventArg2))
{
mission.curValue += eventTarget;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
/// <summary>
/// 达到事件
/// </summary>
/// <param name="eventId"></param>
/// <param name="eventTarget"></param>
public void OnEvent2(int eventId, int eventTarget, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid /*&& mission.maxValue <= eventTarget*/)
{
mission.curValue = eventTarget;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
/// <summary>
/// 达到事件
/// </summary>
/// <param name="eventId"></param>
/// <param name="eventTarget"></param>
public void OnClampEvent2(int eventId, int eventTarget, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid && mission.maxValue <= eventTarget)
{
mission.curValue = eventTarget;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
/// <summary>
/// 达到事件
/// </summary>
/// <param name="eventId"></param>
/// <param name="eventTarget"></param>
public void OnEvent2(int eventId, int eventTarget, int eventArg1, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid && mission.CheckEventArg1(eventArg1) && mission.curValue < eventTarget)
{
mission.curValue = eventTarget;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
/// <summary>
/// 达到事件
/// </summary>
/// <param name="eventId"></param>
/// <param name="eventTarget"></param>
/// <param name="eventArg1"></param>
/// <param name="eventArg2"></param>
public void OnEvent2(int eventId, int eventTarget, int eventArg1, int eventArg2, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid && mission.CheckEventArg2(eventArg1, eventArg2) && mission.curValue < eventTarget)
{
mission.curValue = eventTarget;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
/// <summary>
/// 累计over事件
/// </summary>
/// <param name="eventId"></param>
/// <param name="eventTarget"></param>
/// <param name="eventArg1"></param>
/// <param name="eventArg2"></param>
/// <param name="immediately"></param>
public void OnOverEvent(int eventId, int eventTarget, int eventArg1, int eventArg2, bool immediately = false)
{
if (_eventMissions.TryGetValue(eventId, out var missions))
{
bool flag = false;
foreach (var mission in missions)
{
if (mission.isValid && mission.OverEventArg2(eventArg1, eventArg2))
{
mission.curValue += eventTarget;
flag = true;
}
}
if (flag)
{
if (immediately)
{
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
else
{
_eventChanged = true;
}
}
}
}
#endregion
#region Unity
private void Awake()
{
Instance = this;
}
private void LateUpdate()
{
if (_eventChanged)
{
_eventChanged = false;
SaveLocal();
PostNotification(GlobalDefine.EVENT_MISSION_CHANGED);
}
}
public override void ReadArchive()
{
LoadMission();
LoadLocal();
SyncMission();
}
public override void OnRegister()
{
}
public override void OnRemove()
{
}
#endregion
#region STATIC
public static MissionProxy Instance;
#endregion
}
}