From a82c6b75220814b4e498f536754a61d6b28d6de3 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 17 一月 2019 20:58:15 +0800
Subject: [PATCH] 2899 【1.4.100】【1.5】跨服竞技积分超过65535报错
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ElderBattlefield.py | 394 +++++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 288 insertions(+), 106 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 6be2c11..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,43 +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' # 获得的总经验点
-
-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 时间戳
@@ -114,6 +128,7 @@
return True
+
##是否可以进入
# @param ask 请求结构体
# @param tick 时间戳
@@ -123,6 +138,7 @@
#可进入
return IPY_GameWorld.cmeAccept
+
##玩家进入副本
# @param curPlayer 玩家实例
@@ -143,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格范围
@@ -167,6 +189,7 @@
def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
return random.choice(ipyEnterPosInfo)
+
## 获取层随机坐标点
def __GetRandPos():
ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_ElderBattlefield, 0)
@@ -174,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 玩家实例
@@ -183,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 时间戳
@@ -211,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刷怪
@@ -228,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:
@@ -242,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
@@ -261,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)
@@ -297,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):
@@ -323,7 +428,11 @@
topPlayerID = gameWorld.GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer)
if not topPlayerID or updScore > gameWorld.GetGameWorldDictByKey(FBPlayerDict_Score % topPlayerID):
gameWorld.SetGameWorldDict(Map_ElderBattlefield_TopPlayer, playerID)
- PyGameData.g_sgzztopPlayerName = curPlayer.GetName()
+
+ topName = curPlayer.GetName()
+ PyGameData.g_sgzztopPlayerName = topName
+ PlayerControl.WorldNotify(0, 'AncientBattlefield_9', [topName])
+
if gameWorld.GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer) == playerID:
playerManager = GameWorld.GetPlayerManager()
for i in range(0, playerManager.GetPlayerCount()):
@@ -362,6 +471,7 @@
#---------------------------------------------------------------------
+
##获得副本帮助信息, 用于通知阵营比分条
# @param curPlayer 玩家实例
# @param tick 时间戳
@@ -369,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)
@@ -380,15 +491,23 @@
FBCommon.Help_exp:exp, FBCommon.Help_expPoint:expPoint}
topPlayerID = gameWorld.GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer)
- topScore = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBPlayerDict_Score % topPlayerID)
+
+ topScore = gameWorld.GetGameWorldDictByKey(FBPlayerDict_Score % topPlayerID)
+
helpDict['topName'] = PyGameData.g_sgzztopPlayerName if topPlayerID else ''
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[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 玩家实例
@@ -396,45 +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))
- PlayerControl.FBNotify(ckillSysList[sysIndex], [curPlayer.GetName(), 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(curPlayer, ShareDefine.SuccType_ElderBattlefieldKill, 1)
- PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_ElderBattlefieldConKill, 1, [contKillCntEx])
-
+ # 击杀方成就
+ 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)
- 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
@@ -448,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)
@@ -456,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):
@@ -484,6 +644,7 @@
def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer):
return not CanAttackPlayer(curPlayer, curTagPlayer)
+
##副本中,攻击队友逻辑
# @param curPlayer 玩家实例
# @param curTagPlayer 目标玩家实例
@@ -491,6 +652,7 @@
# @remarks
def DoCanAttackTeamer(curPlayer, curTagPlayer):
return CanAttackPlayer(curPlayer, curTagPlayer)
+
##副本中,是否可攻击
# @param curPlayer 玩家实例
@@ -513,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
## 设置玩家随机坐标点
@@ -530,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