From 56915409677ce25cbbb7fab752c420a26229c84d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期日, 07 四月 2024 17:50:54 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(新增技能效果ID 1007、1008、4542、5012;新增技能释放方式51) 1. 新增技能效果ID 1007-根据目标状态变更技能伤害百分比;1008-根据目标血量变更技能伤害百分比 2. 增加锁定受到的最大伤害效果 4542-buff锁定受到伤害最大值,不会高于自身最大生命值x% 3. 增加技能被动效果ID 5012-目标闪避后触发技能 4. 增加技能释放方式51-打出目标xx属性的X%伤害,单体攻击,支持配置最大不超过自身xx属性x%

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py             |   32 ++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py                    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py                   |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4542.py  |   28 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5012.py |   19 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_51.py     |   48 ++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py     |   83 +++++++++++++++-----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                            |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py          |    3 
 9 files changed, 192 insertions(+), 30 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 e8cd774..4db79b0 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
@@ -1534,34 +1534,35 @@
 # 改变技能伤害(效果ID1010), 野外小怪1009替换1010伤害(2018-03-07增加精英怪)
 def ChangeSkillHurt(curPlayer, defObj, curSkill, skillPer, skillValue):
     
-    findEffect = GetCanChangeSkillHurtEffect(curPlayer, defObj, curSkill)
-    if not findEffect:
-
-        return skillPer, skillValue
-
-    return findEffect.GetEffectValue(0), findEffect.GetEffectValue(1)
+    changeInfo = GetCanChangeSkillHurtEffect(curPlayer, defObj, curSkill, skillPer, skillValue)
+    if changeInfo:
+        skillPer, skillValue = changeInfo
+    return skillPer, skillValue
 
 # 对NPC伤害的特殊处理,为指定伤害替换 非额外加伤害
 # 1. 对非BOSS怪的特殊伤害 2.对XX系怪物的特殊伤害
-def GetCanChangeSkillHurtEffect(attacker, defObj, curSkill):
+def GetCanChangeSkillHurtEffect(attacker, defObj, curSkill, skillPer, skillValue):
     if not curSkill:
         return
-    if defObj.GetGameObjType() != IPY_GameWorld.gotNPC:
-        return
     
-    if attacker.GetGameObjType() == IPY_GameWorld.gotNPC and attacker.GetType() == IPY_GameWorld.ntMonster:
-        # 普通怪无此效果
-        return
+    if not attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
+        if defObj.GetGameObjType() != IPY_GameWorld.gotNPC:
+            return
+        
+        if attacker.GetGameObjType() == IPY_GameWorld.gotNPC and attacker.GetType() == IPY_GameWorld.ntMonster:
+            # 普通怪无此效果
+            return
+        
+        if defObj.GetIsBoss() > ChConfig.Def_NPCType_Ogre_Super:
+            return
+        
+        if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull and \
+        GameWorld.GetMap().GetMapID() not in IpyGameDataPY.GetFuncEvalCfg('SkillXPAddByFB', 1):
+            return
     
-    if defObj.GetIsBoss() > ChConfig.Def_NPCType_Ogre_Super:
-        return
-    
-    if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull and \
-    GameWorld.GetMap().GetMapID() not in IpyGameDataPY.GetFuncEvalCfg('SkillXPAddByFB', 1):
-        return
-    
-    findEffect, effectID = GetSkillEffectByEffectIDs(curSkill, [ChConfig.Def_Skill_Effect_AttackReplace,
-                                                                            ChConfig.Def_Skill_Effect_AttackReplaceByNPCSeries])
+    effectIDList = [ChConfig.Def_Skill_Effect_AttackReplace, ChConfig.Def_Skill_Effect_AttackReplaceByNPCSeries, 
+                    ChConfig.Def_Skill_Effect_AttackReplaceByTagHP, ChConfig.Def_Skill_Effect_AttackReplaceByTagState]
+    findEffect, effectID = GetSkillEffectByEffectIDs(curSkill, effectIDList)
     if not findEffect:
         return
     
@@ -1573,11 +1574,43 @@
         if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull and \
         GameWorld.GetMap().GetMapID() not in IpyGameDataPY.GetFuncEvalCfg('SkillXPAddByFB', 1):
             return
+        
+        return findEffect.GetEffectValue(0), findEffect.GetEffectValue(1)
+    
     elif effectID == ChConfig.Def_Skill_Effect_AttackReplaceByNPCSeries:
         # 对指定系造成指定伤害
         if findEffect.GetEffectValue(2)&NPCCommon.GetNPCSeries(defObj) == 0:
             return
-    return findEffect 
+        
+        return findEffect.GetEffectValue(0), findEffect.GetEffectValue(1)
+    
+    elif effectID == ChConfig.Def_Skill_Effect_AttackReplaceByTagHP:
+        # 目标血量判断
+        hpPer = findEffect.GetEffectValue(1)
+        calcType = findEffect.GetEffectValue(2) #计算方式: 0-小于;1-大于;默认包含临界值
+        tagHPPer = GameObj.GetHP(defObj) * float(ChConfig.Def_MaxRateValue) / GameObj.GetMaxHP(defObj)
+        if calcType == 1:
+            if tagHPPer < hpPer:
+                return
+        else:
+            if tagHPPer > hpPer:
+                return
+        changeSkillPer = findEffect.GetEffectValue(0)
+        GameWorld.DebugLog("        目标血量变更技能伤害! atkID=%s,defID=%s,tagHPPer=%s,hpPer=%s,changeSkillPer=%s,skillPer=%s" 
+                          % (attacker.GetID(), defObj.GetID(), tagHPPer, hpPer, changeSkillPer, skillPer))
+        return changeSkillPer, skillValue
+    
+    elif effectID == ChConfig.Def_Skill_Effect_AttackReplaceByTagState:
+        # 目标状态判断
+        tagState = findEffect.GetEffectValue(1)
+        if not GameObj.GetPyPlayerState(defObj, tagState):
+            return
+        changeSkillPer = findEffect.GetEffectValue(0)
+        GameWorld.DebugLog("        目标状态变更技能伤害! atkID=%s,defID=%s,tagState=%s,changeSkillPer=%s,skillPer=%s" 
+                           % (attacker.GetID(), defObj.GetID(), tagState, changeSkillPer, skillPer))
+        return changeSkillPer, skillValue
+    
+    return
     
     
 # 从效果ID列表中找到其中一个效果
@@ -1975,6 +2008,12 @@
     
     hurtValue = CalcBloodShield(atkObj, defObj, hurtValue)
     
+    # 受伤上限处理,必须放到最后
+    beHurtMax = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_BeHurtMax)
+    if beHurtMax > 0:
+        GameWorld.DebugLog("        最高受伤值限制: defID=%s,beHurtMax=%s,hurtValue=%s" % (defObj.GetID(), beHurtMax, hurtValue))
+        hurtValue = min(hurtValue, beHurtMax)
+        
     return hurtValue
 
 
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 45978b9..bed2c7f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -1637,6 +1637,7 @@
             PassiveBuffEffMng.OnPetPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_BeSuperHit, tick)
         elif hurtType == ChConfig.Def_HurtType_Miss:
             PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_MissSkill, tick)
+            PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, None, ChConfig.TriggerType_BeMissSkill, tick)
         elif hurtType == ChConfig.Def_HurtType_LuckyHit:
             PassiveBuffEffMng.OnPetPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_BeLuckyHit, tick)
             
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 4d56b1a..06c7cf4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -627,6 +627,8 @@
 Def_Skill_Effect_AbsorbShieldXMZJ = 802    # 须弥真界 神兵技能吸收伤害 百分比
 Def_Skill_Effect_BoomSeedHurt = 804 # BUFF种子单层伤害
 Def_Skill_Effect_StoreBlood = 809 # 将期间受到的伤害总值,用于最后回血,不影响伤害
+Def_Skill_Effect_AttackReplaceByTagState = 1007  #伤害技能替换(目标状态判断)
+Def_Skill_Effect_AttackReplaceByTagHP = 1008  #伤害技能替换(目标血量判断)
 Def_Skill_Effect_AttackReplace = 1009  #攻击计算,野外小怪伤害替换1010 (2018-03-07增加精英怪)
 Def_Skill_Effect_Attack = 1010  #攻击计算
 Def_Skill_Effect_LayerCnt = 1011 # BUFF层级数量 A值层数;B值:10位-是否非叠加属性,个位-层数处理方式0递增1递减;C值: 是否攻击减层
@@ -5138,7 +5140,9 @@
 TriggerType_XPAttackAddSkillPer,  # 道法攻击增加伤害百分比 98
 TriggerType_XPAttackOver,  # 道法攻击后触发99
 TriggerType_TurnFightStart, # 回合开场触发 100
-) = range(1, 101)
+TriggerType_BeMissSkill,   # 目标闪避后触发技能 101
+TriggerType_BeHurtMax,   # 锁定受到伤害最大值 102
+) = range(1, 103)
 
 
 #不可以佩戴翅膀的地图
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
index bbac3fa..d13888f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -257,7 +257,8 @@
     curPlayerPlusDict["TotalStoneLV"] = Operate_EquipStone.GetTotalStoneLV(curPlayer)
     curPlayerPlusDict["TotalEquipWashLV"] = Operate_EquipWash.GetTotalEquipWashLV(curPlayer)
     #主动技能总等级
-    skillInfo = SkillShell.GetAllSkillCacheInfo(curPlayer, [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_NormalAttack])
+    skillInfo = SkillShell.GetAllSkillCacheInfo(curPlayer, [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_NormalAttack, 
+                                                            ChConfig.Def_SkillFuncType_ShentongSkill, ChConfig.Def_SkillFuncType_ElfSkill])
     curPlayerPlusDict["SkillInfo"] = skillInfo
     curPlayerPlusDict["TotalSkillLV"] = sum(skillInfo.get("%s"%ChConfig.Def_SkillFuncType_FbSkill, {}).values())
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_51.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_51.py
new file mode 100644
index 0000000..8bd6703
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_51.py
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.GameSkills.SkillModule_51
+#
+# @todo:打出目标xx属性的X%伤害,单体攻击 
+# @author hxp
+# @date 2024-04-07
+# @version 1.0
+#
+# 详细描述: 
+#    效果1:A值-百分比 B值-目标属性索引
+#    效果2:A值-不超过自身百分比,0不限制 B值-自身属性索引
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-04-07 18:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import SkillCommon
+import EffGetSet
+import GameWorld
+
+def UseSkill(attacker, defender, curSkill, tagRoundPosX, tagRoundPosY, isEnhanceSkill, tick):
+    if not defender:
+        return
+    
+    tagEffect = curSkill.GetEffect(0)
+    skillPer = tagEffect.GetEffectValue(0) / float(ChConfig.Def_MaxRateValue)
+    tagAttrIndex = tagEffect.GetEffectValue(1)
+    
+    tagAttrValue = EffGetSet.GetValueByEffIndex(defender, tagAttrIndex)
+    hurtValue = int(tagAttrValue * skillPer)
+    #GameWorld.DebugLog("打出目标xx属性的xx伤害! atkID=%s,defID=%s,tagAttrIndex=%s,tagAttrValue=%s,skillPer=%s,hurtValue=%s" 
+    #                   % (attacker.GetID(), defender.GetID(), tagAttrIndex, tagAttrValue, skillPer, hurtValue))
+    
+    selfEffect = curSkill.GetEffect(1)
+    selfPer = selfEffect.GetEffectValue(0) / float(ChConfig.Def_MaxRateValue)
+    selfAttrIndex = selfEffect.GetEffectValue(1)
+    if selfPer:
+        selfAttrValue = EffGetSet.GetValueByEffIndex(attacker, selfAttrIndex)
+        hurtValueMax = int(selfAttrValue * selfPer)
+        hurtValue = min(hurtValue, hurtValueMax)
+        #GameWorld.DebugLog("    最高不超过自身属性! selfAttrIndex=%s,selfAttrValue=%s,selfPer=%s,hurtValueMax=%s" 
+        #                   % (selfAttrIndex, selfAttrValue, selfPer, hurtValueMax))
+        
+    return SkillCommon.SkillLostHP(defender, curSkill.GetSkillTypeID(), attacker, hurtValue, tick)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4542.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4542.py
new file mode 100644
index 0000000..15b8cff
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4542.py
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveBuff.PassiveBuff_4542
+#
+# @todo:buff锁定受到伤害最大值,不会高于自身最大生命值x%
+# @author hxp
+# @date 2024-04-07
+# @version 1.0
+#
+# 详细描述: buff锁定受到伤害最大值,不会高于自身最大生命值x%
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-04-07 18:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import GameObj
+
+def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
+    return True
+
+
+def GetValue(attacker, defender, passiveEffect):
+    # attacker-命名问题,实际是buff主体,在此效果中为被攻击者自身
+    maxPer = passiveEffect.GetEffectValue(0)
+    return int(GameObj.GetMaxHP(attacker) * maxPer / float(ChConfig.Def_MaxRateValue))
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5012.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5012.py
new file mode 100644
index 0000000..909cc6c
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5012.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveBuff.PassiveSkill_5012
+#
+# @todo:目标闪避后触发技能
+# @author hxp
+# @date 2024-04-07
+# @version 1.0
+#
+# 详细描述: 目标闪避后触发技能
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-04-07 18:00"""
+#-------------------------------------------------------------------------------
+
+def CheckCanHappen(attacker, defender, effect, curSkill):
+    return True
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 2d4ad2a..a228cb9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -449,6 +449,7 @@
              5009:ChConfig.TriggerType_BounceHPPer,   # 受到攻击时,反弹伤害百分比值17
              5010:ChConfig.TriggerType_IsDealy,  # 是否触发致命一击 72
              5011:ChConfig.TriggerType_TurnFightStart, # 回合开场触发 100
+             5012:ChConfig.TriggerType_BeMissSkill,   # 目标闪避后触发技能 101
              }
     return tdict.get(effectID, -1) 
     #===========================================================================
@@ -507,6 +508,7 @@
              4539:ChConfig.TriggerType_SkillValue,  # 增加技能伤害固定值 82
              4540:ChConfig.TriggerType_SuperHitPer, # 暴击伤害百分比
              4541:ChConfig.TriggerType_AttackAddSkillPer, # BUFF类:提高主动技能的技能伤害
+             4542:ChConfig.TriggerType_BeHurtMax, # BUFF类:锁定受到伤害最大值 102
              
              803:ChConfig.TriggerType_BloodShield,  # 血盾
              806:ChConfig.TriggerType_BloodShield,  # 血盾
@@ -515,6 +517,11 @@
              }
     return tdict.get(effectID, -1)
 
+# 触发值没有配置取值类型的默认累加
+# 触发值取最大值的触发类型
+TriggerValueMaxList = [ChConfig.TriggerType_IsDealy]
+# 触发值取最小值的触发类型
+TriggerValueMinList = [ChConfig.TriggerType_BeHurtMax]
 
 #--------被动效果---------------------------
 # 被动效果的来源可能是被动技能,被动buff,或者其他增益buff
@@ -1341,10 +1348,16 @@
         if callFunc is None:
             continue
         
-        if triggerType == ChConfig.TriggerType_IsDealy:
-            curValue = max(curValue, callFunc(attacker, defender, effect)) # 取最高倍值
+        value = callFunc(attacker, defender, effect)
+        if triggerType in TriggerValueMaxList:
+            curValue = max(curValue, value) # 取最大值
+        elif triggerType in TriggerValueMinList:
+            if not curValue:
+                curValue = value
+            elif value > 0:
+                curValue = min(curValue, value) # 取最小值
         else:
-            curValue += callFunc(attacker, defender, effect)
+            curValue += value
         if skillTypeID not in Def_PassiveSkillValueNoCD:
             if curSkill.GetCoolDownTime():
                 SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker)
@@ -1650,8 +1663,17 @@
             
             # 如被动技能:千幻冥炎真实伤害从2变4倍
             #curValue += GetPassiveSkillValueByTriggerType(attacker, defender, curSkill, ChConfig.TriggerType_PassiveBuffValue)
-            curValue += callFunc(attacker, defender, passiveEffect)
-            
+            value = callFunc(attacker, defender, passiveEffect)
+            if triggerType in TriggerValueMaxList:
+                curValue = max(curValue, value) # 取最大值
+            elif triggerType in TriggerValueMinList:
+                if not curValue:
+                    curValue = value
+                elif value > 0:
+                    curValue = min(curValue, value) # 取最小值
+            else:
+                curValue += value
+                
     return curValue
 
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
index de17cde..6ab83b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -3946,7 +3946,7 @@
         if curPlayerSkill == None:
             continue
         funcType = curPlayerSkill.GetFuncType()
-        if funcType not in funcTypeList:
+        if funcTypeList and funcType not in funcTypeList:
             continue
         funcTypeKey = str(funcType)
         if funcTypeKey not in skillDict:

--
Gitblit v1.8.0