From d1aa37504456311fe9d7ddc2f23f537c2408b90c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 09 一月 2024 11:06:44 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(灵宠通用;技能通用;玩家镜像支持) 1. 灵宠修改为通用模式,玩家及NPC均可召唤灵宠,NPC对应召唤的灵宠NPC与玩家的灵宠NPCID区分; 2. 技能全部为通用技能,玩家、玩家镜像、NPC均通用;支持玩家镜像赋予玩家技能进行攻击; 3. 技能释放方式8(单体恢复:增加方式6-按目标攻击力恢复血量) 4. 修改玩家技能缓存格式 5. 修复玩家灵宠技能升级bug

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py |   57 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index 76e6386..1a11598 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -41,6 +41,9 @@
 
 def GetObjName(gameObj):
     objName = gameObj.GetName()
+    mirrorPlayerID = gameObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID)
+    if mirrorPlayerID:
+        objName = "%s[%s]" % (objName, mirrorPlayerID)
     faction = GameObj.GetFaction(gameObj)
     fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
     return "%s%s %s" % ("A" if faction == 1 else "B", fightPlaceNum, objName)
@@ -89,7 +92,7 @@
     tagObj = None
     if tagPlayerID:
         npcID = ChConfig.Def_NPCID_PVP
-        tagObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=playerID, pvpPlayerID=tagPlayerID)
+        tagObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=playerID, mirrorPlayerID=tagPlayerID)
         if not tagObj:
             return
         PlusData = PlayerViewCacheTube.GetPlayerPropPlusDictByID(playerID)[1] # 从缓存中获取
@@ -343,6 +346,8 @@
     tagID = tagObj.GetID()
     if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer: 
         atkOK = PlayerAttack(curObj, tagObj, tick)
+    elif curObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID):
+        atkOK = PlayerMirrorAttack(curObj, tagObj, tick)
     else:
         atkOK = NPCAttack(curObj, tagObj, tick)
         
@@ -468,14 +473,49 @@
         GameWorld.DebugLog("        %s 技能攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
     return atkOK
 
+def PlayerMirrorAttack(playerNPC, tagObj, tick):
+    ## 玩家镜像攻击
+    
+    playerID = playerNPC.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID)
+    objName = "● %s" % GetObjName(playerNPC)
+    tagObjID = tagObj.GetID()
+    
+    autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {})
+    
+    tagDist = 0
+    skillManager = playerNPC.GetSkillManager()
+    for skillTypeID in autoUseSkillTypeIDList:
+        curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
+        if not curSkill:
+            continue
+        skillID = curSkill.GetSkillID()
+        
+        #被动技能无法使用
+        if SkillCommon.isPassiveSkill(curSkill):
+            continue
+        #还在冷却时间内无法释放
+        if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0:
+            continue
+        
+        if not AICommon.DoNPCUseSkill(playerNPC, tagObj, curSkill, tagDist, tick):
+            GameWorld.DebugLog("        %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+            continue
+        GameWorld.DebugLog("        %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+        return skillID
+    
+    #普通攻击
+    atkOK = BaseAttack.Attack(playerNPC, tagObj, None, tick)
+    if atkOK:
+        GameWorld.DebugLog("        %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+    else:
+        GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+        
+    return atkOK
+
 def PlayerAttack(curPlayer, tagObj, tick):
     ## 玩家攻击, 参考技能使用 #def UseSkillEx(index, clientData, tick):
     playerID = curPlayer.GetPlayerID()
-    job = curPlayer.GetJob()
-    jobAutoUseSkillDict = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {})
-    if job not in jobAutoUseSkillDict:
-        return
-    skillList = jobAutoUseSkillDict[job]
+    autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {})
     
     posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY()
     tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID()
@@ -493,10 +533,11 @@
     
     useSkillResult = False
     skillMgr = curPlayer.GetSkillManager()
-    for skillID in skillList:
-        curSkill = skillMgr.FindSkillBySkillID(skillID)
+    for skillTypeID in autoUseSkillTypeIDList:
+        curSkill = skillMgr.FindSkillBySkillTypeID(skillTypeID)
         if not curSkill:
             continue
+        skillID = curSkill.GetSkillID()
         
         #CheckSkillCondition
         #被动技能无法使用

--
Gitblit v1.8.0