game_sync/gamesrv/base/playermgr.go

245 lines
7.4 KiB
Go

package base
import (
server_proto "mongo.games.com/game/protocol/server"
"time"
"mongo.games.com/game/common"
"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/goserver/srvlib/protocol"
)
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) BroadcastMessage(packetid int, rawpack interface{}) bool {
sc := &protocol.BCSessionUnion{
Bccs: &protocol.BCClientSession{},
}
pack, err := common.CreateBroadcastPacket(sc, packetid, rawpack)
if err == nil && pack != nil {
srvlib.ServerSessionMgrSington.Broadcast(int(protocol.SrvlibPacketID_PACKET_SS_BROADCAST), pack, common.GetSelfAreaId(), srvlib.GateServerType)
return true
}
return false
}
func (this *PlayerMgr) BroadcastMessageToGroup(packetid int, rawpack interface{}, tags []string) bool {
pack := &server_proto.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(server_proto.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)
}