ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -31,7 +31,6 @@
import PlayerControl
import NPCCommon
import SkillCommon
import EffGetSet
import FBLogic
import ReadChConfig
import PetControl
@@ -46,15 +45,10 @@
import GameObj
import BuffSkill
import PlayerState
import MirrorAttack
import ChPyNetSendPack
import NPCHurtManager
import NetPackCommon
import FamilyRobBoss
import FBCommon
import ChNPC
import BossHurtMng
import NPCHurtMgr
import ChNetSendPack
import TurnAttack
@@ -374,15 +368,6 @@
    AddHurtValue(defender, attacker.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, 1)
    return
## 被攻击者被动buff触发
#  @param curTagPlayer 被攻击者
#  @param tick 当前时间
#  @param isSuperHit 暴击
#  @return None
#  @remarks 函数详细说明.
def DefenderSpringBuff(curTagPlayer, tick, isSuperHit=False):
    return
#---------------------------------------------------------------------
def GetBattleRelationType(attacker, defender):
@@ -448,44 +433,6 @@
    #NPC读表取
    return attack.GetHurtType()
## 输入基础数值,返回增强后的值 - 技能加强
#  @param value 基础值
#  @param skill 技能
#  @return 增强后的值
#  @remarks 函数详细说明.
def GetEnhanceValue(value, skill):
    per = skill.GetEffect(0).GetEffectValue(0)
    eff = skill.GetEffect(0).GetEffectValue(1)
    #GameWorld.Log("被动 -> 自身属性,技能ID = %s,技能增强 = %s,附加 = %s , 基础值 = %s"%(skill.GetSkillName(),per,eff,value))
    return max(value * per / ChConfig.Def_MaxRateValue + eff , 1)
## 输入基础数值,返回增强后的值 (LV)- 效果加强
#  @param value 基础值
#  @param eff 效果
#  @return 增强后的值
#  @remarks 函数详细说明.
def GetEnhanceValue_Eff(value, eff):
    per = eff.GetEffectValue(0)
    eff = eff.GetEffectValue(1)
    #GameWorld.Log("value = %s,per = %s,erf = %s"%(value,per,eff))
    return max(value * per / ChConfig.Def_MaxRateValue + eff , 1)
## 输入基础效果值,(玩家索引) -> 技能增强
#  @param curPlayer 当前玩家
#  @param curEffect 当前效果
#  @return 增强后的值
#  @remarks 函数详细说明.
def GetEnhanceIndexValue_Eff(curPlayer, curEffect):
    index = curEffect.GetEffectValue(0)
    skillPer = curEffect.GetEffectValue(1)
    effect = curEffect.GetEffectValue(2)
    maxValue = EffGetSet.GetValueByEffIndex(curPlayer, index)
    #GameWorld.Log("-----%s,%s,%s,%s"%(index,skillPer,effect,maxValue))
    if maxValue == None:
        return 0
    return max(maxValue * skillPer / ChConfig.Def_MaxRateValue + effect , 1)
#--------------------------------------------------------------------------
## 设置玩家进入战斗状态
#  @param defender 当前玩家(被攻击了)
@@ -664,19 +611,11 @@
        
    curObjType = curObj.GetGameObjType()
    if curObjType == IPY_GameWorld.gotPlayer:
        #BossHurtMng.BossAddPlayerInHurtList(curObj, curTagObj, hurtHP)
        FamilyRobBoss.OnPlayerHurtFamilyOwnerBoss(curObj, curTagObj, hurtHP)
        if curTagObj.GetGameObjType() == IPY_GameWorld.gotNPC:
            FBLogic.DoFB_Player_HurtNPC(curObj, curTagObj, hurtHP)
        if GameObj.GetHP(curTagObj) == 0:
            curTagObj.SetDict(ChConfig.Def_PlayerKey_LastHurt, curObj.GetPlayerID())
            
        if NPCHurtManager.AddHurtValue(curObj, curTagObj, hurtHP, isBounce):
            return
        if NPCHurtMgr.AddHurtValue(curObj, curTagObj, hurtHP, isBounce):
            return
        curTeam = curObj.GetTeam()
        if curTeam == None:
            #无队伍,添加个人伤害
@@ -742,10 +681,6 @@
        #if not CheckAttackNPCByCnt(attacker, defender):
        #    return False
        
        #击杀次数判断
        if not NPCHurtManager.IsAssistPlayer(attacker.GetPlayerID(), defender) and not CheckKillNPCByCnt(attacker, defender):
            return False
        #仙盟归属NPC判断
        if not CheckCanAttackFamilyOwnerNPC(attacker, defender):
            return False
@@ -756,10 +691,6 @@
        #if not CheckAttackNPCByCnt(defender, attacker, False):
        #    return False
        
        #击杀次数判断
        if not CheckKillNPCByCnt(defender, attacker, False) and not NPCHurtManager.IsAssistPlayer(defender.GetPlayerID(), attacker):
            return False
        #仙盟归属NPC判断
        if not CheckCanAttackFamilyOwnerNPC(defender, attacker, False):
            return False
@@ -767,11 +698,11 @@
    # NPC打NPC
    elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotNPC:
        if PetControl.IsPet(attacker) or attacker.GetGameNPCObjType()== IPY_GameWorld.gnotSummon:
            #击杀次数判断
            if not CheckKillNPCByCnt(attacker, defender, False):
                ownerPlayer = GetAttackPlayer(attacker)[0]
                if ownerPlayer and not NPCHurtManager.IsAssistPlayer(ownerPlayer.GetPlayerID(), defender):
                    return False
            ##击杀次数判断
            #if not CheckKillNPCByCnt(attacker, defender, False):
            #    ownerPlayer = GetAttackPlayer(attacker)[0]
            #    if ownerPlayer and not NPCHurtManager.IsAssistPlayer(ownerPlayer.GetPlayerID(), defender):
            #        return False
                
            #仙盟归属NPC判断
            if not CheckCanAttackFamilyOwnerNPC(attacker, defender, False):
@@ -884,28 +815,15 @@
        if not GameFuncComm.GetFuncCanUse(atkPlayer, funcID):
            PlayerControl.NotifyCode(atkPlayer, funcSysMark)
            return
    canKillCnt = BossHurtMng.GetCanKillBossCnt(atkPlayer, index)[0]
    if canKillCnt <= 0:
        #if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender):
        #    GameWorld.DebugLog("攻击过该boss可继续攻击")
        #    return True
        #次数不足
        # 实际攻击者类型None则需要提示玩家
        if npcObjType is None:
            if isNotify:
                sysMark = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 3, {}).get(index, '')
                PlayerControl.NotifyCode(atkPlayer, sysMark)
        return False
    npcDataEx = NPCCommon.GetNPCDataEx(npcID)
    if npcDataEx and npcDataEx.GetFightPowerLackAtkLimit():
        if npcDataEx.GetSuppressFightPower() > PlayerControl.GetFightPower(atkPlayer):
            if isNotify:
                PlayerControl.NotifyCode(atkPlayer, "BossFightPowerHint")
            #GameWorld.DebugLog("战力不足,无法攻击boss! npcID=%s,SuppressFightPower=%s > playerFightPower=%s"
            #                   % (npcID, npcDataEx.GetSuppressFightPower(), PlayerControl.GetFightPower(atkPlayer)))
            return False
    #npcDataEx = NPCCommon.GetNPCDataPy(npcID)
    #if npcDataEx and npcDataEx.GetFightPowerLackAtkLimit():
    #    if npcDataEx.GetSuppressFightPower() > PlayerControl.GetFightPower(atkPlayer):
    #        if isNotify:
    #            PlayerControl.NotifyCode(atkPlayer, "BossFightPowerHint")
    #        #GameWorld.DebugLog("战力不足,无法攻击boss! npcID=%s,SuppressFightPower=%s > playerFightPower=%s"
    #        #                   % (npcID, npcDataEx.GetSuppressFightPower(), PlayerControl.GetFightPower(atkPlayer)))
    #        return False
        
    return True
@@ -932,9 +850,6 @@
    hasAttackCnt = atkPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WorldBoss_HurtCnt, 0)
    
    if hasAttackCnt >= limitCnt:
        #if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender):
        #    GameWorld.DebugLog("攻击过该boss可继续攻击")
        #    return True
        #次数不足
        # 实际攻击者类型None则需要提示玩家
        if npcObjType is None:
@@ -1357,25 +1272,6 @@
            
    return hurtType, hurtTypeResultDict
def __HurtTypeHappen_LuckyHit(atkObj, defObj, happenState, curSkill):
    ''' 判断伤害类型是否发生 - 会心一击
    @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
    '''
    if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_LuckyHit):
        return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReduce(defObj)
    aLuckyHitRate = atkObj.GetLuckyHitRate()
    dLuckyHitRateReduce = PlayerControl.GetLuckyHitRateReduce(defObj)
    atkLuckyHitRate = eval(ReadChConfig.GetChConfig("CalcLuckyHitRate"))
    if atkLuckyHitRate <= 0:
        return
    if GameWorld.CanHappen(atkLuckyHitRate):
        return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReduce(defObj)
    return
def __HurtTypeHappen_SuperHit(atkObj, defObj, happenState, curSkill):
    ''' 判断伤害类型是否发生 - 暴击
    @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
@@ -1401,22 +1297,12 @@
    ''' 判断伤害类型是否发生 - 防守方抵御
    @return: 是否触发, 触发时伤害计算值, 触发时防守方的伤害减免值
    '''
    chanceDefPer = PlayerControl.GetDamChanceDef(defObj)
    if not chanceDefPer:
        return
    if GameWorld.CanHappen(ChConfig.Def_ChanceDefRate):
        return True, 0, chanceDefPer
    return
#def __HurtTypeHappen_Zhuxian(atkObj, defObj, happenState, curSkill):
#    """诛仙一击"""
#    rate = PlayerControl.GetZhuXianRate(atkObj)
#    if not rate:
#    chanceDefPer = PlayerControl.GetDamChanceDef(defObj)
#    if not chanceDefPer:
#        return
#
#    if GameWorld.CanHappen(rate):
#        return True, PlayerControl.GetZhuXianHurtPer(atkObj), 0
#    return
#    if GameWorld.CanHappen(ChConfig.Def_ChanceDefRate):
#        return True, 0, chanceDefPer
    return
# 致命一击
def __HurtTypeHappen_Deadly(atkObj, defObj, happenState, curSkill):
@@ -1461,21 +1347,21 @@
    if defObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        reducePer = SkillCommon.GetSkillReducePerByID(defObj, skillTypeID)
        
        #根据防守方职业 计算攻击方伤害加成
        if defObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]:
            addPer += PlayerControl.GetJobAHurtAddPer(atkObj)
        elif defObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]:
            addPer += PlayerControl.GetJobBHurtAddPer(atkObj)
        elif defObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]:
            addPer += PlayerControl.GetJobCHurtAddPer(atkObj)
        #根据攻击方职业 计算防守方伤害减免
        if atkObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]:
            reducePer += PlayerControl.GetJobAAtkReducePer(defObj)
        elif atkObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]:
            reducePer += PlayerControl.GetJobBAtkReducePer(defObj)
        elif atkObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]:
            reducePer += PlayerControl.GetJobCAtkReducePer(defObj)
#        #根据防守方职业 计算攻击方伤害加成
#        if defObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]:
#            addPer += PlayerControl.GetJobAHurtAddPer(atkObj)
#        elif defObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]:
#            addPer += PlayerControl.GetJobBHurtAddPer(atkObj)
#        elif defObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]:
#            addPer += PlayerControl.GetJobCHurtAddPer(atkObj)
#
#        #根据攻击方职业 计算防守方伤害减免
#        if atkObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]:
#            reducePer += PlayerControl.GetJobAAtkReducePer(defObj)
#        elif atkObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]:
#            reducePer += PlayerControl.GetJobBAtkReducePer(defObj)
#        elif atkObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]:
#            reducePer += PlayerControl.GetJobCAtkReducePer(defObj)
        
    if addPer or reducePer:
        addSkillPer = addPer - reducePer
@@ -1598,24 +1484,25 @@
    
# 攻击时防守方神兵护盾的处理
def CalcAtkProDef(atkObj, defObj, hurtValue, curSkill, tick):
    if defObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
        return hurtValue
    if not CheckIsPlayerOnwer(atkObj):
        return hurtValue
    curProDef = PlayerControl.GetProDef(defObj)
    if not curProDef:
        return hurtValue
    absortValue = min(PlayerControl.GetProDefAbsorb(defObj)*hurtValue/ChConfig.Def_MaxRateValue, curProDef)
    PlayerControl.SetProDef(defObj, curProDef - absortValue)
    # 被动技能触发
    defObj.SetDict(ChConfig.Def_PlayerKey_GodWeaponBeforeProDef, curProDef)
    PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_ProDefValue, tick)
    return hurtValue - absortValue
    return hurtValue
#    if defObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
#        return hurtValue
#
#    if not CheckIsPlayerOnwer(atkObj):
#        return hurtValue
#
#    curProDef = PlayerControl.GetProDef(defObj)
#    if not curProDef:
#        return hurtValue
#
#    absortValue = min(PlayerControl.GetProDefAbsorb(defObj)*hurtValue/ChConfig.Def_MaxRateValue, curProDef)
#
#    PlayerControl.SetProDef(defObj, curProDef - absortValue)
#
#    # 被动技能触发
#    defObj.SetDict(ChConfig.Def_PlayerKey_GodWeaponBeforeProDef, curProDef)
#    PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_ProDefValue, tick)
#    return hurtValue - absortValue
# 设置玩家一次主动型攻击中的第一个防御者
@@ -1624,7 +1511,7 @@
        return
    
    if curSkill and curSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_FbSkill,
                                          ChConfig.Def_SkillFuncType_NormalAttack]:
                                          ChConfig.Def_SkillFuncType_TurnNormaSkill]:
        return
    
    if attacker.GetDictByKey(ChConfig.Def_PlayerKey_FirstDefender):
@@ -1795,20 +1682,20 @@
    fightPowerMax = ipyData.GetFightPowerMax()
    everyFightPower = ipyData.GetEveryFightPower()
    everyFightPowerLostHPEx = ipyData.GetEveryFightPowerLostHPEx()
    if fightPowerMinByLV and fightPowerMin:
        npcLV = NPCCommon.GetNPCLV(curNPC)
        playerCurLVIpyData = PlayerControl.GetPlayerLVIpyData(npcLV)
        if not playerCurLVIpyData:
            return
        ReFightPower = playerCurLVIpyData.GetReFightPower() # 战斗力
        reRate = ReFightPower / float(fightPowerMin)
        #GameWorld.DebugLog("标准战力需要取等级表: fightPowerMin=%s,fightPowerMax=%s,everyFightPower=%s,npcLV=%s,ReFightPower=%s,reRate=%s"
        #                   % (fightPowerMin, fightPowerMax, everyFightPower, npcLV, ReFightPower, reRate))
        fightPowerMin = ReFightPower
        fightPowerMax = int(fightPowerMax * reRate)
        everyFightPower = int(everyFightPower * reRate)
        #GameWorld.DebugLog("按比例更新战力值信息: fightPowerMin=%s,fightPowerMax=%s,everyFightPower=%s"
        #                   % (fightPowerMin, fightPowerMax, everyFightPower))
    #if fightPowerMinByLV and fightPowerMin:
    #    npcLV = NPCCommon.GetNPCLV(curNPC)
    #    playerCurLVIpyData = PlayerControl.GetPlayerLVIpyData(npcLV)
    #    if not playerCurLVIpyData:
    #        return
    #   ReFightPower = playerCurLVIpyData.GetReFightPower() # 战斗力
    #    reRate = ReFightPower / float(fightPowerMin)
    #    #GameWorld.DebugLog("标准战力需要取等级表: fightPowerMin=%s,fightPowerMax=%s,everyFightPower=%s,npcLV=%s,ReFightPower=%s,reRate=%s"
    #    #                   % (fightPowerMin, fightPowerMax, everyFightPower, npcLV, ReFightPower, reRate))
    #    fightPowerMin = ReFightPower
    #    fightPowerMax = int(fightPowerMax * reRate)
    #    everyFightPower = int(everyFightPower * reRate)
    #    #GameWorld.DebugLog("按比例更新战力值信息: fightPowerMin=%s,fightPowerMax=%s,everyFightPower=%s"
    #    #                   % (fightPowerMin, fightPowerMax, everyFightPower))
        
    effFightPower = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_TimeLostHPFightPower) \
                    + curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_TimeLostHPFightPowerEx) * ChConfig.Def_PerPointValue
@@ -2013,7 +1900,7 @@
    
    turnFightPosInfo = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo)
    mustHit = False
    if SkillCommon.isXPSkill(curSkill):
    if SkillCommon.isAngerSkill(curSkill):
        mustHit = True
        GameWorld.DebugLog("        XP必命中")
        angerOverflow = max(GameObj.GetXP(atkObj) - IpyGameDataPY.GetFuncCfg("AngerXP", 2), 0)
@@ -2074,13 +1961,13 @@
    atkSkillPer = ChangeSkillHurtPer(atkObj, defObj, curSkill, atkSkillPer)
    
    # --- 新增普通攻击的数值和技能攻击的数值,根据类型各自计算
    if atkObjType == IPY_GameWorld.gotPlayer:
        if not curSkill or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_NormalAttack:
            atkSkillPer += PlayerControl.GetNormalHurtPer(atkObj)
            atkSkillValue += PlayerControl.GetNormalHurt(atkObj)
        elif curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_FbPassiveSkill]:
            atkSkillPer += PlayerControl.GetFabaoHurtPer(atkObj)
            atkSkillValue += PlayerControl.GetFabaoHurt(atkObj)
    #if atkObjType == IPY_GameWorld.gotPlayer:
    #    if not curSkill or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_TurnNormaSkill:
    #        atkSkillPer += PlayerControl.GetNormalHurtPer(atkObj)
    #        atkSkillValue += PlayerControl.GetNormalHurt(atkObj)
    #    elif curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_FbPassiveSkill]:
    #        atkSkillPer += PlayerControl.GetFabaoHurtPer(atkObj)
    #        atkSkillValue += PlayerControl.GetFabaoHurt(atkObj)
          
    atkSkillValue += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SkillValue)
    atkSkillValue += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SkillValue)
@@ -2127,19 +2014,19 @@
    if atkObjType == IPY_GameWorld.gotPlayer:
        aIgnoreDefRate = atkObj.GetIgnoreDefRate()  # 无视防御比率
        aSkillAtkRate = atkObj.GetSkillAtkRate()    # 技能攻击力加成
        aDamagePVP = PlayerControl.GetDamagePVP(atkObj)     # PVP固定伤害
        aDamagePVE = PlayerControl.GetDamagePVE(atkObj)     # PVE固定伤害
        aDamagePVP = 0 #PlayerControl.GetDamagePVP(atkObj)     # PVP固定伤害
        aDamagePVE = 0 #PlayerControl.GetDamagePVE(atkObj)     # PVE固定伤害
        
        aNPCHurtAddPer = PlayerControl.GetNPCHurtAddPer(atkObj)     # PVE伤害加成
        aDamagePerPVP = PlayerControl.GetDamagePerPVP(atkObj)     # 外层PVP伤害加成
        aNPCHurtAddPer = 0 #PlayerControl.GetNPCHurtAddPer(atkObj)     # PVE伤害加成
        aDamagePerPVP = 0 #PlayerControl.GetDamagePerPVP(atkObj)     # 外层PVP伤害加成
        aDamagePerPVP += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddPVPDamagePer)
        
        aFinalHurt = PlayerControl.GetFinalHurt(atkObj)     # 最终固定伤害
        aFinalHurt = 0#PlayerControl.GetFinalHurt(atkObj)     # 最终固定伤害
        # 被动增加最终伤害
        aFinalHurt += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalValue)
        aFinalHurt += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalValue)
        
        aOnlyFinalHurt = PlayerControl.GetOnlyFinalHurt(atkObj) # 额外固定伤害
        aOnlyFinalHurt = 0 #PlayerControl.GetOnlyFinalHurt(atkObj) # 额外固定伤害
        aFightPower = PlayerControl.GetFightPower(atkObj)
    else:
        aIgnoreDefRate = 0  # 无视防御比率
@@ -2160,14 +2047,14 @@
    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) # 技能攻击力减少
        dDamagePVPReduce = PlayerControl.GetDamagePVPReduce(defObj) # PVP固定减伤
        dIgnoreDefRateReduce = 0 #PlayerControl.GetIgnoreDefRateReduce(defObj)  # 无视防御比率抗性
        dSkillAtkRateReduce = 0 #PlayerControl.GetSkillAtkRateReduce(defObj) # 技能攻击力减少
        dDamagePVPReduce = 0 #PlayerControl.GetDamagePVPReduce(defObj) # PVP固定减伤
        #dDamReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReduce)
        dDamagePerPVPReduce = PlayerControl.GetDamagePerPVPReduce(defObj) # 外层PVP减伤
        dDamagePerPVPReduce = 0 #PlayerControl.GetDamagePerPVPReduce(defObj) # 外层PVP减伤
        dDamagePerPVPReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReducePVP)
        dFinalHurtReduce = PlayerControl.GetFinalHurtReduce(defObj) # 最终固定伤害减少
        dBeHurtPer = PlayerControl.GetBeHurtPer(defObj)      # 加深受到伤害百分比
        dFinalHurtReduce = 0 #PlayerControl.GetFinalHurtReduce(defObj) # 最终固定伤害减少
        dBeHurtPer = 0#PlayerControl.GetBeHurtPer(defObj)      # 加深受到伤害百分比
        dFightPower = PlayerControl.GetFightPower(defObj)
        
    else:
@@ -2204,17 +2091,14 @@
        aBurnValue = atkwargs.get('burnValue', 0)
        aBurnPer = atkwargs.get('burnPer', 0)
        hurtFormulaKey = atkwargs.get('hurtFormulaKey', None)
        #if hurtFormulaKey == "Burn":
        #    pass
        #else:
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
    elif not curSkill:
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 3))
        GameWorld.DebugLog("    普攻伤害=%s" % (hurtValue))
    elif SkillCommon.isNormalAtkSkill(curSkill):
    elif SkillCommon.isTurnNormalSkill(curSkill):
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1))
        GameWorld.DebugLog("    普攻技能伤害=%s" % (hurtValue))
    elif SkillCommon.isXPSkill(curSkill):
    elif SkillCommon.isAngerSkill(curSkill):
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
        GameWorld.DebugLog("    怒气技能伤害=%s" % (hurtValue))
    else:
@@ -2293,8 +2177,6 @@
            atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtNPCObjID, defObj.GetID())
        else:
            defObj.SetDict(ChConfig.Def_PlayerKey_LastAttackerObjID, atkObj.GetID())
    TurnAttack.AddTurnObjHurtValue(atkObj, defObj, resultHurtType.HurtType, resultHurtType.RealHurtHP, resultHurtType.LostHP, curSkill)
    
    #if resultHurtType.RealHurtHP:
    #    PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_BeHurt, tick)
@@ -2389,9 +2271,9 @@
    #    GameWorld.DebugLog("不能攻击,不反弹")
    #    return
    #杀怪次数判断
    if not CheckKillNPCByCnt(defObj, atkObj, False) and not NPCHurtManager.IsAssistPlayer(defObj.GetPlayerID(), atkObj):
        #GameWorld.DebugLog("不能攻击,不反弹")
        return
    #if not CheckKillNPCByCnt(defObj, atkObj, False) and not NPCHurtManager.IsAssistPlayer(defObj.GetPlayerID(), atkObj):
    #    #GameWorld.DebugLog("不能攻击,不反弹")
    #    return
    
    #没有反弹退出
    defObj_DamageBackRate = defObj.GetDamageBackRate()
@@ -2460,10 +2342,10 @@
        suckHP += atkObj.GetKillBackHP()
    
    # 攻击吸血
    atkBackHP = PlayerControl.GetAtkBackHPPer(atkObj)
    if defObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        #PVP 攻击回血
        atkBackHP += PlayerControl.GetPVPAtkBackHP(atkObj)
    atkBackHP = 0 #PlayerControl.GetAtkBackHPPer(atkObj)
    #if defObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
    #    #PVP 攻击回血
    #    atkBackHP += PlayerControl.GetPVPAtkBackHP(atkObj)
    # 百分比吸血
    atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
    atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
@@ -2484,39 +2366,6 @@
    GameObj.SetHP(atkObj, min(GameObj.GetMaxHP(atkObj), GameObj.GetHP(atkObj) + suckHP), False)
    
    ChangeHPView(atkObj, None, 0, suckHP, ChConfig.Def_HurtTYpe_Recovery)
    return
## 攻击者回蓝逻辑
#  @param atkObj 攻击者
#  @param defObj 防守者
#  @return None
def CalcSuckMagic(atkObj, defObj, hurtValue):
    if atkObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
        return
    tick = GameWorld.GetGameWorld().GetTick()
    if tick - atkObj.GetTickByType(ChConfig.TYPE_Player_Tick_SuckMagic) \
        < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_SuckMagic]:
        return
    atkObj.SetTickByType(ChConfig.TYPE_Player_Tick_SuckMagic, tick)
    suckMP = 0
    # 杀怪回蓝
    if defObj.GetGameObjType() == IPY_GameWorld.gotNPC and GameObj.GetHP(defObj) <= 0:
        suckMP += atkObj.GetKillBackMP()
    # 攻击吸蓝
    atkBackMPPer = PlayerControl.GetAtkBackMPPer(atkObj)
    if atkBackMPPer > 0:
        suckMP += int(hurtValue * atkBackMPPer / float(ChConfig.Def_MaxRateValue))
    if suckMP <= 0:
        return
    atkObj.SetMP(min(atkObj.GetMaxMP(), atkObj.GetMP() + suckMP))
    return
#---------------------------------------------------------------------
@@ -2636,17 +2485,6 @@
    '''
    #关系有3层,无-友好-敌人
    
    #镜像PK下,无视PK区域、PK模式等,仅验证双方是否同一阵营
    curBattleID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID)
    tagBattleID = tagPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID)
    if curBattleID and curBattleID == tagBattleID:
        battle = MirrorAttack.GetMirrorBattleByID(curBattleID)
        if battle.batState != ChConfig.Def_MirrorBatState_Fight:
            return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_None
        if curPlayer.GetFaction() != tagPlayer.GetFaction():
            return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None
        return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_None
    #判断是否可释放(增/减)技能或普攻
    if CheckPlayersRelationInFB_IsNone(curPlayer, tagPlayer):
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_None
@@ -2714,10 +2552,6 @@
    elif curPlayerAttackMode == IPY_GameWorld.amAll:
        pass
    
    # 协助关系不可攻击
    if NPCHurtManager.IsAssistRelation(curPlayer, tagPlayer):
        return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_NotAttackTeam
    # 以下为所属区域的一些特殊处理
    #普通区
    if curPlayerAreaType == IPY_GameWorld.gatNormal:
@@ -2795,8 +2629,8 @@
    if GameObj.GetHP(curObjDetel) > 0:
        return
    
    if TurnAttack.SetKilled(curObjDetel):
        return
    #if TurnAttack.SetTurnObjKilled(curObjDetel, atkObj):
    #    return
        
    #---玩家处理---
    if curObjDetel.GetGameObjType() == IPY_GameWorld.gotPlayer:
@@ -2830,13 +2664,13 @@
        return
    attackLV = curPlayer.GetLV()    # 攻击者等级
    attackPrestige = PlayerControl.GetPrestige(curPlayer)    # 攻击者威望
    attackPrestige = 0 #PlayerControl.GetPrestige(curPlayer)    # 攻击者威望
    attackNotoriety = curPlayer.GetInfamyValue()    # 攻击者恶名值
    attackPkValue = curPlayer.GetPKValue()  # 攻击者pk值
    attackFightPower = PlayerControl.GetFightPower(curPlayer) # 攻击者战斗力
    
    defendLV = defender.GetLV()    # 防守者等级
    defendPrestige = PlayerControl.GetPrestige(defender)    # 防守者威望
    defendPrestige = 0 #PlayerControl.GetPrestige(defender)    # 防守者威望
    defendNotoriety = defender.GetInfamyValue()    # 防守者恶名值
    defendPkValue = defender.GetPKValue()  # 防守者pk值
    defendFightPower = PlayerControl.GetFightPower(defender) # 防守者战斗力
@@ -2874,7 +2708,7 @@
    srcID, srcType = 0, 0
    if srcObj:
        srcID, srcType = srcObj.GetID(), srcObj.GetGameObjType()
    turnFight = TurnAttack.GetTurnFightMgr().getNPCTurnFight(curObj.GetID())
    turnFight = TurnAttack.GetTurnFightMgr().getTurnFight(curObj.GetTFGUID())
    if turnFight:
        clientPack = ChNetSendPack.tagObjPropertyRefreshView()
        clientPack.ObjID = curObj.GetID()