233 lines
6.9 KiB
Go
233 lines
6.9 KiB
Go
package base
|
|
|
|
import (
|
|
"time"
|
|
|
|
"mongo.games.com/goserver/core/logger"
|
|
"mongo.games.com/goserver/core/module"
|
|
"mongo.games.com/goserver/core/netlib"
|
|
"mongo.games.com/goserver/srvlib"
|
|
|
|
"mongo.games.com/game/common"
|
|
serverproto "mongo.games.com/game/protocol/server"
|
|
)
|
|
|
|
var PlayerMgrSington = &PlayerMgr{
|
|
playerMap: make(map[int64]*Player),
|
|
playerSnMap: make(map[int32]*Player),
|
|
playerAccountMap: make(map[string]*Player),
|
|
// playerNameMap: make(map[string]*Player),
|
|
}
|
|
|
|
type PlayerMgr struct {
|
|
playerMap map[int64]*Player // sid
|
|
playerSnMap map[int32]*Player // snid
|
|
playerAccountMap map[string]*Player // accoundid
|
|
// playerNameMap map[string]*Player
|
|
}
|
|
|
|
func (this *PlayerMgr) ManagePlayer(player *Player) {
|
|
if old, ok := this.playerMap[player.sid]; ok && old != nil {
|
|
logger.Logger.Warnf("(this *PlayerMgr) ManagePlayer [playerMap] found sid=%v player exist snid=%v, mysnid=%v", player.sid, old.SnId, player.SnId)
|
|
}
|
|
this.playerMap[player.sid] = player
|
|
|
|
if old, ok := this.playerSnMap[player.SnId]; ok && old != nil {
|
|
logger.Logger.Warnf("(this *PlayerMgr) ManagePlayer [playerSnMap] found player exist snid=%v, mysnid=%v", old.SnId, player.SnId)
|
|
}
|
|
this.playerSnMap[player.SnId] = player
|
|
|
|
if old, ok := this.playerAccountMap[player.AccountId]; ok && old != nil {
|
|
logger.Logger.Warnf("(this *PlayerMgr) ManagePlayer [playerAccountMap] found player exist snid=%v, mysnid=%v", old.SnId, player.SnId)
|
|
}
|
|
this.playerAccountMap[player.AccountId] = player
|
|
|
|
// if old, ok := this.playerNameMap[player.Name]; ok && old != nil {
|
|
// logger.Logger.Warnf("(this *PlayerMgr) ManagePlayer [playerNameMap] found player exist snid=%v, mysnid=%v", old.SnId, player.SnId)
|
|
// }
|
|
// this.playerNameMap[player.Name] = player
|
|
}
|
|
|
|
func (this *PlayerMgr) AddPlayer(id int64, data []byte, ws, gs *netlib.Session) *Player {
|
|
oldPlayer := this.GetPlayer(id)
|
|
testFlag := false
|
|
if oldPlayer != nil {
|
|
logger.Logger.Warnf("(this *PlayerMgr) AddPlayer found id=%v player exist snid=%v", id, oldPlayer.SnId)
|
|
testFlag = true
|
|
if oldPlayer.scene != nil {
|
|
logger.Logger.Warnf("(this *PlayerMgr) AddPlayer found id=%v snid=%v in sceneid=%v", id, oldPlayer.SnId, oldPlayer.scene.SceneId)
|
|
if SceneMgrSington.GetScene(int(oldPlayer.scene.SceneId)) != nil {
|
|
logger.Logger.Warnf("(this *PlayerMgr) AddPlayer found id=%v snid=%v in sceneid=%v SceneMgrSington.GetScene(oldPlayer.scene.sceneId) != nil", id, oldPlayer.SnId, oldPlayer.scene.SceneId)
|
|
}
|
|
}
|
|
this.DelPlayer(id)
|
|
}
|
|
player := NewPlayer(id, data, ws, gs)
|
|
if player == nil {
|
|
logger.Logger.Warn("(this *PlayerMgr) NewPlayer player == nil")
|
|
return nil
|
|
}
|
|
if testFlag == true {
|
|
logger.Logger.Warnf("(this *PlayerMgr) AddPlayer new snid=%v", player.SnId)
|
|
}
|
|
//logger.Logger.Trace("(this *PlayerMgr) NewPlayer player = ", player)
|
|
this.playerMap[id] = player
|
|
this.playerSnMap[player.SnId] = player
|
|
this.playerAccountMap[player.AccountId] = player
|
|
// this.playerNameMap[player.Name] = player
|
|
logger.Logger.Tracef("(this *PlayerMgr) AddPlayer snid:%v ", player.SnId)
|
|
return player
|
|
}
|
|
|
|
func (this *PlayerMgr) DelPlayer(id int64) bool {
|
|
player := this.GetPlayer(id)
|
|
if player != nil {
|
|
delete(this.playerMap, id)
|
|
delete(this.playerSnMap, player.SnId)
|
|
delete(this.playerAccountMap, player.AccountId)
|
|
// delete(this.playerNameMap, player.Name)
|
|
logger.Logger.Tracef("(this *PlayerMgr) DelPlayer snid:%v ", player.SnId)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (this *PlayerMgr) DeletePlayers(ids ...int64) {
|
|
for _, sid := range ids {
|
|
if p, ok := this.playerMap[sid]; ok {
|
|
delete(this.playerMap, sid)
|
|
if p != nil {
|
|
delete(this.playerSnMap, p.SnId)
|
|
delete(this.playerAccountMap, p.AccountId)
|
|
// delete(this.playerNameMap, p.Name)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (this *PlayerMgr) DelPlayerBySnId(snid int32) bool {
|
|
player := this.GetPlayerBySnId(snid)
|
|
if player != nil {
|
|
delete(this.playerMap, player.sid)
|
|
delete(this.playerSnMap, player.SnId)
|
|
delete(this.playerAccountMap, player.AccountId)
|
|
// delete(this.playerNameMap, player.Name)
|
|
logger.Logger.Tracef("(this *PlayerMgr) DelPlayerBySnId snid:%v ", player.SnId)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (this *PlayerMgr) ReholdPlayer(oldSid, newSid int64, newSess *netlib.Session) {
|
|
p := this.GetPlayer(oldSid)
|
|
if p != nil {
|
|
delete(this.playerMap, oldSid)
|
|
this.playerMap[newSid] = p
|
|
}
|
|
}
|
|
|
|
func (this *PlayerMgr) GetPlayer(id int64) *Player {
|
|
if pi, ok := this.playerMap[id]; ok {
|
|
return pi
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (this *PlayerMgr) GetPlayerBySnId(id int32) *Player {
|
|
if pi, ok := this.playerSnMap[id]; ok {
|
|
return pi
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (this *PlayerMgr) GetPlayerByAccount(acc string) *Player {
|
|
if p, ok := this.playerAccountMap[acc]; ok {
|
|
return p
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//func (this *PlayerMgr) GetPlayerByName(name string) *Player {
|
|
// if p, ok := this.playerNameMap[name]; ok {
|
|
// return p
|
|
// }
|
|
// return nil
|
|
//}
|
|
|
|
func (this *PlayerMgr) BroadcastMessageToGroup(packetid int, rawpack interface{}, tags []string) bool {
|
|
pack := &serverproto.SSCustomTagMulticast{
|
|
Tags: tags,
|
|
}
|
|
if byteData, ok := rawpack.([]byte); ok {
|
|
pack.RawData = byteData
|
|
} else {
|
|
byteData, err := netlib.MarshalPacket(packetid, rawpack)
|
|
if err == nil {
|
|
pack.RawData = byteData
|
|
} else {
|
|
logger.Logger.Info("PlayerMgr.BroadcastMessageToGroup err:", err)
|
|
return false
|
|
}
|
|
}
|
|
srvlib.ServerSessionMgrSington.Broadcast(int(serverproto.SSPacketID_PACKET_SS_CUSTOMTAG_MULTICAST), pack, common.GetSelfAreaId(), srvlib.GateServerType)
|
|
return true
|
|
}
|
|
|
|
func (this *PlayerMgr) RebindPlayerSnId(oldSnId, newSnId int32) {
|
|
if p, exist := this.playerSnMap[oldSnId]; exist {
|
|
delete(this.playerSnMap, oldSnId)
|
|
this.playerSnMap[newSnId] = p
|
|
}
|
|
}
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
// / Module Implement [beg]
|
|
// //////////////////////////////////////////////////////////////////
|
|
func (this *PlayerMgr) ModuleName() string {
|
|
return "playermgr"
|
|
}
|
|
|
|
func (this *PlayerMgr) Init() {
|
|
}
|
|
|
|
func (this *PlayerMgr) Update() {
|
|
}
|
|
|
|
func (this *PlayerMgr) Shutdown() {
|
|
for _, p := range this.playerMap {
|
|
if p.scene != nil {
|
|
p.scene.Pause()
|
|
// if p.dirty {
|
|
// data, err := p.MarshalData(p.scene.gameId)
|
|
// if err == nil {
|
|
// msgSync := &protocol2.GWPlayerDataSync{
|
|
// Sid: proto.Int64(p.sid),
|
|
// PlayerData: data,
|
|
// IParams: p.MarshalIParam(),
|
|
// SParams: p.MarshalSParam(),
|
|
// }
|
|
// proto.SetDefaults(msgSync)
|
|
// p.worldSess.Send(int(protocol2.MmoPacketID_PACKET_GW_PLAYERDATASYNC), msgSync)
|
|
// }
|
|
// }
|
|
}
|
|
}
|
|
module.UnregisteModule(this)
|
|
}
|
|
func (this *PlayerMgr) OnDayTimer() {
|
|
//在线跨天 数据给昨天,今天置为空
|
|
for _, p := range this.playerMap {
|
|
if p != nil && !p.IsRob {
|
|
p.OnDayTimer()
|
|
}
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
/// Module Implement [end]
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
func init() {
|
|
module.RegisteModule(PlayerMgrSington, time.Second, 0)
|
|
}
|