From bf0562bdddb65952b4e59c4911fa26c6996b748d Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期二, 22 一月 2019 14:40:10 +0800 Subject: [PATCH] 5919 【后端】【1.5.100】诛仙塔功能开发(排行榜修改) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ElderBattlefield.py | 391 +++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 278 insertions(+), 113 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ElderBattlefield.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ElderBattlefield.py index a3816d1..09ce446 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ElderBattlefield.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ElderBattlefield.py @@ -34,6 +34,8 @@ import NPCCustomRefresh import SkillShell import EventReport +import SkillCommon +import PlayerWeekParty import random import time @@ -41,44 +43,55 @@ #------------------------------------------------------------------------------ # - # 副本玩家字典key -FBPlayerDict_Score = 'FBPD_Score%s' # 玩家当前积分 -FBPlayerDict_KillCnt = 'FBPD_KillCnt' # 玩家当前杀敌数 -FBPD_LastCheckTick = 'FBPD_LastCheckTick' # 检查刷怪时间 -FBPlayerDict_ContKillCntEx = 'FBPD_ContKillCntEx' # 玩家当前总连杀数 -FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp%s' # 获得的总经验 -FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint%s' # 获得的总经验点 -FBPlayerDict_EnemyID = 'FBPD_EnemyID' # 玩家最近一个仇敌ID -Map_ElderBattlefield_StartTick = "Map_ElderBattlefield_StartTick" # 副本开始时间 -Map_ElderBattlefield_TopPlayer = "Map_ElderBattlefield_TopPlayer" # 积分王 - +FBPlayerDict_Score = 'FBPD_Score%s' # 玩家当前积分 +FBPlayerDict_KillCnt = 'FBPD_KillCnt' # 玩家当前杀敌数 +FBPD_LastCheckTick = 'FBPD_LastCheckTick' # 检查刷buff时间 +FBPD_LastCheckTick1 = 'FBPD_LastCheckTick1' # 检查刷机器人时间 +FBPlayerDict_ContKillCntEx = 'FBPD_ContKillCntEx' # 玩家当前总连杀数 +FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp%s' # 获得的总经验 +FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint%s' # 获得的总经验点 +FBPlayerDict_EnemyID = 'FBPD_EnemyID' # 玩家最近一个仇敌ID +FBPlayerDict_RebornBuffLV = 'RebornBuffLV' # 玩家当前复活BUFFLV +Map_ElderBattlefield_StartTick = "Map_ElderBattlefield_StartTick" # 副本开始时间 +Map_ElderBattlefield_TopPlayer = "Map_ElderBattlefield_TopPlayer" # 积分王 # +( +Def_PlayerCnt, # 真人数量 +Def_RobotCnt, # 机器人最大数量 +Def_TotalCnt, # 真人+机器人总和 +) = range(3) #当前副本地图的状态 ( -FB_Step_Open, # 副本开启 -FB_Step_Fighting, # 副本进行中 -FB_Step_Over, # 副本结束 +FB_Step_Open, # 副本开启 +FB_Step_Fighting, # 副本进行中 +FB_Step_Over, # 副本结束 ) = range(3) + +def OnFBPlayerOnLogin(curPlayer): + mapID = GameWorld.GetMap().GetMapID() + if mapID != ChConfig.Def_FBMapID_ElderBattlefield: + OnElderBattlefieldFBResult(curPlayer, True) + return def OnElderBattlefieldStateChange(state, tick): #活动状态变更 - mapID = GameWorld.GetMap().GetMapID() - if mapID != ChConfig.Def_FBMapID_ElderBattlefield: - return +# mapID = GameWorld.GetMap().GetMapID() +# if mapID != ChConfig.Def_FBMapID_ElderBattlefield: +# return GameWorld.DebugLog(' 上古战场活动状态变更 state=%s' % state) if state == 1: GameWorld.GetGameWorld().SetGameWorldDict(Map_ElderBattlefield_StartTick, tick) GameWorld.GetGameWorld().SetGameWorldDict(Map_ElderBattlefield_TopPlayer, 0) -# else: -# GiveJoinPrize() -# FBCommon.DoLogic_FBKickAllPlayer() -# GameWorldProcess.CloseFB(tick) + else: + GiveJoinPrize() + return + ##开启副本 # @param tick 时间戳 @@ -115,6 +128,7 @@ return True + ##是否可以进入 # @param ask 请求结构体 # @param tick 时间戳 @@ -124,6 +138,7 @@ #可进入 return IPY_GameWorld.cmeAccept + ##玩家进入副本 # @param curPlayer 玩家实例 @@ -144,18 +159,24 @@ return curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, closeFB_RemainTick, True) + if not FBCommon.GetHadSetFBPropertyMark(): + lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 + FBCommon.SetFBPropertyMark(lineID) + if not FBCommon.GetHadDelTicket(curPlayer): FBCommon.SetHadDelTicket(curPlayer) - FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0) - GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_Score % playerID, 0) - GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_TotalExp % playerID, 0) - GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, 0) - EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield, 0, ChConfig.CME_Log_Start) - + if FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield): + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0) + GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_Score % playerID, 0) + GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_TotalExp % playerID, 0) + GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, 0) + EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield, 0, ChConfig.CME_Log_Start) + PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_ElderBattlefield, 1) + else: + rebornBuffLV = GameWorld.GetGameFB().GetPlayerGameFBDictByKey(playerID, FBPlayerDict_RebornBuffLV) + __DoAddRebornBuff(curPlayer, rebornBuffLV, tick) DoFBHelp(curPlayer, tick) return - ##副本玩家进入点, 玩家分散在半径3格范围 @@ -168,6 +189,7 @@ def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): return random.choice(ipyEnterPosInfo) + ## 获取层随机坐标点 def __GetRandPos(): ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_ElderBattlefield, 0) @@ -175,6 +197,7 @@ dist = 3 if len(enterPos) <= 2 else enterPos[2] posPoint = GameMap.GetEmptyPlaceInArea(enterPos[0], enterPos[1], dist) return posPoint.GetPosX(), posPoint.GetPosY() + ##玩家退出副本 # @param curPlayer 玩家实例 @@ -184,21 +207,33 @@ buffIDList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldBuff') for buffID in buffIDList: BuffSkill.DelBuffBySkillID(curPlayer, buffID, tick) + + skillBuffID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot', 3) + BuffSkill.DelBuffBySkillID(curPlayer, skillBuffID, tick) + FBCommon.UpdFBLineNPCStrengthenLV(curPlayer.GetPlayerID(), True) return + ##玩家主动离开副本. # @param curPlayer 玩家实例 # @param tick 时间戳 # @return 返回值无意义 def DoPlayerLeaveFB(curPlayer, tick): - OnElderBattlefieldFBResult(curPlayer) + return ##玩家切换地图 def DoPlayerChangeMapLogic(curPlayer): - OnElderBattlefieldFBResult(curPlayer) + #副本的连杀,仇敌,死亡BUFF重置,积分不重置 + + playerID = curPlayer.GetID() + gameFB = GameWorld.GetGameFB() + gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_ContKillCntEx, 0) + gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_EnemyID, 0) + gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_RebornBuffLV, 0) return + ##副本总逻辑计时器 # @param tick 时间戳 @@ -212,13 +247,25 @@ FBCommon.SetFBStep(FB_Step_Fighting, tick) elif fbStep == FB_Step_Fighting: if not FBCommon.GetFBFuncOpenState(ChConfig.Def_FBMapID_ElderBattlefield): - GiveJoinPrize() + #GiveJoinPrize() + #积分王 + topPlayerID = GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer) + if topPlayerID: + topAwardList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldTopAward') + if topAwardList: + PlayerControl.SendMailByKey("ElderBattlefieldTopMail", [topPlayerID], topAwardList) + PlayerControl.WorldNotify(0, 'ElderBattlefieldBest', [PyGameData.g_sgzztopPlayerName, topAwardList[0][0]]) + GameWorld.GetGameWorld().SetGameWorldDict(Map_ElderBattlefield_TopPlayer, 0) + + FBCommon.SetFBStep(FB_Step_Over, tick) FBCommon.DoLogic_FBKickAllPlayer() GameWorldProcess.CloseFB(tick) else: __CheckRefreshBuffNPC(tick) + __RefreshRobot(tick) return + def __CheckRefreshBuffNPC(tick): #检查buffnpc刷怪 @@ -229,13 +276,13 @@ return gameFB.SetGameFBDict(FBPD_LastCheckTick, tick) - allRmark = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldBuff',3) - maxCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldBuff',4) + allRmark = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldBuff', 3) + maxCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldBuff', 4) - rmarkList = [] #可刷怪的标识点 + rmarkList = [] #可刷怪的标识点 npcCnt = 0 gameNPC = GameWorld.GetNPCManager() - for i in range(0, gameNPC.GetCustomNPCRefreshCount()): + for i in xrange(gameNPC.GetCustomNPCRefreshCount()): npcRefresh = gameNPC.GetCustomNPCRefreshAt(i) rmark = npcRefresh.GetRefreshMark() if rmark not in allRmark: @@ -243,17 +290,79 @@ npcCnt += npcRefresh.GetCount() if not npcRefresh.GetCount(): rmarkList.append(rmark) - - needAddCnt = maxCnt- npcCnt + needAddCnt = maxCnt - npcCnt if not needAddCnt: return random.shuffle(rmarkList) - npcID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldBuff',2) + npcID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldBuff', 2) for rMark in rmarkList[:needAddCnt]: NPCCustomRefresh.SetNPCRefresh(rMark, [(npcID, 1)], 1, 1) - NPCCustomRefresh.ProcessAllNPCRefresh(tick) # 立即出发一次标识点刷新 + NPCCustomRefresh.ProcessAllNPCRefresh(tick) # 立即出发一次标识点刷新 + return + + +def __RefreshRobot(tick): + ##刷新机器人 + gameFB = GameWorld.GetGameFB() + lastCheckTick = gameFB.GetGameFBDictByKey(FBPD_LastCheckTick1) + if lastCheckTick and tick - lastCheckTick < 2000: + return + gameFB.SetGameFBDict(FBPD_LastCheckTick1, tick) + fblineid = GameWorld.GetGameWorld().GetLineID() + g_elderBattleRobotDieList = PyGameData.g_elderBattleRobotDieDict.get(fblineid, []) + robotCfgDict = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 3, {}) + lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 + if lineID not in robotCfgDict: + return + robotMaxLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenMaxLV) + if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() <= 0 or not robotMaxLV: + #GameWorld.DebugLog("没玩家,不刷机器人! ") + return + rmarkList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 5) + curNPCCnt = 0 + robotCntDict = {} + gameNPC = GameWorld.GetNPCManager() + for i in xrange(gameNPC.GetCustomNPCRefreshCount()): + npcRefresh = gameNPC.GetCustomNPCRefreshAt(i) + rmark = npcRefresh.GetRefreshMark() + if rmark not in rmarkList: + continue + cnt = npcRefresh.GetCount() + robotCntDict[rmark] = cnt + curNPCCnt += cnt + + robotCfg = robotCfgDict[lineID] + curPlayerCnt = GameWorld.GetMapCopyPlayerManager().GetPlayerCount() + maxRobotCnt = min(robotCfg[Def_TotalCnt] - curPlayerCnt, robotCfg[Def_RobotCnt]) + extraCnt = maxRobotCnt - curNPCCnt - len(g_elderBattleRobotDieList) + rebornTime = IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot') + rebornCnt = 0 + for dieTick in g_elderBattleRobotDieList: + if tick - dieTick < rebornTime * 1000: + break + rebornCnt += 1 + PyGameData.g_elderBattleRobotDieDict[fblineid] = g_elderBattleRobotDieList[rebornCnt:] + refreshCnt = rebornCnt + extraCnt + #GameWorld.DebugLog(' 刷新机器人 rebornCnt=%s,extraCnt=%s,refreshCnt=%s,robotCntDict=%s'%(rebornCnt, extraCnt,refreshCnt,robotCntDict)) + if refreshCnt > 0: + npcID = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 2, {}).get(lineID, 0) + if not npcID: + return + + random.shuffle(rmarkList) + hasRefreshCnt = 0 + for i, rMark in enumerate(rmarkList): + if hasRefreshCnt >=refreshCnt: + break + curCnt = robotCntDict.get(rMark, 0) + cnt = 1 if i < len(rmarkList)-1 else refreshCnt-hasRefreshCnt + hasRefreshCnt += cnt + curMaxCnt = curCnt+cnt + NPCCustomRefresh.SetNPCRefresh(rMark, [(npcID, cnt)], curMaxCnt, cnt) + NPCCustomRefresh.ProcessAllNPCRefresh(tick) + return @@ -262,32 +371,27 @@ # @return 无意义 # @remarks 战斗逻辑 def GiveJoinPrize(): - copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() - for i in xrange(copyMapPlayerManager.GetPlayerCount()): - - curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) - - if curPlayer == None or curPlayer.IsEmpty(): + playerManager = GameWorld.GetPlayerManager() + for i in xrange(playerManager.GetPlayerCount()): + curPlayer = playerManager.GetPlayerByIndex(i) + if curPlayer == None or not curPlayer.GetInitOK(): continue OnElderBattlefieldFBResult(curPlayer) - #积分王 - topPlayerID = GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer) - if topPlayerID: - topAwardList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldTopAward') - if topAwardList: - PlayerControl.SendMailByKey("ElderBattlefieldTopMail", [topPlayerID], topAwardList) - PlayerControl.WorldNotify(0, 'ElderBattlefieldBest', [PyGameData.g_sgzztopPlayerName, topAwardList[0][0]]) - GameWorld.GetGameWorld().SetGameWorldDict(Map_ElderBattlefield_TopPlayer, 0) + return -def OnElderBattlefieldFBResult(curPlayer): + +def OnElderBattlefieldFBResult(curPlayer, isLogin=False): # 玩家处理上古战场结算信息 - GameWorld.DebugLog(' 玩家处理上古战场结算信息 %s' % curPlayer.GetPlayerID()) - lineID = 0 #GameWorld.GetGameWorld().GetPropertyID() -1 + curStage = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0) + if not curStage: + return + GameWorld.DebugLog(' 玩家处理上古战场结算信息 , isLogin=%s' % isLogin, curPlayer.GetPlayerID()) + lineID = 0 #GameWorld.GetGameWorld().GetPropertyID() -1 fbRewardDict = FBCommon.GetFBLineReward(ChConfig.Def_FBMapID_ElderBattlefield, lineID) - curStage = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0) + itemList = fbRewardDict.get(curStage, []) succIDList = PlayerSuccess.GetCanGetAwardSuccByType(curPlayer, [ShareDefine.SuccType_ElderBattlefieldKill, ShareDefine.SuccType_ElderBattlefieldConKill]) succAwardDict = PlayerSuccess.GiveSuccAward(curPlayer, succIDList, False) @@ -298,20 +402,20 @@ rewardItemList.append([itemID, itemCnt, 1]) for itemID, itemCnt in succAwardDict.items(): rewardItemList.append([itemID, itemCnt, 1]) - needSpace = len(rewardItemList) emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) - if emptySpace < needSpace: - PlayerControl.SendMailByKey("ElderBattlefieldMail", [curPlayer.GetPlayerID()], rewardItemList) + mapID = GameWorld.GetMap().GetMapID() + if mapID != ChConfig.Def_FBMapID_ElderBattlefield or isLogin or emptySpace < needSpace: + PlayerControl.SendMailByKey("ElderBattlefieldMail" if mapID == ChConfig.Def_FBMapID_ElderBattlefield else 'ElderBattlefieldMail2', [curPlayer.GetPlayerID()], rewardItemList) else: for itemID, itemCnt, isBind in rewardItemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem], event=["ElderBattlefield", False, {}]) - overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), FBCommon.Over_succItemInfo:FBCommon.GetJsonItemList(succAwardDict.items())} - FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield, lineID, 1, overDict) + + overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), FBCommon.Over_succItemInfo:FBCommon.GetJsonItemList(succAwardDict.items())} + FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield, lineID, 1, overDict) #结算过,重置阶段 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0) return - def __AddElderBattlefieldPlayerScore(curPlayer, gameFB, addValue): @@ -367,6 +471,7 @@ #--------------------------------------------------------------------- + ##获得副本帮助信息, 用于通知阵营比分条 # @param curPlayer 玩家实例 # @param tick 时间戳 @@ -374,6 +479,7 @@ # @remarks 用于通知阵营比分条 def DoFBHelp(curPlayer, tick): gameWorld = GameWorld.GetGameWorld() + lineID = gameWorld.GetLineID() playerID = curPlayer.GetPlayerID() score = gameWorld.GetGameWorldDictByKey(FBPlayerDict_Score % playerID) stageScoreList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 4) @@ -392,11 +498,16 @@ helpDict['topScore'] = topScore if topPlayerID else 0 helpDict['topPlayerID'] = topPlayerID #helpDict[FBCommon.Help_lineID] = GameWorld.GetGameWorld().GetLineID() - helpDict['enemyID'] = GameWorld.GetGameFB().GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EnemyID) + helpDict['enemyID'] = GameWorld.GetGameFB().GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EnemyID) + helpDict[FBCommon.Help_robotJob] = PyGameData.g_fbRobotJobDict.get(lineID, {}) GameWorld.DebugLog("DoFBHelp %s" % helpDict, playerID) FBCommon.Notify_FBHelp(curPlayer, helpDict) return +def DoFBOnNPCKill_Player(curNPC, curPlayer, tick): + if curNPC.GetNPCID() in IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 2, {}).values(): + DoFBOnKill_Player(curNPC, curPlayer, tick) + return ##处理副本中杀死玩家逻辑 # @param curPlayer 玩家实例 @@ -404,54 +515,70 @@ # @param tick 时间戳 # @return 布尔值 # @remarks 处理副本中杀死玩家逻辑 -def DoFBOnKill_Player(curPlayer, defender, tick): +def DoFBOnKill_Player(atkobj, defender, tick): gameFB = GameWorld.GetGameFB() - playerID = curPlayer.GetPlayerID() - GameWorld.DebugLog("DoFBOnKill_Player", playerID) - - addScore = IpyGameDataPY.GetFuncCfg('ElderBattlefieldCfg', 2) - updScore = __AddElderBattlefieldPlayerScore(curPlayer, gameFB, addScore) - - # 击杀方处理 - killCnt = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_KillCnt) + 1 # 击杀数 - gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_KillCnt, killCnt) - contKillCntEx = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_ContKillCntEx) + 1 # 连杀数 - gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_ContKillCntEx, contKillCntEx) - #连杀广播 - ckillSysList = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 1) + atkIsPlayer = atkobj.GetGameObjType() == IPY_GameWorld.gotPlayer baseCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 2) - perCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 3) - if contKillCntEx >= baseCnt and contKillCntEx % perCnt == 0: - sysIndex = min((contKillCntEx - baseCnt) / perCnt, len(ckillSysList)-1) - PlayerControl.FBNotify(ckillSysList[sysIndex], [curPlayer.GetName(), contKillCntEx]) - PlayerControl.NotifyCode(curPlayer, 'AncientBattlefield_10', [contKillCntEx]) - if contKillCntEx == 5: - PlayerControl.NotifyCode(curPlayer, 'AncientBattlefield_10', [5]) - - # 击杀方成就 - PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_ElderBattlefieldKill, 1) - PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_ElderBattlefieldConKill, 1, [contKillCntEx]) + addScore = 0 + if atkIsPlayer: + playerID = atkobj.GetPlayerID() + GameWorld.DebugLog("DoFBOnKill_Player", playerID) + # 击杀方处理 + killCnt = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_KillCnt) + 1 # 击杀数 + gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_KillCnt, killCnt) + if killCnt == 1:#首杀提示 + PlayerControl.NotifyCode(atkobj, 'AncientBattlefield_10', [1]) + + contKillCntEx = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_ContKillCntEx) + 1 # 连杀数 + gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_ContKillCntEx, contKillCntEx) + #连杀广播 + ckillSysList = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 1) + + perCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 3) + if contKillCntEx >= baseCnt and contKillCntEx % perCnt == 0: + sysIndex = min((contKillCntEx - baseCnt) / perCnt, len(ckillSysList) - 1) + PlayerControl.FBNotify(ckillSysList[sysIndex], [atkobj.GetName(), contKillCntEx]) + PlayerControl.NotifyCode(atkobj, 'AncientBattlefield_10', [contKillCntEx]) + if contKillCntEx == 5: + PlayerControl.NotifyCode(atkobj, 'AncientBattlefield_10', [5]) + + # 击杀方成就 + PlayerSuccess.DoAddSuccessProgress(atkobj, ShareDefine.SuccType_ElderBattlefieldKill, 1) + PlayerSuccess.DoAddSuccessProgress(atkobj, ShareDefine.SuccType_ElderBattlefieldConKill, 1, [contKillCntEx]) + + addScore = IpyGameDataPY.GetFuncCfg('ElderBattlefieldCfg', 2) # 被杀方处理 - tagPlayerID = defender.GetPlayerID() - defContKillCntEx = gameFB.GetPlayerGameFBDictByKey(tagPlayerID, FBPlayerDict_ContKillCntEx) - if defContKillCntEx >=baseCnt: - PlayerControl.FBNotify('AncientBattlefield_7', [curPlayer.GetName(), defender.GetName(),defContKillCntEx]) - - gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_ContKillCntEx, 0) - #记录仇人 - gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_EnemyID, playerID) - if tagPlayerID == gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EnemyID): - #击杀仇人广播 - PlayerControl.NotifyCode(curPlayer, 'AncientBattlefield_8') - gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_EnemyID, 0) - - GameWorld.DebugLog("击杀玩家: 击杀=%s,连杀=%s,tagPlayerID=%s,updScore=%s" - % (killCnt, contKillCntEx, tagPlayerID, updScore), playerID) - - DoFBHelp(curPlayer, tick) - DoFBHelp(defender, tick) + tagPlayerID = 0 + if defender.GetGameObjType() == IPY_GameWorld.gotPlayer: + tagPlayerID = defender.GetPlayerID() + defContKillCntEx = gameFB.GetPlayerGameFBDictByKey(tagPlayerID, FBPlayerDict_ContKillCntEx) + if defContKillCntEx >= baseCnt: + if atkIsPlayer: + PlayerControl.FBNotify('AncientBattlefield_7', [atkobj.GetName(), defender.GetName(), defContKillCntEx]) + else: + PlayerControl.FBNotify('AncientBattlefield_robot', [atkobj.GetNPCID(), atkobj.GetID(), defender.GetName(), defContKillCntEx]) + gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_ContKillCntEx, 0) + #记录仇人 + if atkIsPlayer: + + gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_EnemyID, playerID) + if tagPlayerID == gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EnemyID): + #击杀仇人广播 + PlayerControl.NotifyCode(atkobj, 'AncientBattlefield_8') + gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_EnemyID, 0) + addScore += IpyGameDataPY.GetFuncCfg('ElderBattlefieldPoint', 2) + if tagPlayerID == GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer): + addScore += IpyGameDataPY.GetFuncCfg('ElderBattlefieldPoint', 1) + + if atkIsPlayer: + updScore = __AddElderBattlefieldPlayerScore(atkobj, gameFB, addScore) + GameWorld.DebugLog("击杀玩家: 击杀=%s,连杀=%s,tagPlayerID=%s,updScore=%s" + % (killCnt, contKillCntEx, tagPlayerID, updScore), playerID) + DoFBHelp(atkobj, tick) + if defender.GetGameObjType() == IPY_GameWorld.gotPlayer: + DoFBHelp(defender, tick) return True @@ -465,7 +592,9 @@ fbStep = gameFB.GetFBStep() # if fbStep != FB_State_Fight: # return - + if curNPC.GetNPCID() in IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 2, {}).values(): + DoFBOnKill_Player(curPlayer, curNPC, tick) + __OnRobotDie(tick) npcid = curNPC.GetNPCID() killNPCScoreDict = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 1) addScore = killNPCScoreDict.get(npcid) @@ -473,6 +602,20 @@ return __AddElderBattlefieldPlayerScore(curPlayer, gameFB, addScore) DoFBHelp(curPlayer, tick) + return + +def DoFB_Npc_KillNPC(attacker, curNPC, tick): + if curNPC.GetNPCID() in IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 2, {}).values(): + __OnRobotDie(tick) + return + +def __OnRobotDie(tick): + #记录机器人死亡时间 + lineID = GameWorld.GetGameWorld().GetLineID() + if lineID in PyGameData.g_elderBattleRobotDieDict: + PyGameData.g_elderBattleRobotDieDict[lineID].append(tick) + else: + PyGameData.g_elderBattleRobotDieDict[lineID] = [tick] return def OnMoveTouchNPC(curPlayer, curNPC, tick): @@ -501,6 +644,7 @@ def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer): return not CanAttackPlayer(curPlayer, curTagPlayer) + ##副本中,攻击队友逻辑 # @param curPlayer 玩家实例 # @param curTagPlayer 目标玩家实例 @@ -508,6 +652,7 @@ # @remarks def DoCanAttackTeamer(curPlayer, curTagPlayer): return CanAttackPlayer(curPlayer, curTagPlayer) + ##副本中,是否可攻击 # @param curPlayer 玩家实例 @@ -530,11 +675,30 @@ def OnPlayerReborn(): return True + ## 重置副本复活玩家坐标点 # @param None # @return 无意义 def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick): __SetPlayerRandomPos(curPlayer) + #复活加buff + playerID = curPlayer.GetID() + rebornBuffLV = GameWorld.GetGameFB().GetPlayerGameFBDictByKey(playerID, FBPlayerDict_RebornBuffLV) + if rebornBuffLV >= IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot', 4): + return + __DoAddRebornBuff(curPlayer, rebornBuffLV+1, tick) + return + +def __DoAddRebornBuff(curPlayer, rebornBuffLV, tick): + skillBuffID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot', 3) + rebornBuffLV - 1 + skillBuff = GameWorld.GetGameData().GetSkillBySkillID(skillBuffID) + if not skillBuff: + GameWorld.Log("上古复活加buff 找不到技能%s" % skillBuffID) + return + playerID = curPlayer.GetID() + GameWorld.GetGameFB().SetPlayerGameFBDict(playerID, FBPlayerDict_RebornBuffLV, rebornBuffLV) + buffType = SkillCommon.GetBuffType(skillBuff) + BuffSkill.DoAddBuff(curPlayer, buffType, skillBuff, tick) return ## 设置玩家随机坐标点 @@ -547,10 +711,11 @@ ## 获取副本线路最大玩家人数 # @param None # @return -def GetFBLineMaxPlayerCount(): - return IpyGameDataPY.GetFuncCfg('ElderBattlefieldCfg', 3) - +def GetFBLineMaxPlayerCount(lineID): + cfg = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 3, {}).get(lineID) + if not cfg: + return 20 + return cfg[Def_PlayerCnt] ## ------------------------------------------------------------------------------------------------- - -- Gitblit v1.8.0