任务系统和其他系统打交道很多,比如副本系统、导航系统等,其他的系统用于刷新任务系统的进度。

添加更新任务进度API

TaskSys添加更新任务进度的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void CalcTaskPrgs(PlayerData pd, int tid)
{
TaskRewardData trd = CalcTaskRewardData(pd, tid);
TaskRewardCfg trc = _cfgSvc.GetTaskRewardCfg(tid);

if (trd.prgs < trc.count)
{
trd.prgs += 1;

//更新任务进度
CalcTaskArr(pd, trd);

ServerSession session = _cacheSvc.GetOnlineServerSession(pd.id);
if (session != null)
{
session.SendMsg(new GameMsg
{
cmd = (int)CMD.PshTaskPrgs,
pshTaskPrgs = new PshTaskPrgs
{
taskArr = pd.taskArr,
}
});
}
}
}

GameMsg里面添加PshTaskPrgs,相应的CMDGameMsg类的声明像之前一样省略

1
2
3
4
5
[System.Serializable]
public class PshTaskPrgs
{
public string[] taskArr;
}

CacheSvc添加GetOnlineServerSession(int id)的API,用来在TaskSys里面调用

1
2
3
4
5
6
7
8
9
10
11
12
13
public ServerSession GetOnlineServerSession(int id)
{
ServerSession session = null;
foreach (var item in onLineSessionDic)
{
if (item.Value.id == id)
{
session = item.Key;
break;
}
}
return session;
}

GuideSys应用进度更新

ReqGuide中根据GuideID来确定是否更新任务进度

1
2
3
4
5
6
7
8
9
10
//更新GuideID:
if(pd.guideid == reqGuideData.guideid)//防止玩家和服务器数据不一致
{
//检测是否为"智者点拨"任务
if (pd.guideid == 1001)
{
TaskSys.Instance.CalcTaskPrgs(pd, 1);//第二个参数表示"智者点拨"任务的ID
}
//...
}

StrongSys应用进度更新

在成功进行强化时更新任务进度

1
2
3
4
5
6
7
8
if (nextSd != null)
{
TaskSys.Instance.CalcTaskPrgs(pd, 3);//
//资源扣除
pd.coin -= nextSd.coin;
pd.crystal -= nextSd.crystal;
pd.strongArr[reqStrongData.pos] += 1;
}

BuySys应用进度更新

在购买体力时更新任务进度,在购买金币时更新任务进度

1
2
3
4
5
6
7
8
9
10
11
switch (data.buytype)
{
case 0:
pd.power += 100;//购买体力无视体力限制
TaskSys.Instance.CalcTaskPrgs(pd, 4);
break;
case 1:
pd.coin += 1000;
TaskSys.Instance.CalcTaskPrgs(pd,5);
break;
}

ChatSys应用进度更新

1
2
3
4
5
6
7
public void SendChat(MsgPack msgPack)
{
SndChat data = msgPack.msg.sndChat;
PlayerData pd = _cacheSvc.GetPalyerDataBySession(msgPack.session);
TaskSys.Instance.CalcTaskPrgs(pd, 6);
//...
}

注意,进度更新没有应用到数据库,仅应用在缓存中

只有在客户端点击领取时才会更新到数据库中。