ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GMTExec/CrossPK.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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(): ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GMTExec/CrossPK.py
New file @@ -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)