10019 【砍树】回合战斗(调整闪避公式计算方式;灵宠及反击必命中;普攻暴击后可触发被动;调整击晕优先级提前到其他被动触发前;NPC新增触发被动方式;)
1. 调整闪避公式计算方式,改为是否闪避,简化公式;
2. 增加灵宠及反击必命中;部分触发类伤害技能可通过技能ExAttr2配置必命中;
3. 普攻暴击后可触发被动;
4. 调整击晕优先级提前到反击和其他被动触发前;不然可能导致被攻击方先触发了反击或某些被动后再被击晕;最大击晕概率配置由6000调整为9000;
5. NPC支持被击、闪避、击晕、暴击、连击、反击前、反击后可触发被动;
6. 回血量增加支持按已损失血量百分比恢复;
9个文件已修改
217 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -2066,12 +2066,12 @@
    if curSkill and atkObjType == IPY_GameWorld.gotPlayer and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
        aHit = aHit*IpyGameDataPY.GetFuncCfg("FightHappenRate", 2)
        
    aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
    aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
    #aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
    #aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
    dMiss = GameObj.GetMissRate(defObj)#defObj.GetMiss()
    dMiss += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissPer)
    dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
    dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
    #dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
    #dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
    skillID = curSkill.GetSkillID() if curSkill else 0
    
    
@@ -2101,6 +2101,7 @@
        if suppressNPCFightPower:
            suppressFightPower = max(0, suppressNPCFightPower - PlayerControl.GetFightPower(defObj))
            
    turnFightTimeline = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
    mustHit = False
    petNPCOwner = None
    helpBattleFormatKey = ""
@@ -2118,11 +2119,18 @@
        helpBattleFormatKey = "HelpRobot_Def"
    if atkObjType == IPY_GameWorld.gotNPC and PetControl.IsPetNPC(atkObj):
        mustHit = True
        GameWorld.DebugLog("        灵宠必命中")
        petNPCOwner = PetControl.GetPetNPCOwner(atkObj)
    if turnFightTimeline:
        if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType) == ChConfig.TurnBattleType_AtkBack:
            mustHit = True
            GameWorld.DebugLog("        反击必命中: atkID=%s,defID=%s" % (atkObj.GetID(), defObj.GetID()))
    if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn):
        mustHit = True
        GameWorld.DebugLog("        技能必命中: skillID=%s" % skillID)
        
    #命中公式 攻击方类型不同,公式不同
    hitFormula = ReadChConfig.GetChConfig('CalcCanHit')
    missRateFormula = ReadChConfig.GetChConfig('CalcCanHit')
    if not mustHit and not PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, 
                           ChConfig.TriggerType_Buff_MustBeHit):
        # 技能对指定BOSS无效果的返回MISS
@@ -2135,12 +2143,10 @@
        GameObj.GetPyPlayerState(defObj, ChConfig.Def_PlayerState_MissSneerAtk):
            return 0, ChConfig.Def_HurtType_Miss
        
        #添加是否必命中
        if not IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn) \
            and eval(hitFormula) < 0:
        missRate = eval(missRateFormula)
        if GameWorld.CanHappen(missRate):
            return 0, ChConfig.Def_HurtType_Miss
    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] # 幸运一击
@@ -2365,7 +2371,7 @@
        hurtFormulaKey = helpBattleFormatKey
        
    # 回合战斗
    if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
    if turnFightTimeline:
        hurtFormulaKey = "TurnFight"
        
    if hurtFormulaKey not in hurtDist:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -1264,7 +1264,7 @@
        __DoPlayerBeAttacked(attacker, defender, curSkill, tick)
        
    elif defenderType == IPY_GameWorld.gotNPC:
        __DoNPCBeAttacked(defender, curSkill, tick)
        __DoNPCBeAttacked(attacker, defender, curSkill, tick)
        
    else:
        GameWorld.Log("被攻击错误 : %d " % defender.GetGameObjType())
@@ -1591,23 +1591,15 @@
# 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
def OnHurtTypeTriggerSkill(attacker, target, curSkill, tick):
def OnHurtTypeTriggerSkill(attacker, target, curSkill, skillHurtLists, tick):
    usePassiveSkillResult = True    # 第一次判断不能调用,即代表都不可用无需循环
    usePassiveSkillResultOnSuperHit = True    # 暴击对象1V1触发,第一次判断不能调用,即代表都不可用无需循环
    skillHurtLists = [] # 内部触发清除g_skillHurtList
    for i in xrange(g_skillHurtList.GetHurtCount()):
        hurtObj = g_skillHurtList.GetHurtAt(i)
        if not hurtObj:
            continue
        skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
    
    #命中个数记录特殊处理
    PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, target, curSkill, ChConfig.TriggerType_HitValue)
    
    # #持续攻击类BUFF 类剑刃风暴是先给自身一个持续性buff,这一次不算伤害不可触发
    if curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType():
    if not curSkill or (curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType()):
        #只对第一目标造成某伤害类型时触发技能, 需先存储 skillHurtLists
        OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick)
    
@@ -1664,8 +1656,41 @@
# 技能使用结束,在处理技能逻辑和通知封包之后调用
def UseSkillOver(attacker, defender, curSkill, tick):
    
    defHurtType = 0
    atkID = attacker.GetID()
    defID = defender.GetID() if defender else 0
    skillHurtLists = [] # 内部触发清除g_skillHurtList
    for i in xrange(g_skillHurtList.GetHurtCount()):
        hurtObj = g_skillHurtList.GetHurtAt(i)
        if not hurtObj:
            continue
        skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
        if defID == hurtObj.GetObjID():
            defHurtType = hurtObj.GetAttackType()
    isAtkSkill = (not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP)
    # 优先处理击晕
    if isAtkSkill:
        if defHurtType != ChConfig.Def_HurtType_Miss: # 非闪避才可触发
            AttackFaintRate(attacker, defender, curSkill, tick)
    # 回合制下
    turnBattleType = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
    if turnBattleType:
        attacker.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 直接重置,不然后续触发逻辑可能被视为连击
        if turnBattleType == ChConfig.TurnBattleType_Combo:
            comboNum = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
            attacker.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
            GameWorld.DebugLog("        连击: atkID=%s,comboNum=%s" % (atkID, comboNum))
            PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Combo, tick)
        elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
            atkBackNum = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
            attacker.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
            GameWorld.DebugLog("        反击: atkID=%s,atkBackNum=%s" % (atkID, atkBackNum))
            PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AtkBackAft, tick)
    # 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
    OnHurtTypeTriggerSkill(attacker, defender, curSkill, tick)
    OnHurtTypeTriggerSkill(attacker, defender, curSkill, skillHurtLists, tick)
    
    # 普通或者可以主动释放的攻击性技能
    if not curSkill or (curSkill.GetSkillType() == ChConfig.Def_SkillType_Atk and\
@@ -1676,14 +1701,13 @@
        PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Buff_AttackSubLayer, tick)
    
    # 普攻和对敌技能, 此处暂且特殊处理Def_SkillFuncType_PassiveSkillWithSP,待优化
    if not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP:
    if isAtkSkill:
        PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
        PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
        # TriggerType_AttackOver 和 TriggerType_AttackOverPassive 根据触发的被动buff效果顺序而定
        PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOverPassive, tick)
        
        AttackFaintRate(attacker, defender, curSkill, tick)
    else:
        PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SkillOverNoAttack, tick)
    
@@ -1740,11 +1764,11 @@
        lastTick = attacker.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintCD)
        remainTick = faintCD - (tick - lastTick)
        if remainTick > 0:
            GameWorld.DebugLog("击晕CD中! rate=%s,剩余tick=%s" % (rate, remainTick), attacker.GetID())
            GameWorld.DebugLog("        击晕CD中! rate=%s,剩余tick=%s,atkID=%s" % (rate, remainTick, attacker.GetID()))
            return
        attacker.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, tick)
    GameWorld.DebugLog("可触发击晕! rate=%s,tagID=%s" % (rate, defender.GetID()), attacker.GetID())
    SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick)
    GameWorld.DebugLog("        可触发击晕! rate=%s,atkID=%s,defID=%s" % (rate, attacker.GetID(), defender.GetID()))
    SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick, buffOwner=attacker)
    return
@@ -1985,7 +2009,7 @@
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def __DoNPCBeAttacked(curNPC, curSkill, tick):
def __DoNPCBeAttacked(attacker, curNPC, curSkill, tick):
    #NPC已经死亡
    if GameObj.GetHP(curNPC) <= 0:
        return
@@ -2004,6 +2028,11 @@
    # 被击添加不让主动移动,应用AI1
    if curNPC.GetIsBoss() == 0:
        curNPC.SetDict("NPCBeAttackedAI1", tick)
    # 回合制下NPC被击可触发
    if (not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List) and curNPC.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
        PassiveBuffEffMng.OnPassiveSkillTrigger(curNPC, attacker, None, ChConfig.TriggerType_BeAttackOver, tick)
    return
# 客户端搜索对象的链式攻击
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -264,7 +264,7 @@
            tagObjID = tagGameObj.GetID()
            tagHP = GameObj.GetHP(tagGameObj)
            
            GameWorld.DebugLog("    ★回合%s.%s %s 行动 : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)"
            GameWorld.DebugLog("★回合%s.%s %s 行动 : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)"
                               % (turnNum, actionNum, objName, objType, objID, curHP, gameObj.GetMaxAtk(), tagObjType, tagObjID, tagHP))
            
            if not DoAttack(gameObj, tagGameObj, tick):
@@ -708,31 +708,26 @@
                       % (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt, GameObj.GetHP(tagObj)))
    return
def DoAttack(curObj, tagObj, tick):
def DoAttack(curObj, tagObj, tick, turnBattleType=ChConfig.TurnBattleType_Normal):
    curID = curObj.GetID()
    tagID = tagObj.GetID()
    objName = GetObjName(curObj)
    GameWorld.DebugLog("    ● %s DoAttack: curID=%s,tagID=%s,turnBattleType=%s" % (objName, curID, tagID, turnBattleType))
    if turnBattleType == ChConfig.TurnBattleType_AtkBack:
        PassiveBuffEffMng.OnPassiveSkillTrigger(curObj, tagObj, None, ChConfig.TriggerType_AtkBackBef, tick)
    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, turnBattleType)
    if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer: 
        atkOK = PlayerAttack(curObj, tagObj, tick)
    elif curObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID):
        atkOK = PlayerMirrorAttack(curObj, tagObj, tick)
    else:
        atkOK = NPCAttack(curObj, tagObj, tick)
    turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型
    
    if not atkOK:
        return
    
    if turnBattleType == ChConfig.TurnBattleType_Combo:
        comboNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
        curObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
        GameWorld.DebugLog("            连击: comboID=%s,comboNum=%s" % (curID, comboNum))
    elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
        atkBackNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
        curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
        GameWorld.DebugLog("            反击: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum))
    curHP = GameObj.GetHP(curObj)
    tagHP = GameObj.GetHP(tagObj)
    GameWorld.DebugLog("            curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, curHP, tagID, tagHP))
@@ -741,12 +736,12 @@
    
    # 反击,反击可打断连击,所以优先判断
    if CanAtkBack(curObj, tagObj):
        DoAttack(tagObj, curObj, tick)
        DoAttack(tagObj, curObj, tick, ChConfig.TurnBattleType_AtkBack)
        return True
    
    # 连击
    if CanCombo(curObj, tagObj):
        DoAttack(curObj, tagObj, tick)
        DoAttack(curObj, tagObj, tick, ChConfig.TurnBattleType_Combo)
        
    return True
@@ -773,7 +768,6 @@
        return False
    GameWorld.DebugLog("            可以反击: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" 
                       % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate))
    defObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_AtkBack)
    return True
def CanCombo(atkObj, defObj):
@@ -797,7 +791,6 @@
        return False
    GameWorld.DebugLog("            可以连击: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" 
                       % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce))
    atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_Combo)
    return True
def NPCAttack(curObj, tagObj, tick):
@@ -805,7 +798,6 @@
    if not curObj:
        return
    
    objName = "● %s" % GetObjName(curObj)
    #有值代表灵宠上阵位置,判断是否有概率攻击
    fightPlaceNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
    if fightPlaceNum > 0:
@@ -833,18 +825,17 @@
            #普通攻击
            atkOK = BaseAttack.Attack(curObj, tagObj, None, tick)
            if atkOK:
                GameWorld.DebugLog("        %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
                GameWorld.DebugLog("        普通攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
            else:
                GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
                GameWorld.DebugLog("        攻击失败: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
    else:
        GameWorld.DebugLog("        %s 技能攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
        GameWorld.DebugLog("        技能攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
    return atkOK
def PlayerMirrorAttack(playerNPC, tagObj, tick):
    ## 玩家镜像攻击
    
    playerID = playerNPC.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID)
    objName = "● %s" % GetObjName(playerNPC)
    tagObjID = tagObj.GetID()
    
    autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {})
@@ -865,17 +856,17 @@
            continue
        
        if not AICommon.DoNPCUseSkill(playerNPC, tagObj, curSkill, tagDist, tick):
            GameWorld.DebugLog("        %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
            GameWorld.DebugLog("        技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
            continue
        GameWorld.DebugLog("        %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
        GameWorld.DebugLog("        技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
        return skillID
    
    #普通攻击
    atkOK = BaseAttack.Attack(playerNPC, tagObj, None, tick)
    if atkOK:
        GameWorld.DebugLog("        %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
        GameWorld.DebugLog("        普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
    else:
        GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
        GameWorld.DebugLog("        攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
        
    return atkOK
@@ -887,7 +878,6 @@
    posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY()
    tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID()
    
    objName = "● %s" % GetObjName(curPlayer)
    curPlayer.ClearUseSkillRec()
    curPlayer.SetAttackTargetPos(posX, posY)
    curPlayer.SetUseSkillPosX(tagPosX)
@@ -917,10 +907,10 @@
        curPlayer.SetUseSkill(curSkill.GetSkillData())
        useSkillData = curPlayer.GetUseSkill()
        if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick):
            GameWorld.DebugLog("        %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
            GameWorld.DebugLog("        技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
            continue
        useSkillResult = True
        GameWorld.DebugLog("        %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
        GameWorld.DebugLog("        技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
        
        break
    
@@ -931,9 +921,9 @@
        atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick)
        if atkOK:
            useSkillResult = True
            GameWorld.DebugLog("        %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
            GameWorld.DebugLog("        普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
        else:
            GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
            GameWorld.DebugLog("        攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
    return useSkillResult
def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1194,7 +1194,8 @@
Def_Cure_HurtValue, # 伤害值 4
Def_Cure_TagMaxHP, # 目标最大生命值 5
Def_Cure_TagAtk, # 目标攻击力 6
) = range(7)
Def_Cure_LostHP, # 已损失生命 7
) = range(8)
#回魔类型(影响公式参数)
Def_RestoreTypeList = (
@@ -5090,7 +5091,11 @@
TriggerType_HitValue, # 记录命中个数 89
TriggerType_ChangeSkillEff, # 改变技能特效广播 90
TriggerType_TurnNum, # 回合触发 91
) = range(1, 92)
TriggerType_Faint, # 击晕触发 92
TriggerType_Combo, # 连击触发 93
TriggerType_AtkBackBef, # 反击前触发 94
TriggerType_AtkBackAft, # 反击后触发 95
) = range(1, 96)
#不可以佩戴翅膀的地图
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -152,13 +152,6 @@
    gameObj.SetDict(ChConfig.Def_PlayerKey_CurState, 0)
    return
def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
def SetPetDamPer(gameObj, value):
    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
    return
def GetLastHurtValue(gameObj):
    ## 最后一击伤害值
    hurt = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_LastHurtValue)
@@ -179,6 +172,37 @@
    gameObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurtEx, value / ShareDefine.Def_PerPointValue)
    return
## ---------------------------------------------------------
def ClearBattleEffect(gameObj):
    gameObj.ClearBattleEffect()
    # 其他py层自定义战斗属性,由于EffGetSet中不是所有属性接口均通用,固这里先手动调用
    SetPetDamPer(gameObj, 0)
    SetFinalHurtPer(gameObj, 0)
    SetFinalHurtReducePer(gameObj, 0)
    SetAtkSpeed(gameObj, 0)
    SetSuperHitRateReduce(gameObj, 0)
    SetSuperHitReduce(gameObj, 0)
    SetFaintRate(gameObj, 0)
    SetFaintDefRate(gameObj, 0)
    SetComboRate(gameObj, 0)
    SetComboDefRate(gameObj, 0)
    SetComboDamPer(gameObj, 0)
    SetAtkBackRate(gameObj, 0)
    SetAtkBackDefRate(gameObj, 0)
    SetSuckHPPer(gameObj, 0)
    SetSuckHPDefPer(gameObj, 0)
    SetAtkBackHP(gameObj, 0)
    SetCurePer(gameObj, 0)
    SetCureDefPer(gameObj, 0)
    return
def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
def SetPetDamPer(gameObj, value):
    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
    return
def GetFinalHurtPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurtPer)
def SetFinalHurtPer(gameObj, value):
    ## 最终伤害百分比
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -4109,7 +4109,7 @@
        curNPC = self.__Instance
        maxHPBef = GameObj.GetMaxHP(curNPC)
        #清空NPC战斗属性
        curNPC.ClearBattleEffect()
        GameObj.ClearBattleEffect(curNPC)
        #--------------------------------------------
        #重置NPC战斗属性
        curNPC.ResetNPCBattleState()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
@@ -440,7 +440,12 @@
        # 暂且特殊处理控制类buff才触发
        if SkillCommon.GetBuffType(curSkill) == IPY_GameWorld.bfActionBuff:
            PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(curObj, buffOwner, curSkill, ChConfig.TriggerType_AddBuffOver, False)
        # 击晕触发
        if curSkill.GetSkillTypeID() == ChConfig.Def_SkillID_AtkerFaint:
            GameWorld.DebugLog("        被击晕: curID=%s,atkID=%s" % (curObj.GetID(), buffOwner.GetID()))
            PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, None, ChConfig.TriggerType_Faint, tick)
    #是否是持续性技能
    isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List
    
@@ -712,8 +717,8 @@
            remainTime = curBuffRemainTime
            if passTurnNum > 0: # 最小单位1回合,有满1回合才减时长
                remainTime = curBuffRemainTime - ChConfig.Def_PerTurnTick * passTurnNum
                GameWorld.DebugLog("    刷新回合buff时间: objID=%s,skillID=%s,remainTime=%s,calcTick=%s,timeline=%s,passTurnNum=%s"
                                   % (curObj.GetID(), curSkill.GetSkillID(), remainTime, calcTick, turnFightTimeline, passTurnNum))
                GameWorld.DebugLog("    刷新回合buff时间: objID=%s,skillID=%s(%s),layer=%s,remainTime=%s,calcTick=%s,timeline=%s,passTurnNum=%s"
                                   % (curObj.GetID(), curSkill.GetSkillID(), curSkill.GetSkillName(), curBuff.GetLayer(), remainTime, calcTick, turnFightTimeline, passTurnNum))
                curBuff.SetCalcStartTick(turnFightTimeline)
                curBuff.SetRemainTime(remainTime)
                
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -1670,7 +1670,7 @@
#  @param skillLV 技能等级
#  @return None or True
#  @remarks 函数详细说明.
def AddBuffBySkillType(curObj , skillType , tick , skillLV=None):
def AddBuffBySkillType(curObj , skillType , tick , skillLV=None, buffOwner=None):
    curSkill = None
    
    if skillLV == None :
@@ -1700,7 +1700,7 @@
    #        GameWorld.ErrLog("SkillBuff_AddBuffValue.AddBuffValue")
    #===========================================================================
    
    return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue])
    return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue], buffOwner)
## 查找技能并添加buff(不刷新)
@@ -2235,6 +2235,8 @@
        cureBaseValue = 0 if not tagObj else GameObj.GetMaxHP(tagObj)
    elif cureType == ChConfig.Def_Cure_TagAtk:
        cureBaseValue = 0 if not tagObj else GetCureBaseValue(tagObj, curSkill)
    elif cureType == ChConfig.Def_Cure_LostHP:
        cureBaseValue = max(0, GameObj.GetMaxHP(userObj) - GameObj.GetHP(userObj))
        
        
    #这边写死了效果1,基本已经定型
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -435,7 +435,11 @@
             4109:ChConfig.TriggerType_SkillValue,   # 增加技能伤害固定值 82
             4110:ChConfig.TriggerType_ChangeSkillEff, # 改变技能特效
             4111:ChConfig.TriggerType_AttackOver,  # 攻击(对敌技能)后被动技能被触发 4
             4112:ChConfig.TriggerType_Faint,  # 击晕触发 92
             5000:ChConfig.TriggerType_TurnNum, # 回合触发 91
             5001:ChConfig.TriggerType_Combo, # 连击触发 93
             5002:ChConfig.TriggerType_AtkBackBef, # 反击前触发 94
             5003:ChConfig.TriggerType_AtkBackAft, # 反击后触发 95
             }
    return tdict.get(effectID, -1) 
    #===========================================================================