game_sync/worldsrv/action_game.go

1587 lines
47 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"fmt"
"math/rand"
"slices"
"sort"
"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"
"mongo.games.com/game/protocol/gamehall"
"mongo.games.com/game/protocol/server"
webapiproto "mongo.games.com/game/protocol/webapi"
"mongo.games.com/game/srvdata"
)
type CSEnterRoomPacketFactory struct {
}
type CSEnterRoomHandler struct {
}
func (this *CSEnterRoomPacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSEnterRoom{}
return pack
}
func (this *CSEnterRoomHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSEnterRoomHandler Process recv ", data)
msg, ok := data.(*gamehall.CSEnterRoom)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
var code = gamehall.OpResultCode_Game_OPRC_Sucess_Game
var sp ScenePolicy
var dbGameFree *server.DB_GameFree
var roomId int
var gameId int
var gameMode int
var cfg *webapiproto.GameFree
oldPlatform := p.Platform
// 进入原来的房间
scene := p.scene
if scene != nil {
code = gamehall.OpResultCode_Game_OPRC_GameStarting_Game
roomId = scene.sceneId
gameId = scene.gameId
gameMode = scene.gameMode
logger.Logger.Tracef("CSEnterRoomHandler had scene(%d)", scene.sceneId)
goto failed
}
// 房间查询
scene = SceneMgrSingleton.GetScene(int(msg.GetRoomId()))
if scene == nil {
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
logger.Logger.Trace("CSEnterRoomHandler scene == nil")
goto failed
}
gameId = scene.gameId
gameMode = scene.gameMode
roomId = scene.sceneId
if p.IsRob {
p.Platform = scene.platform.IdStr
}
cfg = PlatformMgrSingleton.GetGameFree(p.Platform, scene.dbGameFree.Id)
if cfg != nil && (cfg.GroupId != scene.groupId || cfg.GroupId == 0) {
if scene.platform != nil {
if scene.platform.Isolated && p.Platform != scene.platform.IdStr {
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
logger.Logger.Tracef("CSEnterRoomHandler ScenePolicy(gameid:%v mode:%v) scene.platform.Isolated && p.Platform != scene.platform.Name", scene.gameId, scene.gameMode)
goto failed
}
}
}
if scene.deleting {
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
logger.Logger.Trace("CSEnterRoomHandler scene is deleting")
goto failed
}
if scene.closed {
code = gamehall.OpResultCode_Game_OPRC_RoomHadClosed_Game
logger.Logger.Trace("CSEnterRoomHandler scene is closed")
goto failed
}
// 密码是否正确
if scene.GetPassword() != "" && scene.GetPassword() != msg.GetPassword() {
code = gamehall.OpResultCode_Game_OPRC_PasswordError
logger.Logger.Trace("CSEnterRoomHandler password error")
goto failed
}
// 房费是否充足
if scene.IsCustom() {
cfg := PlatformMgrSingleton.GetConfig(p.Platform).RoomConfig[scene.CustomParam.RoomConfigId]
if scene.CustomParam.CostType == 1 && !scene.sp.CostEnough(int(scene.CustomParam.CostType), scene.playerNum, cfg, p.SnId) {
code = gamehall.OpResultCode_Game_OPRC_CostNotEnough
logger.Logger.Trace("CSEnterRoomHandler cost error")
goto failed
}
}
dbGameFree = scene.dbGameFree
if dbGameFree != nil {
if common.IsLocalGame(scene.gameId) {
if !p.IsRob {
limitCoin := srvdata.CreateRoomMgrSington.GetLimitCoinByBaseScore(int32(scene.gameId), scene.dbGameFree.GetSceneType(), scene.BaseScore)
if p.Coin < limitCoin {
code = gamehall.OpResultCode_Game_OPRC_CoinNotEnough_Game
logger.Logger.Trace("CSEnterRoomHandler scene is closed")
goto failed
}
}
}
}
//检测房间状态是否开启
if !scene.IsMatchScene() && !PlatformMgrSingleton.CheckGameState(scene.platform.IdStr, dbGameFree.Id) {
code = gamehall.OpResultCode_Game_OPRC_GameHadClosed
logger.Logger.Tracef("CSEnterRoomHandler SnId:%v GameFreeId:%v GameHadClosed", p.SnId, dbGameFree.Id)
goto failed
}
sp = GetScenePolicy(scene.gameId, scene.gameMode)
if sp == nil {
code = gamehall.OpResultCode_Game_OPRC_GameNotExist_Game
logger.Logger.Tracef("CSEnterRoomHandler ScenePolicy(gameid:%v mode:%v) not registe", scene.gameId, scene.gameMode)
goto failed
}
if reason := sp.CanEnter(scene, p.SnId); reason != 0 {
code = gamehall.OpResultCode_Game(reason)
logger.Logger.Trace("CSEnterRoomHandler sp.CanEnter(scene, p) reason ", reason)
goto failed
}
if scene.IsFull() {
code = gamehall.OpResultCode_Game_OPRC_RoomIsFull_Game
logger.Logger.Trace("CSEnterRoomHandler ScenePolicy.IsFull = true")
goto failed
}
if scene.IsMatchScene() && p.IsRob {
grade := int32(1000)
snid := p.SnId
roleId := int32(2000001)
if p.Roles != nil {
roleId = p.Roles.ModId
}
skinId := int32(300001)
var tm *TmMatch
if scene.MatchSortId > 0 {
tm = TournamentMgr.GetTm(scene.MatchSortId)
if tm != nil && tm.copyRobotGrades != nil && len(tm.copyRobotGrades) > 0 {
randIndex := rand.Intn(len(tm.copyRobotGrades))
grade = tm.copyRobotGrades[randIndex].grade
snid = tm.copyRobotGrades[randIndex].copySnid
roleId = tm.copyRobotGrades[randIndex].copyRoleId
skinId = tm.copyRobotGrades[randIndex].CopySkinId
tm.copyRobotGrades = append(tm.copyRobotGrades[:randIndex], tm.copyRobotGrades[randIndex+1:]...)
}
}
mc := NewMatchContext(p, tm, grade, snid, 1, roleId, skinId, 0)
if mc != nil {
mc.gaming = true
p.matchCtx = mc
}
}
if !scene.PlayerEnter(p, -1, true) {
code = gamehall.OpResultCode_Game_OPRC_Error_Game
}
failed:
if code != gamehall.OpResultCode_Game_OPRC_Sucess_Game {
resp := &gamehall.SCEnterRoom{
GameId: proto.Int(gameId),
ModeType: proto.Int(gameMode),
RoomId: proto.Int(roomId),
OpRetCode: code,
}
p.Platform = oldPlatform
proto.SetDefaults(resp)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_ENTERROOM), resp)
}
return nil
}
type CSReturnRoomPacketFactory struct {
}
type CSReturnRoomHandler struct {
}
func (this *CSReturnRoomPacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSReturnRoom{}
return pack
}
func (this *CSReturnRoomHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSReturnRoomHandler Process recv ", data)
if msg, ok := data.(*gamehall.CSReturnRoom); ok {
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
scene := p.scene
pack := &gamehall.SCReturnRoom{}
if scene == nil {
//miniGameScene := MiniGameMgrSington.GetAllSceneByPlayer(p)
isExist := false
//for _, s := range miniGameScene {
// if s.sceneId == int(msg.GetRoomId()) {
// isExist = true
// }
//}
if isExist {
//如果存在这尝试返回到房间内
//MiniGameMgrSington.OnPlayerReturnScene(p)
} else {
pack.OpRetCode = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
//如果不存在则直接返回
goto done
}
} else {
pack.RoomId = proto.Int(scene.sceneId)
pack.GameId = proto.Int(scene.gameId)
pack.ModeType = proto.Int(scene.gameMode)
pack.Params = common.CopySliceInt64ToInt32(scene.params)
pack.HallId = proto.Int32(scene.dbGameFree.GetId())
gameVers := srvdata.GetGameVers(p.PackageID)
if ver, ok := gameVers[fmt.Sprintf("%v,%v", scene.gameId, p.Channel)]; ok {
pack.MinApkVer = proto.Int32(ver.MinApkVer)
pack.MinResVer = proto.Int32(ver.MinResVer)
pack.LatestApkVer = proto.Int32(ver.LatestApkVer)
pack.LatestResVer = proto.Int32(ver.LatestResVer)
if msg.GetApkVer() < ver.MinApkVer {
pack.OpRetCode = gamehall.OpResultCode_Game_OPRC_YourAppVerIsLow_Game
goto done
}
if msg.GetResVer() < ver.MinResVer {
pack.OpRetCode = gamehall.OpResultCode_Game_OPRC_YourResVerIsLow_Game
goto done
}
}
scene = p.ReturnScene(msg.GetIsLoaded())
if scene == nil {
pack.OpRetCode = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
} else {
//成功返回房间的消息在gamesrv上发送为了确保房间消息的顺序
return nil
//pack.OpRetCode = gamehall.OpResultCode_Game_OPRC_Sucess_Game
}
}
done:
proto.SetDefaults(pack)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_RETURNROOM), pack)
}
return nil
}
type CSQueryRoomInfoPacketFactory struct {
}
type CSQueryRoomInfoHandler struct {
}
func (this *CSQueryRoomInfoPacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSQueryRoomInfo{}
return pack
}
func (this *CSQueryRoomInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
//msg, ok := data.(*gamehall.CSQueryRoomInfo)
//if !ok {
// return nil
//}
//if len(msg.GetId()) > 0 {
// return this.ProcessId(s, packetid, data, sid)
//}
return this.ProcessLocalGame(s, packetid, data, sid)
}
func (this *CSQueryRoomInfoHandler) ProcessLocalGame(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSQueryRoomInfoHandler Process recv ProcessLocalGame", data)
if msg, ok := data.(*gamehall.CSQueryRoomInfo); ok {
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
logger.Logger.Warn("CSQueryRoomInfoHandler p == nil")
return nil
}
pack := &gamehall.SCQueryRoomInfo{
GameSite: proto.Int32(msg.GetGameSite()),
}
mapGameCfg := PlatformMgrSingleton.GetGameFrees(p.Platform)
for _, gameid := range msg.GetGameIds() {
pack.GameIds = append(pack.GameIds, gameid)
scenes := SceneMgrSingleton.GetScenesByGame(int(gameid))
for _, scene := range scenes {
if scene == nil {
continue
}
var isShow bool
if mapGameCfg != nil {
if cfg, have := mapGameCfg[scene.dbGameFree.Id]; have && cfg.GroupId != 0 && cfg.GroupId == scene.groupId {
isShow = true
}
}
if p.Platform == scene.platform.IdStr || isShow {
if scene.sceneMode == int(msg.GetSceneMode()) && len(scene.players) != 0 {
if scene.gameId == int(gameid) && scene.dbGameFree.GetSceneType() == msg.GetGameSite() {
// 私人房需要是好友
if scene.sceneMode == common.SceneModePrivate {
if !FriendMgrSington.IsFriend(p.Platform, p.SnId, scene.creator) {
continue
}
}
roomInfo := &gamehall.QRoomInfo{
GameFreeId: proto.Int32(scene.dbGameFree.GetId()),
GameId: proto.Int32(scene.dbGameFree.GetGameId()),
RoomId: proto.Int(scene.sceneId),
BaseCoin: proto.Int64(int64(scene.BaseScore)),
LimitCoin: proto.Int64(scene.dbGameFree.GetLimitCoin()),
CurrNum: proto.Int(scene.GetPlayerCnt()),
MaxPlayer: proto.Int(scene.playerNum),
Creator: proto.Int32(scene.creator),
CreateTs: proto.Int32(int32(scene.createTime.Unix())),
Params: common.CopySliceInt64ToInt32(scene.params),
}
pack.RoomInfo = append(pack.RoomInfo, roomInfo)
}
}
}
}
}
pack.OpRetCode = gamehall.OpResultCode_Game_OPRC_Sucess_Game
proto.SetDefaults(pack)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_QUERYROOMINFO), pack)
logger.Logger.Trace("SCQueryRoomInfo: ", pack)
}
return nil
}
// 获取指定游戏配置 包括分场信息
type CSGetGameConfigPacketFactory struct {
}
type CSGetGameConfigHandler struct {
}
func (this *CSGetGameConfigPacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSGetGameConfig{}
return pack
}
func (this *CSGetGameConfigHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGetGameConfigHandler Process recv ", data)
if msg, ok := data.(*gamehall.CSGetGameConfig); ok {
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
logger.Logger.Warn("CSGetGameConfigHandler p == nil")
return nil
}
plf := msg.GetPlatform()
if plf == "" {
logger.Logger.Warn("CSGetGameConfigHandler plf == ''")
return nil
}
chl := msg.GetChannel()
if chl == "" {
logger.Logger.Warn("CSGetGameConfigHandler chl == ''")
return nil
}
gameId := msg.GetGameId()
if gameId == 0 {
logger.Logger.Warn("CSGetGameConfigHandler gameId == 0")
return nil
}
p.SendGameConfig(gameId, plf, chl)
}
return nil
}
// 进入游戏操作
type CSEnterGamePacketFactory struct {
}
type CSEnterGameHandler struct {
}
func (this *CSEnterGamePacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSEnterGame{}
return pack
}
func (this *CSEnterGameHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSEnterGameHandler Process recv ", data)
msg, ok := data.(*gamehall.CSEnterGame)
if !ok {
return nil
}
gameId := msg.GetId() //gameid
if gameId > 10000 {
gameId = msg.GetId() / 10000 //gamefreeid
}
if common.IsLocalGame(int(gameId)) {
return this.ProcessLocal(s, packetid, data, sid)
}
return this.ProcessNormal(s, packetid, data, sid)
}
func (this *CSEnterGameHandler) ProcessLocal(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSEnterGameHandler ProcessLocal recv ", data)
msg, ok := data.(*gamehall.CSEnterGame)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
// 返回消息
var ret gamehall.OpResultCode_Game
pack := &gamehall.SCEnterGame{
Id: msg.Id,
}
oldPlatform := p.Platform
sendEnterGame := func() {
//机器人要避免身上的平台标记被污染
if p.IsRob {
if ret != gamehall.OpResultCode_Game_OPRC_Sucess_Game {
p.Platform = oldPlatform
}
}
pack.OpCode = ret
proto.SetDefaults(pack)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_ENTERGAME), pack)
}
// 进入原房间
if p.scene != nil {
if p.thrscene > 0 {
ret = gamehall.OpResultCode_Game_OPRC_InOtherGameIng_Game
sendEnterGame()
return nil
}
logger.Logger.Warnf("CSEnterGameHandler found snid:%v had in scene:%v gameid:%v", p.SnId, p.scene.sceneId, p.scene.gameId)
p.ReturnScene(true)
return nil
}
// 获取gameId
gameId := msg.GetId() //gameid
if gameId > 10000 {
gameId = msg.GetId() / 10000 //gamefreeid
}
// 本地游戏入场规则
playerTakeCoin := p.Coin
gameSite := srvdata.CreateRoomMgrSington.GetGameSiteByGameId(gameId, playerTakeCoin)
if gameSite == 0 {
ret = gamehall.OpResultCode_Game_OPRC_CoinNotEnough_Game
sendEnterGame()
return nil
}
gamefreeid := gameId*10000 + gameSite
gps := PlatformMgrSingleton.GetGameFree(p.Platform, gamefreeid)
if gps == nil {
ret = gamehall.OpResultCode_Game_OPRC_RoomHadClosed_Game
sendEnterGame()
return nil
}
dbGameFree := gps.DbGameFree
var roomId int32
params := msg.GetOpParams()
if dbGameFree == nil {
ret = gamehall.OpResultCode_Game_OPRC_RoomHadClosed_Game
sendEnterGame()
return nil
}
if len(params) != 0 {
roomId = params[0]
platformName := SceneMgrSingleton.GetPlatformBySceneId(int(roomId))
if p.IsRob {
if platformName != "" {
p.Platform = platformName
}
} else if p.GMLevel > 0 && p.Platform == platformName { //允许GM直接按房间ID进场
roomId = params[0]
}
}
if len(msg.GetPlatform()) > 0 && p.IsRob {
p.Platform = msg.GetPlatform()
}
if len(params) != 0 && (p.GMLevel > 0 || dbGameFree.GetCreateRoomNum() != 0) { //允许GM|或者可选房间的游戏直接按房间ID进场
s := SceneMgrSingleton.GetScene(int(params[0]))
if s != nil {
if s.platform.IdStr == p.Platform || (gps.GroupId != 0 && s.groupId == gps.GroupId) {
roomId = params[0]
}
}
}
excludeSceneIds := p.lastSceneId[gamefreeid]
ret = gamehall.OpResultCode_Game(CoinSceneMgrSingleton.PlayerEnter(p, gamefreeid, roomId, excludeSceneIds, true))
if p.scene != nil {
pack.OpParams = append(pack.OpParams, int32(p.scene.sceneId))
// 有房间还进入失败尝试returnroom
if ret != gamehall.OpResultCode_Game_OPRC_Sucess_Game {
p.ReturnScene(true)
return nil
}
}
sendEnterGame()
return nil
}
func (this *CSEnterGameHandler) ProcessNormal(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSEnterGameHandler ProcessNormal recv ", data)
msg, ok := data.(*gamehall.CSEnterGame)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
// 返回消息
var ret gamehall.OpResultCode_Game
pack := &gamehall.SCEnterGame{
Id: msg.Id,
}
oldPlatform := p.Platform
sendEnterGame := func() {
//机器人要避免身上的平台标记被污染
if p.IsRob {
if ret != gamehall.OpResultCode_Game_OPRC_Sucess_Game {
p.Platform = oldPlatform
}
}
pack.OpCode = ret
proto.SetDefaults(pack)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_ENTERGAME), pack)
}
// 进入原房间
if p.scene != nil {
if p.thrscene > 0 {
ret = gamehall.OpResultCode_Game_OPRC_InOtherGameIng_Game
sendEnterGame()
return nil
}
logger.Logger.Warnf("CSEnterGameHandler found snid:%v had in scene:%v gameid:%v", p.SnId, p.scene.sceneId, p.scene.gameId)
p.ReturnScene(true)
return nil
}
// 其他游戏入场规则
gps := PlatformMgrSingleton.GetGameFree(p.Platform, msg.GetId())
if gps == nil {
ret = gamehall.OpResultCode_Game_OPRC_RoomHadClosed_Game
sendEnterGame()
return nil
}
dbGameFree := gps.DbGameFree
if dbGameFree == nil {
ret = gamehall.OpResultCode_Game_OPRC_RoomHadClosed_Game
sendEnterGame()
return nil
}
gameType := dbGameFree.GetGameType()
var roomId int32
params := msg.GetOpParams() // 0:房间id
switch {
case common.IsHundredType(gameType):
if len(params) != 0 {
roomId = params[0]
platform := SceneMgrSingleton.GetPlatformBySceneId(int(roomId))
if p.IsRob {
if platform != "" {
p.Platform = platform
}
} else if p.GMLevel > 0 && p.Platform == platform { //允许GM直接按房间ID进场
roomId = params[0]
}
}
if len(params) != 0 && p.GMLevel > 0 { //允许GM直接按房间ID进场
s := SceneMgrSingleton.GetScene(int(params[0]))
if s != nil {
if s.platform.IdStr == p.Platform || (s.groupId != 0 && s.groupId == gps.GroupId) {
roomId = params[0]
}
}
}
ret = gamehall.OpResultCode_Game(HundredSceneMgrSingleton.PlayerEnter(p, msg.GetId()))
if p.scene != nil {
pack.OpParams = append(pack.OpParams, msg.GetId())
if ret != gamehall.OpResultCode_Game_OPRC_Sucess_Game {
p.ReturnScene(true)
return nil
}
}
case common.IsCoinSceneType(gameType):
if len(params) != 0 {
roomId = params[0]
platformName := SceneMgrSingleton.GetPlatformBySceneId(int(roomId))
if p.IsRob {
if platformName != "" {
p.Platform = platformName
}
} else if p.GMLevel > 0 && p.Platform == platformName { //允许GM直接按房间ID进场
roomId = params[0]
}
}
if len(msg.GetPlatform()) > 0 && p.IsRob {
p.Platform = msg.GetPlatform()
}
if len(params) != 0 && (p.GMLevel > 0 || dbGameFree.GetCreateRoomNum() != 0) { //允许GM|或者可选房间的游戏直接按房间ID进场
s := SceneMgrSingleton.GetScene(int(params[0]))
if s != nil {
if s.platform.IdStr == p.Platform || (gps.GroupId != 0 && s.groupId == gps.GroupId) {
roomId = params[0]
}
}
}
excludeSceneIds := p.lastSceneId[msg.GetId()]
ret = gamehall.OpResultCode_Game(CoinSceneMgrSingleton.PlayerEnter(p, msg.GetId(), roomId, excludeSceneIds, true))
if p.scene != nil {
pack.OpParams = append(pack.OpParams, int32(p.scene.sceneId))
if ret != gamehall.OpResultCode_Game_OPRC_Sucess_Game {
p.ReturnScene(true)
return nil
}
}
default:
}
sendEnterGame()
return nil
}
// 退出游戏操作
type CSQuitGamePacketFactory struct {
}
type CSQuitGameHandler struct {
}
func (this *CSQuitGamePacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSQuitGame{}
return pack
}
func (this *CSQuitGameHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSQuitGameHandler Process recv ", data)
if msg, ok := data.(*gamehall.CSQuitGame); ok {
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p != nil {
var ret gamehall.OpResultCode_Game
pack := &gamehall.SCQuitGame{
Id: msg.Id,
}
dbGameFree := srvdata.PBDB_GameFreeMgr.GetData(msg.GetId())
gameType := dbGameFree.GetGameType()
if common.IsHundredType(gameType) {
ret = gamehall.OpResultCode_Game(HundredSceneMgrSingleton.PlayerTryLeave(p))
if gamehall.OpResultCode_Game_OPRC_OpYield_Game == ret {
return nil
}
} else if common.IsCoinSceneType(gameType) {
ret = gamehall.OpResultCode_Game(CoinSceneMgrSingleton.PlayerTryLeave(p, msg.IsAudience))
if gamehall.OpResultCode_Game_OPRC_OpYield_Game == ret {
return nil
}
}
pack.OpCode = ret
proto.SetDefaults(pack)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_QUITGAME), pack)
logger.Logger.Tracef("SCQuitGame: %v", pack)
}
}
return nil
}
type CSCreateRoomPacketFactory struct {
}
type CSCreateRoomHandler struct {
}
func (this *CSCreateRoomPacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSCreateRoom{}
return pack
}
func (this *CSCreateRoomHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSCreateRoomHandler Process recv ", data)
msg, ok := data.(*gamehall.CSCreateRoom)
if !ok {
return nil
}
switch {
case common.IsLocalGame(int(msg.GetGameId())):
return this.ProcessLocalGame(s, packetid, data, sid)
default:
logger.Logger.Errorf("CSCreateRoomHandler no create function %v", msg.GetGameId())
return nil
}
}
func (this *CSCreateRoomHandler) ProcessLocalGame(s *netlib.Session, packetid int, data interface{}, sid int64) error {
msg, ok := data.(*gamehall.CSCreateRoom)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
var code gamehall.OpResultCode_Game
var betRange []int32
var inRange bool
var dbCreateRoom *server.DB_Createroom
var dbGameFree *server.DB_GameFree
var dbGameRule *server.DB_GameRule
var playerTakeCoin = p.GetCoin()
var maxPlayerNum = int(msg.GetMaxPlayerNum())
var gameId = msg.GetGameId()
var params = common.CopySliceInt32ToInt64(msg.GetParams())
var roomId int
var scene *Scene
var sp ScenePolicy
var gamefreeId int32
var gameSite int32
var csp *CoinScenePool
var baseScore int32
var gps *webapiproto.GameFree
//根据携带金额取可创房间 DB_Createroom
arrs := srvdata.PBDB_CreateroomMgr.Datas.Arr
for i := len(arrs) - 1; i >= 0; i-- {
if arrs[i].GetGameId() == msg.GetGameId() {
goldRange := arrs[i].GoldRange
if len(goldRange) == 0 {
continue
}
if playerTakeCoin >= int64(goldRange[0]) {
dbCreateRoom = arrs[i]
break
}
}
}
if dbCreateRoom == nil {
code = gamehall.OpResultCode_Game_OPRC_GameNotExist_Game
logger.Logger.Tracef("CSCreateRoomHandler SnId:%v GameFreeId:%v not exist", p.SnId, dbCreateRoom)
goto failed
}
//校验下gameid
if dbCreateRoom.GetGameId() != gameId {
code = gamehall.OpResultCode_Game_OPRC_GameNotExist_Game
logger.Logger.Tracef("CSCreateRoomHandler PBDB_Createroom Id:%v GameId:%v not exist", dbCreateRoom.GetGameId(), gameId)
goto failed
}
gameSite = dbCreateRoom.GetGameSite()
gamefreeId = gameId*10000 + gameSite
gps = PlatformMgrSingleton.GetGameFree(p.Platform, gamefreeId)
if gps == nil {
code = gamehall.OpResultCode_Game_OPRC_GameNotExist_Game
logger.Logger.Tracef("CSCreateRoomHandler SnId:%v GameFreeId:%v not exist", p.SnId, gamefreeId)
goto failed
}
dbGameFree = gps.DbGameFree
//dbGameFree = srvdata.PBDB_GameFreeMgr.GetData(gamefreeId)
if dbGameFree == nil {
code = gamehall.OpResultCode_Game_OPRC_GameNotExist_Game
logger.Logger.Tracef("CSCreateRoomHandler SnId:%v GameFreeId:%v not exist", p.SnId, gamefreeId)
goto failed
}
//检测房间状态是否开启
if !PlatformMgrSingleton.CheckGameState(p.Platform, dbGameFree.Id) {
code = gamehall.OpResultCode_Game_OPRC_GameHadClosed
logger.Logger.Tracef("CSCreateRoomHandler SnId:%v GameFreeId:%v GameHadClosed", p.SnId, gamefreeId)
goto failed
}
dbGameRule = srvdata.PBDB_GameRuleMgr.GetData(dbGameFree.GetGameRule())
if dbGameRule == nil {
code = gamehall.OpResultCode_Game_OPRC_GameNotExist_Game
logger.Logger.Tracef("CSCreateRoomHandler SnId:%v GameFreeId:%v gamerule not exist", p.SnId, gamefreeId)
goto failed
}
if len(params) == 0 {
params = common.CopySliceInt32ToInt64(dbGameRule.GetParams())
}
sp = GetScenePolicy(int(dbGameFree.GetGameId()), int(dbGameFree.GetGameMode()))
if sp == nil {
code = gamehall.OpResultCode_Game_OPRC_GameNotExist_Game
logger.Logger.Tracef("CSCreateRoomHandler SnId:%v ScenePolicy(gameid:%v mode:%v) not registe", p.SnId, dbGameFree.GetGameId(), dbGameFree.GetGameMode())
goto failed
}
if p.scene != nil {
code = gamehall.OpResultCode_Game_OPRC_RoomHadExist_Game
logger.Logger.Tracef("CSCreateRoomHandler had scene(%d)", p.scene.sceneId)
goto failed
}
//校验底分
betRange = dbCreateRoom.GetBetRange()
inRange = false
for _, bet := range betRange {
if msg.GetBaseCoin() == bet {
inRange = true
break
}
}
if !inRange || msg.GetBaseCoin() == 0 {
code = gamehall.OpResultCode_Game_OPRC_Error_Game
logger.Logger.Tracef("CSCreateRoomHandler BaseCoin:%v not in BetRange ", msg.GetBaseCoin())
goto failed
}
//修正底注
baseScore = msg.GetBaseCoin()
// 如果人数为0人数从建房参数中获取如果没有就用gameconfig中的默认最大人数
// 再添加新游戏人数放在建房参数params中
//校验人数
maxPlayerNum = int(msg.GetMaxPlayerNum())
if maxPlayerNum != 4 && maxPlayerNum != 2 {
code = gamehall.OpResultCode_Game_OPRC_Error_Game
logger.Logger.Tracef("CSCreateRoomHandler GameId_TienLen_maxPlayerNum:%v ", maxPlayerNum)
maxPlayerNum = 0
}
if srvdata.GameFreeMgr.IsGameDif(dbGameFree.GetGameId(), common.GameDifThirteen) {
switch msg.GetMaxPlayerNum() {
case 1:
maxPlayerNum = 8
default:
maxPlayerNum = 4
}
}
//创建房间
csp = CoinSceneMgrSingleton.GetCoinScenePool(p.GetPlatform().IdStr, dbGameFree.GetId())
roomId = SceneMgrSingleton.GenOneCoinSceneId()
if roomId == common.RANDID_INVALID {
code = gamehall.OpResultCode_Game_OPRC_AllocRoomIdFailed_Game
logger.Logger.Tracef("CSCreateRoomHandler SnId:%v GameId:%v sceneId == -1 ", p.SnId, gameId)
goto failed
}
scene = SceneMgrSingleton.CreateScene(&CreateSceneParam{
CreateId: p.SnId,
RoomId: roomId,
SceneMode: int(msg.GetSceneMode()),
Params: params,
Platform: p.GetPlatform(),
GF: dbGameFree,
PlayerNum: int32(maxPlayerNum),
BaseScore: baseScore,
})
if scene == nil {
logger.Logger.Tracef("CSCreateRoomHandler CreateScene fail SnId:%v GameId:%v", p.SnId, gameId)
code = gamehall.OpResultCode_Game_OPRC_Error_Game
goto failed
}
logger.Logger.Tracef("CSCreateRoomHandler SnId:%v Create Sucess GameId:%v", p.SnId, gameId)
csp.AddScene(scene)
if !scene.PlayerEnter(p, -1, true) {
code = gamehall.OpResultCode_Game_OPRC_Error_Game
}
failed:
resp := &gamehall.SCCreateRoom{
GameId: msg.GetGameId(),
BaseCoin: msg.GetBaseCoin(),
SceneMode: msg.GetSceneMode(),
MaxPlayerNum: msg.GetMaxPlayerNum(),
Params: msg.GetParams(),
OpRetCode: code,
}
proto.SetDefaults(resp)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_CREATEROOM), resp)
return nil
}
// 观众坐下
type CSAudienceSitPacketFactory struct {
}
type CSAudienceSitHandler struct {
}
func (this *CSAudienceSitPacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSAudienceSit{}
return pack
}
func (this *CSAudienceSitHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSAudienceSitHandler Process recv ", data)
if msg, ok := data.(*gamehall.CSAudienceSit); ok {
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
logger.Logger.Warn("CSAudienceSitHandler p == nil")
return nil
}
if p.scene == nil {
logger.Logger.Warn("CSAudienceSitHandler scene == nil")
return nil
}
if int32(p.scene.sceneId) != msg.GetRoomId() {
logger.Logger.Warn("CSAudienceSitHandler sceneId != roomId")
return nil
}
newPlayer := PlayerMgrSington.GetPlayerBySnId(p.SnId)
if newPlayer != nil {
pack := &gamehall.SCAudienceSit{
RoomId: proto.Int32(msg.GetRoomId()),
}
if !p.scene.IsTestScene() {
// 入场限额检查
limitCoin := srvdata.CreateRoomMgrSington.GetLimitCoinByBaseScore(int32(p.scene.gameId), p.scene.dbGameFree.GetSceneType(), p.scene.BaseScore)
if p.Coin < limitCoin {
pack.OpCode = gamehall.OpResultCode_Game_OPRC_MoneyNotEnough_Game
newPlayer.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_AUDIENCESIT), pack)
return nil
}
}
// 是否还有空座位
if p.scene.IsFull() {
pack.OpCode = gamehall.OpResultCode_Game_OPRC_RoomIsFull_Game
newPlayer.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_AUDIENCESIT), pack)
return nil
}
p.scene.AudienceSit(newPlayer, -1)
pack.OpCode = gamehall.OpResultCode_Game_OPRC_Sucess_Game
newPlayer.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_AUDIENCESIT), pack)
}
}
return nil
}
// 我的游戏信息及平台公告
type CSRecordAndNoticePacketFactory struct {
}
type CSRecordAndNoticeHandler struct {
}
func (this *CSRecordAndNoticePacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSRecordAndNotice{}
return pack
}
func (this *CSRecordAndNoticeHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSRecordAndNoticeHandler Process recv ", data)
msg, ok := data.(*gamehall.CSRecordAndNotice)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
logger.Logger.Warn("CSRecordAndNoticeHandler p == nil")
return nil
}
pack := &gamehall.SCRecordAndNotice{
OpCode: gamehall.OpResultCode_Game_OPRC_Sucess_Game,
}
switch msg.GetOpt() {
case 0:
// 公告
list := PlatformMgrSingleton.GetCommonNotice(p.Platform)
if list != nil {
for _, v := range list.List {
pack.List = append(pack.List, &gamehall.CommonNotice{
Sort: v.Sort, // 排序 第几位
Title: v.Title, // 标题
Content: v.Content, // 内容
TypeName: v.TypeName, // 大标题
Type: v.Type, // 大标题类型
StartTime: int32(v.StartTime), // 开始显示时间
EndTime: int32(v.EndTime), // 结束显示时间
CategoryType: v.CategoryType,
ImgUrl: v.ImgUrl,
NoticeId: v.NoticeId,
IsLoop: v.IsLoop,
LoopTime: v.LoopTime,
OnChannelName: v.OnChannelName,
Url: v.Url,
})
}
}
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_COMNOTICE), pack)
logger.Logger.Trace("CSRecordAndNoticeHandler Process send ", pack)
case 1:
// 战绩日期列表
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
gdi := model.GetPlayerExistListByTs(p.SnId, p.Platform, msg.StartTime, 7)
return &gdi
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if data != nil && data.(*[]int64) != nil {
gamets := data.(*[]int64)
pack.GlistTs = append(pack.GlistTs, *gamets...)
} else {
pack.OpCode = gamehall.OpResultCode_Game_OPRC_Error_Game
}
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_COMNOTICE), pack)
}), "SCRecordAndNotice").Start()
case 2:
// 当日战绩
starttime := msg.StartTime
time := time.Unix(starttime, 0)
endtime := time.AddDate(0, 0, 1).Unix() - 1 //23:59:59
var list model.GamePlayerListType
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
list = model.GetPlayerListByHallExAPI(p.SnId, p.Platform, starttime, endtime, int(msg.PageNo), int(msg.PageSize))
return nil
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
for _, v := range list.Data {
pack.Glist = append(pack.Glist, &gamehall.PlayerRecord{
GameFreeid: v.GameFreeid,
GameDetailedLogId: v.GameDetailedLogId,
TotalIn: v.TotalIn,
TotalOut: v.TotalOut,
Ts: v.Ts,
MatchType: proto.Int32(v.MatchType),
})
}
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_COMNOTICE), pack)
}), "SCRecordAndNotice").Start()
}
return nil
}
func CSAudienceEnterRoomHandler(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSAudienceEnterRoomHandler Process recv ", data)
msg, ok := data.(*gamehall.CSEnterRoom)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
var code = gamehall.OpResultCode_Game_OPRC_Error_Game
var sp ScenePolicy
var cfg *webapiproto.GameFree
// 房间是否存在
scene := SceneMgrSingleton.GetScene(int(msg.GetRoomId()))
if scene == nil {
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
logger.Logger.Trace("CSAudienceEnterRoomHandler scene == nil")
goto failed
}
// 房间是否正在销毁
if scene.deleting {
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
logger.Logger.Trace("CSAudienceEnterRoomHandler scene is deleting")
goto failed
}
// 房间是否已经关闭
if scene.closed {
code = gamehall.OpResultCode_Game_OPRC_RoomHadClosed_Game
logger.Logger.Trace("CSAudienceEnterRoomHandler scene is closed")
goto failed
}
// 玩家没有在房间中
if p.scene != nil {
code = gamehall.OpResultCode_Game_OPRC_CannotWatchReasonInOther_Game
logger.Logger.Trace("CSAudienceEnterRoomHandler p.scene != nil")
goto failed
}
// 房间是否可以观战
if !scene.CanAudience() {
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
logger.Logger.Tracef("CSAudienceEnterRoomHandler scene.CanAudience() %v", scene.sceneId)
goto failed
}
// 比赛场白名单观众
if scene.IsMatchScene() && !PlatformMgrSingleton.IsMatchAudience(p.Platform, p.SnId) {
code = gamehall.OpResultCode_Game_OPRC_MatchAudience
logger.Logger.Tracef("CSAudienceEnterRoomHandler scene.IsMatchAudience() %v", scene.sceneId)
goto failed
}
// 是不是相同平台
cfg = PlatformMgrSingleton.GetGameFree(p.Platform, scene.dbGameFree.Id)
if cfg == nil || (scene.platform != nil && scene.platform.Isolated && p.Platform != scene.platform.IdStr) {
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
logger.Logger.Tracef("CSEnterRoomHandler ScenePolicy(gameid:%v mode:%v) scene.platform.Isolated && p.Platform != scene.platform.Name", scene.gameId, scene.gameMode)
goto failed
}
// 游戏规则是否存在
sp = GetScenePolicy(scene.gameId, scene.gameMode)
if sp == nil {
code = gamehall.OpResultCode_Game_OPRC_GameNotExist_Game
logger.Logger.Tracef("CSAudienceEnterRoomHandler ScenePolicy(gameid:%v mode:%v) not registe", scene.gameId, scene.gameMode)
goto failed
}
switch {
case scene.IsCoinScene():
code = gamehall.OpResultCode_Game(CoinSceneMgrSingleton.AudienceEnter(p, cfg.GetDbGameFree().GetId(), msg.GetRoomId(), nil, true))
case scene.IsHundredScene():
}
failed:
if code != gamehall.OpResultCode_Game_OPRC_Sucess_Game {
resp := &gamehall.SCEnterRoom{
OpRetCode: code,
}
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_ENTERROOM), resp)
}
return nil
}
func CSRoomConfigHandler(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSRoomConfigHandler Process recv ", data)
_, ok := data.(*gamehall.CSRoomConfig)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
pack := PlatformMgrSingleton.GetRoomConfig(p.Platform, p.LastChannel)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SCRoomConfig), pack)
logger.Logger.Tracef("SCRoomConfig: %v", pack)
return nil
}
func CSCreatePrivateRoomHandler(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSCreatePrivateRoomHandler Process recv ", data)
msg, ok := data.(*gamehall.CSCreatePrivateRoom)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
var needPwd, costType, voice int64
var password string
code := gamehall.OpResultCode_Game_OPRC_Error_Game
pack := &gamehall.SCCreatePrivateRoom{}
send := func() {
pack.OpRetCode = code
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_CREATEPRIVATEROOM), pack)
logger.Logger.Tracef("SCCreatePrivateRoom: %v", pack)
}
// 参数校验
cfg := PlatformMgrSingleton.GetConfig(p.Platform).RoomConfig[msg.GetRoomConfigId()]
if cfg == nil {
send()
return nil
}
if !slices.Contains(cfg.GetOnChannelName(), p.LastChannel) {
send()
return nil
}
f := func(param []int32) []int32 {
if len(param) == 0 {
return nil
}
if param[0] == 0 {
return param[1:]
}
if param[0] > 0 && int(param[0]) < len(param) {
return []int32{param[param[0]]}
}
return nil
}
// 场次
if !slices.Contains(f(cfg.GetGameFreeId()), msg.GetGameFreeId()) {
send()
return nil
}
// 局数
if !slices.Contains(f(cfg.GetRound()), msg.GetRound()) {
send()
return nil
}
// 玩家数量
if !slices.Contains(f(cfg.GetPlayerNum()), msg.GetPlayerNum()) {
send()
return nil
}
// 密码
if cfg.GetNeedPassword() != 3 {
needPwd = int64(cfg.GetNeedPassword())
} else {
needPwd = int64(msg.GetNeedPassword())
}
if needPwd < 1 || needPwd > 2 {
needPwd = 2 // 默认不需要密码
}
// 房费类型
if cfg.GetCostType() != 3 {
costType = int64(cfg.GetCostType())
} else {
costType = int64(msg.GetCostType())
}
if costType < 1 || costType > 2 {
costType = 1 // 默认AA
}
// 语音
if cfg.GetVoice() != 3 {
voice = int64(cfg.GetVoice())
} else {
voice = int64(msg.GetVoice())
}
if voice < 1 || voice > 2 {
voice = 1 // 默认开启语音
}
// 场次是否存在
gf := PlatformMgrSingleton.GetGameFree(p.Platform, msg.GetGameFreeId())
if gf == nil {
code = gamehall.OpResultCode_Game_OPRC_GameHadClosed
send()
return nil
}
sp := GetScenePolicy(int(gf.GetDbGameFree().GetGameId()), int(gf.GetDbGameFree().GetGameMode()))
if sp == nil {
code = gamehall.OpResultCode_Game_OPRC_GameHadClosed
send()
return nil
}
// 游戏是否开启
if cfg.GetOn() != common.On || !gf.GetStatus() {
code = gamehall.OpResultCode_Game_OPRC_GameHadClosed
send()
return nil
}
if p.scene != nil {
code = gamehall.OpResultCode_Game_OPRC_RoomHadExist_Game
send()
return nil
}
// 密码
if needPwd == 1 {
password = SceneMgrSingleton.GenPassword()
}
// 费用是否充足
if len(cfg.GetCost()) > 0 && !sp.CostEnough(int(costType), int(msg.GetPlayerNum()), cfg, p.SnId) {
code = gamehall.OpResultCode_Game_OPRC_CostNotEnough
send()
return nil
}
// 创建房间
csp := CoinSceneMgrSingleton.GetCoinScenePool(p.GetPlatform().IdStr, msg.GetGameFreeId())
roomId := SceneMgrSingleton.GenOnePrivateSceneId()
scene := SceneMgrSingleton.CreateScene(&CreateSceneParam{
CreateId: p.SnId,
RoomId: roomId,
SceneMode: common.SceneModePrivateMatch,
CycleTimes: 0,
TotalRound: int(msg.GetRound()),
Params: common.CopySliceInt32ToInt64(csp.dbGameRule.GetParams()),
GS: nil,
Platform: PlatformMgrSingleton.GetPlatform(p.Platform),
GF: csp.dbGameFree,
PlayerNum: msg.GetPlayerNum(),
Channel: cfg.GetOnChannelName(),
CustomParam: &server.CustomParam{
RoomTypeId: cfg.GetRoomType(),
RoomConfigId: cfg.GetId(),
CostType: int32(costType),
Password: password,
Voice: int32(voice),
Price: cfg.GetPrice(),
ImageURL: cfg.GetImageURI(),
},
})
if scene == nil {
code = gamehall.OpResultCode_Game_OPRC_SceneServerMaintain_Game
send()
return nil
}
csp.AddScene(scene)
if !scene.PlayerEnter(p, -1, true) {
send()
return nil
}
if costType == 2 {
sp.CostPayment(scene, p.SnId)
}
code = gamehall.OpResultCode_Game_OPRC_Sucess_Game
pack = &gamehall.SCCreatePrivateRoom{
GameFreeId: msg.GetGameFreeId(),
RoomTypeId: msg.GetRoomTypeId(),
RoomConfigId: msg.GetRoomConfigId(),
Round: msg.GetRound(),
PlayerNum: msg.GetPlayerNum(),
NeedPassword: int32(needPwd),
CostType: int32(costType),
Voice: int32(voice),
RoomId: int32(roomId),
Password: password,
}
send()
return nil
}
func CSGetPrivateRoomListHandler(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGetPrivateRoomListHandler Process recv ", data)
_, ok := data.(*gamehall.CSGetPrivateRoomList)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
PlayerNotifySingle.AddTime(p.SnId, common.NotifyPrivateRoomList, time.Second*15)
pack := &gamehall.SCGetPrivateRoomList{}
scenes := SceneMgrSingleton.FindRoomList(&FindRoomParam{
Platform: p.Platform,
GameId: nil,
GameMode: nil,
SceneMode: nil,
RoomId: 0,
IsCustom: 1,
IsFree: 0,
GameFreeId: nil,
SnId: 0,
IsMatch: false,
IsRankMatch: false,
Channel: []string{p.LastChannel},
})
for _, v := range scenes {
needPassword := 0
if v.GetPassword() != "" {
needPassword = 1
}
var players []*gamehall.PrivatePlayerInfo
for _, vv := range v.players {
players = append(players, &gamehall.PrivatePlayerInfo{
SnId: vv.GetSnId(),
Name: vv.GetName(),
UseRoleId: vv.GetRoleId(),
})
}
d := &gamehall.PrivateRoomInfo{
GameFreeId: v.dbGameFree.GetId(),
GameId: v.dbGameFree.GetGameId(),
RoomTypeId: v.GetRoomTypeId(),
RoomConfigId: v.CustomParam.GetRoomConfigId(),
RoomId: int32(v.sceneId),
NeedPassword: int32(needPassword),
CurrRound: v.currRound,
MaxRound: v.totalRound,
CurrNum: int32(v.GetPlayerCnt()),
MaxPlayer: int32(v.playerNum),
CreateTs: v.createTime.Unix(),
State: v.SceneState,
Players: players,
CostType: v.CustomParam.GetCostType(),
}
if v.CustomWinSnId > 0 {
p := PlayerMgrSington.GetPlayerBySnId(v.CustomWinSnId)
if p != nil {
d.WinSnId = p.SnId
d.WinName = p.GetName()
d.WinRoleId = p.Roles.ModId
}
}
if v.creator == 0 {
d.IsSystem = true
}
pack.Datas = append(pack.Datas, d)
}
pack.Datas = append(pack.Datas, CustomRoomMgrSingle.GetRoomList(p.Platform)...)
sort.Slice(pack.Datas, func(i, j int) bool {
return pack.Datas[i].GetCreateTs() < pack.Datas[j].GetCreateTs()
})
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_GETPRIVATEROOMLIST), pack)
logger.Logger.Tracef("SCGetPrivateRoomList: %v", pack)
return nil
}
func CSTouchTypeHandler(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSTouchTypeHandler Process recv ", data)
_, ok := data.(*gamehall.CSTouchType)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
PlayerNotifySingle.AddTime(p.SnId, common.NotifyPrivateRoomList, time.Second*15)
return nil
}
func CSRoomRecruitHandler(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSRoomRecruitHandler Process recv ", data)
msg, ok := data.(*gamehall.CSRoomRecruit)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
scene := SceneMgrSingleton.GetScene(int(msg.GetRoomId()))
if scene == nil || !scene.IsCustom() || scene.creator != p.SnId {
return nil
}
// 标记招募状态
scene.IsRecruit = true
scene.RecruitTimes++
pack := &gamehall.SCRoomRecruit{
RoomId: msg.GetRoomId(),
On: 1,
}
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SCRoomRecruit), pack)
logger.Logger.Tracef("SCRoomRecruit: %v", pack)
return nil
}
func CSInviteJoinRoomHandler(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSInviteJoinRoomHandler Process recv ", data)
_, ok := data.(*gamehall.CSInviteJoinRoom)
if !ok {
return nil
}
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
return nil
}
pack := &gamehall.SCInviteJoinRoom{}
scene := SceneMgrSingleton.FindCustomInviteRoom(p)
if scene != nil {
pack.RoomId = int32(scene.sceneId)
pack.IsSystem = scene.creator == 0
pack.SnId = scene.creator
if scene.creator > 0 {
player := PlayerMgrSington.GetPlayerBySnId(scene.creator)
if player != nil {
pack.Name = player.GetName()
pack.UseRoleId = player.Roles.ModId
}
cfg := PlatformMgrSingleton.GetConfig(p.Platform).RoomConfig[scene.CustomParam.GetRoomConfigId()]
if cfg != nil {
pack.RoomName = cfg.GetName()
}
} else {
cfg := PlatformMgrSingleton.GetConfig(p.Platform).RoomConfig[scene.RoomConfigSystem.GetRoomConfigId()]
if cfg != nil {
pack.RoomName = cfg.GetName()
}
}
}
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SCInviteJoinRoom), pack)
logger.Logger.Tracef("SCInviteJoinRoom: %v", pack)
return nil
}
func init() {
// 返回房间
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_RETURNROOM), &CSReturnRoomHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_RETURNROOM), &CSReturnRoomPacketFactory{})
//观众坐下
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_AUDIENCESIT), &CSAudienceSitHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_AUDIENCESIT), &CSAudienceSitPacketFactory{})
//获取指定游戏配置 包括分场信息
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_GETGAMECONFIG), &CSGetGameConfigHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_GETGAMECONFIG), &CSGetGameConfigPacketFactory{})
//玩家进入游戏
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_ENTERGAME), &CSEnterGameHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_ENTERGAME), &CSEnterGamePacketFactory{})
//玩家进入房间
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_ENTERROOM), &CSEnterRoomHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_ENTERROOM), &CSEnterRoomPacketFactory{})
//玩家退出游戏
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_QUITGAME), &CSQuitGameHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_QUITGAME), &CSQuitGamePacketFactory{})
//创建房间
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_CREATEROOM), &CSCreateRoomHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_CREATEROOM), &CSCreateRoomPacketFactory{})
//查询公共房间列表
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_QUERYROOMINFO), &CSQueryRoomInfoHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_QUERYROOMINFO), &CSQueryRoomInfoPacketFactory{})
//我的游戏信息及平台公告
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_COMNOTICE), &CSRecordAndNoticeHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_COMNOTICE), &CSRecordAndNoticePacketFactory{})
// 观众进入房间
common.Register(int(gamehall.GameHallPacketID_PACKET_CS_AUDIENCE_ENTERROOM), &gamehall.CSEnterRoom{}, CSAudienceEnterRoomHandler)
// 竞技馆房间配置列表
common.Register(int(gamehall.GameHallPacketID_PACKET_CSRoomConfig), &gamehall.CSRoomConfig{}, CSRoomConfigHandler)
// 创建竞技馆房间
common.Register(int(gamehall.GameHallPacketID_PACKET_CS_CREATEPRIVATEROOM), &gamehall.CSCreatePrivateRoom{}, CSCreatePrivateRoomHandler)
// 竞技馆房间列表
common.Register(int(gamehall.GameHallPacketID_PACKET_CS_GETPRIVATEROOMLIST), &gamehall.CSGetPrivateRoomList{}, CSGetPrivateRoomListHandler)
// 保持刷新
common.Register(int(gamehall.GameHallPacketID_PACKET_CSTouchType), &gamehall.CSTouchType{}, CSTouchTypeHandler)
// 设置招募状态
common.Register(int(gamehall.GameHallPacketID_PACKET_CSRoomRecruit), &gamehall.CSRoomRecruit{}, CSRoomRecruitHandler)
// 推荐房间
common.Register(int(gamehall.GameHallPacketID_PACKET_CSInviteJoinRoom), &gamehall.CSInviteJoinRoom{}, CSInviteJoinRoomHandler)
}