From 92f730f4bac31c1872886892310701c6809d002a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 20 一月 2024 16:44:27 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(NPC攻、防、生命字段调整到NPC表扩展;增加按目标生命百分比判断高于或低于时被动增加最终伤害百分比数值;增加首次生命低于x触发被动)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py             |    2 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5004.py |   23 +++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                       |   12 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                       |    4 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4113.py |   35 +++++++++++++++++
 PySysDB/PySysDBPY.h                                                                                        |    4 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py                             |   17 +++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py     |   17 +++-----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                            |    2 +
 10 files changed, 104 insertions(+), 14 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index e5b5974..6a71ef2 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -613,6 +613,10 @@
 	DWORD		_NPCID;	//NPCID
 	BYTE		FightPowerLackAtkLimit;	//战力不足限制攻击
 	DWORD		SuppressFightPower;	//推荐/压制战力
+	DWORD		MinAtk;	//最小攻击力
+	DWORD		MaxAtk;	//最大攻击力
+	DWORD		Def;	//防御值
+	DWORD		MaxHP;	//最大生命值,可超过20E
 	DWORD		AtkSpeed;	//攻击速度
 	DWORD		MissRate;	//闪避概率
 	DWORD		MissDefRate;	//抗闪避概率
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 96ac4d5..1040ff5 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
@@ -2241,9 +2241,11 @@
     dDef = defObj.GetDef()              # 防守方防御力
     dHP = GameObj.GetHP(defObj)                # 防守方当前血量
     dMaxHP = GameObj.GetMaxHP(defObj)          # 防守方最大血量
-    dIceDef = defObj.GetIceDef()        # 冰防, 元素真防, 玩家及NPC通用
+    dIceDef = defObj.GetIceDef()        # 冰防, 元素真防, 玩家及NPC通用    
     
     # 攻击方
+    aFinalHurtPer = GameObj.GetFinalHurtPer(atkObj) # 最外层伤害加成, 可能为负值
+    aFinalHurtPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalPer)
     if atkObjType == IPY_GameWorld.gotPlayer:
         aIgnoreDefRate = atkObj.GetIgnoreDefRate()  # 无视防御比率
         aSkillAtkRate = atkObj.GetSkillAtkRate()    # 技能攻击力加成
@@ -2253,8 +2255,6 @@
         aNPCHurtAddPer = PlayerControl.GetNPCHurtAddPer(atkObj)     # PVE伤害加成
         aDamagePerPVP = PlayerControl.GetDamagePerPVP(atkObj)     # 外层PVP伤害加成
         aDamagePerPVP += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddPVPDamagePer)
-        aFinalHurtPer = GameObj.GetFinalHurtPer(atkObj) # 最外层伤害加成, 可能为负值
-        aFinalHurtPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalPer)
         
         aFinalHurt = PlayerControl.GetFinalHurt(atkObj)     # 最终固定伤害
         # 被动增加最终伤害
@@ -2263,12 +2263,8 @@
         
         aOnlyFinalHurt = PlayerControl.GetOnlyFinalHurt(atkObj) # 额外固定伤害
         aFightPower = PlayerControl.GetFightPower(atkObj)
-        
-        
-        
     else:
         aIgnoreDefRate = 0  # 无视防御比率
-        aFinalHurtPer = GameObj.GetFinalHurtPer(atkObj) # 最外层伤害加成, 可能为负值
         aSkillAtkRate = NPCCommon.GetSkillAtkRate(atkObj)   # 技能攻击力加成
         if atkObjType == IPY_GameWorld.gotNPC and atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
             aSkillAtkRate += atkObj.GetSkillAtkRate()
@@ -2281,7 +2277,10 @@
         aOnlyFinalHurt = 0 # 额外固定伤害
         aFightPower = NPCCommon.GetSuppressFightPower(atkObj)
         
+        
     #防守方的类型
+    dFinalHurtReducePer = GameObj.GetFinalHurtReducePer(defObj)
+    dFinalHurtReducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_dFinalHurtReducePer)
     if defObjType == IPY_GameWorld.gotPlayer:
         dIgnoreDefRateReduce = PlayerControl.GetIgnoreDefRateReduce(defObj)  # 无视防御比率抗性
         dSkillAtkRateReduce = PlayerControl.GetSkillAtkRateReduce(defObj) # 技能攻击力减少
@@ -2292,9 +2291,6 @@
         dFinalHurtReduce = PlayerControl.GetFinalHurtReduce(defObj) # 最终固定伤害减少
         dBeHurtPer = PlayerControl.GetBeHurtPer(defObj)      # 加深受到伤害百分比
         dFightPower = PlayerControl.GetFightPower(defObj)
-        dFinalHurtReducePer = GameObj.GetFinalHurtReducePer(defObj)
-        dFinalHurtReducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_dFinalHurtReducePer)
-        
     else:
         dIgnoreDefRateReduce = 0    # 无视防御比率抗性
         dSkillAtkRateReduce = 0     # 技能攻击力减少
@@ -2303,7 +2299,6 @@
         dFinalHurtReduce = 0        # 最终固定伤害减少
         dBeHurtPer = 0
         dFightPower = NPCCommon.GetSuppressFightPower(defObj)
-        dFinalHurtReducePer = GameObj.GetFinalHurtReducePer(defObj)
         
     #攻击字典 { 攻击类型 : '公式' }
     mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
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 09f657b..1924a71 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -501,7 +501,7 @@
     gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, 0)
     SetTimeline(gameObj, 1, 0)
     GameObj.SetFaction(gameObj, faction)
-    GameObj.SetHPFull(gameObj)
+    GameObj.SetHPFull(gameObj, True)
     gameObj.RefreshView()
     
     objType = gameObj.GetGameObjType()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 24c6030..78845c7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3082,6 +3082,8 @@
 Def_Obj_Dict_FightPetPlaceNum = 'FightPetPlaceNum' # 出战灵宠上阵位置,1~n
 Def_Obj_Dict_FightPetQuality = 'FightPetQuality' # 出战灵宠品质
 Def_Obj_Dict_TurnEnemyID = 'TurnEnemyID' # 回合制战斗对手实例ID
+Def_Obj_Dict_TurnLowestHP = 'TurnLowestHP' # 本回合战斗中历史最低血量,求余亿部分
+Def_Obj_Dict_TurnLowestHPEx = 'TurnLowestHPEx' # 本回合战斗中历史最低血量,整除亿部分
 
 #---NPC字典-------
 #每道龙卷风最终坐标
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index 2f41f42..44d6085 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -45,16 +45,29 @@
                 #GameWorld.DebugLog("不能设置按时间掉血的怪物血量! id=%s,npciD=%s,value=%s,isByTime=%s" % (gameObj.GetID(), gameObj.GetNPCID(), value, isByTime))
                 return
         gameObj.SetHP(value % ShareDefine.Def_PerPointValue, value / ShareDefine.Def_PerPointValue, isNotify)
+        
+    # 更新历史最低血量
+    if value < GetLowestHP(gameObj):
+        SetLowestHP(gameObj, value)
     return
 
-def SetHPFull(gameObj):
+def SetHPFull(gameObj, resetLowestHP=False):
     SetHP(gameObj, GetMaxHP(gameObj))
+    if resetLowestHP:
+        SetLowestHP(gameObj, GetHP(gameObj))
     return
 
 def SetBaseMaxHP(gameObj, value):
     gameObj.SetBaseMaxHP(value % ShareDefine.Def_PerPointValue, value / ShareDefine.Def_PerPointValue)
     return
-    
+
+def SetLowestHP(gameObj, value):
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnLowestHP, value % ShareDefine.Def_PerPointValue)
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnLowestHPEx, value / ShareDefine.Def_PerPointValue)
+    return
+def GetLowestHP(gameObj):
+    return gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnLowestHP) + gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnLowestHPEx) * ShareDefine.Def_PerPointValue
+
 def GetAngryValue(curAngry):
     return curAngry.GetAngryValue() + curAngry.GetAngryValueEx() * ShareDefine.Def_PerPointValue
 def SetAngryValue(curAngry, value):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 3e7e584..10fcb1f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -499,6 +499,10 @@
                         ("DWORD", "NPCID", 1),
                         ("BYTE", "FightPowerLackAtkLimit", 0),
                         ("DWORD", "SuppressFightPower", 0),
+                        ("DWORD", "MinAtk", 0),
+                        ("DWORD", "MaxAtk", 0),
+                        ("DWORD", "Def", 0),
+                        ("DWORD", "MaxHP", 0),
                         ("DWORD", "AtkSpeed", 0),
                         ("DWORD", "MissRate", 0),
                         ("DWORD", "MissDefRate", 0),
@@ -3246,6 +3250,10 @@
         self.NPCID = 0
         self.FightPowerLackAtkLimit = 0
         self.SuppressFightPower = 0
+        self.MinAtk = 0
+        self.MaxAtk = 0
+        self.Def = 0
+        self.MaxHP = 0
         self.AtkSpeed = 0
         self.MissRate = 0
         self.MissDefRate = 0
@@ -3264,6 +3272,10 @@
     def GetNPCID(self): return self.NPCID # NPCID
     def GetFightPowerLackAtkLimit(self): return self.FightPowerLackAtkLimit # 战力不足限制攻击
     def GetSuppressFightPower(self): return self.SuppressFightPower # 推荐/压制战力
+    def GetMinAtk(self): return self.MinAtk # 最小攻击力
+    def GetMaxAtk(self): return self.MaxAtk # 最大攻击力
+    def GetDef(self): return self.Def # 防御值
+    def GetMaxHP(self): return self.MaxHP # 最大生命值,可超过20E
     def GetAtkSpeed(self): return self.AtkSpeed # 攻击速度
     def GetMissRate(self): return self.MissRate # 闪避概率
     def GetMissDefRate(self): return self.MissDefRate # 抗闪避概率
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 240cb37..2bcdc62 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -4121,6 +4121,10 @@
         #扩展属性
         npcDataEx = GetNPCDataEx(curNPC.GetNPCID())
         if npcDataEx:
+            curNPC.SetMinAtk(npcDataEx.GetMinAtk())
+            curNPC.SetMaxAtk(npcDataEx.GetMaxAtk())
+            curNPC.SetDef(npcDataEx.GetDef())
+            GameObj.SetMaxHP(curNPC, npcDataEx.GetMaxHP())
             GameObj.SetAtkSpeed(curNPC, npcDataEx.GetAtkSpeed())
             GameObj.SetMissRate(curNPC, npcDataEx.GetMissRate())
             GameObj.SetMissDefRate(curNPC, npcDataEx.GetMissDefRate())
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4113.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4113.py
new file mode 100644
index 0000000..ce8cd55
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4113.py
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveBuff.PassiveSkill_4113
+#
+# @todo:攻击增加最终伤害百分比,附加目标血量验证
+# @author hxp
+# @date 2024-01-20
+# @version 1.0
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-01-20 17:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import GameObj
+
+def CheckCanHappen(attacker, defender, effect, curSkill):
+    if not defender:
+        return False
+    
+    hpPer = effect.GetEffectValue(1)
+    calcType = effect.GetEffectValue(2)
+    if not hpPer:
+        return True
+    
+    tagHPPer = GameObj.GetHP(defender) * ChConfig.Def_MaxRateValue / GameObj.GetMaxHP(defender)
+    if calcType == 1:
+        # 大于,默认包含临界值等于
+        return tagHPPer >= hpPer
+    return tagHPPer <= hpPer
+
+def GetValue(attacker, defender, effect):
+    return effect.GetEffectValue(0)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5004.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5004.py
new file mode 100644
index 0000000..bebcb61
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5004.py
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveBuff.PassiveSkill_5004
+#
+# @todo:被攻击后触发被动技能, 附加条件 血量首次低于XX百分比
+# @author hxp
+# @date 2024-01-20
+# @version 1.0
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-01-20 17:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import GameObj
+
+def CheckCanHappen(attacker, defender, effect, curSkill):
+    hpPer = effect.GetEffectValue(0)
+    lowestHP = GameObj.GetLowestHP(attacker)
+    lowestHPPer = lowestHP * ChConfig.Def_MaxRateValue / GameObj.GetMaxHP(attacker)
+    return lowestHPPer < hpPer
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 c081357..f6c5d77 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -436,10 +436,12 @@
              4110:ChConfig.TriggerType_ChangeSkillEff, # 改变技能特效
              4111:ChConfig.TriggerType_AttackOver,  # 攻击(对敌技能)后被动技能被触发 4
              4112:ChConfig.TriggerType_Faint,  # 击晕触发 92
+             4113:ChConfig.TriggerType_AttackAddFinalPer, # 增加最终伤害百分比 59
              5000:ChConfig.TriggerType_TurnNum, # 回合触发 91
              5001:ChConfig.TriggerType_Combo, # 连击触发 93
              5002:ChConfig.TriggerType_AtkBackBef, # 反击前触发 94
              5003:ChConfig.TriggerType_AtkBackAft, # 反击后触发 95
+             5004:ChConfig.TriggerType_BeAttackOver,   # 被攻击后触发 20
              }
     return tdict.get(effectID, -1) 
     #===========================================================================

--
Gitblit v1.8.0