game_sync/worldsrv/action_rankmatch.go

294 lines
7.1 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"
"mongo.games.com/game/protocol/rankmatch"
"mongo.games.com/game/srvdata"
)
func init() {
// 赛季信息
common.Register(int(rankmatch.RankMatch_PACKET_RM_CSRMSeasonInfo), rankmatch.CSRMSeasonInfo{}, CSRMSeasonInfo)
// 段位表
common.Register(int(rankmatch.RankMatch_PACKET_RM_CSRMRankConfig), rankmatch.CSRMRankConfig{}, CSRMRankConfig)
// 段位奖励
common.Register(int(rankmatch.RankMatch_PACKET_RM_CSRMAwardConfig), rankmatch.CSRMAwardConfig{}, CSRMAwardConfig)
// 领取段位奖励
common.Register(int(rankmatch.RankMatch_PACKET_RM_CSRMAward), rankmatch.CSRMAward{}, CSRMAward)
}
// CSRMSeasonInfo 赛季信息
func CSRMSeasonInfo(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSRMSeasonInfo")
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSRMSeasonInfo p == nil.")
return nil
}
if p.Platform == DefaultPlatform {
logger.Logger.Warnf("CSRMSeasonInfo Platform == Default_Platform.")
return nil
}
pack := &rankmatch.SCRMSeasonInfo{}
cfg := RankMgrSingleton.GetSeasonConfig(p.Platform)
if cfg == nil {
p.SendToClient(int(rankmatch.RankMatch_PACKET_RM_SCRMSeasonInfo), pack)
return nil
}
pack = &rankmatch.SCRMSeasonInfo{
Id: cfg.SeasonId,
TimeStamp: []int64{cfg.StartTs, cfg.EndTs},
}
rank := RankMgrSingleton.GetPlayerSeason(p.SnId)
if rank != nil && rank.RankType != nil {
for k, v := range rank.RankType {
if v == nil {
continue
}
info := &rankmatch.SeasonInfo{Id: k}
info.Lv, info.Score = RankMgrSingleton.GetPlayerRankLV(k, p.SnId)
info.LastLv, info.LastScore = RankMgrSingleton.GetPlayerLastRankLV(k, p.SnId)
pack.Seasons = append(pack.Seasons, info)
}
}
p.SendToClient(int(rankmatch.RankMatch_PACKET_RM_SCRMSeasonInfo), pack)
logger.Logger.Trace("SCTMSeasonInfo:", pack)
return nil
}
// CSRMRankConfig 段位列表
func CSRMRankConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSRMRankConfig data:%v", data)
msg, ok := data.(*rankmatch.CSRMRankConfig)
if !ok {
return nil
}
if msg.GetId() <= 0 {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSRMRankConfig p == nil.")
return nil
}
if p.Platform == DefaultPlatform {
logger.Logger.Warnf("CSRMRankConfig Platform == Default_Platform.")
return nil
}
pack := &rankmatch.SCRMRankConfig{}
for _, v := range RankMgrSingleton.GetRankList(msg.GetId()) {
pack.Items = append(pack.Items, &rankmatch.RankItem{
Id: v.Id,
Lv: v.Lv,
Score: v.Score,
})
}
p.SendToClient(int(rankmatch.RankMatch_PACKET_RM_SCRMRankConfig), pack)
logger.Logger.Trace("SCRMRankConfig:", pack)
return nil
}
// CSRMAwardConfig 段位奖励
func CSRMAwardConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSRMAwardConfig data:%v", data)
msg, ok := data.(*rankmatch.CSRMAwardConfig)
if !ok {
return nil
}
if msg.GetId() <= 0 {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSRMAwardConfig p == nil.")
return nil
}
if p.Platform == DefaultPlatform {
logger.Logger.Warnf("CSRMAwardConfig Platform == Default_Platform.")
return nil
}
rank := RankMgrSingleton.GetPlayerSeason(p.SnId)
lv, _ := RankMgrSingleton.GetPlayerRankLV(msg.GetId(), p.SnId)
pack := &rankmatch.SCRMAwardConfig{}
for _, item := range RankMgrSingleton.GetRankAwardList(msg.GetId()) {
// 1 可领取 2已领取
if lv >= item.Lv && rank != nil {
item.ReceiveType = 1 // 可领取
// 是否已领取
if info := rank.RankType[msg.GetId()]; info != nil {
for _, v := range info.Awards {
if v.Id == item.Id {
if v.Ts > 0 {
item.ReceiveType = 2 // 已领取
}
break
}
}
}
}
pack.List = append(pack.List, item)
}
p.SendToClient(int(rankmatch.RankMatch_PACKET_RM_SCRMAwardConfig), pack)
logger.Logger.Trace("SCRMAwardConfig:", pack)
return nil
}
// CSRMAward 领取段位奖励
func CSRMAward(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSRMAward data:%v", data)
msg, ok := data.(*rankmatch.CSRMAward)
if !ok {
return nil
}
if msg.GetId() <= 0 {
return nil
}
d := srvdata.PBDB_RankRewardMgr.GetData(msg.AwardId)
if d == nil {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSRMAward p == nil.")
return nil
}
if p.Platform == DefaultPlatform {
logger.Logger.Warnf("CSRMAward Platform == Default_Platform.")
return nil
}
rank := RankMgrSingleton.GetPlayerSeason(p.SnId)
if rank == nil {
return nil
}
pack := &rankmatch.SCRMAward{
Code: 1, // 1 失败
Id: msg.GetAwardId(),
}
var isAward bool
if info := rank.RankType[msg.GetId()]; info != nil {
for _, v := range info.Awards {
if v.Id == msg.GetAwardId() {
// 是否已领取
if v.Ts > 0 {
isAward = true
}
break
}
}
}
if isAward {
p.SendToClient(int(rankmatch.RankMatch_PACKET_RM_SCRMAward), pack)
logger.Logger.Trace("SCRMAward already receive:", pack)
return nil
}
// 是否可领取
lv, _ := RankMgrSingleton.GetPlayerRankLV(msg.GetId(), p.SnId)
if lv >= d.GetLevel() {
// 可以领取
isAward = true
}
// 领取奖励
if isAward {
pack.Code = 0 // 领取成功
rank.RankType[msg.GetId()].Awards = append(rank.RankType[msg.GetId()].Awards, &model.RankAward{
Id: msg.AwardId,
Ts: time.Now().Unix(),
})
rank.Dirty = true
p.dirty = true
type Param struct {
Id int32
Num int32
}
f := func(v *Param) {
if v.Num > 0 {
switch {
case v.Id <= 0:
case v.Id == 1: //金币
p.AddCoin(int64(v.Num), 0, common.GainWay_RankMatch, "system", "段位奖励")
if !p.IsRob {
mq.Write(model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, p.Channel,
model.SystemFreeGive_GiveType_RankMatch, model.SystemFreeGive_CoinType_Coin, int64(v.Num)))
}
case v.Id == 2: //钻石
p.AddDiamond(int64(v.Num), 0, common.GainWay_RankMatch, "system", "段位奖励")
if !p.IsRob {
mq.Write(model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, p.Channel,
model.SystemFreeGive_GiveType_RankMatch, model.SystemFreeGive_CoinType_Diamond, int64(v.Num)))
}
default:
//道具
BagMgrSingleton.AddItems(&model.AddItemParam{
Platform: p.Platform,
SnId: p.SnId,
Change: []*model.Item{
{
ItemId: v.Id,
ItemNum: int64(v.Num),
},
},
Add: 0,
GainWay: common.GainWay_RankMatch,
Operator: "system",
Remark: "段位奖励",
GameId: 0,
GameFreeId: 0,
})
}
}
}
f(&Param{
Id: d.Award1Id,
Num: d.Award1Num,
})
f(&Param{
Id: d.Award2Id,
Num: d.Award2Num,
})
f(&Param{
Id: d.Award3Id,
Num: d.Award3Num,
})
RankMgrSingleton.CheckShowRed(p.SnId)
}
p.SendToClient(int(rankmatch.RankMatch_PACKET_RM_SCRMAward), pack)
logger.Logger.Trace("SCRMAward:", pack)
return nil
}