比赛观战
This commit is contained in:
parent
00b0e01000
commit
71655d8126
|
@ -699,7 +699,7 @@ func (this *Scene) AudienceLeave(p *Player, reason int) {
|
||||||
//当前状态不能离场
|
//当前状态不能离场
|
||||||
if !this.CanChangeCoinScene(p) {
|
if !this.CanChangeCoinScene(p) {
|
||||||
pack := &gamehall.SCLeaveRoom{
|
pack := &gamehall.SCLeaveRoom{
|
||||||
OpRetCode: (gamehall.OpResultCode_Game(p.OpCode)), //protocol.OpResultCode_OPRC_Hundred_YouHadBetCannotLeave,
|
OpRetCode: gamehall.OpResultCode_Game(p.OpCode), //protocol.OpResultCode_OPRC_Hundred_YouHadBetCannotLeave,
|
||||||
RoomId: proto.Int(this.SceneId),
|
RoomId: proto.Int(this.SceneId),
|
||||||
}
|
}
|
||||||
proto.SetDefaults(pack)
|
proto.SetDefaults(pack)
|
||||||
|
|
|
@ -517,7 +517,7 @@ func TienLenCreateRoomInfoPacket(s *base.Scene, p *base.Player, sceneEx *TienLen
|
||||||
//手牌
|
//手牌
|
||||||
for j := int32(0); j < rule.HandCardNum; j++ {
|
for j := int32(0); j < rule.HandCardNum; j++ {
|
||||||
if nowPlayer.cards[j] != rule.InvalideCard {
|
if nowPlayer.cards[j] != rule.InvalideCard {
|
||||||
if s.GetSceneState().GetState() == rule.TienLenSceneStateBilled { //结算状态显示用
|
if s.GetSceneState().GetState() == rule.TienLenSceneStateBilled || p.IsMarkFlag(base.PlayerState_Audience) { //结算状态显示用
|
||||||
pd1.Cards = append(pd1.Cards, nowPlayer.cards[j])
|
pd1.Cards = append(pd1.Cards, nowPlayer.cards[j])
|
||||||
} else {
|
} else {
|
||||||
pd1.Cards = append(pd1.Cards, rule.InvalideCard)
|
pd1.Cards = append(pd1.Cards, rule.InvalideCard)
|
||||||
|
|
|
@ -183,94 +183,6 @@ failed:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type CSAudienceEnterRoomHandler struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CSAudienceEnterRoomHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
|
|
||||||
logger.Logger.Trace("CSAudienceEnterRoomHandler Process recv ", data)
|
|
||||||
if msg, ok := data.(*gamehall.CSEnterRoom); ok {
|
|
||||||
p := PlayerMgrSington.GetPlayer(sid)
|
|
||||||
if p == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var code = gamehall.OpResultCode_Game_OPRC_Sucess_Game
|
|
||||||
var sp ScenePolicy
|
|
||||||
var dbGameFree *server.DB_GameFree
|
|
||||||
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.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_RoomNotExist_Game
|
|
||||||
logger.Logger.Tracef("CSAudienceEnterRoomHandler scene.IsMatchAudience() %v", scene.sceneId)
|
|
||||||
goto failed
|
|
||||||
}
|
|
||||||
if p.scene != nil {
|
|
||||||
code = gamehall.OpResultCode_Game_OPRC_CannotWatchReasonInOther_Game
|
|
||||||
logger.Logger.Trace("CSAudienceEnterRoomHandler p.scene != nil")
|
|
||||||
goto failed
|
|
||||||
}
|
|
||||||
cfg = PlatformMgrSingleton.GetGameFree(p.Platform, scene.dbGameFree.Id)
|
|
||||||
if cfg != nil && (cfg.GroupId != scene.groupId || cfg.GroupId == 0) {
|
|
||||||
if scene.limitPlatform != nil {
|
|
||||||
if scene.limitPlatform.Isolated && p.Platform != scene.limitPlatform.IdStr {
|
|
||||||
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
|
|
||||||
logger.Logger.Tracef("CSEnterRoomHandler ScenePolicy(gameid:%v mode:%v) scene.limitPlatform.Isolated && p.Platform != scene.limitPlatform.Name", scene.gameId, scene.gameMode)
|
|
||||||
goto failed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//if !scene.starting {
|
|
||||||
// code = gamehall.OpResultCode_Game_OPRC_CannotWatchReasonRoomNotStart_Game
|
|
||||||
// logger.Logger.Trace("CSAudienceEnterRoomHandler !scene.starting")
|
|
||||||
// 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 scene.IsCoinScene() || scene.IsHundredScene() {
|
|
||||||
// code = gamehall.OpResultCode_Game_OPRC_Error_Game
|
|
||||||
// logger.Logger.Trace("CSAudienceEnterRoomHandler scene is IsCoinScene IsHundredScene")
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
dbGameFree = scene.dbGameFree
|
|
||||||
code = gamehall.OpResultCode_Game(CoinSceneMgrSingleton.AudienceEnter(p, dbGameFree.GetId(), msg.GetRoomId(), nil, true))
|
|
||||||
|
|
||||||
failed:
|
|
||||||
if code != gamehall.OpResultCode_Game_OPRC_Sucess_Game {
|
|
||||||
resp := &gamehall.SCEnterRoom{
|
|
||||||
OpRetCode: code,
|
|
||||||
}
|
|
||||||
proto.SetDefaults(resp)
|
|
||||||
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_ENTERROOM), resp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type CSReturnRoomPacketFactory struct {
|
type CSReturnRoomPacketFactory struct {
|
||||||
}
|
}
|
||||||
type CSReturnRoomHandler struct {
|
type CSReturnRoomHandler struct {
|
||||||
|
@ -1235,10 +1147,95 @@ func (this *CSRecordAndNoticeHandler) Process(s *netlib.Session, packetid int, d
|
||||||
return nil
|
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.GetPlayer(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_RoomNotExist_Game
|
||||||
|
logger.Logger.Tracef("CSAudienceEnterRoomHandler scene.IsMatchAudience() %v", scene.sceneId)
|
||||||
|
goto failed
|
||||||
|
}
|
||||||
|
// 是不是相同平台
|
||||||
|
cfg = PlatformMgrSingleton.GetGameFree(p.Platform, scene.dbGameFree.Id)
|
||||||
|
if cfg == nil || (scene.limitPlatform != nil && scene.limitPlatform.Isolated && p.Platform != scene.limitPlatform.IdStr) {
|
||||||
|
code = gamehall.OpResultCode_Game_OPRC_RoomNotExist_Game
|
||||||
|
logger.Logger.Tracef("CSEnterRoomHandler ScenePolicy(gameid:%v mode:%v) scene.limitPlatform.Isolated && p.Platform != scene.limitPlatform.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():
|
||||||
|
|
||||||
|
case scene.IsMatchScene():
|
||||||
|
code = gamehall.OpResultCode_Game(MatchSceneMgrSingleton.AudienceEnter(p, cfg.GetDbGameFree().GetId(), int(msg.GetRoomId()), nil, true))
|
||||||
|
}
|
||||||
|
|
||||||
|
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 init() {
|
func init() {
|
||||||
// 观众进入房间
|
|
||||||
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_AUDIENCE_ENTERROOM), &CSAudienceEnterRoomHandler{})
|
|
||||||
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_AUDIENCE_ENTERROOM), &CSEnterRoomPacketFactory{})
|
|
||||||
// 返回房间
|
// 返回房间
|
||||||
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_RETURNROOM), &CSReturnRoomHandler{})
|
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_RETURNROOM), &CSReturnRoomHandler{})
|
||||||
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_RETURNROOM), &CSReturnRoomPacketFactory{})
|
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_RETURNROOM), &CSReturnRoomPacketFactory{})
|
||||||
|
@ -1266,4 +1263,7 @@ func init() {
|
||||||
//我的游戏信息及平台公告
|
//我的游戏信息及平台公告
|
||||||
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_COMNOTICE), &CSRecordAndNoticeHandler{})
|
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_COMNOTICE), &CSRecordAndNoticeHandler{})
|
||||||
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_COMNOTICE), &CSRecordAndNoticePacketFactory{})
|
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_COMNOTICE), &CSRecordAndNoticePacketFactory{})
|
||||||
|
|
||||||
|
// 观众进入房间
|
||||||
|
common.Register(int(gamehall.GameHallPacketID_PACKET_CS_AUDIENCE_ENTERROOM), &gamehall.CSEnterRoom{}, CSAudienceEnterRoomHandler)
|
||||||
}
|
}
|
||||||
|
|
|
@ -253,8 +253,11 @@ func init() {
|
||||||
p.GameCoinTs = gameCoinTs
|
p.GameCoinTs = gameCoinTs
|
||||||
p.dirty = true
|
p.dirty = true
|
||||||
}
|
}
|
||||||
|
if scene.IsMatchScene() {
|
||||||
CoinSceneMgrSingleton.PlayerLeave(p, int(msg.GetReason()))
|
scene.AudienceLeave(p, int(msg.GetReason()))
|
||||||
|
} else {
|
||||||
|
CoinSceneMgrSingleton.PlayerLeave(p, int(msg.GetReason()))
|
||||||
|
}
|
||||||
|
|
||||||
//变化金币
|
//变化金币
|
||||||
p.dirty = true
|
p.dirty = true
|
||||||
|
@ -639,7 +642,7 @@ func init() {
|
||||||
if msg, ok := pack.(*serverproto.GWChangeSceneEvent); ok {
|
if msg, ok := pack.(*serverproto.GWChangeSceneEvent); ok {
|
||||||
scene := SceneMgrSingleton.GetScene(int(msg.GetSceneId()))
|
scene := SceneMgrSingleton.GetScene(int(msg.GetSceneId()))
|
||||||
if scene != nil {
|
if scene != nil {
|
||||||
scene.PlayerTryChange()
|
//scene.PlayerTryChange()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -212,6 +212,12 @@ func CSRoomList(s *netlib.Session, packetId int, data interface{}, sid int64) er
|
||||||
}
|
}
|
||||||
room.Players = append(room.Players, d)
|
room.Players = append(room.Players, d)
|
||||||
}
|
}
|
||||||
|
sort.Slice(room.Players, func(i, j int) bool {
|
||||||
|
if room.Players[i].Rank == room.Players[j].Rank {
|
||||||
|
return room.Players[i].SnId < room.Players[j].SnId
|
||||||
|
}
|
||||||
|
return room.Players[i].Rank < room.Players[j].Rank
|
||||||
|
})
|
||||||
pack.List = append(pack.List, room)
|
pack.List = append(pack.List, room)
|
||||||
}
|
}
|
||||||
p.SendToClient(int(tournament.TOURNAMENTID_PACKET_TM_SCRoomList), pack)
|
p.SendToClient(int(tournament.TOURNAMENTID_PACKET_TM_SCRoomList), pack)
|
||||||
|
|
|
@ -330,7 +330,7 @@ func (csp *CoinScenePool) onPlayerLeave(s *Scene, p *Player) {
|
||||||
// 玩家离开结算空房间的私人房
|
// 玩家离开结算空房间的私人房
|
||||||
if s.IsPrivateScene() {
|
if s.IsPrivateScene() {
|
||||||
if s.IsEmpty() {
|
if s.IsEmpty() {
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -345,7 +345,7 @@ func (csp *CoinScenePool) onPlayerLeave(s *Scene, p *Player) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if hasCnt > int(csp.dbGameFree.GetCreateRoomNum()) {
|
if hasCnt > int(csp.dbGameFree.GetCreateRoomNum()) {
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,18 +80,14 @@ func (this *GameSession) GetSrvId() int32 {
|
||||||
// 关闭其上的所有场景
|
// 关闭其上的所有场景
|
||||||
func (this *GameSession) CloseAllScene() {
|
func (this *GameSession) CloseAllScene() {
|
||||||
for sceneId, scene := range this.scenes {
|
for sceneId, scene := range this.scenes {
|
||||||
if scene.IsMiniGameScene() {
|
scDestroyRoom := &gamehall_proto.SCDestroyRoom{
|
||||||
|
RoomId: proto.Int(sceneId),
|
||||||
} else {
|
OpRetCode: gamehall_proto.OpResultCode_Game_OPRC_Sucess_Game,
|
||||||
scDestroyRoom := &gamehall_proto.SCDestroyRoom{
|
IsForce: proto.Int(1),
|
||||||
RoomId: proto.Int(sceneId),
|
|
||||||
OpRetCode: gamehall_proto.OpResultCode_Game_OPRC_Sucess_Game,
|
|
||||||
IsForce: proto.Int(1),
|
|
||||||
}
|
|
||||||
proto.SetDefaults(scDestroyRoom)
|
|
||||||
scene.Broadcast(int(gamehall_proto.GameHallPacketID_PACKET_SC_DESTROYROOM), scDestroyRoom, 0)
|
|
||||||
SceneMgrSingleton.DestroyScene(sceneId, true)
|
|
||||||
}
|
}
|
||||||
|
proto.SetDefaults(scDestroyRoom)
|
||||||
|
scene.Broadcast(int(gamehall_proto.GameHallPacketID_PACKET_SC_DESTROYROOM), scDestroyRoom, 0)
|
||||||
|
SceneMgrSingleton.DestroyScene(sceneId, true)
|
||||||
}
|
}
|
||||||
this.scenes = nil
|
this.scenes = nil
|
||||||
this.players = nil
|
this.players = nil
|
||||||
|
|
|
@ -392,7 +392,7 @@ func (this *HundredSceneMgr) OnPlatformGameFreeUpdate(p *Platform, oldCfg, newCf
|
||||||
}
|
}
|
||||||
if scenes, exist := this.scenesOfPlatform[p.IdStr]; exist {
|
if scenes, exist := this.scenesOfPlatform[p.IdStr]; exist {
|
||||||
if s, ok := scenes[newCfg.DbGameFree.Id]; ok {
|
if s, ok := scenes[newCfg.DbGameFree.Id]; ok {
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
|
|
||||||
"mongo.games.com/game/common"
|
"mongo.games.com/game/common"
|
||||||
"mongo.games.com/game/proto"
|
"mongo.games.com/game/proto"
|
||||||
|
hallproto "mongo.games.com/game/protocol/gamehall"
|
||||||
"mongo.games.com/game/protocol/server"
|
"mongo.games.com/game/protocol/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -172,11 +173,22 @@ func (ms *MatchSceneMgr) OnDestroyScene(sceneId int) {
|
||||||
delete(ms.scenes, sceneId)
|
delete(ms.scenes, sceneId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ms *MatchSceneMgr) AudienceEnter(p *Player, id int32, roomId int, exclude []int32, ischangeroom bool) hallproto.OpResultCode {
|
||||||
|
scene, ok := ms.scenes[roomId]
|
||||||
|
if !ok {
|
||||||
|
return hallproto.OpResultCode_OPRC_RoomHadClosed
|
||||||
|
}
|
||||||
|
if !scene.AudienceEnter(p, ischangeroom) {
|
||||||
|
return hallproto.OpResultCode_OPRC_RoomHadClosed
|
||||||
|
}
|
||||||
|
return hallproto.OpResultCode_OPRC_Sucess
|
||||||
|
}
|
||||||
|
|
||||||
func (ms *MatchSceneMgr) MatchStop(tm *TmMatch) {
|
func (ms *MatchSceneMgr) MatchStop(tm *TmMatch) {
|
||||||
if SceneMgrSingleton.scenes != nil && tm != nil {
|
if SceneMgrSingleton.scenes != nil && tm != nil {
|
||||||
for _, scene := range SceneMgrSingleton.scenes {
|
for _, scene := range SceneMgrSingleton.scenes {
|
||||||
if scene.IsMatchScene() && scene.matchId == tm.SortId {
|
if scene.IsMatchScene() && scene.matchId == tm.SortId {
|
||||||
scene.DoDelete(false)
|
scene.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1662,7 +1662,7 @@ func (this *Player) OnLogouted() {
|
||||||
this.Save(true)
|
this.Save(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Player) MarshalData(gameid int) (d []byte, e error) {
|
func (this *Player) MarshalData() (d []byte, e error) {
|
||||||
d, e = netlib.Gob.Marshal(this.PlayerData)
|
d, e = netlib.Gob.Marshal(this.PlayerData)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,6 @@ import (
|
||||||
"mongo.games.com/game/model"
|
"mongo.games.com/game/model"
|
||||||
"mongo.games.com/game/proto"
|
"mongo.games.com/game/proto"
|
||||||
hallproto "mongo.games.com/game/protocol/gamehall"
|
hallproto "mongo.games.com/game/protocol/gamehall"
|
||||||
playerproto "mongo.games.com/game/protocol/player"
|
|
||||||
serverproto "mongo.games.com/game/protocol/server"
|
serverproto "mongo.games.com/game/protocol/server"
|
||||||
"mongo.games.com/game/srvdata"
|
"mongo.games.com/game/srvdata"
|
||||||
)
|
)
|
||||||
|
@ -50,11 +49,11 @@ type PlayerGameCtx struct {
|
||||||
type Scene struct {
|
type Scene struct {
|
||||||
sceneId int //场景id
|
sceneId int //场景id
|
||||||
gameId int //游戏id
|
gameId int //游戏id
|
||||||
gameMode int //游戏模式
|
gameMode int //游戏模式(玩法)
|
||||||
sceneMode int //房间模式,参考common.SceneMode_XXX
|
sceneMode int //房间模式,参考common.SceneMode_XXX
|
||||||
params []int64 //场景参数
|
params []int64 //场景参数
|
||||||
paramsEx []int32 //其他扩展参数
|
paramsEx []int32 //其他扩展参数
|
||||||
playerNum int //人数
|
playerNum int //房间最大人数
|
||||||
robotNum int //机器人数量
|
robotNum int //机器人数量
|
||||||
robotLimit int //最大限制机器人数量
|
robotLimit int //最大限制机器人数量
|
||||||
preInviteRobNum int //准备邀请机器人的数量
|
preInviteRobNum int //准备邀请机器人的数量
|
||||||
|
@ -145,7 +144,7 @@ func NewScene(agentor, creator int32, id, gameId, gameMode, sceneMode int, clycl
|
||||||
s.playerNum = int(sp.GetPlayerNum(s))
|
s.playerNum = int(sp.GetPlayerNum(s))
|
||||||
s.lastTime = s.createTime
|
s.lastTime = s.createTime
|
||||||
|
|
||||||
if s.IsHallScene() || s.IsCoinScene() {
|
if s.IsCoinScene() {
|
||||||
code := SceneMgrSingleton.AllocReplayCode()
|
code := SceneMgrSingleton.AllocReplayCode()
|
||||||
s.replayCode = code
|
s.replayCode = code
|
||||||
}
|
}
|
||||||
|
@ -228,6 +227,13 @@ func (this *Scene) RobotIsLimit() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *Scene) GetPlayerGameCtx(snid int32) *PlayerGameCtx {
|
||||||
|
if ctx, exist := this.gameCtx[snid]; exist {
|
||||||
|
return ctx
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (this *Scene) PlayerEnter(p *Player, pos int, ischangeroom bool) bool {
|
func (this *Scene) PlayerEnter(p *Player, pos int, ischangeroom bool) bool {
|
||||||
logger.Logger.Infof("(this *Scene:%v) PlayerEnter(%v, %v) ", this.sceneId, p.SnId, pos)
|
logger.Logger.Infof("(this *Scene:%v) PlayerEnter(%v, %v) ", this.sceneId, p.SnId, pos)
|
||||||
|
|
||||||
|
@ -273,15 +279,6 @@ func (this *Scene) PlayerEnter(p *Player, pos int, ischangeroom bool) bool {
|
||||||
this.players[p.SnId] = p
|
this.players[p.SnId] = p
|
||||||
this.gameSess.AddPlayer(p)
|
this.gameSess.AddPlayer(p)
|
||||||
|
|
||||||
switch {
|
|
||||||
case this.IsCoinScene():
|
|
||||||
|
|
||||||
case this.IsHundredScene():
|
|
||||||
|
|
||||||
case this.IsMatchScene():
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果正在等待比赛,退赛
|
// 如果正在等待比赛,退赛
|
||||||
if !this.IsMatchScene() {
|
if !this.IsMatchScene() {
|
||||||
isWaiting, tmid := TournamentMgr.IsMatchWaiting(p.Platform, p.SnId)
|
isWaiting, tmid := TournamentMgr.IsMatchWaiting(p.Platform, p.SnId)
|
||||||
|
@ -458,8 +455,7 @@ func (this *Scene) PlayerEnter(p *Player, pos int, ischangeroom bool) bool {
|
||||||
logger.Logger.Tracef("(this *Scene) PlayerEnter(%v) robot(%v) robotlimit(%v)", name, this.robotNum, this.robotLimit)
|
logger.Logger.Tracef("(this *Scene) PlayerEnter(%v) robot(%v) robotlimit(%v)", name, this.robotNum, this.robotLimit)
|
||||||
}
|
}
|
||||||
|
|
||||||
//todo:send add msg to gamesrv
|
data, err := p.MarshalData()
|
||||||
data, err := p.MarshalData(this.gameId)
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
var gateSid int64
|
var gateSid int64
|
||||||
if p.gateSess != nil {
|
if p.gateSess != nil {
|
||||||
|
@ -563,158 +559,111 @@ func (this *Scene) PlayerEnter(p *Player, pos int, ischangeroom bool) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExePMCmd(s *netlib.Session, cmd string) {
|
func (this *Scene) AudienceEnter(p *Player, ischangeroom bool) bool {
|
||||||
CSPMCmd := &playerproto.CSPMCmd{
|
logger.Logger.Infof("(this *Scene:%v) AudienceEnter(%v) ", this.sceneId, p.SnId)
|
||||||
Cmd: proto.String(cmd),
|
p.scene = this
|
||||||
|
takeCoin := p.Coin
|
||||||
|
p.takeCoin = takeCoin
|
||||||
|
this.audiences[p.SnId] = p
|
||||||
|
this.gameSess.AddPlayer(p)
|
||||||
|
|
||||||
|
data, err := p.MarshalData()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
proto.SetDefaults(CSPMCmd)
|
|
||||||
logger.Logger.Trace("CSPMCmd:", CSPMCmd)
|
|
||||||
s.Send(int(playerproto.PlayerPacketID_PACKET_CS_PMCMD), CSPMCmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *Scene) GetPlayerGameCtx(snid int32) *PlayerGameCtx {
|
var gateSid int64
|
||||||
if ctx, exist := this.gameCtx[snid]; exist {
|
if p.gateSess != nil {
|
||||||
return ctx
|
if srvInfo, ok := p.gateSess.GetAttribute(srvlib.SessionAttributeServerInfo).(*srvlibproto.SSSrvRegiste); ok && srvInfo != nil {
|
||||||
|
sessionId := srvlib.NewSessionIdEx(srvInfo.GetAreaId(), srvInfo.GetType(), srvInfo.GetId(), 0)
|
||||||
|
gateSid = sessionId.Get()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *Scene) PlayerLeave(p *Player, reason int) {
|
msg := &serverproto.WGPlayerEnter{
|
||||||
logger.Logger.Infof("(this *Scene:%v) PlayerLeave(%v, %v) ", this.sceneId, p.SnId, reason)
|
Sid: proto.Int64(p.sid),
|
||||||
//if !this.IsMatchScene() {
|
SnId: proto.Int32(p.SnId),
|
||||||
//pack := &hall_proto.SCLeaveRoom{
|
GateSid: proto.Int64(gateSid),
|
||||||
// Reason: proto.Int(reason),
|
SceneId: proto.Int(this.sceneId),
|
||||||
// OpRetCode: hall_proto.OpResultCode_Game_OPRC_Sucess_Game,
|
PlayerData: data,
|
||||||
// Mode: proto.Int(0),
|
TakeCoin: takeCoin,
|
||||||
// RoomId: proto.Int(this.sceneId),
|
IsLoaded: proto.Bool(ischangeroom),
|
||||||
//}
|
IsQM: false,
|
||||||
//proto.SetDefaults(pack)
|
IParams: p.MarshalIParam(),
|
||||||
//p.SendToClient(int(hall_proto.GameHallPacketID_PACKET_SC_LEAVEROOM), pack)
|
SParams: p.MarshalSParam(),
|
||||||
pack := &hallproto.SCQuitGame{
|
CParams: p.MarshalCParam(),
|
||||||
Id: int32(this.dbGameFree.Id),
|
|
||||||
Reason: proto.Int(reason),
|
|
||||||
}
|
}
|
||||||
pack.OpCode = hallproto.OpResultCode_Game_OPRC_Sucess_Game
|
|
||||||
proto.SetDefaults(pack)
|
|
||||||
p.SendToClient(int(hallproto.GameHallPacketID_PACKET_SC_QUITGAME), pack)
|
|
||||||
//}
|
|
||||||
|
|
||||||
//其他人直接从房间退出来
|
if !p.IsRob { //保存下进入时的环境
|
||||||
this.DelPlayer(p)
|
p.enterts = time.Now()
|
||||||
|
this.gameCtx[p.SnId] = &PlayerGameCtx{
|
||||||
// 玩家最后所在游戏
|
takeCoin: p.takeCoin,
|
||||||
p.LastGameId = int(this.dbGameFree.GetGameId())
|
enterTs: p.enterts.Unix(),
|
||||||
if !p.IsRob {
|
}
|
||||||
this.lastTime = time.Now()
|
this.lastTime = time.Now()
|
||||||
}
|
}
|
||||||
|
this.SendToGame(int(serverproto.SSPacketID_PACKET_WG_AUDIENCEENTER), msg)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) DelPlayer(p *Player) bool {
|
func (this *Scene) DelPlayer(p *Player) bool {
|
||||||
if p.scene != this {
|
if p.scene != this {
|
||||||
inroomid := 0
|
roomId := 0
|
||||||
if p.scene != nil {
|
if p.scene != nil {
|
||||||
inroomid = p.scene.sceneId
|
roomId = p.scene.sceneId
|
||||||
}
|
}
|
||||||
logger.Logger.Warnf("(this *Scene) DelPlayer found player:%v in room:%v but room:%v", p.SnId, inroomid, this.sceneId)
|
logger.Logger.Errorf("DelPlayer found player:%v in room:%v but room:%v", p.SnId, roomId, this.sceneId)
|
||||||
}
|
}
|
||||||
|
|
||||||
if this.gameSess != nil {
|
if this.gameSess != nil {
|
||||||
this.gameSess.DelPlayer(p)
|
this.gameSess.DelPlayer(p)
|
||||||
}
|
}
|
||||||
delete(this.players, p.SnId)
|
// 玩家离开游戏
|
||||||
|
if _, ok := this.players[p.SnId]; ok {
|
||||||
|
delete(this.players, p.SnId)
|
||||||
|
if p.IsRobot() {
|
||||||
|
this.robotNum--
|
||||||
|
}
|
||||||
|
// 记录玩家最近玩游戏的房间
|
||||||
|
SceneMgrSingleton.OnPlayerLeaveScene(this, p)
|
||||||
|
// 玩家最后所在游戏
|
||||||
|
p.LastGameId = int(this.dbGameFree.GetGameId())
|
||||||
|
}
|
||||||
|
// 观众离开游戏
|
||||||
|
if _, ok := this.audiences[p.SnId]; ok {
|
||||||
|
delete(this.audiences, p.SnId)
|
||||||
|
}
|
||||||
|
for k, v := range this.seats {
|
||||||
|
if v != nil && v.SnId == p.SnId {
|
||||||
|
p.pos = -1
|
||||||
|
this.seats[k] = nil
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
if !p.IsRob {
|
if !p.IsRob {
|
||||||
delete(this.gameCtx, p.SnId)
|
delete(this.gameCtx, p.SnId)
|
||||||
}
|
}
|
||||||
|
|
||||||
p.scene = nil
|
p.scene = nil
|
||||||
SceneMgrSingleton.OnPlayerLeaveScene(this, p)
|
if !p.IsRob {
|
||||||
|
this.lastTime = time.Now()
|
||||||
switch {
|
|
||||||
case this.IsHundredScene():
|
|
||||||
//case this.IsHallScene():
|
|
||||||
// PlatformMgrSingleton.OnPlayerLeaveScene(this, p)
|
|
||||||
// for i := 0; i < this.playerNum; i++ {
|
|
||||||
// if this.seats[i] == p {
|
|
||||||
// p.pos = -1
|
|
||||||
// this.seats[i] = nil
|
|
||||||
// break
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
case this.IsCoinScene() || this.IsMatchScene():
|
|
||||||
for i := 0; i < this.playerNum; i++ {
|
|
||||||
if this.seats[i] == p {
|
|
||||||
p.pos = -1
|
|
||||||
this.seats[i] = nil
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.IsRob {
|
|
||||||
this.robotNum--
|
|
||||||
name := this.GetSceneName()
|
|
||||||
logger.Logger.Tracef("(this *Scene) PlayerLeave(%v) robot(%v) robotlimit(%v)", name, this.robotNum, this.robotLimit)
|
|
||||||
}
|
|
||||||
//from gameserver, so don't need send msg
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) AudienceEnter(p *Player, ischangeroom bool) bool {
|
// PlayerLeave 玩家离开
|
||||||
logger.Logger.Infof("(this *Scene:%v) AudienceEnter(%v) ", this.sceneId, p.SnId)
|
func (this *Scene) PlayerLeave(p *Player, reason int) {
|
||||||
p.scene = this
|
logger.Logger.Infof("(this *Scene:%v) PlayerLeave(%v, %v) ", this.sceneId, p.SnId, reason)
|
||||||
this.audiences[p.SnId] = p
|
pack := &hallproto.SCQuitGame{
|
||||||
this.gameSess.AddPlayer(p)
|
Id: this.dbGameFree.Id,
|
||||||
|
Reason: proto.Int(reason),
|
||||||
//todo:send add msg to gamesrv
|
|
||||||
data, err := p.MarshalData(this.gameId)
|
|
||||||
if err == nil {
|
|
||||||
var gateSid int64
|
|
||||||
if p.gateSess != nil {
|
|
||||||
if srvInfo, ok := p.gateSess.GetAttribute(srvlib.SessionAttributeServerInfo).(*srvlibproto.SSSrvRegiste); ok && srvInfo != nil {
|
|
||||||
sessionId := srvlib.NewSessionIdEx(srvInfo.GetAreaId(), srvInfo.GetType(), srvInfo.GetId(), 0)
|
|
||||||
gateSid = sessionId.Get()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isQuMin := false
|
|
||||||
//if !p.IsRob {
|
|
||||||
// pt := PlatformMgrSingleton.GetPackageTag(p.PackageID)
|
|
||||||
// if pt != nil && pt.SpreadTag == 1 {
|
|
||||||
// isQuMin = true
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
msg := &serverproto.WGPlayerEnter{
|
|
||||||
Sid: proto.Int64(p.sid),
|
|
||||||
SnId: proto.Int32(p.SnId),
|
|
||||||
GateSid: proto.Int64(gateSid),
|
|
||||||
SceneId: proto.Int(this.sceneId),
|
|
||||||
PlayerData: data,
|
|
||||||
IsLoaded: proto.Bool(ischangeroom),
|
|
||||||
IsQM: proto.Bool(isQuMin),
|
|
||||||
IParams: p.MarshalIParam(),
|
|
||||||
SParams: p.MarshalSParam(),
|
|
||||||
CParams: p.MarshalCParam(),
|
|
||||||
}
|
|
||||||
|
|
||||||
if !p.IsRob { //保存下进入时的环境
|
|
||||||
this.gameCtx[p.SnId] = &PlayerGameCtx{
|
|
||||||
takeCoin: p.takeCoin,
|
|
||||||
enterTs: p.enterts.Unix(),
|
|
||||||
totalConvertibleFlow: p.TotalConvertibleFlow,
|
|
||||||
}
|
|
||||||
this.lastTime = time.Now()
|
|
||||||
}
|
|
||||||
|
|
||||||
takeCoin := p.Coin
|
|
||||||
p.takeCoin = takeCoin
|
|
||||||
msg.TakeCoin = proto.Int64(takeCoin)
|
|
||||||
proto.SetDefaults(msg)
|
|
||||||
this.SendToGame(int(serverproto.SSPacketID_PACKET_WG_AUDIENCEENTER), msg)
|
|
||||||
p.enterts = time.Now()
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
pack.OpCode = hallproto.OpResultCode_Game_OPRC_Sucess_Game
|
||||||
return false
|
p.SendToClient(int(hallproto.GameHallPacketID_PACKET_SC_QUITGAME), pack)
|
||||||
|
logger.Logger.Tracef("SCQuitGame: %v, %v", p.SnId, pack)
|
||||||
|
this.DelPlayer(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AudienceLeave 观众离开
|
||||||
func (this *Scene) AudienceLeave(p *Player, reason int) {
|
func (this *Scene) AudienceLeave(p *Player, reason int) {
|
||||||
logger.Logger.Infof("(this *Scene:%v) AudienceLeave(%v, %v) ", this.sceneId, p.SnId, reason)
|
logger.Logger.Infof("(this *Scene:%v) AudienceLeave(%v, %v) ", this.sceneId, p.SnId, reason)
|
||||||
pack := &hallproto.SCLeaveRoom{
|
pack := &hallproto.SCLeaveRoom{
|
||||||
|
@ -723,97 +672,25 @@ func (this *Scene) AudienceLeave(p *Player, reason int) {
|
||||||
Mode: proto.Int(0),
|
Mode: proto.Int(0),
|
||||||
RoomId: proto.Int(this.sceneId),
|
RoomId: proto.Int(this.sceneId),
|
||||||
}
|
}
|
||||||
proto.SetDefaults(pack)
|
|
||||||
p.SendToClient(int(hallproto.GameHallPacketID_PACKET_SC_LEAVEROOM), pack)
|
p.SendToClient(int(hallproto.GameHallPacketID_PACKET_SC_LEAVEROOM), pack)
|
||||||
//观众直接从房间退出来
|
logger.Logger.Tracef("AudienceLeave SCLeaveRoom: %v, %v", p.SnId, pack)
|
||||||
this.DelAudience(p)
|
this.DelPlayer(p)
|
||||||
if !p.IsRob {
|
|
||||||
this.lastTime = time.Now()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) DelAudience(p *Player) bool {
|
// AudienceSit 观众坐下
|
||||||
logger.Logger.Infof("(this *Scene:%v) DelAudience(%v) ", this.sceneId, p.SnId)
|
|
||||||
if p.scene != this {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if this.gameSess != nil {
|
|
||||||
this.gameSess.DelPlayer(p)
|
|
||||||
}
|
|
||||||
delete(this.audiences, p.SnId)
|
|
||||||
if !p.IsRob {
|
|
||||||
delete(this.gameCtx, p.SnId)
|
|
||||||
}
|
|
||||||
p.scene = nil
|
|
||||||
SceneMgrSingleton.OnPlayerLeaveScene(this, p)
|
|
||||||
//from gameserver, so don't need send msg
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
//观众坐下
|
|
||||||
//func (this *Scene) AudienceSit(p *Player, pos int) bool {
|
|
||||||
// logger.Logger.Infof("(this *Scene:%v) AudienceSit(%v, %v, %v) ", this.sceneId, p.SnId, pos)
|
|
||||||
// if _, exist := this.audiences[p.SnId]; exist {
|
|
||||||
// if pos == -1 && !this.IsHundredScene() { //自动匹配;百人场没座位概念
|
|
||||||
// for i := 0; i < this.playerNum; i++ {
|
|
||||||
// if this.seats[i] == nil {
|
|
||||||
// pos = i
|
|
||||||
// break
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if pos != -1 || this.IsHundredScene() {
|
|
||||||
// if !this.IsHundredScene() {
|
|
||||||
// if this.seats[pos] != nil {
|
|
||||||
// return false
|
|
||||||
// }
|
|
||||||
// p.pos = pos
|
|
||||||
// p.applyPos = -1
|
|
||||||
// this.seats[pos] = p
|
|
||||||
// }
|
|
||||||
// delete(this.audiences, p.SnId)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// p.scene = this
|
|
||||||
// this.players[p.SnId] = p
|
|
||||||
//
|
|
||||||
// NpcServerAgentSington.OnPlayerEnterScene(this, p)
|
|
||||||
// if this.IsCoinScene() {
|
|
||||||
// CoinSceneMgrSingleton.OnPlayerEnter(p, int32(this.sceneId))
|
|
||||||
// } else if this.IsHallScene() {
|
|
||||||
// PlatformMgrSingleton.OnPlayerEnterScene(this, p)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// msg := &protocol.WGAudienceSit{
|
|
||||||
// SnId: proto.Int32(p.SnId),
|
|
||||||
// SceneId: proto.Int(this.sceneId),
|
|
||||||
// Pos: proto.Int(pos),
|
|
||||||
// }
|
|
||||||
// p.takeCoin = p.Coin
|
|
||||||
// msg.TakeCoin = proto.Int64(p.Coin)
|
|
||||||
// proto.SetDefaults(msg)
|
|
||||||
// this.SendToGame(int(protocol.MmoPacketID_PACKET_WG_AUDIENCESIT), msg)
|
|
||||||
// this.lastTime = time.Now()
|
|
||||||
// return true
|
|
||||||
// }
|
|
||||||
// return false
|
|
||||||
//}
|
|
||||||
|
|
||||||
func (this *Scene) AudienceSit(p *Player, pos int) bool {
|
func (this *Scene) AudienceSit(p *Player, pos int) bool {
|
||||||
logger.Logger.Infof("(this *Scene:%v) AudienceSit(%v, %v, %v) ", this.sceneId, p.SnId, pos, this.dbGameFree.GetId())
|
logger.Logger.Infof("(this *Scene:%v) AudienceSit(%v, %v, %v) ", this.sceneId, p.SnId, pos, this.dbGameFree.GetId())
|
||||||
if _, exist := this.audiences[p.SnId]; exist {
|
if _, exist := this.audiences[p.SnId]; exist {
|
||||||
delete(this.audiences, p.SnId)
|
delete(this.audiences, p.SnId)
|
||||||
p.scene = this
|
p.scene = this
|
||||||
this.players[p.SnId] = p
|
|
||||||
|
|
||||||
msg := &serverproto.WGAudienceSit{
|
|
||||||
SnId: proto.Int32(p.SnId),
|
|
||||||
SceneId: proto.Int(this.sceneId),
|
|
||||||
Pos: proto.Int(pos),
|
|
||||||
}
|
|
||||||
p.takeCoin = p.Coin
|
p.takeCoin = p.Coin
|
||||||
msg.TakeCoin = proto.Int64(p.Coin)
|
this.players[p.SnId] = p
|
||||||
proto.SetDefaults(msg)
|
msg := &serverproto.WGAudienceSit{
|
||||||
|
SnId: proto.Int32(p.SnId),
|
||||||
|
TakeCoin: p.Coin,
|
||||||
|
SceneId: proto.Int(this.sceneId),
|
||||||
|
Pos: proto.Int(pos),
|
||||||
|
}
|
||||||
this.SendToGame(int(serverproto.SSPacketID_PACKET_WG_AUDIENCESIT), msg)
|
this.SendToGame(int(serverproto.SSPacketID_PACKET_WG_AUDIENCESIT), msg)
|
||||||
if !p.IsRob {
|
if !p.IsRob {
|
||||||
this.lastTime = time.Now()
|
this.lastTime = time.Now()
|
||||||
|
@ -871,6 +748,8 @@ func (this *Scene) GetAudienceCnt() int {
|
||||||
return len(this.audiences)
|
return len(this.audiences)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsFull 是否满人
|
||||||
|
// 不包含观众
|
||||||
func (this *Scene) IsFull() bool {
|
func (this *Scene) IsFull() bool {
|
||||||
return this.GetPlayerCnt() >= this.playerNum
|
return this.GetPlayerCnt() >= this.playerNum
|
||||||
}
|
}
|
||||||
|
@ -883,23 +762,24 @@ func (this *Scene) AllIsRobot() bool {
|
||||||
return len(this.players) == this.robotNum
|
return len(this.players) == this.robotNum
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnClose 房间销毁
|
||||||
func (this *Scene) OnClose() {
|
func (this *Scene) OnClose() {
|
||||||
scDestroyRoom := &hallproto.SCDestroyRoom{
|
scDestroyRoom := &hallproto.SCDestroyRoom{
|
||||||
RoomId: proto.Int(this.sceneId),
|
RoomId: proto.Int(this.sceneId),
|
||||||
OpRetCode: hallproto.OpResultCode_Game_OPRC_Sucess_Game,
|
OpRetCode: hallproto.OpResultCode_Game_OPRC_Sucess_Game,
|
||||||
IsForce: proto.Int(1),
|
IsForce: proto.Int(1),
|
||||||
}
|
}
|
||||||
proto.SetDefaults(scDestroyRoom)
|
|
||||||
this.Broadcast(int(hallproto.GameHallPacketID_PACKET_SC_DESTROYROOM), scDestroyRoom, 0)
|
this.Broadcast(int(hallproto.GameHallPacketID_PACKET_SC_DESTROYROOM), scDestroyRoom, 0)
|
||||||
|
|
||||||
|
this.deleting = true
|
||||||
this.closed = true
|
this.closed = true
|
||||||
this.sp.OnStop(this)
|
this.sp.OnStop(this)
|
||||||
//NpcServerAgentSington.OnSceneClose(this)
|
|
||||||
for _, p := range this.players {
|
for _, p := range this.players {
|
||||||
this.DelPlayer(p)
|
this.DelPlayer(p)
|
||||||
}
|
}
|
||||||
for _, p := range this.audiences {
|
for _, p := range this.audiences {
|
||||||
this.DelAudience(p)
|
this.DelPlayer(p)
|
||||||
}
|
}
|
||||||
this.players = nil
|
this.players = nil
|
||||||
this.audiences = nil
|
this.audiences = nil
|
||||||
|
@ -913,17 +793,13 @@ func (this *Scene) SendToGame(packetId int, pack interface{}) bool {
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
func (this *Scene) SendToClient(packetid int, rawpack interface{}, excludeId int32) {
|
|
||||||
for snid, value := range this.players {
|
func (this *Scene) SendToClient(packetId int, pack interface{}, excludeId int32) {
|
||||||
if snid == excludeId {
|
for v, value := range this.players {
|
||||||
|
if v == excludeId {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
value.SendToClient(packetid, rawpack)
|
value.SendToClient(packetId, pack)
|
||||||
}
|
|
||||||
}
|
|
||||||
func (this *Scene) BilledRoomCard(snid []int32) {
|
|
||||||
if this.sp != nil {
|
|
||||||
this.sp.BilledRoomCard(this, snid)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -936,7 +812,7 @@ func (this *Scene) IsLongTimeInactive() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) DoDelete(isGrace bool) {
|
func (this *Scene) SendGameDelete(isGrace bool) {
|
||||||
if !isGrace {
|
if !isGrace {
|
||||||
this.deleting = true
|
this.deleting = true
|
||||||
this.force = true
|
this.force = true
|
||||||
|
@ -949,46 +825,32 @@ func (this *Scene) DoDelete(isGrace bool) {
|
||||||
logger.Logger.Tracef("WG_DESTROYSCENE: %v", pack)
|
logger.Logger.Tracef("WG_DESTROYSCENE: %v", pack)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) Shutdown() {
|
// IsMatchScene 比赛场
|
||||||
if this.hadCost && this.sp != nil {
|
|
||||||
this.sp.OnShutdown(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 小游戏场
|
|
||||||
func (this *Scene) IsMiniGameScene() bool {
|
|
||||||
return this.sceneId >= common.MiniGameSceneStartId && this.sceneId < common.MiniGameSceneMaxId
|
|
||||||
}
|
|
||||||
|
|
||||||
// 比赛场
|
|
||||||
func (this *Scene) IsMatchScene() bool {
|
func (this *Scene) IsMatchScene() bool {
|
||||||
return this.sceneId >= common.MatchSceneStartId && this.sceneId < common.MatchSceneMaxId
|
return this.sceneId >= common.MatchSceneStartId && this.sceneId < common.MatchSceneMaxId
|
||||||
}
|
}
|
||||||
|
|
||||||
// 大厅场
|
// IsCoinScene 金币场
|
||||||
func (this *Scene) IsHallScene() bool {
|
|
||||||
return this.sceneId >= common.HallSceneStartId && this.sceneId < common.HallSceneMaxId
|
|
||||||
}
|
|
||||||
|
|
||||||
// 金币场
|
|
||||||
func (this *Scene) IsCoinScene() bool {
|
func (this *Scene) IsCoinScene() bool {
|
||||||
return this.sceneId >= common.CoinSceneStartId && this.sceneId < common.CoinSceneMaxId
|
return this.sceneId >= common.CoinSceneStartId && this.sceneId < common.CoinSceneMaxId
|
||||||
}
|
}
|
||||||
|
|
||||||
// 百人场
|
// IsHundredScene 百人场
|
||||||
func (this *Scene) IsHundredScene() bool {
|
func (this *Scene) IsHundredScene() bool {
|
||||||
return this.sceneId >= common.HundredSceneStartId && this.sceneId < common.HundredSceneMaxId
|
return this.sceneId >= common.HundredSceneStartId && this.sceneId < common.HundredSceneMaxId
|
||||||
}
|
}
|
||||||
|
|
||||||
// 私人房间
|
// IsPrivateScene 私人房间
|
||||||
func (this *Scene) IsPrivateScene() bool {
|
func (this *Scene) IsPrivateScene() bool {
|
||||||
return this.sceneId >= common.PrivateSceneStartId && this.sceneId < common.PrivateSceneMaxId || this.sceneMode == common.SceneMode_Private
|
return this.sceneId >= common.PrivateSceneStartId && this.sceneId < common.PrivateSceneMaxId || this.sceneMode == common.SceneMode_Private
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsSceneMode 房间模式
|
||||||
func (this *Scene) IsSceneMode(mode int) bool {
|
func (this *Scene) IsSceneMode(mode int) bool {
|
||||||
return this.sceneMode == mode
|
return this.sceneMode == mode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsRankMatch 排位赛
|
||||||
func (this *Scene) IsRankMatch() bool {
|
func (this *Scene) IsRankMatch() bool {
|
||||||
if this.dbGameFree == nil {
|
if this.dbGameFree == nil {
|
||||||
return false
|
return false
|
||||||
|
@ -996,6 +858,7 @@ func (this *Scene) IsRankMatch() bool {
|
||||||
return this.dbGameFree.RankType > 0
|
return this.dbGameFree.RankType > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsTestScene 试玩场
|
||||||
func (this *Scene) IsTestScene() bool {
|
func (this *Scene) IsTestScene() bool {
|
||||||
if this.dbGameFree != nil {
|
if this.dbGameFree != nil {
|
||||||
return this.dbGameFree.GetSceneType() == -1
|
return this.dbGameFree.GetSceneType() == -1
|
||||||
|
@ -1010,6 +873,9 @@ func (this *Scene) IsTestScene() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) GetSceneName() string {
|
func (this *Scene) GetSceneName() string {
|
||||||
|
if this.dbGameFree != nil {
|
||||||
|
return this.dbGameFree.GetName() + this.dbGameFree.GetTitle()
|
||||||
|
}
|
||||||
if len(this.paramsEx) > 0 {
|
if len(this.paramsEx) > 0 {
|
||||||
dbGameFree := srvdata.PBDB_GameFreeMgr.GetData(this.paramsEx[0])
|
dbGameFree := srvdata.PBDB_GameFreeMgr.GetData(this.paramsEx[0])
|
||||||
if dbGameFree != nil {
|
if dbGameFree != nil {
|
||||||
|
@ -1020,6 +886,21 @@ func (this *Scene) GetSceneName() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) RandRobotCnt() {
|
func (this *Scene) RandRobotCnt() {
|
||||||
|
if this.dbGameFree != nil {
|
||||||
|
numrng := this.dbGameFree.GetRobotNumRng()
|
||||||
|
if len(numrng) >= 2 {
|
||||||
|
if numrng[1] == numrng[0] {
|
||||||
|
this.robotLimit = int(numrng[0])
|
||||||
|
} else {
|
||||||
|
if numrng[1] < numrng[0] {
|
||||||
|
numrng[1], numrng[0] = numrng[0], numrng[1]
|
||||||
|
}
|
||||||
|
this.robotLimit = int(numrng[1]) //int(numrng[0] + rand.Int31n(numrng[1]-numrng[0]) + 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if len(this.paramsEx) > 0 {
|
if len(this.paramsEx) > 0 {
|
||||||
gps := PlatformMgrSingleton.GetGameFree(this.limitPlatform.IdStr, this.paramsEx[0])
|
gps := PlatformMgrSingleton.GetGameFree(this.limitPlatform.IdStr, this.paramsEx[0])
|
||||||
if gps != nil {
|
if gps != nil {
|
||||||
|
@ -1045,7 +926,7 @@ func (this *Scene) RandRobotCnt() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) isPlatform(platform string) bool {
|
func (this *Scene) IsPlatform(platform string) bool {
|
||||||
if platform == "0" || platform == this.limitPlatform.IdStr {
|
if platform == "0" || platform == this.limitPlatform.IdStr {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -1106,31 +987,7 @@ func (this *Scene) GetTruePlayerCnt() int {
|
||||||
return len(this.players) - this.robotNum
|
return len(this.players) - this.robotNum
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) GetPlayerType(gameid, gamefreeid int32) (types []int32) {
|
func (this *Scene) Broadcast(packetId int, msg rawproto.Message, excludeSid int64) {
|
||||||
for _, p := range this.players {
|
|
||||||
t := int32(0)
|
|
||||||
if p.IsRob {
|
|
||||||
t = common.PlayerType_Rob
|
|
||||||
} else if p.WBLevel < 0 {
|
|
||||||
t = common.PlayerType_Black
|
|
||||||
} else if p.WBLevel > 0 {
|
|
||||||
t = common.PlayerType_White
|
|
||||||
} else {
|
|
||||||
pt := p.CheckType(gameid, gamefreeid)
|
|
||||||
if pt != nil {
|
|
||||||
t = pt.GetId()
|
|
||||||
} else {
|
|
||||||
t = common.PlayerType_Undefine
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !common.InSliceInt32(types, t) {
|
|
||||||
types = append(types, t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *Scene) Broadcast(packetid int, msg rawproto.Message, excludeSid int64) {
|
|
||||||
mgs := make(map[*netlib.Session][]*srvlibproto.MCSessionUnion)
|
mgs := make(map[*netlib.Session][]*srvlibproto.MCSessionUnion)
|
||||||
for _, p := range this.players {
|
for _, p := range this.players {
|
||||||
if p != nil {
|
if p != nil {
|
||||||
|
@ -1159,7 +1016,7 @@ func (this *Scene) Broadcast(packetid int, msg rawproto.Message, excludeSid int6
|
||||||
|
|
||||||
for gateSess, v := range mgs {
|
for gateSess, v := range mgs {
|
||||||
if gateSess != nil && len(v) != 0 {
|
if gateSess != nil && len(v) != 0 {
|
||||||
pack, err := common.CreateMulticastPacket(packetid, msg, v...)
|
pack, err := common.CreateMulticastPacket(packetId, msg, v...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
proto.SetDefaults(pack)
|
proto.SetDefaults(pack)
|
||||||
gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack)
|
gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack)
|
||||||
|
@ -1171,12 +1028,11 @@ func (this *Scene) Broadcast(packetid int, msg rawproto.Message, excludeSid int6
|
||||||
func (this *Scene) HasSameIp(ip string) bool {
|
func (this *Scene) HasSameIp(ip string) bool {
|
||||||
for _, p := range this.players {
|
for _, p := range this.players {
|
||||||
if !p.IsRob {
|
if !p.IsRob {
|
||||||
if p.GMLevel == 0 && p.Ip == ip {
|
if p.Ip == ip {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1184,45 +1040,6 @@ func (this *Scene) IsPreCreateScene() bool {
|
||||||
return this.dbGameFree.GetCreateRoomNum() > 0
|
return this.dbGameFree.GetCreateRoomNum() > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) PlayerTryChange() {
|
|
||||||
var member []*Player
|
|
||||||
var player *Player
|
|
||||||
for _, value := range this.players {
|
|
||||||
if !value.IsRob {
|
|
||||||
member = append(member, value)
|
|
||||||
player = value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(member) <= 1 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
gameFreeId := this.dbGameFree.GetId()
|
|
||||||
gameConfig := PlatformMgrSingleton.GetGameFree(player.Platform, gameFreeId)
|
|
||||||
if gameConfig != nil && gameConfig.DbGameFree.GetMatchMode() == 1 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for i := 0; i < len(member)-1; i++ {
|
|
||||||
p := member[i]
|
|
||||||
other := member[i+1:]
|
|
||||||
if this.dbGameFree.GetSamePlaceLimit() > 0 && sceneLimitMgr.LimitSamePlaceBySnid(other, p,
|
|
||||||
this.dbGameFree.GetGameId(), this.dbGameFree.GetSamePlaceLimit()) {
|
|
||||||
if p.scene.IsPrivateScene() {
|
|
||||||
//if ClubSceneMgrSington.PlayerInChanging(p) {
|
|
||||||
// continue
|
|
||||||
//}
|
|
||||||
//ClubSceneMgrSington.PlayerTryChange(p, gameFreeId, []int32{int32(this.sceneId)}, false)
|
|
||||||
} else {
|
|
||||||
if CoinSceneMgrSingleton.PlayerInChanging(p) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
excludeSceneIds := p.lastSceneId[gameFreeId]
|
|
||||||
CoinSceneMgrSingleton.PlayerTryChange(p, gameFreeId, excludeSceneIds, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *Scene) GetParamEx(idx int) int32 {
|
func (this *Scene) GetParamEx(idx int) int32 {
|
||||||
if idx < 0 || idx > len(this.paramsEx) {
|
if idx < 0 || idx > len(this.paramsEx) {
|
||||||
return -1
|
return -1
|
||||||
|
@ -1238,7 +1055,7 @@ func (this *Scene) SetParamEx(idx int, val int32) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Scene) TryForceDelectMatchInfo() {
|
func (this *Scene) TryForceDeleteMatchInfo() {
|
||||||
if !this.IsMatchScene() {
|
if !this.IsMatchScene() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -435,18 +435,18 @@ func (m *SceneMgr) OnMiniTimer() {
|
||||||
case s.IsCoinScene():
|
case s.IsCoinScene():
|
||||||
if s.IsLongTimeInactive() {
|
if s.IsLongTimeInactive() {
|
||||||
if s.dbGameFree.GetCreateRoomNum() == 0 {
|
if s.dbGameFree.GetCreateRoomNum() == 0 {
|
||||||
logger.Logger.Warnf("SceneMgr.DeleteLongTimeInactive CoinScene DoDelete scene:%v IsLongTimeInactive", s.sceneId)
|
logger.Logger.Warnf("SceneMgr.DeleteLongTimeInactive CoinScene SendGameDelete scene:%v IsLongTimeInactive", s.sceneId)
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
if s.dbGameFree.GetCreateRoomNum() > 0 && s.csp != nil && s.csp.GetRoomNum() > int(s.dbGameFree.GetCreateRoomNum()) {
|
if s.dbGameFree.GetCreateRoomNum() > 0 && s.csp != nil && s.csp.GetRoomNum() > int(s.dbGameFree.GetCreateRoomNum()) {
|
||||||
logger.Logger.Warnf("SceneMgr.DeleteLongTimeInactive CoinScene DoDelete scene:%v IsLongTimeInactive", s.sceneId)
|
logger.Logger.Warnf("SceneMgr.DeleteLongTimeInactive CoinScene SendGameDelete scene:%v IsLongTimeInactive", s.sceneId)
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case s.IsPrivateScene():
|
case s.IsPrivateScene():
|
||||||
if s.IsLongTimeInactive() {
|
if s.IsLongTimeInactive() {
|
||||||
logger.Logger.Warnf("SceneMgr.DeleteLongTimeInactive PrivateScene DoDelete scene:%v IsLongTimeInactive", s.sceneId)
|
logger.Logger.Warnf("SceneMgr.DeleteLongTimeInactive PrivateScene SendGameDelete scene:%v IsLongTimeInactive", s.sceneId)
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1747,24 +1747,24 @@ func init() {
|
||||||
switch msg.DestroyType {
|
switch msg.DestroyType {
|
||||||
case 1: //删除所有空房间
|
case 1: //删除所有空房间
|
||||||
for _, s := range SceneMgrSingleton.scenes {
|
for _, s := range SceneMgrSingleton.scenes {
|
||||||
if !s.isPlatform(platform) {
|
if !s.IsPlatform(platform) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if s != nil && !s.deleting && len(s.players) == 0 {
|
if s != nil && !s.deleting && len(s.players) == 0 {
|
||||||
logger.Logger.Warnf("WebService SpecailEmptySceneId destroyroom scene:%v", s.sceneId)
|
logger.Logger.Warnf("WebService SpecailEmptySceneId destroyroom scene:%v", s.sceneId)
|
||||||
s.TryForceDelectMatchInfo()
|
s.TryForceDeleteMatchInfo()
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 2: //删除所有未开始的房间
|
case 2: //删除所有未开始的房间
|
||||||
for _, s := range SceneMgrSingleton.scenes {
|
for _, s := range SceneMgrSingleton.scenes {
|
||||||
if !s.isPlatform(platform) {
|
if !s.IsPlatform(platform) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if s != nil && !s.deleting && !s.starting && !s.IsHundredScene() {
|
if s != nil && !s.deleting && !s.starting && !s.IsHundredScene() {
|
||||||
logger.Logger.Warnf("WebService SpecailUnstartSceneId destroyroom scene:%v", s.sceneId)
|
logger.Logger.Warnf("WebService SpecailUnstartSceneId destroyroom scene:%v", s.sceneId)
|
||||||
s.TryForceDelectMatchInfo()
|
s.TryForceDeleteMatchInfo()
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default: //删除指定房间
|
default: //删除指定房间
|
||||||
|
@ -1780,14 +1780,14 @@ func init() {
|
||||||
pack.Msg = "the sceneid is nil"
|
pack.Msg = "the sceneid is nil"
|
||||||
return common.ResponseTag_NoFindRoom, pack
|
return common.ResponseTag_NoFindRoom, pack
|
||||||
}
|
}
|
||||||
if !s.isPlatform(platform) {
|
if !s.IsPlatform(platform) {
|
||||||
pack.Tag = webapiproto.TagCode_FAILED
|
pack.Tag = webapiproto.TagCode_FAILED
|
||||||
pack.Msg = "the sceneid is not ower platform"
|
pack.Msg = "the sceneid is not ower platform"
|
||||||
return common.ResponseTag_NoFindRoom, pack
|
return common.ResponseTag_NoFindRoom, pack
|
||||||
}
|
}
|
||||||
logger.Logger.Warnf("WebService destroyroom scene:%v", s.sceneId)
|
logger.Logger.Warnf("WebService destroyroom scene:%v", s.sceneId)
|
||||||
s.TryForceDelectMatchInfo()
|
s.TryForceDeleteMatchInfo()
|
||||||
s.DoDelete(false)
|
s.SendGameDelete(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return common.ResponseTag_Ok, pack
|
return common.ResponseTag_Ok, pack
|
||||||
|
|
Loading…
Reference in New Issue