game_sync/worldsrv/action_tournament.go

478 lines
16 KiB
Go

package main
import (
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/proto"
"mongo.games.com/game/protocol/tournament"
"mongo.games.com/game/srvdata"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/goserver/core/task"
"sort"
"strconv"
"time"
)
// 比赛场信息
type CSTMInfoPacketFactory struct {
}
type CSTMInfoHandler struct {
}
func (this *CSTMInfoPacketFactory) CreatePacket() interface{} {
pack := &tournament.CSTMInfo{}
return pack
}
func (this *CSTMInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSTMInfoHandler Process recv ", data)
if _, ok := data.(*tournament.CSTMInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSTMInfo p == nil.")
return nil
}
pack := TournamentMgr.GetSCTMInfosPack(p.Platform, p.AppChannel)
proto.SetDefaults(pack)
logger.Logger.Trace("SCTMInfos++++++++++++:", pack)
p.SendToClient(int(tournament.TOURNAMENTID_PACKET_TM_SCTMInfos), pack)
}
return nil
}
// 排行榜
type CSTMRankListPacketFactory struct {
}
type CSTMRankListHandler struct {
}
func (this *CSTMRankListPacketFactory) CreatePacket() interface{} {
pack := &tournament.CSTMRankList{}
return pack
}
func (this *CSTMRankListHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSTMRankListHandler Process recv ", data)
if msg, ok := data.(*tournament.CSTMRankList); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSTMRankList p == nil.")
return nil
}
pack := &tournament.SCTMRankList{
TMId: msg.TMId,
TimeRange: "9.1-9.30",
TMRank: []*tournament.TMRank{
{RankId: 1, RankName: "rankNo.1", WinnerNum: 5},
{RankId: 2, RankName: "rankNo.2", WinnerNum: 4},
{RankId: 3, RankName: "rankNo.3", WinnerNum: 2}},
}
proto.SetDefaults(pack)
logger.Logger.Trace("CSTMRankList:", pack)
p.SendToClient(int(tournament.TOURNAMENTID_PACKET_TM_SCTMRankList), pack)
}
return nil
}
// 报名
type CSSignRacePacketFactory struct {
}
type CSSignRaceHandler struct {
}
func (this *CSSignRacePacketFactory) CreatePacket() interface{} {
pack := &tournament.CSSignRace{}
return pack
}
func (this *CSSignRaceHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSSignRaceHandler Process recv ", data)
if msg, ok := data.(*tournament.CSSignRace); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSSignRace p == nil.")
return nil
}
if p.scene != nil {
logger.Logger.Warnf("CSSignRace p.scene != nil.")
return nil
}
if p.IsRob {
logger.Logger.Warnf("CSSignRace p.IsRob.")
return nil
}
platform := p.Platform
tmid := msg.TMId
pack := &tournament.SCSignRace{}
switch msg.GetOpCode() {
case 0:
ok, code := TournamentMgr.SignUp(tmid, p)
if !ok {
logger.Logger.Infof("player(%v) match(%v) SignUp is fail.", p.SnId, tmid)
pack.RetCode = code //0成功 1重复报名 2比赛没有开启 3道具不足 4不在报名时间段 5金币不足 6钻石不足
}
if code == int32(tournament.SignRaceCode_OPRC_Close) ||
code == int32(tournament.SignRaceCode_OPRC_Time) {
TournamentMgr.CancelSignUpAll(platform, tmid)
}
waitStart := TournamentMgr.playerWaitStart[p.SnId]
if pack.RetCode == 0 && waitStart != 0 {
pack.WaitStartTime = waitStart
}
proto.SetDefaults(pack)
logger.Logger.Trace("SCSignRace:", pack)
signSucc := p.SendToClient(int(tournament.TOURNAMENTID_PACKET_TM_SCSignRace), pack)
// 检查是否可以开始比赛(关闭机器人时,比赛开赛)
if msg.GetOpCode() == 0 && pack.RetCode == 0 && signSucc && !TournamentMgr.IsUseRobot(platform, tmid) {
if TournamentMgr.CanStart(platform, tmid) {
TournamentMgr.Start(platform, tmid)
}
}
default:
if TournamentMgr.IsMatching(p.SnId) {
logger.Logger.Infof("player(%v) IsMatching.", p.SnId)
} else {
//取消报名
TournamentMgr.CancelSignUp(platform, tmid, p.SnId)
}
return nil
}
}
return nil
}
// 赛季信息
type CSTMSeasonInfoPacketFactory struct {
}
type CSTMSeasonInfoHandler struct {
}
func (this *CSTMSeasonInfoPacketFactory) CreatePacket() interface{} {
pack := &tournament.CSTMSeasonInfo{}
return pack
}
func (this *CSTMSeasonInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSTMSeasonInfoHandler Process recv ", data)
if _, ok := data.(*tournament.CSTMSeasonInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSTMSeasonInfoHandler p == nil.")
return nil
}
if p.Platform == DefaultPlatform {
logger.Logger.Warnf("CSTMSeasonInfoHandler Platform == Default_Platform.")
return nil
}
msid := MatchSeasonMgrSington.GetMatchSeasonId(p.Platform)
if msid == nil {
logger.Logger.Warnf("CSTMSeasonInfoHandler msid == nil.")
return nil
}
send := func(ms *MatchSeason) {
pack := &tournament.SCTMSeasonInfo{
Id: msid.SeasonId,
SeasonTimeStamp: []int64{msid.StartStamp, msid.EndStamp},
Lv: ms.Lv,
LastLv: ms.LastLv,
IsAward: ms.IsAward,
}
proto.SetDefaults(pack)
logger.Logger.Trace("CSTMSeasonInfoHandler:", pack)
p.SendToClient(int(tournament.TOURNAMENTID_PACKET_TM_SCTMSeasonInfo), pack)
}
snid := p.SnId
ms := MatchSeasonMgrSington.GetMatchSeason(snid)
if ms == nil {
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
ret, err := model.QueryMatchSeasonBySnid(p.Platform, snid)
if err != nil {
return nil
}
return ret
}), task.CompleteNotifyWrapper(func(data interface{}, tt task.Task) {
var ret *model.MatchSeason
dirty := false
if data == nil || data.(*model.MatchSeason) == nil { //新数据
player := PlayerMgrSington.GetPlayerBySnId(snid)
if player != nil {
ret = model.NewMatchSeason(player.Platform, snid, player.Name, msid.SeasonId, 1)
dirty = true
} else {
logger.Logger.Trace("CSTMSeasonInfoHandler error: player==nil ", snid)
}
} else {
ret = data.(*model.MatchSeason)
if ret.SeasonId < msid.SeasonId { //不同赛季段位继承
num := msid.SeasonId - ret.SeasonId
finalLv := ret.Lv
for i := 0; i < int(num); i++ { //继承几次
if i == int(num)-1 { //上个赛季
ret.LastLv = finalLv
}
finalLv = MatchSeasonMgrSington.MatchSeasonInherit(finalLv)
}
ret.Lv = finalLv
ret.SeasonId = msid.SeasonId
ret.IsAward = false
ret.UpdateTs = time.Now().Unix()
dirty = true
}
}
ms = MatchSeasonMgrSington.exchangeModel2Cache(ret)
ms.dirty = dirty
MatchSeasonMgrSington.SetMatchSeason(ms)
send(ms)
})).StartByFixExecutor("SnId:" + strconv.Itoa(int(snid)))
} else {
if ms.SeasonId < msid.SeasonId { //不同赛季段位继承
num := msid.SeasonId - ms.SeasonId
finalLv := ms.Lv
for i := 0; i < int(num); i++ { //继承几次
if i == int(num)-1 { //上个赛季
ms.LastLv = finalLv
}
finalLv = MatchSeasonMgrSington.MatchSeasonInherit(finalLv)
}
ms.Lv = finalLv
ms.SeasonId = msid.SeasonId
ms.IsAward = false
ms.UpdateTs = time.Now().Unix()
ms.dirty = true
MatchSeasonMgrSington.SetMatchSeason(ms)
}
send(ms)
}
}
return nil
}
// 赛季排行榜
type CSTMSeasonRankPacketFactory struct {
}
type CSTMSeasonRankHandler struct {
}
func (this *CSTMSeasonRankPacketFactory) CreatePacket() interface{} {
pack := &tournament.CSTMSeasonRank{}
return pack
}
func (this *CSTMSeasonRankHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSTMSeasonRankHandler Process recv ", data)
if _, ok := data.(*tournament.CSTMSeasonRank); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSTMSeasonRankHandler p == nil.")
return nil
}
platform := p.Platform
if platform == DefaultPlatform {
logger.Logger.Warnf("CSTMSeasonRankHandler Platform == Default_Platform.")
return nil
}
pack := &tournament.SCTMSeasonRank{}
tmpMsrs := []*MatchSeasonRank{}
msr := MatchSeasonRankMgrSington.GetMatchSeasonRank(platform)
if msr != nil {
for _, ms := range msr {
sr := &MatchSeasonRank{
SnId: ms.SnId,
Name: ms.Name,
Lv: ms.Lv,
}
tmpMsrs = append(tmpMsrs, sr)
}
}
robotmsr := MatchSeasonRankMgrSington.GetRobotMatchSeasonRank(platform)
if robotmsr != nil {
for _, ms := range robotmsr {
sr := &MatchSeasonRank{
SnId: ms.SnId,
Name: ms.Name,
Lv: ms.Lv,
}
tmpMsrs = append(tmpMsrs, sr)
}
}
if tmpMsrs != nil && len(tmpMsrs) > 0 {
sort.Slice(tmpMsrs, func(i, j int) bool {
return tmpMsrs[i].Lv > tmpMsrs[j].Lv
})
if len(tmpMsrs) > model.GameParamData.MatchSeasonRankMaxNum {
tmpMsrs = append(tmpMsrs[:model.GameParamData.MatchSeasonRankMaxNum])
}
for i := 0; i < len(tmpMsrs); i++ {
ms := tmpMsrs[i]
sr := &tournament.SeasonRank{
Snid: ms.SnId,
Name: ms.Name,
Lv: ms.Lv,
Rank: int32(i) + 1,
}
pack.ReasonRanks = append(pack.ReasonRanks, sr)
}
}
proto.SetDefaults(pack)
logger.Logger.Trace("CSTMSeasonRankHandler:", pack)
p.SendToClient(int(tournament.TOURNAMENTID_PACKET_TM_SCTMSeasonRank), pack)
}
return nil
}
// 领取赛季奖励
type CSTMSeasonAwardPacketFactory struct {
}
type CSTMSeasonAwardHandler struct {
}
func (this *CSTMSeasonAwardPacketFactory) CreatePacket() interface{} {
pack := &tournament.CSTMSeasonAward{}
return pack
}
func (this *CSTMSeasonAwardHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSTMSeasonAwardHandler Process recv ", data)
if msg, ok := data.(*tournament.CSTMSeasonAward); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warnf("CSTMSeasonAwardHandler p == nil.")
return nil
}
if p.Platform == DefaultPlatform {
logger.Logger.Warnf("CSTMSeasonInfoHandler Platform == Default_Platform.")
return nil
}
lv := msg.GetLv()
logger.Logger.Trace("CSTMSeasonAwardHandler lv: ", lv)
pack := &tournament.SCTMSeasonAward{
Lv: lv,
Code: 1,
}
ms := MatchSeasonMgrSington.GetMatchSeason(p.SnId)
msi := MatchSeasonMgrSington.GetMatchSeasonId(p.Platform)
if ms != nil && msi != nil {
if !ms.IsAward && ms.LastLv == lv && msi.SeasonId > 1 { //领取上赛季奖励
for _, v := range srvdata.PBDB_GamMatchLVMgr.Datas.GetArr() {
if v.Star != nil && len(v.Star) > 1 {
startStar := v.Star[0]
endStar := v.Star[1]
if lv >= startStar && lv <= endStar { //匹配段位
pack.Code = 0
MatchSeasonMgrSington.UpdateMatchSeasonAward(p.SnId)
if v.Number1 > 0 {
switch v.AwardType1 {
case 1: //金币
p.AddCoin(int64(v.Number1), 0, common.GainWay_MatchSeason, "system", "赛季奖励")
if !p.IsRob {
LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, model.SystemFreeGive_GiveType_MatchSeason, model.SystemFreeGive_CoinType_Coin, int64(v.Number1)))
}
case 2: //钻石
p.AddDiamond(int64(v.Number1), 0, common.GainWay_MatchSeason, "system", "赛季奖励")
if !p.IsRob {
LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, model.SystemFreeGive_GiveType_MatchSeason, model.SystemFreeGive_CoinType_Diamond, int64(v.Number1)))
}
case 3: //道具
item := &Item{
ItemId: v.AwardId1,
ItemNum: int64(v.Number1),
}
BagMgrSingleton.AddJybBagInfo(p, []*Item{item}, 0, common.GainWay_MatchSeason, "system", "赛季奖励")
itemData := srvdata.PBDB_GameItemMgr.GetData(item.ItemId)
if itemData != nil {
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, item.ItemId, itemData.Name, item.ItemNum, "赛季奖励")
}
}
}
if v.Number2 > 0 {
switch v.AwardType2 {
case 1: //金币
p.AddCoin(int64(v.Number2), 0, common.GainWay_MatchSeason, "system", "赛季奖励")
if !p.IsRob {
LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, model.SystemFreeGive_GiveType_MatchSeason, model.SystemFreeGive_CoinType_Coin, int64(v.Number2)))
}
case 2: //钻石
p.AddDiamond(int64(v.Number2), 0, common.GainWay_MatchSeason, "system", "赛季奖励")
if !p.IsRob {
LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, model.SystemFreeGive_GiveType_MatchSeason, model.SystemFreeGive_CoinType_Diamond, int64(v.Number2)))
}
case 3: //道具
item := &Item{
ItemId: v.AwardId2,
ItemNum: int64(v.Number2),
}
BagMgrSingleton.AddJybBagInfo(p, []*Item{item}, 0, common.GainWay_MatchSeason, "system", "赛季奖励")
itemData := srvdata.PBDB_GameItemMgr.GetData(item.ItemId)
if itemData != nil {
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, item.ItemId, itemData.Name, item.ItemNum, "赛季奖励")
}
}
}
if v.Number3 > 0 {
switch v.AwardType3 {
case 1: //金币
p.AddCoin(int64(v.Number3), 0, common.GainWay_MatchSeason, "system", "赛季奖励")
if !p.IsRob {
LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, model.SystemFreeGive_GiveType_MatchSeason, model.SystemFreeGive_CoinType_Coin, int64(v.Number3)))
}
case 2: //钻石
p.AddDiamond(int64(v.Number3), 0, common.GainWay_MatchSeason, "system", "赛季奖励")
if !p.IsRob {
LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, model.SystemFreeGive_GiveType_MatchSeason, model.SystemFreeGive_CoinType_Diamond, int64(v.Number3)))
}
case 3: //道具
item := &Item{
ItemId: v.AwardId3,
ItemNum: int64(v.Number3),
}
BagMgrSingleton.AddJybBagInfo(p, []*Item{item}, 0, common.GainWay_MatchSeason, "system", "赛季奖励")
itemData := srvdata.PBDB_GameItemMgr.GetData(item.ItemId)
if itemData != nil {
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, item.ItemId, itemData.Name, item.ItemNum, "赛季奖励")
}
}
}
break
}
}
}
}
}
if pack.Code != 0 {
logger.Logger.Trace("CSTMSeasonAwardHandler ms: ", ms)
logger.Logger.Trace("CSTMSeasonAwardHandler msi: ", msi)
}
proto.SetDefaults(pack)
logger.Logger.Trace("SCTMSeasonAward:", pack)
p.SendToClient(int(tournament.TOURNAMENTID_PACKET_TM_SCTMSeasonAward), pack)
}
return nil
}
func init() {
common.RegisterHandler(int(tournament.TOURNAMENTID_PACKET_TM_CSTMInfo), &CSTMInfoHandler{})
netlib.RegisterFactory(int(tournament.TOURNAMENTID_PACKET_TM_CSTMInfo), &CSTMInfoPacketFactory{})
common.RegisterHandler(int(tournament.TOURNAMENTID_PACKET_TM_CSTMRankList), &CSTMRankListHandler{})
netlib.RegisterFactory(int(tournament.TOURNAMENTID_PACKET_TM_CSTMRankList), &CSTMRankListPacketFactory{})
// 比赛报名
common.RegisterHandler(int(tournament.TOURNAMENTID_PACKET_TM_CSSignRace), &CSSignRaceHandler{})
netlib.RegisterFactory(int(tournament.TOURNAMENTID_PACKET_TM_CSSignRace), &CSSignRacePacketFactory{})
common.RegisterHandler(int(tournament.TOURNAMENTID_PACKET_TM_CSTMSeasonInfo), &CSTMSeasonInfoHandler{})
netlib.RegisterFactory(int(tournament.TOURNAMENTID_PACKET_TM_CSTMSeasonInfo), &CSTMSeasonInfoPacketFactory{})
common.RegisterHandler(int(tournament.TOURNAMENTID_PACKET_TM_CSTMSeasonRank), &CSTMSeasonRankHandler{})
netlib.RegisterFactory(int(tournament.TOURNAMENTID_PACKET_TM_CSTMSeasonRank), &CSTMSeasonRankPacketFactory{})
common.RegisterHandler(int(tournament.TOURNAMENTID_PACKET_TM_CSTMSeasonAward), &CSTMSeasonAwardHandler{})
netlib.RegisterFactory(int(tournament.TOURNAMENTID_PACKET_TM_CSTMSeasonAward), &CSTMSeasonAwardPacketFactory{})
}