game_sync/worldsrv/hundredscenemgr.go

743 lines
24 KiB
Go

package main
import (
"math/rand"
"mongo.games.com/game/protocol/webapi"
"time"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/proto"
gamehall_proto "mongo.games.com/game/protocol/gamehall"
server_proto "mongo.games.com/game/protocol/server"
"mongo.games.com/game/srvdata"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/module"
"mongo.games.com/goserver/srvlib"
)
const (
HundredSceneType_Primary int = iota //初级
HundredSceneType_Mid //中级
HundredSceneType_Senior //高级
HundredSceneType_Professor //专家
HundredSceneType_Experience //体验场
HundredSceneType_Max
)
const (
HundredSceneOp_Enter int32 = iota //进入
HundredSceneOp_Leave //离开
HundredSceneOp_Change //换桌
HundredSceneOp_Audience //观战
)
var HundredSceneMgrSington = &HundredSceneMgr{
//分平台管理
scenesOfPlatform: make(map[string]map[int32]*Scene),
platformOfScene: make(map[int32]string),
//分组管理
scenesOfGroup: make(map[int32]map[int32]*Scene),
groupOfScene: make(map[int32]int32),
playerIning: make(map[int32]int32),
}
type HundredSceneMgr struct {
//分平台管理
scenesOfPlatform map[string]map[int32]*Scene // platform:gamefreeid:房间
platformOfScene map[int32]string // sceneid:platform
//分组管理
scenesOfGroup map[int32]map[int32]*Scene // groupid:gamefreeid:房间
groupOfScene map[int32]int32 // sceneid:groupid
playerIning map[int32]int32 // snid:sceneid
}
func (this *HundredSceneMgr) GetPlatformNameBySceneId(sceneid int32) (string, bool) {
if name, exist := this.platformOfScene[sceneid]; exist {
return name, exist
}
if _, exist := this.groupOfScene[sceneid]; exist {
s := SceneMgrSingleton.GetScene(int(sceneid))
if s != nil && s.limitPlatform != nil {
return s.limitPlatform.IdStr, true
}
}
return DefaultPlatform, false
}
func (this *HundredSceneMgr) RebindPlayerSnId(oldSnId, newSnId int32) {
if id, exist := this.playerIning[oldSnId]; exist {
delete(this.playerIning, oldSnId)
this.playerIning[newSnId] = id
}
for _, ss := range this.scenesOfPlatform {
for _, s := range ss {
s.RebindPlayerSnId(oldSnId, newSnId)
}
}
for _, ss := range this.scenesOfGroup {
for _, s := range ss {
s.RebindPlayerSnId(oldSnId, newSnId)
}
}
}
func (this *HundredSceneMgr) PlayerEnter(p *Player, id int32) gamehall_proto.OpResultCode_Hundred {
logger.Logger.Tracef("(this *HundredSceneMgr) PlayerEnter snid:%v id:%v", p.SnId, id)
if oid, exist := this.playerIning[p.SnId]; exist {
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerEnter:%v snid:%v find in id:%v PlayerEnter return false", id, p.SnId, oid)
return gamehall_proto.OpResultCode_Hundred_OPRC_Error_Hundred
}
if p.scene != nil {
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerEnter:%v snid:%v find in id:%v PlayerEnter return false", id, p.SnId, p.scene.sceneId)
return gamehall_proto.OpResultCode_Hundred_OPRC_Error_Hundred
}
if p.isDelete { //删档用户不让进游戏
return gamehall_proto.OpResultCode_Hundred_OPRC_RoomHadClosed_Hundred
}
//多平台支持
var limitPlatform *Platform
platformName := DefaultPlatform
platform := PlatformMgrSingleton.GetPlatform(p.Platform)
if platform != nil && platform.Isolated {
platformName = platform.IdStr
limitPlatform = platform
} else {
limitPlatform = PlatformMgrSingleton.GetPlatform(DefaultPlatform)
}
gps := PlatformMgrSingleton.GetGameFree(limitPlatform.IdStr, id)
if gps == nil {
return gamehall_proto.OpResultCode_Hundred_OPRC_RoomHadClosed_Hundred
}
if gps.GroupId != 0 { //按分组进入场景游戏
pgg := PlatformGameGroupMgrSington.GetGameGroup(gps.GroupId)
if pgg != nil {
if _, ok := this.scenesOfGroup[gps.GroupId]; !ok {
this.scenesOfGroup[gps.GroupId] = make(map[int32]*Scene)
}
if ss, ok := this.scenesOfGroup[gps.GroupId]; ok {
if s, ok := ss[id]; !ok {
s = this.CreateNewScene(id, gps.GroupId, limitPlatform, pgg.DbGameFree)
if s != nil {
ss[id] = s
this.groupOfScene[int32(s.sceneId)] = gps.GroupId
logger.Logger.Tracef("(this *HundredSceneMgr) PlayerEnter(groupid=%v) Create %v scene success.", gps.GroupId, id)
} else {
logger.Logger.Tracef("(this *HundredSceneMgr) PlayerEnter(groupid=%v) Create %v scene failed.", gps.GroupId, id)
}
}
//尝试进入
if s, ok := ss[id]; ok && s != nil {
if s.PlayerEnter(p, -1, true) {
this.OnPlayerEnter(p, id)
return gamehall_proto.OpResultCode_Hundred_OPRC_Sucess_Hundred
} else {
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerEnter(groupid=%v) enter %v scene failed.", gps.GroupId, id)
}
} else {
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerEnter(groupid=%v) get %v scene failed.", gps.GroupId, id)
}
}
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerEnter(groupid=%v) snid:%v find in id:%v csp.PlayerEnter return false", gps.GroupId, p.SnId, id)
return gamehall_proto.OpResultCode_Hundred_OPRC_Error_Hundred
}
}
//没有场景,尝试创建
if _, ok := this.scenesOfPlatform[platformName]; !ok {
this.scenesOfPlatform[platformName] = make(map[int32]*Scene)
}
if ss, ok := this.scenesOfPlatform[platformName]; ok {
if s, ok := ss[id]; !ok {
s = this.CreateNewScene(id, gps.GroupId, limitPlatform, gps.DbGameFree)
if s != nil {
ss[id] = s
this.platformOfScene[int32(s.sceneId)] = platformName
logger.Logger.Tracef("(this *HundredSceneMgr) PlayerEnter(platform=%v) Create %v scene success.", platformName, id)
} else {
logger.Logger.Tracef("(this *HundredSceneMgr) PlayerEnter(platform=%v) Create %v scene failed.", platformName, id)
}
}
//尝试进入
if s, ok := ss[id]; ok && s != nil {
if s.PlayerEnter(p, -1, true) {
this.OnPlayerEnter(p, id)
return gamehall_proto.OpResultCode_Hundred_OPRC_Sucess_Hundred
} else {
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerEnter(platform=%v) enter %v scene failed.", platformName, id)
}
} else {
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerEnter(platform=%v) get %v scene failed.", platformName, id)
}
}
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerEnter(platform=%v) snid:%v find in id:%v csp.PlayerEnter return false", platformName, p.SnId, id)
return gamehall_proto.OpResultCode_Hundred_OPRC_SceneServerMaintain_Hundred
}
func (this *HundredSceneMgr) OnPlayerEnter(p *Player, id int32) {
this.playerIning[p.SnId] = id
}
func (this *HundredSceneMgr) PlayerLeave(p *Player, reason int) bool {
if p == nil {
return false
}
if _, ok := this.playerIning[p.SnId]; ok {
if p.scene != nil {
p.scene.PlayerLeave(p, reason)
} else {
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerLeave(%v) found scene=nil", p.SnId)
delete(this.playerIning, p.SnId)
}
return true
} else {
if p.scene != nil && p.scene.IsHundredScene() {
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerLeave(%v) exception scene=%v gameid=%v", p.SnId, p.scene.sceneId, p.scene.gameId)
p.scene.PlayerLeave(p, reason)
return true
}
}
logger.Logger.Warnf("(this *HundredSceneMgr) PlayerLeave(%v) not found in hundred scene", p.SnId)
return false
}
func (this *HundredSceneMgr) PlayerTryLeave(p *Player) gamehall_proto.OpResultCode_Hundred {
if p.scene == nil || p.scene.gameSess == nil {
logger.Logger.Tracef("(csm *HundredSceneMgr) PlayerTryLeave p.scene == nil || p.scene.gameSess == nil snid:%v ", p.SnId)
return 1
}
//通知gamesrv托管
if _, ok := this.playerIning[p.SnId]; ok {
pack := &gamehall_proto.CSLeaveRoom{Mode: proto.Int(0)}
proto.SetDefaults(pack)
common.TransmitToServer(p.sid, int(gamehall_proto.GameHallPacketID_PACKET_CS_LEAVEROOM), pack, p.scene.gameSess.Session)
}
return 0
}
func (this *HundredSceneMgr) OnPlayerLeave(p *Player) {
delete(this.playerIning, p.SnId)
}
func (this *HundredSceneMgr) OnDestroyScene(sceneid int) {
var s *Scene
if platformName, ok := this.platformOfScene[int32(sceneid)]; ok {
if ss, ok := this.scenesOfPlatform[platformName]; ok {
for id, scene := range ss {
if scene.sceneId == sceneid {
s = scene
//删除玩家
for pid, hid := range this.playerIning {
if hid == id {
delete(this.playerIning, pid)
//TODO 非正常删除房间时,尝试同步金币
player := PlayerMgrSington.GetPlayerBySnId(pid)
if player != nil {
if !player.IsRob {
ctx := scene.GetPlayerGameCtx(player.SnId)
if ctx != nil {
//发送一个探针,等待ack后同步金币
player.TryRetrieveLostGameCoin(sceneid)
logger.Logger.Warnf("(this *HundredSceneMgr) OnDestroyScene(sceneid:%v) snid:%v SyncGameCoin", sceneid, player.SnId)
}
}
}
}
}
delete(ss, id)
break
}
}
}
}
if groupId, ok := this.groupOfScene[int32(sceneid)]; ok {
if ss, ok := this.scenesOfGroup[groupId]; ok {
for id, scene := range ss {
if scene.sceneId == sceneid {
s = scene
//删除玩家
for pid, hid := range this.playerIning {
if hid == id {
delete(this.playerIning, pid)
//TODO 非正常删除房间时,尝试同步金币
player := PlayerMgrSington.GetPlayerBySnId(pid)
if player != nil {
if !player.IsRob {
ctx := scene.GetPlayerGameCtx(player.SnId)
if ctx != nil {
//发送一个探针,等待ack后同步金币
player.TryRetrieveLostGameCoin(sceneid)
logger.Logger.Warnf("(this *HundredSceneMgr) OnDestroyScene(sceneid:%v) snid:%v SyncGameCoin", sceneid, player.SnId)
}
}
}
}
}
delete(ss, id)
break
}
}
}
}
this.PreCreateGame(s.limitPlatform.IdStr, []int32{s.dbGameFree.Id})
}
func (this *HundredSceneMgr) GetPlayerNums(p *Player, gameId, gameMode int32) []int32 {
//多平台支持
platformName := DefaultPlatform
platform := PlatformMgrSingleton.GetPlatform(p.Platform)
if platform != nil && platform.Isolated {
platformName = platform.IdStr
} else if p.Platform != DefaultPlatform {
platform = PlatformMgrSingleton.GetPlatform(DefaultPlatform)
}
var nums [HundredSceneType_Max]int32
wantNum := []int32{80, 50, 30, 20, 0}
for i := 0; i < HundredSceneType_Max; i++ {
if wantNum[i]/2 > 0 {
nums[i] = rand.Int31n(wantNum[i]/2) + wantNum[i]
}
}
if platform == nil {
return nums[:]
}
ids, _ := srvdata.DataMgr.GetGameFreeIds(gameId, gameMode)
for _, id := range ids {
gps := PlatformMgrSingleton.GetGameFree(platform.IdStr, id)
if gps != nil {
if gps.GroupId != 0 {
if ss, exist := this.scenesOfGroup[gps.GroupId]; exist {
for _, s := range ss {
if s.paramsEx[0] == id {
dbGame := srvdata.PBDB_GameFreeMgr.GetData(s.paramsEx[0])
sceneType := int(dbGame.GetSceneType()) - 1
if sceneType == -2 {
//体验场
sceneType = HundredSceneType_Experience
}
truePlayerCount := int32(s.GetPlayerCnt())
//获取fake用户数量
var fakePlayerCount int32
//if truePlayerCount >= 21 {
// correctNum := dbGame.GetCorrectNum()
// correctRate := dbGame.GetCorrectRate()
// fakePlayerCount = correctNum + truePlayerCount*correctRate/100 + dbGame.GetDeviation()
//}
if sceneType >= 0 && sceneType < HundredSceneType_Max {
nums[sceneType] += int32(truePlayerCount + fakePlayerCount)
}
break
}
}
}
} else {
if ss, ok := this.scenesOfPlatform[platformName]; ok {
for _, s := range ss {
if s.paramsEx[0] == id {
dbGame := srvdata.PBDB_GameFreeMgr.GetData(s.paramsEx[0])
sceneType := int(dbGame.GetSceneType()) - 1
if sceneType == -2 {
//体验场
sceneType = HundredSceneType_Experience
}
truePlayerCount := int32(s.GetPlayerCnt())
//获取fake用户数量
var fakePlayerCount int32
//if truePlayerCount >= 21 {
// correctNum := dbGame.GetCorrectNum()
// correctRate := dbGame.GetCorrectRate()
// fakePlayerCount = correctNum + truePlayerCount*correctRate/100 + dbGame.GetDeviation()
//}
if sceneType >= 0 && sceneType < HundredSceneType_Max {
nums[sceneType] += int32(truePlayerCount + fakePlayerCount)
}
break
}
}
}
}
}
}
return nums[:]
}
func (this *HundredSceneMgr) InHundredScene(p *Player) bool {
if p == nil {
logger.Logger.Tracef("(this *HundredSceneMgr) InHundredScene p == nil snid:%v ", p.SnId)
return false
}
if _, ok := this.playerIning[p.SnId]; ok {
return true
}
logger.Logger.Tracef("(csm *HundredSceneMgr) InHundredScene false snid:%v ", p.SnId)
return false
}
func (this *HundredSceneMgr) CreateNewScene(id, groupId int32, limitPlatform *Platform, dbGameFree *server_proto.DB_GameFree) *Scene {
if dbGameFree != nil {
dbGameRule := srvdata.PBDB_GameRuleMgr.GetData(dbGameFree.GetGameRule())
if dbGameRule != nil {
gameId := int(dbGameRule.GetGameId())
gs := GameSessMgrSington.GetMinLoadSess(gameId)
if gs != nil {
sceneId := SceneMgrSingleton.GenOneHundredSceneId()
gameMode := dbGameRule.GetGameMode()
params := dbGameRule.GetParams()
//SceneType := dbGameFree.GetSceneType()
scene := SceneMgrSingleton.CreateScene(0, 0, sceneId, gameId, int(gameMode), common.SceneMode_Public, 1, -1, params, gs, limitPlatform, groupId, dbGameFree, id)
if scene != nil {
scene.hallId = id
//移动到SceneMgr中集中处理
//if !scene.IsMatchScene() {
// //平台水池设置
// gs.DetectCoinPoolSetting(limitPlatform.Name, scene.hallId, scene.groupId)
//}
return scene
} else {
logger.Logger.Errorf("Create hundred scene %v-%v failed.", gameId, sceneId)
}
} else {
logger.Logger.Errorf("Game %v server session no found.", gameId)
}
} else {
logger.Logger.Errorf("Game rule data %v no found.", dbGameFree.GetGameRule())
}
} else {
logger.Logger.Errorf("Game free data %v no found.", id)
}
return nil
}
func (this *HundredSceneMgr) TryCreateRoom() {
if model.GameParamData.HundredScenePreCreate {
arr := srvdata.PBDB_GameFreeMgr.Datas.GetArr()
for _, dbGame := range arr {
if dbGame.GetGameId() <= 0 {
continue
}
if common.IsHundredType(dbGame.GetGameType()) { //百人场
id := dbGame.GetId()
for k, ss := range this.scenesOfPlatform {
if _, exist := ss[id]; !exist {
limitPlatform := PlatformMgrSingleton.GetPlatform(k)
if limitPlatform == nil || !limitPlatform.Isolated {
limitPlatform = PlatformMgrSingleton.GetPlatform(DefaultPlatform)
k = DefaultPlatform
continue
}
gps := PlatformMgrSingleton.GetGameFree(limitPlatform.IdStr, id)
if gps != nil && gps.GroupId == 0 && gps.Status {
scene := this.CreateNewScene(id, gps.GroupId, limitPlatform, gps.DbGameFree)
logger.Logger.Trace("(this *HundredSceneMgr) TryCreateRoom(platform) ", id, k, scene)
if scene != nil {
this.platformOfScene[int32(scene.sceneId)] = k
ss[id] = scene
}
}
}
}
}
}
}
}
func (this *HundredSceneMgr) PreCreateGame(platform string, createIds []int32) {
limitPlatform := PlatformMgrSingleton.GetPlatform(platform)
if limitPlatform == nil || !limitPlatform.Isolated {
limitPlatform = PlatformMgrSingleton.GetPlatform(DefaultPlatform)
}
if this.scenesOfPlatform[platform] == nil {
this.scenesOfPlatform[platform] = make(map[int32]*Scene)
}
//var platformName string
platformData := PlatformMgrSingleton.GetPlatform(platform)
if platformData != nil && platformData.Isolated {
//platformName = platformData.Name
} else if platform != DefaultPlatform {
platformData = PlatformMgrSingleton.GetPlatform(DefaultPlatform)
}
if platformData.IdStr == DefaultPlatform {
return
}
if model.GameParamData.HundredScenePreCreate {
//不创建已经存在的场景
for _, id := range createIds {
dbGame := srvdata.PBDB_GameFreeMgr.GetData(id)
if common.IsHundredType(dbGame.GetGameType()) {
gps := PlatformMgrSingleton.GetGameFree(platformData.IdStr, id)
if gps != nil && gps.Status {
if gps.GroupId != 0 {
if this.scenesOfGroup[gps.GroupId] != nil && this.scenesOfGroup[gps.GroupId][id] != nil {
continue
} else {
scene := this.CreateNewScene(dbGame.GetId(), gps.GroupId, limitPlatform, gps.DbGameFree)
if scene != nil {
this.scenesOfGroup[gps.GroupId][id] = scene
this.groupOfScene[int32(scene.sceneId)] = gps.GroupId
}
}
} else {
if this.scenesOfPlatform[platform] != nil && this.scenesOfPlatform[platform][dbGame.GetId()] != nil {
continue
} else {
scene := this.CreateNewScene(dbGame.GetId(), gps.GroupId, limitPlatform, gps.DbGameFree)
if scene != nil {
this.platformOfScene[int32(scene.sceneId)] = platform
this.scenesOfPlatform[platform][dbGame.GetId()] = scene
}
}
}
}
}
}
}
}
func (this *HundredSceneMgr) OnPlatformCreate(p *Platform) {
if p != nil && p.Isolated && p.IdStr != DefaultPlatform {
if _, exist := this.scenesOfPlatform[p.IdStr]; !exist {
this.scenesOfPlatform[p.IdStr] = make(map[int32]*Scene)
if model.GameParamData.HundredScenePreCreate {
arr := srvdata.PBDB_GameFreeMgr.Datas.GetArr()
for _, dbGame := range arr {
if common.IsHundredType(dbGame.GetGameType()) { //百人场
id := dbGame.GetId()
gps := PlatformMgrSingleton.GetGameFree(p.IdStr, id)
if gps != nil {
if gps.GroupId != 0 {
if ss, ok := this.scenesOfGroup[gps.GroupId]; ok {
if _, exist := ss[id]; !exist {
pgg := PlatformGameGroupMgrSington.GetGameGroup(gps.GroupId)
if pgg != nil {
scene := this.CreateNewScene(id, gps.GroupId, p, pgg.DbGameFree)
logger.Logger.Trace("(this *HundredSceneMgr) TryCreateRoom(group) ", id, gps.GroupId, scene)
if scene != nil {
ss[id] = scene
}
}
}
}
} else {
if ss, ok := this.scenesOfPlatform[p.IdStr]; ok {
if _, exist := ss[id]; !exist {
scene := this.CreateNewScene(id, gps.GroupId, p, gps.DbGameFree)
logger.Logger.Trace("(this *HundredSceneMgr) TryCreateRoom(platform) ", id, p.Name, scene)
if scene != nil {
ss[id] = scene
}
}
}
}
}
}
}
}
}
}
}
func (this *HundredSceneMgr) OnPlatformDestroy(p *Platform) {
if p == nil {
return
}
if ss, ok := this.scenesOfPlatform[p.IdStr]; ok {
pack := &server_proto.WGGraceDestroyScene{}
for _, scene := range ss {
pack.Ids = append(pack.Ids, int32(scene.sceneId))
}
srvlib.ServerSessionMgrSington.Broadcast(int(server_proto.SSPacketID_PACKET_WG_GRACE_DESTROYSCENE), pack, common.GetSelfAreaId(), srvlib.GameServerType)
}
}
func (this *HundredSceneMgr) OnPlatformChangeIsolated(p *Platform, isolated bool) {
if p != nil {
if isolated { //孤立
this.OnPlatformCreate(p) //预创建场景
} else {
if ss, ok := this.scenesOfPlatform[p.IdStr]; ok {
pack := &server_proto.WGGraceDestroyScene{}
for _, scene := range ss {
pack.Ids = append(pack.Ids, int32(scene.sceneId))
}
srvlib.ServerSessionMgrSington.Broadcast(int(server_proto.SSPacketID_PACKET_WG_GRACE_DESTROYSCENE), pack, common.GetSelfAreaId(), srvlib.GameServerType)
}
}
}
}
func (this *HundredSceneMgr) OnPlatformChangeDisabled(p *Platform, disabled bool) {
if p == nil {
return
}
if disabled {
if ss, ok := this.scenesOfPlatform[p.IdStr]; ok {
pack := &server_proto.WGGraceDestroyScene{}
for _, scene := range ss {
pack.Ids = append(pack.Ids, int32(scene.sceneId))
}
srvlib.ServerSessionMgrSington.Broadcast(int(server_proto.SSPacketID_PACKET_WG_GRACE_DESTROYSCENE), pack, common.GetSelfAreaId(), srvlib.GameServerType)
}
}
}
func (this *HundredSceneMgr) OnPlatformGameFreeUpdate(p *Platform, oldCfg, newCfg *webapi.GameFree) {
if p == nil || newCfg == nil {
return
}
if oldCfg.GroupId != newCfg.GroupId || oldCfg.GroupId != 0 {
if scenes, exist := this.scenesOfGroup[oldCfg.GroupId]; exist {
pack := &server_proto.WGGraceDestroyScene{}
if s, ok := scenes[newCfg.DbGameFree.Id]; ok {
pack.Ids = append(pack.Ids, int32(s.sceneId))
}
if len(pack.Ids) > 0 {
srvlib.ServerSessionMgrSington.Broadcast(int(server_proto.SSPacketID_PACKET_WG_GRACE_DESTROYSCENE),
pack, common.GetSelfAreaId(), srvlib.GameServerType)
}
}
return
}
if scenes, exist := this.scenesOfPlatform[p.IdStr]; exist {
pack := &server_proto.WGGraceDestroyScene{}
if s, ok := scenes[newCfg.DbGameFree.Id]; ok {
pack.Ids = append(pack.Ids, int32(s.sceneId))
}
if len(pack.Ids) > 0 {
srvlib.ServerSessionMgrSington.Broadcast(int(server_proto.SSPacketID_PACKET_WG_GRACE_DESTROYSCENE),
pack, common.GetSelfAreaId(), srvlib.GameServerType)
}
}
}
func (this *HundredSceneMgr) OnGameGroupUpdate(oldCfg, newCfg *webapi.GameConfigGroup) {
if newCfg == nil {
return
}
if scenes, exist := this.scenesOfGroup[newCfg.Id]; exist {
if s, ok := scenes[newCfg.DbGameFree.Id]; ok {
needDestroy := false
if s.dbGameFree.GetBot() != newCfg.DbGameFree.GetBot() ||
s.dbGameFree.GetBaseScore() != newCfg.DbGameFree.GetBaseScore() ||
s.dbGameFree.GetLimitCoin() != newCfg.DbGameFree.GetLimitCoin() ||
s.dbGameFree.GetMaxCoinLimit() != newCfg.DbGameFree.GetMaxCoinLimit() ||
!common.SliceInt64Equal(s.dbGameFree.GetRobotTakeCoin(), newCfg.DbGameFree.GetRobotTakeCoin()) ||
!common.SliceInt64Equal(s.dbGameFree.GetRobotLimitCoin(), newCfg.DbGameFree.GetRobotLimitCoin()) {
needDestroy = true
}
if needDestroy {
pack := &server_proto.WGGraceDestroyScene{}
pack.Ids = append(pack.Ids, int32(s.sceneId))
srvlib.ServerSessionMgrSington.Broadcast(int(server_proto.SSPacketID_PACKET_WG_GRACE_DESTROYSCENE), pack, common.GetSelfAreaId(), srvlib.GameServerType)
}
}
}
}
func (this *HundredSceneMgr) GetPlatformSceneByGameFreeId(platform string, gameFreeIds []int32) []*Scene {
platformName := DefaultPlatform
platformData := PlatformMgrSingleton.GetPlatform(platform)
if platformData != nil && platformData.Isolated {
platformName = platformData.IdStr
} else if platform != DefaultPlatform {
platformData = PlatformMgrSingleton.GetPlatform(DefaultPlatform)
}
gameScenes := []*Scene{}
for _, id := range gameFreeIds {
gps := PlatformMgrSingleton.GetGameFree(platformData.IdStr, id)
if gps != nil {
if gps.GroupId != 0 {
if ss, exist := this.scenesOfGroup[gps.GroupId]; exist {
if s, exist := ss[id]; exist && s != nil {
gameScenes = append(gameScenes, s)
}
}
} else {
if ss, ok := this.scenesOfPlatform[platformName]; ok {
if s, exist := ss[id]; exist && s != nil {
gameScenes = append(gameScenes, s)
}
}
}
}
}
return gameScenes
}
func (this *HundredSceneMgr) GetPlatformScene(platform string, gameid int32) []*Scene {
gameFreeIds := gameStateMgr.gameIds[gameid]
gameScenes := this.GetPlatformSceneByGameFreeId(platform, gameFreeIds)
if len(gameScenes) != len(gameFreeIds) {
createIds := []int32{}
for _, gfi := range gameFreeIds {
bFind := false
for _, s := range gameScenes {
if s.dbGameFree.GetId() == gfi {
bFind = false
break
}
}
if !bFind {
createIds = append(createIds, gfi)
}
}
if len(createIds) > 0 {
this.PreCreateGame(platform, createIds)
gameScenes = this.GetPlatformSceneByGameFreeId(platform, gameFreeIds)
}
}
return gameScenes
}
func (this *HundredSceneMgr) ModuleName() string {
return "HundredSceneMgr"
}
func (this *HundredSceneMgr) Init() {
for _, platform := range PlatformMgrSingleton.GetPlatforms() {
if platform.Isolated || platform.IdStr == DefaultPlatform {
this.scenesOfPlatform[platform.IdStr] = make(map[int32]*Scene)
}
}
}
// 撮合
func (this *HundredSceneMgr) Update() {
}
func (this *HundredSceneMgr) Shutdown() {
module.UnregisteModule(this)
}
func (this *HundredSceneMgr) OnPlatformDestroyByGameFreeId(p *Platform, gameFreeId int32) {
if p == nil {
return
}
if scenes, ok := this.scenesOfPlatform[p.IdStr]; ok {
for _, scene := range scenes {
pack := &server_proto.WGGraceDestroyScene{}
if scene.dbGameFree.Id == gameFreeId {
pack.Ids = append(pack.Ids, int32(scene.sceneId))
}
srvlib.ServerSessionMgrSington.Broadcast(int(server_proto.SSPacketID_PACKET_WG_GRACE_DESTROYSCENE), pack, common.GetSelfAreaId(), srvlib.GameServerType)
}
}
}
func init() {
module.RegisteModule(HundredSceneMgrSington, time.Second*5, 0)
PlatformMgrSingleton.RegisterObserver(HundredSceneMgrSington)
PlatformGameGroupMgrSington.RegisteObserver(HundredSceneMgrSington)
}