game_sync/robot/base/playermgr.go

164 lines
4.1 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 base
import (
"math/rand"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/game/proto"
hall_proto "mongo.games.com/game/protocol/gamehall"
player_proto "mongo.games.com/game/protocol/player"
)
var PlayerMgrSingleton = &PlayerMgr{
playersMapSnId: make(map[int32]*player_proto.SCPlayerData),
playersSession: make(map[int32]*netlib.Session),
playersMatchSession: make(map[int32]*netlib.Session),
}
type PlayerMgr struct {
playersMapSnId map[int32]*player_proto.SCPlayerData // 玩家id:玩家信息
playersSession map[int32]*netlib.Session // 非比赛场; 玩家id:session
playersMatchSession map[int32]*netlib.Session // 比赛场玩家id:session
}
func (pm *PlayerMgr) AddPlayer(data *player_proto.SCPlayerData, s *netlib.Session) {
snid := data.GetData().GetSnId()
pm.playersMapSnId[snid] = data
if Config.Count-Config.MatchCount > len(pm.playersSession) {
pm.playersSession[snid] = s
} else {
pm.playersMatchSession[snid] = s
}
}
func (pm *PlayerMgr) DelPlayer(snid int32) {
delete(pm.playersMapSnId, snid)
if s, ok := pm.playersSession[snid]; ok {
delete(pm.playersSession, snid)
if s != nil {
return
}
}
if s, ok := pm.playersMatchSession[snid]; ok {
delete(pm.playersMatchSession, snid)
if s != nil {
}
}
}
func (pm *PlayerMgr) GetPlayer(snid int32) *player_proto.SCPlayerData {
if data, ok := pm.playersMapSnId[snid]; ok {
return data
}
return nil
}
func (pm *PlayerMgr) GetPlayerSession(snid int32) *netlib.Session {
if data, ok := pm.playersSession[snid]; ok {
return data
}
if data, ok := pm.playersMatchSession[snid]; ok {
return data
}
return nil
}
func (pm *PlayerMgr) ProcessCheckRobotNum() {
var freePlayers, enteringPlayers []*netlib.Session
var inScene int
for _, s := range pm.playersSession {
if HadScene(s) {
inScene++
} else {
if s.GetAttribute(SessionAttributeEnteringScene) != nil {
enteringPlayers = append(enteringPlayers, s)
} else {
freePlayers = append(freePlayers, s)
}
}
}
var freeMatchPlayers, enteringMatchPlayers []*netlib.Session
var inMatchScene int
for _, s := range pm.playersMatchSession {
if HadScene(s) {
inMatchScene++
} else {
if s.GetAttribute(SessionAttributeEnteringMatchScene) != nil {
enteringMatchPlayers = append(enteringMatchPlayers, s)
} else {
freeMatchPlayers = append(freeMatchPlayers, s)
}
}
}
logger.Logger.Infof("机器人总数:%d 普通场空闲:%d 普通场入场中:%d 普通场游戏中:%d 比赛场空闲:%d 比赛场入场中:%d 比赛场游戏中:%d",
len(pm.playersMapSnId), len(freePlayers), len(enteringPlayers), inScene, len(pm.playersMatchSession), len(enteringMatchPlayers), inMatchScene)
}
// ProcessInvite 机器人进入房间
// roomId 房间id
// id 场次id
// platform 平台id
// isMatch 是否比赛场
func (pm *PlayerMgr) ProcessInvite(roomId, id, cnt int32, platform string, IsMatch bool) {
f := func(sessions map[int32]*netlib.Session, tp int) {
var freePlayers, enteringPlayers []*netlib.Session
var inScene int
for _, s := range sessions {
if HadScene(s) {
inScene++
} else {
if s.GetAttribute(tp) != nil {
enteringPlayers = append(enteringPlayers, s)
} else {
freePlayers = append(freePlayers, s)
}
}
}
freeCnt := len(freePlayers)
if freeCnt <= 0 {
return
}
if cnt <= 0 {
return
}
if roomId == 0 {
return
}
if cnt > int32(freeCnt) {
cnt = int32(freeCnt)
}
id := rand.Perm(freeCnt)
for i := 0; i < int(cnt) && i < len(id); i++ {
s := freePlayers[id[i]]
CSEnterRoom := &hall_proto.CSEnterRoom{
RoomId: proto.Int32(roomId),
GameId: proto.Int(0),
}
proto.SetDefaults(CSEnterRoom)
s.Send(int(hall_proto.GameHallPacketID_PACKET_CS_ENTERROOM), CSEnterRoom)
if i != 0 {
s.SetAttribute(i, struct{}{})
}
}
}
if IsMatch {
f(pm.playersMatchSession, SessionAttributeEnteringMatchScene)
} else {
f(pm.playersSession, SessionAttributeEnteringScene)
}
}
func (pm *PlayerMgr) OnSecondTimer() {
}
func (pm *PlayerMgr) OnMiniTimer() {
pm.ProcessCheckRobotNum()
}