From 01d734e87f81367d8cdcca7d69b0c8e75de17905 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 01 九月 2021 17:03:48 +0800 Subject: [PATCH] 8585 【主干】【gt_1.101.1】【BT3】【bt3_1.100.1】【后端】竞技场(排行榜、匹配列表,对战记录战斗力支持超20亿;对战记录挑战支持查询最新数据;守护者支持积分加减并同步名次对应等级; 增加对战流向记录) --- ServerPython/CoreServerGroup/GameServer/PyNetPack.ini | 6 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py | 192 +++++++++++++++++-- ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py | 1 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 52 +++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 131 ++++++++++++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 52 +++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py | 2 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 131 ++++++++++++ 8 files changed, 539 insertions(+), 28 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini index f1fae7f..91ced3a 100644 --- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini +++ b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini @@ -153,12 +153,16 @@ Writer = hxp Releaser = hxp RegType = 0 -RegisterPackCount = 1 +RegisterPackCount = 2 PacketCMD_1=0xA9 PacketSubCMD_1=0xA8 PacketCallFunc_1=OnQueryArenaBattleRecord +PacketCMD_2=0xA9 +PacketSubCMD_2=0xA5 +PacketCallFunc_2=OnQueryArenaBattlePlayer + ;镖车 [PlayerTruck.py] ScriptName = Player\PlayerTruck.py diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py index 68ec094..b8a55ae 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py @@ -1304,6 +1304,58 @@ #------------------------------------------------------ +# A9 A5 查看竞技场对战玩家最新信息 #tagCGQueryArenaBattlePlayer + +class tagCGQueryArenaBattlePlayer(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("PlayerID", c_int), #目标玩家ID,仅支持查真实玩家 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA9 + self.SubCmd = 0xA5 + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.Cmd = 0xA9 + self.SubCmd = 0xA5 + self.PlayerID = 0 + return + + def GetLength(self): + return sizeof(tagCGQueryArenaBattlePlayer) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A9 A5 查看竞技场对战玩家最新信息 //tagCGQueryArenaBattlePlayer: + Cmd:%s, + SubCmd:%s, + PlayerID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.PlayerID + ) + return DumpString + + +m_NAtagCGQueryArenaBattlePlayer=tagCGQueryArenaBattlePlayer() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGQueryArenaBattlePlayer.Cmd,m_NAtagCGQueryArenaBattlePlayer.SubCmd))] = m_NAtagCGQueryArenaBattlePlayer + + +#------------------------------------------------------ # A9 A8 查看竞技场对战记录 #tagCGQueryArenaBattleRecord class tagCGQueryArenaBattleRecord(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index 76b41e7..72b4c21 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -2368,6 +2368,112 @@ #------------------------------------------------------ +# A9 26 竞技场对战玩家最新信息 #tagGCArenaBattlePlayerInfo + +class tagGCArenaBattlePlayerInfo(Structure): + Head = tagHead() + PlayerID = 0 #(DWORD PlayerID)//目标玩家ID + PlayerName = "" #(char PlayerName[33]) + Job = 0 #(BYTE Job) + LV = 0 #(WORD LV)//等级 + RealmLV = 0 #(WORD RealmLV)//境界,机器人读境界表取等级对应境界 + FightPower = 0 #(DWORD FightPower)//战力求余亿部分,机器人读等级表取等级对应战力 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力整除亿部分,机器人读等级表取等级对应战力 + Score = 0 #(DWORD Score)//积分 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA9 + self.Head.SubCmd = 0x26 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Score,_pos = CommFunc.ReadDWORD(_lpData, _pos) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA9 + self.Head.SubCmd = 0x26 + self.PlayerID = 0 + self.PlayerName = "" + self.Job = 0 + self.LV = 0 + self.RealmLV = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.Score = 0 + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 33 + length += 1 + length += 2 + length += 2 + length += 4 + length += 4 + length += 4 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteString(data, 33, self.PlayerName) + data = CommFunc.WriteBYTE(data, self.Job) + data = CommFunc.WriteWORD(data, self.LV) + data = CommFunc.WriteWORD(data, self.RealmLV) + data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteDWORD(data, self.Score) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + PlayerID:%d, + PlayerName:%s, + Job:%d, + LV:%d, + RealmLV:%d, + FightPower:%d, + FightPowerEx:%d, + Score:%d + '''\ + %( + self.Head.OutputString(), + self.PlayerID, + self.PlayerName, + self.Job, + self.LV, + self.RealmLV, + self.FightPower, + self.FightPowerEx, + self.Score + ) + return DumpString + + +m_NAtagGCArenaBattlePlayerInfo=tagGCArenaBattlePlayerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCArenaBattlePlayerInfo.Head.Cmd,m_NAtagGCArenaBattlePlayerInfo.Head.SubCmd))] = m_NAtagGCArenaBattlePlayerInfo + + +#------------------------------------------------------ # A9 23 竞技场对战记录列表 #tagGCArenaBattleRecordList class tagGCArenaBattleRecord(Structure): @@ -2376,7 +2482,9 @@ Job = 0 #(BYTE Job) LV = 0 #(WORD LV)//等级 RealmLV = 0 #(WORD RealmLV)//境界,机器人读境界表取等级对应境界 - FightPower = 0 #(DWORD FightPower)//战力,机器人读等级表取等级对应战力 + FightPower = 0 #(DWORD FightPower)//战力求余亿部分,机器人读等级表取等级对应战力 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力整除亿部分,机器人读等级表取等级对应战力 + Score = 0 #(DWORD Score)//积分 AddScoreLen = 0 #(BYTE AddScoreLen) AddScore = "" #(String AddScore)//本次对战增加的积分,有正负 IsWin = 0 #(BYTE IsWin)//是否获胜 @@ -2395,6 +2503,8 @@ self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos) self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos) self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Score,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.AddScoreLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) self.AddScore,_pos = CommFunc.ReadString(_lpData, _pos,self.AddScoreLen) self.IsWin,_pos = CommFunc.ReadBYTE(_lpData, _pos) @@ -2408,6 +2518,8 @@ self.LV = 0 self.RealmLV = 0 self.FightPower = 0 + self.FightPowerEx = 0 + self.Score = 0 self.AddScoreLen = 0 self.AddScore = "" self.IsWin = 0 @@ -2421,6 +2533,8 @@ length += 1 length += 2 length += 2 + length += 4 + length += 4 length += 4 length += 1 length += len(self.AddScore) @@ -2437,6 +2551,8 @@ data = CommFunc.WriteWORD(data, self.LV) data = CommFunc.WriteWORD(data, self.RealmLV) data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteDWORD(data, self.Score) data = CommFunc.WriteBYTE(data, self.AddScoreLen) data = CommFunc.WriteString(data, self.AddScoreLen, self.AddScore) data = CommFunc.WriteBYTE(data, self.IsWin) @@ -2451,6 +2567,8 @@ LV:%d, RealmLV:%d, FightPower:%d, + FightPowerEx:%d, + Score:%d, AddScoreLen:%d, AddScore:%s, IsWin:%d, @@ -2463,6 +2581,8 @@ self.LV, self.RealmLV, self.FightPower, + self.FightPowerEx, + self.Score, self.AddScoreLen, self.AddScore, self.IsWin, @@ -2546,7 +2666,8 @@ Job = 0 #(BYTE Job) LV = 0 #(WORD LV)//等级 RealmLV = 0 #(WORD RealmLV)//境界,机器人读境界表取等级对应境界 - FightPower = 0 #(DWORD FightPower)//战力,机器人读等级表取等级对应战力 + FightPower = 0 #(DWORD FightPower)//战力求余亿部分,机器人读等级表取等级对应战力 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力整除亿部分,机器人读等级表取等级对应战力 Score = 0 #(DWORD Score)//积分 data = None @@ -2562,6 +2683,7 @@ self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos) self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos) self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.Score,_pos = CommFunc.ReadDWORD(_lpData, _pos) return _pos @@ -2572,6 +2694,7 @@ self.LV = 0 self.RealmLV = 0 self.FightPower = 0 + self.FightPowerEx = 0 self.Score = 0 return @@ -2582,6 +2705,7 @@ length += 1 length += 2 length += 2 + length += 4 length += 4 length += 4 @@ -2595,6 +2719,7 @@ data = CommFunc.WriteWORD(data, self.LV) data = CommFunc.WriteWORD(data, self.RealmLV) data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) data = CommFunc.WriteDWORD(data, self.Score) return data @@ -2606,6 +2731,7 @@ LV:%d, RealmLV:%d, FightPower:%d, + FightPowerEx:%d, Score:%d '''\ %( @@ -2615,6 +2741,7 @@ self.LV, self.RealmLV, self.FightPower, + self.FightPowerEx, self.Score ) return DumpString diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py index b82040b..0ca959a 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py @@ -25,6 +25,7 @@ import PlayerCompensation import PlayerDBGSEvent import ChPyNetSendPack +import DataRecordPack import NetPackCommon import IpyGameDataPY import PyGameData @@ -102,9 +103,71 @@ def GetArenaBillLV(billData): return billData.GetValue2() def SetArenaBillLV(billData, lv): billData.SetValue2(lv) def GetArenaBillScore(billData): return billData.GetCmpValue() -def GetArenaBillFightPower(billData): return billData.GetCmpValue2() -def SetArenaBillFightPower(billData, fightPower): billData.SetCmpValue2(fightPower) - +def SetArenaBillScore(billData, score): return billData.SetCmpValue(score) +def GetArenaBillFightPower(billData): return billData.GetCmpValue2() * ShareDefine.Def_PerPointValue + billData.GetCmpValue3() +def SetArenaBillFightPower(billData, fightPower): + billData.SetCmpValue2(fightPower / ShareDefine.Def_PerPointValue) + billData.SetCmpValue3(fightPower % ShareDefine.Def_PerPointValue) + return + +def RepairArenaBillboardFightPower(): + ## 修正竞技场榜单的战力数据,支持20亿,bt3_1.100.1 下次大版本更新后可删除 + + repairStateKey = "RepairArenaBillboardFightPower" + repairState = PlayerDBGSEvent.GetDBGSTrig_ByKey(repairStateKey) + if repairState: + GameWorld.DebugLog("=== 已经修正竞技场榜单数据 ===") + return + + GameWorld.Log("=== 修正竞技场榜单数据 Start ===") + + worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaWorldLV, worldLV) + GameWorld.Log(" SetDBGSTrig_ByKey %s=%s" % (PlayerDBGSEvent.Def_ArenaWorldLV, worldLV)) + + robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1) + __RandRobotLVList(robotMaxCount) + GameWorld.Log(" PyGameData.g_arenaRobotLVList len=%s, %s" % (len(PyGameData.g_arenaRobotLVList), PyGameData.g_arenaRobotLVList)) + + billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena) + if not billBoard: + return + + for index in xrange(billBoard.GetCount()): + + order = index + 1 + billBoardData = billBoard.At(index) + if not billBoardData: + continue + + playerID = billBoardData.GetID() + fightPower = billBoardData.GetCmpValue2() # 旧战力只存在比较值2 + + if playerID <= MaxRobotID: + curLV = GetArenaBillLV(billBoardData) + updLV = curLV + if index < len(PyGameData.g_arenaRobotLVList): + updLV = PyGameData.g_arenaRobotLVList[index] + GameWorld.Log(" 修正机器人等级: order=%s,playerID=%s,curLV=%s,updLV=%s" + % (order, playerID, curLV, updLV)) + SetArenaBillLV(billBoardData, updLV) + SetArenaBillFightPower(billBoardData, 0) + continue + + curCache = PlayerViewCache.FindViewCache(playerID) + if curCache: + cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) + fightPower = cacheDict["FightPower"] + + SetArenaBillFightPower(billBoardData, fightPower) + GameWorld.Log(" 修正真玩家战力: order=%s,playerID=%s,fightPower=%s,cmpValue2=%s,cmpValue3=%s" + % (order, playerID, fightPower, billBoardData.GetCmpValue2(), billBoardData.GetCmpValue3())) + + billBoard.Sort() + PlayerDBGSEvent.SetDBGSTrig_ByKey(repairStateKey, 1) + GameWorld.Log("=== 修正竞技场榜单的战力数据 OK ===") + return + def OnServerStart(): universalRecMgr = GameWorld.GetUniversalRecMgr() recDataList = universalRecMgr.GetTypeList(Def_RecType_ArenaBattleRecord) @@ -148,8 +211,11 @@ if billBoard.GetCount() > 0: robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1) PlayerBillboard.UpdateBillboardMaxCount(ShareDefine.Def_BT_Arena, robotMaxCount) + __RandRobotLVList(robotMaxCount) else: __ResetArenaRobotBillboard() + + RepairArenaBillboardFightPower() return def OnServerClose(): @@ -295,6 +361,11 @@ GameWorld.Log(" 重置初始化竞技场机器人榜单! robotMaxCount=%s" % robotMaxCount) PlayerBillboard.UpdateBillboardMaxCount(ShareDefine.Def_BT_Arena, robotMaxCount) + PyGameData.g_arenaRobotLVList = [] + worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaWorldLV, worldLV) + GameWorld.Log(" worldLV=%s" % worldLV) + # 获取机器人随机等级、积分列表 robotLVList = __RandRobotLVList(robotMaxCount) robotScoreList = __RandRobotScoreList(robotMaxCount) @@ -319,8 +390,9 @@ value1 = robotRealmLV value2 = robotLV cmpValue = robotScore - cmpValue2 = robotFightPower - PlayerBillboard.UpdatePlayerBillboard(robotID, robotName, opInfo, ShareDefine.Def_BT_Arena, type2, value1, value2, cmpValue, autoSort=False, cmpValue2=cmpValue2) + cmpValue2 = robotFightPower / ShareDefine.Def_PerPointValue + cmpValue3 = robotFightPower % ShareDefine.Def_PerPointValue + PlayerBillboard.UpdatePlayerBillboard(robotID, robotName, opInfo, ShareDefine.Def_BT_Arena, type2, value1, value2, cmpValue, autoSort=False, cmpValue2=cmpValue2, cmpValue3=cmpValue3) billBoard.Sort() return @@ -370,11 +442,13 @@ lvList[0] = robotMinLV lvList[-1] = robotMaxLV + PyGameData.g_arenaRobotLVList = sorted(lvList, reverse=True) return lvList def __GetRobotLVRange(): ## 获取赛季机器人等级范围 - worldLV = max(1, PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)) + worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaWorldLV) + worldLV = max(1, worldLV) ipyDataMgr = IpyGameDataPY.IPY_Data() maxCnt = ipyDataMgr.GetWorldLVCount() worldLVTime = 0 @@ -721,6 +795,10 @@ SetArenaBillRealmLV(billData, cacheDict["RealmLV"]) SetArenaBillLV(billData, cacheDict["LV"]) SetArenaBillFightPower(billData, cacheDict["FightPower"]) + else: + if matchIndex < len(PyGameData.g_arenaRobotLVList): + robotLV = PyGameData.g_arenaRobotLVList[matchIndex] # 同步更新机器人榜单变化等级 + SetArenaBillLV(billData, robotLV) matchPlayer.tagLV = GetArenaBillLV(billData) matchPlayer.tagJob = GetArenaBillJob(billData) @@ -762,10 +840,16 @@ curCache = PlayerViewCache.FindViewCache(matchInfo.PlayerID) if curCache: cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) + fightPower = cacheDict["FightPower"] + matchInfo.LV = cacheDict["LV"] matchInfo.PlayerName = cacheDict["Name"] matchInfo.RealmLV = cacheDict["RealmLV"] - matchInfo.FightPower = cacheDict["FightPower"] - + matchInfo.FightPower = fightPower % ShareDefine.Def_PerPointValue + matchInfo.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue + else: + # 此处机器人的暂忽略等级变化的同步,仅在刷新、更新积分时同步,此处省略查询机器人所属榜单排名 + pass + clientPack.MatchList.append(matchInfo) clientPack.MatchCount = len(clientPack.MatchList) NetPackCommon.SendFakePack(curPlayer, clientPack) @@ -777,6 +861,7 @@ retDict = {} retDict.update(cmdDict) + accID = curPlayer.GetAccID() playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("竞技场玩家战斗结果: %s" % str(cmdDict), playerID) @@ -801,6 +886,7 @@ curScore = playerScore isFindTag = False tagLV, tagJob, tagScore = 0, 0, 0 + tagRealmLV, tagFightPower, tagAccID = 0, 0, "" # 机器人无值 # 先找匹配列表 matchList = PyGameData.g_arenaPlayerMatchDict.get(playerID, []) @@ -849,11 +935,12 @@ # 结算自己 addScore = __CalcBattleAddScore(playerID, curScore, tagScore, isWin) updScore = max(0, playerScore + addScore) - GameWorld.DebugLog(" 更新自身积分: addScore=%s,updScore=%s" % (addScore, updScore), playerID) curOrder = billBoard.IndexOfByID(playerID) + 1 # 更新前获取名次 + cmpValue2 = fightPower / ShareDefine.Def_PerPointValue + cmpValue3 = fightPower % ShareDefine.Def_PerPointValue PlayerBillboard.UpdatePlayerBillboard(playerID, playerName, opInfo, ShareDefine.Def_BT_Arena, playerJob, - realmLV, playerLV, updScore, autoSort=False, cmpValue2=fightPower) + realmLV, playerLV, updScore, autoSort=False, cmpValue2=cmpValue2, cmpValue3=cmpValue3) awardItemList = [] if isWin: @@ -865,30 +952,48 @@ if isWorldNotify: PlayerControl.WorldNotify(0, "ArenaWinerItem", [curPlayer.GetName(), awardItemInfo[0], "", awardItemInfo[1]]) + tagAddScore = __CalcBattleAddScore(tagPlayerID, tagScore, curScore, not isWin) + updTagScore = max(0, tagScore + tagAddScore) # 结算对手,仅玩家时结算,机器人不处理 if tagPlayerID > MaxRobotID: - tagAddScore = __CalcBattleAddScore(tagPlayerID, tagScore, curScore, not isWin) - updTagScore = max(0, tagScore + tagAddScore) - GameWorld.DebugLog(" 更新对手积分: tagAddScore=%s,updTagScore=%s" % (tagAddScore, updTagScore), playerID) tagCache = PlayerViewCache.FindViewCache(tagPlayerID) if tagCache: cacheDict = PlayerViewCache.GetCachePropDataDict(tagCache) tagOpInfo = "" + tagLV = cacheDict["LV"] tagPlayerName = cacheDict["Name"] tagRealmLV = cacheDict["RealmLV"] tagFightPower = cacheDict["FightPower"] + tagAccID = cacheDict["AccID"] + tagCmpValue2 = tagFightPower / ShareDefine.Def_PerPointValue + tagCmpValue3 = tagFightPower % ShareDefine.Def_PerPointValue PlayerBillboard.UpdatePlayerBillboard(tagPlayerID, tagPlayerName, tagOpInfo, ShareDefine.Def_BT_Arena, tagJob, - tagRealmLV, tagLV, updTagScore, autoSort=False, cmpValue2=tagFightPower) + tagRealmLV, tagLV, updTagScore, autoSort=False, cmpValue2=tagCmpValue2, cmpValue3=tagCmpValue3) else: - updTagScore = tagScore - GameWorld.DebugLog(" 机器人对手,积分不变!updTagScore=%s" % updTagScore, playerID) - + robotBillboardData = billBoard.FindByID(tagPlayerID) + if robotBillboardData: + SetArenaBillScore(robotBillboardData, updTagScore) + # 都更新完后排序一次 billBoard.Sort() updOrder = billBoard.IndexOfByID(playerID) + 1 # 取最新名次 + GameWorld.DebugLog(" 更新自身积分: addScore=%s,updScore=%s,curOrder=%s,updOrder=%s" % (addScore, updScore, curOrder, updOrder), playerID) + GameWorld.DebugLog(" 更新对手积分: tagPlayerID=%s,tagAddScore=%s,updTagScore=%s" % (tagPlayerID, tagAddScore, updTagScore), playerID) retDict.update({"addScore":addScore, "updScore":updScore, "curOrder":curOrder, "updOrder":updOrder, "awardItemList":awardItemList, "isOK":True}) + if tagPlayerID <= MaxRobotID: + tagUpdOrder = billBoard.IndexOfByID(tagPlayerID) + 1 # 取最新名次 + tagOrderIndex = tagUpdOrder - 1 + if tagUpdOrder >= 1 and tagOrderIndex < len(PyGameData.g_arenaRobotLVList) and tagOrderIndex < billBoard.GetCount(): + GameWorld.DebugLog(" PyGameData.g_arenaRobotLVList=%s" % PyGameData.g_arenaRobotLVList, playerID) + updRobotLV = PyGameData.g_arenaRobotLVList[tagOrderIndex] + robotBillboardData = billBoard.At(tagOrderIndex) + SetArenaBillLV(robotBillboardData, updRobotLV) + GameWorld.DebugLog(" 机器人在榜上,更新等级信息! tagPlayerID=%s,tagUpdOrder=%s,updRobotLV=%s" % (tagPlayerID, tagUpdOrder, updRobotLV), playerID) + else: + GameWorld.DebugLog(" 机器人不在榜上,不更新等级信息! tagPlayerID=%s" % tagPlayerID, playerID) + battleRecMaxCount = min(MaxBattleRecCount, IpyGameDataPY.GetFuncCfg("ArenaSet", 4)) # 插入对战记录 @@ -934,6 +1039,11 @@ # 对战结束,最后免费刷新一次匹配列表 __DoArenaMatchRefresh(curPlayer, True, playerLV, updScore) + + drDict = {"AccID":accID, "PlayerID":playerID, "playerLV":playerLV, "realmLV":realmLV, "fightPower":fightPower, "curScore":[curScore, addScore, updScore], + "TagAccID":tagAccID, "TagPlayerID":tagPlayerID, "tagLV":tagLV, "tagRealmLV":tagRealmLV, "tagFightPower":tagFightPower, + "tagScore":[tagScore, tagAddScore, updTagScore], "isWin":isWin} + DataRecordPack.SendEventPack("ArenaBattleResult", drDict) return retDict def __SyncPlayerBechallengedUpdScore(curPlayer, updScore): @@ -997,6 +1107,7 @@ recInfo.PlayerID = battleRec.tagPlayerID recInfo.Job = battleRec.tagJob recInfo.LV = battleRec.tagLV + recInfo.Score = battleRec.tagScore recInfo.AddScore = str(battleRec.addScore) recInfo.AddScoreLen = len(recInfo.AddScore) recInfo.IsWin = battleRec.isWin @@ -1006,9 +1117,12 @@ curCache = PlayerViewCache.FindViewCache(recInfo.PlayerID) if curCache: cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) + fightPower = cacheDict["FightPower"] + recInfo.LV = cacheDict["LV"] recInfo.PlayerName = cacheDict["Name"] recInfo.RealmLV = cacheDict["RealmLV"] - recInfo.FightPower = cacheDict["FightPower"] + recInfo.FightPower = fightPower % ShareDefine.Def_PerPointValue + recInfo.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue clientPack.BattleRecordList.append(recInfo) @@ -1016,7 +1130,41 @@ NetPackCommon.SendFakePack(curPlayer, clientPack) return - - - - +#// A9 A5 查看竞技场对战玩家最新信息 #tagCGQueryArenaBattlePlayer +# +#struct tagCGQueryArenaBattlePlayer +#{ +# tagHead Head; +# DWORD PlayerID; //目标玩家ID,仅支持查真实玩家 +#}; +def OnQueryArenaBattlePlayer(index, clientData, tick): + + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + if not curPlayer: + return + + tagPlayerID = clientData.PlayerID + tagBattleRecList = GetPlayerArenaBattleRecList(tagPlayerID) + if not tagBattleRecList: + GameWorld.ErrLog("竞技场玩家无对战记录,无法查询最新数据! tagPlayerID=%s" % tagPlayerID, curPlayer.GetPlayerID()) + return + tagBattleRec = tagBattleRecList[-1] # 取最后一条为最新数据 + tagScore = tagBattleRec.updScore + + clientPack = ChPyNetSendPack.tagGCArenaBattlePlayerInfo() + clientPack.PlayerID = tagPlayerID + clientPack.Score = tagScore + + curCache = PlayerViewCache.FindViewCache(tagPlayerID) + if curCache: + cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) + fightPower = cacheDict["FightPower"] + clientPack.LV = cacheDict["LV"] + clientPack.Job = cacheDict["Job"] + clientPack.PlayerName = cacheDict["Name"] + clientPack.RealmLV = cacheDict["RealmLV"] + clientPack.FightPower = fightPower % ShareDefine.Def_PerPointValue + clientPack.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue + + NetPackCommon.SendFakePack(curPlayer, clientPack) + return diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py index 570b37d..d9ed3f2 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py @@ -87,6 +87,7 @@ g_arenaPlayerBattleRecDict = {} # 本服竞技场玩家挑战记录缓存 {playerID:[ArenaBattleRec, ...], ...} g_arenaPlayerMatchDict = {} # 本服竞技场玩家匹配记录缓存 {playerID:[ArenaMatchPlayer, ...], ...} +g_arenaRobotLVList = [] # 本服竞技场机器人等级列表 g_autoViceleaderDict = {}#自动安排副盟主的玩家记录{familyID:[]} g_forbidAutoViceleaderFamily = [] #禁止自动安排副盟主的仙盟[familyID,..] diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py index 68ec094..b8a55ae 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py @@ -1304,6 +1304,58 @@ #------------------------------------------------------ +# A9 A5 查看竞技场对战玩家最新信息 #tagCGQueryArenaBattlePlayer + +class tagCGQueryArenaBattlePlayer(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("PlayerID", c_int), #目标玩家ID,仅支持查真实玩家 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA9 + self.SubCmd = 0xA5 + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.Cmd = 0xA9 + self.SubCmd = 0xA5 + self.PlayerID = 0 + return + + def GetLength(self): + return sizeof(tagCGQueryArenaBattlePlayer) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A9 A5 查看竞技场对战玩家最新信息 //tagCGQueryArenaBattlePlayer: + Cmd:%s, + SubCmd:%s, + PlayerID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.PlayerID + ) + return DumpString + + +m_NAtagCGQueryArenaBattlePlayer=tagCGQueryArenaBattlePlayer() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGQueryArenaBattlePlayer.Cmd,m_NAtagCGQueryArenaBattlePlayer.SubCmd))] = m_NAtagCGQueryArenaBattlePlayer + + +#------------------------------------------------------ # A9 A8 查看竞技场对战记录 #tagCGQueryArenaBattleRecord class tagCGQueryArenaBattleRecord(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index 76b41e7..72b4c21 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -2368,6 +2368,112 @@ #------------------------------------------------------ +# A9 26 竞技场对战玩家最新信息 #tagGCArenaBattlePlayerInfo + +class tagGCArenaBattlePlayerInfo(Structure): + Head = tagHead() + PlayerID = 0 #(DWORD PlayerID)//目标玩家ID + PlayerName = "" #(char PlayerName[33]) + Job = 0 #(BYTE Job) + LV = 0 #(WORD LV)//等级 + RealmLV = 0 #(WORD RealmLV)//境界,机器人读境界表取等级对应境界 + FightPower = 0 #(DWORD FightPower)//战力求余亿部分,机器人读等级表取等级对应战力 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力整除亿部分,机器人读等级表取等级对应战力 + Score = 0 #(DWORD Score)//积分 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA9 + self.Head.SubCmd = 0x26 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Score,_pos = CommFunc.ReadDWORD(_lpData, _pos) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA9 + self.Head.SubCmd = 0x26 + self.PlayerID = 0 + self.PlayerName = "" + self.Job = 0 + self.LV = 0 + self.RealmLV = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.Score = 0 + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 33 + length += 1 + length += 2 + length += 2 + length += 4 + length += 4 + length += 4 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteString(data, 33, self.PlayerName) + data = CommFunc.WriteBYTE(data, self.Job) + data = CommFunc.WriteWORD(data, self.LV) + data = CommFunc.WriteWORD(data, self.RealmLV) + data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteDWORD(data, self.Score) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + PlayerID:%d, + PlayerName:%s, + Job:%d, + LV:%d, + RealmLV:%d, + FightPower:%d, + FightPowerEx:%d, + Score:%d + '''\ + %( + self.Head.OutputString(), + self.PlayerID, + self.PlayerName, + self.Job, + self.LV, + self.RealmLV, + self.FightPower, + self.FightPowerEx, + self.Score + ) + return DumpString + + +m_NAtagGCArenaBattlePlayerInfo=tagGCArenaBattlePlayerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCArenaBattlePlayerInfo.Head.Cmd,m_NAtagGCArenaBattlePlayerInfo.Head.SubCmd))] = m_NAtagGCArenaBattlePlayerInfo + + +#------------------------------------------------------ # A9 23 竞技场对战记录列表 #tagGCArenaBattleRecordList class tagGCArenaBattleRecord(Structure): @@ -2376,7 +2482,9 @@ Job = 0 #(BYTE Job) LV = 0 #(WORD LV)//等级 RealmLV = 0 #(WORD RealmLV)//境界,机器人读境界表取等级对应境界 - FightPower = 0 #(DWORD FightPower)//战力,机器人读等级表取等级对应战力 + FightPower = 0 #(DWORD FightPower)//战力求余亿部分,机器人读等级表取等级对应战力 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力整除亿部分,机器人读等级表取等级对应战力 + Score = 0 #(DWORD Score)//积分 AddScoreLen = 0 #(BYTE AddScoreLen) AddScore = "" #(String AddScore)//本次对战增加的积分,有正负 IsWin = 0 #(BYTE IsWin)//是否获胜 @@ -2395,6 +2503,8 @@ self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos) self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos) self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Score,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.AddScoreLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) self.AddScore,_pos = CommFunc.ReadString(_lpData, _pos,self.AddScoreLen) self.IsWin,_pos = CommFunc.ReadBYTE(_lpData, _pos) @@ -2408,6 +2518,8 @@ self.LV = 0 self.RealmLV = 0 self.FightPower = 0 + self.FightPowerEx = 0 + self.Score = 0 self.AddScoreLen = 0 self.AddScore = "" self.IsWin = 0 @@ -2421,6 +2533,8 @@ length += 1 length += 2 length += 2 + length += 4 + length += 4 length += 4 length += 1 length += len(self.AddScore) @@ -2437,6 +2551,8 @@ data = CommFunc.WriteWORD(data, self.LV) data = CommFunc.WriteWORD(data, self.RealmLV) data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteDWORD(data, self.Score) data = CommFunc.WriteBYTE(data, self.AddScoreLen) data = CommFunc.WriteString(data, self.AddScoreLen, self.AddScore) data = CommFunc.WriteBYTE(data, self.IsWin) @@ -2451,6 +2567,8 @@ LV:%d, RealmLV:%d, FightPower:%d, + FightPowerEx:%d, + Score:%d, AddScoreLen:%d, AddScore:%s, IsWin:%d, @@ -2463,6 +2581,8 @@ self.LV, self.RealmLV, self.FightPower, + self.FightPowerEx, + self.Score, self.AddScoreLen, self.AddScore, self.IsWin, @@ -2546,7 +2666,8 @@ Job = 0 #(BYTE Job) LV = 0 #(WORD LV)//等级 RealmLV = 0 #(WORD RealmLV)//境界,机器人读境界表取等级对应境界 - FightPower = 0 #(DWORD FightPower)//战力,机器人读等级表取等级对应战力 + FightPower = 0 #(DWORD FightPower)//战力求余亿部分,机器人读等级表取等级对应战力 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力整除亿部分,机器人读等级表取等级对应战力 Score = 0 #(DWORD Score)//积分 data = None @@ -2562,6 +2683,7 @@ self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos) self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos) self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.Score,_pos = CommFunc.ReadDWORD(_lpData, _pos) return _pos @@ -2572,6 +2694,7 @@ self.LV = 0 self.RealmLV = 0 self.FightPower = 0 + self.FightPowerEx = 0 self.Score = 0 return @@ -2582,6 +2705,7 @@ length += 1 length += 2 length += 2 + length += 4 length += 4 length += 4 @@ -2595,6 +2719,7 @@ data = CommFunc.WriteWORD(data, self.LV) data = CommFunc.WriteWORD(data, self.RealmLV) data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) data = CommFunc.WriteDWORD(data, self.Score) return data @@ -2606,6 +2731,7 @@ LV:%d, RealmLV:%d, FightPower:%d, + FightPowerEx:%d, Score:%d '''\ %( @@ -2615,6 +2741,7 @@ self.LV, self.RealmLV, self.FightPower, + self.FightPowerEx, self.Score ) return DumpString diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py index c79ec5d..5c2f92c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py @@ -247,7 +247,7 @@ playerLV = curPlayer.GetLV() playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) msgInfo = str(["BattleResult", {"tagPlayerID":tagPlayerID, "isWin":isWin, "playerLV":playerLV, "playerScore":playerScore, - "realmLV":curPlayer.GetOfficialRank(), "fightPower":curPlayer.GetFightPower()}]) + "realmLV":curPlayer.GetOfficialRank(), "fightPower":PlayerControl.GetFightPower(curPlayer)}]) GameWorld.DebugLog("竞技场发送GameServer结算: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "Arena", msgInfo, len(msgInfo)) return -- Gitblit v1.8.0