Formula

CommonFun.CheckMissAndBlock

function CommonFun.CheckMissAndBlock(srcUser, targetUser, params, skillParams, iscrit, damage)
  if (targetUser.boss or targetUser.mini or targetUser.changelinepunish) and (targetUser.zoneType == 1 or targetUser.zoneType == 22) and targetUser.noPunishBoss == false then
    local AttrFunction = srcUser:GetProperty("AttrFunction")
    local bitfunc = CommonFun.getBits(AttrFunction)
    if bitfunc[CommonFun.AttrFunction.JustInViceZone] == 1 and targetUser.isBossFromBranch == false then
      return 0, CommonFun.DamageType.Miss
    end
  end
  if CommonFun.checkAttrFunctionMiss(targetUser, srcUser) then
    return 0, CommonFun.DamageType.Miss
  end
  if targetUser.boss and targetUser.zoneType == 22 and CommonFun.CheckStormBossMiss(targetUser, srcUser) then
    return 0, CommonFun.DamageType.Miss
  end
  if CommonFun.RollType.Attack == skillParams.RollType then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) then
      if iscrit == false and CommonFun.IsMiss(srcUser, targetUser, skillParams) == true then
        return 0, CommonFun.DamageType.Miss
      end
    elseif not srcUser:IsAttackSkill(params.skillIDAndLevel) and CommonFun.IsMiss(srcUser, targetUser, skillParams) == true then
      return 0, CommonFun.DamageType.Miss
    end
  end
  local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
  local enemy = srcUser:IsEnemy(targetUser)
  if enemy == false then
    return
  end
  local DefAttr2 = targetUser:GetProperty("DefAttr")
  local AttrEffect2 = targetUser:GetProperty("AttrEffect")
  local bits2 = CommonFun.getBits(AttrEffect2)
  local AttrEffect3 = targetUser:GetProperty("AttrEffect2")
  local bits3 = CommonFun.getBits(AttrEffect3)
  if targetUser:IsImmuneSkill(skillID) then
    return 0, CommonFun.DamageType.Miss
  end
  if skillID == 160_KNIGHT:TURN_UNDEAD and DefAttr2 == CommonFun.Nature.Undead and targetUser.boss == false and targetUser.mini == false and targetUser:GetNpcID() ~= 18143_TIME_KEEPER_PAST and targetUser:GetNpcID() ~= 18144_TIME_KEEPER_PRESENT and targetUser:GetNpcID() ~= 18145_TIME_KEEPER_FUTURE and targetUser:HasBuffID(160000_BOSS_IMMUNE_EFFECT_:MAX_STACK_0) == false then
    local Luk = srcUser:GetProperty("Luk")
    local Int = srcUser:GetProperty("Int")
    local BaseLv = srcUser.BaseLv
    local Hp = targetUser:GetProperty("Hp")
    local MaxHp = targetUser:GetProperty("MaxHp")
    local rate = (20 * skillLevel + Luk + Int + BaseLv + (1 - Hp / MaxHp) * 200) / 10
    if 70 <= rate then
      rate = 70
    end
    if CommonFun.IsInRate(rate, srcUser:GetRandom()) then
      return targetUser:GetProperty("MaxHp"), CommonFun.DamageType.Normal
    end
  end
  if bits2[CommonFun.AttrEffect.NoMagicDamage] == 1 and CommonFun.RollType.Magic == skillParams.RollType then
    return 0, CommonFun.DamageType.WeaponBlock
  end
  if bits2[CommonFun.AttrEffect.NoPhysicalDamage] == 1 and CommonFun.RollType.Attack == skillParams.RollType then
    return 0, CommonFun.DamageType.WeaponBlock
  end
  if bits2[CommonFun.AttrEffect.IgnoreNearNormalSkill] == 1 and nil ~= skillParams.Launch_Type and CommonFun.LaunchType.CloseAttack == skillParams.Launch_Type then
    return 0, CommonFun.DamageType.WeaponBlock
  end
  local isCanBlock = CommonFun.IsCanBlock(srcUser, targetUser)
  if bits2[CommonFun.AttrEffect.IgnoreNearPhysicalSkill] == 1 and skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == false and skillParams.RollType == 1 and skillID == 319_LORD_KNIGHT:PALM_PUSH_STRIKE and isCanBlock == true then
    return 0, CommonFun.DamageType.Barrier
  end
  if bits2[CommonFun.AttrEffect.IgnoreFarSkill] == 1 and skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == true and skillParams.RollType == 1 and skillID == 2227_STELLAR_HUNTER:CRACK_SHOT and skillID == 2243_STELLAR_HUNTER:ABSOLUTE_PENETRATION and skillID == 2251_STELLAR_HUNTER:FORCED_DISPEL and isCanBlock == true then
    return 0, CommonFun.DamageType.Barrier
  end
  if skillParams.Launch_Range ~= nil and skillParams.RollType == 1 and skillParams.Logic == "SkillLockedTarget" and isCanBlock == true and targetUser:HasBuffID(132080_DARK_NIGHT_HUNTER_:MAX_STACK_0) then
    local Bufflv = targetUser:GetBuffLevel(132080_DARK_NIGHT_HUNTER_:MAX_STACK_0)
    local WeaponType = targetUser:GetEquipedWeaponType()
    local ShadowNum = targetUser:GetPetCount("ShadowNpc")
    local Rate = Bufflv * ShadowNum * 2
    if CommonFun.IsInRate(Rate, srcUser:GetRandom()) and WeaponType == 210 then
      return 0, CommonFun.DamageType.Miss
    end
  end
  if skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == true and skillParams.RollType == 1 and skillParams.Logic == "SkillLockedTarget" and isCanBlock == true then
    local Rate = 0
    if targetUser:HasBuffID(118172_FOG_WALL_FLEE_:MAX_STACK_0) then
      local Bufflv = targetUser:GetBuffLevel(118172_FOG_WALL_FLEE_:MAX_STACK_0)
      Rate = Bufflv * 10 + 20
    end
    if targetUser:HasBuffID(90160_WIND_WALK_SPEED_SHIFT_:MAX_STACK_0) or targetUser:HasBuffID(123280_HISS_:MAX_STACK_0) then
      local Value = targetUser:GetProperty("LongFleeRate")
      Rate = Rate + Value
    end
    if CommonFun.IsInRate(Rate, srcUser:GetRandom()) and srcUser:HasBuffID(49120_GOLDEN_SPIRIT_BOAT_:MAX_STACK_0) == false then
      return 0, CommonFun.DamageType.Miss
    end
  end
  if skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == true and skillParams.RollType == 1 and isCanBlock == true then
    local Rate = 0
    if targetUser:HasBuffID(133644_TAKE_COVER_ATTRIBUTE_:MAX_STACK_0) or targetUser:HasBuffID(136010_FALLING_:MAX_STACK_0) or targetUser:HasBuffID(136011_FALLING_PEAK_:MAX_STACK_0) then
      Rate = targetUser:GetProperty("LongFleeRate")
    end
    if CommonFun.IsInRate(Rate, srcUser:GetRandom()) and srcUser:HasBuffID(49120_GOLDEN_SPIRIT_BOAT_:MAX_STACK_0) == false then
      return 0, CommonFun.DamageType.Miss
    end
  end
  if targetUser:HasBuffID(20910160_VANISHED_AVOIDS_AOE_MAGIC_:MAX_STACK_0) and targetUser:HasBuffID(106100_VANISHED_:MAX_STACK_0) and CommonFun.RollType.Magic == skillParams.RollType and skillParams.Logic ~= "SkillLockedTarget" and isCanBlock == true and 0 < damage then
    return 0, CommonFun.DamageType.Miss
  end
  if srcUser:HasBuffID(136780_11105_:MAX_STACK_0) and targetUser:HasBuffID(136781_11106_:MAX_STACK_0) == false then
    return 0, CommonFun.DamageType.Miss
  end
  if srcUser:HasBuffID(136781_11106_:MAX_STACK_0) == false and targetUser:HasBuffID(136780_11105_:MAX_STACK_0) then
    return 0, CommonFun.DamageType.Miss
  end
  if CommonFun.RollType.Magic == skillParams.RollType and isCanBlock == true and 0 < damage then
    local Flee = targetUser:GetProperty("Flee")
    local Rate = 0
    if targetUser:HasBuffID(32980_BAPHOMET_JR_S_SUMMER_:MAX_STACK_0) then
      Rate = Rate + 5 + math.min(Flee / 50, 15)
    end
    local CardSP = targetUser:GetEquipCardNum(7, 24613_SPASHIRE_STAR_CARD)
    if 0 < CardSP then
      Rate = Rate + CardSP * 5
    end
    local CardNumH1 = targetUser:GetEquipCardNum(5, 20206_HEATER_CARD)
    local CardNumH2 = targetUser:GetEquipCardNum(6, 20206_HEATER_CARD)
    Rate = Rate + CardNumH1 * 3 + CardNumH2 * 3
    local CardNumMY = targetUser:GetEquipCardNum(8, 23338)
    Rate = Rate + CardNumMY * 5
    if targetUser:HasBuffID(90004954_23_:MAX_STACK_0) then
      Rate = Rate + 10
    end
    if targetUser:HasBuffID(90005054_23_:MAX_STACK_0) then
      Rate = Rate + 5
    end
    if targetUser:HasBuffID(118250_MAGIC_ROD_:MAX_STACK_0) or targetUser:HasBuffID(128100_DARK_NIGHT_S_DANCE_YOURSELF_:MAX_STACK_0) or targetUser:HasBuffID(128101_DARK_NIGHT_S_DANCE_ALLY_:MAX_STACK_0) or targetUser:HasBuffID(135200_KAUPE_:MAX_STACK_0) or targetUser:HasBuffID(100038250_DISPELLING_SCALE_MASTER_:MAX_STACK_0) or targetUser:HasBuffID(135353_SOUL_OF_THE_SAGE_MAGIC_FLEE_:MAX_STACK_0) or targetUser:HasBuffID(136011_FALLING_PEAK_:MAX_STACK_0) then
      local MagicFlee = targetUser:GetProperty("MagicFleeRate")
      Rate = Rate + MagicFlee
    end
    if CommonFun.IsInRate(Rate, srcUser:GetRandom()) then
      if srcUser.isServerCall then
        targetUser:OnDodgeMagic()
      end
      return 0, CommonFun.DamageType.Miss
    end
  end
  if targetUser:HasBuffID(159620_MAGNETIC_FIELD_:MAX_STACK_0) and 0 < damage and isCanBlock == true then
    local targetid = targetUser:GetGuid()
    local distance = srcUser:GetDistance(targetid)
    if 5 <= distance then
      return 0, CommonFun.DamageType.None
    end
  end
  if targetUser:HasBuffID(138050_23_:MAX_STACK_0) and srcUser:GetNpcID() ~= 0 then
    local Bufflv = targetUser:GetBuffLevel(138050_23_:MAX_STACK_0)
    local Rate = Bufflv * 10 + 30
    if CommonFun.IsInRate(Rate, srcUser:GetRandom()) then
      return 0, CommonFun.DamageType.Miss
    end
  end
  if bits2[CommonFun.AttrEffect.BaXieZhiZhen] == 1 then
    local dam, damtype = CommonFun.ModifyBaxieDamage(srcUser, targetUser, skillParams, damage, skillID, isCanBlock)
    if damtype ~= nil then
      return dam, damtype
    end
  end
  if bits2[CommonFun.AttrEffect.InGodStatus] == 1 and 0 < damage then
    return 0, CommonFun.DamageType.Miss
  end
  if (targetUser:HasBuffID(121030_EDEN_TEAM_BLESSING_:MAX_STACK_0) == true or targetUser:HasBuffID(55693_10353_:MAX_STACK_0) == true or targetUser:HasBuffID(90003955_DEERSKIN_MANTEAU_T5_EFFECT_:MAX_STACK_0) == true or targetUser:HasBuffID(90005555_23_:MAX_STACK_0) == true) and CommonFun.RollType.Magic == skillParams.RollType and 0 < damage and isCanBlock == true then
    return 0, CommonFun.DamageType.DefMagic
  end
  if (targetUser:HasBuffID(90003975_MERLIN_S_TIME_SPACE_ROBE_T5_EFFECT_:MAX_STACK_0) == true or targetUser:HasBuffID(90005405_23_:MAX_STACK_0) == true) and CommonFun.RollType.Attack == skillParams.RollType and 0 < damage and isCanBlock == true then
    return 0, CommonFun.DamageType.DefPhysics
  end
  if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and targetUser:HasBuffID(107330_COMBAT_PROFICIENT_:MAX_STACK_0) and isCanBlock == true and 0 < damage then
    local Bufflv = targetUser:GetBuffLevel(107330_COMBAT_PROFICIENT_:MAX_STACK_0)
    if CommonFun.IsInRate(Bufflv * 3, srcUser:GetRandom()) then
      return 0, CommonFun.DamageType.Miss
    end
  end
  if srcUser:HasBuffID(166450_BANDAGE_HURT_ONLY_BY_PUGONG_:MAX_STACK_0) == true and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID == 151_KNIGHT:SANCTUARY then
    return 0, CommonFun.DamageType.Miss
  end
  local judu = true
  if skillID == 187_KNIGHT:VENOM_DART and srcUser:HasBuffID(20310010_VENOM_DART_IGNORES_KYRIE_ELEISON_:MAX_STACK_0) then
    judu = false
  end
  if skillID == 2227_STELLAR_HUNTER:CRACK_SHOT or skillID == 2243_STELLAR_HUNTER:ABSOLUTE_PENETRATION or skillID == 2251_STELLAR_HUNTER:FORCED_DISPEL then
    judu = false
  end
  if isCanBlock == false then
    judu = false
  end
  local HarmImmune = targetUser:GetProperty("HarmImmune")
  if nil ~= HarmImmune and 0 < HarmImmune then
    local harmImmuneInfo = Table_BuffStateOdds[HarmImmune]
    if nil ~= harmImmuneInfo then
      local rate = harmImmuneInfo.Odds * 100
      if params.pvpMap then
        local Dex = srcUser:GetProperty("Dex")
        local Agi = targetUser:GetProperty("Agi")
        local rate1 = math.min(Dex * 0.1 - Agi * 0.1, 20)
        if rate1 < 0 then
          rate1 = 0
        end
        rate = rate - rate1
        if rate < 0 then
          rate = 0
        end
      end
      local WeaponType = targetUser:GetEquipedWeaponType()
      if targetUser:HasBuffID(20110040_CAN_USE_SWORD_PARRY_WITH_SPEARS_:MAX_STACK_0) and WeaponType == 180 then
        rate = rate + 5
      end
      if CommonFun.IsInRate(rate, srcUser:GetRandom()) and math.floor(params.skillIDAndLevel / 1000) ~= 306_LORD_KNIGHT:ASURA_STRIKE_LORD_KNIGHT:ASURA_STRIKE_LORD_KNIGHT:ASURA_STRIKE and math.floor(params.skillIDAndLevel / 1000) ~= 422_RUNE_KNIGHT:IMPROVED_ACID_DEMONSTRATION_RUNE_KNIGHT:IMPROVED_ACID_DEMONSTRATION and math.floor(params.skillIDAndLevel / 1000) ~= 1122_ARCANE_MASTER:FIRE_EXPANSION_ARCANE_MASTER:FIRE_EXPANSION and math.floor(params.skillIDAndLevel / 1000) ~= 1164_THIEF:TETRA_VORTEX_THIEF:TETRA_VORTEX and judu == true and math.floor(params.skillIDAndLevel / 1000) ~= 3303_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST and math.floor(params.skillIDAndLevel / 1000) ~= 819_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST and math.floor(params.skillIDAndLevel / 1000) ~= 3706_ROYAL_GUARD:CRAZY_THROWING_ROYAL_GUARD:CRAZY_THROWING and math.floor(params.skillIDAndLevel / 1000) ~= 1809_HUNTER:ONE_HIT_KILL_SOARING_DRAGON_SWORD_HUNTER:ONE_HIT_KILL_SOARING_DRAGON_SWORD and math.floor(params.skillIDAndLevel / 1000) ~= 1835_HUNTER:ONE_HIT_KILL_PHOENIX_DRAGON_SWORD_HUNTER:ONE_HIT_KILL_PHOENIX_DRAGON_SWORD and math.floor(params.skillIDAndLevel / 1000) ~= 1915_HUNTER:RAGNA_BLADE_HUNTER:RAGNA_BLADE and math.floor(params.skillIDAndLevel / 1000) ~= 1941_SNIPER:DIVINE_DESTRUCTION_SLASH_LIGHTNING_BOLT_SMASH_SNIPER:DIVINE_DESTRUCTION_SLASH_LIGHTNING_BOLT_SMASH then
        return 0, CommonFun.DamageType.Block
      end
    end
  end
  if bits3[CommonFun.AttrEffect2.AutoDef] == 1 then
    local rate = targetUser:GetProperty("AutoBlockRate")
    rate = math.min(rate, 60)
    if CommonFun.IsInRate(rate, srcUser:GetRandom()) and math.floor(params.skillIDAndLevel / 1000) ~= 306_LORD_KNIGHT:ASURA_STRIKE_LORD_KNIGHT:ASURA_STRIKE_LORD_KNIGHT:ASURA_STRIKE and math.floor(params.skillIDAndLevel / 1000) ~= 411_RUNE_KNIGHT:ACID_TERROR and math.floor(params.skillIDAndLevel / 1000) ~= 422_RUNE_KNIGHT:IMPROVED_ACID_DEMONSTRATION_RUNE_KNIGHT:IMPROVED_ACID_DEMONSTRATION and math.floor(params.skillIDAndLevel / 1000) ~= 1122_ARCANE_MASTER:FIRE_EXPANSION_ARCANE_MASTER:FIRE_EXPANSION and math.floor(params.skillIDAndLevel / 1000) ~= 1164_THIEF:TETRA_VORTEX_THIEF:TETRA_VORTEX and judu == true and math.floor(params.skillIDAndLevel / 1000) ~= 3303_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST and math.floor(params.skillIDAndLevel / 1000) ~= 819_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST and math.floor(params.skillIDAndLevel / 1000) ~= 3706_ROYAL_GUARD:CRAZY_THROWING_ROYAL_GUARD:CRAZY_THROWING and math.floor(params.skillIDAndLevel / 1000) ~= 1809_HUNTER:ONE_HIT_KILL_SOARING_DRAGON_SWORD_HUNTER:ONE_HIT_KILL_SOARING_DRAGON_SWORD and math.floor(params.skillIDAndLevel / 1000) ~= 1835_HUNTER:ONE_HIT_KILL_PHOENIX_DRAGON_SWORD_HUNTER:ONE_HIT_KILL_PHOENIX_DRAGON_SWORD and math.floor(params.skillIDAndLevel / 1000) ~= 1915_HUNTER:RAGNA_BLADE_HUNTER:RAGNA_BLADE and math.floor(params.skillIDAndLevel / 1000) ~= 1941_SNIPER:DIVINE_DESTRUCTION_SLASH_LIGHTNING_BOLT_SMASH_SNIPER:DIVINE_DESTRUCTION_SLASH_LIGHTNING_BOLT_SMASH then
      local skilllv_weiw = targetUser:GetLernedSkillLevel(1190_THIEF:PRESTIGE)
      if 0 < skilllv_weiw and srcUser.isServerCall then
        targetUser:AddBuff(116700_PRESTIGE_:MAX_STACK_0, srcUser:GetGuid())
      end
      local skilllv_ss = targetUser:GetLernedSkillLevel(3806_ROYAL_GUARD:GLORIOUS_GUARDIAN)
      if 0 < skilllv_ss and srcUser.isServerCall then
        targetUser:AddBuff(130080_TRIGGER_HOLY_SHIELD_:MAX_STACK_0, targetUser:GetGuid())
      end
      return 0, CommonFun.DamageType.AutoBlock
    end
  end
  if bits3[CommonFun.AttrEffect2.WeaponBlock] == 1 and isCanBlock == true then
    local rate = targetUser:GetProperty("WeaponBlockRate")
    local GemValue2 = targetUser:GetGemValue(31012_COUNTER_ATTACK_TRIGGER_CHANCE_PERCENTAGE)
    if CommonFun.IsInRate(rate, srcUser:GetRandom()) and skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == false and skillParams.RollType == 1 and math.floor(params.skillIDAndLevel / 1000) ~= 306_LORD_KNIGHT:ASURA_STRIKE_LORD_KNIGHT:ASURA_STRIKE_LORD_KNIGHT:ASURA_STRIKE and math.floor(params.skillIDAndLevel / 1000) ~= 3303_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST and math.floor(params.skillIDAndLevel / 1000) ~= 819_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST then
      local RuneNum = targetUser:GetRunePoint(34030_AESIR_TRIGGERED_WEAPON_BLOCKING_HAS_A_15_CHANCE_TO_COUNTER_THE_ATTACKER_WITH_CROSS_IMPACT_LV_5)
      if 0 < RuneNum then
        local RuneRate = RuneNum * 15 + GemValue2 / 1000
        if srcUser.isServerCall and CommonFun.IsInRate(RuneRate, srcUser:GetRandom()) then
          targetUser:AddBuff(116041_CROSS_IMPACT_COUNTER_CUT_:MAX_STACK_0, srcUser:GetGuid())
        end
      end
      return 0, CommonFun.DamageType.WeaponBlock
    end
    if CommonFun.IsInRate(rate, srcUser:GetRandom()) and targetUser:HasBuffID(20310020_WEAPON_BLOCKING_CAN_BLOCK_RANGED_PHYSICAL_ATTACKS_:MAX_STACK_0) and skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == true and skillParams.RollType == 1 and math.floor(params.skillIDAndLevel / 1000) ~= 2227_STELLAR_HUNTER:CRACK_SHOT and math.floor(params.skillIDAndLevel / 1000) ~= 2243_STELLAR_HUNTER:ABSOLUTE_PENETRATION and math.floor(params.skillIDAndLevel / 1000) ~= 2251_STELLAR_HUNTER:FORCED_DISPEL then
      return 0, CommonFun.DamageType.WeaponBlock
    end
  end
  local buff2MissAtkAttr = {
    [90005525] = {
      6,
      7,
      8,
      10
    },
    [90005545] = {
      1,
      2,
      3,
      4
    }
  }
  local srcAtkElement = CommonFun.GetUserAtkAttrByList(srcUser, targetUser, params, skillParams.Damage)
  for buff, atkAttrs in pairs(buff2MissAtkAttr) do
    if targetUser:HasBuffID(buff) and CommonFun.isInArray(atkAttrs, srcAtkElement) and isCanBlock == true then
      if srcUser.isServerCall then
        targetUser:AddBuffCount(buff)
      end
      return 0, CommonFun.DamageType.Miss
    end
  end
  if targetUser:IsFly() and CommonFun.TableHasValue(NpcFeatures.Flight.ImmuneSkill, skillID) then
    return 0, CommonFun.DamageType.Miss
  end
end