game_sync/worldsrv/playerinfo.go

129 lines
2.5 KiB
Go

package main
import (
"strconv"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/task"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/worldsrv/internal"
)
/*
玩家信息加载,缓存,持久化,缓存释放
*/
func init() {
internal.RegisterPlayerLoad(PlayerInfoMgrSingle)
}
var PlayerInfoMgrSingle = &PlayerInfoMgr{
Players: make(map[int32]*PlayerInfo),
}
type AllPlayerInfo struct {
GameData []*model.PlayerGameData
}
// PlayerInfo 玩家信息
type PlayerInfo struct {
GameData map[int32]*model.PlayerGameData // 游戏数据
}
type PlayerInfoMgr struct {
Players map[int32]*PlayerInfo
}
func (p *PlayerInfoMgr) Load(platform string, snid int32, player any) *internal.PlayerLoadReplay {
var err error
allPlayerInfo := &AllPlayerInfo{
GameData: make([]*model.PlayerGameData, 0),
}
// 游戏数据
gameData, err := model.GetPlayerGameData(platform, snid)
if err != nil {
logger.Logger.Errorf("GetPlayerGameData snid:%v error: %v", snid, err)
goto here
}
allPlayerInfo.GameData = gameData
// ...
here:
return &internal.PlayerLoadReplay{
Platform: platform,
Snid: snid,
Err: err,
Data: allPlayerInfo,
}
}
func (p *PlayerInfoMgr) Callback(player any, ret *internal.PlayerLoadReplay) {
if ret.Err != nil {
return
}
data, ok := ret.Data.(*AllPlayerInfo)
if !ok {
return
}
info := &PlayerInfo{
GameData: make(map[int32]*model.PlayerGameData),
}
// 游戏数据
for _, v := range data.GameData {
info.GameData[v.Id] = v
}
// ...
p.Players[ret.Snid] = info
}
func (p *PlayerInfoMgr) LoadAfter(platform string, snid int32) *internal.PlayerLoadReplay {
return nil
}
func (p *PlayerInfoMgr) CallbackAfter(ret *internal.PlayerLoadReplay) {
}
func (p *PlayerInfoMgr) Save(platform string, snid int32, isSync, force bool) {
var err error
f := func() {
data, ok := p.Players[snid]
if !ok {
return
}
// 游戏数据
err = model.SavePlayerGameData(platform, common.GetMapValues(data.GameData))
if err != nil {
logger.Logger.Errorf("SavePlayerGameData snid:%v error: %v", snid, err)
}
// ...
}
cf := func() {
}
if isSync {
f()
cf()
return
}
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
f()
return nil
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
cf()
}), "SavePlayerInfo").StartByFixExecutor("SnId:" + strconv.Itoa(int(snid)))
}
func (p *PlayerInfoMgr) Release(platform string, snid int32) {
delete(p.Players, snid)
}