From 297de92ab4234a2ec6c84a0b93861a41bc71d1b3 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期一, 12 十一月 2018 17:07:58 +0800
Subject: [PATCH] 4631 【后端】【1.3.0】上古战场增加机器人投放、分线逻辑优化
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py | 14 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py | 42 +++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ElderBattlefield.py | 361 ++++++++++++++++++++++++++++++--------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py | 9
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 5
6 files changed, 297 insertions(+), 138 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py
index e652130..647fb07 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py
@@ -22,7 +22,7 @@
import ChEquip
import GameWorld
import EventShell
-import SkillShell
+import FBLogic
import GameObj
import NPCCommon
import ChNPC
@@ -113,11 +113,14 @@
else:
#通知玩家
if curTagPlayer.GetMapID() != ChConfig.Def_FBMapID_XMZZ:
- PlayerControl.NotifyCode(curTagPlayer, 'GeRen_chenxin_279029', [curNormalNPC.GetNPCID()])
+ if curNormalNPC.GetType() == ChConfig.ntRobot:
+ PlayerControl.NotifyCode(curTagPlayer, 'RobotKill_1', [curNormalNPC.GetObjID(), curNormalNPC.GetNPCID()])
+ else:
+ PlayerControl.NotifyCode(curTagPlayer, 'GeRen_chenxin_279029', [curNormalNPC.GetNPCID()])
#玩家已经死亡
playerControl = PlayerControl.PlayerControl(curTagPlayer)
playerControl.SetDead()
-
+ FBLogic.DoFBOnNPCKill_Player(curNormalNPC, curTagPlayer, tick)
#触发玩家死亡事件
EventShell.EventRespons_PlayerEvent(curTagPlayer, "player_dead")
return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index be2b304..dca95dd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1798,7 +1798,7 @@
Def_NoPlayerNeedProcessRefreshPointMap = [Def_FBMapID_SealDemon, Def_FBMapID_GodArea, Def_FBMapID_BossHome]
# 可重复进的副本
-Def_NoLimitEnterCntMap = [Def_FBMapID_FamilyParty, Def_FBMapID_FamilyWar, Def_FBMapID_FamilyInvade]
+Def_NoLimitEnterCntMap = [Def_FBMapID_FamilyParty, Def_FBMapID_FamilyWar, Def_FBMapID_FamilyInvade, Def_FBMapID_ElderBattlefield]
# 无玩家时不自动关闭的自伸缩副本
Def_NoPlayerNotCloseAutoSizeMap = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap]
@@ -4938,8 +4938,9 @@
ntPet,
ntTouchKill, #触碰后自杀类 17
ntUndeath, #不死类型 18
+ntRobot, #上古战场机器人类型 19
ntMax
-) = range(20)
+) = range(21)
(Def_SkillFuncType_Common, #0为通用技能
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
index bb1d347..aff2794 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -355,6 +355,16 @@
return
+def DoFBOnNPCKill_Player(curNPC, curPlayer, tick):
+ ## 副本内NPC杀人
+ do_FBLogic_ID = __GetFBLogic_MapID(GameWorld.GetMap().GetMapID())
+
+ callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "DoFBOnNPCKill_Player"))
+
+ if callFunc:
+ #GameWorld.Log("副本逻辑不可使用 GameLogic_%d"%(mapID))
+ return callFunc(curNPC, curPlayer, tick)
+ return
#---------------------------------------------------------------------
## 任务专用,触发事件(副本内攻击人)
# @param curPlayer 攻击者
@@ -1897,14 +1907,14 @@
# @param mapID 玩家
# @param tick 当前时间
# @return None-未找到,线路id - 0~N
-def GetFBLineMaxPlayerCount(mapID):
+def GetFBLineMaxPlayerCount(mapID, lineID):
do_FBLogic_ID = __GetFBLogic_MapID(mapID)
callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "GetFBLineMaxPlayerCount"))
if callFunc:
- return callFunc()
+ return callFunc(lineID)
return 0
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 d9c5a46..9ca4291 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,7 @@
import NPCCustomRefresh
import SkillShell
import EventReport
+import SkillCommon
import random
import time
@@ -41,44 +42,53 @@
#------------------------------------------------------------------------------
#
-
# 副本玩家字典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 OnLogin(curPlayer):
+ 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 +125,7 @@
return True
+
##是否可以进入
# @param ask 请求结构体
# @param tick 时间戳
@@ -124,6 +135,7 @@
#可进入
return IPY_GameWorld.cmeAccept
+
##玩家进入副本
# @param curPlayer 玩家实例
@@ -146,16 +158,15 @@
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)
DoFBHelp(curPlayer, tick)
return
-
##副本玩家进入点, 玩家分散在半径3格范围
@@ -168,6 +179,7 @@
def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
return random.choice(ipyEnterPosInfo)
+
## 获取层随机坐标点
def __GetRandPos():
ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_ElderBattlefield, 0)
@@ -175,6 +187,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 +197,30 @@
buffIDList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldBuff')
for buffID in buffIDList:
BuffSkill.DelBuffBySkillID(curPlayer, buffID, tick)
+
+
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)
return
+
##副本总逻辑计时器
# @param tick 时间戳
@@ -212,13 +234,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 +263,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 +277,75 @@
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
+ 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,29 +354,21 @@
# @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
+ 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)
@@ -298,20 +382,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:
+ mapID = GameWorld.GetMap().GetMapID()
+ if mapID != ChConfig.Def_FBMapID_ElderBattlefield or isLogin or emptySpace < needSpace:
PlayerControl.SendMailByKey("ElderBattlefieldMail", [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 +451,7 @@
#---------------------------------------------------------------------
+
##获得副本帮助信息, 用于通知阵营比分条
# @param curPlayer 玩家实例
# @param tick 时间戳
@@ -392,11 +477,15 @@
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)
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,58 +493,66 @@
# @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)
+ atkIsPlayer = atkobj.GetGameObjType() == IPY_GameWorld.gotPlayer
+ 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)
- contKillCntEx = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_ContKillCntEx) + 1 # 连杀数
- gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_ContKillCntEx, contKillCntEx)
- #连杀广播
- ckillSysList = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 1)
- 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])
+ # 击杀方处理
+ 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)
+ 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], [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)
-
-
- addScore = IpyGameDataPY.GetFuncCfg('ElderBattlefieldCfg', 2)
-
- #记录仇人
- gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_EnemyID, playerID)
- if tagPlayerID == gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EnemyID):
- #击杀仇人广播
- PlayerControl.NotifyCode(curPlayer, '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)
- updScore = __AddElderBattlefieldPlayerScore(curPlayer, gameFB, addScore)
- 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.GetObjID(), 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
@@ -469,7 +566,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)
@@ -477,6 +576,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):
@@ -505,6 +618,7 @@
def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer):
return not CanAttackPlayer(curPlayer, curTagPlayer)
+
##副本中,攻击队友逻辑
# @param curPlayer 玩家实例
# @param curTagPlayer 目标玩家实例
@@ -512,6 +626,7 @@
# @remarks
def DoCanAttackTeamer(curPlayer, curTagPlayer):
return CanAttackPlayer(curPlayer, curTagPlayer)
+
##副本中,是否可攻击
# @param curPlayer 玩家实例
@@ -534,12 +649,29 @@
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
+ skillBuffID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot', 3) + rebornBuffLV
+ skillBuff = GameWorld.GetGameData().GetSkillBySkillID(skillBuffID)
+ if not skillBuff:
+ GameWorld.Log("上古复活加buff 找不到技能%s" % skillBuffID)
+ return
+ GameWorld.GetGameFB().SetPlayerGameFBDict(playerID, FBPlayerDict_RebornBuffLV, rebornBuffLV+1)
+ buffType = SkillCommon.GetBuffType(skillBuff)
+ BuffSkill.DoAddBuff(curPlayer, buffType, skillBuff, tick)
+
+
return
+
## 设置玩家随机坐标点
def __SetPlayerRandomPos(curPlayer):
@@ -551,10 +683,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]
## -------------------------------------------------------------------------------------------------
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py
index 4eaa6fd..8a9cca4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py
@@ -65,25 +65,37 @@
resultLineID = -1 # 结果lineID
gameWorldManager = GameWorld.GetGameWorld()
- maxPlayerCount = FBLogic.GetFBLineMaxPlayerCount(tagMapID)
+ maxPlayerCount = FBLogic.GetFBLineMaxPlayerCount(tagMapID, tagMapLineID)
- GameWorld.Log(" DoLogic() tagMapID=%s,maxPlayerCount=%s" % (tagMapID, maxPlayerCount))
- for index in range(gameWorldManager.GetGameWorldCount()):
+ GameWorld.Log(" DoLogic() tagMapID=%s,tagMapLineID=%s,maxPlayerCount=%s" % (tagMapID, tagMapLineID,maxPlayerCount))
+ firstEmptyGameWorld = None
+ sameLineGameWorldList = []
+ for index in xrange(gameWorldManager.GetGameWorldCount()):
gameWorld = IPY_GameWorld.IPY_GameWorld(index)
playerManager = gameWorld.GetMapCopyPlayerManagerByFbIndex(index)
propertyID = gameWorld.GetPropertyID()
- GameWorld.Log(" DoLogic() check gameworld index=%s,propertyID=%s,playerCount=%s" \
- % (index, propertyID, playerManager.GetPlayerCount()))
+ curPlayerCnt = playerManager.GetPlayerCount()
+# GameWorld.Log(" DoLogic() check gameworld index=%s,propertyID=%s,playerCount=%s" \
+# % (index, propertyID, curPlayerCnt))
+ if propertyID == 0 and not firstEmptyGameWorld:
+ firstEmptyGameWorld = gameWorld
# 如果不是同一线路属性的,则跳过
# 如果当前人数超过额定人数,则跳过
- if propertyID == 0 or (propertyID == tagMapPropertyID \
- and playerManager.GetPlayerCount() < maxPlayerCount):
- gameWorld.SetPropertyID(tagMapPropertyID)
- if propertyID == 0:
- gameWorld.SetFBFirstOpen(1) # 开启副本
- resultLineID = gameWorld.GetLineID()
- GameWorld.Log(" DoLogic() check ok!resultLineID=%s" % (resultLineID))
- break
+ if propertyID == tagMapPropertyID and curPlayerCnt < maxPlayerCount:
+ sameLineGameWorldList.append([gameWorld, curPlayerCnt])
+ findGameWorld = None
+ if sameLineGameWorldList:
+ sameLineGameWorldList.sort(key=lambda asd:asd[1])
+ findGameWorld = sameLineGameWorldList[0][0]
+ elif firstEmptyGameWorld:
+ findGameWorld = firstEmptyGameWorld
+ if findGameWorld:
+ if findGameWorld.GetPropertyID() == 0:
+ findGameWorld.SetFBFirstOpen(1) # 开启副本
+ findGameWorld.SetPropertyID(tagMapPropertyID)
+ resultLineID = findGameWorld.GetLineID()
+ GameWorld.Log(" DoLogic() check ok!resultLineID=%s" % (resultLineID))
+
#===================================================================================================
# # 战盟家园
@@ -137,9 +149,7 @@
resultLineID = -1 # 结果lineID
gameWorldManager = GameWorld.GetGameWorld()
- maxPlayerCount = FBLogic.GetFBLineMaxPlayerCount(tagMapID)
-
- GameWorld.Log(" DoLogic() tagMapID=%s,maxPlayerCount=%s" % (tagMapID, maxPlayerCount))
+ GameWorld.Log(" DoLogic() tagMapID=%s,tagMapLineID=%s" % (tagMapID, tagMapLineID))
findGameWord = None
for index in range(gameWorldManager.GetGameWorldCount()):
gameWorld = IPY_GameWorld.IPY_GameWorld(index)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index bf4ec9e..a374fd5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -65,4 +65,6 @@
g_npcKillerInfo = {} # NPC击杀者信息 {(lineID, objID, npcID):[killerDict, curTeam, hurtType, hurtID], ...}
-g_familyPartyInfo = {} #[ [[familyID, familyName, 答题数量]], top名字,top答题数量]
\ No newline at end of file
+g_familyPartyInfo = {} #[ [[familyID, familyName, 答题数量]], top名字,top答题数量]
+
+g_elderBattleRobotDieDict = {} #上古战场机器人死亡时间{lineid:[]}
\ No newline at end of file
--
Gitblit v1.8.0