10019 【砍树】回合战斗(NPC攻、防、生命字段调整到NPC表扩展;增加按目标生命百分比判断高于或低于时被动增加最终伤害百分比数值;增加首次生命低于x触发被动)
8个文件已修改
2个文件已添加
118 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4113.py 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5004.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;    //抗闪避概率
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())
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()
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字典-------
#每道龙卷风最终坐标
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):
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 # 抗闪避概率
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())
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4113.py
New file
@@ -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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5004.py
New file
@@ -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
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) 
    #===========================================================================