From cdf7a25b04904eb5a2f6ae4bd6c5cb7226961b4e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 11 八月 2022 14:46:23 +0800
Subject: [PATCH] 9685 【后台】开服时间整合(邮件内容附加MsgInfo信息默认字符串)
---
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 170 +++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 142 insertions(+), 28 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
index 6390293..9871848 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -44,7 +44,7 @@
#import PlayerFamilyStore
import PlayerSocial
import PlayerFamilyParty
-import PlayerSealDemon
+#import PlayerSealDemon
import PlayerBillboard
import PlayerLVAward
import PlayerDuJie
@@ -54,14 +54,23 @@
import PlayerGeTui
import PlayerStore
import GameWorldActionControl
+import GameWorldFamilyWar
import PlayerFBHelpBattle
+import GameWorldSkyTower
import GMT_CTG
import PyGameData
import GMShell
import IPY_PlayerDefine
+import GameWorldArena
+import CrossLuckyCloudBuy
import CrossRealmPK
import AuctionHouse
+import PlayerAssist
import PlayerFB
+import PlayerLove
+import PlayerCharm
+import CrossRealmPlayer
+import CrossBattlefield
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -86,9 +95,7 @@
except:
curPlayer.Kick(IPY_PlayerDefine.disWaitForPlayerLoinError)
import traceback
- GameWorld.ErrLog("玩家上线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
- if GameWorld.GetGameWorld().GetDebugLevel():
- raise Exception("玩家上线逻辑错误~~~~\r\n%s" % traceback.format_exc())
+ GameWorld.RaiseException("玩家上线逻辑错误\r\n%s" % traceback.format_exc())
return
#---------------------------------------------------------------------
@@ -119,6 +126,8 @@
if GameWorld.IsCrossServer():
#跨服PK
CrossRealmPK.OnPlayerLoginCrossServer(curPlayer)
+ #协助
+ PlayerAssist.OnPlayerLoginCrossServer(curPlayer)
return
#玩家家族刷新
@@ -127,6 +136,8 @@
#玩家队伍初始化
PlayerTeam.OnPlayerLoginRefreshTeam(curPlayer, tick)
PlayerCompensation.NotifyPlayerCompensation(curPlayer)
+ __UpdOnedayJobPlayerLoginoffTime(curPlayer)
+ CrossRealmPlayer.OnPlayerLogin(curPlayer)
if not PlayerControl.GetIsTJG(curPlayer):
# 只有通知逻辑的应该放此处减少IO,如有逻辑处理存储等不可放在此处
@@ -157,7 +168,7 @@
#仙盟宴会
PlayerFamilyParty.OnPlayerLogin(curPlayer)
#封魔坛
- PlayerSealDemon.OnPlayerLogin(curPlayer)
+ #PlayerSealDemon.OnPlayerLogin(curPlayer)
#仙魔之争
PlayerXMZZ.OnXMZZOnLogin(curPlayer)
#等级奖励
@@ -166,27 +177,94 @@
PlayerStore.OnPlayerLogin(curPlayer)
#通知世界boss信息
GameWorldBoss.OnPlayerLogin(curPlayer)
- #家族副本boss状态通知
- PlayerFamilyBoss.OnLogin(curPlayer)
#渡劫
PlayerDuJie.OnPlayerLogin(curPlayer)
#守卫人皇
PlayerFamilySWRH.OnLogin(curPlayer)
PlayerTalk.LoginChatMi(curPlayer)
- PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID())
+ PlayerTalk.NotifyTalkCache(curPlayer)
+ #PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID())
#活动
GameWorldActionControl.OnPlayerLogin(curPlayer)
#玩家等级记录
PyGameData.g_todayPlayerLVDict[curPlayer.GetID()] = curPlayer.GetLV()
- #副本助战
- PlayerFBHelpBattle.OnHelpPlayerLogin(curPlayer)
+ #竞技场
+ GameWorldArena.OnPlayerLogin(curPlayer)
#跨服PK
CrossRealmPK.OnPlayerLogin(curPlayer)
+ #幸运云购
+ CrossLuckyCloudBuy.OnPlayerLogin(curPlayer)
#诛仙BOSS
PlayerZhuXianBoss.OnPlayerLogin(curPlayer)
#骑宠boss状态通知
PlayerHorsePetBoss.OnLogin(curPlayer)
+ #协助
+ PlayerAssist.OnPlayerLogin(curPlayer)
+ #天星塔
+ GameWorldSkyTower.OnPlayerLogin(curPlayer)
GMT_CTG.OnPlayerLogin(curPlayer)
+
+ else:
+ pass
+
+ return
+
+def DoPlayerRealLoginOK(curPlayer, loginMsg, tick):
+ ''' 玩家最终登录成功处理, 由 MapServer DoPlayerRealLoginOK 通知
+ 该函数为地图最终登录成功才会执行到,以后一些功能类的登录处理建议均写到这里
+ 旧的功能先不动( __DoPlayerLoginServer 函数中的功能),如果有登录相关的bug再考虑是否移动到此函数
+ '''
+ isMixServerFirstLogin = loginMsg[0]
+ GameWorld.Log("GameServer->DoPlayerRealLoginOK, isMixServerFirstLogin=%s" % isMixServerFirstLogin, curPlayer.GetPlayerID())
+
+ if GameWorld.IsCrossServer():
+ return
+
+ PyGameData.g_dbPlayerIDMap[curPlayer.GetPlayerID()] = curPlayer.GetAccID()
+
+ if not PlayerControl.GetIsTJG(curPlayer):
+ #家族副本boss状态通知
+ PlayerFamilyBoss.OnLogin(curPlayer)
+ #魅力
+ PlayerCharm.OnPlayerLogin(curPlayer)
+ #情缘
+ PlayerLove.OnPlayerLogin(curPlayer)
+ #跨服战场
+ CrossBattlefield.OnPlayerLogin(curPlayer)
+
+ if isMixServerFirstLogin:
+ PlayerCharm.OnMixServerFirstLogin(curPlayer)
+
+ return
+
+def __UpdOnedayJobPlayerLoginoffTime(curPlayer):
+ ## 更新一天内职业对应玩家登录、离线时间
+ job = curPlayer.GetJob()
+ playerID = curPlayer.GetPlayerID()
+ if job not in PyGameData.g_onedayJobPlayerLoginoffTimeDict:
+ PyGameData.g_onedayJobPlayerLoginoffTimeDict[job] = {}
+ playerLoginoffTimeDict = PyGameData.g_onedayJobPlayerLoginoffTimeDict[job]
+ playerLoginoffTimeDict[playerID] = int(time.time())
+ #GameWorld.DebugLog("更新职业对应玩家登录离线时间: %s" % PyGameData.g_onedayJobPlayerLoginoffTimeDict)
+ return
+
+def CheckOnedayJobPlayerLoginoffTimeout():
+ ## 检查一天内职业对应玩家登录、离线时间超时玩家,每小时检查一次
+
+ maxTime = 24 * 3600 # 暂定24小时
+ curTime = int(time.time())
+ #GameWorld.DebugLog("处理24小时内在线的角色职业玩家: curTime=%s,maxTime=%s, %s" % (curTime, maxTime, PyGameData.g_onedayJobPlayerLoginoffTimeDict))
+
+ playerManager = GameWorld.GetPlayerManager()
+ for playerDict in PyGameData.g_onedayJobPlayerLoginoffTimeDict.values():
+ for playerID, loginoffTime in playerDict.items():
+ if playerManager.FindPlayerByID(playerID):
+ #GameWorld.DebugLog(" 在线不处理, playerID=%s" % playerID)
+ continue
+ if curTime - loginoffTime > maxTime:
+ playerDict.pop(playerID)
+ #GameWorld.DebugLog(" 超时玩家,移除! playerID=%s,loginoffTime=%s" % (playerID, loginoffTime))
+ #GameWorld.DebugLog(" 处理完毕,剩余玩家! %s" % PyGameData.g_onedayJobPlayerLoginoffTimeDict)
return
## 增加高手玩家上线广播
@@ -477,9 +555,7 @@
__Func_PlayerDisconnect(curPlayer, tick)
except:
import traceback
- GameWorld.ErrLog("玩家下线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
- if GameWorld.GetGameWorld().GetDebugLevel():
- raise Exception("玩家下线逻辑错误~~~~\r\n%s" % traceback.format_exc())
+ GameWorld.RaiseException("玩家下线逻辑错误\r\n%s" % traceback.format_exc())
#调用底层下线
curPlayer.DoDisconnect()
return
@@ -503,13 +579,23 @@
PlayerFamily.PlayerLogoffRefreshFamily(curPlayer, tick)
PlayerFriend.OnPlayerDisconnect(curPlayer, tick)
- PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick)
+ __UpdOnedayJobPlayerLoginoffTime(curPlayer)
+ #PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick)
# 设置家族成员离线时间
SetPlayerOfflineTime(curPlayer)
#拍卖行
AuctionHouse.OnPlayerLeaveServer(curPlayer)
+ #协助
+ PlayerAssist.OnLeaveServer(curPlayer)
+ #红包
+ PlayerFamilyRedPacket.OnLeaveServer(curPlayer)
#------------镖车逻辑
#TruckPlayerDisconnectProcess(curPlayer, tick)
+
+ if not PlayerControl.GetIsTJG(curPlayer):
+ playerID = curPlayer.GetPlayerID()
+ PyGameData.g_unTJLogoffTime[playerID] = int(time.time())
+
return
## 设置玩家离线时间
@@ -517,8 +603,8 @@
# @return None
# @remarks 函数详细说明.
def SetPlayerOfflineTime(curPlayer):
- if PlayerControl.GetIsTJG(curPlayer):
- return
+ #if PlayerControl.GetIsTJG(curPlayer):
+ # return
curPlayerID = curPlayer.GetPlayerID()
curFamily = curPlayer.GetFamily()
@@ -572,6 +658,7 @@
playerStatePack = IPY_GameServer.IPY_GRefreshPlayerProperty()
packValue = playerStatePack.GetValue()
+ packValueEx = playerStatePack.GetValueEx()
packType = playerStatePack.GetType()
#---特殊逻辑处理---
@@ -579,6 +666,10 @@
PlayerControl.SetGMForbidenTalk(curPlayer, packValue)
return
+ if packType == ShareDefine.CDBPlayerRefresh_ExAttr17:
+ PlayerControl.SetPlayerAccState(curPlayer, packValue)
+ return
+
if packType == IPY_GameServer.CDBPlayerRefresh_State:
# 脱机在线
PlayerControl.SetIsTJG(curPlayer, packValue)
@@ -594,7 +685,7 @@
return
if packType == IPY_GameServer.CDBPlayerRefresh_FightPower:
- curPlayer.SetFightPower(packValue)
+ curPlayer.SetFightPower(packValue, packValueEx)
return
if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr2:
@@ -602,11 +693,19 @@
PlayerTeam.SetTeamCheckState(curPlayer, packValue)
return
+ #if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr1:
+ # PlayerControl.SetAssistTagPlayerID(curPlayer, packValue)
+ # return
+
+ if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr3:
+ PlayerControl.SetFBFuncLineID(curPlayer, packValue)
+ return
+
#---常规逻辑处理---
elif packType == IPY_GameServer.CDBPlayerRefresh_LV:
curPlayer.SetLV(packValue)
- PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue)
+ PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue)
#玩家等级记录
playerID = curPlayer.GetID()
if playerID in PyGameData.g_todayPlayerLVDict:
@@ -635,14 +734,15 @@
elif packType == IPY_GameServer.CDBPlayerRefresh_VIPLv:
curPlayer.SetVIPLv(packValue);
# __RefreshTeamState(curPlayer)
+
+ elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr5:
+ PlayerControl.SetCrossMapID(curPlayer, packValue, False)
+
elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr9:
PlayerControl.SetVIPExpireTime(curPlayer, packValue)
elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr10:
PlayerControl.SetChatBubbleBox(curPlayer, packValue)
-
- elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr11:
- PlayerControl.SetTodayXianyuanCoin(curPlayer, packValue)
elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr13:
PlayerControl.SetPlayerServerGroupID(curPlayer, packValue)
@@ -652,7 +752,7 @@
elif packType == IPY_GameServer.CDBPlayerRefresh_OfficialRank:
curPlayer.SetOfficialRank(packValue)
- PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue)
+ PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue)
#更新排行榜的境界
PlayerBillboard.UpdateBillboardRealm(curPlayer)
@@ -680,6 +780,7 @@
GameWorldBoss.OnPlayerChangeMap(curPlayer)
PlayerFamily.OnPlayerChangeMap(curPlayer, tick)
PlayerFamilyParty.OnPlayerChangeMap(curPlayer, tick)
+ GameWorldFamilyWar.OnPlayerChangeMap(curPlayer)
return
## 玩家切换真实地图
@@ -873,17 +974,29 @@
#{
# tagHead Head;
# DWORD MapID;
-# BYTE FBLineID;
-# BYTE IsAllLine;
+# BYTE LineCount;
+# BYTE LineIDList[LineCount]; //个数为0时代表查全部
#};
def ClinetQueryFBLinePlayerCnt(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
queryMapID = clientData.MapID
- fbLineID = clientData.FBLineID
- isAllLine = clientData.IsAllLine
+ queryFBLineIDList = clientData.LineIDList
playerManager = GameWorld.GetPlayerManager()
- sendCMD = str([queryMapID, fbLineID, isAllLine])
+ if queryMapID in ChConfig.Def_CrossMapIDList:
+ fbLinePlayerInfoDict = PyGameData.g_crossFBFuncLinePlayerCountInfo.get(queryMapID, {})
+ if not queryFBLineIDList:
+ resultInfo = [queryMapID, fbLinePlayerInfoDict]
+ else:
+ defaultInfo = [0] # 与本服结构相同,默认0人
+ queryFBLineInfo = {}
+ for lineID in queryFBLineIDList:
+ queryFBLineInfo[lineID] = fbLinePlayerInfoDict.get(lineID, defaultInfo)
+ resultInfo = [queryMapID, queryFBLineInfo]
+ QueryFBLinePlayerCntResult(curPlayer, resultInfo)
+ return
+
+ sendCMD = str([queryMapID, queryFBLineIDList])
playerManager.MapServer_QueryPlayer(curPlayer.GetPlayerID(), 0, 0, queryMapID,
'FBLinePlayerCnt', sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex())
return
@@ -1114,7 +1227,8 @@
serverDateTime.Hour = serverTime.hour
serverDateTime.Minute = serverTime.minute
serverDateTime.Second = serverTime.second
- serverDateTime.MicSecond = serverTime.microsecond
+ serverDateTime.MicSecond = serverTime.microsecond
+ serverDateTime.CrossServerTime = GameWorld.GetCrossServerTimeStr()
# 通知客户端同步时间
NetPackCommon.SendFakePack(curPlayer, serverDateTime)
--
Gitblit v1.8.0