ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -31,30 +31,21 @@
import PlayerControl
import NPCCommon
import SkillCommon
import EffGetSet
import FBLogic
import ReadChConfig
import PetControl
import GameMap
import PassiveBuffEffMng
import GameFuncComm
import ShareDefine
import SkillShell
import FormulaControl
import IpyGameDataPY
import PyGameData
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 +365,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,66 +430,6 @@
    #NPC读表取
    return attack.GetHurtType()
def GetAtkDistType(curObj):
    ## 获取是近战还是远程,默认近战
    if curObj.GetGameObjType() != IPY_GameWorld.gotNPC:
        return ChConfig.AtkDistType_Short
    playerID = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID)
    if not playerID:
        return ChConfig.AtkDistType_Short
    heroID = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_HeroID)
    if heroID:
        heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
        if heroIpyData:
            return heroIpyData.GetAtkDistType()
    npcID = curObj.GetNPCID()
    npcDataEx = NPCCommon.GetNPCDataEx(npcID)
    if npcDataEx:
        return npcDataEx.GetAtkDistType()
    return ChConfig.AtkDistType_Short
## 输入基础数值,返回增强后的值 - 技能加强
#  @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 当前玩家(被攻击了)
@@ -686,19 +608,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:
            #无队伍,添加个人伤害
@@ -764,10 +678,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
@@ -778,22 +688,18 @@
        #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
        
    # 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 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
                
            #仙盟归属NPC判断
            if not CheckCanAttackFamilyOwnerNPC(attacker, defender, False):
@@ -906,28 +812,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
@@ -954,9 +847,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:
@@ -989,12 +879,6 @@
                # 召唤兽主人为玩家
                if summonOwner and summonOwner.GetGameObjType() == IPY_GameWorld.gotPlayer:
                    return summonOwner, npcObjType
    # 判断宠物主人
    elif npcObjType == IPY_GameWorld.gnotPet:
        ownerPlayer = PetControl.GetPetOwner(atkObj)
        if ownerPlayer != None:
            return ownerPlayer, npcObjType
        
    return None, None
@@ -1379,25 +1263,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: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
@@ -1423,22 +1288,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):
@@ -1483,21 +1338,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
@@ -1620,25 +1475,7 @@
    
# 攻击时防守方神兵护盾的处理
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
# 设置玩家一次主动型攻击中的第一个防御者
def SetFirstDefender(attacker, defObj, curSkill):
@@ -1646,7 +1483,7 @@
        return
    
    if curSkill and curSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_FbSkill,
                                          ChConfig.Def_SkillFuncType_TurnNormaAttack]:
                                          ChConfig.Def_SkillFuncType_TurnNormaSkill]:
        return
    
    if attacker.GetDictByKey(ChConfig.Def_PlayerKey_FirstDefender):
@@ -1757,8 +1594,7 @@
            
    elif defObjType == IPY_GameWorld.gotNPC:
        if defObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
            #设置宠物剩余血量
            PetControl.SetPetHP(defObj, remainHP)
            pass
            
        elif defObj.GetType() == ChConfig.ntHelpBattleRobot:
            remainHP = min(dHP, max(GameObj.GetMaxHP(defObj)/2, remainHP)) # 助战机器人剩余血量不能少于一半
@@ -1817,20 +1653,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
@@ -2035,7 +1871,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)
@@ -2096,13 +1932,13 @@
    atkSkillPer = ChangeSkillHurtPer(atkObj, defObj, curSkill, atkSkillPer)
    
    # --- 新增普通攻击的数值和技能攻击的数值,根据类型各自计算
    if atkObjType == IPY_GameWorld.gotPlayer:
        if not curSkill or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_TurnNormaAttack:
            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)
@@ -2149,19 +1985,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  # 无视防御比率
@@ -2182,14 +2018,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:
@@ -2226,17 +2062,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.isTurnNormalAtkSkill(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:
@@ -2315,8 +2148,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)
@@ -2350,7 +2181,7 @@
# @param None
# @return 攻击形式字符串
def GetAtkState(atkObj, defObj):
    isPet = PetControl.IsPet(atkObj)
    isPet = False
    if IsPVENPCObj(atkObj) or IsPVENPCObj(defObj):
        return 'PVE_%s' if not isPet else 'PetVE_%s'
    
@@ -2411,9 +2242,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()
@@ -2438,7 +2269,7 @@
    if atkObjType == IPY_GameWorld.gotNPC:
        #宠物回血
        if atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
            PetControl.SetPetHP(atkObj, remainHP)
            pass
        #普通NPC回血
        else:
            GameObj.SetHP(atkObj, remainHP)
@@ -2482,10 +2313,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)
@@ -2506,39 +2337,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
#---------------------------------------------------------------------
@@ -2658,17 +2456,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
@@ -2736,10 +2523,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:
@@ -2817,8 +2600,8 @@
    if GameObj.GetHP(curObjDetel) > 0:
        return
    
    if TurnAttack.SetTurnObjKilled(curObjDetel, atkObj):
        return
    #if TurnAttack.SetTurnObjKilled(curObjDetel, atkObj):
    #    return
        
    #---玩家处理---
    if curObjDetel.GetGameObjType() == IPY_GameWorld.gotPlayer:
@@ -2852,13 +2635,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) # 防守者战斗力
@@ -2896,7 +2679,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()