10019 【砍树】回合战斗(增加buff被动效果ID 4543、4544、4545、4546;)
1. 增加buff被动效果ID4543: 被暴击附加额外伤害百分比;
2. 增加buff被动效果ID4544: 触发时减少buff层数;
3. 增加buff被动效果ID4545: 灵宠技能释放成功触发技能;
4. 增加buff被动效果ID4546: 灵宠释放技能后触发删除本buff;
5. 技能被动效果ID 5000,支持每X回合配置;
6. buff替换方式增加方式3 - 只取最高,相同或低级的则不处理,减少长时buff无用的重复添加逻辑;

增加山寨技能
神识 灭心魔种 每次攻击给目标施加易伤状态,产生暴击后,附加额外的50%伤害,并移除该状态。
驭兽 寒息 每过3回合,在灵兽下一次释放技能后有20%概率对敌人施加一次冰冻技能,持续到下回合。冰冻期间敌人无法行动且精怪无法触发。
躯体 兽灵体 每次被攻击增加3%灵兽强化,最高叠加10层,持续到下次灵兽行动。
8个文件已修改
3个文件已添加
178 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4543.py 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4545.py 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4546.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5000.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -2191,6 +2191,7 @@
        if GameWorld.CanHappen(missRate):
            return 0, ChConfig.Def_HurtType_Miss
        
    hurtValueExPer = 0 # 最终的伤害值附加额外伤害百分比
    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] # 幸运一击
@@ -2207,6 +2208,9 @@
        superHitPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitPer)
        superHitPer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitPer)
        aSuperHit = aSuperHit*(superHitPer + ChConfig.Def_MaxRateValue)/ChConfig.Def_MaxRateValue
        if isSuperHit:
            hurtValueExPer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_BeSuperHitHurtExPer)
    else:
        # 重击加成
        thumpPer = 0
@@ -2452,6 +2456,12 @@
                           % (atkObj.GetID(), defObj.GetID(), skillID, hurtValue, multiValue))
        hurtValue = int(hurtValue * multiValue)
        
    # 附加额外的伤害百分比 - 在最终的伤害计算完后再额外附加的伤害百分比
    if hurtValueExPer > 0:
        GameWorld.DebugLog("        额外附加伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,hurtValueExPer=%s"
                           % (atkObj.GetID(), defObj.GetID(), skillID, hurtValue, hurtValueExPer))
        hurtValue += int(hurtValue * hurtValueExPer / float(ChConfig.Def_MaxRateValue))
    #hurtValue = min(max(hurtValue, 0), ChConfig.Def_UpperLimit_DWord)
    
    if hurtType == ChConfig.Def_HurtType_Normal and atkSkillPerYinji > 0:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -1723,6 +1723,8 @@
        petOwner = PetControl.GetPetNPCOwner(attacker)
        petOwner.SetDict("useSkillPetID", attacker.GetID())
        PassiveBuffEffMng.OnPassiveSkillTrigger(petOwner, defender, curSkill, ChConfig.TriggerType_SkillSuccessPet, tick)
        PassiveBuffEffMng.OnPassiveBuffTrigger(petOwner, defender, curSkill, ChConfig.TriggerType_SkillSuccessPet, tick)
        PassiveBuffEffMng.OnPassiveBuffHappen(petOwner, defender, curSkill, ChConfig.TriggerType_SkillSuccessPet, tick)
        if isAtkSkill:
            PassiveBuffEffMng.OnPassiveSkillTrigger(petOwner, defender, curSkill, ChConfig.TriggerType_AttackOverPet, tick)
            
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -68,7 +68,8 @@
Def_Buff_Replace_Better,    # 相同typeid取最高,如果新的是低级的则不处理
Def_Buff_Replace_New,       # 相同typeid替换最新,即使是低级的
Def_Buff_Recharge,        # 若同类型buff存在不管等级高低,只给原buff充能只改变值或时间
) = range(3)
Def_Buff_Replace_BetterOnly,    # 相同typeid取最高,只取最高,相同或低级的则不处理
) = range(4)
# CanRepeatTime字段百位数,同一个释放者只能存在同一个技能buff,不同释放者根据情况而定
(
@@ -686,7 +687,8 @@
Def_Skill_Effect_MPPackage = 831
#技能buff状态效果 A值为buff所属状态, 标记详见 Def_PlayerStateList
Def_Skill_Effect_BuffState = 4012
#buff触发时减层数
Def_Skill_Effect_BuffTriggerDelLayer = 4544
# 给宠物加属性的效果值, 不给人物属性
Def_SkillEffs_Pet = [508]
@@ -5152,7 +5154,8 @@
TriggerType_TurnFightStart, # 回合开场触发 100
TriggerType_BeMissSkill,   # 目标闪避后触发技能 101
TriggerType_BeHurtMax,   # 锁定受到伤害最大值 102
) = range(1, 103)
TriggerType_BeSuperHitHurtExPer,  # 被暴击附加额外伤害百分比 103
) = range(1, 104)
#不可以佩戴翅膀的地图
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -311,10 +311,25 @@
    return
def GetSuperHitReduce(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_SuperHitReduce)
def SetSuperHitReduce(gameObj, value):
    ## 暴击伤害减免
    ## 暴击固定伤害减免 - 暴击时附加固定伤害减免,与 atkObj.GetSuperHit() 相对
    gameObj.SetDict(ChConfig.Def_PlayerKey_SuperHitReduce, value)
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitReduce, value)
    return
def GetSuperHitHurtPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuperHitHurtPer)
def SetSuperHitHurtPer(gameObj, value):
    ## 强化暴伤 - 暴击时的总伤害加成,与 SuperHitHurtDefPer 相对,注意与暴击固定伤害区分
    gameObj.SetDict(ChConfig.AttrName_SuperHitHurtPer, value)
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitHurtPer, value)
    return
def GetSuperHitHurtDefPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuperHitHurtDefPer)
def SetSuperHitHurtDefPer(gameObj, value):
    ## 弱化暴伤 - 暴击时的总伤害减免
    gameObj.SetDict(ChConfig.AttrName_SuperHitHurtDefPer, value)
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitHurtDefPer, value)
    return
def GetFaintRate(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintRate)
@@ -423,21 +438,6 @@
    gameObj.SetDict(ChConfig.AttrName_PetWeakenPer, value)
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetWeakenPer, value)
    return
def GetSuperHitHurtPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuperHitHurtPer)
def SetSuperHitHurtPer(gameObj, value):
    ## 强化暴伤
    gameObj.SetDict(ChConfig.AttrName_SuperHitHurtPer, value)
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitHurtPer, value)
    return
def GetSuperHitHurtDefPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuperHitHurtDefPer)
def SetSuperHitHurtDefPer(gameObj, value):
    ## 弱化暴伤
    gameObj.SetDict(ChConfig.AttrName_SuperHitHurtDefPer, value)
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitHurtDefPer, value)
    return
def GetDamageBackRate(gameObj):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
@@ -219,7 +219,12 @@
            if buffSkillLV > curSkillLV:
                # 只取最好的, 不可加直接退出
                return False
        elif buffReplaceType == ChConfig.Def_Buff_Replace_BetterOnly:
            if buffSkillLV >= curSkillLV:
                # 只取最好的, 等级相同也不处理,适用于长时buff,防止相同等级时重复添加buff,减少处理逻辑及封包同步
                #GameWorld.DebugLog("已存在buff,不处理! skillID=%s" % buffSkillID)
                return
        resultTime = -1 #不改变时间的情况
        if buffRepeatTimeType == ChConfig.Def_BuffTime_Reset:
            # 重置时间
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4543.py
New file
@@ -0,0 +1,31 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveBuff.PassiveBuff_4543
#
# @todo: BUFF类: 被暴击附加额外伤害百分比
# @author hxp
# @date 2024-04-11
# @version 1.0
#
# 详细描述: BUFF类: 被暴击附加额外伤害百分比
#
#-------------------------------------------------------------------------------
#"""Version = 2024-04-11 16:30"""
#-------------------------------------------------------------------------------
import GameObj
def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
    # 状态判断
    #if passiveEffect.GetEffectValue(1):
    #    if not GameObj.GetPyPlayerState(attacker, passiveEffect.GetEffectValue(1)):
    #        return False
    return True
def GetValue(attacker, defender, passiveEffect):
    return passiveEffect.GetEffectValue(0)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4545.py
New file
@@ -0,0 +1,25 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveBuff.PassiveBuff_4545
#
# @todo:buff中灵宠释放技能后触发技能,所有技能
# @author hxp
# @date 2024-04-11
# @version 1.0
#
# 详细描述: buff中灵宠释放技能后触发技能,所有技能
#
#-------------------------------------------------------------------------------
#"""Version = 2024-04-11 16:30"""
#-------------------------------------------------------------------------------
import GameWorld
def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
    return GameWorld.CanHappen(passiveEffect.GetEffectValue(0))
def GetSkillData(passiveEffect):
    skillID = passiveEffect.GetEffectValue(1)
    return GameWorld.GetGameData().GetSkillBySkillID(skillID)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4546.py
New file
@@ -0,0 +1,29 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveBuff.PassiveBuff_4546
#
# @todo:buff中灵宠释放技能后触发删除本buff
# @author hxp
# @date 2024-04-11
# @version 1.0
#
# 详细描述: buff中灵宠释放技能后触发删除本buff
#
#-------------------------------------------------------------------------------
#"""Version = 2024-04-11 16:30"""
#-------------------------------------------------------------------------------
import GameWorld
import BuffSkill
def CheckCanHappen(attacker, defender, effect, tagSkill, **skillkwargs):
    return True
def DoLogic(attacker, defender, effect, tagSkill, skillID):
    tick = GameWorld.GetGameWorld().GetTick()
    isOK = BuffSkill.DelBuffBySkillID(attacker, skillID, tick)
    #GameWorld.DebugLog("buff中灵宠释放技能后触发删除本buff! atkID=%s,delSkillID=%s,isOK=%s" % (attacker.GetID(), skillID, isOK))
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5000.py
@@ -19,7 +19,7 @@
# 进入XX buff状态触发技能
def CheckCanHappen(attacker, defender, effect, curSkill):
    #A-回合编号(0-每回合,>=1-第x回合);B-判断方式(0-等于,1-大于等于,2-小于等于);C-
    #A-回合编号(0-每回合,>=1-x回合);B-判断方式(0-等于,1-大于等于,2-小于等于,3-每x回合);C-
    timeLine = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
    if not timeLine:
        return False
@@ -28,15 +28,18 @@
    checkType = effect.GetEffectValue(1)
    if checkTurnNum:
        turnNum = timeLine / 100
        if checkType == 0:
        if checkType == 0: # 第x回合
            if turnNum != checkTurnNum:
                return False
        elif checkType == 1:
        elif checkType == 1: # 大于等于x回合
            if turnNum < checkTurnNum:
                return False
        elif checkType == 2:
        elif checkType == 2: # 小于等于x回合
            if turnNum > checkTurnNum:
                return False
        elif checkType == 3: # 每x回合
            if turnNum % checkTurnNum != 0:
                return False
        else:
            return False
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -509,6 +509,9 @@
             4540:ChConfig.TriggerType_SuperHitPer, # 暴击伤害百分比
             4541:ChConfig.TriggerType_AttackAddSkillPer, # BUFF类:提高主动技能的技能伤害
             4542:ChConfig.TriggerType_BeHurtMax, # BUFF类:锁定受到伤害最大值 102
             4543:ChConfig.TriggerType_BeSuperHitHurtExPer, # BUFF类: 被暴击附加额外伤害百分比 103
             4545:ChConfig.TriggerType_SkillSuccessPet, # BUFF类: 灵宠技能释放成功都可触发
             4546:ChConfig.TriggerType_SkillSuccessPet, # BUFF类: 灵宠释放技能后触发删除本buff
             
             803:ChConfig.TriggerType_BloodShield,  # 血盾
             806:ChConfig.TriggerType_BloodShield,  # 血盾
@@ -1564,6 +1567,8 @@
        
        if not IsValidPassiveSkill(curSkill):
            continue
        triggerCount = 0
        for effectInfo in effectList:
            passiveEffect = effectInfo[0]
            # 被动触发的技能
@@ -1590,8 +1595,14 @@
            SkillCommon.SetUsingPassiveSkill(attacker, 1)
            if SkillShell.UsePassiveTriggerSkill(attacker, skillData, defender, tick):
                AfterUsePassiveSkill(pyName, attacker, defender, passiveEffect, tick)
                triggerCount += 1
            SkillCommon.SetUsingPassiveSkill(attacker, 0)
        if triggerCount:
            hasEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_BuffTriggerDelLayer)
            if hasEffect:
                BuffSkill.ReduceBuffLayer(attacker, None, curSkill.GetSkillTypeID(), triggerCount)
def AfterUsePassiveSkill(pyName, attacker, defender, passiveEffect, tick):
    # 附加触发后逻辑
    callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "AfterUsePassiveSkill"))
@@ -1641,6 +1652,7 @@
        if not IsValidPassiveSkill(curSkill):
            continue
        
        triggerCount = 0 # 成功触发次数
        for effectInfo in effectList:
            if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
                # 只有天赋才可以再次被触发
@@ -1674,6 +1686,13 @@
            else:
                curValue += value
                
            triggerCount += 1
        if triggerCount:
            hasEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_BuffTriggerDelLayer)
            if hasEffect:
                BuffSkill.ReduceBuffLayer(attacker, None, curSkill.GetSkillTypeID(), triggerCount)
    return curValue
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -3631,6 +3631,9 @@
        addBuffValueList = GetAddBuffValue(attacker, curSkill, defender)
        result = BuffSkill.DoAddBuff(defender, skillBuffType, curSkill, tick, addBuffValueList, attacker, addForce=addForce)
        
        if result == None:
            return
        # result为0 是抵消的不需要对buff处理
        if result is not 0:
            #添加BUFF后:处理技能效果,触发附加技能,加BUFF后产生的效果,惩罚和仇恨