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.
 
 
 
 
 
 

473 lines
15 KiB

using System.Collections.Generic;
using ProtoCSStruct;
using Sog;
namespace Game
{
public class HandBookAct : AbstractActivity
{
public override void OnRoleEnter(PlayerOnGame player)
{
CheckNewQuest(player);
}
protected override void OnStateChange(PlayerOnGame player, int actId, ActivityState state)
{
switch (state)
{
case ActivityState.InProgress:
Init(player, actId);
break;
case ActivityState.GameplayEnded:
case ActivityState.ActivityEnded:
OnEnd(player, actId);
break;
}
}
protected override void OnTickCheck(PlayerOnGame player)
{
ref var handBookData = ref player.RoleData.ActExtraInfo.HandBookData;
for (var i = 0; i < handBookData.Count; i++)
{
var actId = handBookData[i].ActId;
var state = ActivitySvc.GetActivityState(player, actId);
if (state == ActivityState.InProgress)
{
CheckState(player, ref handBookData[i]);
}
}
}
private static void Init(PlayerOnGame player, int actId)
{
ref var handBookData = ref player.RoleData.ActExtraInfo.HandBookData;
var index = -1;
for (var i = 0; i < handBookData.Count; i++)
{
if (handBookData[i].ActId != actId) continue;
index = i;
break;
}
if (index > -1)
{
CheckState(player, ref handBookData[index]);
return;
}
handBookData.Add(new HandBookData() { ActId = actId, Stage = 1 });
AddQuest(player, actId, 1);
player.MakeDirty();
SyncData(player);
}
private static void CheckNewQuest(PlayerOnGame player)
{
ref var handBookData = ref player.RoleData.ActExtraInfo.HandBookData;
for (var i = 0; i < handBookData.Count; i++)
{
var actId = handBookData[i].ActId;
var state = ActivitySvc.GetActivityState(player, actId);
if (state != ActivityState.InProgress)
{
continue;
}
var group = ActivityDescMgr.Instance.GetConfig(actId).subType;
if (group == 0)
{
continue;
}
var handBookDesc = HandBookDescMgr.Instance.GetConfig(group, handBookData[i].Stage);
var questList = handBookDesc.questList;
foreach (var questId in questList)
{
var accept = TaskEXSvc.IsAcceptEdTask(player, questId);
if (!accept)
{
var ret = TaskEXSvc.ProcessAcceptTask(player, questId, true, out var index);
if (ret == CSErrCode.None)
{
TaskEXEvent.NotifyClientNoneDoth(questId, player);
}
}
}
}
}
//检测当前进度的所有任务是否完成
private static void CheckState(PlayerOnGame player, ref HandBookData data)
{
var group = ActivityDescMgr.Instance.GetConfig(data.ActId).subType;
if (group == 0)
{
return;
}
var handBookDesc = HandBookDescMgr.Instance.GetConfig(group, data.Stage);
if (handBookDesc == null)
{
return;
}
if (handBookDesc.nextStage == 0)
{
return;
}
var nextHandBookDesc = HandBookDescMgr.Instance.GetConfig(group, handBookDesc.nextStage);
if (nextHandBookDesc == null)
{
return;
}
var questList = handBookDesc.questList;
var complete = true;
foreach (var questId in questList)
{
complete &= TaskEXSvc.IsCompleteTask(player, questId) || TaskEXSvc.IsFinishTask(player, questId);
}
if (!complete)
{
return;
}
data.Stage = nextHandBookDesc.stage;
AddQuest(player, data.ActId, data.Stage);
player.MakeDirty();
SyncData(player);
}
private static void OnEnd(PlayerOnGame player, int actId)
{
ref var handBookData = ref player.RoleData.ActExtraInfo.HandBookData;
var index = -1;
for (var i = 0; i < handBookData.Count; i++)
{
if (handBookData[i].ActId != actId) continue;
index = i;
break;
}
if (index < 0)
{
return;
}
ref var bookData = ref handBookData[index];
SendMail(player, ref bookData);
RemoveQuest(player, ref bookData);
handBookData.RemoveAt(index);
player.MakeDirty();
SyncData(player);
}
private static void AddQuest(PlayerOnGame player, int actId, int state)
{
var desc = ActivityDescMgr.Instance.GetConfig(actId);
if (desc == null || desc.subType == 0)
{
return;
}
var handBookDesc = HandBookDescMgr.Instance.GetConfig(desc.subType, state);
if (handBookDesc == null)
{
return;
}
foreach (var questId in handBookDesc.questList)
{
var ret = TaskEXSvc.ProcessAcceptTask(player, questId, true, out var index);
if (ret == CSErrCode.None)
{
TaskEXEvent.NotifyClientNoneDoth(questId, player);
}
}
}
private static void RemoveQuest(PlayerOnGame player, ref HandBookData data)
{
var desc = ActivityDescMgr.Instance.GetConfig(data.ActId);
if (desc == null || desc.subType == 0)
{
return;
}
var groupDesc = HandBookDescMgr.Instance.GetGroup(desc.subType);
foreach (var hand in groupDesc)
{
if (hand.Value.stage > data.Stage)
{
break;
}
foreach (var questId in hand.Value.questList)
{
TaskEXSvc.ProcessGiveupTask2(player, questId, out var index);
}
}
}
public static void Award(PlayerOnGame player, StructPacket packet)
{
ref var req = ref packet.GetMessage<CSHandBookGetAwardReq>();
var res = new CSHandBookGetAwardRes();
var cmd = (int)CSGameMsgID.HandbookGetAwardRes;
var activityDesc = ActivityDescMgr.Instance.GetConfig(req.ActId);
if (req.Stage < 0)
{
res.Ret = (int)CSErrCode.Fail;
player.SendToClient(cmd, ref res);
return;
}
if (activityDesc == null || activityDesc.type != ActivityType.HandBook)
{
res.Ret = (int)CSErrCode.Fail;
player.SendToClient(cmd, ref res);
return;
}
var activityState = ActivitySvc.GetActivityState(player, req.ActId);
if (activityState != ActivityState.InProgress)
{
res.Ret = (int)CSErrCode.Fail;
player.SendToClient(cmd, ref res);
return;
}
ref var handBookData = ref player.RoleData.ActExtraInfo.HandBookData;
var index = -1;
for (int i = 0; i < handBookData.Count; i++)
{
if (handBookData[i].ActId == req.ActId)
{
index = i;
}
}
if (index == -1)
{
res.Ret = (int)CSErrCode.Fail;
player.SendToClient(cmd, ref res);
return;
}
ref var handBook = ref handBookData[index];
var stage = handBook.Stage;
if (req.Stage > stage)
{
res.Ret = (int)CSErrCode.Fail;
player.SendToClient(cmd, ref res);
return;
}
for (int i = 0; i < handBook.Record.Count; i++)
{
if (handBook.Record[i] == req.Stage)
{
res.Ret = (int)CSErrCode.Fail;
player.SendToClient(cmd, ref res);
return;
}
}
var handBookDesc = HandBookDescMgr.Instance.GetConfig(activityDesc.subType, req.Stage);
var questList = handBookDesc.questList;
var complete = true;
foreach (var questId in questList)
{
complete &= (TaskEXSvc.IsCompleteTask(player, questId) || TaskEXSvc.IsFinishTask(player, questId));
}
if (!complete)
{
res.Ret = (int)CSErrCode.Fail;
player.SendToClient(cmd, ref res);
return;
}
var unify = new UnifyOp(player, BillChangeItemReason.HandBook);
foreach (var reward in handBookDesc.reward)
{
unify.AddGoods(reward.Type, reward.Id, reward.Count);
}
unify.DoOp(sendGetItemMsg: true);
handBook.Record.Add(req.Stage);
res.Ret = (int)CSErrCode.None;
SyncData(player);
player.MakeDirty();
player.SendToClient(cmd, ref res);
}
public static void DoneAllTask(PlayerOnGame player, int actId)
{
ref var data = ref player.RoleData.ActExtraInfo.HandBookData;
var index = -1;
for (int i = 0; i < data.Count; i++)
{
if (data[i].ActId == actId)
{
index = i;
break;
}
}
if (index < 0)
{
return;
}
var stage = data[index].Stage;
var desc = ActivityDescMgr.Instance.GetConfig(actId);
var groupDesc = HandBookDescMgr.Instance.GetGroup(desc.subType);
CSTaskEXChangeNotify chgNotify = new CSTaskEXChangeNotify();
foreach (var bookDesc in groupDesc.Values)
{
if (bookDesc.stage != stage)
{
continue;
}
var quest = bookDesc.questList;
for (var i = 0; i < quest.Length; i++)
{
var questId = quest[i];
ref var taskList = ref player.RoleData.TaskEXData.TaskList;
for (var j = 0; j < taskList.Count; j++)
{
var taskId = taskList[j].TaskId;
if (taskId == questId)
{
taskList[j].Status = (int)TaskEXCfg.TaskStatusComplete;
for (int k = 0; k < taskList[j].Condition.Count; k++)
{
ref var c = ref taskList[j].Condition[k];
c.Done = true;
}
chgNotify.ChgTaskList.Add(ref taskList[j]);
}
}
}
}
if (chgNotify.ChgTaskList.GetCount() > 0)
{
player.SendToClient((int)CSGameMsgID.TaskexChangeNotify, ref chgNotify);
}
player.MakeDirty();
}
private static void SendMail(PlayerOnGame player, ref HandBookData data)
{
var activityDesc = ActivityDescMgr.Instance.GetConfig(data.ActId);
if (activityDesc == null || activityDesc.subType == 0 || activityDesc.type != ActivityType.HandBook)
{
return;
}
var group = HandBookDescMgr.Instance.GetGroup(activityDesc.subType);
if (group == null)
{
return;
}
List<RewardItemRW> list = new List<RewardItemRW>();
foreach (var bookDesc in group.Values)
{
if (bookDesc.stage > data.Stage)
{
break;
}
var complete = true;
foreach (var questId in bookDesc.questList)
{
var isCompleteTask = TaskEXSvc.IsCompleteTask(player, questId);
if (isCompleteTask)
{
var questExDesc = QuestEXDescMgr.Instance.GetConfig(questId);
for (int i = 0; i < questExDesc.rewardType.Length; i++)
{
if (questExDesc.rewardType[i] == 0 || questExDesc.rewardCount[i] == 0)
{
break;
}
list.Add(new RewardItemRW()
{
type = (int)questExDesc.rewardType[i],
code = questExDesc.rewardId[i],
amount = questExDesc.rewardCount[i]
});
}
}
var isFinish = TaskEXSvc.IsFinishTask(player, questId);
complete &= isCompleteTask || isFinish;
}
if (complete)
{
var index = -1;
for (int i = 0; i < data.Record.Count; i++)
{
if (data.Record[i] == bookDesc.stage)
{
index = i;
break;
}
}
if (index < 0)
{
foreach (var reward in bookDesc.reward)
{
list.Add(new RewardItemRW()
{
type = reward.Type,
code = reward.Id,
amount = reward.Count
});
}
}
}
}
if (list.Count > 0)
{
MailSender.SendNewMailToPlayer(player, activityDesc.mailId, list);
}
}
public override void OnSystemUnlock(PlayerOnGame player, int sysId)
{
}
protected override void OnDailyRefresh(PlayerOnGame player, ref DBActInfo activityInfo)
{
Init(player, activityInfo.ActID);
}
private static void SyncData(PlayerOnGame player)
{
var info = new HandBookInfoSync() { HandBookData = player.RoleData.ActExtraInfo.HandBookData };
player.SendToClient((int)CSGameMsgID.HandbookInfoSync, ref info);
}
}
}