From 314e5bda6fac9148711b9c7f9bc2e4bdef5d4977 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 16 二月 2023 18:42:57 +0800
Subject: [PATCH] 9779 【bt9】【bt8】【主干】【越南】新增修改玩家跨服匹配相关数据后台命令
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py | 61 +++++++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GMTExec/CrossPK.py | 87 +++++++++++++++++++++++++++++
2 files changed, 146 insertions(+), 2 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
index 553dfd8..58ef254 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
@@ -226,7 +226,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)
@@ -310,13 +310,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 +440,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", {}) # 原数据返回子服
@@ -1797,6 +1802,58 @@
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"]
+ 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.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():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GMTExec/CrossPK.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GMTExec/CrossPK.py
new file mode 100644
index 0000000..dd3b25d
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GMTExec/CrossPK.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Script.Player.GMTExec.CrossPK
+#
+# @todo:设置跨服PK玩家数据
+# @author hxp
+# @date 2023-02-16
+# @version 1.0
+#
+# 详细描述: 设置跨服PK玩家数据
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2023-02-16 18:30"""
+#-------------------------------------------------------------------------------
+
+def runMyTest(exec_locals):
+ ''' 运行命令函数
+ @param exec_locals: GY_Query_GMTExecfile 模块中的 DoLogic 函数 locals()
+
+ import 其他模块需要写在此函数里,不然无法引用到
+ '''
+ import GameWorld
+ import CrossRealmPlayer
+ import PlayerCrossRealmPK
+ import PlayerControl
+ import ShareDefine
+ import ChConfig
+
+ orderId = exec_locals["orderId"]
+ cmdInfo = exec_locals["cmdInfo"]
+ curPlayer = exec_locals["curPlayer"]
+ resultDict = exec_locals["resultDict"] # 建议都进行更新结果字典记录详细处理信息,GY_Query_GMTExecfile 模块会统一写入流向
+
+ # 以下为详细处理逻辑
+ # ============================ 配置信息 ============================
+ '''设置后需要检查数据是否正确同步到跨服服务器
+ 1. 后台返回如果有关键字 "errorMsg":"OK",代表本服设置成功;
+ 如果 errorMsg 是其他信息,代表本服就已经设置失败了,比如无赛季信息或赛季已结束是无法执行命令的;
+ 2. 后台成功代表本服数据已成功设置,需要再检查是否成功同步跨服服务器;直接看榜单,如果已经更新证明同步成功;
+ 3. 如果没看到榜单更新,检查跨服服务器日志,搜索 GMSetCrossPK, 看是否有相关错误日志;
+ 4. 也可以直接看跨服流向 CrossPK_GMSet_xxx.txt,看是否有相关设置流向记录,有的话代表成功;
+ 注:如果跨服数据没有成功同步,则需要后台重复执行命令直到成功
+ '''
+ danLV = 20 # 段位等级,需与所设置的积分所属段位匹配,参考 K.跨服竞技场段位表
+ pkScore = 32000 # 积分
+ cWinCount = 50 # 连胜
+ # =================================================================
+
+ zoneID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
+ seasonID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID)
+ seasonState = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
+
+ errorMsg = "OK"
+ if not zoneID or not seasonID or seasonState == 2:
+ errorMsg = "zone season or state error."
+ else:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CrossPK_DanLV, danLV)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CrossPK_TotalScore, pkScore)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CrossPK_CWinCount, cWinCount)
+ if cWinCount > 0:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CrossPK_CLoseCount, 0)
+
+ # 请求查询跨服服务器
+ playerInfoDict = {"accID":curPlayer.GetAccID(),
+ "playerID":curPlayer.GetPlayerID(),
+ "playerName":CrossRealmPlayer.GetCrossPlayerName(curPlayer),
+ "playerJob":curPlayer.GetJob(),
+ "fightPower":PlayerControl.GetFightPower(curPlayer),
+ "realmLV":curPlayer.GetOfficialRank(),
+ "ondayScore":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CrossPK_OnDayScore),
+ "pkScore":pkScore, "danLV":danLV, "cWinCount":cWinCount,
+ }
+ resultDict.update({"PlayerInfo":playerInfoDict})
+ dataMsg = {"ZoneID":zoneID, "SeasonID":seasonID, "GMSetCrossPK":1, "PlayerInfo":playerInfoDict}
+ GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_PKBillboard, dataMsg)
+ PlayerCrossRealmPK.SyncCrossRealmPKPlayerInfo(curPlayer)
+
+ GameWorld.Log("This is MameServer GMT_Execfile run %s. orderId=%s" % (cmdInfo, orderId), curPlayer.GetPlayerID())
+ resultDict.update({"zoneID":zoneID, "seasonID":seasonID, "seasonState":seasonState, "errorMsg":errorMsg})
+ return
+
+exec_locals = locals()
+if exec_locals.get("cmdInfo"):
+ runMyTest(exec_locals)
+
--
Gitblit v1.8.0