From 2560077959fd4d841ce35cb65e2367e568b3b08b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 19 一月 2024 17:26:02 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(调整闪避公式计算方式;灵宠及反击必命中;普攻暴击后可触发被动;调整击晕优先级提前到其他被动触发前;NPC新增触发被动方式;) 1. 调整闪避公式计算方式,改为是否闪避,简化公式; 2. 增加灵宠及反击必命中;部分触发类伤害技能可通过技能ExAttr2配置必命中; 3. 普攻暴击后可触发被动; 4. 调整击晕优先级提前到反击和其他被动触发前;不然可能导致被攻击方先触发了反击或某些被动后再被击晕;最大击晕概率配置由6000调整为9000; 5. NPC支持被击、闪避、击晕、暴击、连击、反击前、反击后可触发被动; 6. 回血量增加支持按已损失血量百分比恢复;

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py         |    4 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py                 |   11 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py               |   65 +++++++++++----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py               |   52 +++++-------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py                         |   38 +++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py    |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py |   30 ++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                        |    9 +
 9 files changed, 141 insertions(+), 76 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 4249d16..96ac4d5 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
@@ -2066,12 +2066,12 @@
     if curSkill and atkObjType == IPY_GameWorld.gotPlayer and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
         aHit = aHit*IpyGameDataPY.GetFuncCfg("FightHappenRate", 2)
         
-    aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
-    aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
+    #aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
+    #aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
     dMiss = GameObj.GetMissRate(defObj)#defObj.GetMiss()
     dMiss += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissPer)
-    dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
-    dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
+    #dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
+    #dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
     skillID = curSkill.GetSkillID() if curSkill else 0
     
     
@@ -2101,6 +2101,7 @@
         if suppressNPCFightPower:
             suppressFightPower = max(0, suppressNPCFightPower - PlayerControl.GetFightPower(defObj))
             
+    turnFightTimeline = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
     mustHit = False
     petNPCOwner = None
     helpBattleFormatKey = ""
@@ -2118,11 +2119,18 @@
         helpBattleFormatKey = "HelpRobot_Def"
     if atkObjType == IPY_GameWorld.gotNPC and PetControl.IsPetNPC(atkObj):
         mustHit = True
+        GameWorld.DebugLog("        灵宠必命中")
         petNPCOwner = PetControl.GetPetNPCOwner(atkObj)
+    if turnFightTimeline:
+        if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType) == ChConfig.TurnBattleType_AtkBack:
+            mustHit = True
+            GameWorld.DebugLog("        反击必命中: atkID=%s,defID=%s" % (atkObj.GetID(), defObj.GetID()))
+    if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn):
+        mustHit = True
+        GameWorld.DebugLog("        技能必命中: skillID=%s" % skillID)
         
     #命中公式 攻击方类型不同,公式不同
-    hitFormula = ReadChConfig.GetChConfig('CalcCanHit')
-    
+    missRateFormula = ReadChConfig.GetChConfig('CalcCanHit')
     if not mustHit and not PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, 
                            ChConfig.TriggerType_Buff_MustBeHit):
         # 技能对指定BOSS无效果的返回MISS
@@ -2135,12 +2143,10 @@
         GameObj.GetPyPlayerState(defObj, ChConfig.Def_PlayerState_MissSneerAtk):
             return 0, ChConfig.Def_HurtType_Miss
         
-        #添加是否必命中
-        if not IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn) \
-            and eval(hitFormula) < 0:
+        missRate = eval(missRateFormula)
+        if GameWorld.CanHappen(missRate):
             return 0, ChConfig.Def_HurtType_Miss
-    
-
+        
     hurtType, hurtTypeResultDict = CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState, curSkill)
     #GameWorld.DebugLog("GetHurtHP hurtType=%s, hurtTypeResultDict=%s" % (hurtType, hurtTypeResultDict))
     isLuckyHit, aLuckyHit, dLuckyHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_LuckyHit] # 幸运一击
@@ -2365,7 +2371,7 @@
         hurtFormulaKey = helpBattleFormatKey
         
     # 回合战斗
-    if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
+    if turnFightTimeline:
         hurtFormulaKey = "TurnFight"
         
     if hurtFormulaKey not in hurtDist:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
index f3a4525..9903f9f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -1264,7 +1264,7 @@
         __DoPlayerBeAttacked(attacker, defender, curSkill, tick)
         
     elif defenderType == IPY_GameWorld.gotNPC:
-        __DoNPCBeAttacked(defender, curSkill, tick)
+        __DoNPCBeAttacked(attacker, defender, curSkill, tick)
         
     else:
         GameWorld.Log("被攻击错误 : %d " % defender.GetGameObjType())
@@ -1591,23 +1591,15 @@
 
 
 # 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
-def OnHurtTypeTriggerSkill(attacker, target, curSkill, tick):
+def OnHurtTypeTriggerSkill(attacker, target, curSkill, skillHurtLists, tick):
     usePassiveSkillResult = True    # 第一次判断不能调用,即代表都不可用无需循环
     usePassiveSkillResultOnSuperHit = True    # 暴击对象1V1触发,第一次判断不能调用,即代表都不可用无需循环
-    
-    skillHurtLists = [] # 内部触发清除g_skillHurtList
-    for i in xrange(g_skillHurtList.GetHurtCount()):
-        hurtObj = g_skillHurtList.GetHurtAt(i)
-        if not hurtObj:
-            continue
-        
-        skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
     
     #命中个数记录特殊处理
     PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, target, curSkill, ChConfig.TriggerType_HitValue)
     
     # #持续攻击类BUFF 类剑刃风暴是先给自身一个持续性buff,这一次不算伤害不可触发
-    if curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType():
+    if not curSkill or (curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType()):
         #只对第一目标造成某伤害类型时触发技能, 需先存储 skillHurtLists
         OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick)
     
@@ -1664,8 +1656,41 @@
 # 技能使用结束,在处理技能逻辑和通知封包之后调用
 def UseSkillOver(attacker, defender, curSkill, tick):
     
+    defHurtType = 0
+    atkID = attacker.GetID()
+    defID = defender.GetID() if defender else 0
+    skillHurtLists = [] # 内部触发清除g_skillHurtList
+    for i in xrange(g_skillHurtList.GetHurtCount()):
+        hurtObj = g_skillHurtList.GetHurtAt(i)
+        if not hurtObj:
+            continue
+        skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
+        if defID == hurtObj.GetObjID():
+            defHurtType = hurtObj.GetAttackType()
+            
+    isAtkSkill = (not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP)
+    # 优先处理击晕
+    if isAtkSkill:
+        if defHurtType != ChConfig.Def_HurtType_Miss: # 非闪避才可触发
+            AttackFaintRate(attacker, defender, curSkill, tick)
+            
+    # 回合制下
+    turnBattleType = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
+    if turnBattleType:
+        attacker.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 直接重置,不然后续触发逻辑可能被视为连击
+        if turnBattleType == ChConfig.TurnBattleType_Combo:
+            comboNum = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
+            attacker.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
+            GameWorld.DebugLog("        连击: atkID=%s,comboNum=%s" % (atkID, comboNum))
+            PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Combo, tick)
+        elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
+            atkBackNum = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
+            attacker.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
+            GameWorld.DebugLog("        反击: atkID=%s,atkBackNum=%s" % (atkID, atkBackNum))
+            PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AtkBackAft, tick)
+        
     # 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
-    OnHurtTypeTriggerSkill(attacker, defender, curSkill, tick)
+    OnHurtTypeTriggerSkill(attacker, defender, curSkill, skillHurtLists, tick)
     
     # 普通或者可以主动释放的攻击性技能
     if not curSkill or (curSkill.GetSkillType() == ChConfig.Def_SkillType_Atk and\
@@ -1676,14 +1701,13 @@
         PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Buff_AttackSubLayer, tick)
     
     # 普攻和对敌技能, 此处暂且特殊处理Def_SkillFuncType_PassiveSkillWithSP,待优化
-    if not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP:
+    if isAtkSkill:
         PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
         PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
 
         # TriggerType_AttackOver 和 TriggerType_AttackOverPassive 根据触发的被动buff效果顺序而定
         PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOverPassive, tick)
         
-        AttackFaintRate(attacker, defender, curSkill, tick)
     else:
         PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SkillOverNoAttack, tick)
     
@@ -1740,11 +1764,11 @@
         lastTick = attacker.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintCD)
         remainTick = faintCD - (tick - lastTick)
         if remainTick > 0:
-            GameWorld.DebugLog("击晕CD中! rate=%s,剩余tick=%s" % (rate, remainTick), attacker.GetID())
+            GameWorld.DebugLog("        击晕CD中! rate=%s,剩余tick=%s,atkID=%s" % (rate, remainTick, attacker.GetID()))
             return
         attacker.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, tick)
-    GameWorld.DebugLog("可触发击晕! rate=%s,tagID=%s" % (rate, defender.GetID()), attacker.GetID())
-    SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick)
+    GameWorld.DebugLog("        可触发击晕! rate=%s,atkID=%s,defID=%s" % (rate, attacker.GetID(), defender.GetID()))
+    SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick, buffOwner=attacker)
     return
 
 
@@ -1985,7 +2009,7 @@
 #  @param tick 当前时间
 #  @return None
 #  @remarks 函数详细说明.
-def __DoNPCBeAttacked(curNPC, curSkill, tick):
+def __DoNPCBeAttacked(attacker, curNPC, curSkill, tick):
     #NPC已经死亡
     if GameObj.GetHP(curNPC) <= 0:
         return
@@ -2004,6 +2028,11 @@
     # 被击添加不让主动移动,应用AI1
     if curNPC.GetIsBoss() == 0:
         curNPC.SetDict("NPCBeAttackedAI1", tick)
+        
+    # 回合制下NPC被击可触发
+    if (not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List) and curNPC.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
+        PassiveBuffEffMng.OnPassiveSkillTrigger(curNPC, attacker, None, ChConfig.TriggerType_BeAttackOver, tick)
+        
     return
 
 # 客户端搜索对象的链式攻击
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 94ee677..09f657b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -264,7 +264,7 @@
             tagObjID = tagGameObj.GetID()
             tagHP = GameObj.GetHP(tagGameObj)
             
-            GameWorld.DebugLog("    ★回合%s.%s %s 行动 : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)" 
+            GameWorld.DebugLog("★回合%s.%s %s 行动 : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)" 
                                % (turnNum, actionNum, objName, objType, objID, curHP, gameObj.GetMaxAtk(), tagObjType, tagObjID, tagHP))
             
             if not DoAttack(gameObj, tagGameObj, tick):
@@ -708,31 +708,26 @@
                        % (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt, GameObj.GetHP(tagObj)))
     return
 
-def DoAttack(curObj, tagObj, tick):
+def DoAttack(curObj, tagObj, tick, turnBattleType=ChConfig.TurnBattleType_Normal):
     curID = curObj.GetID()
     tagID = tagObj.GetID()
+    objName = GetObjName(curObj)
+    GameWorld.DebugLog("    ● %s DoAttack: curID=%s,tagID=%s,turnBattleType=%s" % (objName, curID, tagID, turnBattleType))
+    if turnBattleType == ChConfig.TurnBattleType_AtkBack:
+        PassiveBuffEffMng.OnPassiveSkillTrigger(curObj, tagObj, None, ChConfig.TriggerType_AtkBackBef, tick)
+        
+    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, turnBattleType)
     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)
-        
-    turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
     curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型
     
     if not atkOK:
         return
     
-    if turnBattleType == ChConfig.TurnBattleType_Combo:
-        comboNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
-        curObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
-        GameWorld.DebugLog("            连击: comboID=%s,comboNum=%s" % (curID, comboNum))
-    elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
-        atkBackNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
-        curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
-        GameWorld.DebugLog("            反击: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum))
-        
     curHP = GameObj.GetHP(curObj)
     tagHP = GameObj.GetHP(tagObj)
     GameWorld.DebugLog("            curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, curHP, tagID, tagHP))
@@ -741,12 +736,12 @@
     
     # 反击,反击可打断连击,所以优先判断
     if CanAtkBack(curObj, tagObj):
-        DoAttack(tagObj, curObj, tick)
+        DoAttack(tagObj, curObj, tick, ChConfig.TurnBattleType_AtkBack)
         return True
     
     # 连击
     if CanCombo(curObj, tagObj):
-        DoAttack(curObj, tagObj, tick)
+        DoAttack(curObj, tagObj, tick, ChConfig.TurnBattleType_Combo)
         
     return True
 
@@ -773,7 +768,6 @@
         return False
     GameWorld.DebugLog("            可以反击: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" 
                        % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate))
-    defObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_AtkBack)
     return True
 
 def CanCombo(atkObj, defObj):
@@ -797,7 +791,6 @@
         return False
     GameWorld.DebugLog("            可以连击: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" 
                        % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce))
-    atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_Combo)
     return True
 
 def NPCAttack(curObj, tagObj, tick):
@@ -805,7 +798,6 @@
     if not curObj:
         return
     
-    objName = "● %s" % GetObjName(curObj)
     #有值代表灵宠上阵位置,判断是否有概率攻击
     fightPlaceNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
     if fightPlaceNum > 0:
@@ -833,18 +825,17 @@
             #普通攻击
             atkOK = BaseAttack.Attack(curObj, tagObj, None, tick)
             if atkOK:
-                GameWorld.DebugLog("        %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
+                GameWorld.DebugLog("        普通攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
             else:
-                GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
+                GameWorld.DebugLog("        攻击失败: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
     else:
-        GameWorld.DebugLog("        %s 技能攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
+        GameWorld.DebugLog("        技能攻击: curID=%s,tagID=%s,atkOK=%s" % (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, {})
@@ -865,17 +856,17 @@
             continue
         
         if not AICommon.DoNPCUseSkill(playerNPC, tagObj, curSkill, tagDist, tick):
-            GameWorld.DebugLog("        %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+            GameWorld.DebugLog("        技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
             continue
-        GameWorld.DebugLog("        %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+        GameWorld.DebugLog("        技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (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))
+        GameWorld.DebugLog("        普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
     else:
-        GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+        GameWorld.DebugLog("        攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
         
     return atkOK
 
@@ -887,7 +878,6 @@
     posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY()
     tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID()
     
-    objName = "● %s" % GetObjName(curPlayer)
     curPlayer.ClearUseSkillRec()
     curPlayer.SetAttackTargetPos(posX, posY)
     curPlayer.SetUseSkillPosX(tagPosX)
@@ -917,10 +907,10 @@
         curPlayer.SetUseSkill(curSkill.GetSkillData())
         useSkillData = curPlayer.GetUseSkill()
         if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick):
-            GameWorld.DebugLog("        %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+            GameWorld.DebugLog("        技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
             continue
         useSkillResult = True
-        GameWorld.DebugLog("        %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+        GameWorld.DebugLog("        技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
         
         break
     
@@ -931,9 +921,9 @@
         atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick)
         if atkOK:
             useSkillResult = True
-            GameWorld.DebugLog("        %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+            GameWorld.DebugLog("        普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
         else:
-            GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+            GameWorld.DebugLog("        攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
     return useSkillResult
 
 def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 1209e91..24c6030 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1194,7 +1194,8 @@
 Def_Cure_HurtValue, # 伤害值 4
 Def_Cure_TagMaxHP, # 目标最大生命值 5
 Def_Cure_TagAtk, # 目标攻击力 6
-) = range(7)
+Def_Cure_LostHP, # 已损失生命 7
+) = range(8)
 
 #回魔类型(影响公式参数)
 Def_RestoreTypeList = (
@@ -5090,7 +5091,11 @@
 TriggerType_HitValue, # 记录命中个数 89
 TriggerType_ChangeSkillEff, # 改变技能特效广播 90
 TriggerType_TurnNum, # 回合触发 91
-) = range(1, 92)
+TriggerType_Faint, # 击晕触发 92
+TriggerType_Combo, # 连击触发 93
+TriggerType_AtkBackBef, # 反击前触发 94
+TriggerType_AtkBackAft, # 反击后触发 95
+) = range(1, 96)
 
 
 #不可以佩戴翅膀的地图
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index 78245d1..2f41f42 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -152,13 +152,6 @@
     gameObj.SetDict(ChConfig.Def_PlayerKey_CurState, 0)
     return
 
-def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
-def SetPetDamPer(gameObj, value): 
-    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
-    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
-        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
-    return
-
 def GetLastHurtValue(gameObj):
     ## 最后一击伤害值
     hurt = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_LastHurtValue)
@@ -179,6 +172,37 @@
     gameObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurtEx, value / ShareDefine.Def_PerPointValue)
     return
 
+## ---------------------------------------------------------
+def ClearBattleEffect(gameObj):
+    gameObj.ClearBattleEffect()
+    # 其他py层自定义战斗属性,由于EffGetSet中不是所有属性接口均通用,固这里先手动调用
+    SetPetDamPer(gameObj, 0)
+    SetFinalHurtPer(gameObj, 0)
+    SetFinalHurtReducePer(gameObj, 0)
+    SetAtkSpeed(gameObj, 0)
+    SetSuperHitRateReduce(gameObj, 0)
+    SetSuperHitReduce(gameObj, 0)
+    SetFaintRate(gameObj, 0)
+    SetFaintDefRate(gameObj, 0)
+    SetComboRate(gameObj, 0)
+    SetComboDefRate(gameObj, 0)
+    SetComboDamPer(gameObj, 0)
+    SetAtkBackRate(gameObj, 0)
+    SetAtkBackDefRate(gameObj, 0)
+    SetSuckHPPer(gameObj, 0)
+    SetSuckHPDefPer(gameObj, 0)
+    SetAtkBackHP(gameObj, 0)
+    SetCurePer(gameObj, 0)
+    SetCureDefPer(gameObj, 0)
+    return
+
+def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
+def SetPetDamPer(gameObj, value): 
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
+    return
+
 def GetFinalHurtPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurtPer)
 def SetFinalHurtPer(gameObj, value):
     ## 最终伤害百分比
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 9e9374d..240cb37 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -4109,7 +4109,7 @@
         curNPC = self.__Instance
         maxHPBef = GameObj.GetMaxHP(curNPC)
         #清空NPC战斗属性
-        curNPC.ClearBattleEffect()
+        GameObj.ClearBattleEffect(curNPC)
         #--------------------------------------------
         #重置NPC战斗属性
         curNPC.ResetNPCBattleState()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
index eea964f..66117f9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
@@ -440,7 +440,12 @@
         # 暂且特殊处理控制类buff才触发
         if SkillCommon.GetBuffType(curSkill) == IPY_GameWorld.bfActionBuff:
             PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(curObj, buffOwner, curSkill, ChConfig.TriggerType_AddBuffOver, False)
-        
+            
+        # 击晕触发
+        if curSkill.GetSkillTypeID() == ChConfig.Def_SkillID_AtkerFaint:
+            GameWorld.DebugLog("        被击晕: curID=%s,atkID=%s" % (curObj.GetID(), buffOwner.GetID()))
+            PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, None, ChConfig.TriggerType_Faint, tick)
+            
     #是否是持续性技能
     isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List
     
@@ -712,8 +717,8 @@
             remainTime = curBuffRemainTime
             if passTurnNum > 0: # 最小单位1回合,有满1回合才减时长
                 remainTime = curBuffRemainTime - ChConfig.Def_PerTurnTick * passTurnNum
-                GameWorld.DebugLog("    刷新回合buff时间: objID=%s,skillID=%s,remainTime=%s,calcTick=%s,timeline=%s,passTurnNum=%s" 
-                                   % (curObj.GetID(), curSkill.GetSkillID(), remainTime, calcTick, turnFightTimeline, passTurnNum))
+                GameWorld.DebugLog("    刷新回合buff时间: objID=%s,skillID=%s(%s),layer=%s,remainTime=%s,calcTick=%s,timeline=%s,passTurnNum=%s" 
+                                   % (curObj.GetID(), curSkill.GetSkillID(), curSkill.GetSkillName(), curBuff.GetLayer(), remainTime, calcTick, turnFightTimeline, passTurnNum))
                 curBuff.SetCalcStartTick(turnFightTimeline)
                 curBuff.SetRemainTime(remainTime)
                 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
index 82737c0..319816a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -1670,7 +1670,7 @@
 #  @param skillLV 技能等级
 #  @return None or True
 #  @remarks 函数详细说明.
-def AddBuffBySkillType(curObj , skillType , tick , skillLV=None):
+def AddBuffBySkillType(curObj , skillType , tick , skillLV=None, buffOwner=None):
     curSkill = None
     
     if skillLV == None :
@@ -1700,7 +1700,7 @@
     #        GameWorld.ErrLog("SkillBuff_AddBuffValue.AddBuffValue")
     #===========================================================================
     
-    return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue])
+    return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue], buffOwner)
 
 
 ## 查找技能并添加buff(不刷新)
@@ -2235,6 +2235,8 @@
         cureBaseValue = 0 if not tagObj else GameObj.GetMaxHP(tagObj)
     elif cureType == ChConfig.Def_Cure_TagAtk:
         cureBaseValue = 0 if not tagObj else GetCureBaseValue(tagObj, curSkill)
+    elif cureType == ChConfig.Def_Cure_LostHP:
+        cureBaseValue = max(0, GameObj.GetMaxHP(userObj) - GameObj.GetHP(userObj))
         
         
     #这边写死了效果1,基本已经定型
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
index 9f6f1b9..c081357 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -435,7 +435,11 @@
              4109:ChConfig.TriggerType_SkillValue,   # 增加技能伤害固定值 82
              4110:ChConfig.TriggerType_ChangeSkillEff, # 改变技能特效
              4111:ChConfig.TriggerType_AttackOver,  # 攻击(对敌技能)后被动技能被触发 4
+             4112:ChConfig.TriggerType_Faint,  # 击晕触发 92
              5000:ChConfig.TriggerType_TurnNum, # 回合触发 91
+             5001:ChConfig.TriggerType_Combo, # 连击触发 93
+             5002:ChConfig.TriggerType_AtkBackBef, # 反击前触发 94
+             5003:ChConfig.TriggerType_AtkBackAft, # 反击后触发 95
              }
     return tdict.get(effectID, -1) 
     #===========================================================================

--
Gitblit v1.8.0