129 lines
2.5 KiB
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[string]*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[string]*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)
|
|
}
|