game_sync/worldsrv/action_task.go

204 lines
4.9 KiB
Go

package main
import (
"time"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/game/common"
taskproto "mongo.games.com/game/protocol/task"
"mongo.games.com/game/srvdata"
)
const (
TaskStateFinish = 1 // 任务完成
TaskStateReward = 2 // 任务奖励已领取
)
func init() {
// 获取任务列表
common.Register(int(taskproto.TaskPacketID_PACKET_CSTaskList), taskproto.CSTaskList{}, CSTaskList)
// 领取任务奖励
common.Register(int(taskproto.TaskPacketID_PACKET_CSTaskReward), taskproto.CSTaskReward{}, CSTaskReward)
// 测试用:直接增加任务计数
common.Register(int(taskproto.TaskPacketID_PACKET_CSDebugInc), taskproto.CSTaskDebugInc{}, CSTaskDebugInc)
}
// GetTaskTimes 获取任务完成进度
func GetTaskTimes(p *Player, id int32) int64 {
if p.WelfData != nil && p.WelfData.Task[id] != nil {
return p.WelfData.Task[id].N
}
return 0
}
// IsTaskFinish 是否任务完成
func IsTaskFinish(p *Player, id int32) bool {
data := srvdata.PBDB_TaskMgr.GetData(id)
if data == nil {
return false
}
if p.WelfData != nil && p.WelfData.Task[id] != nil {
return p.WelfData.Task[id].N >= data.GetTargetTimes()
}
return false
}
// IsTaskReward 是否任务奖励已领取
func IsTaskReward(p *Player, id int32) bool {
if p.WelfData != nil && p.WelfData.Task != nil {
if data := p.WelfData.Task[id]; data != nil && data.Ts > 0 {
t := srvdata.PBDB_TaskMgr.GetData(id)
switch t.ActivityType {
case common.TaskActivityTypeEveryDay:
if common.TsInSameDay(time.Now().Unix(), data.Ts) {
return true
}
case common.TaskActivityTypeWeek:
if common.TsInSameWeek(time.Now().Unix(), data.Ts) {
return true
}
case common.TaskActivityTypeNovice, common.TaskActivityTypeInvite:
if data.Ts > 0 {
return true
}
}
}
}
return false
}
func SendReward(p *Player, m map[int64]int64) {
var items []*Item
for k, v := range m {
items = append(items, &Item{
ItemId: int32(k),
ItemNum: v,
})
}
BagMgrSingleton.AddJybBagInfo(p, items, 0, common.GainWay_TaskReward, "system", "任务奖励")
for _, v := range items {
data := srvdata.PBDB_GameItemMgr.GetData(v.ItemId)
if data != nil {
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, v.ItemId, data.Name, v.ItemNum, "任务获得")
}
}
}
func CSTaskList(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSTaskList %v", data)
msg, ok := data.(*taskproto.CSTaskList)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
ret := &taskproto.SCTaskList{
Tp: msg.GetTp(),
}
// todo 优化
tp := msg.GetTp()
for _, v := range srvdata.PBDB_TaskMgr.Datas.GetArr() {
if v.GetActivityType() != tp {
continue
}
item := &taskproto.TaskData{
Id: v.Id,
N: GetTaskTimes(p, v.Id),
TargetN: v.GetTargetTimes(),
Status: 0,
Reward: v.GetAward(),
TaskType: v.GetTaskType(),
}
if item.N > item.TargetN {
item.N = item.TargetN
}
if IsTaskReward(p, v.Id) {
item.Status = TaskStateReward
} else if IsTaskFinish(p, v.Id) {
item.Status = TaskStateFinish
}
ret.List = append(ret.List, item)
}
p.SendToClient(int(taskproto.TaskPacketID_PACKET_SCTaskList), ret)
logger.Logger.Tracef("SCTaskList %v", ret)
return nil
}
func CSTaskReward(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSTaskReward %v", data)
msg, ok := data.(*taskproto.CSTaskReward)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
ret := &taskproto.SCTaskReward{
OpCode: taskproto.OpResultCode_OPRC_Error,
Tp: msg.GetTp(),
Id: msg.GetId(),
}
if IsTaskFinish(p, msg.GetId()) && !IsTaskReward(p, msg.GetId()) {
p.WelfData.Task[msg.GetId()].Ts = time.Now().Unix()
data := srvdata.PBDB_TaskMgr.GetData(msg.GetId())
if data != nil {
SendReward(p, data.Award)
}
ret.OpCode = taskproto.OpResultCode_OPRC_Success
}
p.SendToClient(int(taskproto.TaskPacketID_PACKET_SCTaskReward), ret)
logger.Logger.Tracef("SCTaskReward %v", ret)
return nil
}
func CSTaskDebugInc(s *netlib.Session, packetId int, data interface{}, sid int64) error {
if !common.Config.IsDevMode {
return nil
}
logger.Logger.Tracef("CSTaskDebugInc %v", data)
msg, ok := data.(*taskproto.CSTaskDebugInc)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
id := msg.GetId()
taskType := int32(-1)
for _, v := range srvdata.PBDB_TaskMgr.Datas.GetArr() {
if v.Id == id {
taskType = v.TaskType
break
}
}
p.ResetTaskN(taskType)
TaskSubjectSingleton.Touch(int(taskType), &TaskData{
SnId: p.SnId,
Num: int64(msg.GetAddNum()),
Debug: true,
})
ret := &taskproto.SCTaskDebugInc{
OpCode: taskproto.OpResultCode_OPRC_Success,
}
p.SendToClient(int(taskproto.TaskPacketID_PACKET_SCDebugInc), ret)
logger.Logger.Tracef("CSTaskDebugInc %v", ret)
return nil
}