From 608bd56472d25fcbccb572df24a71eab836e1fe7 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 21 五月 2019 17:23:15 +0800
Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能 - 1090减速受符文影响

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_20.py |   87 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 86 insertions(+), 1 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_20.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_20.py
index 546881c..b15c5d7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_20.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_20.py
@@ -22,6 +22,12 @@
 import ChConfig
 import GameWorld
 import GameObj
+import BaseAttack
+import FBCommon
+import AICommon
+import GameMap
+
+import random
 
 
 ## 初始化
@@ -38,8 +44,87 @@
 #  @return None
 #  @remarks 函数详细说明.
 def ProcessAI(curNPC, tick):
-    npcControl = NPCCommon.NPCControl(curNPC)
+    curHP = GameObj.GetHP(curNPC)
+    protectHP = GameObj.GetMaxHP(curNPC) / 2 # 保证血量不低于一半
+    if curHP <= protectHP:
+        GameObj.SetHP(curNPC, curHP + random.randint(protectHP / 3, protectHP))
+        GameWorld.DebugLog("机器人回血!objID=%s" % curNPC.GetID())
+        
+    fbPlayer = FBCommon.GetCurSingleFBPlayer()
+    if not fbPlayer:
+        # 副本中没有玩家则不处理
+        GameWorld.DebugLog("副本中没有玩家则不处理!objID=%s" % curNPC.GetID())
+        return
     
+    curTag = None
+    playerAtkObjID = fbPlayer.GetDictByKey(ChConfig.Def_PlayerKey_LastHurtNPCObjID)
+    if playerAtkObjID:
+        curTag = GameWorld.FindNPCByID(playerAtkObjID)
+        
+    npcControl = NPCCommon.NPCControl(curNPC)
+    npcControl.RefreshBuffState(tick)
+    # 没有玩家正在攻击的目标则取自身的仇恨列表
+    if not curTag:
+        #GameWorld.DebugLog("没有玩家正在攻击的目标,刷新自身仇恨目标!objID=%s,maxHP=%s" % (curNPC.GetID(), GameObj.GetMaxHP(curNPC)))
+        npcControl.RefreshAngryList(tick)
+        curNPCAngry = npcControl.GetMaxAngryTag()
+        if curNPCAngry:
+            curNPCAngryType = curNPCAngry.GetObjType()
+            curNPCAngryID = curNPCAngry.GetObjID()
+            curTag = GameWorld.GetObj(curNPCAngryID, curNPCAngryType)
+            
+    # 没有攻击目标则跟随玩家
+    if not curTag:
+        #GameWorld.DebugLog("没有攻击目标,跟随玩家!objID=%s" % curNPC.GetID())
+        dist = GameWorld.GetDist(fbPlayer.GetPosX(), fbPlayer.GetPosY(), curNPC.GetPosX(), curNPC.GetPosY())
+        if dist > 12:
+            resultPos = GameMap.GetEmptyPlaceInArea(fbPlayer.GetPosX(), fbPlayer.GetPosY(), 3)
+            curNPC.ResetPos(resultPos.GetPosX(), resultPos.GetPosY())
+        elif dist > 3:
+            npcControl.MoveToObj_Detel(fbPlayer, 3)
+        return
+    __NPCFight(npcControl, curNPC, curTag, tick)
+    return
+
+def __NPCFight(npcControl, curNPC, curTag, tick):
+    #设置进入战斗状态
+    NPCCommon.SetNPCInBattleState(curNPC)
+    #开始攻击
+    if curTag == None or GameObj.GetHP(curTag) <= 0:
+        return
+    tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())
+    GameWorld.DebugLog("    与目标距离: %s" % tagDist)
+#    if tagDist > 20:
+#        resultPos = GameMap.GetEmptyPlaceInArea(curTag.GetPosX(), curTag.GetPosY(), 3)
+#        curNPC.ResetPos(resultPos.GetPosX(), resultPos.GetPosY())
+#        tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())
+        
+    delayTick = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkDelayTick)
+    if delayTick:
+        startAtkTick = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkStartTick)
+        if not startAtkTick:
+            curNPC.SetDict(ChConfig.Def_NPC_Dict_AtkStartTick, tick)
+            startAtkTick = tick
+        if tick - startAtkTick < delayTick:
+            GameWorld.DebugLog("未到攻击时间,暂不处理!objID=%s" % curNPC.GetID())
+            return
+        
+    #---优先释放技能---
+    if AICommon.DoAutoUseSkill(curNPC, curTag, tagDist, tick):
+        return
+    #---释放普通攻击---
+    #超过攻击距离,移动过去
+    if tagDist > curNPC.GetAtkDist():
+        npcControl.MoveToObj_Detel(curTag)
+        return
+    if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():
+        #攻击间隔没有到, 返回
+        return
+    if npcControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):
+        #修正这个NPC的站立位置
+        return
+    #普通攻击
+    BaseAttack.Attack(curNPC, curTag, None, tick)
     return
 
 def OnCheckCanDie(atkObj, curNPC, skill, tick):

--
Gitblit v1.8.0