297 lines
8.2 KiB
Go
297 lines
8.2 KiB
Go
package base
|
||
|
||
import (
|
||
"mongo.games.com/game/common"
|
||
"mongo.games.com/game/proto"
|
||
"mongo.games.com/game/protocol/gamehall"
|
||
"mongo.games.com/game/protocol/server"
|
||
srvlibproto "mongo.games.com/goserver/srvlib/protocol"
|
||
"time"
|
||
|
||
"mongo.games.com/goserver/core/logger"
|
||
"mongo.games.com/goserver/core/module"
|
||
"mongo.games.com/goserver/core/netlib"
|
||
)
|
||
|
||
var SceneMgrSington = &SceneMgr{
|
||
scenes: make(map[int]*Scene),
|
||
scenesByGame: make(map[int]map[int]*Scene),
|
||
scenesByGameFree: make(map[int32]map[int]*Scene),
|
||
PlatformScene: make(map[string]bool),
|
||
}
|
||
|
||
type SceneMgr struct {
|
||
scenes map[int]*Scene
|
||
scenesByGame map[int]map[int]*Scene
|
||
scenesByGameFree map[int32]map[int]*Scene
|
||
lastSendJackPot time.Time
|
||
PlatformScene map[string]bool
|
||
}
|
||
|
||
func (this *SceneMgr) makeKey(gameid, gamemode int) int {
|
||
return int(gameid*10000 + gamemode)
|
||
}
|
||
|
||
func (this *SceneMgr) CreateScene(s *netlib.Session, sceneId, gameMode, sceneMode, gameId int, platform string,
|
||
params []int64, agentor, creator int32, replayCode string, hallId, groupId, totalOfGames int32,
|
||
dbGameFree *server.DB_GameFree, bEnterAfterStart bool, baseScore int32, playerNum int, chessRank []int32, paramsEx ...int32) *Scene {
|
||
scene := NewScene(s, sceneId, gameMode, sceneMode, gameId, platform, params, agentor, creator, replayCode,
|
||
hallId, groupId, totalOfGames, dbGameFree, bEnterAfterStart, baseScore, playerNum, chessRank, paramsEx...)
|
||
if scene == nil {
|
||
logger.Logger.Error("(this *SceneMgr) CreateScene, scene == nil")
|
||
return nil
|
||
}
|
||
this.scenes[scene.SceneId] = scene
|
||
if _, ok := this.PlatformScene[platform]; !ok {
|
||
this.PlatformScene[platform] = true
|
||
}
|
||
//
|
||
key := this.makeKey(gameId, gameMode)
|
||
if ss, exist := this.scenesByGame[key]; exist {
|
||
ss[scene.SceneId] = scene
|
||
} else {
|
||
ss = make(map[int]*Scene)
|
||
ss[scene.SceneId] = scene
|
||
this.scenesByGame[key] = ss
|
||
}
|
||
//
|
||
if ss, exist := this.scenesByGameFree[dbGameFree.GetId()]; exist {
|
||
ss[scene.SceneId] = scene
|
||
} else {
|
||
ss = make(map[int]*Scene)
|
||
ss[scene.SceneId] = scene
|
||
this.scenesByGameFree[dbGameFree.GetId()] = ss
|
||
}
|
||
scene.OnStart()
|
||
logger.Logger.Infof("(this *SceneMgr) CreateScene,New scene,id:[%d] replaycode:[%v]", scene.SceneId, replayCode)
|
||
return scene
|
||
}
|
||
|
||
func (this *SceneMgr) DestroyScene(sceneId int) {
|
||
if scene, exist := this.scenes[sceneId]; exist {
|
||
scene.OnStop()
|
||
//
|
||
key := this.makeKey(scene.GameId, scene.GameMode)
|
||
if ss, exist := this.scenesByGame[key]; exist {
|
||
delete(ss, scene.SceneId)
|
||
}
|
||
//
|
||
if ss, exist := this.scenesByGameFree[scene.GetGameFreeId()]; exist {
|
||
delete(ss, scene.SceneId)
|
||
}
|
||
delete(this.scenes, sceneId)
|
||
logger.Logger.Infof("(this *SceneMgr) DestroyScene, sceneid = %v", sceneId)
|
||
}
|
||
}
|
||
|
||
func (this *SceneMgr) GetPlayerNumByGameFree(platform string, gamefreeid, groupId int32) int32 {
|
||
var num int32
|
||
if ss, exist := SceneMgrSington.scenesByGameFree[gamefreeid]; exist {
|
||
for _, scene := range ss {
|
||
if groupId != 0 {
|
||
if scene.GroupId == groupId {
|
||
cnt := scene.GetRealPlayerCnt()
|
||
num += int32(cnt)
|
||
}
|
||
} else {
|
||
if scene.Platform == platform {
|
||
cnt := scene.GetRealPlayerCnt()
|
||
num += int32(cnt)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return num
|
||
}
|
||
|
||
func (this *SceneMgr) GetPlayerNumByGame(platform string, gameid, gamemode, groupId int32) map[int32]int32 {
|
||
nums := make(map[int32]int32)
|
||
key := this.makeKey(int(gameid), int(gamemode))
|
||
if ss, exist := SceneMgrSington.scenesByGame[key]; exist {
|
||
for _, scene := range ss {
|
||
if groupId != 0 {
|
||
if scene.GroupId == groupId {
|
||
cnt := scene.GetRealPlayerCnt()
|
||
nums[scene.GetGameFreeId()] = nums[scene.GetGameFreeId()] + int32(cnt)
|
||
}
|
||
} else {
|
||
if scene.Platform == platform {
|
||
cnt := scene.GetRealPlayerCnt()
|
||
nums[scene.GetGameFreeId()] = nums[scene.GetGameFreeId()] + int32(cnt)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return nums
|
||
}
|
||
|
||
func (this *SceneMgr) GetPlayersByGameFree(platform string, gamefreeid int32) []*Player {
|
||
players := make([]*Player, 0)
|
||
if ss, exist := SceneMgrSington.scenesByGameFree[gamefreeid]; exist {
|
||
for _, scene := range ss {
|
||
if scene.Platform == platform {
|
||
for _, p := range scene.Players {
|
||
if p != nil {
|
||
players = append(players, p)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return players
|
||
}
|
||
|
||
func (this *SceneMgr) GetScene(sceneId int) *Scene {
|
||
if s, exist := this.scenes[sceneId]; exist {
|
||
return s
|
||
}
|
||
return nil
|
||
}
|
||
func (this *SceneMgr) GetSceneByGameId(platform string, gameId int32) []*Scene {
|
||
key := this.makeKey(int(gameId), 0)
|
||
var ss []*Scene
|
||
if data, ok := this.scenesByGame[key]; ok {
|
||
for _, scene := range data {
|
||
if scene.Platform == platform {
|
||
ss = append(ss, scene)
|
||
}
|
||
}
|
||
}
|
||
return ss
|
||
}
|
||
func (this *SceneMgr) JackPotSync(platform string, gameIds ...int32) {
|
||
for _, gameId := range gameIds {
|
||
ss := this.GetSceneByGameId(platform, gameId)
|
||
if ss != nil {
|
||
mgs := make(map[*netlib.Session][]*srvlibproto.MCSessionUnion)
|
||
pack := &gamehall.SCHundredSceneGetGameJackpot{}
|
||
for _, s := range ss {
|
||
val := s.sp.GetJackPotVal(s)
|
||
if val > 0 {
|
||
jpfi := &gamehall.GameJackpotFundInfo{
|
||
GameFreeId: proto.Int32(s.DbGameFree.Id),
|
||
JackPotFund: proto.Int64(val),
|
||
}
|
||
pack.GameJackpotFund = append(pack.GameJackpotFund, jpfi)
|
||
}
|
||
for _, p := range s.Players {
|
||
if p != nil && p.gateSess != nil && p.IsOnLine() {
|
||
mgs[p.gateSess] = append(mgs[p.gateSess], &srvlibproto.MCSessionUnion{
|
||
Mccs: &srvlibproto.MCClientSession{
|
||
SId: proto.Int64(p.sid),
|
||
},
|
||
})
|
||
}
|
||
}
|
||
}
|
||
if len(pack.GameJackpotFund) == 0 || len(mgs) == 0 {
|
||
continue
|
||
}
|
||
proto.SetDefaults(pack)
|
||
//以平台为标识向该平台内所有玩家广播奖池变动消息,游戏内外的玩家可监听该消息,减少由gamesrv向worldsrv转发这一步
|
||
//tags := []string{platform}
|
||
//logger.Logger.Trace("jackpot avengers", pack)
|
||
//PlayerMgrSington.BroadcastMessageToGroup(int(gamehall.HundredScenePacketID_PACKET_SC_GAMEJACKPOT), pack, tags)
|
||
|
||
for gateSess, v := range mgs {
|
||
if gateSess != nil && len(v) != 0 {
|
||
cPack, err := MulticastMaker.CreateMulticastPacket(int(gamehall.HundredScenePacketID_PACKET_SC_GAMEJACKPOT), pack, v...)
|
||
if err == nil {
|
||
proto.SetDefaults(cPack)
|
||
gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), cPack)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
func (this *SceneMgr) OnMiniTimer() {
|
||
for _, scene := range this.scenes {
|
||
scene.SyncPlayerCoin()
|
||
}
|
||
}
|
||
|
||
func (this *SceneMgr) OnHourTimer() {
|
||
// for _, scene := range this.scenes {
|
||
// scene.OnHourTimer()
|
||
// }
|
||
}
|
||
|
||
func (this *SceneMgr) OnDayTimer() {
|
||
logger.Logger.Info("(this *SceneMgr) OnDayTimer")
|
||
// for _, scene := range this.scenes {
|
||
// scene.OnDayTimer()
|
||
// }
|
||
PlayerMgrSington.OnDayTimer()
|
||
}
|
||
|
||
func (this *SceneMgr) OnWeekTimer() {
|
||
logger.Logger.Info("(this *SceneMgr) OnWeekTimer")
|
||
// for _, scene := range this.scenes {
|
||
// scene.OnWeekTimer()
|
||
// }
|
||
}
|
||
|
||
func (this *SceneMgr) OnMonthTimer() {
|
||
logger.Logger.Info("(this *SceneMgr) OnMonthTimer")
|
||
// for _, scene := range this.scenes {
|
||
// scene.OnMonthTimer()
|
||
// }
|
||
}
|
||
|
||
func (this *SceneMgr) RebindPlayerSnId(oldSnId, newSnId int32) {
|
||
for _, s := range this.scenes {
|
||
s.RebindPlayerSnId(oldSnId, newSnId)
|
||
}
|
||
}
|
||
|
||
func (this *SceneMgr) DestoryAllScene() {
|
||
for _, s := range this.scenes {
|
||
s.Destroy(true)
|
||
}
|
||
}
|
||
|
||
// //////////////////////////////////////////////////////////////////
|
||
// / Module Implement [beg]
|
||
// //////////////////////////////////////////////////////////////////
|
||
func (this *SceneMgr) ModuleName() string {
|
||
return "SceneMgr"
|
||
}
|
||
|
||
func (this *SceneMgr) Init() {
|
||
//RestoreMDump(dumpFileName)
|
||
this.lastSendJackPot = time.Now()
|
||
}
|
||
|
||
func (this *SceneMgr) Update() {
|
||
for _, s := range this.scenes {
|
||
s.OnTick()
|
||
}
|
||
if time.Now().Sub(this.lastSendJackPot) > 0 {
|
||
this.lastSendJackPot = time.Now().Add(time.Second * 3)
|
||
for platform, _ := range this.PlatformScene {
|
||
if platform != common.Platform_Sys {
|
||
this.JackPotSync(platform,
|
||
common.GameId_Avengers,
|
||
common.GameId_IceAge,
|
||
common.GameId_EasterIsland,
|
||
common.GameId_CaiShen,
|
||
common.GameId_TamQuoc)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
func (this *SceneMgr) Shutdown() {
|
||
//WriteMDump(dumpFileName)
|
||
for _, s := range this.scenes {
|
||
s.Destroy(true)
|
||
}
|
||
module.UnregisteModule(this)
|
||
}
|
||
|
||
func init() {
|
||
module.RegisteModule(SceneMgrSington, time.Millisecond*50, 0)
|
||
//RegisteDayTimeChangeListener(SceneMgrSington)
|
||
}
|