296 lines
8.2 KiB
Go
296 lines
8.2 KiB
Go
package main
|
|
|
|
import (
|
|
"container/list"
|
|
"math"
|
|
"mongo.games.com/goserver/core/logger"
|
|
|
|
"mongo.games.com/game/common"
|
|
"mongo.games.com/game/model"
|
|
taskproto "mongo.games.com/game/protocol/task"
|
|
"mongo.games.com/game/srvdata"
|
|
)
|
|
|
|
/*
|
|
任务观察者
|
|
*/
|
|
|
|
var TaskSubjectSingleton = &TaskSubject{
|
|
list: make(map[int]*list.List),
|
|
}
|
|
|
|
type ITask interface {
|
|
// TaskUpdate 更新任务进度
|
|
// id 任务类型
|
|
// data 数据
|
|
TaskUpdate(id int, data any)
|
|
}
|
|
|
|
// TaskSubject 观察者
|
|
type TaskSubject struct {
|
|
list map[int]*list.List
|
|
}
|
|
|
|
// Touch 任务统计事件
|
|
// id 任务类型
|
|
// data 数据
|
|
func (t *TaskSubject) Touch(id int, data any) {
|
|
l, ok := t.list[id]
|
|
if !ok {
|
|
return
|
|
}
|
|
for e := l.Front(); e != nil; e = e.Next() {
|
|
if o, ok := e.Value.(ITask); ok {
|
|
o.TaskUpdate(id, data)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (t *TaskSubject) Attach(id int, obj ITask) {
|
|
l, ok := t.list[id]
|
|
if !ok {
|
|
l = new(list.List)
|
|
t.list[id] = l
|
|
}
|
|
for e := l.Front(); e != nil; e = e.Next() {
|
|
if e.Value == obj {
|
|
return
|
|
}
|
|
}
|
|
l.PushBack(obj)
|
|
}
|
|
|
|
type TaskData struct {
|
|
SnId int32
|
|
GameID int
|
|
GameFreeID int32
|
|
Num int64
|
|
Position int32
|
|
Debug bool
|
|
}
|
|
|
|
type TaskHandle struct {
|
|
}
|
|
|
|
func (t *TaskHandle) TaskUpdate(id int, data any) {
|
|
|
|
info, ok := data.(*TaskData)
|
|
if !ok {
|
|
return
|
|
}
|
|
p := PlayerMgrSington.GetPlayerBySnId(info.SnId)
|
|
if p == nil {
|
|
return
|
|
}
|
|
|
|
num := info.Num
|
|
logger.Logger.Tracef("玩家任务事件 Snid = %d,GameId = %d,GameFreeId = %d,任务 id = %d,num = %d", info.SnId, info.GameID, info.GameFreeID, id, num)
|
|
|
|
t.AllTask(id, data)
|
|
|
|
switch id {
|
|
case common.TaskTypeAdv: // 看广告
|
|
|
|
case common.TaskTypeBuyCoin: // 买金币
|
|
|
|
case common.TaskTypeLogin: // 每日登录
|
|
|
|
case common.TaskTypeWinTimes: // 赢游戏次数
|
|
|
|
case common.TaskTypePlayTimes: // 玩游戏次数
|
|
|
|
case common.TaskTypeRankMatchTimes: // 排位赛次数
|
|
|
|
case common.TaskTypePay: // 玩家充值
|
|
p.PhoneLotteryTask(common.TaskTypePay, num)
|
|
|
|
case common.TaskTypeWinOrLose: // 游戏输赢金币数量
|
|
p.PhoneLotteryTask(common.TaskTypeWinOrLose, num)
|
|
case common.TaskTypeTienlenCount: //tienlen游戏场次
|
|
p.PhoneLotteryTask(common.TaskTypeTienlenCount, 1)
|
|
case common.TaskTypeBindInviter: // 绑定邀请人数量
|
|
|
|
case common.TaskTypeWinCoin: // 赢取金币数量
|
|
|
|
case common.TaskTypeLoseCoin: //输的金币数量
|
|
|
|
case common.TaskTypeTienlenWinTimes: // tienlen游戏赢取次数
|
|
|
|
case common.TaskTypeActivityScore: // 活跃积分数量
|
|
|
|
case common.TaskTypeInviteScore: // 邀请积分数量
|
|
|
|
case common.TaskTypeFirstLogin:
|
|
//抽奖次数增加
|
|
p.PhoneLotteryTask(common.TaskTypeFirstLogin, 0)
|
|
p.CollectTask(common.TaskTypeFirstLogin, num)
|
|
|
|
case common.TaskTypeInviteNum:
|
|
|
|
case common.TaskTypeTurnplate:
|
|
p.CollectTask(common.TaskTypeTurnplate, num)
|
|
case common.TaskTypeTienlenWinCoin: // tienlen游戏赢取金币数量
|
|
WelfareMgrSington.UpdateDiamondBankData(p, num, true)
|
|
case common.TaskTypeTienlenLoseCoin: // tienlen游戏输金币数量
|
|
WelfareMgrSington.UpdateDiamondBankData(p, int64(math.Abs(float64(num))), false)
|
|
default:
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// AllTask 任务活动
|
|
func (t *TaskHandle) AllTask(id int, data any) {
|
|
info, ok := data.(*TaskData)
|
|
if !ok {
|
|
return
|
|
}
|
|
p := PlayerMgrSington.GetPlayerBySnId(info.SnId)
|
|
if p == nil {
|
|
return
|
|
}
|
|
|
|
if p.WelfData == nil {
|
|
p.WelfData = model.NewWelfareData()
|
|
}
|
|
if p.WelfData.Task == nil {
|
|
p.WelfData.Task = make(map[int32]*model.TaskData)
|
|
}
|
|
|
|
logger.Logger.Tracef("AllTask taskID:%v %v", id, p.WelfData.Task[int32(id)])
|
|
|
|
change := map[int32][]*taskproto.TaskData{}
|
|
for _, v := range srvdata.TaskMgr.GetTaskType(int32(id)) {
|
|
if !info.Debug {
|
|
// 游戏类型
|
|
switch v.GetGameType() {
|
|
case common.TaskGameTypeTienlen:
|
|
if !srvdata.GameFreeMgr.IsGameDif(int32(info.GameID), common.GameDifTienlen) {
|
|
continue
|
|
}
|
|
case common.TaskGameTypeThirteen:
|
|
if !srvdata.GameFreeMgr.IsGameDif(int32(info.GameID), common.GameDifThirteen) {
|
|
continue
|
|
}
|
|
case common.TaskGameTypeChess:
|
|
if !srvdata.GameFreeMgr.IsGameDif(int32(info.GameID), common.GameDifChess) {
|
|
continue
|
|
}
|
|
case common.TaskGameTypeSmallRocket:
|
|
if !srvdata.GameFreeMgr.IsGameDif(int32(info.GameID), common.GameDifRocket) {
|
|
continue
|
|
}
|
|
default:
|
|
}
|
|
// 大厅类型
|
|
if len(v.Position) > 0 && info.Position > 0 {
|
|
if len(v.Position) > int(info.Position) {
|
|
if v.Position[info.Position-1] != 1 {
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if p.WelfData.Task[v.Id] == nil {
|
|
p.WelfData.Task[v.Id] = &model.TaskData{N: 0} // 初始化任务数据
|
|
}
|
|
p.WelfData.Task[v.Id].N += info.Num
|
|
// 通知变更
|
|
if !IsTaskReward(p, v.Id) {
|
|
item := &taskproto.TaskData{
|
|
Id: v.Id,
|
|
N: p.WelfData.Task[v.Id].N,
|
|
TargetN: v.TargetTimes,
|
|
Status: 0,
|
|
Reward: v.Award,
|
|
TaskType: v.TaskType,
|
|
}
|
|
if item.N > item.TargetN {
|
|
item.N = item.TargetN
|
|
}
|
|
if IsTaskFinish(p, v.Id) {
|
|
item.Status = TaskStateFinish
|
|
}
|
|
change[v.GetActivityType()] = append(change[v.GetActivityType()], item)
|
|
}
|
|
}
|
|
// 通知变更
|
|
for k, v := range change {
|
|
if len(v) == 0 {
|
|
continue
|
|
}
|
|
pack := &taskproto.SCTaskChange{
|
|
Tp: k,
|
|
List: v,
|
|
}
|
|
p.SendToClient(int(taskproto.TaskPacketID_PACKET_SCTaskChange), pack)
|
|
logger.Logger.Tracef("SCTaskChange %v", pack)
|
|
}
|
|
}
|
|
|
|
func OnNotifyChange(p *Player, activityType int32) {
|
|
add := p.GetSkillAdd(common.SkillIdTask)
|
|
var l []*taskproto.TaskData
|
|
for _, v := range srvdata.TaskMgr.GetActivityType(activityType) {
|
|
if !IsTaskReward(p, v.Id) {
|
|
// 皮肤技能每日任务金币加成
|
|
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
|
|
}
|
|
l = append(l, item)
|
|
}
|
|
}
|
|
pack := &taskproto.SCTaskChange{
|
|
Tp: activityType,
|
|
List: l,
|
|
}
|
|
p.SendToClient(int(taskproto.TaskPacketID_PACKET_SCTaskChange), pack)
|
|
logger.Logger.Tracef("SCTaskChange %v", pack)
|
|
}
|
|
|
|
func init() {
|
|
taskHandle := new(TaskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeAdv, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeBuyCoin, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeLogin, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeWinTimes, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypePlayTimes, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeRankMatchTimes, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypePay, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeWinOrLose, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeTienlenCount, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeBindInviter, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeWinCoin, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeTienlenWinTimes, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeInviteScore, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeActivityScore, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeFirstLogin, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeInviteNum, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeTurnplate, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeInviteRecharge, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeLoseCoin, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeOnlineTs, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeBuyPig, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeDaZhong, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeInvitePlay, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeJoinMatch, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeMatchRank10, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeCostDiamond, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeTienlenLoseCoin, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeTienlenWinCoin, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeRankMatchWinTimes, taskHandle)
|
|
TaskSubjectSingleton.Attach(common.TaskTypeBuyPermit, taskHandle)
|
|
}
|