From d7b5f24468cbd7ad58735d3511d0c1f4701e47b4 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 08 十二月 2018 10:30:43 +0800
Subject: [PATCH] 4581 【后端】【1.3.100】上古战场优化和分线调整——机器人AI、属性、伤害
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_NormalNPC.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 70 +++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ElderBattlefield.py | 11 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py | 6 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_21.py | 163 ++++++++++++++++++++++++++++++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 6 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 1
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py | 12 ++
10 files changed, 263 insertions(+), 16 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 7065cce..dae7c55 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -2083,6 +2083,12 @@
if objType == IPY_GameWorld.gotPlayer:
return "P"
+ if objType == IPY_GameWorld.gotNPC:
+ if obj.GetType() == ChConfig.ntRobot:
+ return "Robot"
+ if obj.GetType() == ChConfig.ntHelpBattleRobot:
+ return "HelpRobot"
+
objType = obj.GetGameNPCObjType()
if objType == IPY_GameWorld.gnotPet:
return "Pet"
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_NormalNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_NormalNPC.py
index f488237..02e8d34 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_NormalNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_NormalNPC.py
@@ -59,6 +59,10 @@
if attackerCampType != defenderCampType:
return ChConfig.Type_Relation_Enemy, ChConfig.Def_PASysMessage_None
+ #机器人可以打机器人
+ if attacker.GetType() == ChConfig.ntRobot and defender.GetType() == ChConfig.ntRobot:
+ return ChConfig.Type_Relation_Enemy, ChConfig.Def_PASysMessage_None
+
return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_None
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 647fb07..d3dee81 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
@@ -114,7 +114,7 @@
#通知玩家
if curTagPlayer.GetMapID() != ChConfig.Def_FBMapID_XMZZ:
if curNormalNPC.GetType() == ChConfig.ntRobot:
- PlayerControl.NotifyCode(curTagPlayer, 'RobotKill_1', [curNormalNPC.GetObjID(), curNormalNPC.GetNPCID()])
+ PlayerControl.NotifyCode(curTagPlayer, 'RobotKill_1', [curNormalNPC.GetID(), curNormalNPC.GetNPCID()])
else:
PlayerControl.NotifyCode(curTagPlayer, 'GeRen_chenxin_279029', [curNormalNPC.GetNPCID()])
#玩家已经死亡
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index a5a58eb..c480097 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1873,6 +1873,7 @@
Def_FB_NotifyFBHelpTick = 'NotifyFBHelpTick' # 广播副本帮助信息tick
Def_FB_NPCStrengthenAverageLV = 'NPCStrengthenAverageLV' # 当前线路成长NPC平均等级
Def_FB_NPCStrengthenMaxLV = 'NPCStrengthenMaxLV' # 当前线路成长NPC最大等级
+Def_FB_NPCStrengthenMinLV = 'NPCStrengthenMinLV' # 当前线路成长NPC最小等级
Def_FB_NPCStrengthenPlayerCnt = 'NPCStrengthenPlayerCnt' # 当前线路成长NPC对应玩家数
Def_FB_TeamPlayerCount = 'TeamPlayerCount' # 组队副本参与玩家数 - 非实时人数,只是进入时的那个人数
Def_FB_DropDoCountRate = 'DropDoCountRate' # 怪物掉落执行次数万分率
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
index 07358b9..53d2397 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -66,6 +66,7 @@
Help_isHelp = 'isHelp' #本次是否是助战
Help_helpCount = 'helpCount' #该副本今日已助战次数
Help_relation = 'relation' #该副本关系加成信息 [优先关系, 总加成]
+Help_robotJob = 'robotJob' #机器人职业 {"ObjID":job, ...}
#副本结算信息通用key
Over_dataMapID = 'dataMapID' #数据地图ID
@@ -372,6 +373,17 @@
gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMaxLV, maxLV)
GameWorld.Log("NPC成长动态等级变更: isLeave=%s,totalLV=%s,playerCnt=%s,averageLV=%s,maxLV=%s"
% (isLeave, totalLV, playerCnt, averageLV, maxLV), playerID)
+ # 上古战场特殊处理
+ if mapID == ChConfig.Def_FBMapID_ElderBattlefield:
+ lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
+ fbLineIpyData = GetFBLineIpyData(mapID, lineID)
+ lvLimitMin = 0 if not fbLineIpyData else fbLineIpyData.GetLVLimitMin()
+ robotLVDiff = IpyGameDataPY.GetFuncCfg("ElderBattlefieldCfg", 5)
+ robotLVMin, robotLVMax = averageLV - robotLVDiff, averageLV
+ robotLVMin = max(lvLimitMin, robotLVMin)
+ gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMaxLV, robotLVMax)
+ gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMinLV, robotLVMin)
+ GameWorld.Log(" 更新上古机器人等级范围: lineID=%s,robotLVDiff=%s,robotLV=(%s~%s)" % (lineID, robotLVDiff, robotLVMin, robotLVMax))
return True
def UpdFBLineNPCStrengthenPlayerCnt(playerID, isLeave):
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 6a7f55a..a25efb3 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
@@ -156,6 +156,10 @@
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)
if FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield):
@@ -202,6 +206,7 @@
skillBuffID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot', 3)
BuffSkill.DelBuffBySkillID(curPlayer, skillBuffID, tick)
+ FBCommon.UpdFBLineNPCStrengthenLV(curPlayer.GetPlayerID(), True)
return
@@ -306,6 +311,10 @@
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
@@ -463,6 +472,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)
@@ -482,6 +492,7 @@
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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
index 6c1429b..2226a1b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
@@ -93,7 +93,8 @@
gameFBMgr.SetPlayerLogoffTick(0)
gameFBMgr.SetIsSafeClose(0)
- GameWorld.Log("FB Close! lineID = %s, openState = %s"%(gameWorld.GetLineID(), gameWorld.GetOpenState()))
+ lineID = gameWorld.GetLineID()
+ GameWorld.Log("FB Close! lineID = %s, openState = %s"%(lineID, gameWorld.GetOpenState()))
gameWorld.SetOpenState(IPY_GameWorld.fbosClosed)
gameMap = gameWorld.GetMap()
@@ -116,6 +117,9 @@
#副本关闭时统一清怪
FBCommon.ClearFBNPC()
+ if lineID in PyGameData.g_fbRobotJobDict:
+ PyGameData.g_fbRobotJobDict.pop(lineID)
+
mapID = FBCommon.GetRecordMapID(gameMap.GetMapID())
#清理物品
unPickItemDict = {}
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_21.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_21.py
index 36f7330..4cacc9f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_21.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_21.py
@@ -16,27 +16,168 @@
#-------------------------------------------------------------------------------
import ChConfig
+import AICommon
+import NPCCommon
+import BaseAttack
+import IpyGameDataPY
+import IPY_GameWorld
+import GameWorld
+import FBCommon
+import GameObj
+import random
+#---------------------------------------------------------------------
#---------------------------------------------------------------------
## 初始化
-# @param curNPC NPC实例
+# @param curNPC 当前npc
# @return None
# @remarks 函数详细说明.
def DoInit(curNPC):
- curNPC.GetNPCAngry().Init(ChConfig.Def_BossAngryCount)
+ curNPC.GetNPCAngry().Init(ChConfig.Def_SuperFBBossAngryCount)
+ return
+
+def OnNPCReborn(curNPC):
+ curNPC.SetIsNeedProcess(True)
+ return
+
+## 执行AI
+# @param curNPC 当前npc
+# @param tick 当前时间
+# @return None
+# @remarks 函数详细说明.
+def ProcessAI(curNPC, tick):
+ npcControl = NPCCommon.NPCControl(curNPC)
+ if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie or not curNPC.IsAlive():
+ return
+
+ #刷新自己的buff
+ npcControl.RefreshBuffState(tick)
+ if GameObj.GetHP(curNPC) == 0:
+ # BUFF刷新中可能会导致NPC死亡
+ return
+
+ #刷新自己仇恨度列表
+ npcControl.RefreshAngryList(tick)
+ curNPCAngry = npcControl.GetMaxAngryTag()
+
+ #仇恨度列表中的人为空
+ if curNPCAngry == None:
+ if curNPC.GetSpeed() != 0:
+ __RobotMove(curNPC)
+ return
+
+ #仇恨对象类型,仇恨对象ID
+ curNPCAngryType = curNPCAngry.GetObjType()
+ curNPCAngryID = curNPCAngry.GetObjID()
+
+ #执行攻击逻辑
+ __NPCFight(curNPC, curNPCAngryID, curNPCAngryType, tick)
+ return
+
+def __RobotMove(curNPC):
+ if curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:
+ #GameWorld.DebugLog("移动中不处理!(%s,%s)" % (curNPC.GetPosX(), curNPC.GetPosY()))
+ return
+ mapID = GameWorld.GetMap().GetMapID()
+ lineID = FBCommon.GetFBPropertyMark()
+ posKey = "%d%02d" % (mapID, lineID)
+ fbMovePosDict = IpyGameDataPY.GetFuncCfg("AI198Point", 1)
+ if posKey not in fbMovePosDict:
+ posKey = "%d%02d" % (mapID, 0)
+ if posKey not in fbMovePosDict:
+ return
+
+ posList = fbMovePosDict[posKey]
+ Key_PosIndex = "RobotMovePosIndex" # NPC上次移动的坐标索引,存值+1
+ posIndex = curNPC.GetDictByKey(Key_PosIndex) - 1
+ if posIndex < 0:
+ # 还没有走过点的,寻找所有点中最近的点
+ posIndex = random.randint(0, len(posList) - 1)
+ else:
+ tagPosX, tagPosY = posList[posIndex]
+ tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), tagPosX, tagPosY)
+ if tagDist < 2:
+ posIndex += 1
+
+ if posIndex < 0 or posIndex >= len(posList):
+ posIndex = random.randint(0, len(posList) - 1)
+
+ curNPC.SetDict(Key_PosIndex, posIndex + 1)
+ tagPosX, tagPosY = posList[posIndex]
+ curNPC.Move(tagPosX, tagPosY)
return
#---------------------------------------------------------------------
-##正常AI逻辑处理
-#@param curNPC NPC实例
-#@param tick 时间戳
-#@return 返回值无意义
-#@remarks 正常AI逻辑处理
-def ProcessAI(curNPC, tick):
+## npc攻击逻辑
+# @param curNPC 当前npc
+# @param tagID curNPCAngryID
+# @param tagType curNPCAngryType
+# @param tick 当前时间
+# @return None
+# @remarks 函数详细说明.
+def __NPCFight(curNPC, tagID, tagType, tick):
+ #设置进入战斗状态
+ NPCCommon.SetNPCInBattleState(curNPC)
+ npcControl = NPCCommon.NPCControl(curNPC)
+
+ #开始攻击
+ curTag = GameWorld.GetObj(tagID, tagType)
+
+ if curTag == None or GameObj.GetHP(curTag) <= 0:
+ return
+
+ tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())
+
+ #---优先释放技能---
+ if AICommon.DoAutoUseSkill(curNPC, curTag, tagDist, tick):
+ return
+
+ #---释放普通攻击---
+
+ if curNPC.GetSpeed() == 0:
+ # 不可移动NPC
+ if tagDist > curNPC.GetAtkDist():
+ return
+
+ if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():
+ #攻击间隔没有到, 返回
+ return
+
+ #普通攻击
+ BaseAttack.Attack(curNPC, curTag, None, tick)
+ return
+
+ #超过攻击距离,移动过去
+ if tagDist > curNPC.GetAtkDist():
+
+ destDist = GameWorld.GetDist(curNPC.GetDestPosX() , curNPC.GetDestPosY(), curTag.GetPosX(), curTag.GetPosY())
+ if destDist <= curNPC.GetAtkDist() and curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:
+ # 目标在移动的攻击范围内,不改变目标点
+ return
+ npcControl.MoveToObj_Detel(curTag)
+ return
+ else:
+ curNPC.StopMove()
+
+ if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():
+ #攻击间隔没有到, 返回
+ return
+
+ if npcControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):
+ #修正这个NPC的站立位置
+ return
+
+ #普通攻击
+ BaseAttack.Attack(curNPC, curTag, None, tick)
return
+## NPC死亡
+# @param curNPC 当前npc
+# @param hurtType 伤害者的obj类型
+# @param hurtID 伤害者的objID
+# @return None
+def OnDie(curNPC, hurtType, hurtID):
+ AICommon.DoNPCUseSkillOnDie(curNPC)
+ return
-
-
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 5f44b87..91ae3d5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -159,6 +159,11 @@
# 根据平均等级
elif lvStrengthenType == 1:
strengthenLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenAverageLV)
+ # 根据按成长等级的上下限随机
+ elif lvStrengthenType == 4:
+ randMinLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenMinLV)
+ randMaxLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenMaxLV)
+ strengthenLV = random.randint(randMinLV, randMaxLV)
if strengthenIpyData.GetCmpNPCBaseLV():
strengthenLV = max(strengthenLV, curNPC.GetLV())
@@ -209,6 +214,62 @@
curNPC.Notify_HPEx()
curNPC.Notify_MaxHPEx()
#GameWorld.DebugLog(" aftHP=%s,aftMaxHP=%s" % (aftHP, aftMaxHP))
+
+ # 机器人复活初始化给技能
+ if isReborn and curNPC.GetType() == ChConfig.ntRobot:
+ __OnFBRobotReborn(curNPC, strengthenLV)
+
+ return
+
+def __OnFBRobotReborn(curNPC, npcLV):
+ tick = GameWorld.GetGameWorld().GetTick()
+ lineID = GameWorld.GetGameWorld().GetLineID()
+ objID = curNPC.GetID()
+ jobSkillDict = IpyGameDataPY.GetFuncEvalCfg("FBRobotCfg", 1)
+ robotJob = random.choice(jobSkillDict.keys())
+ lineRobotJobDict = PyGameData.g_fbRobotJobDict.get(lineID, {})
+ lineRobotJobDict[objID] = robotJob
+ PyGameData.g_fbRobotJobDict[lineID] = lineRobotJobDict
+ skillInfoDict = jobSkillDict[robotJob]
+ skillIDList = []
+ for skillInfo, needLV in skillInfoDict.items():
+ if npcLV < needLV:
+ continue
+ if isinstance(skillInfo, int):
+ skillIDList.append(skillInfo)
+ else:
+ skillIDList += list(skillInfo)
+ GameWorld.DebugLog("给机器人NPC技能: objID=%s,robotJob=%s,npcLV=%s, %s" % (objID, robotJob, npcLV, skillIDList))
+ skillManager = curNPC.GetSkillManager()
+ for skillID in skillIDList:
+ skillManager.LearnSkillByID(skillID)
+ playerManager = GameWorld.GetMapCopyPlayerManager()
+ for index in xrange(playerManager.GetPlayerCount()):
+ curPlayer = playerManager.GetPlayerByIndex(index)
+ if not curPlayer:
+ continue
+ FBLogic.DoFBHelp(curPlayer, tick)
+ return
+
+
+def __DoGiveVSPlayerNPCSkill(curNPC, job, npcLV):
+ skillManager = curNPC.GetSkillManager()
+ jobSkillDict = IpyGameDataPY.GetFuncEvalCfg("XMZZRobotSkill", 1)
+ if job not in jobSkillDict:
+ return
+ skillInfoDict = jobSkillDict[job]
+ #{1:{(100, 101, 102, 103):1, 50000:100, 50100:200, 50400:300}, 2:{(200, 201, 202, 203):1, 55000:100, 55100:200, 55200:300}}
+ skillIDList = []
+ for skillInfo, needLV in skillInfoDict.items():
+ if npcLV < needLV:
+ continue
+ if isinstance(skillInfo, int):
+ skillIDList.append(skillInfo)
+ else:
+ skillIDList += list(skillInfo)
+ GameWorld.DebugLog("给NPC技能: job=%s,npcLV=%s, %s" % (job, npcLV, skillIDList))
+ for skillID in skillIDList:
+ skillManager.LearnSkillByID(skillID)
return
def GetNPCStrengthenAttrDict(npcID, strengthenLV=0, strengthenPlayerCnt=0, strengthenIpyData=None):
@@ -2018,7 +2079,12 @@
AttackCommon.ClearTeamPlayerHurtValue(curNPC)
# 清除自定义伤血列表
#BossHurtMng.ClearHurtValueList(curNPC)
-
+ if curNPC.GetType() == ChConfig.ntRobot:
+ lineID = GameWorld.GetGameWorld().GetLineID()
+ lineRobotJobDict = PyGameData.g_fbRobotJobDict.get(lineID, {})
+ lineRobotJobDict.pop(curNPC.GetID(), 0)
+ PyGameData.g_fbRobotJobDict[lineID] = lineRobotJobDict
+
# C++设置npc死亡
curNPC.SetDead(curNPC.GetDictByKey(ChConfig.Def_NPCDead_Reason),
curNPC.GetDictByKey(ChConfig.Def_NPCDead_KillerType),
@@ -2381,7 +2447,7 @@
def GetIsBossView(self):
# 主动视野情况,GetIsBoss 0 1 4 为普通NPC视野(有视野范围配置,但去除视野刷新),其他为BOSS类视野有刷新
curNPC = self.__Instance
- if not ChConfig.IsGameBoss(curNPC) and not GetFaction(curNPC):
+ if not ChConfig.IsGameBoss(curNPC) and not GetFaction(curNPC) and curNPC.GetType() != ChConfig.ntRobot:
return False
return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index ceed064..557d94c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -75,4 +75,6 @@
g_teamFBMemRelationAddDict = {} # 组队副本队员关系加成信息 {playerID:[relation, relationAdd, relationPlayerID, relationPlayerName], ...}
-g_fightpowerChangeDataRecordDict = {} #导致战力降低的各种行为记录
\ No newline at end of file
+g_fightpowerChangeDataRecordDict = {} #导致战力降低的各种行为记录
+
+g_fbRobotJobDict = {} #副本机器人职业 {lineID:{objID:job, ...}, ...}
--
Gitblit v1.8.0