From 22c964784d465c77365c2495f6d43117618d8482 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 26 十二月 2024 16:52:25 +0800 Subject: [PATCH] 10350 【后端】【越南】【英文】【BT】【砍树】跨服竞技场优化 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py | 99 ++++++++++++++++++++++++++++++------------------- 1 files changed, 61 insertions(+), 38 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py index 71537ac..8d2a68e 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py @@ -17,12 +17,14 @@ import CommFunc import ShareDefine +import IpyGameDataPY import CrossRealmMsg import PyGameDataStruct import ChPyNetSendPack import DataRecordPack import NetPackCommon import PyDataManager +import CrossRealmPK import GameWorld import operator @@ -110,7 +112,6 @@ self.__billboardType = billboardType self.__groupValue1 = groupValue1 self.__groupValue2 = groupValue2 - self.__maxCount = ShareDefine.CrossBillboard_MaxDataCount.get(billboardType, 100) self.__crossServerDataVer = 0 # 主服榜单数据版本 self.__clientServerDataVer = 0 # 子服榜单数据版本 self.__billboardList = [] # [tagDBCrossBillboard, ...] @@ -268,10 +269,17 @@ return def GetCount(self): return len(self.__billboardList) - def GetMaxCount(self): return self.__maxCount + def GetMaxCount(self): + maxCountDict = IpyGameDataPY.GetFuncEvalCfg("CrossBillboardSet", 1, {}) + return maxCountDict.get(self.__billboardType, 100) - def At(self, i): return self.__billboardList[i] - def IsFull(self): return len(self.__billboardList) >= self.__maxCount + def At(self, i): + billData = self.__billboardList[i] + if not billData and False: + billData = PyGameDataStruct.tagDBCrossBillboard() # 不会执行到,只为了.出代码提示 + return billData + + def IsFull(self): return len(self.__billboardList) >= self.GetMaxCount() def UpdCrossServerDataVer(self, version=None): ## 更新跨服榜单数据版本号,用于跨服主服、子服验证数据版本,同步榜单数据用 @@ -466,8 +474,21 @@ GameWorld.DebugLog("玩家请求查看跨服排行榜: billboardType=%s,groupValue1=%s,groupValue2=%s" % (billboardType, groupValue1, groupValue2)) # 请求查询跨服服务器 - dataMsg = {"BillboardType":billboardType, "GroupValue1":groupValue1, "GroupValue2":groupValue2, - "QueryData":{"EventName":"View", "PlayerID":playerID, "StartIndex":startIndex, "WatchCnt":watchCnt, "WatchID":watchID}} + dataMsg = {"BillboardType":billboardType, "GroupValue1":groupValue1, "GroupValue2":groupValue2, "PlayerID":playerID, + "QueryType":"View", "QueryData":{"StartIndex":startIndex, "WatchCnt":watchCnt, "WatchID":watchID}} + CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryBillboard, dataMsg) + return + +def OnQueryPlayerBillboardRank(playerID, funcName, funcData, billboardType, groupValue1, groupValue2=0, tagPlayerID=0): + ## 查询玩家ID排名 + if GameWorld.IsCrossServer(): + return + if billboardType not in ShareDefine.CrossBillboardTypeList: + return + if not tagPlayerID: + tagPlayerID = playerID # 默认查自己 + dataMsg = {"BillboardType":billboardType, "GroupValue1":groupValue1, "GroupValue2":groupValue2, "PlayerID":playerID, + "QueryType":"Ranking", "QueryData":{"PlayerID":tagPlayerID, "funcName":funcName, "funcData":funcData}} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryBillboard, dataMsg) return @@ -476,11 +497,13 @@ billboardType = msgData["BillboardType"] groupValue1 = msgData["GroupValue1"] groupValue2 = msgData["GroupValue2"] + playerID = msgData.get("PlayerID", 0) # 发起的玩家ID + queryType = msgData.get("QueryType", "") # 原数据返回子服 queryData = msgData.get("QueryData", {}) # 原数据返回子服 - SyncCrossBillboardToClientServer(billboardType, groupValue1, groupValue2, [serverGroupID], queryData) + SyncCrossBillboardToClientServer(billboardType, groupValue1, groupValue2, [serverGroupID], playerID, queryType, queryData) return -def SyncCrossBillboardToClientServer(billboardType, groupValue1, groupValue2, serverGroupIDList=None, queryData=None): +def SyncCrossBillboardToClientServer(billboardType, groupValue1, groupValue2, serverGroupIDList=None, playerID=0, queryType="", queryData=None): ## 同步跨服榜单到子服 if not GameWorld.IsCrossServer(): return @@ -492,9 +515,17 @@ billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2) billboardObj.DoDelaySort() idOrderDict = billboardObj.GetIDOrderDict() - crossServerDataVer = billboardObj.GetCrossServerDataVer() - msgData = {"BillboardType":billboardType, "GroupValue1":groupValue1, "GroupValue2":groupValue2, - "QueryData":queryData, "CrossServerDataVer":crossServerDataVer} + msgData = {"BillboardType":billboardType, "GroupValue1":groupValue1, "GroupValue2":groupValue2, "PlayerID":playerID, + "QueryType":queryType, "QueryData":queryData} + + # 查询名次 + if queryType == "Ranking": + tagPlayerID = queryData.get("PlayerID", 0) + if not tagPlayerID: + return + queryData["OrderIndex"] = idOrderDict.get(tagPlayerID, 0) - 1 # -1-未上榜,0-第一名 + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_SyncBillboard, msgData, serverGroupIDList) + return # 有查询数据时才同步榜单数据列表,否则只同步数据版本号 if queryData: @@ -560,38 +591,30 @@ billboardType = msgData["BillboardType"] groupValue1 = msgData["GroupValue1"] groupValue2 = msgData["GroupValue2"] - crossServerDataVer = msgData["CrossServerDataVer"] - syncBillboardList = msgData.get("BillboardDataList") - GameWorld.DebugLog("收到跨服服务器同步的排行榜信息: billboardType=%s,groupValue1=%s,groupValue2=%s,crossServerDataVer=%s" - % (billboardType, groupValue1, groupValue2, crossServerDataVer)) - - #billboardMgr = PyDataManager.GetCrossBillboardManager() - #billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2) - #billboardObj.UpdClientServerBillboard(crossServerDataVer, syncBillboardList) - - queryData = msgData.get("QueryData") - if not queryData: + playerID = msgData.get("PlayerID", 0) # 发起的玩家ID + queryType = msgData.get("QueryType", "") + queryData = msgData.get("QueryData", {}) + GameWorld.DebugLog("收到跨服服务器同步的排行榜信息: billboardType=%s,groupValue1=%s,groupValue2=%s,queryType=%s" + % (billboardType, groupValue1, groupValue2, queryType), playerID) + if not queryType or not queryData: return - eventName = queryData.get("EventName") - #eventData = queryData.get("EventData") - queryPlayerID = queryData.get("PlayerID", 0) - if not eventName or not queryPlayerID: - return - - queryPlayer = GameWorld.GetPlayerManager().FindPlayerByID(queryPlayerID) - if not queryPlayer: - return - - if eventName == "View": + if queryType == "View": + queryPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) + if not queryPlayer: + return watchID = queryData.get("WatchID", 0) + syncBillboardList = msgData.get("BillboardDataList") SyncCrossBillboardToPlayer(queryPlayer, billboardType, groupValue1, groupValue2, syncBillboardList, watchID) - #else: - # idOrderDict = billboardObj.GetIDOrderDict() - # order = idOrderDict.get(queryPlayerID, 0) - # sysMsg = str([billboardType, groupValue1, groupValue2, eventName, eventData, order]) - # queryPlayer.MapServer_QueryPlayerResult(0, 0, "CrossBillboardOrder", sysMsg, len(sysMsg)) + elif queryType == "Ranking": + funcName = queryData.get("funcName", "") + funcData = queryData.get("funcData", {}) + #tagPlayerID = queryData.get("PlayerID", 0) + orderIndex = queryData.get("OrderIndex", 0) + if funcName == "QueryCrossPKSeasonOrder": + CrossRealmPK.OnQueryCrossPKSeasonOrderRet(playerID, funcData, orderIndex) + return def SyncCrossBillboardToPlayer(curPlayer, billboardType, groupValue1, groupValue2, billboardList, watchID): -- Gitblit v1.8.0