ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
@@ -147,6 +147,17 @@ PacketSubCMD_1=0xA2 PacketCallFunc_1=Client_PYWatchBillboard ;竞技场 [GameWorldArena] ScriptName = GameWorldLogic\GameWorldArena.py Writer = hxp Releaser = hxp RegType = 0 RegisterPackCount = 1 PacketCMD_1=0xA9 PacketSubCMD_1=0xA8 PacketCallFunc_1=OnQueryArenaBattleRecord ;镖车 [PlayerTruck.py] ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -588,6 +588,8 @@ ShareDefine.Def_BT_Campaign_Wash : 100, #洗练战力(开服活动榜) ShareDefine.Def_BT_FCCostGold : 5, #消费排行榜(仙界盛典) ShareDefine.Def_BT_NewFCCostGold : 5, #消费排行榜(仙界盛典) ShareDefine.Def_BT_Arena : 1000, #竞技场榜 } #排行榜保存类型(和BillboardType匹配), 默认保存, 如果不保存,可配置进去 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py
@@ -13,11 +13,9 @@ # # @change: "2012-07-20 19:00" whx 世界等级和开服天书有关,也要清除 # @change: "2013-12-06 15:00" hxp 增加通知MapServer开服天数 # @change: "2014-11-27 16:30" hxp 增加开服活动数据重置相关; 增加清除竞技场数据 # @change: "2014-12-02 11:30" hxp 增加合服状态及天数;强制刷新全服活动 # @change: "2014-12-03 14:30" hxp 增加合服活动重置 # @change: "2015-01-21 16:00" hxp 增加重置合服寻宝活动 # @change: "2015-06-16 15:00" hxp 屏蔽清除竞技场数据; 玩家允许None # #------------------------------------------------------------------------------ #"""Version = 2015-06-16 15:00""" @@ -29,6 +27,7 @@ import PlayerBillboard import PlayerUniversalGameRec import GameWorldProcess import GameWorldArena import GameWorldBoss import GMCommon @@ -83,6 +82,10 @@ # 广播分流boss状态 GameWorldBoss.Sync_BossShuntLineInfo() # 竞技场重置 PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState, 0) GameWorldArena.__DoArenaSeasonReset("GMReset") if curPlayer: PlayerEventCounter.Sync_OpenServerDay(curPlayer) GameWorld.DebugAnswer(curPlayer, '开服星期%s, 天数:%s 是否合服:%s, 合服天数:%s'%\ ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -15,7 +15,6 @@ # @change: "2013-03-20 18:00" Alee 添加DEBUG输出函数DebugLog # @change: "2013-09-10 20:10" Alee 函数DebugLog改用GetDebugLevel才有效 # @change: "2014-05-16 10:30" xmnathan 增加交易所管理器接口 # @change: "2014-08-01 15:30" xmnathan 增加天梯竞技场管理器接口 # @change: "2014-09-22 10:00" xmnathan 增加GM工具补偿管理器接口 # @change: "2015-01-14 00:30" hxp 增加服务器平台区服ID获取 # @change: "2015-01-14 20:30" hxp 增加CanHappen函数 @@ -916,8 +915,9 @@ # @param itemList 待选列表 # @return object def GetResultByRandomList(randList, defValue=None, maxRateValue=ChConfig.Def_MaxRateValue): rate = random.randint(0, maxRateValue) if not randList: return defValue rate = random.randint(0, randList[-1][0]) return GetResultByRiseList(randList, rate, defValue) ## 增长列表(类似饼图)从中获得指定的信息 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py
New file @@ -0,0 +1,986 @@ #!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldArena # # @todo:竞技场 - 本服 # @author hxp # @date 2020-12-07 # @version 1.0 # # 详细描述: 竞技场 - 本服,OnWeekEx 重置,开服前X定制天内固定为一个赛季,合服不处理 # # #------------------------------------------------------------------------------- #"""Version = 2020-12-07 19:30""" #------------------------------------------------------------------------------- import GameWorld import ShareDefine import PlayerControl import FormulaControl import PlayerBillboard import PlayerViewCache import PlayerCompensation import PlayerDBGSEvent import ChPyNetSendPack import NetPackCommon import IpyGameDataPY import PyGameData import random import time import json MaxRobotID = 9900 # 最大机器人ID,不超过 9999 RandRobotID = 9000 # 预留给随机机器人用的起始ID,不超过 MaxRobotID,且 (MaxRobotID - RandRobotID) 不能超过 MaxBattleRecCount MaxBattleRecCount = 50 # 玩家最大对战记录保存条数 Def_RecType_ArenaBattleRecord = ShareDefine.Def_UniversalGameRecType_ArenaBattleRecord ## 竞技场匹配玩家信息,仅做内存缓存,不做持久化存储,重启服务器时效,相当于维护服务器后玩家可免费刷新一次 class ArenaMatchPlayer(): def __init__(self): # name、RealmLV、FightPower 不记录,真实玩家读查看缓存,机器人前端自行处理 # RealmLV 读境界表按等级取对应境界 # FightPower 取等级表取对应参考战力 self.ResetData() return def ResetData(self): # 刷新匹配的时候需要重置下,不重复创建实例 self.tagPlayerID = 0 # 小于10000的为机器人ID self.tagLV = 0 self.tagJob = 0 self.tagScore = 0 return class ArenaBattleRec(): ''' 竞技场对战记录数据 额外说明: 因为有主动对战的才会上榜,而只有对战过的的才会被匹配到,所以可认为只要有对战记录,最后一条记录即为最新的数据记录 因此可以用来存储自身相关的数据,可用于离线被别人匹配到时暂存数据用,上线后取最后一条对战记录更新数据 ''' def __init__(self, playerID): self.playerID = playerID # name、RealmLV、FightPower 不记录,真实玩家读查看缓存,机器人前端自行处理 # RealmLV 读境界表按等级取对应境界 # FightPower 取等级表取对应参考战力 self.tagPlayerID = 0 # 小于10000的为机器人ID self.tagLV = 0 self.tagJob = 0 self.tagScore = 0 self.addScore = 0 self.isWin = 0 self.battleTime = 0 # 额外存储的个人记录 self.isDispose = 0 # 是否已经处理过该记录,离线/脱机被挑战时,暂时为未处理,上线后同步处理 self.updScore = 0 return ''' 对战记录 ShareDefine.Def_UniversalGameRecType_ArenaBattleRecord value1 playerID 玩家ID value2 tagPlayerID 目标玩家ID,小于10000为机器人 value3 tagLVJob 目标等级职业,一般机器人时有用 lv*10 + job value4 tagScore 目标积分,非实时积分,一般机器人时有用 strValue1 resultInfo isWin,addScore strValue2 updInfo isDispose,updScore ''' ''' 榜单数据 ''' def GetArenaBillID(billData): return billData.GetID() def GetArenaBillName(billData): return billData.GetName1() def SetArenaBillName(billData, name): return billData.SetName1(name) def GetArenaBillJob(billData): return billData.GetType2() def GetArenaBillRealmLV(billData): return billData.GetValue1() def SetArenaBillRealmLV(billData, realmLV): return billData.SetValue1(realmLV) 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 OnServerStart(): universalRecMgr = GameWorld.GetUniversalRecMgr() recDataList = universalRecMgr.GetTypeList(Def_RecType_ArenaBattleRecord) GameWorld.Log("开服加载本服竞技场对战记录! %s" % recDataList.Count()) for index in xrange(recDataList.Count()): recData = recDataList.At(index) playerID = recData.GetValue1() battleRec = ArenaBattleRec(playerID) battleRec.battleTime = recData.GetTime() battleRec.tagPlayerID = recData.GetValue2() battleRec.tagLV = recData.GetValue3() / 10 battleRec.tagJob = recData.GetValue3() % 10 battleRec.tagScore = recData.GetValue4() strValue1 = recData.GetStrValue1() resultInfo = strValue1.split(",") if strValue1 else [] battleRec.isWin = int(resultInfo[0] if len(resultInfo) > 0 else 0) battleRec.addScore = int(resultInfo[1] if len(resultInfo) > 1 else 0) strValue2 = recData.GetStrValue2() updInfo = strValue2.split(",") if strValue2 else [] battleRec.isDispose = int(updInfo[0] if len(updInfo) > 0 else 0) battleRec.updScore = int(updInfo[1] if len(updInfo) > 1 else 0) battleRecList = GetPlayerArenaBattleRecList(playerID) battleRecList.append(battleRec) GameWorld.DebugLog(" 加载玩家对战记录: playerID=%s, |%s| %s" % (playerID, strValue1, json.dumps(battleRec , default=lambda obj:obj.__dict__))) OSSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState) if not OSSeasonState and __DoArenaSeasonReset("OnServerStart"): pass # 没有重置 或 重置失败 才处理以下内容 else: billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena) if billBoard: # 有数据的话设置本功能配置的最大榜单数 if billBoard.GetCount() > 0: robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1) PlayerBillboard.UpdateBillboardMaxCount(ShareDefine.Def_BT_Arena, robotMaxCount) else: __ResetArenaRobotBillboard() return def OnServerClose(): universalRecMgr = GameWorld.GetUniversalRecMgr() universalRecMgr.Delete(Def_RecType_ArenaBattleRecord) GameWorld.Log("关服保存本服竞技场记录! %s" % len(PyGameData.g_arenaPlayerBattleRecDict)) recDataList = universalRecMgr.GetTypeList(Def_RecType_ArenaBattleRecord) for battleRecList in PyGameData.g_arenaPlayerBattleRecDict.values(): for battleRec in battleRecList: recData = recDataList.AddRec() recData.SetTime(battleRec.battleTime) recData.SetValue1(battleRec.playerID) recData.SetValue2(battleRec.tagPlayerID) recData.SetValue3(battleRec.tagLV * 10 + battleRec.tagJob) recData.SetValue4(battleRec.tagScore) recData.SetStrValue1("%s,%s" % (int(battleRec.isWin), battleRec.addScore)) recData.SetStrValue2("%s,%s" % (int(battleRec.isDispose), battleRec.updScore)) return def GetPlayerArenaBattleRecList(playerID): ## 获取玩家对战记录列表 if playerID not in PyGameData.g_arenaPlayerBattleRecDict: PyGameData.g_arenaPlayerBattleRecDict[playerID] = [] return PyGameData.g_arenaPlayerBattleRecDict[playerID] def IsArenaBattlePlayer(playerID): return playerID in PyGameData.g_arenaPlayerBattleRecDict def SendMapServerArenaInfo(): ## 通知地图信息 return def OnPlayerLogin(curPlayer): ## 玩家登录 if PlayerControl.GetIsTJG(curPlayer): return playerID = curPlayer.GetPlayerID() curBattleRecList = GetPlayerArenaBattleRecList(playerID) updScore = None # 倒序遍历 for battleRec in curBattleRecList[::-1]: if battleRec.isDispose: continue battleRec.isDispose = 1 if updScore == None: updScore = battleRec.updScore # 只更新一次,即最后一条记录 if updScore != None: __SyncPlayerBechallengedUpdScore(curPlayer, updScore) return def OnDayEx(): # 先处理每日结算 __DoGiveBillboardAward("Day") customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 if openServerDay <= customMaxServerDay: GameWorld.Log("OnDayEx时竞技场开服定制赛季进行中,不处理! openServerDay=%s <= %s" % (openServerDay, customMaxServerDay)) return # 竞技场开服前定制X天赛季状态 0-未比赛过,1-进行中,>1结算时的开服天 OSSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState) if OSSeasonState > 1: GameWorld.Log("OnDayEx时竞技场开服定制赛季已结算过,不处理! OSSeasonState=%s" % (OSSeasonState)) return __DoArenaSeasonReset("OpenServerSeason") return def OnWeekEx(): customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 if openServerDay <= customMaxServerDay: GameWorld.Log("OnWeekEx时在开服定制天内,不处理竞技场赛季重置! openServerDay=%s <= %s" % (openServerDay, customMaxServerDay)) return OSSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState) if not OSSeasonState or OSSeasonState == 1 or OSSeasonState == openServerDay: GameWorld.Log("OnWeekEx时竞技场开服定制赛季进行中或同一天结算,不处理重置! openServerDay=%s,OSSeasonState=%s" % (openServerDay, OSSeasonState)) return __DoArenaSeasonReset("OnWeekExSeason") return def __DoArenaSeasonReset(resetName): ''' 赛季重置 赛季规则:前定制运营最大开服天为一个赛季,后续按 OnWeekEx 重置 ''' openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 OSSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState) worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) GameWorld.Log("重置竞技场! resetName=%s,openServerDay=%s,OSSeasonState=%s,worldLV=%s" % (resetName, openServerDay, OSSeasonState, worldLV)) customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) if openServerDay <= customMaxServerDay and OSSeasonState != 0: GameWorld.Log("开服定制天内不能重置!") return # 结算上赛季排行奖励 __DoGiveBillboardAward("Week") # 重置排行榜 __ResetArenaRobotBillboard() # 删除对战记录 GameWorld.GetUniversalRecMgr().Delete(Def_RecType_ArenaBattleRecord) PyGameData.g_arenaPlayerBattleRecDict = {} # 更新新赛季信息 if openServerDay <= customMaxServerDay and OSSeasonState == 0: PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState, 1) else: PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState, customMaxServerDay + 1) # 最后通知地图新赛季信息 SendMapServerArenaInfo() GameWorld.Log("=============== 重置竞技场OK ===============") return True def __ResetArenaRobotBillboard(): ## 重置竞技场机器人排行榜,赛季重置时 或 启动服务器时榜单数据为空(合服首次启动) # 清除榜单 billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena) if not billBoard: return billBoard.Clear() robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1) GameWorld.Log(" 重置初始化竞技场机器人榜单! robotMaxCount=%s" % robotMaxCount) PlayerBillboard.UpdateBillboardMaxCount(ShareDefine.Def_BT_Arena, robotMaxCount) # 获取机器人随机等级、积分列表 robotLVList = __RandRobotLVList(robotMaxCount) robotScoreList = __RandRobotScoreList(robotMaxCount) GameWorld.Log(" robotLVList: %s, %s" % (len(robotLVList), robotLVList)) GameWorld.Log(" robotScoreList: %s, %s" % (len(robotScoreList), robotScoreList)) openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1) # 机器人插入榜单,倒序插入,不用排序 robotID = 0 for i in xrange(robotMaxCount - 1, -1, -1): robotLV = robotLVList[i] robotScore = robotScoreList[i] robotID += 1 robotName = "" # 固定,前端自行显示 opInfo = "" robotJob = random.choice(openJobList) # 随机开放的职业 robotRealmLV = 0 # 前端 读境界表取等级对应境界 robotFightPower = 0 # 前端 读等级表取等级对应战力 type2 = robotJob 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) billBoard.Sort() return def __RandRobotLVList(robotMaxCount): ''' 随机机器人等级 @param robotMaxCount: 机器人数量 @return: 升序排好的机器人等级列表 ''' robotMinLV, robotMaxLV = __GetRobotLVRange() # 难度等级步长,为了难度递增时,等级看起来乱一点,又能确保难度递增,所以加入此概念 difficultLVStep = IpyGameDataPY.GetFuncCfg("ArenaRobot", 4) lvList = [] lvCount = robotMaxLV - robotMinLV + 1 # 等级差值数量 lvAvg = lvCount / float(robotMaxCount) # 人均等级 oneLVRobotCount = 1 / lvAvg # 1个等级理论上有几个机器人 minLV = 0 difficultRobotCountEx = 0 for lv in xrange(robotMinLV, robotMaxLV + difficultLVStep, difficultLVStep): if lv >= robotMaxLV: break if minLV == 0: minLV = lv maxLV = lv + difficultLVStep - 1 difficultRobotCount = oneLVRobotCount * difficultLVStep + difficultRobotCountEx # 同个难度等级机器人总数 difficultRobotCountEx = difficultRobotCount % 1 if difficultRobotCount < 1: continue for _ in xrange(int(difficultRobotCount)): lvList.append(random.randint(minLV, maxLV)) minLV = 0 if len(lvList) > robotMaxCount: lvList = lvList[:robotMaxCount] else: # 如果还不够,直接用最后一个难度补足人数 while len(lvList) < robotMaxCount: lvList.append(random.randint(robotMaxLV - difficultLVStep, robotMaxLV)) lvList[0] = robotMinLV lvList[-1] = robotMaxLV return lvList def __GetRobotLVRange(): ## 获取赛季机器人等级范围 worldLV = max(1, PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)) ipyDataMgr = IpyGameDataPY.IPY_Data() maxCnt = ipyDataMgr.GetWorldLVCount() worldLVTime = 0 if worldLV <= maxCnt: worldLVIpyData = ipyDataMgr.GetWorldLVByIndex(worldLV - 1) worldLVTime = worldLVIpyData.GetOpenServerSecond() minLV, maxLV = IpyGameDataPY.GetFuncEvalCfg("ArenaRobot", 2) # 机器人最小、最大等级 robotMaxLV = minLV maxWorldLVTime = eval(IpyGameDataPY.GetFuncCfg("ArenaRobot", 3)) for i in xrange(worldLV - 1, maxCnt): ipyData = ipyDataMgr.GetWorldLVByIndex(i) if i == maxCnt - 1: robotMaxLV = ipyData.GetWorldLV() else: nextIpyData = IpyGameDataPY.IPY_Data().GetWorldLVByIndex(i + 1) if ipyData.GetOpenServerSecond() <= maxWorldLVTime < nextIpyData.GetOpenServerSecond(): robotMaxLV = ipyData.GetWorldLV() break robotMaxLV = max(minLV, min(maxLV, robotMaxLV)) GameWorld.Log(" 机器人等级范围: worldLV=%s,worldLVTime=%s,maxWorldLVTime=%s,minLV=%s,robotMaxLV=%s" % (worldLV, worldLVTime, maxWorldLVTime, minLV, robotMaxLV)) return minLV, robotMaxLV def __RandRobotScoreList(robotMaxCount): ''' 随机机器人积分 @param minScore: 机器人最小积分 @param maxScore: 机器人最大积分 @param robotMaxCount: 机器人数量 @return: 升序排好的机器人积分列表 ''' minScore, maxScore = IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 1) scoreCount = maxScore - minScore + 1 # 积分差值数量 scoreAvg = scoreCount / float(robotMaxCount) # 人均积分 oneScoreRobotCount = 1 / scoreAvg # 1个积分理论上有几个机器人 scoreList = [] minS = 0 robotCountEx = 0 for score in xrange(minScore, maxScore + 1): if minS == 0: minS = score robotCount = oneScoreRobotCount * 1 + robotCountEx robotCountEx = robotCount % 1 if robotCount < 1: continue for _ in xrange(int(robotCount)): if minS == score: scoreList.append(score) else: scoreList.append(random.randint(minS, score)) minS = 0 if len(scoreList) > robotMaxCount: scoreList = scoreList[:robotMaxCount] else: # 如果还不够,直接用最后一个难度补足人数 while len(scoreList) < robotMaxCount: scoreList.append(maxScore) scoreList[0] = minScore scoreList[-1] = maxScore scoreList.sort() return scoreList def __DoGiveBillboardAward(awardType): ## 竞技场结算排行奖励, 每日、赛季通用 GameWorld.Log("=== 竞技场结算排行奖励! === %s" % awardType) billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena) if not billBoard: return if awardType == "Day": billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 1, {}) floorAwardList = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 2) elif awardType == "Week": billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 3, {}) floorAwardList = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 4) else: return orderList = [] for orderStr in billboradAwardDict.keys(): orderList.append(int(orderStr)) orderList.sort() GameWorld.Log(" 奖励名次列表: %s" % orderList) awardOrder = orderList[0] orderPlayerIDDict = {} billboardCount, billboardMaxCount = billBoard.GetCount(), billBoard.GetMaxCount() GameWorld.Log(" 榜单数据数! billboardCount=%s,billboardMaxCount=%s" % (billboardCount, billboardMaxCount)) for index in xrange(billboardCount): billBoardData = billBoard.At(index) if not billBoardData: continue order = index + 1 if order > awardOrder: nextOrderIndex = orderList.index(awardOrder) + 1 if nextOrderIndex >= len(orderList): break awardOrder = orderList[nextOrderIndex] playerID = billBoardData.GetID() if playerID <= MaxRobotID: # 机器人不处理 continue #playerName = billBoardData.GetName1() orderPlayerIDDict[playerID] = [order, awardOrder] awardList = billboradAwardDict[str(awardOrder)] PlayerCompensation.SendMailByKey("ArenaBillboardAward%s" % awardType, [playerID], awardList, [order]) GameWorld.Log(" 奖励玩家名次信息: %s" % orderPlayerIDDict) # 其他的获得保底奖励 orderPlayerIDList = orderPlayerIDDict.keys() floorPlayerIDList = [] for playerID in PyGameData.g_arenaPlayerBattleRecDict.keys(): if playerID in orderPlayerIDList: continue floorPlayerIDList.append(playerID) PlayerCompensation.SendMailByKey("ArenaFloorAward%s" % awardType, [playerID], floorAwardList) GameWorld.Log(" 奖励保底玩家信息: %s" % floorPlayerIDList) return def MapServer_Arena(curPlayer, msgList): GameWorld.DebugLog("MapServer_Arena %s" % str(msgList), curPlayer.GetPlayerID()) if not msgList: return cmd = msgList[0] cmdDict = msgList[1] if len(msgList) > 1 else {} retDict = {} # 匹配刷新 if cmd == "MatchRefresh": __DoArenaMatchRefresh(curPlayer, cmdDict["isRefresh"], cmdDict["playerLV"], cmdDict["playerScore"]) # 对战结算 elif cmd == "BattleResult": retDict = __DoArenaBattleResult(curPlayer, cmdDict) return msgList + [retDict] def __DoArenaMatchRefresh(curPlayer, isRefresh, playerLV, playerScore): ## 玩家刷新匹配对手 playerID = curPlayer.GetPlayerID() higherOrderPerList = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 1) lowerOrderPerList = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 2) GameWorld.DebugLog("竞技场玩家刷新匹配列表: isRefresh=%s,playerLV=%s,playerScore=%s" % (isRefresh, playerLV, playerScore), playerID) GameWorld.DebugLog(" higherOrderPerList=%s,lowerOrderPerList=%s" % (higherOrderPerList, lowerOrderPerList), playerID) # 匹配对象缓存 needMatchCount = len(higherOrderPerList) + len(lowerOrderPerList) #GameWorld.DebugLog(" 匹配缓存: %s" % PyGameData.g_arenaPlayerMatchDict, playerID) if playerID not in PyGameData.g_arenaPlayerMatchDict: PyGameData.g_arenaPlayerMatchDict[playerID] = [] matchList = PyGameData.g_arenaPlayerMatchDict[playerID] if len(matchList) > needMatchCount: matchList = matchList[:needMatchCount] # 删除多余的个数,一般都是相同的,除非修改匹配数重读配置 if not isRefresh and len(matchList) == needMatchCount: # 非刷新的并且已经有记录的直接同步 GameWorld.DebugLog(" 非刷新且有数据,直接同步!", playerID) __SyncMatchList(curPlayer, matchList) return #maxOrder = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1) # 这里不读配置,直接使用榜单数 billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena) if not billBoard: return playerOrder = billBoard.IndexOfByID(playerID) + 1 # 玩家在排行榜中的名次,没有名次为-1 maxOrder = billBoard.GetCount() if playerOrder <= 0: playerOrder = maxOrder + 1 GameWorld.DebugLog(" maxOrder=%s,playerOrder=%s" % (maxOrder, playerOrder), playerID) matchOrderList = [] # 匹配到的名次 # 非第一名的匹配比自身名次高的 if playerOrder > 1 and higherOrderPerList: higherOrderCount = playerOrder - 1 # 比玩家高的名次的个数 # 小于10个的直接纯随机 if 0 < higherOrderCount < 10: randOrderList = range(1, playerOrder) random.shuffle(randOrderList) matchOrderList.extend(randOrderList[:len(higherOrderPerList)]) GameWorld.DebugLog(" 直接随机较高名次! higherOrderCount=%s,randOrderList=%s,matchOrderList=%s" % (higherOrderCount, randOrderList, matchOrderList), playerID) # 按比例划分 elif higherOrderCount >= 10: randMaxOrder = playerOrder - 1 for per in higherOrderPerList: per = min(per, 100) # 最多到100 tagOrder = int(playerOrder - higherOrderCount * per / 100.0) if tagOrder <= 0 or randMaxOrder <= 0 or tagOrder > randMaxOrder: GameWorld.ErrLog("竞技场匹配高名次玩家比例范围配置错误! playerOrder(%s) - higherOrderCount(%s)*per(%s) = tagOrder(%s) <= 0 or randMaxOrder(%s)<=0 or tagOrder > randMaxOrder higherOrderPerList=%s" % (playerOrder, higherOrderCount, per, tagOrder, randMaxOrder, higherOrderPerList)) break randOrder = random.randint(tagOrder, randMaxOrder) if randOrder != playerOrder and randOrder not in matchOrderList: matchOrderList.append(randOrder) GameWorld.DebugLog(" 根据比例随机较高名次! higherOrderCount=%s,per=%s,randOrder=(%s~%s)%s,matchOrderList=%s" % (higherOrderCount, per, tagOrder, randMaxOrder, randOrder, matchOrderList), playerID) randMaxOrder = tagOrder - 1 # 高名次不足的,用低名次补足,一般是前几名才会有这个需求 higherLackCount = max(0, len(higherOrderPerList) - len(matchOrderList)) # 非最后一名的匹配比自身名次低的 if 1 <= playerOrder < maxOrder and lowerOrderPerList: lowerOrderCount = maxOrder - playerOrder # 比玩家低的名次的个数 # 小于10个的直接纯随机 if 0 < lowerOrderCount < 10: randOrderList = range(playerOrder + 1, maxOrder + 1) random.shuffle(randOrderList) matchOrderList.extend(randOrderList[:len(lowerOrderPerList)]) GameWorld.DebugLog(" 直接随机较低名次! lowerOrderCount=%s,randOrderList=%s,matchOrderList=%s" % (lowerOrderCount, randOrderList, matchOrderList), playerID) # 按比例划分 elif lowerOrderCount >= 10: randMinOrder = playerOrder + 1 for per in lowerOrderPerList: per = min(per, 100) # 最多到100 tagOrder = int(playerOrder + lowerOrderCount * per / 100.0) if tagOrder > maxOrder or randMinOrder > maxOrder or randMinOrder > tagOrder: GameWorld.ErrLog("竞技场匹配低名次玩家比例范围配置错误! playerOrder(%s) - lowerOrderCount(%s)*per(%s) = tagOrder(%s) > maxOrder(%s) or randMinOrder(%s)>maxOrder or randMinOrder > tagOrder lowerOrderPerList=%s" % (playerOrder, lowerOrderCount, per, tagOrder, maxOrder, randMinOrder, lowerOrderPerList)) break randOrder = random.randint(randMinOrder, tagOrder) if randOrder != playerOrder and randOrder not in matchOrderList: matchOrderList.append(randOrder) GameWorld.DebugLog(" 根据比例随机较低名次! lowerOrderCount=%s,per=%s,randOrder=(%s~%s)%s,matchOrderList=%s" % (lowerOrderCount, per, randMinOrder, tagOrder, randOrder, matchOrderList), playerID) randMinOrder = tagOrder + 1 # 高名次不足还需要额外补的,直接从玩家名次+1 ~ 最后一个低百分比名次 间随机 doCount = 50 while higherLackCount > 0 and doCount > 0: doCount -= 1 randOrderMin = playerOrder + 1 randOrderMax = min(tagOrder, maxOrder) randOrder = random.randint(randOrderMin, randOrderMax) if randOrder != playerOrder and randOrder not in matchOrderList: matchOrderList.append(randOrder) higherLackCount -= 1 GameWorld.DebugLog(" 高名次不足,使用较低名次补充! higherLackCount=%s,randOrder=(%s~%s)%s,matchOrderList=%s" % (higherLackCount, randOrderMin, randOrderMax, randOrder, matchOrderList), playerID) matchOrderList.sort() GameWorld.DebugLog(" 最终匹配到的名次列表: matchOrderList=%s" % matchOrderList, playerID) # 随机机器人备用信息 openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1) randRobotLVPerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 3) minLV, maxLV = IpyGameDataPY.GetFuncEvalCfg("ArenaRobot", 2) # 机器人最小、最大等级 randMinLV = min(minLV, int(playerLV * randRobotLVPerRange[0] / 100.0)) randMaxLV = min(maxLV, int(playerLV * randRobotLVPerRange[1] / 100.0)) randRobotScorePerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 4) randMinScore = int(playerScore * randRobotScorePerRange[0] / 100.0) randMaxScore = int(playerScore * randRobotScorePerRange[1] / 100.0) # 找出对战列表中最新的一条随机机器人ID,用于后面生成新的随机机器人ID用,确保不重复 lastRandRobotID = RandRobotID curBattleRecList = GetPlayerArenaBattleRecList(playerID) for battleRec in curBattleRecList[::-1]: if battleRec.tagPlayerID >= RandRobotID and battleRec.tagPlayerID <= MaxRobotID: lastRandRobotID = battleRec.tagPlayerID break GameWorld.DebugLog(" 随机机器人备用信息: lastRandRobotID=%s,LV(%s ~ %s),score(%s ~ %s)" % (lastRandRobotID, randMinLV, randMaxLV, randMinScore, randMaxScore), playerID) for i in xrange(needMatchCount): if len(matchList) > i: matchPlayer = matchList[i] else: matchPlayer = ArenaMatchPlayer() matchList.append(matchPlayer) matchPlayer.ResetData() if matchOrderList: matchOrder = matchOrderList.pop(0) matchIndex = matchOrder - 1 # 在榜单上的直接取榜单数据 if billBoard and 0 <= matchIndex < billBoard.GetCount(): billData = billBoard.At(matchIndex) matchPlayer.tagPlayerID = GetArenaBillID(billData) # 被匹配的时候被动更新榜单中的玩家数据,不排序,只更新数值,这些数值不影响排序,战斗力为二级排序,可忽略 if matchPlayer.tagPlayerID > MaxRobotID: curCache = PlayerViewCache.FindViewCache(matchPlayer.tagPlayerID) if curCache: cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) SetArenaBillName(billData, cacheDict["Name"]) SetArenaBillRealmLV(billData, cacheDict["RealmLV"]) SetArenaBillLV(billData, cacheDict["LV"]) SetArenaBillFightPower(billData, cacheDict["FightPower"]) matchPlayer.tagLV = GetArenaBillLV(billData) matchPlayer.tagJob = GetArenaBillJob(billData) matchPlayer.tagScore = GetArenaBillScore(billData) GameWorld.DebugLog(" %s 匹配在榜单上的: tagPlayerID=%s,tagLV=%s,tagScore=%s,matchOrder=%s" % (i + 1, matchPlayer.tagPlayerID, matchPlayer.tagLV, matchPlayer.tagScore, matchOrder), playerID) continue # 剩下的随机生成不在榜单上的机器人 lastRandRobotID += 1 if lastRandRobotID > MaxRobotID: lastRandRobotID = RandRobotID matchPlayer.tagPlayerID = lastRandRobotID matchPlayer.tagJob = random.choice(openJobList) matchPlayer.tagLV = random.randint(randMinLV, randMaxLV) matchPlayer.tagScore = random.randint(randMinScore, randMaxScore) GameWorld.DebugLog(" %s 匹配非榜单上的: tagPlayerID=%s,tagLV=%s,tagScore=%s" % (i + 1,matchPlayer.tagPlayerID, matchPlayer.tagLV, matchPlayer.tagScore), playerID) PyGameData.g_arenaPlayerMatchDict[playerID] = matchList #GameWorld.DebugLog(" 更新匹配缓存: %s" % PyGameData.g_arenaPlayerMatchDict, playerID) __SyncMatchList(curPlayer, matchList) return def __SyncMatchList(curPlayer, matchList): ## 同步匹配列表 clientPack = ChPyNetSendPack.tagGCArenaMatchList() clientPack.MatchList = [] for matchPlayer in matchList: matchInfo = ChPyNetSendPack.tagGCArenaMatchInfo() matchInfo.PlayerID = matchPlayer.tagPlayerID matchInfo.Job = matchPlayer.tagJob matchInfo.LV = matchPlayer.tagLV matchInfo.Score = matchPlayer.tagScore # 玩家读取额外信息, 机器人其他信息不处理,这里直接读最新的查看缓存,防止刷新不及时(并不是实时数据,只是相对实时,前端可自行控制刷新频率) if matchInfo.PlayerID > MaxRobotID: curCache = PlayerViewCache.FindViewCache(matchInfo.PlayerID) if curCache: cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) matchInfo.PlayerName = cacheDict["Name"] matchInfo.RealmLV = cacheDict["RealmLV"] matchInfo.FightPower = cacheDict["FightPower"] clientPack.MatchList.append(matchInfo) clientPack.MatchCount = len(clientPack.MatchList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def __DoArenaBattleResult(curPlayer, cmdDict): ## 地图玩家同步战斗结果 retDict = {} retDict.update(cmdDict) playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("竞技场玩家战斗结果: %s" % str(cmdDict), playerID) tagPlayerID = cmdDict["tagPlayerID"] isWin = cmdDict["isWin"] playerLV = cmdDict["playerLV"] playerScore = cmdDict["playerScore"] if not tagPlayerID: return retDict ''' 关于对手 来源: 1. 匹配列表中 2. 对战记录中直接发起的挑战 说明: 1. 可能是机器人,且机器人积分不会变化 2. 不一定在榜上,因为可能在榜上的时候被匹配走了,但是后来被挤出榜单,然后受到玩家挑战 3. 如果是玩家,理论上都有对战记录,因为在榜上的玩家才会被匹配走,而只有主动对战过才有可能上榜 ''' curScore = playerScore isFindTag = False tagLV, tagJob, tagScore = 0, 0, 0 # 先找匹配列表 matchList = PyGameData.g_arenaPlayerMatchDict.get(playerID, []) for matchPlayer in matchList: if matchPlayer.tagPlayerID == tagPlayerID: isFindTag = True tagLV, tagJob, tagScore = matchPlayer.tagLV, matchPlayer.tagJob, matchPlayer.tagScore GameWorld.DebugLog(" 对手在匹配列表中! tagLV=%s, tagJob=%s, tagScore=%s" % (tagLV, tagJob, tagScore), playerID) break # 在找对战记录列表 curBattleRecList = GetPlayerArenaBattleRecList(playerID) if not isFindTag: for battleRec in curBattleRecList: if battleRec.tagPlayerID == tagPlayerID: isFindTag = True tagLV, tagJob, tagScore = battleRec.tagLV, battleRec.tagJob, battleRec.tagScore GameWorld.DebugLog(" 对手在对战记录中! tagLV=%s, tagJob=%s, tagScore=%s" % (tagLV, tagJob, tagScore), playerID) break if not isFindTag: GameWorld.ErrLog("找不到对战对手,不在匹配列表或对战记录里!不处理结算!tagPlayerID=%s" % tagPlayerID, playerID) return retDict billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena) if not billBoard: return retDict if tagPlayerID > MaxRobotID: tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) tagOnline = 1 if (tagPlayer and not PlayerControl.GetIsTJG(tagPlayer)) else 0 # 目标玩家是否在线 tagBattleRecList = GetPlayerArenaBattleRecList(tagPlayerID) # 虽说理论上都有记录,但是代码层面还是做好为None时的防范 tagBattleRec = tagBattleRecList[-1] if len(tagBattleRecList) > 0 else None if tagBattleRec: tagScore = tagBattleRec.updScore GameWorld.DebugLog(" 对手是玩家,从对手最新对战记录中获得对手最新积分! tagScore=%s" % tagScore, playerID) playerJob = curPlayer.GetJob() playerName = curPlayer.GetName() realmLV = cmdDict["realmLV"] fightPower = cmdDict["fightPower"] opInfo = "" # 结算自己 addScore = __CalcBattleAddScore(curScore, tagScore, isWin) updScore = max(0, playerScore + addScore) GameWorld.DebugLog(" 更新自身积分: addScore=%s,updScore=%s" % (addScore, updScore), playerID) curOrder = billBoard.IndexOfByID(playerID) + 1 # 更新前获取名次 PlayerBillboard.UpdatePlayerBillboard(playerID, playerName, opInfo, ShareDefine.Def_BT_Arena, playerJob, realmLV, playerLV, updScore, autoSort=False, cmpValue2=fightPower) awardItemList = [] if isWin: randItemList = IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 3) awardItemInfo = GameWorld.GetResultByRandomList(randItemList) if awardItemInfo: awardItemList.append(awardItemInfo) # 结算对手,仅玩家时结算,机器人不处理 if tagPlayerID > MaxRobotID: tagAddScore = __CalcBattleAddScore(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 = "" tagPlayerName = cacheDict["Name"] tagRealmLV = cacheDict["RealmLV"] tagFightPower = cacheDict["FightPower"] PlayerBillboard.UpdatePlayerBillboard(tagPlayerID, tagPlayerName, tagOpInfo, ShareDefine.Def_BT_Arena, tagJob, tagRealmLV, tagLV, updTagScore, autoSort=False, cmpValue2=tagFightPower) else: updTagScore = tagScore GameWorld.DebugLog(" 机器人对手,积分不变!updTagScore=%s" % updTagScore, playerID) # 都更新完后排序一次 billBoard.Sort() updOrder = billBoard.IndexOfByID(playerID) + 1 # 取最新名次 retDict.update({"addScore":addScore, "updScore":updScore, "curOrder":curOrder, "updOrder":updOrder, "awardItemList":awardItemList, "isOK":True}) battleRecMaxCount = min(MaxBattleRecCount, IpyGameDataPY.GetFuncCfg("ArenaSet", 4)) # 插入对战记录 battleTime = int(time.time()) battleRec = ArenaBattleRec(playerID) battleRec.battleTime = battleTime battleRec.tagPlayerID = tagPlayerID battleRec.tagLV = tagLV battleRec.tagJob = tagJob battleRec.tagScore = updTagScore battleRec.isWin = int(isWin) battleRec.addScore = addScore battleRec.isDispose = 1 battleRec.updScore = updScore curBattleRecList.append(battleRec) if len(curBattleRecList) > battleRecMaxCount: curBattleRecList = curBattleRecList[len(curBattleRecList) - battleRecMaxCount:] PyGameData.g_arenaPlayerBattleRecDict[playerID] = curBattleRecList __SyncArenaBattleRecord(curPlayer, [battleRec]) if tagPlayerID > MaxRobotID: # 对手玩家反向增加对战记录 tagBattleRec = ArenaBattleRec(tagPlayerID) tagBattleRec.battleTime = battleTime tagBattleRec.tagPlayerID = playerID tagBattleRec.tagLV = playerLV tagBattleRec.tagJob = playerJob tagBattleRec.tagScore = updScore tagBattleRec.isWin = int(not isWin) tagBattleRec.addScore = tagAddScore tagBattleRec.isDispose = 1 if tagOnline else 0 tagBattleRec.updScore = updTagScore tagBattleRecList.append(tagBattleRec) if len(tagBattleRecList) > battleRecMaxCount: tagBattleRecList = tagBattleRecList[len(tagBattleRecList) - battleRecMaxCount:] PyGameData.g_arenaPlayerBattleRecDict[tagPlayerID] = tagBattleRecList if tagOnline: __SyncArenaBattleRecord(tagPlayer, [tagBattleRec]) __SyncPlayerBechallengedUpdScore(tagPlayer, updTagScore) GameWorld.DebugLog(" 最新所有对战记录缓存! %s" % PyGameData.g_arenaPlayerBattleRecDict) GameWorld.DebugLog(" retDict=%s" % retDict, playerID) # 对战结束,最后免费刷新一次匹配列表 __DoArenaMatchRefresh(curPlayer, True, playerLV, updScore) return retDict def __SyncPlayerBechallengedUpdScore(curPlayer, updScore): ## 通知地图玩家被挑战更新积分,在线被挑战 或 离线/脱机被挑战上线后同步 playerID = curPlayer.GetPlayerID() tagMapID = curPlayer.GetRealMapID() cmdStr = str(["UpdScore", {"updScore":updScore}]) GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, playerID, tagMapID, "Arena", cmdStr, len(cmdStr), curPlayer.GetRouteServerIndex()) return def __CalcBattleAddScore(curScore, tagScore, isWin): ## 计算对战增加积分 diffScore = curScore - tagScore # 积分差,有正负 calcScoreFormatDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 1) if isWin else IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 2) scoreKeyList = calcScoreFormatDict.keys() scoreKeyList.sort() calcKey = "" for scoreKey in scoreKeyList: if diffScore <= scoreKey: calcKey = scoreKey break if not calcKey: return 0 compileKey = "ArenaBattleScore_%s_%s" % (int(isWin), str(calcKey)) formatStr = calcScoreFormatDict[calcKey] addScore = eval(FormulaControl.GetCompileFormula(compileKey, formatStr)) GameWorld.DebugLog(" 计算得分公式: diffScore=%s,isWin=%s,compileKey=%s,formatStr=%s,addScore=%s" % (diffScore, isWin, compileKey, formatStr, addScore)) return addScore #// A9 A8 查看竞技场对战记录 #tagCGQueryArenaBattleRecord # #struct tagCGQueryArenaBattleRecord #{ # tagHead Head; #}; def OnQueryArenaBattleRecord(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if not curPlayer: return __SyncArenaBattleRecord(curPlayer, []) return def __SyncArenaBattleRecord(curPlayer, battleRecList): ## 同步对战记录 if not battleRecList: playerID = curPlayer.GetPlayerID() battleRecList = GetPlayerArenaBattleRecList(playerID) clientPack = ChPyNetSendPack.tagGCArenaBattleRecordList() clientPack.BattleRecordList = [] for battleRec in battleRecList: recInfo = ChPyNetSendPack.tagGCArenaBattleRecord() recInfo.PlayerID = battleRec.tagPlayerID recInfo.Job = battleRec.tagJob recInfo.LV = battleRec.tagLV recInfo.AddScore = str(battleRec.addScore) recInfo.AddScoreLen = len(recInfo.AddScore) recInfo.IsWin = battleRec.isWin recInfo.Time = battleRec.battleTime if recInfo.PlayerID > MaxRobotID: curCache = PlayerViewCache.FindViewCache(recInfo.PlayerID) if curCache: cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) recInfo.PlayerName = cacheDict["Name"] recInfo.RealmLV = cacheDict["RealmLV"] recInfo.FightPower = cacheDict["FightPower"] clientPack.BattleRecordList.append(recInfo) clientPack.RecordCount = len(clientPack.BattleRecordList) NetPackCommon.SendFakePack(curPlayer, clientPack) return ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -25,7 +25,6 @@ # @change: "2014-02-27 12:00" hxp 增加世界boss逻辑 # @change: "2014-04-26 19:30" hxp 增加领地战活动 # @change: "2014-06-21 15:20" hxp 增加特惠活动 # @change: "2014-08-04 17:30" xmnathan 天梯每日更新 # @change: "2014-08-15 17:00" xmnathan 修改OnDay函数内的执行顺序 # @change: "2014-10-08 10:30" xmnathan add 定时清理过期补偿 # @change: "2014-10-29 22:00" hxp MapServerInitOK增加扩展key状态通知 @@ -97,6 +96,7 @@ import IpyGameDataPY import PlayerFamilyParty import GameWorldFamilyWar import GameWorldArena import AuctionHouse import PlayerXMZZ import PlayerTeam @@ -1235,6 +1235,8 @@ ChPlayer.LoadPlayerLVData() #加载助战信息 PlayerFBHelpBattle.OnServerStart() #本服竞技场 GameWorldArena.OnServerStart() #跨服PK CrossRealmPK.OnGameServerInitOK() #世界boss被杀次数重置 @@ -1412,6 +1414,8 @@ # 跨服PK CrossRealmPK.OnMapServerInitOK() # 本服竞技场 GameWorldArena.SendMapServerArenaInfo() SendAllMapGlobalDropInfo() # 全局掉落控制 @@ -1926,6 +1930,7 @@ PlayerTeam.OnServerClose(tick) ChPlayer.SavePlayerLVData() PlayerFBHelpBattle.OnServerClose() GameWorldArena.OnServerClose() GameWorld.Log("通知C++关服!") GameWorld.GetGameWorld().OnServerClose() ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -61,6 +61,7 @@ import PyGameData import GMShell import IPY_PlayerDefine import GameWorldArena import CrossRealmPK import AuctionHouse import PlayerAssist @@ -183,6 +184,8 @@ GameWorldActionControl.OnPlayerLogin(curPlayer) #玩家等级记录 PyGameData.g_todayPlayerLVDict[curPlayer.GetID()] = curPlayer.GetLV() #竞技场 GameWorldArena.OnPlayerLogin(curPlayer) #跨服PK CrossRealmPK.OnPlayerLogin(curPlayer) #诛仙BOSS ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerBillboard.py
@@ -151,6 +151,33 @@ GameWorld.Log('billboardIndex %s clear.'%billboardIndex) return def UpdateBillboardMaxCount(billboardIndex, updMaxCount, isDelExtra=True): ''' 变更竞技场榜单最大数据数 @param updMaxCount: 更新的最大数据排名 @param isDelExtra: 是否删除原榜单排名数据超过更新后的最大排名,默认删除 ''' billBoard = GameWorld.GetBillboard().FindBillboard(billboardIndex) if not billBoard: return curCount = billBoard.GetCount() curMaxCount = billBoard.GetMaxCount() # 不超过程序内置配置的最大数量 if billboardIndex in ChConfig.Def_BT_Cnt: updMaxCount = min(updMaxCount, ChConfig.Def_BT_Cnt[billboardIndex]) if curMaxCount == updMaxCount: return billBoard.SetMaxCount(updMaxCount) GameWorld.Log(" 变更榜单最大数据数! billboardIndex=%s,curCount=%s,curMaxCount=%s,updMaxCount=%s" % (billboardIndex, curCount, curMaxCount, updMaxCount)) # 清除多余榜单数据 if isDelExtra and curCount > updMaxCount: for delIndex in xrange(curCount - 1, updMaxCount - 1, -1): if delIndex >= 0: GameWorld.Log(" DeleteByIndex: %s" % delIndex) billBoard.DeleteByIndex(delIndex) return #################################################################################################### #class IPY_GSetWatchBillboardState @@ -213,6 +240,9 @@ if packType in ChConfig.Def_InterdictLook_BT_Type: #不可通过此封包查看 return if ChConfig.Def_BT_Cnt.get(packType, 0) > 100: GameWorld.DebugLog("该榜单最大名次较大,需使用分页查询! A9 A2 查看排行榜#tagCPYWatchBillboard") return if not __CheckWatchCD(curPlayer, packType, tick): return ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
@@ -12,7 +12,6 @@ # # @change: "2011-02-23 14:20" panwei 系统提示函数重写 # @change: "2011-07-15 19:30" Alee 队伍通知 # @change: "2011-09-02 16:20" panwei 新增竞技场设置和获取决斗值接口 # @change: "2012-11-06 15:00" jiang 新增竞威望设置和获取威望设接口 # @change: "2012-11-07 17:30" wdb 新增跨服预选赛排位信息 # @change: "2012-11-14 12:00" jiang 修改扩展属性字段记录的属性类型必须和MapServer一致 @@ -160,21 +159,6 @@ #waring:以下使用的扩展属性字段记录的属性类型必须和MapServer一致 #------------------------------------------------------------------------------ ##设置决斗值(竞技场用) # @param curPlayer 玩家 # @param value 数值 # @return None def SetVsFightValue(curPlayer, value): return ##获取决斗值(竞技场用) # @param curPlayer 玩家 # @return 决斗值 def GetVsFightValue(curPlayer): return 0 #------------------------------------------------------------------------------ ## 设置威望 # @param curPlayer: 玩家实例 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -155,6 +155,8 @@ Def_HorsePetBossTime = "HorsePetBossTime%s" #跨服服务器是否维护中 Def_CrossServerClose = "CrossServerClose" #竞技场开服前定制X天赛季状态 0-未比赛过,1-进行中,>1结算时的开服天 Def_ArenaOSSeasonState = "ArenaOSSeasonState" def SetInitOpenServerTime(initTime): openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime) ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
@@ -28,6 +28,7 @@ import PlayerFBHelpBattle import PlayerFairyDomain import ChPyNetSendPack import GameWorldArena import NetPackCommon import PlayerDuJie #--------------------------------------------------------------------- @@ -81,6 +82,8 @@ PlayerViewCache.DoOnDayEx() #缥缈OnDay PlayerFairyDomain.OnDayEx() #竞技场 GameWorldArena.OnDayEx() playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) @@ -116,6 +119,9 @@ def DoLogic_GameServer_OnWeekEx(tick): # 竞技场 GameWorldArena.OnWeekEx() playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -74,6 +74,7 @@ import AuctionHouse import PlayerFairyDomain import GameWorldSkyTower import GameWorldArena import GameWorldItem import PlayerAssist @@ -934,6 +935,14 @@ return resultName = '%s' % ret # 竞技场 if callName =="Arena": curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID) if not curPlayer: return ret = GameWorldArena.MapServer_Arena(curPlayer, eval(resultName)) resultName = '%s' % ret if ret != None else '' # 需要重置间隔,每次都回复 # 天星塔 if callName == "SkyTower": ret = GameWorldSkyTower.MapServer_SkyTowerInfo(eval(resultName)) ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
@@ -21,6 +21,7 @@ import GameWorld import PlayerControl import NetPackCommon import GameWorldArena import ChPyNetSendPack import PlayerFBHelpBattle import PyGameDataStruct @@ -40,6 +41,9 @@ if PlayerFBHelpBattle.IsInHelpBattleCheckInList(playerID): return True if GameWorldArena.IsArenaBattlePlayer(playerID): return True SaveDBLimitLV = IpyGameDataPY.GetFuncCfg("PlayerViewCache", 1) #校验玩家等级 if playerLV < SaveDBLimitLV: @@ -50,6 +54,12 @@ def IsSaveAllViewCache(playerID): ## 是否保存所有缓存数据 if PlayerFBHelpBattle.IsInHelpBattleCheckInList(playerID): return True if GameWorldArena.IsArenaBattlePlayer(playerID): return True NeedCheckBillBoardType = IpyGameDataPY.GetFuncEvalCfg("PlayerViewCache", 2) #校验玩家是否上排行榜 billboardMgr = GameWorld.GetBillboard() ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
@@ -83,6 +83,9 @@ g_fbHelpBattleCheckInPlayerDict = {} # 副本助战玩家登记缓存 {playerID:HelpBattlePlayer, ...} g_arenaPlayerBattleRecDict = {} # 本服竞技场玩家挑战记录缓存 {playerID:[ArenaBattleRec, ...], ...} g_arenaPlayerMatchDict = {} # 本服竞技场玩家匹配记录缓存 {playerID:[ArenaMatchPlayer, ...], ...} g_autoViceleaderDict = {}#自动安排副盟主的玩家记录{familyID:[]} g_forbidAutoViceleaderFamily = [] #禁止自动安排副盟主的仙盟[familyID,..] ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -658,9 +658,10 @@ Def_BT_Campaign_Wash, #洗练战力(开服活动榜) Def_BT_SkyTower, #天星塔榜 Def_BT_Arena, #竞技场榜 Def_BT_Max, #排行榜最大类型 ) = range(0, 27 + 2) ) = range(0, 28 + 2) #职业对应战力排行榜类型 JobFightPowerBillboardDict = { @@ -969,6 +970,7 @@ GameFuncID_TJG = 147 # 脱机挂 GameFuncID_SuperGift = 150 # 超值礼包 GameFuncID_ZhuXianBoss = 163 # 诛仙BOSS GameFuncID_Arena = 189 # 竞技场 # 以下为暂时无用的 GameFuncID_Truck = 33 # 运镖 GameFuncID_RunDaily = 34 # 日常跑环 @@ -1057,7 +1059,7 @@ Def_UniversalGameRecType_LuckyTreasure, #幸运鉴宝大奖记录12 Def_UniversalGameRecType_FairyDomain, #缥缈仙域事件次数记录13 Def_UniversalGameRecType_Reward, # 通用奖励表(TopBar)14 Def_UniversalGameRecType_15, Def_UniversalGameRecType_ArenaBattleRecord, # 竞技场玩家挑战记录 15 Def_UniversalGameRecType_16, Def_UniversalGameRecType_17, Def_UniversalGameRecType_18, ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1454,6 +1454,22 @@ PacketSubCMD_2=0x11 PacketCallFunc_2=OnRequestAssistTeamFB ;竞技场 [PlayerArena] ScriptName = Player\PlayerArena.py Writer = hxp Releaser = hxp RegType = 0 RegisterPackCount = 2 PacketCMD_1=0xB2 PacketSubCMD_1=0x09 PacketCallFunc_1=OnArenaMatch PacketCMD_2=0xB2 PacketSubCMD_2=0x10 PacketCallFunc_2=OnArenaBattle ;缥缈仙域 [PlayerFairyDomain] ScriptName = Player\PlayerFairyDomain.py ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -457,6 +457,7 @@ Def_Effect_HorsePetSkinExp = 253 #骑宠觉醒值 Def_Effect_ItemGiveTreasureScore = 254 #使用道具给予寻宝积分 Def_Effect_VIPLVCard = 256 #VIP等级直升卡 直接升到VIPx级,只加经验,享受VIP特权 效果值A: vip等级 效果值B: 领取是否默认直接使用 Def_Effect_AddArenaBattleCount = 257 #增加竞技场挑战次数,A值为增加次数 #----以下未使用或代码依然存在的--- Def_Effect_ItemGiveGongXun = 1920 #使用道具给予功勋 Def_Effect_ItemGiveRuneJH = 1925 #使用道具给予符印精华 @@ -1801,9 +1802,11 @@ Def_FBMapID_CrossGrasslandLing = 32040 #跨服仙草园 Def_FBMapID_CrossGrasslandXian = 32050 #竞技场战斗 Def_FBMapID_ArenaBattle = 31290 #前端自定义场景地图 ClientCustomScene = [Def_FBMapID_PersonalBoss] ClientCustomScene = [Def_FBMapID_PersonalBoss, Def_FBMapID_ArenaBattle] #注册上传跨服服务器数据后直接进入跨服服务器的地图 RegisterEnter_CrossServerMapIDList = [Def_FBMapID_CrossPenglai, Def_FBMapID_CrossDemonKing, Def_FBMapID_CrossGrasslandLing, Def_FBMapID_CrossGrasslandXian] @@ -1911,6 +1914,7 @@ 'Guard':[Def_FBMapID_Guard], #守护副本 'SealDemon':[Def_FBMapID_SealDemon, Def_FBMapID_SealDemonEx], #封魔坛 'XMZZ':[Def_FBMapID_XMZZ], #仙魔之争 'ArenaBattle':[Def_FBMapID_ArenaBattle],#竞技场战斗 'CrossRealmPK':[Def_FBMapID_CrossRealmPK], #跨服竞技场 'CrossDemonKing':[Def_FBMapID_DemonKing, Def_FBMapID_CrossDemonKing], #妖王 'CrossGrassland':[Def_FBMapID_CrossGrasslandLing, Def_FBMapID_CrossGrasslandXian], #草园 @@ -2222,6 +2226,7 @@ 1000 * 1, # vip体验时效 1000 * 1, # 限时抢购 1000 * 5, # 请求协助间隔 1000 * 10, # 竞技场间隔 ] TYPE_Player_Tick_Count = len(TYPE_Player_Tick_Time) @@ -2296,6 +2301,7 @@ TYPE_Player_Tick_VIPExperience, #vip体验时效 TYPE_Player_Tick_FlashSale, #限时抢购 TYPE_Player_Tick_RequestAssist, #请求协助间隔 TYPE_Player_Tick_Arena, #竞技场间隔 ) = range(0, TYPE_Player_Tick_Count) #--------------------------------------------------------------------- @@ -4015,6 +4021,14 @@ Def_PDict_TodayAssistMoney = "TodayAssistMoney" # 今日已获得协助货币奖励 Def_PDict_TodayAssistMoneySocial = "TodayAssistMoneySocial" # 今日已获得协助货币 社交关系额外加成 #竞技场 Def_PDict_ArenaOSSeasonState = "ArenaOSSeasonState" # 开服前定制X天赛季状态 0-未比赛过,1-进行中,>1结算时的开服天 Def_PDict_ArenaScore = "ArenaScore" # 当前积分 Def_PDict_ArenaBattleCountDay = "ArenaBattleCountDay" # 今日已战斗次数 Def_PDict_ArenaMatchRefreshCount = "ArenaMatchRefreshCount" # 匹配刷新列表次数 Def_PDict_ArenaItemAddCount = "ArenaItemAddCount" # 今日已使用物品增加次数 Def_PDict_ArenaBattleTagID = "ArenaBattleTagID" # 当前对战的对手ID #------------------------------------------------------------------------------- #可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]} ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
@@ -47,7 +47,6 @@ # @change: "2014-06-23 14:30" Alee 关闭输出 # @change: "2014-07-24 21:30" hxp 增加设置跑环任务星级,一键完成所有跑环任务 # @change: "2014-07-31 21:30" hxp 取消红名不能与NPC对话限制 # @change: "2014-08-08 10:00" hxp 增加天梯竞技场任务事件触发 # @change: "2014-08-26 11:00" hxp NotifyOneMission增加参数选择是否同步该任务全部字典信息 # @change: "2014-12-25 16:10" ljd 同步上一次背包开格时间 # @change: "2015-01-10 23:00" hxp 仓库购买特殊处理 @@ -1456,13 +1455,6 @@ # @return 返回值无意义 def EventRespons_FBEvent(curPlayer, eventName): RunQuestEvent(curPlayer, "fb_event", eventName, Def_RunQuestType_Normal) ##天梯竞技场事件触发 # @param curPlayer 玩家实例 # @param eventName 事件名 # @return 返回值无意义 def EventRespons_ArenaEvent(curPlayer, eventName): RunQuestEvent(curPlayer, "arena_event", eventName, Def_RunQuestType_Normal) ##添加好友成功触发 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
@@ -32,7 +32,6 @@ # @change: "2014-06-05 15:30" hxp 商店NPC物品购买增加每日可购买次数上限支持 # @change: "2014-08-04 16:00" Alee 套装物品商店修改 # @change: "2014-08-07 20:40" Alee 宝藏积分兑换卓越属性装备固定2条属性 # @change: "2014-08-12 11:30" xmnathan 天梯竞技 点数购买绑定 # @change: "2014-10-20 16:20" Alee 兑换套装3卓越 # @change: "2014-11-05 15:00" Alee 商店购买绑定修改 # @change: "2014-12-11 16:30" hxp 商店兑换装备增加支持配置装备对应卓越条数 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -2436,16 +2436,6 @@ return startM <= curMinute <= overM #--------------------------------------------------------------------- ##竞技场活动是否开启 # @param curPlayer 玩家实例 # @param curMission 任务实例 # @param curConditionNode 节点信息 # @return 返回值, 是否判断成功 # @remarks <Check_Vsroomisbegin result="期望值"/> def ConditionType_Check_Vsroomisbegin(curPlayer, curMission, curConditionNode): return #--------------------------------------------------------------------- ##指定任务类型个数是否达到指定数 # @param curPlayer 玩家实例 # @param curMission 任务实例 @@ -3950,19 +3940,6 @@ # @remarks <Lost_Money_By_Lv moneytype=""/> def DoType_Lost_Money_By_Lv(curPlayer, curMission, curActionNode): return #--------------------------------------------------------------------- ##扣除竞技点 # @param curPlayer 玩家实例 # @param curMission 任务实例 # @param curActionNode节点信息 # @return 返回值无意义 # @remarks <DoType_Lost_Vspoint value=""/> def DoType_Lost_Vspoint(curPlayer, curMission, curActionNode): value = int(curActionNode.GetAttribute("value")) PlayerControl.ReduceVsSportsPoint(curPlayer, value) return #--------------------------------------------------------------------- ##开通仓库 # @param curPlayer 玩家实例 @@ -6404,22 +6381,6 @@ conditionValue = GameWorld.ToIntDef(curConditionNode.GetAttribute("value"), 0) fbpasslv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % mwid) return fbpasslv >= conditionValue #--------------------------------------------------------------------- ##是否拥有足够的竞技点 # @param curPlayer 玩家实例 # @param curMission 任务实例 # @param curConditionNode节点信息 # @return 返回值, 是否通过检查 # @remarks <Have_Vspoint value="数值", result="期望的结果" /> def ConditionType_Have_Vspoint(curPlayer, curMission, curConditionNode): result = GameWorld.ToIntDef(curConditionNode.GetAttribute("result"), 0) value = GameWorld.ToIntDef(curConditionNode.GetAttribute("value"), 0) if PlayerControl.GetVsSportsPoint(curPlayer) >= value: return 1 == result return 0 == result #--------------------------------------------------------------------- ##是否家族长 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Arena.py
New file @@ -0,0 +1,63 @@ #!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GM.Commands.Arena # # @todo:竞技场 # @author hxp # @date 2020-12-07 # @version 1.0 # # 详细描述: 竞技场 # #------------------------------------------------------------------------------- #"""Version = 2020-12-07 19:30""" #------------------------------------------------------------------------------- import GameWorld import ShareDefine import PlayerControl import PlayerBillboard import GameFuncComm import PlayerArena import ChConfig ## GM命令执行入口 # @param curPlayer 当前玩家 # @param msgList 参数列表 [addSkillID] # @return None # @remarks 函数详细说明. def OnExec(curPlayer, msgList): if not msgList: GameWorld.DebugAnswer(curPlayer, "重置玩家竞技场: Arena 0") GameWorld.DebugAnswer(curPlayer, "设置玩家积分: Arena 积分") GameWorld.DebugAnswer(curPlayer, "重置赛季直接用 test_OnWeek (需开服7天后)") return if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): GameWorld.DebugAnswer(curPlayer, "竞技场功能未开启!") return value1 = msgList[0] if value1 <= 0: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaOSSeasonState, 0) PlayerArena.__DoArenaSeasonReset(curPlayer) GameWorld.DebugAnswer(curPlayer, "重置成功!") return else: GameWorld.DebugAnswer(curPlayer, "设置竞技场积分: %s" % value1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, value1) PlayerArena.Sync_ArenaInfo(curPlayer) # 同步排行榜 cmpValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) cmpValue2 = curPlayer.GetFightPower() cmpValue3 = 0 value1 = curPlayer.GetOfficialRank() value2 = curPlayer.GetLV() PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_Arena, cmpValue, cmpValue2, cmpValue3, value1, value2) return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ArenaBattle.py
New file @@ -0,0 +1,43 @@ #!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_ArenaBattle # # @todo:竞技场战斗 # @author hxp # @date 2020-12-07 # @version 1.0 # # 详细描述: 竞技场战斗,目前主要做自定义副本流程桥梁吧,暂时没什么额外逻辑,战斗过程前端自行处理,后端只处理击杀木桩后结算 # #------------------------------------------------------------------------------- #"""Version = 2020-12-07 19:30""" #------------------------------------------------------------------------------- import PlayerArena ## 是否能够通过活动查询进入 def OnEnterFBEvent(curPlayer, mapID, lineID, tick): return True ## 是否需要做进入副本通用检查条件逻辑,默认需要检查 def OnNeedCheckCanEnterFBComm(curPlayer, mapID, lineID): ## 进行中的不需要重复检查,防止断线重连被禁止进入 return False ## 客户端进入自定义场景 def OnEnterCustomScene(curPlayer, mapID, lineID): return ## 判断可否召唤木桩怪 def OnCanSummonPriWoodPile(curPlayer, mapID, lineID, npcID, count): return True ## 自定义场景副本击杀NPC def DoCustomScene_Player_KillNPC(curPlayer, curNPC, mapID, lineID): PlayerArena.OnKillBattleNPC(curPlayer, curNPC) return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -726,6 +726,7 @@ ChConfig.Def_Effect_VIPLVCard:"Item_VIPLVCard", # VIP等级直升卡 ChConfig.Def_Effect_ResetBossKillCnt:"Item_ResetBossKillCnt", # 重置boss击杀疲劳 ChConfig.Def_Effect_AddFBCnt:"Item_AddFBCnt", # 增加副本可进入次数 ChConfig.Def_Effect_AddArenaBattleCount:"Item_AddArenaBattleCount", # 增加竞技场挑战次数 ChConfig.Def_Effect_AddKillBossCnt:"Item_AddKillBossCnt", # 增加BOSS可击杀次数 ChConfig.Def_Effect_AddMagicWeaponUpExp:"Item_AddMagicWeaponUpExp", # 增加法宝升星经验 ChConfig.Def_Effect_ChatBubbleBox:"Item_ChatBubbleBox", # 激活聊天气泡框 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -2638,6 +2638,8 @@ def GivePlayerItemOrMail(curPlayer, itemList, mailKey=None, event=["", False, {}]): ##给物品,背包满则发邮件 if not itemList: return needPackSpaceDict = {} for itemID, itemCnt, isAuctionItem in itemList: curItem = GameWorld.GetGameData().GetItemByTypeID(itemID) ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_AddArenaBattleCount.py
New file @@ -0,0 +1,47 @@ #!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package UseItem.Item_AddArenaBattleCount # # @todo:增加竞技场挑战次数 # @author hxp # @date 2020-12-07 # @version 1.0 # # 详细描述: 增加竞技场挑战次数 # #------------------------------------------------------------------------------- #"""Version = 2020-12-07 19:30""" #------------------------------------------------------------------------------- import ItemCommon import PlayerControl import PlayerArena import ChConfig #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ ##使用物品,触发物品附加效果 增加BOSS可击杀次数 # @param curPlayer 玩家实例 # @param curRoleItem 物品实例 # @param tick 时间戳 # @return 是否使用物品成功 # @remarks 使用物品,触发物品附加效果 def BatchUseItem(curPlayer, curRoleItem, tick, useCnt, exData): useItemEff = curRoleItem.GetEffectByIndex(0) addCnt = useItemEff.GetEffectValue(0) * useCnt if addCnt <= 0: return updItemAddCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaItemAddCount) + addCnt PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaItemAddCount, updItemAddCount) PlayerArena.Sync_ArenaInfo(curPlayer) #扣除物品 ItemCommon.DelItem(curPlayer, curRoleItem, useCnt) # 竞技场挑战次数增加<color=#109d06FF>%s0</color>次 PlayerControl.NotifyCode(curPlayer, "ArenaBattleCountAdd", [addCnt]) return True ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -112,6 +112,7 @@ import ChNetSendPack import FamilyRobBoss import FBHelpBattle import PlayerArena import PyGameData import PlayerCoin import PlayerGeTui @@ -626,6 +627,9 @@ # 跨服PK PlayerCrossRealmPK.DoPlayerLogin(curPlayer) # 竞技场 PlayerArena.OnLogin(curPlayer) # 自定义货币值同步 PlayerControl.NotifyPlayerAllCurrency(curPlayer) #通知基础属性 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
@@ -44,6 +44,7 @@ import IPY_GameWorld import ItemCommon import ItemControler import PlayerArena import PlayerTJG @@ -65,6 +66,7 @@ ShareDefine.GameFuncID_AddPoint:lambda curObj:PlayerControl.DoAddPointOpen(curObj), ShareDefine.GameFuncID_Talent:lambda curObj:PlayerGreatMaster.DoTalentOpen(curObj), ShareDefine.GameFuncID_TJG:lambda curObj:PlayerTJG.DoTJGOpen(curObj), ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj), #ShareDefine.GameFuncID_RunDaily:lambda curObj:FBCommon.DoFuncOpen_RunDaily(curObj), #ShareDefine.GameFuncID_RunFamily:lambda curObj:FBCommon.DoFuncOpen_RunFamily(curObj), #ShareDefine.GameFuncID_RefineExp:lambda curObj:Operate_PlayerBuyZhenQi.DoFuncOpen_RefineExp(curObj), ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
New file @@ -0,0 +1,336 @@ #!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerArena # # @todo:竞技场 - 本服 # @author hxp # @date 2020-12-07 # @version 1.0 # # 详细描述: 竞技场 - 本服 # #------------------------------------------------------------------------------- #"""Version = 2020-12-07 19:30""" #------------------------------------------------------------------------------- import ShareDefine import GameFuncComm import PlayerControl import IpyGameDataPY import ChPyNetSendPack import NetPackCommon import GameWorld import ChConfig import FBCommon import IPY_GameWorld import ItemControler def DoArenaOpen(curPlayer): ## 竞技场功能开启 __DoArenaSeasonReset(curPlayer) return def OnLogin(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return OSSeasonState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaOSSeasonState) if not OSSeasonState: __DoArenaSeasonReset(curPlayer) else: Sync_ArenaInfo(curPlayer) return def OnDayEx(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaItemAddCount, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleCountDay, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, 0) Sync_ArenaInfo(curPlayer) openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) if openServerDay <= customMaxServerDay: GameWorld.DebugLog("OnDayEx时竞技场开服定制赛季进行中,不处理! openServerDay=%s <= %s" % (openServerDay, customMaxServerDay)) return OSSeasonState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaOSSeasonState) if OSSeasonState > 1: GameWorld.DebugLog("OnDayEx时竞技场开服定制赛季已结算过,不处理! OSSeasonState=%s" % (OSSeasonState)) return __DoArenaSeasonReset(curPlayer) return def OnWeekEx(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) if openServerDay <= customMaxServerDay: GameWorld.DebugLog("OnWeekEx时在开服定制天内,不处理竞技场赛季重置! openServerDay=%s <= %s" % (openServerDay, customMaxServerDay)) return OSSeasonState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaOSSeasonState) if not OSSeasonState or OSSeasonState == 1 or OSSeasonState == openServerDay: GameWorld.DebugLog("OnWeekEx时竞技场开服定制赛季进行中或同一天结算,不处理重置! openServerDay=%s,OSSeasonState=%s" % (openServerDay, OSSeasonState)) return __DoArenaSeasonReset(curPlayer) return def __DoArenaSeasonReset(curPlayer): ## 玩家重置竞技场 OSSeasonState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaOSSeasonState) openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) if openServerDay <= customMaxServerDay and OSSeasonState != 0: GameWorld.DebugLog("开服定制天内不能重置!") return minScore, maxScore = IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 1) setScore = minScore if openServerDay <= customMaxServerDay and OSSeasonState == 0: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaOSSeasonState, 1) GameWorld.DebugLog("竞技场开服定制赛季! setScore=%s" % setScore) else: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaOSSeasonState, customMaxServerDay + 1) # 按比例降低积分,都减去最低分的差值算比例 setScoreMax = IpyGameDataPY.GetFuncCfg("ArenaSet", 2) preSeasonscore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) if preSeasonscore <= minScore: setScore = minScore elif preSeasonscore >= maxScore: setScore = setScoreMax else: calcScore = preSeasonscore - minScore setScore = minScore + int(calcScore * (setScoreMax - minScore) / float(maxScore - minScore)) GameWorld.DebugLog("竞技场赛季重置! preSeasonscore=%s,setScore=%s" % (preSeasonscore, setScore)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, setScore) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaItemAddCount, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleCountDay, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, 0) Sync_ArenaInfo(curPlayer) return def CheckArenaBattleCount(curPlayer): ## 验证是否还有对战次数 todayBattleCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleCountDay) itemAddCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaItemAddCount) dayFreeCount = IpyGameDataPY.GetFuncCfg("ArenaSet", 3) return todayBattleCount < (dayFreeCount + itemAddCount) #// B2 09 竞技场匹配玩家 #tagCMArenaMatch # #struct tagCMArenaMatch #{ # tagHead Head; # BYTE IsRefresh; // 0-打开界面无匹配数据时时查询,1-强制刷新匹配列表 #}; def OnArenaMatch(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) isRefresh = clientData.IsRefresh playerID = curPlayer.GetPlayerID() refreshCountLimit = IpyGameDataPY.GetFuncCfg("ArenaSet", 5) if isRefresh and refreshCountLimit: refreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaMatchRefreshCount) if refreshCount >= refreshCountLimit: GameWorld.DebugLog("竞技场刷新匹配玩家次数已满!refreshCount=%s >= %s" % (refreshCount, refreshCountLimit), playerID) return if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_Arena, tick): GameWorld.DebugLog("竞技场匹配操作CD中...", playerID) PlayerControl.NotifyCode(curPlayer, "RequestLater") return playerLV = curPlayer.GetLV() playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) msgInfo = str(["MatchRefresh", {"isRefresh":isRefresh, "playerLV":playerLV, "playerScore":playerScore}]) GameWorld.DebugLog("竞技场发送GameServer匹配: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "Arena", msgInfo, len(msgInfo)) return #// B2 10 竞技场挑战玩家 #tagCMArenaBattle # #struct tagCMArenaBattle #{ # tagHead Head; # DWORD TagPlayerID; // 目标玩家ID或机器人ID # BYTE Result; // 0-进入自定义场景发送通知后端;1-胜利(后端处理,暂时不需要发送此状态);2-失败(前端被对手击杀需要发送此状态) #}; def OnArenaBattle(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() tagPlayerID = clientData.TagPlayerID result = clientData.Result GameWorld.DebugLog("竞技场挑战玩家! tagPlayerID=%s,result=%s" % (tagPlayerID, result), playerID) if not tagPlayerID: return if not result: GameWorld.DebugLog("更新竞技场对战对手ID! tagPlayerID=%s" % tagPlayerID, playerID) # 记录对手ID PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleTagID, tagPlayerID) return isWin = 1 if result == 1 else 0 # 木桩被击杀,后端判断,其他前端同步 if isWin: GameWorld.ErrLog("前端不能同步竞技场胜利状态!", playerID) return recTagPlayerID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleTagID) GameWorld.DebugLog("竞技场被对手击杀! tagPlayerID=%s,recTagPlayerID=%s" % (tagPlayerID, recTagPlayerID), playerID) if tagPlayerID != recTagPlayerID: GameWorld.ErrLog("竞技场结算时对手ID不一致! tagPlayerID(%s) != recTagPlayerID(%s)" % (tagPlayerID, recTagPlayerID), playerID) __DoArenaBattleOver(curPlayer) return # 失败结算入口: 前端同步 SendGameServer_ArenaBattleOver(curPlayer, isWin) return def OnKillBattleNPC(curPlayer, curNPC): ## 击杀对手,前端本,使用木桩NPC作为对手 if curNPC.GetGameObjType() != IPY_GameWorld.gotNPC or curNPC.GetType() not in [ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]: GameWorld.DebugLog("击杀非木桩NPC,不结算!") return # 胜利结算入口:后端验证击杀对手 tagPlayerID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleTagID) GameWorld.DebugLog("竞技场击杀对手! tagPlayerID=%s" % tagPlayerID, curPlayer.GetPlayerID()) isWin = 1 SendGameServer_ArenaBattleOver(curPlayer, isWin) return def SendGameServer_ArenaBattleOver(curPlayer, isWin): ## 发送GameServer通知战斗结算 playerID = curPlayer.GetPlayerID() tagPlayerID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleTagID) if not tagPlayerID: GameWorld.ErrLog("竞技场结算时没有对手ID!", playerID) __DoArenaBattleOver(curPlayer) return if not CheckArenaBattleCount(curPlayer): GameWorld.ErrLog("竞技场已经没有对战次数!", playerID) __DoArenaBattleOver(curPlayer) return tick = GameWorld.GetGameWorld().GetTick() if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_Arena, tick): GameWorld.ErrLog("结算竞技场CD中!tagPlayerID=%s" % tagPlayerID, playerID) return 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()}]) GameWorld.DebugLog("竞技场发送GameServer结算: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "Arena", msgInfo, len(msgInfo)) return def __DoArenaBattleOver(curPlayer, retDict={}): ## 主动战斗结算奖励 # @param isOK: True时才结算奖励,防止某些异常情况无法结算通知前端FBOver,导致卡副本 GameWorld.DebugLog("结算竞技场对战奖励! retDict=%s" % retDict) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleTagID, 0) isOK = retDict.get("isOK", False) isWin = retDict.get("isWin", 0) if not isOK: # 一直异常的情况直接同步结束包,防止不结算卡副本 FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ArenaBattle, 0, isWin) return #GameServer MapServer 同步有一定时间差,本功能存在被动挑战引发积分变动的情况, #curScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) addScore = retDict["addScore"] updScore = retDict["updScore"] curOrder = retDict["curOrder"] updOrder = retDict["updOrder"] # 扣次数 todayBattleCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleCountDay) + 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleCountDay, todayBattleCount) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, 0) # 更新积分 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, updScore) # 胜利给额外奖励 itemList = retDict.get("awardItemList", []) ItemControler.GivePlayerItemOrMail(curPlayer, itemList) jsonItemList = FBCommon.GetJsonItemList(itemList) overDict = {FBCommon.Over_itemInfo:jsonItemList, "addScore":addScore, "updScore":updScore, "curOrder":curOrder, "updOrder":updOrder} FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ArenaBattle, 0, isWin, overDict) Sync_ArenaInfo(curPlayer) return def __DoUpdateArenaScore(curPlayer, cmdDict={}): ''' 玩家直接更新积分,有以下几种情况,都是被挑战的,只更新积分 1. 被动挑战在线时直接更新积分 2. 离线/脱机时被挑战,上线后同步最新积分 ''' playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) updScore = cmdDict.get("updScore", playerScore) if updScore == playerScore: return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, updScore) Sync_ArenaInfo(curPlayer) return def GameServer_ArenaResult(curPlayer, msgList, tick): if not msgList: return cmd = msgList[0] cmdDict = msgList[1] if len(msgList) > 1 else {} retDict = msgList[2] if len(msgList) > 2 else {} # 刷新匹配 if cmd == "MatchRefresh": isRefresh = cmdDict.get("isRefresh", False) refreshCountLimit = IpyGameDataPY.GetFuncCfg("ArenaSet", 5) if isRefresh and refreshCountLimit: updRefreshCount = min(250, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaMatchRefreshCount) + 1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, updRefreshCount) GameWorld.DebugLog("更新竞技场刷新匹配次数! updRefreshCount=%s" % updRefreshCount) Sync_ArenaInfo(curPlayer) # 主动对战结果 elif cmd == "BattleResult": __DoArenaBattleOver(curPlayer, retDict) # 被动挑战更新积分 elif cmd == "UpdScore": __DoUpdateArenaScore(curPlayer, cmdDict) return def Sync_ArenaInfo(curPlayer): clientPack = ChPyNetSendPack.tagMCArenaPlayerInfo() clientPack.Score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) clientPack.BattleCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleCountDay) clientPack.MatchRefreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaMatchRefreshCount) clientPack.ItemAddBattleCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaItemAddCount) NetPackCommon.SendFakePack(curPlayer, clientPack) return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -6160,55 +6160,6 @@ #=============================================================================== # #@warning: ExAttr6~ExAttr10, 新增2个布尔默认参数, 是否通知客户端, 是否通知GameServer, 默认值为False #=============================================================================== ##设置决斗值(竞技场用) # @param curPlayer 玩家 # @param value 数值 # @return None def SetVsFightValue(curPlayer, value): return ##获取决斗值(竞技场用) # @param curPlayer 玩家 # @return 决斗值 def GetVsFightValue(curPlayer): return 0 ##获取竞技点(竞技场用) # @param curPlayer 玩家 # @return 竞技点 def GetVsSportsPoint(curPlayer): return 0 ##设置竞技点(不可直接调用) # @param curPlayer 玩家 # @return def __SetVsSportsPoint(curPlayer, value): return ##竞技点减少(竞技场用) # @param curPlayer 玩家 # @return def ReduceVsSportsPoint(curPlayer, value): curValue = GetVsSportsPoint(curPlayer) #调用接口 __SetVsSportsPoint(curPlayer, max(0, curValue - value)) #lostValue 您失去了{%S1%}点竞技点 NotifyCode(curPlayer, "Arena_pan_474794", [value]) return ##获得龙脉等级 # @param curPlayer 玩家 # @return 龙脉等级 def GetLongMaiLV(curPlayer): return 0 ##设置龙脉等级 # @param curPlayer 玩家 # @param value 数值 # @return None def SetLongMaiLV(curPlayer, value): return #--------------------------------------------------------------------------- ##获取可免费开启的格子数 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -99,6 +99,7 @@ import FBHelpBattle import QuestManager import PlayerAssist import PlayerArena import PyGameData import PlayerTJG @@ -557,6 +558,8 @@ PlayerFairyDomain.OnDay(curPlayer) #仙盟宴会 GameLogic_FamilyParty.OnDayFamilyPartyPlayer(curPlayer) #竞技场 PlayerArena.OnDayEx(curPlayer) #协助 PlayerAssist.DoPlayerOnDay(curPlayer) @@ -686,6 +689,8 @@ elif onEventType == ShareDefine.Def_OnEventTypeEx: #触发每周任务重置脚本 EventShell.EventResponse_OnWeek(curPlayer) #竞技场 PlayerArena.OnWeekEx(curPlayer) PlayerFamily.OnWeekEx(curPlayer) # 以下为支持两种重置模式切换配置的 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_Arena.py
New file @@ -0,0 +1,54 @@ #!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.RemoteQuery.GY_Query_Arena # # @todo:竞技场 # @author hxp # @date 2020-12-07 # @version 1.0 # # 详细描述: 竞技场 # #------------------------------------------------------------------------------- #"""Version = 2020-12-07 19:30""" #------------------------------------------------------------------------------- import GameWorld import PlayerArena import ChConfig #--------------------------------------------------------------------- #逻辑实现 ## 请求逻辑 # @param query_Type 请求类型 # @param query_ID 请求的玩家ID # @param packCMDList 发包命令 [ ] # @param tick 当前时间 # @return "True" or "False" or "" # @remarks 函数详细说明. def DoLogic(query_Type, query_ID, packCMDList, tick): GameWorld.DebugLog("GY_Query_Arena DoLogic %s" % str(packCMDList), query_ID) curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(query_ID) if not curPlayer or curPlayer.IsEmpty(): return PlayerArena.GameServer_ArenaResult(curPlayer, packCMDList, tick) return "" #--------------------------------------------------------------------- #执行结果 ## 执行结果 # @param curPlayer 发出请求的玩家 # @param callFunName 功能名称 # @param funResult 查询的结果 # @param tick 当前时间 # @return None # @remarks 函数详细说明. def DoResult(curPlayer, callFunName, funResult, tick): GameWorld.DebugLog("GY_Query_Arena DoResult %s" % str(funResult), curPlayer.GetPlayerID()) if funResult != "": PlayerArena.GameServer_ArenaResult(curPlayer, eval(funResult), tick) curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_Arena, 0) return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -658,9 +658,10 @@ Def_BT_Campaign_Wash, #洗练战力(开服活动榜) Def_BT_SkyTower, #天星塔榜 Def_BT_Arena, #竞技场榜 Def_BT_Max, #排行榜最大类型 ) = range(0, 27 + 2) ) = range(0, 28 + 2) #职业对应战力排行榜类型 JobFightPowerBillboardDict = { @@ -969,6 +970,7 @@ GameFuncID_TJG = 147 # 脱机挂 GameFuncID_SuperGift = 150 # 超值礼包 GameFuncID_ZhuXianBoss = 163 # 诛仙BOSS GameFuncID_Arena = 189 # 竞技场 # 以下为暂时无用的 GameFuncID_Truck = 33 # 运镖 GameFuncID_RunDaily = 34 # 日常跑环 @@ -1057,7 +1059,7 @@ Def_UniversalGameRecType_LuckyTreasure, #幸运鉴宝大奖记录12 Def_UniversalGameRecType_FairyDomain, #缥缈仙域事件次数记录13 Def_UniversalGameRecType_Reward, # 通用奖励表(TopBar)14 Def_UniversalGameRecType_15, Def_UniversalGameRecType_ArenaBattleRecord, # 竞技场玩家挑战记录 15 Def_UniversalGameRecType_16, Def_UniversalGameRecType_17, Def_UniversalGameRecType_18,