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/NPC/NPCAI/AIType_21.py |  163 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 152 insertions(+), 11 deletions(-)

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
 
-
-
-       

--
Gitblit v1.8.0