game_sync/worldsrv/action_task.go

206 lines
5.6 KiB
Go

package main
import (
"time"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/mq"
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)
}
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.GetOnlinePlayer(sid)
if p == nil {
return nil
}
add := p.GetSkillAdd(common.SkillIdTask)
ret := &taskproto.SCTaskList{
Tp: msg.GetTp(),
}
if msg.GetTp() == common.TaskActivityTypeConsume {
conf := WelfareMgrSington.GetConfig(p.Platform).ConsumeConfig
if conf != nil {
ret.StartTs = common.StrTimeToTs(conf.StartTime)
ret.EndTs = common.StrTimeToTs(conf.EndTime)
ret.On = conf.GetOn() == common.On
}
}
for _, v := range srvdata.TaskMgr.GetActivityType(msg.GetTp()) {
item := &taskproto.TaskData{
Id: v.Id,
N: GetTaskTimes(p, v.Id),
TargetN: v.GetTargetTimes(),
Status: 0,
Reward: make(map[int64]int64),
TaskType: v.GetTaskType(),
}
// 皮肤技能每日任务金币加成
for k, vv := range v.GetAward() {
if v.GetActivityType() == common.TaskActivityTypeEveryDay && add > 0 && k == common.ItemIDCoin {
vv += int64((float64(vv) * float64(add)) / 100.0)
}
item.Reward[k] = vv
}
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.GetOnlinePlayer(sid)
if p == nil {
return nil
}
add := p.GetSkillAdd(common.SkillIdTask)
now := time.Now()
ret := &taskproto.SCTaskReward{
OpCode: taskproto.OpResultCode_OPRC_Error,
Tp: msg.GetTp(),
Id: msg.GetId(),
Reward: make(map[int64]int64),
}
isPermit := p.GetIsPermit()
f := func(id int32) {
if IsTaskFinish(p, id) && !IsTaskReward(p, id) {
p.WelfData.Task[id].Ts = time.Now().Unix()
// 任务完成记录
taskLog := &model.BackendPermitTask{
Platform: p.Platform,
StartTs: PlatformMgrSingleton.GetConfig(p.Platform).PermitStartTs,
SnId: p.SnId,
TaskId: id,
Ts: now.Unix(),
}
data := srvdata.PBDB_TaskMgr.GetData(id)
if data != nil {
SendTaskReward(p, data.Award, msg.Tp)
for k, vv := range data.GetAward() {
if k == common.ItemIDPermit && isPermit {
vv += int64(float64(vv) * common.PermitAdd)
}
// 皮肤技能每日任务金币加成
if data.GetActivityType() == common.TaskActivityTypeEveryDay && add > 0 && k == common.ItemIDCoin {
vv += int64((float64(vv) * float64(add)) / 100.0)
}
ret.Reward[k] = ret.Reward[k] + vv
}
for k, v := range ret.Reward {
taskLog.Gain = append(taskLog.Gain, model.AwardItem{
Id: int32(k),
Num: v,
})
}
taskLog.TaskName = data.GetDes()
taskLog.ActivityType = data.GetActivityType()
taskLog.TaskType = data.GetTaskType()
taskLog.RemainDiamond = p.Diamond
}
mq.Write(taskLog)
ret.OpCode = taskproto.OpResultCode_OPRC_Success
}
}
if msg.GetTp() == common.TaskActivityTypeConsume {
conf := WelfareMgrSington.GetConfig(p.Platform).ConsumeConfig
if conf == nil || conf.GetOn() != common.On || now.Unix() < common.StrTimeToTs(conf.StartTime) || now.Unix() >= common.StrTimeToTs(conf.EndTime) {
p.SendToClient(int(taskproto.TaskPacketID_PACKET_SCTaskReward), ret)
logger.Logger.Tracef("SCTaskReward %v", ret)
return nil
}
}
if msg.Tp > 0 && msg.Id == 0 {
// 一键领取
for _, v := range srvdata.TaskMgr.GetActivityType(msg.GetTp()) {
f(v.GetId())
}
ret.OpCode = taskproto.OpResultCode_OPRC_Success
} else {
f(msg.GetId())
}
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.GetOnlinePlayer(sid)
if p == nil {
return nil
}
id := msg.GetId()
taskType := int32(-1)
d := srvdata.PBDB_TaskMgr.GetData(id)
if d != nil {
taskType = d.TaskType
}
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
}