From ee82685a9cf068539a065cc46403c6ef1c2d3889 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 02 四月 2024 18:34:37 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(复活、多倍攻击、被动触发效果5010、5011、释放方式49、50、优化释放方式43) 1. 支持神通技能复活,区分灵宠触发复活或主角自身复活; 2. 新增被动触发效果5010,攻击有X%的概率造成X倍伤害,同个技能支持同时配置多个不同概率不同倍值;NPC支持多倍攻击; 3. 新增被动触发效果5011,回合战斗开始前触发; 4. 新增换血攻击释放方式49:消耗自身x%当前生命值,扣除敌方等额生命值,最高不超过自身x%攻击; 5. 新增结算灼烧释放方式50;优化原灼烧效果1034,支持结算灼烧伤害加成; 6. 优化原释放方式43:偷取对方属性,支持配置不超过自身属性百分比;NPC支持偷属性;优化原buff效果1015,

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1034.py    |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py             |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_49.py     |   51 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5010.py |   47 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5011.py |   21 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                   |   71 ++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_1015.py           |   27 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py        |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py     |   23 ++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_43.py     |   46 +++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                            |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_50.py     |   66 +++++++++
 12 files changed, 330 insertions(+), 40 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 cea0fbf..e8cd774 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
@@ -1348,8 +1348,11 @@
                          ChConfig.Def_HurtType_Zhuxian, ChConfig.Def_HurtType_DeadlyHit,
                          ChConfig.Def_HurtType_ThumpHit]
     elif atkObjType == IPY_GameWorld.gotNPC:
-        calcTypeList += [ChConfig.Def_HurtType_SuperHit]
-        
+        if PetControl.IsPetNPC(atkObj):
+            calcTypeList += [ChConfig.Def_HurtType_SuperHit]
+        else:
+            calcTypeList += [ChConfig.Def_HurtType_SuperHit, ChConfig.Def_HurtType_DeadlyHit]
+            
     if defObjType == IPY_GameWorld.gotPlayer:
         calcTypeList += [ChConfig.Def_HurtType_Parry]
         
@@ -2025,7 +2028,7 @@
     if tick - defObj.GetDictByKey(ChConfig.Def_PlayerKey_SomersaultTime) < 500:
         return 0, ChConfig.Def_HurtType_Miss
     
-    multiValue = 1 # 伤害倍值
+    multiValue = 0 # 伤害倍值
     summonAtkPer = 1    # 召唤继承提高基础攻击力,取表
     summonAtkObj = atkwargs.get('orgAtkObj', None) if atkwargs.get('orgAtkObj', None) else atkObj
     if summonAtkObj.GetGameObjType() == IPY_GameWorld.gotNPC and summonAtkObj.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:
@@ -2397,13 +2400,17 @@
     hurtFormula = hurtDist[hurtFormulaKey]
     
     hurtValue = int(eval(FormulaControl.GetCompileFormula(hurtFormulaKey, hurtFormula)))
-    if isDeadlyHit:
-        hurtValue *= deadlyHitMultiValue
+    if isDeadlyHit and deadlyHitMultiValue != 1:
+        multiValue += deadlyHitMultiValue
         
     if atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC and mapID == ChConfig.Def_FBMapID_CrossBattlefield:
-        multiValue = FBLogic.GetFBPlayerHurtNPCMultiValue(atkObj, defObj)
-        
-    if multiValue != 1:
+        fbMultiValue = FBLogic.GetFBPlayerHurtNPCMultiValue(atkObj, defObj)
+        if fbMultiValue != 1:
+            multiValue += fbMultiValue
+            
+    if multiValue:
+        GameWorld.DebugLog("        多倍伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,multiValue=%s" 
+                           % (atkObj.GetID(), defObj.GetID(), skillID, hurtValue, multiValue))
         hurtValue = int(hurtValue * multiValue)
         
     #hurtValue = min(max(hurtValue, 0), ChConfig.Def_UpperLimit_DWord)
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 49e36b9..a8caea7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -48,9 +48,10 @@
 
 # 回合战斗复活类型
 (
-RebornType_PetSkill,
-RebornType_ElfSkill,
-) = range(1, 1 + 2)
+RebornType_PetSkill, # 灵兽复活,包含灵宠自身技能 或 由灵宠触发的技能
+RebornType_ElfSkill, # 精怪复活
+RebornType_ShentongSkill, # 神通复活 - 由主角自己触发,灵宠触发的神通技能归为灵宠复活
+) = range(1, 1 + 3)
 
 def GetObjName(gameObj):
     objName = gameObj.GetName()
@@ -201,7 +202,11 @@
     # 战斗前初始化,可能会改变攻速,所以先初始化
     for factionObjList in atkFactionList:
         for gameObj in factionObjList:
-            TurnFightObjStartInit(playerID, gameObj, tick)
+            if not gameObj:
+                continue
+            faction = GameObj.GetFaction(gameObj)
+            tagGameObj = objB if faction == 1 else objA
+            TurnFightObjStartInit(playerID, gameObj, tagGameObj, tick)
             
     #一个回合攻击顺序,为了后续逻辑统一,都是先确定好顺序
     sortType = 2 # 攻击顺序排序方式
@@ -420,8 +425,17 @@
             continue
         if skill.GetRemainTime():
             continue
+        isPetTrigger, triggerPet = GetTriggerRebornPet(gameObj, skill) # 可能由灵宠触发的
+        if isPetTrigger:
+            if triggerPet:
+                return RebornType_PetSkill, triggerPet, skill
+            continue
+        if not CheckRoleStateCanUseRebornSkill(gameObj, skill):
+            continue
         if skill.GetFuncType() == ChConfig.Def_SkillFuncType_ElfSkill:
             return RebornType_ElfSkill, skill
+        if skill.GetFuncType() == ChConfig.Def_SkillFuncType_ShentongSkill:
+            return RebornType_ShentongSkill, skill
         
     # 检查是否有灵宠复活技能
     for index in range(gameObj.GetSummonCount()):
@@ -443,6 +457,29 @@
     #GameWorld.DebugLog("    没有可以复活的方式!")
     return
 
+def GetTriggerRebornPet(gameObj, skill):
+    ## 获取灵宠触发的复活信息
+    # @return: 是否由灵宠触发, 触发的灵宠实例
+    isPetTrigger, triggerPet = False, None
+    if SkillShell.GetSkillAffectTag(skill) != ChConfig.Def_UseSkillTag_SummonMaster:
+        return isPetTrigger, triggerPet
+    
+    isPetTrigger = True
+    for index in range(gameObj.GetSummonCount()):
+        curSummonNPC = gameObj.GetSummonNPCAt(index)
+        if not curSummonNPC:
+            continue
+        if PetControl.IsPetNPC(curSummonNPC):
+            triggerPet = curSummonNPC
+            break
+    return isPetTrigger, triggerPet
+
+def CheckRoleStateCanUseRebornSkill(gameObj, skill):
+    ## 检查主角当前状态是否可以使用复活技能
+    
+    # 暂时默认可以,寻道冰冻状态不可以
+    return True
+
 def DoReborn(gameObj, hpPer=ChConfig.Def_MaxRateValue):
     ## 执行复活
     rebornTypeInfo = GetRebornTypeInfo(gameObj)
@@ -461,7 +498,7 @@
         hpPer = skill.GetEffect(0).GetEffectValue(0)
         rebornValue1 = petNPC.GetID()
         rebornValue2 = skill.GetSkillID()
-    elif rebornType == RebornType_ElfSkill:
+    elif rebornType in [RebornType_ElfSkill, RebornType_ShentongSkill]:
         skill = rebornTypeInfo[1]
         skill.SetRemainTime(skill.GetCoolDownTime())
         hpPer = skill.GetEffect(0).GetEffectValue(0)
@@ -509,7 +546,7 @@
     gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightTimeline, turnNum * 100 + actionNum)
     return
 
-def TurnFightObjStartInit(playerID, gameObj, tick):
+def TurnFightObjStartInit(playerID, gameObj, tagObj, tick):
     ## 回合制战斗实例初始化
     if not gameObj:
         return
@@ -564,6 +601,8 @@
         gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkAddXPCount, 0)
         gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnXPFullTimeline, 0)
         
+    PassiveBuffEffMng.OnPassiveSkillTrigger(gameObj, tagObj, None, ChConfig.TriggerType_TurnFightStart, tick)
+    
     __logGameObjAttr(gameObj)
     return
 
@@ -738,15 +777,23 @@
 def AddTurnObjHurtValue(curObj, tagObj, hurtType, hurtValue, lostHP, curSkill=None):
     if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
         return
+    curID = curObj.GetID()
+    tagID = tagObj.GetID()
     skillID = curSkill.GetSkillID() if curSkill else 0
     totalHurtEx = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue
-    totalHurt = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx + hurtValue
-    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, totalHurt % ChConfig.Def_PerPointValue)
-    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, totalHurt / ChConfig.Def_PerPointValue)
-    GameWorld.DebugLog("        伤血: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,totalHurt=%s,tagHP=%s" 
-                       % (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt, GameObj.GetHP(tagObj)))
+    totalHurt = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx
+    if curID != tagID:
+        totalHurt += hurtValue
+        curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, totalHurt % ChConfig.Def_PerPointValue)
+        curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, totalHurt / ChConfig.Def_PerPointValue)
+        GameWorld.DebugLog("        伤血: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,totalHurt=%s,lostHP=%s,tagHP=%s" 
+                           % (curID, tagID, skillID, hurtType, hurtValue, totalHurt, lostHP, GameObj.GetHP(tagObj)))
+    else:
+        # 如换血类技能,自残的伤害不算输出
+        GameWorld.DebugLog("        自残: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,totalHurt=%s,lostHP=%s,curHP=%s" 
+                           % (curID, tagID, skillID, hurtType, hurtValue, totalHurt, lostHP, GameObj.GetHP(curObj)))        
     
-    if lostHP:
+    if lostHP and curID != tagID:
         AddTurnFightXP(tagObj, __GetAddXP_Defender(tagObj, lostHP), "skillID:%s" % skillID)
         AddTurnFightXP(curObj, __GetAddXP_Attack(curObj, curSkill), "skillID:%s" % skillID)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index f0fb001..4d56b1a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -5137,7 +5137,8 @@
 TriggerType_AttackOverPet, # 灵宠攻击(对敌技能)后被动技能被触发 97
 TriggerType_XPAttackAddSkillPer,  # 道法攻击增加伤害百分比 98
 TriggerType_XPAttackOver,  # 道法攻击后触发99
-) = range(1, 100)
+TriggerType_TurnFightStart, # 回合开场触发 100
+) = range(1, 101)
 
 
 #不可以佩戴翅膀的地图
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1034.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1034.py
index a342279..7080813 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1034.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1034.py
@@ -94,8 +94,12 @@
     count = curBuff.GetValue2()
     #无剩余
     if count > 0:
+        totalDecHP = curBuff.GetValue() * count
+        addBurnHurtPer = defender.GetDictByKey("addBurnHurtPer") # 灼烧伤害加成
+        if addBurnHurtPer:
+            totalDecHP = int(totalDecHP * (1 + addBurnHurtPer/float(ChConfig.Def_MaxRateValue)))
         SkillCommon.SkillLostHP(defender, curSkill.GetSkillTypeID(), SkillCommon.GetBuffOwner(curBuff), 
-                                curBuff.GetValue()*count, tick, hurtType=ChConfig.Def_HurtType_Burn)
+                                totalDecHP, tick, hurtType=ChConfig.Def_HurtType_Burn)
     
     if GameObj.GetHP(defender) <= 0:
         return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_1015.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_1015.py
index 3d62c4c..817a096 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_1015.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_1015.py
@@ -14,8 +14,7 @@
 #---------------------------------------------------------------------
 
 import ChConfig
-import BuffSkill
-import IPY_GameWorld
+
 #---------------------------------------------------------------------
 
 ## buff线性增加属性
@@ -26,8 +25,30 @@
 def OnCalcBuffEx(defender, curEffect, calcDict, curBuff):
     attrType = curEffect.GetEffectValue(0)
     
+    curSkill = curBuff.GetSkill()
+    if not curSkill:
+        return
+    
+    valueIndex = None
+    for i in xrange(curSkill.GetEffectCount()):
+        curEffect = curSkill.GetEffect(i)
+        if curEffect.GetEffectValue(0) == attrType:
+            valueIndex = i
+            break
+        
+    if valueIndex == None:
+        return
+    
+    if attrType == ChConfig.TYPE_Calc_AttrATKMin:
+        # 最小攻击不处理,仅处理最大攻击,配置的时候只配置最大攻击即可,同步加最小攻击
+        return
+    
     vauleFunc = [curBuff.GetValue, curBuff.GetValue1, curBuff.GetValue2]
-    calcDict[attrType] = calcDict.get(attrType, 0) + vauleFunc[min(2, curEffect.GetEffectValue(2))]()
+    addValue = vauleFunc[min(2, valueIndex)]()
+    calcDict[attrType] = calcDict.get(attrType, 0) + addValue
+    if attrType == ChConfig.TYPE_Calc_AttrATKMax:
+        calcDict[ChConfig.TYPE_Calc_AttrATKMin] = calcDict.get(ChConfig.TYPE_Calc_AttrATKMin, 0) + addValue
+        
     return
 
 
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 d73897a..5c3cfd8 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
@@ -1320,7 +1320,6 @@
         if curSkill and GetSkillBattleType(curSkill) == ChConfig.Def_BattleRelationType_CommNoBoss and SkillShell.IsNPCSkillResist(curObj):
             return
     
-    notifyLostValue = lostValue
     curObjHP_BeforeAttack = GameObj.GetHP(curObj)
     if curObjHP_BeforeAttack == 0:
         # 没有血量不能再触发
@@ -1363,7 +1362,7 @@
     AttackCommon.WriteHurtLog(buffOwner, curObj, curSkill, lostValue, hurtType, "持续掉血")
     if view:
         #广播伤血类型
-        AttackCommon.ChangeHPView(curObj, buffOwner, skillTypeID, notifyLostValue, hurtType)
+        AttackCommon.ChangeHPView(curObj, buffOwner, skillTypeID, lostValue, hurtType)
         if buffOwner:
             PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AttackOverPassive, tick)
         
@@ -1417,7 +1416,7 @@
     #统一调用攻击结束动作
     if isDoAttackResult:
         BaseAttack.DoLogic_AttackResult(buffOwner, curObj, None, tick)
-    return
+    return lostHP
 
 ## 检查增加淬毒buff
 #  @param skillTypeID 使用的技能typeID
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_43.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_43.py
index 9460df8..c1937b5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_43.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_43.py
@@ -17,30 +17,54 @@
 import BaseAttack
 import BuffSkill
 import IPY_GameWorld
-import SkillCommon
 import EffGetSet
+import GameWorld
+import SkillCommon
 
 
-def UseSkill(attacker, defender, curSkill, tagRoundPosX, tagRoundPosY, isEnhanceSkill, tick):
+def UseBuff(attacker, defender, curSkill, tick, tagRoundPosX, tagRoundPosY):
+#def UseSkill(attacker, defender, curSkill, tagRoundPosX, tagRoundPosY, isEnhanceSkill, tick):
     if not defender:
         return
-    if defender.GetGameObjType() != IPY_GameWorld.gotPlayer:
-        return
     
+    atkObjType = attacker.GetGameObjType()
+    defObjType = defender.GetGameObjType()
+    
+    attrIndexAllowList = [] # 存在NPC,仅允许偷取的属性类型
+    if atkObjType != IPY_GameWorld.gotPlayer or defObjType != IPY_GameWorld.gotPlayer:
+        attrIndexAllowList = [ChConfig.TYPE_Calc_AttrMaxHP, ChConfig.TYPE_Calc_AttrATKMin, ChConfig.TYPE_Calc_AttrATKMax,
+                              ChConfig.TYPE_Calc_AttrDEF, ChConfig.TYPE_Calc_AttrAtkSpeed]
+        
+    #GameWorld.DebugLog("偷取目标属性: atkID=%s,defID=%s,attrIndexAllowList=%s" % (attacker.GetID(), defender.GetID(), attrIndexAllowList))
     addBuffValueList = []
     # 效果ID | 属性项,万分率
-    # 最多吸收目标3种属性 存入buffvalue
+    # 最多吸收目标3种属性 存入buffvalue,固定前3个效果
+    # A值-属性ID B值-吸取万分率 C值-最高不超过自身属性万分率,配0不限制
     for i in range(3):
-        attrIndex = curSkill.GetEffect(i).GetEffectValue(0)
+        effect = curSkill.GetEffect(i)
+        attrIndex = effect.GetEffectValue(0)
         if not attrIndex:
-            break
-        curValue = EffGetSet.GetValueByEffIndex(defender, attrIndex)
-        curValue = int(curValue * curSkill.GetEffect(i).GetEffectValue(1) / ChConfig.Def_MaxRateValue)
+            continue
+        if attrIndexAllowList and attrIndex not in attrIndexAllowList:
+            continue
         
-        addBuffValueList.append(curValue)
+        attrRate = effect.GetEffectValue(1)
+        tagValue = EffGetSet.GetValueByEffIndex(defender, attrIndex)
+        addValue = int(tagValue * attrRate / float(ChConfig.Def_MaxRateValue))
+        
+        maxRate = effect.GetEffectValue(2)
+        curValue = EffGetSet.GetValueByEffIndex(attacker, attrIndex)
+        if maxRate:
+            maxValue = int(curValue * maxRate / float(ChConfig.Def_MaxRateValue))
+            addValue = min(addValue, maxValue)
+            
+        addBuffValueList.append(addValue)
+        GameWorld.DebugLog("偷取目标属性: atkID=%s,defID=%s,attrIndex=%s,attrRate=%s,addValue=%s,tagValue=%s,curValue=%s,maxRate=%s" 
+                           % (attacker.GetID(), defender.GetID(), attrIndex, attrRate, addValue, tagValue, curValue, maxRate))
         
     buffType = SkillCommon.GetBuffType(curSkill)
     BuffSkill.DoAddBuff(attacker, buffType, curSkill, tick, addBuffValueList, attacker)
     
+    return True
     #处理技能触发和攻击成功逻辑
-    return BaseAttack.DoSkillEx_AttackSucess(attacker, defender, curSkill, tick, isEnhanceSkill)
+    #return BaseAttack.DoSkillEx_AttackSucess(attacker, defender, curSkill, tick, isEnhanceSkill)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_49.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_49.py
new file mode 100644
index 0000000..dc88b19
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_49.py
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.GameSkills.SkillModule_49
+#
+# @todo:换血攻击
+# @author hxp
+# @date 2024-04-02
+# @version 1.0
+#
+# 详细描述: 消耗自身x%当前生命值,扣除敌方等额生命值,最高不超过自身x%攻击。
+#           效果1: A值-消耗血量百分比,B值-最高不超过攻击百分比
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-04-02 19:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import SkillCommon
+import BaseAttack
+import GameWorld
+import GameObj
+
+def UseSkill(attacker, defender, curSkill, tagRoundPosX, tagRoundPosY, isEnhanceSkill, tick):
+    if not defender:
+        return
+    
+    curHP = GameObj.GetHP(attacker)
+    tagHP = GameObj.GetHP(defender)
+    if curHP <= 1 or tagHP <= 0:
+        return
+    
+    skillEffect = curSkill.GetEffect(0)
+    lostHPPer = skillEffect.GetEffectValue(0)
+    maxAtkPer = skillEffect.GetEffectValue(1)
+    
+    maxHP = GameObj.GetMaxHP(attacker)
+    maxAtk = attacker.GetMaxAtk()
+    
+    hpHurtValue = int(maxHP * lostHPPer / float(ChConfig.Def_MaxRateValue))
+    atkHurtValue = int(maxAtk * maxAtkPer / float(ChConfig.Def_MaxRateValue))
+    
+    hurtValue = min(hpHurtValue, atkHurtValue, tagHP, curHP - 1) # 至少保留1滴血
+    
+    GameWorld.DebugLog("        换血: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,hpHurtValue=%s,atkHurtValue=%s,curHP=%s,tagHP=%s" 
+                       % (attacker.GetID(), defender.GetID(), curSkill.GetSkillID(), hurtValue, hpHurtValue, atkHurtValue, curHP, tagHP))
+    lostHP = SkillCommon.SkillLostHP(defender, curSkill.GetSkillTypeID(), attacker, hurtValue, tick, isDoAttackResult=False, skillAffect=False)
+    if lostHP:
+        SkillCommon.SkillLostHP(attacker, curSkill.GetSkillTypeID(), attacker, hurtValue, tick, isDoAttackResult=False, skillAffect=False)
+    return BaseAttack.DoSkillEx_AttackSucess(attacker, defender, curSkill, tick, isEnhanceSkill)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_50.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_50.py
new file mode 100644
index 0000000..464915a
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_50.py
@@ -0,0 +1,66 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.GameSkills.SkillModule_50
+#
+# @todo:结算灼烧
+# @author hxp
+# @date 2024-04-02
+# @version 1.0
+#
+# 详细描述: 结算灼烧    效果1:    A值-伤害增加百分比
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-04-02 19:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import GameWorld
+import BuffSkill
+import SkillShell
+
+def UseSkill(attacker, defender, curSkill, tagRoundPosX, tagRoundPosY, isEnhanceSkill, tick):
+    if not defender:
+        return
+    
+    # 对存在灼烧效果ID的持续减益buff进行结算
+    buffState = defender.GetProcessDeBuffState()
+    buffStateCount = buffState.GetBuffCount()
+    if not buffStateCount:
+        return
+    
+    skillEffect = curSkill.GetEffect(0)
+    addBurnHurtPer = skillEffect.GetEffectValue(0)
+    defender.SetDict("addBurnHurtPer", addBurnHurtPer)
+    
+    isBurn = False
+    #buff持续效果,回合下可能删除buff,倒序遍历
+    for i in range(0, buffStateCount)[::-1]:
+        curBuff = buffState.GetBuff(i)
+        if not curBuff:
+            continue
+        isDel = False
+        curBuffSkill = curBuff.GetSkill()
+        for effIndex in range(0, curBuffSkill.GetEffectCount()):
+            #得到当前效果
+            curEffect = curBuffSkill.GetEffect(effIndex)
+            curEffectID = curEffect.GetEffectID()
+            if curEffectID == ChConfig.Def_Skill_Effect_Burn:
+                isDel = True
+                break
+        if not isDel:
+            continue
+        # 直接删除buff,由buff自身消失逻辑进行结算
+        GameWorld.DebugLog("        立即结算灼烧buff: atkID=%s,defID=%s,skillID=%s,addBurnHurtPer=%s" 
+                           % (attacker.GetID(), defender.GetID(), curBuffSkill.GetSkillID(), addBurnHurtPer))
+        isBurn = True
+        skillID = curBuffSkill.GetSkillID()
+        skillTypeID = curBuffSkill.GetSkillTypeID()
+        ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType()
+        BuffSkill.DoBuffDisApper(defender, curBuff, tick)
+        buffState.DeleteBuffByTypeID(skillTypeID)
+        SkillShell.ClearBuffEffectBySkillID(defender, skillID, ownerID, ownerType)
+        
+    defender.SetDict("addBurnHurtPer", 0)
+    return isBurn
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5010.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5010.py
new file mode 100644
index 0000000..b2d4d0a
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5010.py
@@ -0,0 +1,47 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveBuff.PassiveSkill_5010
+#
+# @todo:攻击有X%的概率造成X倍伤害
+# @author hxp
+# @date 2024-04-02
+# @version 1.0
+#
+# 详细描述: 攻击有X%的概率造成X倍伤害,同个技能支持同时配置多个不同概率不同倍值;
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-04-02 19:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+
+g_multiValue = 0 # 倍值
+
+def CheckCanHappen(attacker, defender, effect, curSkill):
+    global g_multiValue
+    g_multiValue = 0
+    
+    effID = effect.GetEffectID()
+    for i in range(0, curSkill.GetEffectCount()):
+        curEffect = curSkill.GetEffect(i)
+        curEffectID = curEffect.GetEffectID()
+        cValue = curEffect.GetEffectValue(2)
+        if curEffectID != effID and cValue != effID:
+            # 多组的话,其余的效果ID必须配0,且 效果ID 配置在C值,不然会导致同个被动技能概率重复计算多次(重复次数=配置的组数)
+            continue
+        rate = curEffect.GetEffectValue(0)
+        value = curEffect.GetEffectValue(1)
+        canHappen = GameWorld.CanHappen(rate)
+        #GameWorld.DebugLog("概率X倍: skillID=%s,effID=%s,rate=%s,value=%s,cValue=%s,canHappen=%s" 
+        #                  % (curSkill.GetSkillID(), curEffectID, rate, value, cValue, canHappen))
+        # 取最高倍值
+        if canHappen and value > g_multiValue:
+            g_multiValue = value
+            
+    return True if g_multiValue else False
+
+def GetValue(attacker, defender, effect):
+    #GameWorld.DebugLog("    g_multiValue=%s" % (g_multiValue))
+    return g_multiValue
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5011.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5011.py
new file mode 100644
index 0000000..05736f4
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5011.py
@@ -0,0 +1,21 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveBuff.PassiveSkill_5011
+#
+# @todo:回合战斗开场时触发
+# @author hxp
+# @date 2024-04-02
+# @version 1.0
+#
+# 详细描述: 回合战斗开场时触发
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-04-02 19:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+
+def CheckCanHappen(attacker, defender, effect, curSkill):
+    return GameWorld.CanHappen(effect.GetEffectValue(0))
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 542511f..2d4ad2a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -447,6 +447,8 @@
              5007:ChConfig.TriggerType_XPAttackAddSkillPer,  # 道法攻击增加伤害百分比 98
              5008:ChConfig.TriggerType_XPAttackOver, # 道法攻击后触发99
              5009:ChConfig.TriggerType_BounceHPPer,   # 受到攻击时,反弹伤害百分比值17
+             5010:ChConfig.TriggerType_IsDealy,  # 是否触发致命一击 72
+             5011:ChConfig.TriggerType_TurnFightStart, # 回合开场触发 100
              }
     return tdict.get(effectID, -1) 
     #===========================================================================
@@ -1340,7 +1342,7 @@
             continue
         
         if triggerType == ChConfig.TriggerType_IsDealy:
-            curValue = callFunc(attacker, defender, effect)
+            curValue = max(curValue, callFunc(attacker, defender, effect)) # 取最高倍值
         else:
             curValue += callFunc(attacker, defender, effect)
         if skillTypeID not in Def_PassiveSkillValueNoCD:

--
Gitblit v1.8.0