game_sync/worldsrv/action_server.go

792 lines
28 KiB
Go

package main
import (
"strconv"
"strings"
"time"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/goserver/core/task"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/proto"
gamehallproto "mongo.games.com/game/protocol/gamehall"
loginproto "mongo.games.com/game/protocol/login"
playerproto "mongo.games.com/game/protocol/player"
serverproto "mongo.games.com/game/protocol/server"
"mongo.games.com/game/srvdata"
)
func init() {
// 销毁房间
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_DESTROYSCENE), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWDestroyScene{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_DESTROYSCENE), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive GWDestroyScene:", pack)
if msg, ok := pack.(*serverproto.GWDestroyScene); ok {
SceneMgrSingleton.DestroyScene(int(msg.GetSceneId()), msg.GetIsCompleted())
}
return nil
}))
// 离开房间
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_PLAYERLEAVE), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWPlayerLeave{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_PLAYERLEAVE), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive GWPlayerLeave:", pack)
msg, ok := pack.(*serverproto.GWPlayerLeave)
if !ok {
return nil
}
scene := SceneMgrSingleton.GetScene(int(msg.GetRoomId()), true)
if scene == nil {
logger.Logger.Warnf("玩家离开房间,房间没找到 %v", pack)
return nil
}
p := PlayerMgrSington.GetPlayerBySnId(msg.GetPlayerId())
if p == nil {
logger.Logger.Warnf("玩家离开房间,玩家信息没找到 %v", pack)
return nil
}
data := msg.GetPlayerData()
if len(data) != 0 {
logger.Logger.Trace("GWPlayerLeave p.UnmarshalData(data)")
p.UnmarshalData(data, scene)
}
switch {
case scene.IsCoinScene():
if !CoinSceneMgrSingleton.PlayerLeave(p, int(msg.GetReason())) {
logger.Logger.Warnf("GWPlayerLeave snid:%v sceneid:%v gameid:%v modeid:%v [coinscene]",
p.SnId, scene.sceneId, scene.gameId, scene.gameMode)
}
case scene.IsHundredScene():
if !HundredSceneMgrSingleton.PlayerLeave(p, int(msg.GetReason())) {
logger.Logger.Warnf("GWPlayerLeave snid:%v sceneid:%v gameid:%v modeid:%v [hundredcene]",
p.SnId, scene.sceneId, scene.gameId, scene.gameMode)
}
default:
scene.PlayerLeave(p, int(msg.GetReason()))
}
if p.scene != nil {
logger.Logger.Errorf("after GWPlayerLeave found snid:%v sceneid:%v gameid:%v modeid:%v",
p.SnId, p.scene.sceneId, p.scene.gameId, p.scene.gameMode)
}
if scene.IsMatchScene() {
//结算积分
if !p.IsRob {
TournamentMgr.UpdateMatchInfo(p, msg.MatchId, int32(msg.GetReturnCoin()), int32(msg.GetCurIsWin()), msg.GetMatchRobotGrades())
} else {
p.matchCtx = nil
}
}
// 同步排位积分
if scene.IsRankMatch() {
if p.IsRob {
RankMgrSingleton.UpdateRobotSeason(p.Platform, p.SnId, scene.dbGameFree.GetRankType(),
msg.GetRankScore()[scene.dbGameFree.GetRankType()], p.Name, p.Sex, p.HeadUrl, p.Coin, p.PlayerData.GetRoleId())
} else {
if model.GameParamData.TestRankMatchAward {
if RankMgrSingleton.playerSeasons[p.SnId] != nil {
if RankMgrSingleton.playerSeasons[p.SnId].RankType == nil {
RankMgrSingleton.playerSeasons[p.SnId].RankType = make(map[int32]*model.PlayerRankInfo)
}
if RankMgrSingleton.playerSeasons[p.SnId].RankType[1] == nil {
RankMgrSingleton.playerSeasons[p.SnId].RankType[1] = &model.PlayerRankInfo{}
}
RankMgrSingleton.playerSeasons[p.SnId].RankType[1].LastScore = 7500
RankMgrSingleton.playerSeasons[p.SnId].RankType[1].Score = 7500
RankMgrSingleton.playerSeasons[p.SnId].RankType[1].Awards = nil
}
RankMgrSingleton.UpdatePlayerSeason(p.SnId, map[int32]int64{1: 10000})
} else {
RankMgrSingleton.UpdatePlayerSeason(p.SnId, msg.GetRankScore())
}
}
}
//更新玩家等级排行榜
LogChannelSingleton.WriteLog(&model.PlayerLevelInfo{
SnId: p.SnId,
Name: p.Name,
Level: p.Level,
Exp: p.Exp,
ModId: p.PlayerData.GetRoleId(),
Platform: p.Platform,
})
//比赛场不处理下面的内容
if !scene.IsMatchScene() && !scene.IsCustom() {
// 破产检测
sdata := srvdata.PBDB_GameSubsidyMgr.GetData(GameSubsidyid)
if sdata != nil {
if !p.IsRob && p.takeCoin > msg.GetReturnCoin() && p.takeCoin >= int64(sdata.LimitNum) && msg.GetReturnCoin() < int64(sdata.LimitNum) {
CostCoin := p.takeCoin - msg.GetReturnCoin()
logger.Logger.Infof("NewBankruptLogEx: snid:%v GetReturnCoin:%v coin:%v CostCoin:%v", p.SnId, msg.GetReturnCoin(), p.takeCoin, CostCoin)
log := model.NewBankruptLogEx(p.SnId, scene.dbGameFree.GetId(), p.CreateTime.Unix(), CostCoin, p.Platform, p.Channel, scene.gameId)
if log != nil {
LogChannelSingleton.WriteLog(log)
}
}
}
// 破产检测
oldCoin := p.Coin
//带回金币
if p.Coin != msg.GetReturnCoin() {
p.Coin = msg.GetReturnCoin()
if p.Coin < 0 {
p.Coin = 0
}
p.dirty = true
}
logger.Logger.Infof("SSPacketID_PACKET_GW_PLAYERLEAVE: snid:%v oldcoin:%v coin:%v", p.SnId, oldCoin, p.Coin)
p.diffData.Coin = -1 //强制更新金币
p.diffData.TotalConvertibleFlow = -1 //强制更新流水
p.SendDiffData() //只是把差异发给前端
gameCoinTs := msg.GetGameCoinTs()
if !p.IsRob && !scene.IsTestScene() {
//对账点同步
if p.GameCoinTs < gameCoinTs {
p.GameCoinTs = gameCoinTs
p.dirty = true
}
//破产统计
//if int(msg.GetReason()) == common.PlayerLeaveReason_Bekickout {
// if len(scene.paramsEx) > 0 {
// gameIdEx := scene.paramsEx[0]
// gps := PlatformMgrSingleton.GetGameFree(scene.limitPlatform.IdStr, scene.paramsEx[0])
// if gps != nil {
// lowLimit := gps.DbGameFree.GetLowerThanKick()
// if lowLimit != 0 && p.Coin+p.SafeBoxCoin < int64(lowLimit) {
// p.ReportBankRuptcy(int32(scene.gameId), int32(scene.gameMode), gameIdEx)
// }
// }
// }
//}
}
}
return nil
}))
// 观众离开房间
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_AUDIENCELEAVE), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWPlayerLeave{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_AUDIENCELEAVE), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive PACKET_GW_AUDIENCELEAVE GWPlayerLeave:", pack)
if msg, ok := pack.(*serverproto.GWPlayerLeave); ok {
scene := SceneMgrSingleton.GetScene(int(msg.GetRoomId()), true)
if scene != nil {
p := PlayerMgrSington.GetPlayerBySnId(msg.GetPlayerId())
if p != nil {
gameCoinTs := msg.GetGameCoinTs()
//带回的金币
if p.Coin != msg.GetReturnCoin() && !scene.IsMatchScene() {
p.Coin = msg.GetReturnCoin()
if p.Coin < 0 {
p.Coin = 0
}
p.dirty = true
}
//对账点同步
if p.GameCoinTs != gameCoinTs {
p.GameCoinTs = gameCoinTs
p.dirty = true
}
if scene.IsMatchScene() {
scene.AudienceLeave(p, int(msg.GetReason()))
} else {
CoinSceneMgrSingleton.PlayerLeave(p, int(msg.GetReason()))
}
//变化金币
p.dirty = true
p.diffData.Coin = -1 //强制更新金币
p.diffData.TotalConvertibleFlow = -1 //强制更新流水
p.SendDiffData()
} else {
//LocalRobotIdMgrSington.FreeId(msg.GetPlayerId())
}
}
}
return nil
}))
// 房间游戏开始
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_SCENESTART), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWSceneStart{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_SCENESTART), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive SSPacketID_PACKET_GW_SCENESTART GWSceneStart:", pack)
if msg, ok := pack.(*serverproto.GWSceneStart); ok {
scene := SceneMgrSingleton.GetScene(int(msg.GetRoomId()))
if scene != nil {
scene.starting = msg.GetStart()
scene.currRound = msg.GetCurrRound()
scene.totalRound = msg.GetMaxRound()
if scene.starting {
if scene.currRound == 1 {
scene.startTime = time.Now()
//p := PlayerMgrSington.GetPlayer(s.Sid)
}
}
if scene.starting {
logger.Logger.Trace("游戏开始------", scene.gameId, scene.sceneId, scene.replayCode, scene.currRound)
} else {
logger.Logger.Trace("游戏结束------", scene.gameId, scene.sceneId, scene.replayCode, scene.currRound)
}
}
}
return nil
}))
// 房间游戏状态
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_SCENESTATE), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWSceneState{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_SCENESTATE), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive SSPacketID_PACKET_GW_SCENESTATE GWSceneState:", pack)
if msg, ok := pack.(*serverproto.GWSceneState); ok {
scene := SceneMgrSingleton.GetScene(int(msg.GetRoomId()))
if scene != nil {
scene.sp.OnSceneState(scene, int(msg.GetRoomState()))
}
}
return nil
}))
// 用户状态同步 flag
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_PLAYERSTATE), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWPlayerFlag{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_PLAYERSTATE), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive GWPlayerFlag:", pack)
if msg, ok := pack.(*serverproto.GWPlayerFlag); ok {
player := PlayerMgrSington.GetPlayerBySnId(msg.GetSnId())
if player != nil {
player.flag = msg.GetFlag()
}
}
return nil
}))
// 房间服务器状态切换
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GB_STATE_SWITCH), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.ServerStateSwitch{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GB_STATE_SWITCH), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive SSPacketID_PACKET_GB_STATE_SWITCH ServerStateSwitch:", pack)
if sr, ok := pack.(*serverproto.ServerStateSwitch); ok {
srvid := int(sr.GetSrvId())
gameSess := GameSessMgrSington.GetGameSess(srvid)
if gameSess != nil {
if gameSess.state == common.GAME_SESS_STATE_ON {
gameSess.SwitchState(common.GAME_SESS_STATE_OFF)
} else {
gameSess.SwitchState(common.GAME_SESS_STATE_ON)
}
} else {
gateSess := GameSessMgrSington.GetGateSess(srvid)
if gateSess != nil {
if gateSess.state == common.GAME_SESS_STATE_ON {
gateSess.SwitchState(common.GAME_SESS_STATE_OFF)
} else {
gateSess.SwitchState(common.GAME_SESS_STATE_ON)
}
}
}
}
return nil
}))
// 游戏服务器的系统广播
// 捕鱼
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_NEWNOTICE), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWNewNotice{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_NEWNOTICE), netlib.HandlerWrapper(func(s *netlib.Session,
packetid int, pack interface{}) error {
logger.Logger.Trace("receive GWNewNotice:", pack)
if msg, ok := pack.(*serverproto.GWNewNotice); ok {
//立即发送改为定期发送,控制下广播包的频度
HorseRaceLampMgrSington.PushGameHorseRaceLamp(msg.GetCh(), msg.GetPlatform(), msg.GetContent(), int32(msg.GetMsgtype()), msg.GetIsrob(), msg.GetPriority())
}
return nil
}))
// 同步每局游戏那些玩家一起玩的
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_SCENEPLAYERLOG), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWScenePlayerLog{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_SCENEPLAYERLOG), netlib.HandlerWrapper(func(s *netlib.Session,
packetid int, pack interface{}) error {
logger.Logger.Trace("receive GWScenePlayerLog:", pack)
if msg, ok := pack.(*serverproto.GWScenePlayerLog); ok {
sceneLimitMgr.ReceiveData(msg.GetGameId(), msg.GetSnids())
}
return nil
}))
// 强制离开房间
// 返回房间失败
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_PLAYERFORCELEAVE), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWPlayerForceLeave{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_PLAYERFORCELEAVE), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
if msg, ok := pack.(*serverproto.GWPlayerForceLeave); ok {
logger.Logger.Warn("receive GWPlayerForceLeave:", msg)
scene := SceneMgrSingleton.GetScene(int(msg.GetRoomId()))
if scene != nil {
p := PlayerMgrSington.GetPlayerBySnId(msg.GetPlayerId())
if p != nil {
ctx := scene.GetPlayerGameCtx(p.SnId)
if ctx != nil && p.scene == scene && scene.HasPlayer(p) && ctx.enterTs == msg.GetEnterTs() {
switch {
case scene.IsCoinScene():
if !CoinSceneMgrSingleton.PlayerLeave(p, int(msg.GetReason())) {
logger.Logger.Warnf("GWPlayerForceLeave snid:%v sceneid:%v gameid:%v modeid:%v [coinscene]", p.SnId, scene.sceneId, scene.gameId, scene.gameMode)
}
case scene.IsHundredScene():
if !HundredSceneMgrSingleton.PlayerLeave(p, int(msg.GetReason())) {
logger.Logger.Warnf("GWPlayerForceLeave snid:%v sceneid:%v gameid:%v modeid:%v [hundredcene]", p.SnId, scene.sceneId, scene.gameId, scene.gameMode)
}
default:
scene.PlayerLeave(p, int(msg.GetReason()))
}
if p.scene != nil {
logger.Logger.Warnf("after GWPlayerForceLeave found snid:%v sceneid:%v gameid:%v modeid:%v", p.SnId, p.scene.sceneId, p.scene.gameId, p.scene.gameMode)
p.scene.PlayerLeave(p, int(msg.GetReason()))
}
} else {
logger.Logger.Warnf("GWPlayerForceLeave snid:%v sceneid:%v gameid:%v modeid:%v fount not p.scene==scene && scene.HasPlayer(p)", p.SnId, scene.sceneId, scene.gameId, scene.gameMode)
}
}
} else {
logger.Logger.Warnf("GWPlayerForceLeave snid:%v scene:%v had closed", msg.GetPlayerId(), msg.GetRoomId())
}
}
return nil
}))
//一局游戏一结算
//可处理以下业务
//1.同步玩家游戏场内的实时金币
//2.触发相关任务:统计有效下注金币数,赢取金币数,牌局次数等
//3.黑名单处理
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_PLAYERDATA), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWPlayerData{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_PLAYERDATA), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive GWPlayerBet:", pack)
if msg, ok := pack.(*serverproto.GWPlayerData); ok {
scene := SceneMgrSingleton.GetScene(int(msg.GetSceneId()))
if scene == nil {
return nil
}
for _, playerBet := range msg.GetDatas() {
player := PlayerMgrSington.GetPlayerBySnId(playerBet.GetSnId())
if player != nil && !player.IsRob {
// task 赢次数
if playerBet.GetGain() > 0 || playerBet.WinState == 1 {
TaskSubjectSingleton.Touch(common.TaskTypeWinTimes, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: 1,
})
if scene.IsRankMatch() {
TaskSubjectSingleton.Touch(common.TaskTypeRankMatchWinTimes, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: 1,
})
}
// 大众场
if common.IsDaZhong(scene.gameId) {
TaskSubjectSingleton.Touch(common.TaskTypeDaZhong, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: 1,
})
}
}
// task 游戏局数
TaskSubjectSingleton.Touch(common.TaskTypePlayTimes, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: 1,
})
// task 排位赛次数
if scene.IsRankMatch() {
TaskSubjectSingleton.Touch(common.TaskTypeRankMatchTimes, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: 1,
})
}
if !scene.IsMatchScene() { // 比赛没金币是积分
n := playerBet.GetGain()
if n < 0 {
n = -n
}
//游戏中输赢金币
TaskSubjectSingleton.Touch(common.TaskTypeWinOrLose, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: n,
})
// 游戏中赢金币
if playerBet.GetGain() > 0 || playerBet.WinState == 1 {
TaskSubjectSingleton.Touch(common.TaskTypeWinCoin, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: playerBet.GetGain(),
})
}
if playerBet.GetGain() < 0 && playerBet.WinState != 1 {
TaskSubjectSingleton.Touch(common.TaskTypeLoseCoin, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: playerBet.GetGain(),
})
}
}
//tienlen 游戏场次
if scene.dbGameFree.GameDif == common.GameDifTienlen {
TaskSubjectSingleton.Touch(common.TaskTypeTienlenCount, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: 1,
})
//tienlen 游戏输的金币
if playerBet.GetGain() < 0 && playerBet.WinState != 1 {
TaskSubjectSingleton.Touch(common.TaskTypeTienlenLoseCoin, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: playerBet.GetGain(),
})
}
// tienlen游戏中赢金币
if playerBet.GetGain() > 0 || playerBet.WinState == 1 {
TaskSubjectSingleton.Touch(common.TaskTypeTienlenWinCoin, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: playerBet.GetGain(),
})
}
if playerBet.GetGain() > 0 || playerBet.WinState == 1 {
TaskSubjectSingleton.Touch(common.TaskTypeTienlenWinTimes, &TaskData{
SnId: player.SnId,
GameID: scene.gameId,
GameFreeID: scene.dbGameFree.GetId(),
Num: 1,
})
}
}
if !scene.IsMatchScene() && !scene.IsCustom() { // 比赛没金币是积分
player.Coin = playerBet.GetCoin()
player.GameCoinTs = playerBet.GetGameCoinTs()
player.GameTax += playerBet.GetTax()
player.dirty = true
player.WBUpdate(playerBet.GetWBGain())
}
}
}
}
return nil
}))
//推送游戏的状态
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_GAMESTATE), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWGameState{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_GAMESTATE), netlib.HandlerWrapper(func(s *netlib.Session,
packetid int, pack interface{}) error {
logger.Logger.Trace("receive SSPacketID_PACKET_GW_GAMESTATE GWGameState:", pack)
if msg, ok := pack.(*serverproto.GWGameState); ok {
scene := SceneMgrSingleton.GetScene(int(msg.GetSceneId()))
if scene != nil {
scene.State = msg.GetState()
scene.StateSec = msg.GetSec()
//scene.BankerListNum = msg.GetBankerListNum()
if scene.State == scene.sp.GetBetState() {
scene.StateTs = msg.GetTs()
leftTime := int64(scene.StateSec) - (time.Now().Unix() - scene.StateTs)
if leftTime < 0 {
leftTime = 0
}
pack := &gamehallproto.SCGameState{}
pack.List = append(pack.List, &gamehallproto.GameState{
GameFreeId: proto.Int32(scene.dbGameFree.GetId()),
Ts: proto.Int64(leftTime),
Sec: proto.Int32(scene.StateSec),
})
gameStateMgr.BrodcastGameState(
int32(scene.gameId), scene.limitPlatform.IdStr, int(gamehallproto.GameHallPacketID_PACKET_SC_GAMESTATE), pack)
}
}
}
return nil
}))
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_JACKPOTLIST), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWGameJackList{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_JACKPOTLIST), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive SSPacketID_PACKET_GW_JACKPOTLIST GWGameJackList:", pack)
if msg, ok := pack.(*serverproto.GWGameJackList); ok {
FishJackListMgr.Insert(msg.GetCoin(), msg.GetSnId(), msg.GetRoomId(), msg.GetJackType(), msg.GetGameId(),
msg.GetPlatform(), msg.GetChannel(), msg.GetName())
}
return nil
}))
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_JACKPOTCOIN), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWGameJackCoin{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_JACKPOTCOIN), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive SSPacketID_PACKET_GW_JACKPOTCOIN GWGameJackCoin:", pack)
if msg, ok := pack.(*serverproto.GWGameJackCoin); ok {
for i, pl := range msg.Platform {
FishJackpotCoinMgr.Jackpot[pl] = msg.Coin[i]
}
}
return nil
}))
//强制换桌
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_GW_CHANGESCENEEVENT), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.GWChangeSceneEvent{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_GW_CHANGESCENEEVENT), netlib.HandlerWrapper(func(s *netlib.Session, packetid int, pack interface{}) error {
logger.Logger.Trace("receive SSPacketID_PACKET_GW_CHANGESCENEEVENT GWChangeSceneEvent:", pack)
if msg, ok := pack.(*serverproto.GWChangeSceneEvent); ok {
scene := SceneMgrSingleton.GetScene(int(msg.GetSceneId()))
if scene != nil {
//scene.PlayerTryChange()
}
}
return nil
}))
//玩家中转消息
netlib.RegisterFactory(int(serverproto.SSPacketID_PACKET_SS_REDIRECTTOPLAYER), netlib.PacketFactoryWrapper(func() interface{} {
return &serverproto.SSRedirectToPlayer{}
}))
netlib.RegisterHandler(int(serverproto.SSPacketID_PACKET_SS_REDIRECTTOPLAYER), netlib.HandlerWrapper(func(s *netlib.Session,
packetid int, pack interface{}) error {
logger.Logger.Trace("SSRedirectToPlayer Process recv ", pack)
if msg, ok := pack.(*serverproto.SSRedirectToPlayer); ok {
p := PlayerMgrSington.GetPlayerBySnId(msg.GetSnId())
if p == nil {
return nil
}
p.SendToClient(int(msg.GetPacketId()), msg.GetData())
}
return nil
}))
}
// 机器人服务器向worldsrv发送
type CSPMCmdPacketFactory struct {
}
type CSPMCmdHandler struct {
}
func (this *CSPMCmdPacketFactory) CreatePacket() interface{} {
pack := &playerproto.CSPMCmd{}
return pack
}
func (this *CSPMCmdHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPMCmdHandler Process recv ", data)
if msg, ok := data.(*playerproto.CSPMCmd); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Trace("CSPMCmdHandler p == nil")
return nil
}
if !p.IsRob && p.GMLevel < 3 {
logger.Logger.Trace("CSPMCmdHandler p.Channel != common.Channel_Rob && p.GMLevel < 3")
return nil
}
cmd := msg.GetCmd()
logger.Logger.Infof("CSPMCmdHandler %v %v", p.SnId, cmd)
args := strings.Split(cmd, common.PMCmd_SplitToken)
argsCnt := len(args)
if argsCnt != 0 {
switch args[0] {
case common.PMCmd_AddCoin:
if argsCnt > 1 {
coin, err := strconv.ParseInt(args[1], 10, 64) //strconv.Atoi(args[1])
if err != nil {
logger.Logger.Warnf("CSPMCmdHandler %v parse %v err:%v", p.SnId, cmd, err)
return nil
}
if coin != 0 {
p.CoinPayTotal += int64(coin)
p.dirty = true
p.AddCoin(coin, 0, common.GainWay_ByPMCmd, p.GetName(), cmd)
p.ReportSystemGiveEvent(int32(coin), common.GainWay_ByPMCmd, true)
p.SendDiffData()
}
}
case common.PMCmd_Privilege:
if p.GMLevel >= 3 {
if p.Flags&model.PLAYER_FLAGS_PRIVILEGE == 0 {
p.Flags |= model.PLAYER_FLAGS_PRIVILEGE
} else {
p.Flags &= ^model.PLAYER_FLAGS_PRIVILEGE
}
}
}
}
}
return nil
}
type CSRobotChgDataPacketFactory struct {
}
type CSRobotChgDataHandler struct {
}
func (this *CSRobotChgDataPacketFactory) CreatePacket() interface{} {
pack := &playerproto.CSRobotChgData{}
return pack
}
func (this *CSRobotChgDataHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSRobotChgDataHandler Process recv ", data)
if _, ok := data.(*playerproto.CSRobotChgData); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Trace("CSRobotChgDataHandler p == nil")
return nil
}
if !p.IsRob {
logger.Logger.Trace("CSRobotChgDataHandler !p.IsRob")
return nil
}
}
return nil
}
type CSAccountInvalidPacketFactory struct {
}
type CSAccountInvalidHandler struct {
}
func (this *CSAccountInvalidPacketFactory) CreatePacket() interface{} {
pack := &loginproto.CSAccountInvalid{}
return pack
}
func (this *CSAccountInvalidHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSAccountInvalidHandler Process recv ", data)
if _, ok := data.(*loginproto.CSAccountInvalid); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p != nil && p.IsRobot() {
snid := p.SnId
acc := p.AccountId
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
err := model.RemoveAccount(p.Platform, acc)
if err != nil {
logger.Logger.Error("Remove robot account data error:", err)
}
err = model.RemovePlayerByAcc(p.Platform, acc)
if err != nil {
logger.Logger.Error("Remove robot player data error:", err)
}
logger.Logger.Trace("CSAccountInvalid message remove :", acc)
return nil
}), task.CompleteNotifyWrapper(func(data interface{}, tt task.Task) {
PlayerMgrSington.DelPlayer(snid)
LoginStateMgrSington.DelAccountByAccid(acc)
return
}), "RemoveAccount").StartByFixExecutor("RemoveAccount")
}
}
return nil
}
func init() {
common.RegisterBoardCastHandler()
common.RegisterMulticastHandler()
common.RegisterHandler(int(playerproto.PlayerPacketID_PACKET_CS_PMCMD), &CSPMCmdHandler{})
netlib.RegisterFactory(int(playerproto.PlayerPacketID_PACKET_CS_PMCMD), &CSPMCmdPacketFactory{})
common.RegisterHandler(int(playerproto.PlayerPacketID_PACKET_CS_ROBOTCHGDATA), &CSRobotChgDataHandler{})
netlib.RegisterFactory(int(playerproto.PlayerPacketID_PACKET_CS_ROBOTCHGDATA), &CSRobotChgDataPacketFactory{})
common.RegisterHandler(int(loginproto.LoginPacketID_PACKET_CS_ACCOUNTINVALID), &CSAccountInvalidHandler{})
netlib.RegisterFactory(int(loginproto.LoginPacketID_PACKET_CS_ACCOUNTINVALID), &CSAccountInvalidPacketFactory{})
}
func init() {
// 同步道具数量
netlib.Register(int(serverproto.SSPacketID_PACKET_PlayerChangeItems), &serverproto.PlayerChangeItems{}, HandlePlayerChangeItems)
}
func HandlePlayerChangeItems(session *netlib.Session, packetId int, data interface{}) error {
logger.Logger.Tracef("HandlePlayerChangeItems recv %v", data)
msg, ok := data.(*serverproto.PlayerChangeItems)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayerBySnId(msg.GetSnId())
if p == nil {
return nil
}
var items []*model.Item
for _, v := range msg.GetItems() {
items = append(items, &model.Item{
ItemId: v.GetId(),
ItemNum: v.GetNum(),
})
}
_, _, ok = BagMgrSingleton.AddItems(&model.AddItemParam{
Platform: p.Platform,
SnId: p.SnId,
Change: items,
NoLog: msg.GetNoLog(),
})
if !ok {
logger.Logger.Errorf("HandlePlayerChangeItems add item failed %v", msg)
}
return nil
}