You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

681 lines
27 KiB

using System;
using System.Collections.Generic;
using ProtoCSStruct;
using Sog;
namespace Game
{
public static class TaskEXEvent
{
//忽略的类型
public static List<QuestType> FilterType = new List<QuestType>()
{
QuestType.HandBook,
QuestType.AdventurePass,
};
// 这里只管任务进度更新
// 直接检查进度集合
private static Action<PlayerOnGame>[] m_mthType_mth_list = new Action<PlayerOnGame>[((int)QuestMethod.Size)];
// 此处只注册需要刚开启就能刷新进度的任务 顺序严格按照TaskEXCompleteMethod来
public static void RegisterAllInitAbleTaskHandle()
{
m_mthType_mth_list[(int)QuestMethod.None] = TriggerNoCondition;
m_mthType_mth_list[(int)QuestMethod.PassChapterN] = null;
m_mthType_mth_list[(int)QuestMethod.Over_adventure] = PassChapterBattle;
m_mthType_mth_list[(int)QuestMethod.Knight_upgrade] = ToLevelUp;
m_mthType_mth_list[(int)QuestMethod.Pay] = TriggerPay;
m_mthType_mth_list[(int)QuestMethod.Login] = null;
m_mthType_mth_list[(int)QuestMethod.LoginY] = TriggerProcessLoginDay;
m_mthType_mth_list[(int)QuestMethod.WearQualityGemN] = TriggerProcessWearQualityGem;
m_mthType_mth_list[(int)QuestMethod.CostPowerY] = TriggerCostPowerY;
}
public static void InitAndUpdateAllCondition(PlayerOnGame player)
{
for (int i = 0; i < m_mthType_mth_list.Length; i++)
{
if (null != m_mthType_mth_list[i])
{
m_mthType_mth_list[i](player);
}
}
}
public static void InitSingleCondition(int mth, PlayerOnGame player, int index)
{
if (mth < (int)QuestMethod.None)
{
return;
}
if (null != m_mthType_mth_list[mth])
{
m_mthType_mth_list[mth](player);
}
// 登录需要特殊处理
if (mth == (int)QuestMethod.Login)
{
ref var task = ref TaskEXSvc.GetTaskByIndex(player, index);
task.Condition[0].CurrVal += 1;
task.Condition[1].CurrVal = (int)GameServerUtils.GetTimeSecond();
var taskDesc = QuestEXDescMgr.Instance.GetConfig(task.TaskId);
if (task.Condition[0].CurrVal >= taskDesc.fulfill[0].Condition[0])
{
task.Condition[0].Done = true;
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
player.MakeDirty();
}
}
public static void TiggerPlayerBornEvent(PlayerOnGame player)
{
player.Trace("TaskEXEvent.TiggerPlayerBornEvent player {0} dataSeq {1}"
, player.UserID, player.DataSeq);
// init finish task
int nVal = 0;
for (int i = player.RoleData.TaskEXData.FinishTaskList.Count; i < player.RoleData.TaskEXData.FinishTaskList.GetMaxCount(); i++)
{
player.RoleData.TaskEXData.FinishTaskList.Add(ref nVal);
}
SortedList<int, QuestEXDesc> list = QuestEXDescMgr.Instance.ItemTable;
for (int i = 0; i < list.Values.Count; i++)
{
//新生玩家领取任务对部分任务进行过滤
if (FilterType.IndexOf(list.Values[i].questType) != -1) continue;
TaskEXSvc.ProcessAcceptTask(player, list.Values[i].questId, false, out int index);
}
}
public static void TiggerNewDayStart(PlayerOnGame player, bool bNotifyClient)
{
player.Trace("TaskEXEvent.TiggerNewDayStart player {0}", player.UserID);
TaskEXSvc.RefreshTaskStatus(player);
TriggerLoginTimes(player);
TriggerProcessLoginDay(player);
TriggerPay(player);
TriggerPlayerLogin(player);
TriggerProcessLoginDay(player);
}
public static void TriggerPlayerLogin(PlayerOnGame player)
{
TaskEXSvc.TryAcceptNewNoPreTask(player);
InitAndUpdateAllCondition(player);
TriggerLoginTimes(player);
TriggerProcessLoginDay(player);
}
// 这种处理方式可以把方法内部的desc 拿到调用方法的地方使用
public static void Process(QuestMethod mth, PlayerOnGame player, Func<DBTaskEXOne, QuestEXDesc, bool> commonJudge = null, Func<QuestEXDesc, int, int, bool> update = null)
{
CSTaskEXChangeNotify chgNotify = new CSTaskEXChangeNotify();
ref var playerTask = ref player.RoleData.TaskEXData.TaskList;
for (int i = playerTask.Count - 1; i >= 0; i--)
{
var taskDesc = QuestEXDescMgr.Instance.GetConfig(playerTask[i].TaskId);
if (taskDesc == null)
continue;
if (commonJudge != null && !commonJudge(playerTask[i], taskDesc))
continue;
bool bMakeDirty = false;
for (int k = 0; k < taskDesc.fulfill.Length; k++)
{
// 只处理类型对应的
if (taskDesc.fulfill[k].Method == mth)
{
if (playerTask[i].Condition[k].CurrVal >= taskDesc.fulfill[k].Condition[^1] || playerTask[i].Condition[k].Done)
{
continue;
}
if (update != null)
{
bMakeDirty = update(taskDesc, i, k);
}
}
}
if (bMakeDirty)
chgNotify.ChgTaskList.Add(ref playerTask[i]);
}
if (chgNotify.ChgTaskList.GetCount() > 0)
{
player.SendToClient((int)CSGameMsgID.TaskexChangeNotify, ref chgNotify);
}
}
//新获得多少个宝石
public static void TriggerGetGem(PlayerOnGame player, int gemNum = 1)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.GetGemN, player, gemNum);
}
//累计消耗体力
public static void TriggerPowerCost(PlayerOnGame player, int cost)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.CostPowerN, player, cost);
}
//签到
public static void TriggerGetSignRwdN(PlayerOnGame player)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.GetSignRwdN, player);
}
//兑换商店兑换次数
public static void TriggerMarkShopEquip(PlayerOnGame player)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.ShopChangeBuyN, player);
}
//速通奖励领取次数
public static void TriggerGetStageRwdN(PlayerOnGame player)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.GetStageRwdN, player);
}
public static void GetQualityEquipN(PlayerOnGame player,CommonQuality quality)
{
Process(QuestMethod.GetQualityEquipN, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
if ((int)quality == desc.fulfill[idx].Condition[0] && (!AppTime.IsSameDay(task.PickupTime, GameServerUtils.GetTimeSecond()) || task.Condition[idx].CurrVal == 0))
{
task.Condition[idx].CurrVal += 1;
task.PickupTime = (int)GameServerUtils.GetTimeSecond();
}
else if ((int)quality == desc.fulfill[idx].Condition[0])
{
task.Condition[idx].CurrVal += 1;
}
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[1])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[1];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[1];
player.MakeDirty();
return true;
});
}
public static void TriggerCostPowerY(PlayerOnGame player)
{
Process(QuestMethod.CostPowerY, player, null, (desc, index, idx) =>
{
var value = player.RoleData.PowerPointData.CostPower;
ref var task = ref player.RoleData.TaskEXData.TaskList[index];
if ((!AppTime.IsSameDay(task.PickupTime, GameServerUtils.GetTimeSecond()) ||
task.Condition[idx].CurrVal == 0))
{
task.Condition[idx].CurrVal = value;
task.PickupTime = (int)GameServerUtils.GetTimeSecond();
}
else
{
task.Condition[idx].CurrVal = value;
}
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[0];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0];
player.MakeDirty();
return true;
});
}
public static void TriggerContBttlTimesN(PlayerOnGame player)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.ContBttlTimesN, player, 1);
}
public static void TriggerBreakEquipN(PlayerOnGame player,int num)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.BreakEquipN, player, num);
}
public static void TriggerGemDrawN(PlayerOnGame player,int num)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.GemDrawN, player, num);
}
public static void TriggerWatchAdsN(PlayerOnGame player,int num)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.WatchAdsN, player, num);
}
public static void TriggerCostDiamondN(PlayerOnGame player,int num)
{
ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.CostDiamondN, player, num);
}
public static void TriggerBuyShopGoodsN(PlayerOnGame player,int shopId,int num)
{
Process(QuestMethod.BuyShopGoodsN, player, null, (desc, index, idx) =>
{
if(desc.fulfill[idx].Condition[0] != shopId)
{
return false;
}
ref var task = ref player.RoleData.TaskEXData.TaskList[index];
if ((!AppTime.IsSameDay(task.PickupTime, GameServerUtils.GetTimeSecond()) ||
task.Condition[idx].CurrVal == 0))
{
task.Condition[idx].CurrVal = num;
task.PickupTime = (int)GameServerUtils.GetTimeSecond();
}
else
{
task.Condition[idx].CurrVal += num;
}
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[1])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[1];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[1];
player.MakeDirty();
return true;
});
}
// 触发进度加一
public static void ProcessTriggerPlayerEventCurrentValAdd(QuestMethod mth, PlayerOnGame player, int num = 1)
{
Process(mth, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
task.Condition[idx].CurrVal += num;
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[0];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0];
player.MakeDirty();
return true;
});
}
// 直接完成的任务类型 这里condition_type检查放松
public static void ProcessTriggerPlayerEventDirectFinish(QuestMethod mth, PlayerOnGame player)
{
Process(mth, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[0];
task.Condition[idx].Done = true;
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
player.MakeDirty();
return true;
});
}
// 直接检查玩家当前状态值
public static void ProcessCheckPlayerCurrentValue(QuestMethod mth, PlayerOnGame player, long moduleValue = 0)
{
Process(mth, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
if (moduleValue >= desc.fulfill[idx].Condition[0])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[0];
task.Condition[idx].Done = true;
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
else
{
task.Condition[idx].CurrVal = (int)moduleValue;
task.Condition[idx].Done = false;
}
player.MakeDirty();
return true;
});
}
public static void ProcessCheckNotifyClient(int taskId, PlayerOnGame player)
{
ref var tasks = ref player.RoleData.TaskEXData.TaskList;
var local = -1;
for (var i = 0; i < tasks.Count; i++)
{
if (tasks[i].TaskId == taskId)
{
local = i;
break;
}
}
if (local == -1)
{
TraceLog.Error("TaskEXEvent.ProcessCheckNotifyClient player:{0} taskid:{1}!", player.UserID, taskId);
return;
}
CSTaskEXChangeNotify chgNotify = new CSTaskEXChangeNotify();
chgNotify.ChgTaskList.Add(ref player.RoleData.TaskEXData.TaskList[local]);
player.SendToClient((int)CSGameMsgID.TaskexChangeNotify, ref chgNotify);
}
public static void NotifyClientNoneDoth(int taskId, PlayerOnGame player)
{
ref var tasks = ref player.RoleData.TaskEXData.TaskList;
var local = -1;
for (var i = 0; i < tasks.Count; i++)
{
if (tasks[i].TaskId == taskId)
{
local = i;
break;
}
}
if (local == -1)
{
TraceLog.Error("TaskEXEvent.ProcessCheckNotifyClient player:{0} taskid:{1}!", player.UserID, taskId);
return;
}
var desc = QuestEXDescMgr.Instance.GetConfig(taskId);
if (null != m_mthType_mth_list[(int)desc.fulfill[0].Method])
{
return;
}
var chgNotify = new CSTaskEXChangeNotify();
chgNotify.ChgTaskList.Add(ref player.RoleData.TaskEXData.TaskList[local]);
player.SendToClient((int)CSGameMsgID.TaskexChangeNotify, ref chgNotify);
}
public static void TriggerNoCondition(PlayerOnGame player)
{
ProcessTriggerPlayerEventDirectFinish(QuestMethod.None, player);
}
public static void TriggerPay(PlayerOnGame player)
{
var value = player.RoleData.PayData.TodayPayDiamond;
Process(QuestMethod.Pay, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
if (!AppTime.IsSameDay(task.PickupTime, GameServerUtils.GetTimeSecond()) ||
task.Condition[idx].CurrVal == 0)
{
task.Condition[idx].CurrVal = (int)value;
task.PickupTime = (int)GameServerUtils.GetTimeSecond();
}
else
{
task.Condition[idx].CurrVal += (int)value;
}
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[0];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0];
player.MakeDirty();
return true;
});
}
public static void PassChapterBattle(PlayerOnGame player)
{
var value = player.RoleData.ChapterData.BattleId;
Process(QuestMethod.Over_adventure, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
if (value >= desc.fulfill[idx].Condition[0] && (!AppTime.IsSameDay(task.PickupTime, GameServerUtils.GetTimeSecond()) || task.Condition[idx].CurrVal == 0))
{
task.Condition[idx].CurrVal += 1;
task.PickupTime = (int)GameServerUtils.GetTimeSecond();
}
if (value >= desc.fulfill[idx].Condition[0])
{
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = value >= desc.fulfill[idx].Condition[0];
player.MakeDirty();
return true;
});
}
public static void ToLevelUp(PlayerOnGame player)
{
var level = player.RoleData.Knight.DbHero.Level;
Process(QuestMethod.Knight_upgrade, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
task.Condition[idx].CurrVal = level;
task.Condition[idx].CurrVal = (int)Math.Min(task.Condition[idx].CurrVal, desc.fulfill[idx].Condition[0]);
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0])
{
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = level >= desc.fulfill[idx].Condition[0];
player.MakeDirty();
return true;
});
}
public static void TriggerChapterBattle(PlayerOnGame player,int battleId)
{
Process(QuestMethod.PassChapterN, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
if (battleId == desc.fulfill[idx].Condition[0] &&
(!AppTime.IsSameDay(task.PickupTime, GameServerUtils.GetTimeSecond()) ||
task.Condition[idx].CurrVal == 0))
{
task.Condition[idx].CurrVal += 1;
task.PickupTime = (int)GameServerUtils.GetTimeSecond();
}
else if (battleId == desc.fulfill[idx].Condition[0])
{
task.Condition[idx].CurrVal += 1;
}
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[1])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[1];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[1];
player.MakeDirty();
return true;
});
}
public static void TriggerPaySuccess(PlayerOnGame player, int itemId, uint payDiamond, uint addDiamond, uint money, bool isPlayerFirstPay, long payTime3rd, ref CSPayGoogleSuccessRes csRes)
{
TriggerPay(player);
TriggerProcessPayMoney(player, itemId);
}
public static void TriggerLoginTimes(PlayerOnGame player)
{
//ProcessTriggerPlayerEventCurrentValAdd(TaskEXCompleteMethod.Login, player);
Process(QuestMethod.Login, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
if (task.Condition[idx + 1].CurrVal == 0)
{
task.Condition[idx + 1].CurrVal = (int)GameServerUtils.GetTimeSecond();
}
if (!AppTime.IsSameDay(task.Condition[idx + 1].CurrVal, GameServerUtils.GetTimeSecond()))
{
task.Condition[idx].CurrVal += 1;
task.Condition[idx + 1].CurrVal = (int)GameServerUtils.GetTimeSecond();
}
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[0];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0];
player.MakeDirty();
return true;
});
}
public static void TriggerProcessPayMoney(PlayerOnGame player, int itemId)
{
var desc = PayDiamondDescMgr.Instance.GetConfig(itemId);
var num = 0;
if (desc != null)
{
num = (int)desc.currencyRes;
}
// ProcessTriggerPlayerEventCurrentValAdd(QuestMethod.PayNum, player, num);
}
public static void TriggerProcessLoginDay(PlayerOnGame player)
{
Process(QuestMethod.LoginY, player, null, (desc, index, idx) =>
{
ref DBTaskEXOne task = ref player.RoleData.TaskEXData.TaskList[index];
if (task.Condition[idx + 1].CurrVal == 0)
{
task.Condition[idx + 1].CurrVal = (int)GameServerUtils.GetTimeSecond();
var value = (int)StatisticsOp.GetIDTotal(player, (int)CSRoleStatisticsID.LoginDay);
if (value == 0)
{
value = 1;
}
task.Condition[idx].CurrVal += value;
}
if (!AppTime.IsSameDay(task.Condition[idx + 1].CurrVal, GameServerUtils.GetTimeSecond()))
{
task.Condition[idx].CurrVal += 1;
task.Condition[idx + 1].CurrVal = (int)GameServerUtils.GetTimeSecond();
}
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[0];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[0];
player.MakeDirty();
return true;
});
}
public static void TriggerProcessWearQualityGem(PlayerOnGame player)
{
Process(QuestMethod.WearQualityGemN, player, null, (desc, index, idx) =>
{
var gem = player.RoleData.Knight.DbHero.WearGem;
var quality = desc.fulfill[idx].Condition[0];
var qn = 0;
for (var i = 0; i < gem.Count; i++)
{
if (gem[i].Quality >= quality)
{
qn++;
}
}
ref var task = ref player.RoleData.TaskEXData.TaskList[index];
if (qn >= desc.fulfill[idx].Condition[1] &&
(!AppTime.IsSameDay(task.PickupTime, GameServerUtils.GetTimeSecond()) ||
task.Condition[idx].CurrVal == 0))
{
task.Condition[idx].CurrVal = qn;
task.PickupTime = (int)GameServerUtils.GetTimeSecond();
}
else
{
task.Condition[idx].CurrVal = Math.Max(qn, task.Condition[idx].CurrVal);
}
if (task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[1])
{
task.Condition[idx].CurrVal = (int)desc.fulfill[idx].Condition[1];
if (task.Status == (int)TaskEXCfg.TaskStatusProcessing)
{
task.Status = (int)TaskEXCfg.TaskStatusComplete;
}
}
task.Condition[idx].Done = task.Condition[idx].CurrVal >= desc.fulfill[idx].Condition[1];
player.MakeDirty();
return true;
});
}
public static void OnReloadConfig(string excelConfigFile)
{
TaskEXSvc.TaskUpdateDict.Clear();
TaskEXSvc.NoPreviewTaskId.Clear();
var questList = QuestEXDescMgr.Instance.ItemTable;
}
}
}