From d64812cfcc2ad1c432ac8e0c29e57281441be727 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 13 十一月 2024 14:02:37 +0800
Subject: [PATCH] 10261 【越南】【砍树】【英文】增加玩家定制头像支持;

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py |  117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 112 insertions(+), 5 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
index 431bbf4..40adc1f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
@@ -45,6 +45,8 @@
         self.playerName = ""
         self.playerJob = 0
         self.playerLV = 0
+        self.face = 0
+        self.facePic = 0
         self.maxHP = 0
         self.maxProDef = 0
         self.fightPower = 0
@@ -152,7 +154,7 @@
         billboardList = billboardList[:len(syncBillboardList)] # 直接用本服以后的排行数据实例clear后覆盖更新,不足的创建新实例
         orderDict = {} # 排行信息重新更新
         for i, syncData in enumerate(syncBillboardList):
-            playerID, playerName, job, fightPower, realmLV, pkScore, danLV, billTime, order = syncData
+            playerID, playerName, job, face, facePic, fightPower, realmLV, pkScore, danLV, billTime, order = syncData
             if i < len(billboardList):
                 billboardData = billboardList[i]
                 billboardData.clear()
@@ -164,6 +166,8 @@
             billboardData.PlayerID = playerID
             billboardData.PlayerName = playerName
             billboardData.Job = job
+            billboardData.Face = face
+            billboardData.FacePic = facePic
             billboardData.FightPower = fightPower
             billboardData.RealmLV = realmLV
             billboardData.PKScore = pkScore
@@ -226,7 +230,7 @@
             
         return pos
     
-def UpdateCrossPKBillboard(zoneID, seasonID, winner, loser):
+def UpdateCrossPKBillboard(zoneID, seasonID, winner, loser, syncClientServer=False):
     ## 更新跨服PK排行榜,跨服服务器结算调用,子服不调用
     
     curZoneSeasonID = GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
@@ -295,6 +299,8 @@
         billboardData.PlayerID = playerID
         billboardData.PlayerName = pkPlayer.playerName
         billboardData.Job = pkPlayer.playerJob
+        billboardData.Face = pkPlayer.face
+        billboardData.FacePic = pkPlayer.facePic
         billboardData.FightPower = pkPlayer.fightPower
         billboardData.RealmLV = pkPlayer.realmLV
         billboardData.PKScore = pkPlayer.pkScore
@@ -310,13 +316,15 @@
     matchState = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
     if not matchState and not PyGameData.g_crossPKRoomDict:
         GameWorld.Log("匹配已结束,且当前没有PK中的房间了!主动广播子服最新榜单! ")
+        syncClientServer = True
+    if syncClientServer:
         crossZoneName = GameWorld.GetCrossZoneName()
         zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
         if zoneIpyData:
             serverGroupIDList = zoneIpyData.GetServerGroupIDList()
             SyncPKSyncBillboardToClientServer(zoneID, seasonID, serverGroupIDList)
             
-    return
+    return True
 
 #// C0 01 查看跨服竞技场赛季排行榜 #tagCGViewCrossPKBillboard
 #
@@ -438,6 +446,9 @@
 
 def ClientServerMsg_PKBillboard(serverGroupID, msgData):
     ## 收到子服请求查询PK排行榜信息
+    if "GMSetCrossPK" in msgData:
+        _GMSetCrossPK(serverGroupID, msgData)
+        return
     zoneID = msgData["ZoneID"]
     seasonID = msgData["SeasonID"]
     exData = msgData.get("ExData", {}) # 原数据返回子服
@@ -463,13 +474,15 @@
         playerID = billboardData.PlayerID
         playerName = billboardData.PlayerName
         job = billboardData.Job
+        face = billboardData.Face
+        facePic = billboardData.FacePic
         fightPower = billboardData.FightPower
         realmLV = billboardData.RealmLV
         pkScore = billboardData.PKScore
         danLV = billboardData.DanLV
         billTime = billboardData.Time
         order = orderDict.get(playerID, 0)
-        syncBillboardList.append([playerID, playerName, job, fightPower, realmLV, pkScore, danLV, billTime, order])
+        syncBillboardList.append([playerID, playerName, job, face, facePic, fightPower, realmLV, pkScore, danLV, billTime, order])
         
     syncInfo = [zoneID, seasonID, syncBillboardList, exData, isFinalBillboardData]
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSyncBillboard, syncInfo, serverGroupIDList)
@@ -516,6 +529,8 @@
         billboardInfoData.PlayerName = billboardData.PlayerName
         billboardInfoData.NameLen = len(billboardInfoData.PlayerName)
         billboardInfoData.Job = billboardData.Job
+        billboardInfoData.Face = billboardData.Face
+        billboardInfoData.FacePic = billboardData.FacePic
         billboardInfoData.FightPower = billboardData.FightPower
         billboardInfoData.RealmLV = billboardData.RealmLV
         billboardInfoData.PKScore = billboardData.PKScore
@@ -884,6 +899,8 @@
     playerID = playerInfoDict["playerID"] # 角色ID
     playerName = playerInfoDict["playerName"] # 玩家名
     job = playerInfoDict["playerJob"] # 职业
+    face = playerInfoDict["face"]
+    facePic = playerInfoDict["facePic"]
     playerLV = playerInfoDict["playerLV"] # 职业
     maxHP = playerInfoDict["maxHP"] # 职业
     maxProDef = playerInfoDict["maxProDef"] # 护盾
@@ -915,6 +932,8 @@
     pkPlayer.playerName = playerName
     pkPlayer.playerJob = job
     pkPlayer.playerLV = playerLV
+    pkPlayer.face = face
+    pkPlayer.facePic = facePic
     pkPlayer.maxHP = maxHP
     pkPlayer.maxProDef = maxProDef
     pkPlayer.pkScore = pkScore
@@ -1082,6 +1101,9 @@
         DR_CrossReamlPK("CancelRoom", dataDict)
         break
     
+    if playerID in PyGameData.g_crossPKZoneMatchRobotPlayerDict:
+        PyGameData.g_crossPKZoneMatchRobotPlayerDict.pop(playerID)
+        GameWorld.DebugLog("    从匹配机器人队列中移除!")
     return
 
 def ClientServerMsg_PKPrepareOK(playerInfoDict, tick):
@@ -1142,7 +1164,7 @@
             pkZoneID = roomPlayer.pkZoneID
             roomGroupIDList.append(roomPlayer.serverGroupID)
             readyMemberDict[roomPlayerID] = {"ServerGroupID":roomPlayer.serverGroupID, "Name":roomPlayer.playerName, "Number":num,
-                                             "Job":roomPlayer.playerJob, "LV":roomPlayer.playerLV, "MaxHP":roomPlayer.maxHP, "MaxProDef":roomPlayer.maxProDef}
+                                             "Job":roomPlayer.playerJob, "Face":roomPlayer.face, "FacePic":roomPlayer.facePic, "LV":roomPlayer.playerLV, "MaxHP":roomPlayer.maxHP, "MaxProDef":roomPlayer.maxProDef}
                     
         if not isAllReady:
             continue
@@ -1794,6 +1816,62 @@
     DR_CrossReamlPK("PKOverRobot", dataDict)
     return
 
+def _GMSetCrossPK(serverGroupID, msgData):
+    ## 收到子服GM同步的设置跨服PK数据
+    
+    if not GameWorld.IsCrossServer():
+        GameWorld.ErrLog("GMSetCrossPK非跨服服务器不处理该跨服GM请求!")
+        return
+    
+    zoneID = msgData["ZoneID"]
+    seasonID = msgData["SeasonID"]
+    playerInfoDict = msgData["PlayerInfo"]
+    
+    accID = playerInfoDict["accID"]
+    playerID = playerInfoDict["playerID"]
+    playerName = playerInfoDict["playerName"]
+    playerJob = playerInfoDict["playerJob"]
+    face = playerInfoDict.get("face", 0)
+    facePic = playerInfoDict.get("facePic", 0)
+    fightPower = playerInfoDict["fightPower"]
+    realmLV = playerInfoDict["realmLV"]
+    pkScore = playerInfoDict["pkScore"]
+    danLV = playerInfoDict["danLV"]
+    cWinCount = playerInfoDict["cWinCount"]
+    ondayScore = playerInfoDict["ondayScore"]
+    
+    zoneMatchPlayerList = PyGameData.g_crossPKZoneMatchPlayerDict.get(zoneID, [])
+    if playerID in zoneMatchPlayerList or playerID in PyGameData.g_crossPKZoneMatchRobotPlayerDict or playerID in PyGameData.g_crossPKZoneMatchRobotPlayerDict:
+        GameWorld.ErrLog("GMSetCrossPK玩家正在匹配中,无法设置该GM请求数据! playerID=%s,accID=%s" % (playerID, accID))
+        return
+    
+    pkPlayer = CrossPKPlayer()
+    pkPlayer.accID = accID
+    pkPlayer.playerID = playerID
+    pkPlayer.playerName = playerName
+    pkPlayer.playerJob = playerJob
+    pkPlayer.face = face
+    pkPlayer.facePic = facePic
+    pkPlayer.pkScore = pkScore
+    pkPlayer.danLV = danLV
+    pkPlayer.fightPower = fightPower
+    pkPlayer.realmLV = realmLV
+    pkPlayer.cWinCount = cWinCount
+    pkPlayer.ondayScore = ondayScore
+    pkPlayer.serverGroupID = serverGroupID
+    pkPlayer.pkZoneID = zoneID
+    pkPlayer.seasonID = seasonID
+    
+    # 更新排行榜
+    isOK = UpdateCrossPKBillboard(zoneID, seasonID, pkPlayer, None, True)
+    GameWorld.Log("GMSetCrossPK设置跨服PK榜单玩家数据成功: isOK=%s,zoneID=%s,seasonID=%s,pkScore=%s,danLV=%s,cWinCount=%s,accID=%s" 
+                  % (isOK, zoneID, seasonID, pkScore, danLV, cWinCount, accID), playerID)
+    
+    # 记录流向
+    dataDict = {"zoneID":zoneID, "seasonID":seasonID, "pkPlayer":pkPlayer.GetDRInfo()}
+    DR_CrossReamlPK("GMSet", dataDict)
+    return
+    
 ##================================== 以下是子服逻辑 ==========================================
 
 def OnGameServerInitOK():
@@ -2004,6 +2082,8 @@
                     matchPlayer.NameLen = len(matchPlayer.PlayerName)
                     matchPlayer.Job = readyPlayerInfo["Job"]
                     matchPlayer.LV = readyPlayerInfo["LV"]
+                    matchPlayer.Face = readyPlayerInfo["Face"]
+                    matchPlayer.FacePic = readyPlayerInfo["FacePic"]
                     matchPlayer.MaxHP = readyPlayerInfo["MaxHP"] % ShareDefine.Def_PerPointValue
                     matchPlayer.MaxHPEx = readyPlayerInfo["MaxHP"] / ShareDefine.Def_PerPointValue
                     matchPlayer.MaxProDef = readyPlayerInfo["MaxProDef"]
@@ -2180,3 +2260,30 @@
     DataRecordPack.SendEventPack("CrossPK_%s" % eventName, drDataDict)
     return
 
+def IsCrossRealmPKPlayer(playerID, checkPreSeason=False, checkAllSeason=False):
+    ## 仅跨服服务器判断用
+    # @param checkPreSeason: 检查上一赛季
+    # @param checkAllSeason: 检查所有赛季
+    
+    # 默认取分区1的赛季作为当前赛季,所有分区赛季ID相同,且递增
+    gameWorld = GameWorld.GetGameWorld()
+    nowSeasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % 1)
+    preSeasonID = nowSeasonID - 1
+    crossPKBillboardMgr = PyDataManager.GetCrossPKBillboardManager()
+    crossZoneName = GameWorld.GetCrossZoneName()
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in range(ipyDataMgr.GetCrossRealmPKSeasonCount()):
+        seasonIpyData = ipyDataMgr.GetCrossRealmPKSeasonByIndex(index)
+        if crossZoneName != seasonIpyData.GetCrossZoneName():
+            continue
+        zoneID = seasonIpyData.GetZoneID()
+        seasonID = seasonIpyData.GetSeasonID()
+        if checkAllSeason or seasonID == nowSeasonID or (checkPreSeason and seasonID == preSeasonID):
+            pass
+        else:
+            continue
+        _, orderDict = crossPKBillboardMgr.GetCrossPKBillboardInfo(zoneID, seasonID)
+        if orderDict and playerID in orderDict:
+            return True
+        
+    return False

--
Gitblit v1.8.0