From 30773f0aaa711a3f00f9fba5a44b4366b27983f1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 27 十二月 2024 17:26:33 +0800 Subject: [PATCH] 10289 【越南】【英语】【砍树】【BT】运势-服务端(增加任务类型消耗培养丹34坐骑 35灵宠) --- ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 193 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 186 insertions(+), 7 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py index d6f8b0a..16a2c76 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py @@ -73,7 +73,60 @@ import CrossBattlefield import CrossActAllRecharge import CrossYaomoBoss +import CrossRealmMsg +import PlayerViewCache +import PlayerFuncTeam +import PyDataManager +import GameWorldMineArea +import PlayerPackData +import PlayerRecData +import GameWorship +import GameXiangong #--------------------------------------------------------------------- + +#--------------------------------------------------------------------- + +class OnlinePlayerMgr(): + ''' 在线玩家管理,子服跨服通用 + 注:跨服服务器时,玩家不一定在跨服服务器,只是表示有同步到跨服服务器的在线玩家,且不是所有玩家都有同步 + ''' + + def __init__(self): + self.onlinePlayerDict = {} # 在线玩家 {playerID:serverGroupID, ...} + return + + def IsOnline(self, playerID): return playerID in self.onlinePlayerDict + + def __SetOnline(self, playerID, serverGroupID): + self.onlinePlayerDict[playerID] = serverGroupID + return + + def __SetOffline(self, playerID, serverGroupID): + self.onlinePlayerDict.pop(playerID, None) + return + + def SetOnlineState(self, playerID, isOnline, serverGroupID=0): + if isOnline: + self.__SetOnline(playerID, serverGroupID) + else: + self.__SetOffline(playerID, serverGroupID) + return + + def GetOfflineValue(self, playerID, viewCache=None): + ## 离线值:0-在线;1-离线;>1-上次离线时间戳,可用于计算离线多久了;当取不到玩家信息时用1代表已离线; + if playerID in self.onlinePlayerDict: + return 0 + offlineValue = 1 + if viewCache and viewCache.OffTime: + offlineValue = viewCache.OffTime + return offlineValue + +def GetOnlinePlayerMgr(): + mgr = PyGameData.g_onlinePlayerMgr + if mgr == None: + mgr = OnlinePlayerMgr() + PyGameData.g_onlinePlayerMgr = mgr + return mgr #--------------------------------------------------------------------- @@ -203,6 +256,8 @@ PlayerAssist.OnPlayerLogin(curPlayer) #天星塔 GameWorldSkyTower.OnPlayerLogin(curPlayer) + #福地 + GameWorldMineArea.OnPlayerLogin(curPlayer) GMT_CTG.OnPlayerLogin(curPlayer) else: @@ -230,6 +285,8 @@ PlayerCharm.OnPlayerLogin(curPlayer) #情缘 PlayerLove.OnPlayerLogin(curPlayer) + #膜拜 + GameWorship.OnPlayerLogin(curPlayer) #跨服战场 CrossBattlefield.OnPlayerLogin(curPlayer) #跨服排位 @@ -238,6 +295,11 @@ CrossActAllRecharge.OnPlayerLogin(curPlayer) #跨服妖魔boss CrossYaomoBoss.OnPlayerLogin(curPlayer) + #玩家记录 + PlayerRecData.OnPlayerLogin(curPlayer) + PlayerPackData.OnPlayerLogin(curPlayer) + #在线状态变更,放最后 + __OnPlayerOnlineStateChange(curPlayer, True) if isMixServerFirstLogin: PlayerCharm.OnMixServerFirstLogin(curPlayer) @@ -577,7 +639,8 @@ if GameWorld.IsCrossServer(): PlayerFB.OnPlayerDisconnectCrossServer(curPlayer) - + return + #跨服匹配PK CrossRealmPK.OnLeaveServer(curPlayer) @@ -602,7 +665,119 @@ if not PlayerControl.GetIsTJG(curPlayer): playerID = curPlayer.GetPlayerID() PyGameData.g_unTJLogoffTime[playerID] = int(time.time()) + PyGameData.g_xiangongCanLikeTimeDict.pop(playerID, None) + #在线状态变更,放最后 + __OnPlayerOnlineStateChange(curPlayer, False) + return + +def __OnPlayerOnlineStateChange(curPlayer, isOnline): + ## 在线状态变更 + if PlayerControl.GetIsTJG(curPlayer): + return + + playerID = curPlayer.GetPlayerID() + olMgr = GetOnlinePlayerMgr() + olMgr.SetOnlineState(playerID, isOnline) + + #relatedPlayerIDList = [] # 本服相关玩家 + #offlineValue = olMgr.GetOfflineValue(playerID, PlayerViewCache.FindViewCache(playerID)) + #SyncRelatedPlayerOnlineState(playerID, offlineValue, relatedPlayerIDList) + + if curPlayer.GetLV() < 50: + #GameWorld.DebugLog("跨服相关功能未开启,不同步在线状态到跨服服务器! LV=%s" % curPlayer.GetLV(), curPlayer.GetPlayerID()) + return + + cacheBase = PlayerViewCache.GetSyncCrossCacheBase(curPlayer) + dataMsg = {"playerID":playerID, "isOnline":isOnline, "cacheBase":cacheBase} + CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_PlayerLoginout, dataMsg) + return + +def ClientServerMsg_PlayerLoginout(serverGroupID, msgData): + ## 收到子服玩家上下线 + + playerID = msgData["playerID"] + isOnline = msgData["isOnline"] + cacheBase = msgData["cacheBase"] + + isLogout = not isOnline + olMgr = GetOnlinePlayerMgr() + olMgr.SetOnlineState(playerID, isOnline, cacheBase.get("ServerGroupID", 0)) + + PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase, isLogout) + serverID = GameWorld.GetAccIDServerID(cacheBase["AccID"]) + + # 上线 + if isOnline: + # 需要管理跨服在线状态时,默认需要同步缓存信息 + syncStateInfo = {"playerID":playerID, "ViewCacheCross":1} + packDataMgr = PyDataManager.GetDBPlayerPackDataManager() + if playerID in packDataMgr.playerPackDataDict: + syncStateInfo["PackDataCross"] = 1 + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PlayerPackDataState, syncStateInfo, [serverGroupID]) + + GameXiangong.OnPlayerLogin_CrossLogic(serverGroupID, serverID, playerID) + + # 下线 + else: + pass + + SyncCrossPlayerOnlineStateToRelatedPlayer(playerID) + return + +def SyncCrossPlayerOnlineStateToRelatedPlayer(playerID): + ## 同步跨服玩家在线状态给相关玩家 + + relatedPlayerIDList = [] + + # 功能队伍 + funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() + playerTeamIDDict = funcTeamMgr.GetPlayerTeamIDDict(playerID) + for _, teamID in playerTeamIDDict.items(): + funcTeam = funcTeamMgr.GetFuncTeam(teamID) + if not funcTeam: + continue + relatedPlayerIDList += funcTeam.GetMemberIDList() + + # 其他... + + # 去重汇总 + relatedPlayerIDList = list(set(relatedPlayerIDList)) + if playerID in relatedPlayerIDList: + relatedPlayerIDList.remove(playerID) + if not relatedPlayerIDList: + return + + offlineValue = GetOnlinePlayerMgr().GetOfflineValue(playerID, PlayerViewCache.FindViewCache(playerID)) + dataMsg = {"loginoutPlayerID":playerID, "offlineValue":offlineValue, "relatedPlayerIDList":relatedPlayerIDList} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PlayerLoginout, dataMsg) + return + +def CrossServerMsg_PlayerLoginout(msgData): + ## 收到跨服服务器信息 - 玩家上下线状态变更 + loginoutPlayerID = msgData["loginoutPlayerID"] + offlineValue = msgData["offlineValue"] + relatedPlayerIDList = msgData["relatedPlayerIDList"] + SyncRelatedPlayerOnlineState(loginoutPlayerID, offlineValue, relatedPlayerIDList, 1) + return + +def SyncRelatedPlayerOnlineState(loginoutPlayerID, offlineValue, relatedPlayerIDList, isCross=0): + clientPack = None + playerMgr = GameWorld.GetPlayerManager() + for playerID in relatedPlayerIDList: + if not PlayerControl.GetDBPlayerAccIDByID(playerID): + continue + curPlayer = playerMgr.FindPlayerByID(playerID) + if not curPlayer or not curPlayer.GetInitOK(): + continue + + if not clientPack: + clientPack = ChPyNetSendPack.tagGCRelatedPlayerOnlineState() + clientPack.PlayerID = loginoutPlayerID + clientPack.OfflineValue = offlineValue + clientPack.IsCross = isCross + + NetPackCommon.SendFakePack(curPlayer, clientPack) return ## 设置玩家离线时间 @@ -667,6 +842,7 @@ packValue = playerStatePack.GetValue() packValueEx = playerStatePack.GetValueEx() packType = playerStatePack.GetType() + #packValueTotal = packValue + packValueEx * ChConfig.Def_PerPointValue #---特殊逻辑处理--- if packType == ShareDefine.CDBPlayerRefresh_ForbidenTalk: @@ -676,7 +852,11 @@ if packType == ShareDefine.CDBPlayerRefresh_ExAttr17: PlayerControl.SetPlayerAccState(curPlayer, packValue) return - + + if packType == ShareDefine.CDBPlayerRefresh_ExAttr19: + PlayerControl.SetLeaveFamilyTimeEx(curPlayer, packValue) + return + if packType == IPY_GameServer.CDBPlayerRefresh_State: # 脱机在线 PlayerControl.SetIsTJG(curPlayer, packValue) @@ -766,6 +946,10 @@ elif packType == IPY_GameServer.CDBPlayerRefresh_Face: curPlayer.SetFace(packValue) PlayerBillboard.UpdateBillboardFace(curPlayer) + elif packType == IPY_GameServer.CDBPlayerRefresh_HairColor: + #c++头像外框 用头发颜色通知 - 遗漏问题 + curPlayer.SetFacePic(packValue) + PlayerBillboard.UpdateBillboardFacePic(curPlayer) #社交信息 PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue) @@ -1222,11 +1406,6 @@ # @param tick 时间戳 # @return None def Sync_PyServerDataTimeToClient(curPlayer, tick): - - if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_SyncClientTick, tick): - #间隔未到 - return - # 服务器时间 serverTime = GameWorld.GetServerTime() if not serverTime: -- Gitblit v1.8.0