缓存优化
This commit is contained in:
parent
8aaf1b40f3
commit
d1afed32c2
|
@ -18,13 +18,11 @@ func SessionLogout(sid int64, drop bool) bool {
|
||||||
ls.state = LoginStateLogout
|
ls.state = LoginStateLogout
|
||||||
p := PlayerMgrSington.GetOnlinePlayer(sid)
|
p := PlayerMgrSington.GetOnlinePlayer(sid)
|
||||||
if p != nil {
|
if p != nil {
|
||||||
p.ThirdGameLogout()
|
|
||||||
if drop {
|
if drop {
|
||||||
p.DropLine()
|
p.DropLine()
|
||||||
internal.FirePlayerDropLine(p)
|
internal.FirePlayerDropLine[*Player, *Scene](p)
|
||||||
} else {
|
} else {
|
||||||
p.Logout()
|
p.Logout()
|
||||||
internal.FirePlayerLogouted(p)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.Logger.Trace("SessionLogout p == nil")
|
logger.Logger.Trace("SessionLogout p == nil")
|
||||||
|
|
|
@ -29,6 +29,7 @@ import (
|
||||||
player_proto "mongo.games.com/game/protocol/player"
|
player_proto "mongo.games.com/game/protocol/player"
|
||||||
webapi_proto "mongo.games.com/game/protocol/webapi"
|
webapi_proto "mongo.games.com/game/protocol/webapi"
|
||||||
"mongo.games.com/game/webapi"
|
"mongo.games.com/game/webapi"
|
||||||
|
"mongo.games.com/game/worldsrv/internal"
|
||||||
)
|
)
|
||||||
|
|
||||||
var reTelRule, _ = regexp.Compile(`^(1[3|4|5|6|7|8|9][0-9]\d{4,8})$`)
|
var reTelRule, _ = regexp.Compile(`^(1[3|4|5|6|7|8|9][0-9]\d{4,8})$`)
|
||||||
|
@ -2004,7 +2005,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
|
||||||
if player.IsOnLine() {
|
if player.IsOnLine() {
|
||||||
if player.sid != 0 && player.sid != sid {
|
if player.sid != 0 && player.sid != sid {
|
||||||
//Kick the exist player disconnect
|
//Kick the exist player disconnect
|
||||||
player.Kickout(common.KickReason_OtherLogin)
|
player.Kick(common.KickReason_OtherLogin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2022,7 +2023,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
|
||||||
proto.SetDefaults(scPlayerData)
|
proto.SetDefaults(scPlayerData)
|
||||||
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
||||||
//Kick the exist player disconnect
|
//Kick the exist player disconnect
|
||||||
player.Kickout(common.KickReason_Freeze)
|
player.Kick(common.KickReason_Freeze)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2036,7 +2037,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
|
||||||
proto.SetDefaults(scPlayerData)
|
proto.SetDefaults(scPlayerData)
|
||||||
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
||||||
//Kick the exist player disconnect
|
//Kick the exist player disconnect
|
||||||
player.Kickout(common.KickReason_Freeze)
|
player.Kick(common.KickReason_Freeze)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2056,7 +2057,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
|
||||||
proto.SetDefaults(scPlayerData)
|
proto.SetDefaults(scPlayerData)
|
||||||
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
||||||
//Kick the exist player disconnect
|
//Kick the exist player disconnect
|
||||||
player.Kickout(common.KickReason_Freeze)
|
player.Kick(common.KickReason_Freeze)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2068,40 +2069,18 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
|
||||||
proto.SetDefaults(scPlayerData)
|
proto.SetDefaults(scPlayerData)
|
||||||
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
||||||
//Kick the exist player disconnect
|
//Kick the exist player disconnect
|
||||||
player.Kickout(common.KickReason_Freeze)
|
player.Kick(common.KickReason_Freeze)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !player.IsRob {
|
if !player.IsRob {
|
||||||
if _, ok := BlackListMgrSington.CheckLogin(player.PlayerData); !ok {
|
if _, ok := BlackListMgrSington.CheckLogin(player.PlayerData); !ok {
|
||||||
//var msg string
|
player.Kick(common.KickReason_Freeze)
|
||||||
//if bi != nil {
|
|
||||||
// msg = i18n.Tr("languages", "BlackListLimit2Args", player.SnId, bi.Id, player.SnId, bi.Id, player.SnId, bi.Id, player.SnId, bi.Id)
|
|
||||||
//} else {
|
|
||||||
// msg = i18n.Tr("languages", "BlackListLimit1Args", player.SnId, player.SnId, player.SnId, player.SnId)
|
|
||||||
//}
|
|
||||||
//common.SendSrvMsg(player, common.SRVMSG_CODE_DEFAULT, msg)
|
|
||||||
//scPlayerData := &player_proto.SCPlayerData{
|
|
||||||
// OpRetCode: player_proto.OpResultCode_OPRC_InBlackList,
|
|
||||||
//}
|
|
||||||
//proto.SetDefaults(scPlayerData)
|
|
||||||
//player.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
|
|
||||||
//Kick the exist player disconnect
|
|
||||||
player.Kickout(common.KickReason_Freeze)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 给玩家发送三方余额状态
|
|
||||||
//statePack := &gamehall_proto.SCThridGameBalanceUpdateState{}
|
|
||||||
//if player.thridBalanceReqIsSucces {
|
|
||||||
// statePack.OpRetCode = gamehall_proto.OpResultCode_Game_OPRC_Sucess_Game
|
|
||||||
//} else {
|
|
||||||
// statePack.OpRetCode = gamehall_proto.OpResultCode_Game_OPRC_Error_Game
|
|
||||||
//}
|
|
||||||
//player.SendRawToClientIncOffLine(sid, s, int(gamehall_proto.GameHallPacketID_PACKET_SC_THRIDGAMEBALANCEUPDATESTATE), statePack)
|
|
||||||
|
|
||||||
//抽奖次数兼容老玩家
|
//抽奖次数兼容老玩家
|
||||||
if !player.IsRob && !player.InitLotteryStatus && WelfareMgrSington.GetPhoneLotteryStatus(player.Platform) == model.WelfareOpen {
|
if !player.IsRob && !player.InitLotteryStatus && WelfareMgrSington.GetPhoneLotteryStatus(player.Platform) == model.WelfareOpen {
|
||||||
player.addLotteryCount(20)
|
player.addLotteryCount(20)
|
||||||
|
@ -2114,6 +2093,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
|
||||||
playerFunc(player, cspl)
|
playerFunc(player, cspl)
|
||||||
PlayerMgrSington.ReholdPlayer(player, sid, s)
|
PlayerMgrSington.ReholdPlayer(player, sid, s)
|
||||||
player.OnRehold()
|
player.OnRehold()
|
||||||
|
internal.FirePlayerRehold[*Player, *Scene](player)
|
||||||
player.SendPlayerInfo()
|
player.SendPlayerInfo()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -2147,52 +2127,20 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查禁止登录
|
||||||
if !player.IsRob {
|
if !player.IsRob {
|
||||||
if _, ok := BlackListMgrSington.CheckLogin(pd.PlayerData); !ok {
|
if _, ok := BlackListMgrSington.CheckLogin(pd.PlayerData); !ok {
|
||||||
//黑名单用户也需要调用一下onlogin,否则会导致数据无法刷新
|
//黑名单用户也需要调用一下onlogin,否则会导致数据无法刷新
|
||||||
player.OnLogined()
|
player.OnLogined()
|
||||||
player.Kickout(common.KickReason_Freeze)
|
internal.FirePlayerLogined[*Player, *Scene](player)
|
||||||
|
player.Kick(common.KickReason_Freeze)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var temp []byte
|
|
||||||
var ee error
|
|
||||||
di := cspl.GetDeviceInfo()
|
|
||||||
if di != "" {
|
|
||||||
var e common.Encryptor
|
|
||||||
e.Init(common.GetAppId(), player.PackageID, int32(cspl.GetTimeStamp()))
|
|
||||||
temp, ee = base64.StdEncoding.DecodeString(di)
|
|
||||||
if ee == nil {
|
|
||||||
e.Encrypt(temp, len(temp))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if isnew { //新用户赠送金币
|
|
||||||
//首次创建账号事件
|
|
||||||
//isBind := 0
|
|
||||||
//if pd.Tel != "" {
|
|
||||||
// isBind = 1
|
|
||||||
//}
|
|
||||||
//LogChannelSingleton.WriteMQData(model.GeneratePlayerEvent(model.WEBEVENT_LOGIN, pd.Platform, pd.PackageID, pd.SnId, pd.Channel, pd.BeUnderAgentCode, pd.PromoterTree, 1, 1, isBind, common.GetAppId()))
|
|
||||||
|
|
||||||
//newbieCoin := player.GetRegisterPrize()
|
|
||||||
//if newbieCoin > 0 {
|
|
||||||
// player.AddCoin(int64(newbieCoin), common.GainWay_NewPlayer, "system", "")
|
|
||||||
// //增加泥码
|
|
||||||
// player.AddDirtyCoin(0, int64(newbieCoin))
|
|
||||||
// player.ReportSystemGiveEvent(newbieCoin, common.GainWay_NewPlayer, true)
|
|
||||||
// player.AddPayCoinLog(int64(newbieCoin), model.PayCoinLogType_Coin, "NewPlayer")
|
|
||||||
// LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(pd.SnId, pd.Name, pd.Platform, model.SystemFreeGive_GiveType_NewPlayer, model.SystemFreeGive_CoinType_Coin, int64(newbieCoin)))
|
|
||||||
//}
|
|
||||||
//if player.InviterId > 0 {
|
|
||||||
// //actRandCoinMgr.OnPlayerInvite(player.Platform, player.InviterId)
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
//测试代码
|
|
||||||
|
|
||||||
playerFunc(player, cspl)
|
playerFunc(player, cspl)
|
||||||
player.OnLogined()
|
player.OnLogined()
|
||||||
|
internal.FirePlayerLogined[*Player, *Scene](player)
|
||||||
player.SendPlayerInfo()
|
player.SendPlayerInfo()
|
||||||
}, true)
|
}, true)
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var DbSaveInst = &DbSaver{
|
var DbSaveInst = &DbSaver{
|
||||||
GroupNumber: 5,
|
GroupNumber: 600,
|
||||||
}
|
}
|
||||||
|
|
||||||
type DbSaver struct {
|
type DbSaver struct {
|
||||||
|
|
|
@ -420,7 +420,7 @@ func handlerEvent(ctx context.Context, completeKey string, isInit bool, event *c
|
||||||
}
|
}
|
||||||
for _, p := range targetPlayer {
|
for _, p := range targetPlayer {
|
||||||
if p.sid != 0 {
|
if p.sid != 0 {
|
||||||
p.Kickout(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList))
|
p.Kick(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList))
|
||||||
} else {
|
} else {
|
||||||
LoginStateMgrSington.LogoutByAccount(p.AccountId)
|
LoginStateMgrSington.LogoutByAccount(p.AccountId)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
package internal
|
package internal
|
||||||
|
|
||||||
type Player any
|
import "mongo.games.com/game/common"
|
||||||
|
|
||||||
type Scene any
|
var _playerListeners []interface{}
|
||||||
|
|
||||||
var _playerListeners []PlayerListener
|
func RegisterPlayerListener[Player, Scene any](l PlayerListener[Player, Scene]) {
|
||||||
|
|
||||||
func RegisterPlayerListener(l PlayerListener) {
|
|
||||||
for _, ll := range _playerListeners {
|
for _, ll := range _playerListeners {
|
||||||
if ll == l {
|
if ll == l {
|
||||||
return
|
return
|
||||||
|
@ -15,144 +13,192 @@ func RegisterPlayerListener(l PlayerListener) {
|
||||||
_playerListeners = append(_playerListeners, l)
|
_playerListeners = append(_playerListeners, l)
|
||||||
}
|
}
|
||||||
|
|
||||||
type PlayerListener interface {
|
type PlayerListener[Player, Scene any] interface {
|
||||||
|
common.ClockSinker
|
||||||
// 登出相关
|
// 登出相关
|
||||||
OnPlayerLogined(p Player) // 玩家登录时触发
|
OnPlayerLogined(p Player) // 玩家登录时触发
|
||||||
OnPlayerLogouted(p Player) // 玩家登出时触发
|
OnPlayerLogouted(p Player) // 玩家登出时触发
|
||||||
OnPlayerDropLine(p Player) // 玩家掉线时触发
|
OnPlayerDropLine(p Player) // 玩家掉线时触发
|
||||||
OnPlayerRehold(p Player) // 玩家重新连接时触发
|
OnPlayerRehold(p Player) // 玩家重新连接时触发
|
||||||
|
|
||||||
// 时间相关
|
|
||||||
OnPlayerSecTimer(p Player) // 每秒触发
|
|
||||||
OnPlayerMiniTimer(p Player) // 每分钟触发
|
|
||||||
OnPlayerHourTimer(p Player) // 每小时触发
|
|
||||||
OnPlayerDayTimer(p Player, login, continuous bool) // 每天触发,login表示是否登录,continuous表示是否连续登录
|
|
||||||
OnPlayerWeekTimer(p Player) // 每周触发
|
|
||||||
OnPlayerMonthTimer(p Player) // 每月触发
|
|
||||||
|
|
||||||
// 业务相关
|
// 业务相关
|
||||||
OnPlayerEnterScene(p Player, s Scene) // 玩家进入场景时触发
|
OnPlayerEnterSceneBefore(p Player, s Scene) // 玩家进入场景前触发
|
||||||
OnPlayerLeaveScene(p Player, s Scene) // 玩家离开场景时触发
|
OnPlayerEnterSceneAfter(p Player, s Scene) // 玩家进入场景后触发
|
||||||
OnPlayerReturnScene(p Player, s Scene) // 玩家返回房间时触发
|
OnPlayerLeaveSceneBefore(p Player, s Scene) // 玩家离开场景前触发
|
||||||
|
OnPlayerLeaveSceneAfter(p Player, s Scene) // 玩家离开场景后触发
|
||||||
|
OnPlayerReturnSceneBefore(p Player, s Scene) // 玩家返回房间前触发
|
||||||
|
OnPlayerReturnSceneAfter(p Player, s Scene) // 玩家返回房间后触发
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerLogined(p Player) {
|
func FirePlayerLogined[Player, Scene any](p Player) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerLogined(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerLogined(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerLogouted(p Player) {
|
func FirePlayerLogouted[Player, Scene any](p Player) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerLogouted(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerLogouted(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerDropLine(p Player) {
|
func FirePlayerDropLine[Player, Scene any](p Player) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerDropLine(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerDropLine(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerRehold(p Player) {
|
func FirePlayerRehold[Player, Scene any](p Player) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerRehold(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerRehold(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerSecTimer(p Player) {
|
func FirePlayerEnterSceneBefore[Player, Scene any](p Player, s Scene) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerSecTimer(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerEnterSceneBefore(p, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerMiniTimer(p Player) {
|
func FirePlayerEnterSceneAfter[Player, Scene any](p Player, s Scene) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerMiniTimer(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerEnterSceneAfter(p, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerHourTimer(p Player) {
|
func FirePlayerLeaveSceneBefore[Player, Scene any](p Player, s Scene) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerHourTimer(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerLeaveSceneBefore(p, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerDayTimer(p Player, login, continuous bool) {
|
func FirePlayerLeaveSceneAfter[Player, Scene any](p Player, s Scene) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerDayTimer(p, login, continuous)
|
l.(PlayerListener[Player, Scene]).OnPlayerLeaveSceneAfter(p, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerWeekTimer(p Player) {
|
func FirePlayerReturnSceneBefore[Player, Scene any](p Player, s Scene) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerWeekTimer(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerReturnSceneBefore(p, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerMonthTimer(p Player) {
|
func FirePlayerReturnSceneAfter[Player, Scene any](p Player, s Scene) {
|
||||||
for _, l := range _playerListeners {
|
for _, l := range _playerListeners {
|
||||||
if l != nil {
|
if l != nil {
|
||||||
l.OnPlayerMonthTimer(p)
|
l.(PlayerListener[Player, Scene]).OnPlayerReturnSceneAfter(p, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerEnterScene(p Player, s Scene) {
|
type BasePlayerListener[Player, Scene any] struct {
|
||||||
for _, l := range _playerListeners {
|
common.ClockFunc
|
||||||
if l != nil {
|
|
||||||
l.OnPlayerEnterScene(p, s)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerLogined(p Player) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerLogouted(p Player) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerDropLine(p Player) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerRehold(p Player) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerEnterSceneBefore(p Player, s Scene) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerEnterSceneAfter(p Player, s Scene) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerLeaveSceneBefore(p Player, s Scene) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerLeaveSceneAfter(p Player, s Scene) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerReturnSceneBefore(p Player, s Scene) {}
|
||||||
|
func (l *BasePlayerListener[Player, Scene]) OnPlayerReturnSceneAfter(p Player, s Scene) {}
|
||||||
|
|
||||||
|
type PlayerListenerFunc[Player, Scene any] struct {
|
||||||
|
common.ClockFunc
|
||||||
|
OnPlayerLoginedFunc func(p Player)
|
||||||
|
OnPlayerLogoutedFunc func(p Player)
|
||||||
|
OnPlayerDropLineFunc func(p Player)
|
||||||
|
OnPlayerReholdFunc func(p Player)
|
||||||
|
OnPlayerEnterSceneBeforeFunc func(p Player, s Scene)
|
||||||
|
OnPlayerEnterSceneAfterFunc func(p Player, s Scene)
|
||||||
|
OnPlayerLeaveSceneBeforeFunc func(p Player, s Scene)
|
||||||
|
OnPlayerLeaveSceneAfterFunc func(p Player, s Scene)
|
||||||
|
OnPlayerReturnSceneBeforeFunc func(p Player, s Scene)
|
||||||
|
OnPlayerReturnSceneAfterFunc func(p Player, s Scene)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerLogined(p Player) {
|
||||||
|
if l.OnPlayerLoginedFunc != nil {
|
||||||
|
l.OnPlayerLoginedFunc(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerLeaveScene(p Player, s Scene) {
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerLogouted(p Player) {
|
||||||
for _, l := range _playerListeners {
|
if l.OnPlayerLogoutedFunc != nil {
|
||||||
if l != nil {
|
l.OnPlayerLogoutedFunc(p)
|
||||||
l.OnPlayerLeaveScene(p, s)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirePlayerReturnScene(p Player, s Scene) {
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerDropLine(p Player) {
|
||||||
for _, l := range _playerListeners {
|
if l.OnPlayerDropLineFunc != nil {
|
||||||
if l != nil {
|
l.OnPlayerDropLineFunc(p)
|
||||||
l.OnPlayerReturnScene(p, s)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type BasePlayerListener struct {
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerRehold(p Player) {
|
||||||
|
if l.OnPlayerReholdFunc != nil {
|
||||||
|
l.OnPlayerReholdFunc(p)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *BasePlayerListener) OnPlayerLogined(p Player) {}
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerEnterSceneBefore(p Player, s Scene) {
|
||||||
func (l *BasePlayerListener) OnPlayerLogouted(p Player) {}
|
if l.OnPlayerEnterSceneBeforeFunc != nil {
|
||||||
func (l *BasePlayerListener) OnPlayerDropLine(p Player) {}
|
l.OnPlayerEnterSceneBeforeFunc(p, s)
|
||||||
func (l *BasePlayerListener) OnPlayerRehold(p Player) {}
|
}
|
||||||
func (l *BasePlayerListener) OnPlayerSecTimer(p Player) {}
|
}
|
||||||
func (l *BasePlayerListener) OnPlayerMiniTimer(p Player) {}
|
|
||||||
func (l *BasePlayerListener) OnPlayerHourTimer(p Player) {}
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerEnterSceneAfter(p Player, s Scene) {
|
||||||
func (l *BasePlayerListener) OnPlayerDayTimer(p Player, login, continuous bool) {}
|
if l.OnPlayerEnterSceneAfterFunc != nil {
|
||||||
func (l *BasePlayerListener) OnPlayerWeekTimer(p Player) {}
|
l.OnPlayerEnterSceneAfterFunc(p, s)
|
||||||
func (l *BasePlayerListener) OnPlayerMonthTimer(p Player) {}
|
}
|
||||||
func (l *BasePlayerListener) OnPlayerEnterScene(p Player, s Scene) {}
|
}
|
||||||
func (l *BasePlayerListener) OnPlayerLeaveScene(p Player, s Scene) {}
|
|
||||||
func (l *BasePlayerListener) OnPlayerReturnScene(p Player, s Scene) {}
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerLeaveSceneBefore(p Player, s Scene) {
|
||||||
|
if l.OnPlayerLeaveSceneBeforeFunc != nil {
|
||||||
|
l.OnPlayerLeaveSceneBeforeFunc(p, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerLeaveSceneAfter(p Player, s Scene) {
|
||||||
|
if l.OnPlayerLeaveSceneAfterFunc != nil {
|
||||||
|
l.OnPlayerLeaveSceneAfterFunc(p, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerReturnSceneBefore(p Player, s Scene) {
|
||||||
|
if l.OnPlayerReturnSceneBeforeFunc != nil {
|
||||||
|
l.OnPlayerReturnSceneBeforeFunc(p, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *PlayerListenerFunc[Player, Scene]) OnPlayerReturnSceneAfter(p Player, s Scene) {
|
||||||
|
if l.OnPlayerReturnSceneAfterFunc != nil {
|
||||||
|
l.OnPlayerReturnSceneAfterFunc(p, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterPlayerListenerFunc[P, S any](l *PlayerListenerFunc[P, S]) {
|
||||||
|
common.RegisterClockFunc(&l.ClockFunc)
|
||||||
|
RegisterPlayerListener(l)
|
||||||
|
}
|
||||||
|
|
|
@ -759,6 +759,7 @@ func (l *LotteryMgr) AddCostRoomCard(plt string, snid int32, n int64) {
|
||||||
logger.Logger.Errorf("AddCostRoomCard snid:%v not found", snid)
|
logger.Logger.Errorf("AddCostRoomCard snid:%v not found", snid)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
PlayerMgrSington.AddPlayer(0, item.PlayerData, nil)
|
||||||
f()
|
f()
|
||||||
}, false)
|
}, false)
|
||||||
return
|
return
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
"mongo.games.com/goserver/core"
|
"mongo.games.com/goserver/core"
|
||||||
"mongo.games.com/goserver/core/basic"
|
"mongo.games.com/goserver/core/basic"
|
||||||
"mongo.games.com/goserver/core/logger"
|
|
||||||
"mongo.games.com/goserver/core/module"
|
"mongo.games.com/goserver/core/module"
|
||||||
"mongo.games.com/goserver/core/task"
|
"mongo.games.com/goserver/core/task"
|
||||||
|
|
||||||
|
@ -193,49 +192,6 @@ func (c *PlayerCacheMgr) UnCacheInvalidPlayerId(snid int32) {
|
||||||
delete(c.playerInvalidIds, snid)
|
delete(c.playerInvalidIds, snid)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存没有登录缓存的玩家数据
|
|
||||||
func (c *PlayerCacheMgr) saveCache(p *PlayerCacheItem, isSync bool) {
|
|
||||||
if p == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
saveFunc := func(v internal.PlayerLoader) {
|
|
||||||
if v == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
v.Save(p.Platform, p.SnId, true, true)
|
|
||||||
logger.Logger.Infof("PlayerCacheMgr SaveCache snid:%v", p.SnId)
|
|
||||||
}
|
|
||||||
releaseFunc := func(v internal.PlayerLoader) {
|
|
||||||
if v == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if PlayerMgrSington.GetPlayerBySnId(p.SnId) == nil {
|
|
||||||
v.Release(p.Platform, p.SnId)
|
|
||||||
logger.Logger.Infof("PlayerCacheMgr SaveCache Release snid:%v", p.SnId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if PlayerMgrSington.GetPlayerBySnId(p.SnId) == nil {
|
|
||||||
if isSync {
|
|
||||||
for _, v := range internal.GetPlayerLoads() {
|
|
||||||
saveFunc(v)
|
|
||||||
releaseFunc(v)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for i := 0; i < len(internal.GetPlayerLoads()); i++ {
|
|
||||||
v := internal.GetPlayerLoads()[i]
|
|
||||||
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
|
||||||
saveFunc(v)
|
|
||||||
return nil
|
|
||||||
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
|
|
||||||
releaseFunc(v)
|
|
||||||
})).StartByExecutor(fmt.Sprintf("Player%v", p.SnId))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PlayerCacheMgr) ModuleName() string {
|
func (c *PlayerCacheMgr) ModuleName() string {
|
||||||
return "PlayerCacheMgr"
|
return "PlayerCacheMgr"
|
||||||
}
|
}
|
||||||
|
@ -249,16 +205,10 @@ func (c *PlayerCacheMgr) Update() {
|
||||||
for _, p := range c.playerWaitClr {
|
for _, p := range c.playerWaitClr {
|
||||||
delete(c.playerMap, p.SnId)
|
delete(c.playerMap, p.SnId)
|
||||||
c.Pop(p)
|
c.Pop(p)
|
||||||
|
|
||||||
// 更新玩家数据
|
|
||||||
c.saveCache(p, false)
|
|
||||||
}
|
}
|
||||||
c.playerWaitClr = c.playerWaitClr[0:0]
|
c.playerWaitClr = c.playerWaitClr[0:0]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PlayerCacheMgr) Shutdown() {
|
func (c *PlayerCacheMgr) Shutdown() {
|
||||||
for _, v := range c.playerMap {
|
|
||||||
c.saveCache(v, true)
|
|
||||||
}
|
|
||||||
module.UnregisteModule(c)
|
module.UnregisteModule(c)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"mongo.games.com/goserver/core/basic"
|
"mongo.games.com/goserver/core/basic"
|
||||||
|
@ -48,7 +50,7 @@ type PlayerMgr struct {
|
||||||
// 平台id:snid:真实玩家
|
// 平台id:snid:真实玩家
|
||||||
playerOfPlatform map[string]map[int32]*Player
|
playerOfPlatform map[string]map[int32]*Player
|
||||||
|
|
||||||
loading map[string]*PlayerPendingData // accountid,控制访问频率
|
loading map[string]*PlayerPendingData // accountid,控制访问频率;登录状态标记
|
||||||
}
|
}
|
||||||
|
|
||||||
// PlayerStatics 在线统计
|
// PlayerStatics 在线统计
|
||||||
|
@ -135,20 +137,76 @@ func (this *PlayerMgr) AddPlayer(sid int64, playerInfo *model.PlayerData, s *net
|
||||||
this.playerOfPlatform[player.Platform] = pp
|
this.playerOfPlatform[player.Platform] = pp
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Logger.Tracef("###%v mount to DBSaver[AddPlayer]", player.Name)
|
logger.Logger.Tracef("###%v mount to DBSaver[AddPlayer]", player.SnId)
|
||||||
if old != nil { //删除旧的玩家
|
if old != nil { //删除旧的玩家
|
||||||
DbSaveInst.UnregisterDbSaveTask(old)
|
DbSaveInst.UnregisterDbSaveTask(old)
|
||||||
}
|
}
|
||||||
DbSaveInst.RegisterDbSaverTask(player)
|
DbSaveInst.RegisterDbSaverTask(player)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal.FirePlayerLogined(player)
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *PlayerMgr) SavePlayer(p *Player, isCopy, force bool) {
|
||||||
|
if p == nil || p.isDelete {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.IsRob {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !p.dirty && !force {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var pd *model.PlayerData
|
||||||
|
if isCopy {
|
||||||
|
pd = model.ClonePlayerData(p.PlayerData)
|
||||||
|
} else {
|
||||||
|
pd = p.PlayerData
|
||||||
|
}
|
||||||
|
if pd == nil {
|
||||||
|
logger.Logger.Errorf("Player Time2Save() %v pd is nil", p.SnId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
t1 := time.Now()
|
||||||
|
|
||||||
|
p.dirty = true
|
||||||
|
// 跨天任务依赖LastLogoutTime的准确性,跨天任务是定时器common.ClockMgrSington触发的,所以这里要用定时器的触发时间
|
||||||
|
p.LastLogoutTime = common.ClockMgrSingleton.LastTickTime
|
||||||
|
pd.LastLogoutTime = common.ClockMgrSingleton.LastTickTime
|
||||||
|
|
||||||
|
ok := true
|
||||||
|
t := task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
||||||
|
if !model.SavePlayerData(pd) {
|
||||||
|
// save 失败先写到json里面
|
||||||
|
model.BackupPlayerData(pd)
|
||||||
|
ok = false
|
||||||
|
}
|
||||||
|
for _, v := range internal.GetPlayerLoads() {
|
||||||
|
v.Save(pd.Platform, pd.SnId, true, force)
|
||||||
|
}
|
||||||
|
return ok
|
||||||
|
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
|
||||||
|
if saved, ok := i.(bool); ok && saved {
|
||||||
|
p.dirty = false
|
||||||
|
bak := fmt.Sprintf("%v.json", pd.AccountId)
|
||||||
|
if exist, _ := common.PathExists(bak); exist {
|
||||||
|
os.Remove(bak)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.Logger.Infof("Player Time2Save() %v take:%v isSuccess:%v", p.SnId, time.Now().Sub(t1), p.dirty == false)
|
||||||
|
}), "SavePlayerTask")
|
||||||
|
if b := t.StartByExecutor(fmt.Sprintf("Player%v", p.SnId)); b {
|
||||||
|
p.lastSaved = time.Now()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DelPlayer 清除玩家缓存数据
|
// DelPlayer 清除玩家缓存数据
|
||||||
// 一般真人是数据持久化后删除或数据没有修改,机器人不用持久化(机器人数据没有主动删除)
|
// 真人数据持久化后删除,机器人不用持久化(机器人数据没有主动删除)
|
||||||
|
// needSave 是否需要保存数据; 自动删除玩家机制已经保存过数据,不需要再保存;手动删除玩家需要保存数据
|
||||||
func (this *PlayerMgr) DelPlayer(snid int32) bool {
|
func (this *PlayerMgr) DelPlayer(snid int32) bool {
|
||||||
player, ok := this.snidMap[snid]
|
player, ok := this.snidMap[snid]
|
||||||
if !ok || player == nil {
|
if !ok || player == nil {
|
||||||
|
@ -178,14 +236,18 @@ func (this *PlayerMgr) DelPlayer(snid int32) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !player.IsCacheState() {
|
||||||
|
player.OnLogoutFinish()
|
||||||
|
internal.FirePlayerLogouted[*Player, *Scene](player)
|
||||||
|
}
|
||||||
|
|
||||||
|
DbSaveInst.UnregisterDbSaveTask(player)
|
||||||
|
|
||||||
|
// 再保存一次,防止数据丢失,可能脏标记没有设置
|
||||||
|
this.SavePlayer(player, true, true)
|
||||||
for _, v := range internal.GetPlayerLoads() {
|
for _, v := range internal.GetPlayerLoads() {
|
||||||
v.Release(player.Platform, player.SnId)
|
v.Release(player.Platform, player.SnId)
|
||||||
}
|
}
|
||||||
|
|
||||||
player.OnLogouted()
|
|
||||||
|
|
||||||
DbSaveInst.UnregisterDbSaveTask(player)
|
|
||||||
player.Save(true)
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,6 +256,9 @@ func (this *PlayerMgr) DelPlayer(snid int32) bool {
|
||||||
// 2.玩家网络断开
|
// 2.玩家网络断开
|
||||||
// 3.被踢掉线
|
// 3.被踢掉线
|
||||||
func (this *PlayerMgr) DropPlayer(p *Player) {
|
func (this *PlayerMgr) DropPlayer(p *Player) {
|
||||||
|
p.SetOffline()
|
||||||
|
p.sid = 0
|
||||||
|
p.gateSess = nil
|
||||||
delete(this.sidMap, p.sid)
|
delete(this.sidMap, p.sid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,12 +273,20 @@ func (this *PlayerMgr) ReholdPlayer(p *Player, newSid int64, newSess *netlib.Ses
|
||||||
logger.Logger.Errorf("(this *PlayerMgr) ReholdPlayer(snid=%v, new=%v)", p.SnId, newSid)
|
logger.Logger.Errorf("(this *PlayerMgr) ReholdPlayer(snid=%v, new=%v)", p.SnId, newSid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.SetOnline()
|
||||||
p.sid = newSid
|
p.sid = newSid
|
||||||
p.gateSess = newSess
|
p.gateSess = newSess
|
||||||
p.SetOnline()
|
|
||||||
this.sidMap[newSid] = p
|
this.sidMap[newSid] = p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *PlayerMgr) KickByPlatform(name string) {
|
||||||
|
for _, p := range this.players {
|
||||||
|
if name == "" || p.Platform == name {
|
||||||
|
p.Kick(common.KickReason_Disconnection)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GetOnlinePlayer 获取玩家数据(玩家在线)
|
// GetOnlinePlayer 获取玩家数据(玩家在线)
|
||||||
func (this *PlayerMgr) GetOnlinePlayer(id int64) *Player {
|
func (this *PlayerMgr) GetOnlinePlayer(id int64) *Player {
|
||||||
if pi, ok := this.sidMap[id]; ok {
|
if pi, ok := this.sidMap[id]; ok {
|
||||||
|
@ -398,98 +471,29 @@ func (this *PlayerMgr) BroadcastMessageToTarget(snIds []int32, packetid int, raw
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 感兴趣所有clock event
|
|
||||||
func (this *PlayerMgr) InterestClockEvent() int {
|
|
||||||
return (1 << common.ClockEventMax) - 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *PlayerMgr) OnSecTimer() {
|
|
||||||
for _, player := range this.players {
|
|
||||||
utils.CatchPanic(func() {
|
|
||||||
player.OnSecTimer()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *PlayerMgr) OnMiniTimer() {
|
|
||||||
for _, player := range this.players {
|
|
||||||
utils.CatchPanic(func() {
|
|
||||||
player.OnMiniTimer()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *PlayerMgr) OnHourTimer() {
|
|
||||||
for _, player := range this.players {
|
|
||||||
utils.CatchPanic(func() {
|
|
||||||
player.OnHourTimer()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *PlayerMgr) OnDayTimer() {
|
|
||||||
for _, player := range this.players {
|
|
||||||
utils.CatchPanic(func() {
|
|
||||||
player.OnDayTimer(false, true, 1)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *PlayerMgr) OnMonthTimer() {
|
|
||||||
for _, player := range this.players {
|
|
||||||
utils.CatchPanic(func() {
|
|
||||||
player.OnMonthTimer()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *PlayerMgr) OnWeekTimer() {
|
|
||||||
for _, player := range this.players {
|
|
||||||
utils.CatchPanic(func() {
|
|
||||||
player.OnWeekTimer()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *PlayerMgr) OnShutdown() {
|
|
||||||
this.SaveAll()
|
|
||||||
}
|
|
||||||
|
|
||||||
// SaveAll 保存所有数据,dirty=true
|
// SaveAll 保存所有数据,dirty=true
|
||||||
func (this *PlayerMgr) SaveAll() {
|
func (this *PlayerMgr) SaveAll() {
|
||||||
count := len(this.players)
|
count := len(this.players)
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
saveCnt := 0
|
saveCnt := 0
|
||||||
failCnt := 0
|
failCnt := 0
|
||||||
nochangeCnt := 0
|
logger.Logger.Info("===@SaveAllPlayerBEGIN@=== TotalCount:", count)
|
||||||
logger.Logger.Info("===@PlayerMgr.SaveAll BEG@=== TotalCount:", count)
|
|
||||||
for i, p := range this.players {
|
for i, p := range this.players {
|
||||||
idx := i + 1
|
idx := i + 1
|
||||||
if p.dirty {
|
|
||||||
if model.SavePlayerData(p.PlayerData) {
|
if model.SavePlayerData(p.PlayerData) {
|
||||||
logger.Logger.Infof("===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v save [ok] @=", idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs)
|
logger.Logger.Infof("===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v save [ok] @=",
|
||||||
saveCnt++
|
idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs)
|
||||||
} else {
|
|
||||||
logger.Logger.Warnf("===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v save [error]@=", idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs)
|
|
||||||
failCnt++
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.Logger.Infof("nochange===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v nochange [ok]@=", idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs)
|
|
||||||
nochangeCnt++
|
|
||||||
}
|
|
||||||
for _, v := range internal.GetPlayerLoads() {
|
for _, v := range internal.GetPlayerLoads() {
|
||||||
v.Save(p.Platform, p.SnId, true, true)
|
v.Save(p.Platform, p.SnId, true, true)
|
||||||
}
|
}
|
||||||
}
|
saveCnt++
|
||||||
logger.Logger.Infof("===@PlayerMgr.SaveAll END@===, total:%v saveCnt:%v failCnt:%v nochangeCnt:%v take:%v", count, saveCnt, failCnt, nochangeCnt, time.Now().Sub(start))
|
} else {
|
||||||
}
|
logger.Logger.Warnf("===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v save [error]@=",
|
||||||
|
idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs)
|
||||||
func (this *PlayerMgr) KickByPlatform(name string) {
|
failCnt++
|
||||||
for _, p := range this.players {
|
|
||||||
if name == "" || p.Platform == name {
|
|
||||||
p.Kickout(common.KickReason_Disconnection)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
logger.Logger.Infof("===@SaveAllPlayerEND@===, total:%v saveCnt:%v failCnt:%v take:%v", count, saveCnt, failCnt, time.Now().Sub(start))
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadRobots 预加载机器人数据
|
// LoadRobots 预加载机器人数据
|
||||||
|
@ -726,7 +730,6 @@ func (this *PlayerMgr) RecommendFriendRule(platform string, snid int32) []Recomm
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
//BlackListMgrSington.RegisterObserver(PlayerMgrSington)
|
|
||||||
PlayerSubjectSign.AttachName(PlayerMgrSington)
|
PlayerSubjectSign.AttachName(PlayerMgrSington)
|
||||||
PlayerSubjectSign.AttachHead(PlayerMgrSington)
|
PlayerSubjectSign.AttachHead(PlayerMgrSington)
|
||||||
PlayerSubjectSign.AttachHeadOutline(PlayerMgrSington)
|
PlayerSubjectSign.AttachHeadOutline(PlayerMgrSington)
|
||||||
|
@ -736,5 +739,51 @@ func init() {
|
||||||
PlayerSubjectSign.AttachHead(FriendMgrSington)
|
PlayerSubjectSign.AttachHead(FriendMgrSington)
|
||||||
|
|
||||||
// 定时器
|
// 定时器
|
||||||
common.ClockMgrSingleton.RegisterSinker(PlayerMgrSington)
|
common.RegisterClockFunc(&common.ClockFunc{
|
||||||
|
OnSecTimerFunc: func() {
|
||||||
|
for _, player := range PlayerMgrSington.players {
|
||||||
|
utils.CatchPanic(func() {
|
||||||
|
player.OnSecTimer()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
OnMiniTimerFunc: func() {
|
||||||
|
for _, player := range PlayerMgrSington.players {
|
||||||
|
utils.CatchPanic(func() {
|
||||||
|
player.OnMiniTimer()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
OnHourTimerFunc: func() {
|
||||||
|
for _, player := range PlayerMgrSington.players {
|
||||||
|
utils.CatchPanic(func() {
|
||||||
|
player.OnHourTimer()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
OnDayTimerFunc: func() {
|
||||||
|
for _, player := range PlayerMgrSington.players {
|
||||||
|
utils.CatchPanic(func() {
|
||||||
|
player.OnDayTimer(false, true, 1)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
OnWeekTimerFunc: func() {
|
||||||
|
for _, player := range PlayerMgrSington.players {
|
||||||
|
utils.CatchPanic(func() {
|
||||||
|
player.OnWeekTimer()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
OnMonthTimerFunc: func() {
|
||||||
|
for _, player := range PlayerMgrSington.players {
|
||||||
|
utils.CatchPanic(func() {
|
||||||
|
player.OnMonthTimer()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
OnShutdownFunc: func() {
|
||||||
|
PlayerMgrSington.SaveAll()
|
||||||
|
},
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,14 @@ const (
|
||||||
PROMOTER_TYPE_PROMOTE = 3 //推广员
|
PROMOTER_TYPE_PROMOTE = 3 //推广员
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ErrorString struct {
|
||||||
|
code string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ErrorString) Error() string {
|
||||||
|
return e.code
|
||||||
|
}
|
||||||
|
|
||||||
var PromoterMgrSington = &PromoterMgr{
|
var PromoterMgrSington = &PromoterMgr{
|
||||||
PromoterConfigMap: make(map[string]*PromoterConfig),
|
PromoterConfigMap: make(map[string]*PromoterConfig),
|
||||||
LastTicket: 0,
|
LastTicket: 0,
|
||||||
|
|
|
@ -1036,7 +1036,7 @@ func init() {
|
||||||
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
||||||
return model.FreezeAccount(msg.Platform, player.AccountId, int(msg.Minute))
|
return model.FreezeAccount(msg.Platform, player.AccountId, int(msg.Minute))
|
||||||
}), nil, "FreezeAccount").Start()
|
}), nil, "FreezeAccount").Start()
|
||||||
player.Kickout(common.KickReason_Freeze)
|
player.Kick(common.KickReason_Freeze)
|
||||||
pack.Tag = webapiproto.TagCode_SUCCESS
|
pack.Tag = webapiproto.TagCode_SUCCESS
|
||||||
pack.Msg = "success"
|
pack.Msg = "success"
|
||||||
} else {
|
} else {
|
||||||
|
@ -1714,7 +1714,7 @@ func init() {
|
||||||
//在线需要踢掉玩家
|
//在线需要踢掉玩家
|
||||||
if uint(msg.BlacklistType)&BlackState_Login != 0 {
|
if uint(msg.BlacklistType)&BlackState_Login != 0 {
|
||||||
logger.Logger.Infof("found platform:%v player:%d snid in blacklist", msg.Platform, player.SnId)
|
logger.Logger.Infof("found platform:%v player:%d snid in blacklist", msg.Platform, player.SnId)
|
||||||
player.Kickout(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList))
|
player.Kick(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList))
|
||||||
}
|
}
|
||||||
return common.ResponseTag_Ok, pack
|
return common.ResponseTag_Ok, pack
|
||||||
} else {
|
} else {
|
||||||
|
@ -2427,7 +2427,7 @@ func init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p.Kickout(common.KickReason_Freeze)
|
p.Kick(common.KickReason_Freeze)
|
||||||
PlayerMgrSington.DelPlayer(p.SnId)
|
PlayerMgrSington.DelPlayer(p.SnId)
|
||||||
LoginStateMgrSington.DelAccountByAccid(p.AccountId)
|
LoginStateMgrSington.DelAccountByAccid(p.AccountId)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue