164 lines
4.1 KiB
Go
164 lines
4.1 KiB
Go
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()
|
||
}
|