CommonFun

CommonFun.CalcBaseDamage

Dataset ยท 20251127_update

Formula Source

function CommonFun.CalcBaseDamage(srcUser, targetUser, params, logger)
  local damageType = CommonFun.DamageType.Normal
  local damage, forceDamageType = CommonFun.DoCalcDamage(srcUser, targetUser, params, logger)
  if nil == srcUser then
    logger.error(string.format("srcUser is nil"))
    return 0, CommonFun.DamageType.None
  end
  if nil == targetUser then
    logger.error(string.format("targetUser is nil"))
    return 0, CommonFun.DamageType.None
  end
  if nil == Table_Skill then
    logger.error("Table_Skill is nil")
    return 0, CommonFun.DamageType.None
  end
  local skillParams = Table_Skill[params.skillIDAndLevel]
  if nil == skillParams then
    logger.error(string.format("Table_Skill[%d] is nil", params.skillIDAndLevel))
    return 0, CommonFun.DamageType.None
  end
  local paramList = skillParams.Damage
  if nil == paramList or #paramList <= 0 then
    return 0, CommonFun.DamageType.None
  end
  local mapid, maptype = srcUser:GetMapInfo()
  local AttrFunction = srcUser:GetProperty("AttrFunction")
  local bitfunc = CommonFun.getBits(AttrFunction)
  if (targetUser.boss or targetUser.mini or targetUser.changelinepunish) and (targetUser.zoneType == 1 or targetUser.zoneType == 22) and targetUser.noPunishBoss == false and bitfunc[CommonFun.AttrFunction.JustInViceZone] == 1 and targetUser.isBossFromBranch == false then
    return 0, CommonFun.DamageType.Miss
  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
  local iscrit = CommonFun.IsCrit(srcUser, targetUser, skillParams)
  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)
  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)
  local srcAttrEffect = srcUser:GetProperty("AttrEffect3")
  local bits4 = CommonFun.getBits(srcAttrEffect)
  local AttrEffect4 = targetUser:GetProperty("AttrEffect3")
  local bits5 = CommonFun.getBits(AttrEffect4)
  local isCanBlock = true
  if bits4[CommonFun.AttrEffect3.MustHit] == 1 and srcUser:HasBuffID(21930030) then
    isCanBlock = false
  end
  if bits5[CommonFun.AttrEffect3.CantBlock] == 1 then
    isCanBlock = false
  end
  local skill_qy = srcUser:GetLernedSkillLevel(2561)
  if 7 <= skill_qy and srcUser:HasBuffID(136780) and targetUser:HasBuffID(136781) then
    isCanBlock = false
  end
  if skillID == 6110 and srcUser:GetBuffLayer(116080) == 15 then
    isCanBlock = false
  end
  if enemy then
    if targetUser:IsImmuneSkill(skillID) then
      return 0, CommonFun.DamageType.Miss
    end
    if skillID == 160 and DefAttr2 == CommonFun.Nature.Undead and targetUser.boss == false and targetUser.mini == false and targetUser:GetNpcID() ~= 18143 and targetUser:GetNpcID() ~= 18144 and targetUser:GetNpcID() ~= 18145 and targetUser:HasBuffID(160000) == 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
    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 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 and skillID ~= 2243 and skillID ~= 2251 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) then
      local Bufflv = targetUser:GetBuffLevel(132080)
      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) then
        local Bufflv = targetUser:GetBuffLevel(118172)
        Rate = Bufflv * 10 + 20
      end
      if targetUser:HasBuffID(90160) or targetUser:HasBuffID(123280) then
        local Value = targetUser:GetProperty("LongFleeRate")
        Rate = Rate + Value
      end
      if targetUser:HasBuffID(1007010) and srcUser:HasBuffID(1007000) then
        Rate = 100
      end
      if CommonFun.IsInRate(Rate, srcUser:GetRandom()) and srcUser:HasBuffID(49120) == 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) or targetUser:HasBuffID(136010) or targetUser:HasBuffID(136011) then
        Rate = targetUser:GetProperty("LongFleeRate")
      end
      if CommonFun.IsInRate(Rate, srcUser:GetRandom()) and srcUser:HasBuffID(49120) == false then
        return 0, CommonFun.DamageType.Miss
      end
    end
    if targetUser:HasBuffID(20910160) and targetUser:HasBuffID(106100) 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) and targetUser:HasBuffID(136781) == false then
      return 0, CommonFun.DamageType.Miss
    end
    if srcUser:HasBuffID(136781) == false and targetUser:HasBuffID(136780) 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) then
        Rate = Rate + 5 + math.min(Flee / 50, 15)
      end
      local CardSP = targetUser:GetBuffLayer(53550)
      local CardSP1 = targetUser:GetBuffLayer(604210) + targetUser:GetBuffLayer(604220) + targetUser:GetBuffLayer(604230) + targetUser:GetBuffLayer(604240) + targetUser:GetBuffLayer(604250)
      if 0 < CardSP or 0 < CardSP1 then
        Rate = Rate + CardSP * 5 + CardSP1 * 5
      end
      local CardNumH1 = targetUser:GetBuffLayer(56900)
      Rate = Rate + CardNumH1 * 3
      local CardNumH3 = targetUser:GetBuffLayer(58640)
      Rate = Rate + CardNumH3 * 5
      local CardNumMY = targetUser:GetBuffLayer(57850)
      Rate = Rate + CardNumMY * 5
      if targetUser:HasBuffID(90004954) then
        Rate = Rate + 10
      end
      if targetUser:HasBuffID(90005054) then
        Rate = Rate + 5
      end
      local MemoryBufflvlayer = targetUser:GetBuffLayer(29250)
      if targetUser:HasBuffID(29250) then
        Rate = Rate + MemoryBufflvlayer * 1
      end
      if targetUser:HasBuffID(118250) or targetUser:HasBuffID(128100) or targetUser:HasBuffID(128101) or targetUser:HasBuffID(135200) or targetUser:HasBuffID(100038250) or targetUser:HasBuffID(135353) or targetUser:HasBuffID(136011) or targetUser:HasBuffID(1001001) or targetUser:HasBuffID(232030) 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
    local judu = true
    if skillID == 187 and srcUser:HasBuffID(20310010) then
      judu = false
    end
    if skillID == 2227 or skillID == 2243 or skillID == 2251 then
      judu = false
    end
    if isCanBlock == false then
      judu = false
    end
    if skillID == 6110 and srcUser:GetBuffLayer(116080) == 15 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()
        local lingqijian = targetUser:GetBuffLayer(1002001)
        if targetUser:HasBuffID(1002020) then
          rate = rate + 3 * lingqijian
        end
        if CommonFun.IsInRate(rate, srcUser:GetRandom()) and math.floor(params.skillIDAndLevel / 1000) ~= 306 and math.floor(params.skillIDAndLevel / 1000) ~= 422 and math.floor(params.skillIDAndLevel / 1000) ~= 1122 and math.floor(params.skillIDAndLevel / 1000) ~= 1164 and judu == true and math.floor(params.skillIDAndLevel / 1000) ~= 3303 and math.floor(params.skillIDAndLevel / 1000) ~= 819 and math.floor(params.skillIDAndLevel / 1000) ~= 3706 and math.floor(params.skillIDAndLevel / 1000) ~= 1809 and math.floor(params.skillIDAndLevel / 1000) ~= 1835 and math.floor(params.skillIDAndLevel / 1000) ~= 1915 and math.floor(params.skillIDAndLevel / 1000) ~= 1941 and math.floor(params.skillIDAndLevel / 10000) ~= 531 and math.floor(params.skillIDAndLevel / 10000) ~= 532 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 and math.floor(params.skillIDAndLevel / 1000) ~= 411 and math.floor(params.skillIDAndLevel / 1000) ~= 422 and math.floor(params.skillIDAndLevel / 1000) ~= 1122 and math.floor(params.skillIDAndLevel / 1000) ~= 1164 and judu == true and math.floor(params.skillIDAndLevel / 1000) ~= 3303 and math.floor(params.skillIDAndLevel / 1000) ~= 819 and math.floor(params.skillIDAndLevel / 1000) ~= 3706 and math.floor(params.skillIDAndLevel / 1000) ~= 1809 and math.floor(params.skillIDAndLevel / 1000) ~= 1835 and math.floor(params.skillIDAndLevel / 1000) ~= 1915 and math.floor(params.skillIDAndLevel / 1000) ~= 1941 and math.floor(params.skillIDAndLevel / 10000) ~= 531 and math.floor(params.skillIDAndLevel / 10000) ~= 532 then
        local skilllv_weiw = targetUser:GetLernedSkillLevel(1190)
        if 0 < skilllv_weiw and srcUser.isServerCall then
          targetUser:AddBuff(116700, srcUser:GetGuid())
        end
        local skilllv_ss = targetUser:GetLernedSkillLevel(3806)
        if 0 < skilllv_ss and srcUser.isServerCall then
          targetUser:AddBuff(130080, targetUser:GetGuid())
        end
        local skilllv_zhanji2 = targetUser:GetLernedSkillLevel(5402)
        local targetid = targetUser:GetGuid()
        local distance = srcUser:GetDistance(targetid)
        if 0 < skilllv_zhanji2 and distance <= 3 and targetUser:HasBuffID(1004041) then
          local zhanjirate = skilllv_zhanji2 * 5 + 25
          if srcUser.isServerCall and CommonFun.IsInRate(zhanjirate, srcUser:GetRandom()) then
            targetUser:AddBuff(1004010, srcUser:GetGuid())
          end
        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)
      if targetUser:HasBuffID(116094) then
        rate = 100
      end
      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 and math.floor(params.skillIDAndLevel / 1000) ~= 3303 and math.floor(params.skillIDAndLevel / 1000) ~= 819 then
        local RuneNum = targetUser:GetRunePoint(34030)
        if 0 < RuneNum then
          local RuneRate = RuneNum * 25 + GemValue2 / 1000
          if srcUser.isServerCall and CommonFun.IsInRate(RuneRate, srcUser:GetRandom()) then
            targetUser:AddBuff(116041, srcUser:GetGuid())
          end
        end
        if targetUser:HasBuffID(116094) and srcUser.isServerCall then
          targetUser:AddBuff(116096, targetUser:GetGuid())
        end
        return 0, CommonFun.DamageType.WeaponBlock
      end
      local rate2 = 0
      local skilllv_xiaodao = targetUser:GetLernedSkillLevel(6102)
      local xiaodao = targetUser:GetBuffLayer(1011001)
      if targetUser:HasBuffID(1011001) then
        rate2 = xiaodao * 0.4 * skilllv_xiaodao
      end
      if targetUser:HasBuffID(116094) and targetUser:HasBuffID(1011001) then
        rate2 = 100
      end
      if CommonFun.IsInRate(rate2, srcUser:GetRandom()) and skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == true and skillParams.RollType == 1 and math.floor(params.skillIDAndLevel / 1000) ~= 2227 and math.floor(params.skillIDAndLevel / 1000) ~= 2243 and math.floor(params.skillIDAndLevel / 1000) ~= 2251 then
        if targetUser:HasBuffID(116094) and srcUser.isServerCall then
          targetUser:AddBuff(116096, targetUser:GetGuid())
        end
        return 0, CommonFun.DamageType.WeaponBlock
      end
    end
    if srcUser:HasBuffID(1007000) and targetUser:HasBuffID(1007010) then
      local Rate1 = 0
      local skilllv_bafeng = targetUser:GetBuffLevel(1007010)
      if srcUser:IsBuffFrom(1007000, targetUser:GetGuid()) then
        Rate1 = skilllv_bafeng * 5
      end
      if CommonFun.IsInRate(Rate1, srcUser:GetRandom()) and srcUser:HasBuffID(49120) == false then
        return 0, CommonFun.DamageType.Miss
      end
    end
    if targetUser:HasBuffID(1006200) then
      local Rate2 = 0
      local skilllv_sanlian = targetUser:GetBuffLevel(1006200)
      if 1 <= skilllv_sanlian then
        local Agi = targetUser:GetProperty("Agi")
        Rate2 = math.floor(Agi / (65 - 5 * skilllv_sanlian)) * skilllv_sanlian
      end
      if CommonFun.IsInRate(Rate2, srcUser:GetRandom()) and srcUser:HasBuffID(49120) == false then
        return 0, CommonFun.DamageType.Miss
      end
    end
    if targetUser:HasBuffID(318001) and targetUser:HasBuffID(318301) and isCanBlock == true then
      local rate1 = targetUser:GetBuffLayer(318001) * 2
      if targetUser:HasBuffID(318400) then
        rate1 = rate1 * 2
      end
      if CommonFun.IsInRate(rate1, srcUser:GetRandom()) then
        return 0, CommonFun.DamageType.WeaponBlock
      end
    end
    if srcUser:HasBuffID(323301) or srcUser:HasBuffID(323401) then
      local Rate1 = 10
      if srcUser:HasBuffID(323401) then
        Rate1 = 20
      end
      if CommonFun.IsInRate(Rate1, srcUser:GetRandom()) then
        return 0, CommonFun.DamageType.Miss
      end
    end
    local buff2MissAtkAttr = {
      [90005525] = {
        6,
        7,
        8,
        10
      },
      [90005545] = {
        1,
        2,
        3,
        4
      },
      [30031304] = {
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      },
      [30031305] = {
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      },
      [30031306] = {
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      },
      [30031307] = {
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      }
    }
    local srcAtkElement = CommonFun.GetUserAtkAttrByList(srcUser, 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
  if nil ~= forceDamageType then
    damageType = forceDamageType
    if CommonFun.DamageType.None == damageType or CommonFun.DamageType.Miss == damageType or CommonFun.DamageType.Block == damageType then
      return damage, damageType
    end
  elseif 0 == damage then
    return 0, CommonFun.DamageType.Miss
  elseif damage < 0 then
    damageType = CommonFun.DamageType.Treatment
  end
  if (damageType == nil or damageType == CommonFun.DamageType.Normal or damageType == CommonFun.DamageType.Crit) and CommonFun.RollType.Attack == skillParams.RollType and srcUser:IsAttackSkill(params.skillIDAndLevel) and iscrit then
    damageType = CommonFun.DamageType.Crit
    local damageParam = skillParams.Damage
    if damageParam ~= nil and damageParam[1] ~= nil then
      damageParam = damageParam[1]
    end
    local raceparam = CommonFun.CalcRaceParam(srcUser, targetUser, params, damageParam, logger)
    local bodyparam = CommonFun.CalcBodyParam(srcUser, targetUser, params, damageParam, logger)
    local elementparam = CommonFun.CalcElementParam(srcUser, targetUser, params, damageParam, logger)
    local bossparam = CommonFun.CalcBossParam(srcUser, targetUser, params, damageParam, logger)
    local raceparam2 = CommonFun.CalcRaceParam2(srcUser, targetUser, params, damageParam, logger)
    local bodyparam2 = CommonFun.CalcBodyParam2(srcUser, targetUser, params, damageParam, logger)
    local elementparam2 = CommonFun.CalcElementParam2(srcUser, targetUser, params, damageParam, logger)
    local bossparam2 = CommonFun.CalcBossParam2(srcUser, targetUser, params, damageParam, logger)
    local Str1 = srcUser:GetProperty("Str")
    local Num1 = srcUser:GetRunePoint(62080)
    local Num2 = srcUser:GetRunePoint(51013)
    local Num3 = srcUser:GetRunePoint(120010)
    local Numlianj = srcUser:GetRunePoint(130110)
    local RuneDamage = Num1 * 0.01 + Num2 * 0.05 + Num3 * 0.05 + Numlianj * 0.03 + 1
    local Str = Str1 * RuneDamage
    local Dex = srcUser:GetProperty("Dex")
    local Luk = srcUser:GetProperty("Luk")
    local Int = srcUser:GetProperty("Int")
    local Agi = srcUser:GetProperty("Agi")
    local DamIncrease = srcUser:GetProperty("DamIncrease")
    local MDamIncrease = CommonFun.calcMDamIncrease(srcUser, targetUser)
    local race2 = targetUser.race
    if srcUser:HasBuffID(49320) and srcUser:HasBuffID(49325) then
    elseif srcUser:HasBuffID(49320) then
      race2 = 2
    end
    local DefAttr2 = targetUser:GetProperty("DefAttr")
    local skillLevel = srcUser:GetLernedSkillLevel(29)
    local skillLevel1 = srcUser:GetLernedSkillLevel(1701)
    local skillLevel2 = 0
    if race2 == 3 or DefAttr2 == 9 or DefAttr2 == 7 or srcUser:HasBuffID(20510031) and srcUser:HasBuffID(22000520) or DefAttr2 == 7 and srcUser:HasBuffID(22000520) then
      skillLevel2 = srcUser:GetLernedSkillLevel(234)
      if 10 < skillLevel2 then
        skillLevel2 = 10
      end
    end
    local SkillRealDamage1 = 0
    if skillLevel <= 5 then
      SkillRealDamage1 = skillLevel * 20
    elseif 5 < skillLevel and skillLevel <= 10 then
      SkillRealDamage1 = 100 + math.floor(Agi / 5) * ((skillLevel - 5) * 0.5 + 0.5)
    else
      SkillRealDamage1 = 100 + (skillLevel - 10) * 20 + math.floor(Agi / 5) * 3 + Luk * 2
    end
    local Numliehuo = srcUser:GetRunePoint(203003)
    local liehuo = 1 + Numliehuo * 0.05
    local SkillRealDamage2 = 0
    if skillLevel1 <= 10 then
      SkillRealDamage2 = skillLevel1 * 20 * liehuo
    else
      SkillRealDamage2 = 200 * liehuo
    end
    local SkillRealDamage = SkillRealDamage1 + SkillRealDamage2
    local BaseAtk = 0
    local BaseMAtk = Int * 2 + math.floor(Int * Int / 100)
    local BaseAtk1 = Str1 * 2 + math.floor(Str1 * Str1 / 100) + math.floor(Dex / 5) + math.floor(Luk / 5)
    local BaseAtk2 = Dex * 2 + math.floor(Dex * Dex / 100) + math.floor(Str / 5) + math.floor(Luk / 5)
    local BaseAtk3 = Str * 2 + math.floor(Str * Str / 100) + math.floor(Dex / 5) + math.floor(Luk / 5)
    local NoramlAtkAdd = 5 * Str
    local profressionID = srcUser:GetProfressionID()
    local WeaponType = srcUser:GetEquipedWeaponType()
    if (profressionID == 92 or profressionID == 93 or profressionID == 94 or profressionID == 95) and WeaponType == 210 then
      BaseAtk1 = BaseAtk2
      BaseAtk3 = BaseAtk2
      NoramlAtkAdd = 3 * Dex
    end
    for k, v in pairs(GameConfig.Atkcalculate) do
      if v == profressionID then
        BaseAtk1 = BaseAtk2
        BaseAtk3 = BaseAtk2
        NoramlAtkAdd = 3 * Dex
      end
    end
    local Num4 = srcUser:GetRunePoint(52013)
    local Num5 = srcUser:GetRunePoint(52014)
    local Num6 = srcUser:GetRunePoint(52015)
    local Num7 = srcUser:GetRunePoint(52016)
    local Num8 = srcUser:GetRunePoint(52017)
    local Num9 = srcUser:GetRunePoint(52018)
    local RuneDamage1 = (Num4 + Num5 + Num6 + Num7 + Num8 + Num9) * 0.07
    local Atk1 = srcUser:GetProperty("Atk")
    local MAtk = srcUser:GetProperty("MAtk")
    local MAtkPer = srcUser:GetProperty("MAtkPer")
    local MonkAtk = 0
    if srcUser:HasBuffID(100510) then
      MonkAtk = 5 * Int
    end
    local AtkSpdAdd = 0
    local skilllv_SpdAdd = srcUser:GetLernedSkillLevel(22)
    if srcUser:HasBuffID(80082) and 10 < skilllv_SpdAdd then
      AtkSpdAdd = (skilllv_SpdAdd - 10) * 120
    end
    local skilllv_mfzr = srcUser:GetLernedSkillLevel(3002)
    local Opening = srcUser:GetSkillOptByOption(17)
    local MagicAtk = 0
    if 0 < skilllv_mfzr and Opening == 0 then
      local Sp = srcUser:GetProperty("Sp")
      MagicAtk = Sp * skilllv_mfzr * 0.2
    end
    local skilllv_element = srcUser:GetLernedSkillLevel(127)
    local atk_element = 0
    if 10 < skilllv_element then
      atk_element = Dex * ((skilllv_element - 10) * 0.5)
    end
    local NormalAtk = srcUser:GetProperty("NormalAtk")
    NormalAtk = NormalAtk + NoramlAtkAdd
    local Atk = Atk1 + RuneDamage1 * MAtk * (1 + MAtkPer) + MonkAtk + AtkSpdAdd + MagicAtk + atk_element + NormalAtk
    local Num10 = srcUser:GetRunePoint(11022)
    local Num11 = srcUser:GetRunePoint(203024)
    local Num12 = srcUser:GetRunePoint(11024)
    local Num13 = srcUser:GetRunePoint(12004)
    local Num14 = srcUser:GetRunePoint(12011)
    local Num16 = srcUser:GetRunePoint(70010)
    local RuneDamage2 = (Num10 + Num11 + Num12 + Num13 + Num14 + Num16) * 0.03
    local Num15 = srcUser:GetRunePoint(120020)
    local RuneDamage3 = Num15 * 0.03
    local AtkPer1 = srcUser:GetProperty("AtkPer")
    local AtkPer = AtkPer1 + RuneDamage2 + RuneDamage3
    local MAtkPer = srcUser:GetProperty("MAtkPer")
    local Refine = srcUser:GetProperty("Refine")
    local MRefine = srcUser:GetProperty("MRefine")
    local Vit2 = targetUser:GetProperty("Vit")
    local VitPer2 = targetUser:GetProperty("VitPer")
    local DamReduc2 = CommonFun.calcDamReDuc(srcUser, targetUser)
    local RefineDamReduc = targetUser:GetProperty("RefineDamReduc")
    local RealDamage = targetUser:GetProperty("RealDamage")
    if targetUser:HasBuffID(96050) and 1 <= RealDamage then
      local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
      if skillID == 359 then
        RealDamage = RealDamage - 1
      end
    end
    local AttrEffect = srcUser:GetProperty("AttrEffect")
    local bits = CommonFun.getBits(AttrEffect)
    local AttrEffect2 = targetUser:GetProperty("AttrEffect")
    local bits2 = CommonFun.getBits(AttrEffect2)
    local StateEffect = targetUser:GetProperty("StateEffect")
    local bits3 = CommonFun.getBits(StateEffect)
    local Weapon = srcUser:GetEquipedID(7)
    if skillParams.RollType == 1 then
      if bits[CommonFun.AttrEffect.NextAttackIncrease] == 1 then
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * 2 * (1 + RealDamage) * (1 + skillLevel2 * 0.05)
        if damage <= 0 then
          damage = 0
        end
      elseif bits2[CommonFun.AttrEffect.NormalSkillDam] == 1 and (profressionID == 42 or profressionID == 43 or profressionID == 44 or profressionID == 45 or profressionID == 102 or profressionID == 103 or profressionID == 104 or profressionID == 105 or profressionID == 112 or profressionID == 113 or profressionID == 114 or profressionID == 115) then
        local targetid = targetUser:GetGuid()
        local distance = srcUser:GetDistance(targetid)
        local skilllv_1 = srcUser:GetLernedSkillLevel(133)
        local DisDam = 1
        if 10 < skilllv_1 then
          DisDam = 1 + distance / 7.5 * (skilllv_1 - 10) * 0.1
          if srcUser:HasBuffID(131080) or targetUser:IsBuffFrom(1007000, srcUser:GetGuid()) and srcUser:HasBuffID(1007050) then
            DisDam = 1 + (skilllv_1 - 10) * 0.1
          end
          DisDam = math.min(DisDam, 2)
        end
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * 1.3 * (1 + RealDamage) * (1 + skillLevel2 * 0.05) * DisDam
        if damage <= 0 then
          damage = 0
        end
      elseif bits3[CommonFun.StateEffect.Dizzy] == 1 and (Weapon == 40322 or Weapon == 140322) then
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1 + skillLevel2 * 0.05) * 1.5
        if damage <= 0 then
          damage = 0
        end
      elseif skillID == 300 or skillID == 469 or skillID == 1397 or skillID == 1446 or skillID == 252 or skillID == 253 then
        local targetid = targetUser:GetGuid()
        local distance = srcUser:GetDistance(targetid)
        local skilllv_1 = srcUser:GetLernedSkillLevel(133)
        local skilllv_2 = srcUser:GetLernedSkillLevel(478)
        local DisDam = 1
        if 10 < skilllv_1 then
          DisDam = 1 + distance / 7.5 * (skilllv_1 - 10) * 0.1
          if srcUser:HasBuffID(131080) or targetUser:IsBuffFrom(1007000, srcUser:GetGuid()) and srcUser:HasBuffID(1007050) then
            DisDam = 1 + (skilllv_1 - 10) * 0.1
          end
          DisDam = math.min(DisDam, 2)
        elseif 10 < skilllv_2 then
          DisDam = 1 + distance / 7.5 * (skilllv_2 - 10) * 0.1
          DisDam = math.min(DisDam, 2)
        end
        local fromid = targetUser:GetBuffFromID(116470)
        local guid = srcUser:GetGuid()
        local BUffDam = 1
        local skilllv_biaoji = srcUser:GetLernedSkillLevel(1147)
        local GemBiaoji = srcUser:GetGemValue(91121)
        local Numxp = srcUser:GetRunePoint(94080)
        if fromid == guid then
          BUffDam = 1 + skilllv_biaoji * 0.02 + Numxp * 0.02 + GemBiaoji / 100000
        end
        local SpAtk = 0
        if srcUser:HasBuffID(131096) then
          local Sp = srcUser:GetProperty("Sp")
          SpAtk = Sp
        end
        damage = ((((Atk - BaseAtk1) * (1 + AtkPer) + SpAtk) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1 + skillLevel2 * 0.05) * DisDam * BUffDam
        if damage <= 0 then
          damage = 0
        end
      elseif skillID == 470 then
        local Enemy = 1
        local skilllv_zy = srcUser:GetLernedSkillLevel(1145)
        if 0 < skilllv_zy and 1 >= srcUser:GetRangeEnemy(3) then
          Enemy = 1 + skilllv_zy * 0.03
        end
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1 + skillLevel2 * 0.05) * Enemy
        if damage <= 0 then
          damage = 0
        end
      elseif skillID == 5614 then
        local skilllv_ls = srcUser:GetLernedSkillLevel(5610)
        local skilllv_ls2 = srcUser:GetLernedSkillLevel(5613)
        local DefReduc = CommonFun.CalcDef(srcUser, targetUser)
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * DefReduc * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1.4 + skilllv_ls * 0.4) * (0.05 * skilllv_ls2 + 0.25)
        if damage <= 0 then
          damage = 0
        end
      else
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1 + skillLevel2 * 0.05)
        if damage <= 0 then
          damage = 0
        end
      end
    elseif bits[CommonFun.AttrEffect.NextAttackIncrease] == 1 then
      damage = ((MAtk - BaseMAtk) * (1 + MAtkPer) + BaseMAtk + MRefine) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 + MDamIncrease) * 2 * (1 + RealDamage)
    elseif bits2[CommonFun.AttrEffect.NormalSkillDam] == 1 and (profressionID == 42 or profressionID == 43 or profressionID == 44 or profressionID == 45 or profressionID == 102 or profressionID == 103 or profressionID == 104 or profressionID == 105 or profressionID == 112 or profressionID == 113 or profressionID == 114 or profressionID == 115) then
      local targetid = targetUser:GetGuid()
      local distance = srcUser:GetDistance(targetid)
      local skilllv_1 = srcUser:GetLernedSkillLevel(133)
      local DisDam = 1
      if 10 < skilllv_1 then
        DisDam = 1 + distance / 7.5 * (skilllv_1 - 10) * 0.1
        if srcUser:HasBuffID(131080) or targetUser:IsBuffFrom(1007000, srcUser:GetGuid()) and srcUser:HasBuffID(1007050) then
          DisDam = 1 + (skilllv_1 - 10) * 0.1
        end
        DisDam = math.min(DisDam, 2)
      end
      damage = ((MAtk - BaseMAtk) * (1 + MAtkPer) + BaseMAtk + MRefine) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 + MDamIncrease) * 1.3 * (1 + RealDamage) * DisDam
    else
      damage = ((MAtk - BaseMAtk) * (1 + MAtkPer) + BaseMAtk + MRefine) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 + MDamIncrease) * (1 + RealDamage)
    end
    if targetUser:GetNpcID() == 30028 then
      damage = 1
    end
    local elementDam = CommonFun.DoCalcElementDam(srcUser, targetUser, params, damageParam)
    local stateDam = CommonFun.DoCalcStateEffectDam(srcUser, targetUser)
    local fromid = targetUser:GetBuffFromID(45000120)
    local guid = srcUser:GetGuid()
    local BUffDam = 1
    if fromid == guid then
      BUffDam = 1.3
    end
    local RefineLv = srcUser:GetEquipedRefineLv(7)
    local HolyEquip = 1
    if (Weapon == 40319 or Weapon == 140319) and (profressionID == 11 or profressionID == 12 or profressionID == 13 or profressionID == 14 or profressionID == 15 or profressionID == 203 or profressionID == 204 or profressionID == 205 or profressionID == 72 or profressionID == 73 or profressionID == 74 or profressionID == 75 or profressionID == 605 or profressionID == 665) then
      HolyEquip = 1 + 0.05 * RefineLv
    end
    if (Weapon == 40360 or Weapon == 140360) and (profressionID == 11 or profressionID == 12 or profressionID == 13 or profressionID == 14 or profressionID == 15 or profressionID == 203 or profressionID == 204 or profressionID == 205 or profressionID == 72 or profressionID == 73 or profressionID == 74 or profressionID == 75 or profressionID == 605 or profressionID == 665) then
      HolyEquip = 1 + 0.05 * RefineLv
    end
    local zhufu = 1
    if srcUser:HasBuffID(129040) or srcUser:HasBuffID(129041) then
      local skilllv_zf = srcUser:GetLernedSkillLevel(3610)
      local GemValue = srcUser:GetGemValue(51161)
      zhufu = 1 + skilllv_zf * 0.02 + GemValue / 100000
    end
    local hualiBuff = srcUser:HasBuffID(24441)
    local huali = 1
    if hualiBuff == true and srcUser:HasBuffID(90001903) then
      huali = 1.25
    elseif hualiBuff == true then
      huali = 1.1
    end
    local Ninja = 1
    local NinjaDamPer = 1
    if skillID == 2010 or skillID == 2011 or skillID == 2012 or skillID == 2013 then
      local Agi = srcUser:GetProperty("Agi")
      local AgiRune = srcUser:GetRunePoint(163012)
      local AgiDam = 1 + math.floor(Agi / 10) * AgiRune * 0.004
      local Famous = 1
      local RefineLv7 = srcUser:GetEquipedRefineLv(7)
      if srcUser:HasBuffID(44360) then
        Famous = Famous * (RefineLv7 * 0.01 + 1)
      end
      if srcUser:HasBuffID(44370) then
        Famous = Famous * (RefineLv7 * 0.03 + 1)
      end
      Ninja = AgiDam * Famous
    end
    if skillID == 2011 then
      NinjaDamPer = 1.5
    end
    if skillID == 2012 then
      NinjaDamPer = 3
    end
    if skillID == 2013 then
      local Rune = srcUser:GetRunePoint(163021)
      NinjaDamPer = 6 * (1 + Rune * 0.05)
    end
    if skillID == 2200 and WeaponType == 320 then
      damage = damage * 2
    end
    if skillID == 300 or skillID == 113 or skillID == 252 then
      local guid = srcUser:GetGuid()
      local Debuff_Layer_1 = targetUser:GetBuffLayerByIDAndFromID(96082, guid)
      local Debuff_Layer_2 = targetUser:GetBuffLayerByIDAndFromID(96083, guid)
      local sw_dam = math.max(Debuff_Layer_1, Debuff_Layer_2) * 0.06 + 1
      damage = damage * sw_dam
    end
    if skillID == 300 or skillID == 113 or skillID == 252 then
      local bafeng = 1
      local skilllv_1 = srcUser:GetLernedSkillLevel(5700)
      if targetUser:IsBuffFrom(1007000, srcUser:GetGuid()) then
        bafeng = 1 + skilllv_1 * 0.05
      end
      damage = damage * bafeng
    end
    if skillID == 5204 then
      local skilllv_sishi = srcUser:GetLernedSkillLevel(5200)
      damage = damage * (1 + skilllv_sishi * 0.05)
    end
    if skillID == 173 then
      local skilllv_qihei = srcUser:GetLernedSkillLevel(194)
      if targetUser:GetBuffActive(95500) then
        damage = damage * (1 + 0.15 * skilllv_qihei)
      end
    end
    if skillID == 5904 then
      local skilllv_shengguang = srcUser:GetLernedSkillLevel(5900)
      damage = damage * (1 + 0.1 * skilllv_shengguang)
    end
    damage = damage * elementDam * stateDam * BUffDam * HolyEquip * zhufu * Ninja * NinjaDamPer * huali
  end
  local GetNpcID = targetUser:GetNpcID()
  local GetSelfID = srcUser:GetNpcID()
  if 0 < damage and GetNpcID == 30034 and srcUser:HasBuffID(121) then
    local Atk = srcUser:GetProperty("Atk")
    local MAtk = srcUser:GetProperty("MAtk")
    damage = damage + (Atk + MAtk) * 2.5
  end
  if targetUser:HasBuffID(10740) and srcUser:HasBuffID(10741) == false then
    damage = 0.2
  end
  local NormalRealDam = srcUser:GetProperty("NormalRealDam")
  local NormalMRealDam = srcUser:GetProperty("NormalMRealDam")
  local SkillRealDam = srcUser:GetProperty("SkillRealDam")
  local SkillMRealDam = srcUser:GetProperty("SkillMRealDam")
  local RefineDamReduc = targetUser:GetProperty("RefineDamReduc")
  local RefineMDamReduc = targetUser:GetProperty("RefineMDamReduc")
  local NormalAtkDam = srcUser:GetProperty("NormalAtkDam")
  local NormalAtkRes = targetUser:GetProperty("NormalAtkRes")
  local SkillDam = srcUser:GetProperty("SkillDam")
  local SkillRes = targetUser:GetProperty("SkillRes")
  if (skillID == 306 or skillID == 3303 or skillID == 819) and srcUser:HasBuffID(22000830) then
    SkillRes = math.max(SkillRes - 0.3, 0)
  end
  local ActuallySkiRes = SkillRes - SkillDam
  local ActuallyNorRes = NormalAtkRes - NormalAtkDam
  if maptype == 2 or maptype == 4 then
    ActuallySkiRes = ActuallySkiRes < -1 and -1 or 1 < ActuallySkiRes and 1 or ActuallySkiRes
    ActuallySkiRes = math.floor(ActuallySkiRes * 1000) / 1000
    ActuallySkiRes = ActuallySkiRes + 0.4 * (1 - math.sin(ActuallySkiRes * 3.14 / 2))
    ActuallyNorRes = ActuallyNorRes < -1 and -1 or 1 < ActuallyNorRes and 1 or ActuallyNorRes
    ActuallyNorRes = math.floor(ActuallyNorRes * 1000) / 1000
    ActuallyNorRes = ActuallyNorRes + 0.4 * (1 - math.sin(ActuallyNorRes * 3.14 / 2))
  end
  local NormalEnd = 1 - ActuallyNorRes
  local SkillEnd = 1 - ActuallySkiRes
  NormalEnd = math.max(NormalEnd, 0.15)
  SkillEnd = math.max(SkillEnd, 0.15)
  if skillID == 404 then
    SkillEnd = 1
  end
  if skillID == 83040 or skillID == 83041 or skillID == 83042 or skillID == 83050 or skillID == 83051 then
    SkillEnd = 1
  end
  if CommonFun.RollType.Magic == skillParams.RollType then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) and 0 < damage then
      damage = (damage + NormalMRealDam * (1 - RefineMDamReduc)) * NormalEnd
    elseif not srcUser:IsAttackSkill(params.skillIDAndLevel) and 0 < damage then
      damage = (damage + SkillMRealDam * (1 - RefineMDamReduc)) * SkillEnd
    end
  end
  if CommonFun.RollType.Attack == skillParams.RollType then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) and 0 < damage then
      damage = (damage + NormalRealDam * (1 - RefineDamReduc)) * NormalEnd
    elseif not srcUser:IsAttackSkill(params.skillIDAndLevel) and 0 < damage then
      damage = (damage + SkillRealDam * (1 - RefineDamReduc)) * SkillEnd
    end
  end
  if GetNpcID == 40021 or GetNpcID == 40023 then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID ~= 151 or srcUser:InGvgZone() == false or srcUser:NoAttackMetal() == true then
      return 0, CommonFun.DamageType.Miss
    end
    local hl_maxhp = targetUser:GetProperty("MaxHp")
    if damage >= hl_maxhp * 1 / 300 then
      damage = hl_maxhp * 1 / 300
    end
  end
  if GetNpcID == 40024 or GetNpcID == 40026 then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID ~= 151 or srcUser:InGvgZone() == false or srcUser:NoAttackMetal() == true then
      return 0, CommonFun.DamageType.Miss
    end
    local hl_maxhp = targetUser:GetProperty("MaxHp")
    if damage >= hl_maxhp * 1 / 200 then
      damage = hl_maxhp * 1 / 200
    end
  end
  if GetNpcID == 40022 or GetNpcID == 55000 then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID ~= 151 then
      return 0, CommonFun.DamageType.Miss
    end
    local hl_maxhp = targetUser:GetProperty("MaxHp")
    if damage >= hl_maxhp * 1 / 30 then
      damage = hl_maxhp * 1 / 30
    end
  end
  if srcUser:HasBuffID(166450) == true and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID ~= 151 then
    return 0, CommonFun.DamageType.Miss
  end
  if (CommonFun.DamageType.Normal == damageType or CommonFun.DamageType.Crit == damageType or CommonFun.DamageType.ErLianJi == damageType) and targetUser:DamageAlways1() then
    damageType = CommonFun.DamageType.Normal
    damage = 1
  end
  if targetUser:HasBuffID(159620) 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
  local Baxie = true
  if (skillID == 469 or skillID == 470 or skillID == 4228) and srcUser:HasBuffID(20910120) then
    Baxie = false
  end
  if skillID == 2227 or skillID == 2243 or skillID == 2251 then
    Baxie = false
  end
  if isCanBlock == false then
    Baxie = false
  end
  if bits2[CommonFun.AttrEffect.BaXieZhiZhen] == 1 and CommonFun.RollType.Attack == skillParams.RollType and 0 < damage and skillID ~= 411 and skillID ~= 306 and skillID ~= 3303 and skillID ~= 819 and Baxie == true then
    if targetUser.AddBuffDamage ~= nil then
      targetUser:AddBuffDamage(damage)
    end
    if srcUser.isServerCall then
      srcUser:SetMissStillBuff()
    end
    return 0, CommonFun.DamageType.Miss
  end
  if 0 < damage and (targetUser:GetNpcID() == 56941 or targetUser:GetNpcID() == 56942) and srcUser:GetNpcID() ~= 56941 and srcUser:GetNpcID() ~= 56942 then
    return 1, CommonFun.DamageType.Normal
  end
  if 0 < damage and targetUser:GetNpcID() == 300100 and srcUser:HasBuffID(180220) then
    damage = damage * 1.3
  end
  if 0 < damage and srcUser:GetNpcID() == 300100 and targetUser:HasBuffID(180219) then
    damage = damage * 0.5
  end
  if 0 < damage and targetUser:GetNpcID() == 300101 and srcUser:HasBuffID(180518) then
    damage = damage * 1.25
  end
  if 0 < damage and srcUser:GetNpcID() == 300101 and targetUser:HasBuffID(180517) then
    damage = damage * 0.7
  end
  if (targetUser:HasBuffID(121030) == true or targetUser:HasBuffID(55693) == true or targetUser:HasBuffID(90003955) == true or targetUser:HasBuffID(90005555) == true) and CommonFun.RollType.Magic == skillParams.RollType and 0 < damage and isCanBlock == true then
    return 0, CommonFun.DamageType.DefMagic
  end
  if (targetUser:HasBuffID(90003975) == true or targetUser:HasBuffID(90005405) == 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) and isCanBlock == true and 0 < damage then
    local Bufflv = targetUser:GetBuffLevel(107330)
    if CommonFun.IsInRate(Bufflv * 3, srcUser:GetRandom()) then
      return 0, CommonFun.DamageType.WeaponBlock
    end
  end
  local JGBH = 1
  if (targetUser:HasBuffID(100660) == true or targetUser:HasBuffID(21430114) == true or targetUser:HasBuffID(1010230) == true) and 0 < damage then
    local GemValue = targetUser:GetProperty("JinGangRate")
    JGBH = 0.15 - GemValue
    local skilllv_ab = srcUser:GetLernedSkillLevel(306)
    if 5 < skilllv_ab and skillID == 306 or skillID == 3303 or skillID == 819 then
      JGBH = 1
    end
    damage = math.floor(damage * JGBH)
  end
  local ZFZ = 1
  if targetUser:HasBuffID(117105) == true and 0 < damage then
    local skilllv_zfz = targetUser:GetBuffLevel(117105)
    ZFZ = 1 - 0.15 * (skilllv_zfz - 5)
    damage = math.floor(damage * ZFZ)
  end
  if targetUser:HasBuffID(31790) and 0 < damage then
    damage = damage * 1.2
  end
  local targetEnemyNum = targetUser:GetRangeEnemy(5)
  if (targetUser:HasBuffID(59240) or targetUser:HasBuffID(605710) or targetUser:HasBuffID(605720) or targetUser:HasBuffID(605730) or targetUser:HasBuffID(605740) or targetUser:HasBuffID(605750)) and 1 <= targetEnemyNum and 0 < damage then
    damage = damage * (1 - math.min(targetEnemyNum * 0.02, 0.1))
  end
  if targetUser:HasBuffID(136240) then
    local MoonReduc = targetUser:GetProperty("MoonReduc")
    if targetUser:GetMoonMark(srcUser) then
      damage = damage * (1 - MoonReduc)
    end
  end
  if srcUser:HasBuffID(136581) ~= true and targetUser:HasBuffID(136580) and 0 < damage then
    local TreeReduc = targetUser:GetProperty("TreeReduc")
    damage = damage * (1 - TreeReduc)
  end
  if targetUser:HasBuffID(136600) or targetUser:HasBuffID(136522) and 0 < damage then
    local DragonReduc = targetUser:GetProperty("DragonReduc")
    damage = damage * (1 - DragonReduc)
  end
  if targetUser:HasBuffID(165542) and 0 < damage then
    damage = damage * 1.5
  end
  if targetUser:HasBuffID(166580) and 0 < damage then
    damage = damage * 1.3
  end
  if CommonFun.RollType.Attack == skillParams.RollType and targetUser:HasBuffID(10110) and 0 < damage then
    damage = damage * 0.01
  end
  if targetUser:HasBuffID(90003554) and 0 < damage then
    local MaxHp = targetUser:GetProperty("MaxHp")
    local Hp = targetUser:GetProperty("Hp")
    if Hp / MaxHp >= 0.9 then
      damage = damage * 0.5
    end
  end
  local targetTeamNum = targetUser:GetRangeTeammate(5)
  if targetUser:HasBuffID(29650) and 1 <= targetTeamNum then
    damage = damage * 0.97
  elseif targetUser:HasBuffID(29651) and 1 <= targetTeamNum then
    damage = damage * 0.94
  elseif targetUser:HasBuffID(29652) and 1 <= targetTeamNum then
    damage = damage * 0.85
  end
  if targetUser:HasBuffID(135240) == true then
    local skilllv_sz = targetUser:GetBuffLevel(135240)
    damage = damage * (1 - 0.1 * skilllv_sz)
  end
  if targetUser:HasBuffID(135361) or targetUser:HasBuffID(135363) then
    local SoulNum = targetUser:GetProperty("Soul_Linker")
    damage = damage / math.max(1, SoulNum)
  end
  if targetUser:HasBuffID(30031100) and 0 < damage then
    local mateNum = targetUser:GetMapTeammateNum()
    local fentan = 1
    if targetUser:HasBuffID(30031101) then
      fentan = 0.9
    elseif targetUser:HasBuffID(30031102) then
      fentan = 0.75
    elseif targetUser:HasBuffID(30031103) then
      fentan = 0.6
    end
    damage = damage / math.max(1, mateNum) * fentan
  end
  local MaxHpsrcUser = srcUser:GetProperty("MaxHp")
  local MaxHptargetUser = targetUser:GetProperty("MaxHp")
  local MaxHp_hpper = MaxHptargetUser / MaxHpsrcUser
  if targetUser:HasBuffID(63180) and 0 < damage and 1 < MaxHp_hpper then
    damage = damage * 0.95
  end
  local StateEffectGashapon = srcUser:GetProperty("StateEffect")
  local bits = CommonFun.getBits(StateEffectGashapon)
  if bits[CommonFun.StateEffect.Poison] == 1 and targetUser:HasBuffID(64350) and 0 < damage then
    damage = damage * 0.9
  end
  if targetUser:HasBuffID(90003164) and targetUser:InMoveStatus() == true and 0 < damage then
    damage = damage * 0.7
  end
  if targetUser:HasBuffID(90003984) and targetUser:InMoveStatus() == true and 0 < damage then
    damage = damage * 0.95
  end
  if targetUser:HasBuffID(56510) then
    local guid = targetUser:GetGuid()
    local Debuff_Layer = srcUser:GetBuffLayerByIDAndFromID(96083, guid)
    damage = damage * (1 - 0.06 * Debuff_Layer)
  end
  if CommonFun.Shape.L == targetUser.shape and CommonFun.RollType.Magic == skillParams.RollType and 0 < damage then
    local largedam = 1
    if srcUser:HasBuffID(71930) then
      largedam = largedam + 0.25
    end
    local CardMedia = srcUser:GetEquipCardNum(7, 23265)
    largedam = largedam + CardMedia * 0.15
    local CardLabore = srcUser:GetEquipCardNum(7, 23284)
    largedam = largedam + CardLabore * 0.1
    if srcUser:HasBuffID(29440) then
      largedam = largedam + 0.04
    elseif srcUser:HasBuffID(29441) then
      largedam = largedam + 0.08
    elseif srcUser:HasBuffID(29442) then
      largedam = largedam + 0.2
    end
    if srcUser:HasBuffID(118271) then
      local skilllv_ruihua = srcUser:GetLernedSkillLevel(1324)
      largedam = largedam + (skilllv_ruihua - 5) * 0.06
    end
    damage = damage * largedam
  end
  if CommonFun.Shape.M == targetUser.shape and CommonFun.RollType.Magic == skillParams.RollType and 0 < damage then
    local mediumdam = 1
    local RefineLv = srcUser:GetEquipedRefineLv(8)
    if srcUser:HasBuffID(72280) then
      mediumdam = mediumdam + 0.05 + RefineLv * 0.01
    end
    if srcUser:HasBuffID(57300) then
      mediumdam = mediumdam + 0.02 + RefineLv * 0.01
    end
    if srcUser:HasBuffID(57310) then
      mediumdam = mediumdam + 0.05 + RefineLv * 0.01
    end
    damage = damage * mediumdam
  end
  if srcUser:HasBuffID(187550) then
    local mapid, maptype = srcUser:GetMapInfo()
    if mapid == 141 or mapid == 142 or mapid == 143 then
      local MaxHpMijing = targetUser:GetProperty("MaxHp")
      local layerMijing = srcUser:GetBuffLayer(187550)
      local HpMijing = targetUser:GetProperty("Hp")
      if HpMijing <= MaxHpMijing * 0.3 then
        damage = damage * (1 + layerMijing * 0.2)
      end
    end
  end
  local NoHurtRatio = targetUser:GetProperty("NoHurtRatio")
  if 0 < NoHurtRatio and NoHurtRatio ~= nil and 0 < damage then
    local Str_qy = targetUser:GetProperty("Str")
    local Vit_qy = targetUser:GetProperty("Vit")
    if damage <= (Str_qy + Vit_qy) * NoHurtRatio then
      if srcUser.isServerCall then
        targetUser:AddBuff(136732, targetUser:GetGuid())
      end
      return 0, CommonFun.DamageType.Barrier
    end
  end
  if targetUser:HasBuffID(128120) and srcUser:HasBuffID(128123) == false and 0 < damage then
    local Ensemble = targetUser:GetProperty("Ensemble")
    damage = damage * (1 - Ensemble % 1000 * 0.1)
  end
  if srcUser:HasBuffID(128120) and targetUser:HasBuffID(128123) == false and 0 < damage then
    local GemValue1 = srcUser:GetGemValue(102162)
    local GemValue2 = srcUser:GetGemValue(112162)
    damage = damage * (1 + GemValue1 / 100000 + GemValue2 / 100000)
  end
  if targetUser:HasBuffID(131530) then
    local skill_lv = targetUser:GetBuffLevel(131530)
    local MaxHp = targetUser:GetProperty("MaxHp")
    local SeaJudgePer = targetUser:GetProperty("SeaJudgePer")
    local SeaReducPer = targetUser:GetProperty("SeaReducPer")
    if damage >= MaxHp * (0.2 - SeaJudgePer) then
      damage = damage * (1 - skill_lv * 0.03 - SeaReducPer)
      if srcUser.isServerCall then
        targetUser:AddBuff(131531, targetUser:GetGuid())
        if targetUser:HasBuffID(22000090) then
          targetUser:AddBuff(131502, srcUser:GetGuid())
          targetUser:AddBuff(131503, srcUser:GetGuid())
        end
      end
    end
  end
  local WeaponType = targetUser:GetEquipedWeaponType()
  local WeaponType2 = srcUser:GetEquipedWeaponType()
  local Baw = targetUser:GetProperty("BaWangRate")
  if WeaponType == 250 and 0 < damage then
    damage = damage * (1 - Baw)
  end
  local anxiang = 1
  if targetUser:HasBuffID(1008010) and (WeaponType2 == 190 or WeaponType2 == 210 or WeaponType2 == 260 or WeaponType2 == 270 or WeaponType2 == 310 or WeaponType2 == 320) and WeaponType == 210 and 0 < damage then
    local skill_anxiang = targetUser:GetBuffLevel(1008010)
    damage = damage * (1 - skill_anxiang * 0.06)
  end
  if targetUser:HasBuffID(119092) or 1 <= targetUser:GetBuffLayer(119097) then
    local rain_num = targetUser:GetBuffLayer(119092) + targetUser:GetBuffLayer(119097)
    local skill_meisheng = srcUser:GetLernedSkillLevel(5503)
    local skill_meisheng1 = srcUser:GetLernedSkillLevel(5553)
    if 1 <= skill_meisheng or 1 <= skill_meisheng1 then
      damage = damage * (1 + 0.01 * (skill_meisheng + skill_meisheng1) * rain_num)
    end
  end
  local targetid = targetUser:GetGuid()
  local distance = srcUser:GetDistance(targetid)
  if CommonFun.LaunchType.LongAttack == skillParams.Launch_Type and (targetUser:HasBuffID(115004) or targetUser:HasBuffID(115080)) and 2 <= distance then
    local BuffNum = targetUser:GetBuffLevel(115080)
    if BuffNum == 0 then
      BuffNum = targetUser:GetBuffLevel(115004)
    end
    damage = math.floor(damage * (1 - (0.15 * BuffNum - 0.05)))
  end
  if targetUser:HasBuffID(1010100) and 3 < distance then
    local lianxugongji = targetUser:GetBuffLevel(1010100)
    damage = damage * (1 - lianxugongji * 0.06)
  end
  if targetUser:HasBuffID(137840) and 5 < distance then
    local Bufflv = targetUser:GetBuffLevel(137840)
    damage = damage * (1 - Bufflv * 0.08)
  end
  if bits3[CommonFun.AttrEffect2.MDamageTo1] == 1 and CommonFun.RollType.Magic == skillParams.RollType then
    return 1, CommonFun.DamageType.Normal
  end
  if bits3[CommonFun.AttrEffect2.DamageTo1] == 1 and CommonFun.RollType.Attack == skillParams.RollType then
    return 1, CommonFun.DamageType.Normal
  end
  local RaidType = srcUser:GetRaidType()
  if RaidType == 32 then
    local ball66 = 1
    if srcUser:HasBuffID(210010) and targetUser:HasBuffID(107340) then
      ball66 = 0.9
    elseif srcUser:HasBuffID(210010) and targetUser:HasBuffID(107341) then
      ball66 = 0.8
    elseif srcUser:HasBuffID(210010) and targetUser:HasBuffID(107342) then
      ball66 = 0.7
    elseif srcUser:HasBuffID(210010) and targetUser:HasBuffID(107343) then
      ball66 = 0.6
    end
    if 0 < damage then
      damage = damage * ball66
    end
  end
  if RaidType == 44 then
    local ball66 = 1
    if srcUser:HasBuffID(210200) and targetUser:HasBuffID(107340) then
      ball66 = 0.96
    elseif srcUser:HasBuffID(210200) and targetUser:HasBuffID(107341) then
      ball66 = 0.92
    elseif srcUser:HasBuffID(210200) and targetUser:HasBuffID(107342) then
      ball66 = 0.88
    elseif srcUser:HasBuffID(210200) and targetUser:HasBuffID(107343) then
      ball66 = 0.84
    end
    if 0 < damage then
      damage = damage * ball66
    end
  end
  if RaidType == 50 then
    local CarRealDam = srcUser:GetProperty("CarRealDam")
    local CarRealDamPer = srcUser:GetProperty("CarRealDamPer")
    local TwlPlayerReduc = targetUser:GetProperty("TwlPlayerReduc")
    local TwlMonsterReduc = targetUser:GetProperty("TwlMonsterReduc")
    local TwlMonsterDam = srcUser:GetProperty("TwlMonsterDam")
    local MaxHp = targetUser:GetProperty("MaxHp")
    if GetSelfID == 0 and 0 < damage then
      damage = damage * (1 - TwlPlayerReduc)
    end
    if GetSelfID ~= 0 and srcUser:HasBuffID(151028) == false and 0 < damage then
      damage = damage * (1 - TwlMonsterReduc)
    end
    if GetSelfID == 0 and GetNpcID ~= 0 and targetUser:HasBuffID(151028) == false and 0 < damage then
      damage = damage * (1 + TwlMonsterDam)
    elseif GetSelfID ~= 0 and GetNpcID ~= 0 and targetUser:HasBuffID(151028) == false and targetUser:HasBuffID(160000) == true and 0 < damage then
      damage = damage * (1 + TwlMonsterDam / 3)
    elseif GetSelfID ~= 0 and GetNpcID ~= 0 and targetUser:HasBuffID(151028) == false and targetUser:HasBuffID(160000) == false and 0 < damage then
      damage = damage * (1 + TwlMonsterDam)
    end
    if srcUser:HasBuffID(151028) and GetNpcID == 0 and targetUser:HasBuffID(151200) == false then
      damage = damage + 0.1 * MaxHp
    elseif not srcUser:HasBuffID(151028) or GetNpcID ~= 0 or targetUser:HasBuffID(151200) then
    end
    if targetUser:HasBuffID(151028) then
      if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage then
        return 0, CommonFun.DamageType.Miss
      elseif srcUser:IsAttackSkill(params.skillIDAndLevel) == false and damage < 0 then
        return 0, CommonFun.DamageType.None
      else
        damage = math.min(damage, MaxHp * 0.003) + CarRealDam * (1 + CarRealDamPer)
      end
    end
    local Master = srcUser:GetMasterUser()
    if targetUser:HasBuffID(151028) and srcUser:HasBuffID(151231) == false and (GetSelfID == 0 or Master ~= nil) and srcUser:HasBuffID(151200) == false then
      damage = 0
    elseif not targetUser:HasBuffID(151028) or srcUser:HasBuffID(151200) then
    end
  end
  local FinalDam = CommonFun.calcFinalDam(srcUser, targetUser, params, logger)
  local MonsterFinalDam = CommonFun.calcMonsterFinalDam(srcUser, targetUser, params, logger)
  if 0 < damage then
    local ResultDamInc = srcUser:GetProperty("ResultDamInc")
    local ResultDamRes = targetUser:GetProperty("ResultDamRes")
    local BossRealDam = srcUser:GetProperty("BossRealDam")
    local BossRealReduc = targetUser:GetProperty("BossRealReduc")
    if targetUser.boss == false then
      BossRealDam = 0
    end
    local Result = 1 + ResultDamInc - ResultDamRes
    Result = math.max(Result, 0.1)
    local BossResult = 1 + BossRealDam - BossRealReduc
    BossResult = math.max(BossResult, 0.01)
    damage = damage * FinalDam * MonsterFinalDam * Result * BossResult
  end
  if 0 < damage and (GetNpcID == 81000 or GetNpcID == 81001 or GetNpcID == 81002 or GetNpcID == 81003 or GetNpcID == 81004 or GetNpcID == 81005) then
    damage = CommonFun.calcATMDam(srcUser, targetUser, params, logger)
    return damage, damageType
  end
  if 0 < damage and (GetNpcID == 250300 or GetNpcID == 250310 or GetNpcID == 250330 or GetNpcID == 260300 or GetNpcID == 260310 or GetNpcID == 260330 or GetNpcID == 270300 or GetNpcID == 270310 or GetNpcID == 270330) then
    damage = damage * CommonFun.calcBOSSFinalDam(srcUser, targetUser, params, logger)
  end
  if targetUser:HasBuffID(159530) and 0 < damage then
    local Limit_Dam = targetUser:GetProperty("MaxHp")
    if damage < Limit_Dam * 0.02 then
      damage = 0
    end
  end
  if 0 < damage and GetNpcID == 280711 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 476 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280708 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 480 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280709 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 188 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280710 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1111 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280734 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1104 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280720 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2035 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280721 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2020 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280745 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2041 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280722 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2019 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280746 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2045 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280459 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2045 or skillID == 2019 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280735 or GetNpcID == 280732 or GetNpcID == 280733) then
    local college = 0.01
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280717 or GetNpcID == 280741) then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 172 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280449 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 172 or skillID == 143 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280718 or GetNpcID == 280742) then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 143 and srcUser:HasBuffID(117320) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280705 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1423 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280729 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1433 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280830 or GetNpcID == 280706) then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1373 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280730 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1384 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280723 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1247 or skillID == 1251 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280747 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 138 or skillID == 201 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280731 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 300 and (srcUser:HasBuffID(117410) or srcUser:HasBuffID(117411)) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280707 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 300 and srcUser:HasBuffID(90200) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280700 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 360 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280724 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 360 or skillID == 1180 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280701 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1164 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280725 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1165 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280702 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if (skillID == 3209 or skillID == 79 or skillID == 74 or skillID == 107 or skillID == 1312) and (srcUser:HasBuffID(118340) or srcUser:HasBuffID(118341) or srcUser:HasBuffID(118342) or srcUser:HasBuffID(118343) or srcUser:HasBuffID(118344)) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280726 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1305 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280703 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 21 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280727 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 21 or skillID == 1261 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280425 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 13 and (srcUser:HasBuffID(80110) or srcUser:HasBuffID(80113) or srcUser:HasBuffID(117630)) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280704 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 13 and (srcUser:HasBuffID(80110) or srcUser:HasBuffID(80113)) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280728 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 13 and srcUser:HasBuffID(117630) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280713 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 448 or skillID == 402 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280737 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1122 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280443 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1625 or skillID == 1637 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280714 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1625 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280738 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1637 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280715 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1612 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280739 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1614 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280719 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1203 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280743 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1208 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280489 or GetNpcID == 280490) then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2200 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280748 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2202 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280750 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2202 or skillID == 2224 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280749 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2227 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280751 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2227 or skillID == 2207 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280755 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2323 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280756 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2323 or skillID == 2301 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if bits2[CommonFun.AttrEffect.InGodStatus] == 1 and 0 < damage then
    return 0, CommonFun.DamageType.Miss
  end
  if GetSelfID == 0 and (GetNpcID == 301200 or GetNpcID == 301201 or GetNpcID == 301202 or GetNpcID == 301203 or GetNpcID == 301204 or GetNpcID == 301205 or GetNpcID == 301206) then
    return 0, CommonFun.DamageType.Miss
  end
  if targetUser:HasBuffID(32290) and 0 < damage and targetUser:HasBuffID(135251) == false then
    local mapid, maptype = srcUser:GetMapInfo()
    local pvpRatio = 5
    if maptype == 2 or maptype == 4 then
      pvpRatio = 20
    end
    local Sp = targetUser:GetProperty("Sp")
    if Sp > damage / pvpRatio then
      damage = damage / pvpRatio
      return damage, CommonFun.DamageType.Normal_Sp
    elseif 0 < Sp and Sp < damage / pvpRatio then
      damage = damage - Sp * pvpRatio
      local Hp = targetUser:GetProperty("Hp")
      if damage >= Hp then
        return damage, damageType
      end
      if srcUser.isServerCall then
        srcUser:AddBuff(32291, targetUser:GetGuid())
      end
    end
  end
  if srcUser:HasBuffID(154690) and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage then
    local skilllv_luk = srcUser:GetBoKiSkillLv(4520)
    local skilllv_lukdam = srcUser:GetBoKiSkillLv(4521)
    local Rate = skilllv_luk * 3
    if CommonFun.IsInRate(Rate, srcUser:GetRandom()) then
      damage = damage * (1.3 + skilllv_lukdam * 0.03)
      damageType = CommonFun.DamageType.Crit
      local skilllv_lukzs = srcUser:GetBoKiSkillLv(4522)
      if 0 < skilllv_lukzs and srcUser.isServerCall then
        srcUser:AddBuff(154340, targetUser:GetGuid())
      end
    end
  end
  local TaichiSecretLandGemLv = targetUser:GetSecretLandGemLv(384009)
  if TaichiSecretLandGemLv ~= 0 and 0 < damage then
    local reduceRatio = TaichiSecretLandGemLv * 0.002 + math.max(TaichiSecretLandGemLv - 30, 0) * 0.001 + math.max(TaichiSecretLandGemLv - 60, 0) * 0.002
    local loseValue = damage * reduceRatio
    damage = damage - loseValue
    if srcUser.isServerCall then
      targetUser:ChangeHpDuringTime(-loseValue, 3, srcUser:GetGuid())
    end
  end
  local skilllv_1 = skillParams.id
  if (srcUser:HasBuffID(35600) or srcUser:HasBuffID(43230) or srcUser:HasBuffID(55170) or srcUser:HasBuffID(66730) or srcUser:HasBuffID(55890) or srcUser:HasBuffID(70450) or srcUser:HasBuffID(56700) or srcUser:HasBuffID(56730) or srcUser:HasBuffID(55710) or srcUser:HasBuffID(73550) or srcUser:HasBuffID(57700) or srcUser:HasBuffID(57170) or srcUser:HasBuffID(23200) or srcUser:HasBuffLayer(23200, EBUFFERLAYER_SHADOW) or srcUser:HasBuffID(602110) or srcUser:HasBuffID(602120) or srcUser:HasBuffID(602130) or srcUser:HasBuffID(602140) or srcUser:HasBuffID(602150) or srcUser:HasBuffID(59510) or srcUser:HasBuffID(602610) or srcUser:HasBuffID(602620) or srcUser:HasBuffID(602630) or srcUser:HasBuffID(602640) or srcUser:HasBuffID(602650) or srcUser:HasBuffID(602910) or srcUser:HasBuffID(602920) or srcUser:HasBuffID(602930) or srcUser:HasBuffID(602940) or srcUser:HasBuffID(602950)) and 0 < damage then
    local Luk = srcUser:GetProperty("Luk")
    local CriDamNum = 1.5 + math.floor(Luk / 6) / 100
    if srcUser:HasBuffID(81002780) then
      CriDamNum = CriDamNum + math.floor(Luk / 6) / 1000
    end
    local CriDamPer = srcUser:GetProperty("CriDamPer")
    if srcUser:HasBuffID(81005110) then
      CriDamNum = CriDamNum + math.floor(CriDamPer * 100 / 20) / 100
    end
    local Ring1 = srcUser:GetEquipedID(5)
    local RefineLv1 = srcUser:GetEquipedRefineLv(5)
    local Ring2 = srcUser:GetEquipedID(6)
    local RefineLv2 = srcUser:GetEquipedRefineLv(6)
    local RefineLv7 = srcUser:GetEquipedRefineLv(7)
    local CriNum1 = 0
    if srcUser:HasBuffID(35600) then
      CriNum1 = 20
    end
    local a = 0
    local b = 0
    if (Ring1 == 44076 or Ring1 == 144076) and RefineLv1 < 8 then
      a = 3
    elseif (Ring1 == 44076 or Ring1 == 144076) and 8 <= RefineLv1 and RefineLv1 < 12 then
      a = 6
    elseif (Ring1 == 44076 or Ring1 == 144076) and RefineLv1 >= 12 then
      a = 10
    end
    if (Ring2 == 44076 or Ring2 == 144076) and RefineLv2 < 8 then
      b = 3
    elseif (Ring2 == 44076 or Ring2 == 144076) and 8 <= RefineLv2 and RefineLv2 < 12 then
      b = 6
    elseif (Ring2 == 44076 or Ring2 == 144076) and RefineLv2 >= 12 then
      b = 10
    end
    local aa = 0
    local bb = 0
    local equipRing5 = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_EQUIP, CommonFun.EquipPos.EEQUIPPOS_ACCESSORY1)
    if equipRing5.id == 44166 or equipRing5.id == 144166 then
      if 0 <= equipRing5.refinelv and 8 > equipRing5.refinelv then
        aa = 3
      elseif 8 <= equipRing5.refinelv and equipRing5.refinelv < 12 then
        aa = 6
      elseif equipRing5.refinelv >= 12 then
        aa = 10
      end
    end
    local equipRingSD5 = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_SHADOWEQUIP, CommonFun.EquipPos.EEQUIPPOS_ACCESSORY1)
    if equipRingSD5.id == 44166 or equipRingSD5.id == 144166 then
      if 0 <= equipRingSD5.refinelv and 8 > equipRingSD5.refinelv then
        aa = 3 * equipRingSD5.quench_per / 100
      elseif 8 <= equipRingSD5.refinelv and equipRingSD5.refinelv < 12 then
        aa = 6 * equipRingSD5.quench_per / 100
      elseif equipRingSD5.refinelv >= 12 then
        aa = 10 * equipRingSD5.quench_per / 100
      end
    end
    local equipRing6 = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_EQUIP, CommonFun.EquipPos.EEQUIPPOS_ACCESSORY2)
    if equipRing6.id == 44166 or equipRing6.id == 144166 then
      if 0 <= equipRing6.refinelv and 8 > equipRing6.refinelv then
        bb = 3
      elseif 8 <= equipRing6.refinelv and equipRing6.refinelv < 12 then
        bb = 6
      elseif equipRing6.refinelv >= 12 then
        bb = 10
      end
    end
    local equipRingSD6 = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_SHADOWEQUIP, CommonFun.EquipPos.EEQUIPPOS_ACCESSORY2)
    if equipRingSD6.id == 44166 or equipRingSD6.id == 144166 then
      if 0 <= equipRingSD6.refinelv and 8 > equipRingSD6.refinelv then
        bb = 3 * equipRingSD6.quench_per / 100
      elseif 8 <= equipRingSD6.refinelv and equipRingSD6.refinelv < 12 then
        bb = 6 * equipRingSD6.quench_per / 100
      elseif equipRingSD6.refinelv >= 12 then
        bb = 10 * equipRingSD6.quench_per / 100
      end
    end
    local CriNum2 = a + b + aa + bb
    local CardBK = srcUser:GetEquipCardNum(7, 20189)
    local CardBK1 = srcUser:GetEquipCardNum(7, 24113)
    local CardKL = srcUser:GetEquipCardNum(7, 23256)
    local CardConjuror = srcUser:GetEquipCardNum(2, 23252)
    local CardCamorra = srcUser:GetEquipCardNum(7, 23334)
    local Card23334 = 0
    if 1 <= CardCamorra then
      Card23334 = srcUser:GetBuffLayer(602910) * 1 + srcUser:GetBuffLayer(602920) * 2 + srcUser:GetBuffLayer(602930) * 3 + srcUser:GetBuffLayer(602940) * 4 + srcUser:GetBuffLayer(602950) * 5
    end
    local CardBE = srcUser:GetEquipCardNum(8, 23455)
    local Card23455 = 0
    if 1 <= CardBE then
      Card23455 = srcUser:GetBuffLayer(602610) * 1 + srcUser:GetBuffLayer(602620) * 2 + srcUser:GetBuffLayer(602630) * 3 + srcUser:GetBuffLayer(602640) * 4 + srcUser:GetBuffLayer(602650) * 5
    end
    local CriNum3 = CardBK * 15 + CardBK1 * 17.5 + CardKL * 10 + CardConjuror * 10 + CardCamorra * (5 + RefineLv7) + CardBE * 10 + Card23455 + Card23334
    local CardNumH1 = srcUser:GetEquipCardNum(5, 23064)
    local CardNumH2 = srcUser:GetEquipCardNum(6, 23064)
    local Card23064 = 0
    if 1 <= CardNumH1 + CardNumH2 then
      Card23064 = srcUser:GetBuffLayer(602110) * 1 + srcUser:GetBuffLayer(602120) * 2 + srcUser:GetBuffLayer(602130) * 3 + srcUser:GetBuffLayer(602140) * 4 + srcUser:GetBuffLayer(602150) * 5
    end
    local CardNumB1 = srcUser:GetEquipCardNum(5, 23324)
    local CardNumB2 = srcUser:GetEquipCardNum(6, 23324)
    local CriNum5 = CardNumH1 * 10 + CardNumH2 * 10 + Card23064 + CardNumB1 * 8 + CardNumB2 * 8
    local CriNum4 = 0
    local RefineLv3 = srcUser:GetEquipedRefineLv(11)
    if srcUser:HasBuffID(66730) and 6 <= RefineLv3 then
      CriNum4 = 20
    elseif srcUser:HasBuffID(66730) and RefineLv3 < 6 then
      CriNum4 = 10
    end
    local CriNum6 = 0
    local RefineLv10 = srcUser:GetEquipedRefineLv(10)
    if srcUser:HasBuffID(70450) then
      CriNum6 = 5 + RefineLv10 * 1
    end
    local CriNum7 = 0
    local RefineLv8 = srcUser:GetEquipedRefineLv(8)
    if srcUser:HasBuffID(73550) then
      CriNum7 = 10 + RefineLv8 * 1
    end
    local CriNum = CriNum1 + CriNum2 + CriNum3 + CriNum4 + CriNum5 + CriNum6 + CriNum7
    if CommonFun.RollType.Magic == skillParams.RollType and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage and CommonFun.IsInRate(CriNum, srcUser:GetRandom()) and (mapid == 7200 or mapid == 7204 or mapid == 7505 or mapid == 7510 or mapid == 7515 or mapid == 7520 or mapid == 154 or srcUser:InDamReduceRaid() == true and srcUser:IsUserCamp() == true) then
      return math.min(damage * CriDamNum), CommonFun.DamageType.Crit
    elseif CommonFun.RollType.Magic == skillParams.RollType and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage and CommonFun.IsInRate(CriNum, srcUser:GetRandom()) then
      return math.min(damage * CriDamNum, 2147483647), CommonFun.DamageType.Crit
    end
  end
  damage = math.floor(damage)
  local count = params.hitedCount
  local index = params.hitedIndex
  if skillParams.Logic_Param.spotter ~= nil and index ~= 1 then
    local spotter = srcUser:GetSpotter(params.skillIDAndLevel) + skillParams.Logic_Param.spotter
    return math.min(damage * spotter, 2147483647), damageType
  end
  if skillID == 252 and count == 1 and srcUser:HasBuffID(20410160) then
    local spotter = srcUser:GetSpotter(params.skillIDAndLevel) + skillParams.Logic_Param.spotter
    return math.min(damage * (1 + spotter * 0.3 * 2), 2147483647), damageType
  end
  if skillID == 253 and index == 1 then
    return 0, 0
  end
  local mapid, maptype = srcUser:GetMapInfo()
  if damage >= 2147483647 and (mapid == 7200 or mapid == 7204 or mapid == 7505 or mapid == 7510 or mapid == 7515 or mapid == 7520 or mapid == 154 or srcUser:InDamReduceRaid() == true and srcUser:IsUserCamp() == true) then
  elseif damage >= 2147483647 then
    damage = 2147483647
  end
  if skillParams.Logic == "SkillLockedTarget" and skillParams.Logic_Param.range == nil and srcUser:HasBuffID(311000) then
    local rate1 = srcUser:GetBuffLayer(311010)
    local rate2 = srcUser:GetBuffLayer(311200) * 10
    local rate = rate1
    if rate1 == 10 then
      rate = rate1 + rate2
    end
    local baoshang = 2
    if rate1 == 10 then
      baoshang = srcUser:GetBuffLayer(311100) * 0.2 + 2
    end
    if CommonFun.IsInRate(rate, srcUser:GetRandom()) then
      damage = damage * baoshang
      damageType = CommonFun.DamageType.Crit
      if srcUser:HasBuffID(311300) and srcUser.isServerCall then
        srcUser:AddBuff(311301, srcUser:GetGuid())
      end
      if srcUser:HasBuffID(311400) and srcUser.isServerCall then
        srcUser:AddBuff(311401, targetUser:GetGuid())
      end
    end
  end
  return damage, damageType
end
No formula links

Changes: 20251127_update vs 20251120_update

 function CommonFun.CalcBaseDamage(srcUser, targetUser, params, logger)
  local damageType = CommonFun.DamageType.Normal
  local damage, forceDamageType = CommonFun.DoCalcDamage(srcUser, targetUser, params, logger)
  if nil == srcUser then
    logger.error(string.format("srcUser is nil"))
    return 0, CommonFun.DamageType.None
  end
  if nil == targetUser then
    logger.error(string.format("targetUser is nil"))
    return 0, CommonFun.DamageType.None
  end
  if nil == Table_Skill then
    logger.error("Table_Skill is nil")
    return 0, CommonFun.DamageType.None
  end
  local skillParams = Table_Skill[params.skillIDAndLevel]
  if nil == skillParams then
    logger.error(string.format("Table_Skill[%d] is nil", params.skillIDAndLevel))
    return 0, CommonFun.DamageType.None
  end
  local paramList = skillParams.Damage
  if nil == paramList or #paramList <= 0 then
    return 0, CommonFun.DamageType.None
  end
  local mapid, maptype = srcUser:GetMapInfo()
  local AttrFunction = srcUser:GetProperty("AttrFunction")
  local bitfunc = CommonFun.getBits(AttrFunction)
  if (targetUser.boss or targetUser.mini or targetUser.changelinepunish) and (targetUser.zoneType == 1 or targetUser.zoneType == 22) and targetUser.noPunishBoss == false and bitfunc[CommonFun.AttrFunction.JustInViceZone] == 1 and targetUser.isBossFromBranch == false then
    return 0, CommonFun.DamageType.Miss
  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
  local iscrit = CommonFun.IsCrit(srcUser, targetUser, skillParams)
  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)
  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)
  local srcAttrEffect = srcUser:GetProperty("AttrEffect3")
  local bits4 = CommonFun.getBits(srcAttrEffect)
  local AttrEffect4 = targetUser:GetProperty("AttrEffect3")
  local bits5 = CommonFun.getBits(AttrEffect4)
  local isCanBlock = true
  if bits4[CommonFun.AttrEffect3.MustHit] == 1 and srcUser:HasBuffID(21930030) then
    isCanBlock = false
  end
  if bits5[CommonFun.AttrEffect3.CantBlock] == 1 then
    isCanBlock = false
  end
  local skill_qy = srcUser:GetLernedSkillLevel(2561)
  if 7 <= skill_qy and srcUser:HasBuffID(136780) and targetUser:HasBuffID(136781) then
    isCanBlock = false
  end
  if skillID == 6110 and srcUser:GetBuffLayer(116080) == 15 then
    isCanBlock = false
  end
  if enemy then
    if targetUser:IsImmuneSkill(skillID) then
      return 0, CommonFun.DamageType.Miss
    end
    if skillID == 160 and DefAttr2 == CommonFun.Nature.Undead and targetUser.boss == false and targetUser.mini == false and targetUser:GetNpcID() ~= 18143 and targetUser:GetNpcID() ~= 18144 and targetUser:GetNpcID() ~= 18145 and targetUser:HasBuffID(160000) == 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
    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 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 and skillID ~= 2243 and skillID ~= 2251 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) then
      local Bufflv = targetUser:GetBuffLevel(132080)
      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) then
        local Bufflv = targetUser:GetBuffLevel(118172)
        Rate = Bufflv * 10 + 20
      end
      if targetUser:HasBuffID(90160) or targetUser:HasBuffID(123280) then
        local Value = targetUser:GetProperty("LongFleeRate")
        Rate = Rate + Value
      end
      if targetUser:HasBuffID(1007010) and srcUser:HasBuffID(1007000) then
        Rate = 100
      end
      if CommonFun.IsInRate(Rate, srcUser:GetRandom()) and srcUser:HasBuffID(49120) == 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) or targetUser:HasBuffID(136010) or targetUser:HasBuffID(136011) then
        Rate = targetUser:GetProperty("LongFleeRate")
      end
      if CommonFun.IsInRate(Rate, srcUser:GetRandom()) and srcUser:HasBuffID(49120) == false then
        return 0, CommonFun.DamageType.Miss
      end
    end
    if targetUser:HasBuffID(20910160) and targetUser:HasBuffID(106100) 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) and targetUser:HasBuffID(136781) == false then
      return 0, CommonFun.DamageType.Miss
    end
    if srcUser:HasBuffID(136781) == false and targetUser:HasBuffID(136780) 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) then
        Rate = Rate + 5 + math.min(Flee / 50, 15)
      end
      local CardSP = targetUser:GetBuffLayer(53550)
      local CardSP1 = targetUser:GetBuffLayer(604210) + targetUser:GetBuffLayer(604220) + targetUser:GetBuffLayer(604230) + targetUser:GetBuffLayer(604240) + targetUser:GetBuffLayer(604250)
      if 0 < CardSP or 0 < CardSP1 then
        Rate = Rate + CardSP * 5 + CardSP1 * 5
      end
      local CardNumH1 = targetUser:GetBuffLayer(56900)
      Rate = Rate + CardNumH1 * 3
      local CardNumH3 = targetUser:GetBuffLayer(58640)
      Rate = Rate + CardNumH3 * 5
      local CardNumMY = targetUser:GetBuffLayer(57850)
      Rate = Rate + CardNumMY * 5
      if targetUser:HasBuffID(90004954) then
        Rate = Rate + 10
      end
      if targetUser:HasBuffID(90005054) then
        Rate = Rate + 5
      end
      local MemoryBufflvlayer = targetUser:GetBuffLayer(29250)
      if targetUser:HasBuffID(29250) then
        Rate = Rate + MemoryBufflvlayer * 1
      end
      if targetUser:HasBuffID(118250) or targetUser:HasBuffID(128100) or targetUser:HasBuffID(128101) or targetUser:HasBuffID(135200) or targetUser:HasBuffID(100038250) or targetUser:HasBuffID(135353) or targetUser:HasBuffID(136011) or targetUser:HasBuffID(1001001) or targetUser:HasBuffID(232030) 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
    local judu = true
    if skillID == 187 and srcUser:HasBuffID(20310010) then
      judu = false
    end
    if skillID == 2227 or skillID == 2243 or skillID == 2251 then
      judu = false
    end
    if isCanBlock == false then
      judu = false
    end
    if skillID == 6110 and srcUser:GetBuffLayer(116080) == 15 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()
        local lingqijian = targetUser:GetBuffLayer(1002001)
        if targetUser:HasBuffID(1002020) then
          rate = rate + 3 * lingqijian
        end
        if CommonFun.IsInRate(rate, srcUser:GetRandom()) and math.floor(params.skillIDAndLevel / 1000) ~= 306 and math.floor(params.skillIDAndLevel / 1000) ~= 422 and math.floor(params.skillIDAndLevel / 1000) ~= 1122 and math.floor(params.skillIDAndLevel / 1000) ~= 1164 and judu == true and math.floor(params.skillIDAndLevel / 1000) ~= 3303 and math.floor(params.skillIDAndLevel / 1000) ~= 819 and math.floor(params.skillIDAndLevel / 1000) ~= 3706 and math.floor(params.skillIDAndLevel / 1000) ~= 1809 and math.floor(params.skillIDAndLevel / 1000) ~= 1835 and math.floor(params.skillIDAndLevel / 1000) ~= 1915 and math.floor(params.skillIDAndLevel / 1000) ~= 1941 and math.floor(params.skillIDAndLevel / 10000) ~= 531 and math.floor(params.skillIDAndLevel / 10000) ~= 532 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 and math.floor(params.skillIDAndLevel / 1000) ~= 411 and math.floor(params.skillIDAndLevel / 1000) ~= 422 and math.floor(params.skillIDAndLevel / 1000) ~= 1122 and math.floor(params.skillIDAndLevel / 1000) ~= 1164 and judu == true and math.floor(params.skillIDAndLevel / 1000) ~= 3303 and math.floor(params.skillIDAndLevel / 1000) ~= 819 and math.floor(params.skillIDAndLevel / 1000) ~= 3706 and math.floor(params.skillIDAndLevel / 1000) ~= 1809 and math.floor(params.skillIDAndLevel / 1000) ~= 1835 and math.floor(params.skillIDAndLevel / 1000) ~= 1915 and math.floor(params.skillIDAndLevel / 1000) ~= 1941 and math.floor(params.skillIDAndLevel / 10000) ~= 531 and math.floor(params.skillIDAndLevel / 10000) ~= 532 then
        local skilllv_weiw = targetUser:GetLernedSkillLevel(1190)
        if 0 < skilllv_weiw and srcUser.isServerCall then
          targetUser:AddBuff(116700, srcUser:GetGuid())
        end
        local skilllv_ss = targetUser:GetLernedSkillLevel(3806)
        if 0 < skilllv_ss and srcUser.isServerCall then
          targetUser:AddBuff(130080, targetUser:GetGuid())
        end
        local skilllv_zhanji2 = targetUser:GetLernedSkillLevel(5402)
        local targetid = targetUser:GetGuid()
        local distance = srcUser:GetDistance(targetid)
        if 0 < skilllv_zhanji2 and distance <= 3 and targetUser:HasBuffID(1004041) then
          local zhanjirate = skilllv_zhanji2 * 5 + 25
          if srcUser.isServerCall and CommonFun.IsInRate(zhanjirate, srcUser:GetRandom()) then
            targetUser:AddBuff(1004010, srcUser:GetGuid())
          end
        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)
      if targetUser:HasBuffID(116094) then
        rate = 100
      end
      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 and math.floor(params.skillIDAndLevel / 1000) ~= 3303 and math.floor(params.skillIDAndLevel / 1000) ~= 819 then
        local RuneNum = targetUser:GetRunePoint(34030)
        if 0 < RuneNum then
          local RuneRate = RuneNum * 25 + GemValue2 / 1000
          if srcUser.isServerCall and CommonFun.IsInRate(RuneRate, srcUser:GetRandom()) then
            targetUser:AddBuff(116041, srcUser:GetGuid())
          end
        end
        if targetUser:HasBuffID(116094) and srcUser.isServerCall then
          targetUser:AddBuff(116096, targetUser:GetGuid())
        end
        return 0, CommonFun.DamageType.WeaponBlock
      end
      local rate2 = 0
      local skilllv_xiaodao = targetUser:GetLernedSkillLevel(6102)
      local xiaodao = targetUser:GetBuffLayer(1011001)
      if targetUser:HasBuffID(1011001) then
        rate2 = xiaodao * 0.4 * skilllv_xiaodao
      end
      if targetUser:HasBuffID(116094) and targetUser:HasBuffID(1011001) then
        rate2 = 100
      end
      if CommonFun.IsInRate(rate2, srcUser:GetRandom()) and skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == true and skillParams.RollType == 1 and math.floor(params.skillIDAndLevel / 1000) ~= 2227 and math.floor(params.skillIDAndLevel / 1000) ~= 2243 and math.floor(params.skillIDAndLevel / 1000) ~= 2251 then
        if targetUser:HasBuffID(116094) and srcUser.isServerCall then
          targetUser:AddBuff(116096, targetUser:GetGuid())
        end
        return 0, CommonFun.DamageType.WeaponBlock
      end
    end
    if srcUser:HasBuffID(1007000) and targetUser:HasBuffID(1007010) then
      local Rate1 = 0
      local skilllv_bafeng = targetUser:GetBuffLevel(1007010)
      if srcUser:IsBuffFrom(1007000, targetUser:GetGuid()) then
        Rate1 = skilllv_bafeng * 5
      end
      if CommonFun.IsInRate(Rate1, srcUser:GetRandom()) and srcUser:HasBuffID(49120) == false then
        return 0, CommonFun.DamageType.Miss
      end
    end
    if targetUser:HasBuffID(1006200) then
      local Rate2 = 0
      local skilllv_sanlian = targetUser:GetBuffLevel(1006200)
      if 1 <= skilllv_sanlian then
        local Agi = targetUser:GetProperty("Agi")
        Rate2 = math.floor(Agi / (65 - 5 * skilllv_sanlian)) * skilllv_sanlian
      end
      if CommonFun.IsInRate(Rate2, srcUser:GetRandom()) and srcUser:HasBuffID(49120) == false then
        return 0, CommonFun.DamageType.Miss
      end
    end
    if targetUser:HasBuffID(318001) and targetUser:HasBuffID(318301) and isCanBlock == true then
      local rate1 = targetUser:GetBuffLayer(318001) * 2
      if targetUser:HasBuffID(318400) then
        rate1 = rate1 * 2
      end
      if CommonFun.IsInRate(rate1, srcUser:GetRandom()) then
        return 0, CommonFun.DamageType.WeaponBlock
      end
    end
    if srcUser:HasBuffID(323301) or srcUser:HasBuffID(323401) then
      local Rate1 = 10
      if srcUser:HasBuffID(323401) then
        Rate1 = 20
      end
      if CommonFun.IsInRate(Rate1, srcUser:GetRandom()) then
        return 0, CommonFun.DamageType.Miss
      end
    end
    local buff2MissAtkAttr = {
      [90005525] = {
        6,
        7,
        8,
        10
      },
      [90005545] = {
        1,
        2,
        3,
        4
      },
      [30031304] = {
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      },
      [30031305] = {
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      },
      [30031306] = {
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      },
      [30031307] = {
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      }
    }
    local srcAtkElement = CommonFun.GetUserAtkAttrByList(srcUser, 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
  if nil ~= forceDamageType then
    damageType = forceDamageType
    if CommonFun.DamageType.None == damageType or CommonFun.DamageType.Miss == damageType or CommonFun.DamageType.Block == damageType then
      return damage, damageType
    end
  elseif 0 == damage then
    return 0, CommonFun.DamageType.Miss
  elseif damage < 0 then
    damageType = CommonFun.DamageType.Treatment
  end
-  if CommonFun.DamageType.Normal == damageType or CommonFun.DamageType.Crit == damageType or CommonFun.DamageType.ErLianJi == damageType then
    local profressionID = srcUser:GetProfressionID()
    if 0 < profressionID then
      local randomRange = Table_Class[profressionID].DamRandom
      if nil ~= randomRange then
        damage = damage * CommonFun.RandomRange(randomRange[1], randomRange[2], srcUser:GetRandom())
      end
    end
  end
   if (damageType == nil or damageType == CommonFun.DamageType.Normal or damageType == CommonFun.DamageType.Crit) and CommonFun.RollType.Attack == skillParams.RollType and srcUser:IsAttackSkill(params.skillIDAndLevel) and iscrit then
    damageType = CommonFun.DamageType.Crit
    local damageParam = skillParams.Damage
    if damageParam ~= nil and damageParam[1] ~= nil then
      damageParam = damageParam[1]
    end
    local raceparam = CommonFun.CalcRaceParam(srcUser, targetUser, params, damageParam, logger)
    local bodyparam = CommonFun.CalcBodyParam(srcUser, targetUser, params, damageParam, logger)
    local elementparam = CommonFun.CalcElementParam(srcUser, targetUser, params, damageParam, logger)
    local bossparam = CommonFun.CalcBossParam(srcUser, targetUser, params, damageParam, logger)
    local raceparam2 = CommonFun.CalcRaceParam2(srcUser, targetUser, params, damageParam, logger)
    local bodyparam2 = CommonFun.CalcBodyParam2(srcUser, targetUser, params, damageParam, logger)
    local elementparam2 = CommonFun.CalcElementParam2(srcUser, targetUser, params, damageParam, logger)
    local bossparam2 = CommonFun.CalcBossParam2(srcUser, targetUser, params, damageParam, logger)
    local Str1 = srcUser:GetProperty("Str")
    local Num1 = srcUser:GetRunePoint(62080)
    local Num2 = srcUser:GetRunePoint(51013)
    local Num3 = srcUser:GetRunePoint(120010)
    local Numlianj = srcUser:GetRunePoint(130110)
    local RuneDamage = Num1 * 0.01 + Num2 * 0.05 + Num3 * 0.05 + Numlianj * 0.03 + 1
    local Str = Str1 * RuneDamage
    local Dex = srcUser:GetProperty("Dex")
    local Luk = srcUser:GetProperty("Luk")
    local Int = srcUser:GetProperty("Int")
    local Agi = srcUser:GetProperty("Agi")
    local DamIncrease = srcUser:GetProperty("DamIncrease")
    local MDamIncrease = CommonFun.calcMDamIncrease(srcUser, targetUser)
    local race2 = targetUser.race
    if srcUser:HasBuffID(49320) and srcUser:HasBuffID(49325) then
    elseif srcUser:HasBuffID(49320) then
      race2 = 2
    end
    local DefAttr2 = targetUser:GetProperty("DefAttr")
    local skillLevel = srcUser:GetLernedSkillLevel(29)
    local skillLevel1 = srcUser:GetLernedSkillLevel(1701)
    local skillLevel2 = 0
    if race2 == 3 or DefAttr2 == 9 or DefAttr2 == 7 or srcUser:HasBuffID(20510031) and srcUser:HasBuffID(22000520) or DefAttr2 == 7 and srcUser:HasBuffID(22000520) then
      skillLevel2 = srcUser:GetLernedSkillLevel(234)
      if 10 < skillLevel2 then
        skillLevel2 = 10
      end
    end
    local SkillRealDamage1 = 0
    if skillLevel <= 5 then
      SkillRealDamage1 = skillLevel * 20
    elseif 5 < skillLevel and skillLevel <= 10 then
      SkillRealDamage1 = 100 + math.floor(Agi / 5) * ((skillLevel - 5) * 0.5 + 0.5)
    else
      SkillRealDamage1 = 100 + (skillLevel - 10) * 20 + math.floor(Agi / 5) * 3 + Luk * 2
    end
    local Numliehuo = srcUser:GetRunePoint(203003)
    local liehuo = 1 + Numliehuo * 0.05
    local SkillRealDamage2 = 0
    if skillLevel1 <= 10 then
      SkillRealDamage2 = skillLevel1 * 20 * liehuo
    else
      SkillRealDamage2 = 200 * liehuo
    end
    local SkillRealDamage = SkillRealDamage1 + SkillRealDamage2
    local BaseAtk = 0
    local BaseMAtk = Int * 2 + math.floor(Int * Int / 100)
    local BaseAtk1 = Str1 * 2 + math.floor(Str1 * Str1 / 100) + math.floor(Dex / 5) + math.floor(Luk / 5)
    local BaseAtk2 = Dex * 2 + math.floor(Dex * Dex / 100) + math.floor(Str / 5) + math.floor(Luk / 5)
    local BaseAtk3 = Str * 2 + math.floor(Str * Str / 100) + math.floor(Dex / 5) + math.floor(Luk / 5)
    local NoramlAtkAdd = 5 * Str
    local profressionID = srcUser:GetProfressionID()
    local WeaponType = srcUser:GetEquipedWeaponType()
    if (profressionID == 92 or profressionID == 93 or profressionID == 94 or profressionID == 95) and WeaponType == 210 then
      BaseAtk1 = BaseAtk2
      BaseAtk3 = BaseAtk2
      NoramlAtkAdd = 3 * Dex
    end
    for k, v in pairs(GameConfig.Atkcalculate) do
      if v == profressionID then
        BaseAtk1 = BaseAtk2
        BaseAtk3 = BaseAtk2
        NoramlAtkAdd = 3 * Dex
      end
    end
    local Num4 = srcUser:GetRunePoint(52013)
    local Num5 = srcUser:GetRunePoint(52014)
    local Num6 = srcUser:GetRunePoint(52015)
    local Num7 = srcUser:GetRunePoint(52016)
    local Num8 = srcUser:GetRunePoint(52017)
    local Num9 = srcUser:GetRunePoint(52018)
    local RuneDamage1 = (Num4 + Num5 + Num6 + Num7 + Num8 + Num9) * 0.07
    local Atk1 = srcUser:GetProperty("Atk")
    local MAtk = srcUser:GetProperty("MAtk")
    local MAtkPer = srcUser:GetProperty("MAtkPer")
    local MonkAtk = 0
    if srcUser:HasBuffID(100510) then
      MonkAtk = 5 * Int
    end
    local AtkSpdAdd = 0
    local skilllv_SpdAdd = srcUser:GetLernedSkillLevel(22)
    if srcUser:HasBuffID(80082) and 10 < skilllv_SpdAdd then
      AtkSpdAdd = (skilllv_SpdAdd - 10) * 120
    end
    local skilllv_mfzr = srcUser:GetLernedSkillLevel(3002)
    local Opening = srcUser:GetSkillOptByOption(17)
    local MagicAtk = 0
    if 0 < skilllv_mfzr and Opening == 0 then
      local Sp = srcUser:GetProperty("Sp")
      MagicAtk = Sp * skilllv_mfzr * 0.2
    end
    local skilllv_element = srcUser:GetLernedSkillLevel(127)
    local atk_element = 0
    if 10 < skilllv_element then
      atk_element = Dex * ((skilllv_element - 10) * 0.5)
    end
    local NormalAtk = srcUser:GetProperty("NormalAtk")
    NormalAtk = NormalAtk + NoramlAtkAdd
    local Atk = Atk1 + RuneDamage1 * MAtk * (1 + MAtkPer) + MonkAtk + AtkSpdAdd + MagicAtk + atk_element + NormalAtk
    local Num10 = srcUser:GetRunePoint(11022)
    local Num11 = srcUser:GetRunePoint(203024)
    local Num12 = srcUser:GetRunePoint(11024)
    local Num13 = srcUser:GetRunePoint(12004)
    local Num14 = srcUser:GetRunePoint(12011)
    local Num16 = srcUser:GetRunePoint(70010)
    local RuneDamage2 = (Num10 + Num11 + Num12 + Num13 + Num14 + Num16) * 0.03
    local Num15 = srcUser:GetRunePoint(120020)
    local RuneDamage3 = Num15 * 0.03
    local AtkPer1 = srcUser:GetProperty("AtkPer")
    local AtkPer = AtkPer1 + RuneDamage2 + RuneDamage3
    local MAtkPer = srcUser:GetProperty("MAtkPer")
    local Refine = srcUser:GetProperty("Refine")
    local MRefine = srcUser:GetProperty("MRefine")
    local Vit2 = targetUser:GetProperty("Vit")
    local VitPer2 = targetUser:GetProperty("VitPer")
    local DamReduc2 = CommonFun.calcDamReDuc(srcUser, targetUser)
    local RefineDamReduc = targetUser:GetProperty("RefineDamReduc")
    local RealDamage = targetUser:GetProperty("RealDamage")
    if targetUser:HasBuffID(96050) and 1 <= RealDamage then
      local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
      if skillID == 359 then
        RealDamage = RealDamage - 1
      end
    end
    local AttrEffect = srcUser:GetProperty("AttrEffect")
    local bits = CommonFun.getBits(AttrEffect)
    local AttrEffect2 = targetUser:GetProperty("AttrEffect")
    local bits2 = CommonFun.getBits(AttrEffect2)
    local StateEffect = targetUser:GetProperty("StateEffect")
    local bits3 = CommonFun.getBits(StateEffect)
    local Weapon = srcUser:GetEquipedID(7)
    if skillParams.RollType == 1 then
      if bits[CommonFun.AttrEffect.NextAttackIncrease] == 1 then
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * 2 * (1 + RealDamage) * (1 + skillLevel2 * 0.05)
        if damage <= 0 then
          damage = 0
        end
      elseif bits2[CommonFun.AttrEffect.NormalSkillDam] == 1 and (profressionID == 42 or profressionID == 43 or profressionID == 44 or profressionID == 45 or profressionID == 102 or profressionID == 103 or profressionID == 104 or profressionID == 105 or profressionID == 112 or profressionID == 113 or profressionID == 114 or profressionID == 115) then
        local targetid = targetUser:GetGuid()
        local distance = srcUser:GetDistance(targetid)
        local skilllv_1 = srcUser:GetLernedSkillLevel(133)
        local DisDam = 1
        if 10 < skilllv_1 then
          DisDam = 1 + distance / 7.5 * (skilllv_1 - 10) * 0.1
          if srcUser:HasBuffID(131080) or targetUser:IsBuffFrom(1007000, srcUser:GetGuid()) and srcUser:HasBuffID(1007050) then
            DisDam = 1 + (skilllv_1 - 10) * 0.1
          end
          DisDam = math.min(DisDam, 2)
        end
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * 1.3 * (1 + RealDamage) * (1 + skillLevel2 * 0.05) * DisDam
        if damage <= 0 then
          damage = 0
        end
      elseif bits3[CommonFun.StateEffect.Dizzy] == 1 and (Weapon == 40322 or Weapon == 140322) then
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1 + skillLevel2 * 0.05) * 1.5
        if damage <= 0 then
          damage = 0
        end
      elseif skillID == 300 or skillID == 469 or skillID == 1397 or skillID == 1446 or skillID == 252 or skillID == 253 then
        local targetid = targetUser:GetGuid()
        local distance = srcUser:GetDistance(targetid)
        local skilllv_1 = srcUser:GetLernedSkillLevel(133)
        local skilllv_2 = srcUser:GetLernedSkillLevel(478)
        local DisDam = 1
        if 10 < skilllv_1 then
          DisDam = 1 + distance / 7.5 * (skilllv_1 - 10) * 0.1
          if srcUser:HasBuffID(131080) or targetUser:IsBuffFrom(1007000, srcUser:GetGuid()) and srcUser:HasBuffID(1007050) then
            DisDam = 1 + (skilllv_1 - 10) * 0.1
          end
          DisDam = math.min(DisDam, 2)
        elseif 10 < skilllv_2 then
          DisDam = 1 + distance / 7.5 * (skilllv_2 - 10) * 0.1
          DisDam = math.min(DisDam, 2)
        end
        local fromid = targetUser:GetBuffFromID(116470)
        local guid = srcUser:GetGuid()
        local BUffDam = 1
        local skilllv_biaoji = srcUser:GetLernedSkillLevel(1147)
        local GemBiaoji = srcUser:GetGemValue(91121)
        local Numxp = srcUser:GetRunePoint(94080)
        if fromid == guid then
          BUffDam = 1 + skilllv_biaoji * 0.02 + Numxp * 0.02 + GemBiaoji / 100000
        end
        local SpAtk = 0
        if srcUser:HasBuffID(131096) then
          local Sp = srcUser:GetProperty("Sp")
          SpAtk = Sp
        end
        damage = ((((Atk - BaseAtk1) * (1 + AtkPer) + SpAtk) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1 + skillLevel2 * 0.05) * DisDam * BUffDam
        if damage <= 0 then
          damage = 0
        end
      elseif skillID == 470 then
        local Enemy = 1
        local skilllv_zy = srcUser:GetLernedSkillLevel(1145)
        if 0 < skilllv_zy and 1 >= srcUser:GetRangeEnemy(3) then
          Enemy = 1 + skilllv_zy * 0.03
        end
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1 + skillLevel2 * 0.05) * Enemy
        if damage <= 0 then
          damage = 0
        end
      elseif skillID == 5614 then
        local skilllv_ls = srcUser:GetLernedSkillLevel(5610)
        local skilllv_ls2 = srcUser:GetLernedSkillLevel(5613)
        local DefReduc = CommonFun.CalcDef(srcUser, targetUser)
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * DefReduc * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1.4 + skilllv_ls * 0.4) * (0.05 * skilllv_ls2 + 0.25)
        if damage <= 0 then
          damage = 0
        end
      else
        damage = (((Atk - BaseAtk1) * (1 + AtkPer) * CommonFun.ShapeCorrection(srcUser, targetUser) * bodyparam * elementparam * elementparam2 + BaseAtk3) * raceparam * bossparam * bossparam2 * (1 - DamReduc2) + Refine + SkillRealDamage - Vit2 * (1 + VitPer2)) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 - RefineDamReduc) * (1 + DamIncrease) * (1 + RealDamage) * (1 + skillLevel2 * 0.05)
        if damage <= 0 then
          damage = 0
        end
      end
    elseif bits[CommonFun.AttrEffect.NextAttackIncrease] == 1 then
      damage = ((MAtk - BaseMAtk) * (1 + MAtkPer) + BaseMAtk + MRefine) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 + MDamIncrease) * 2 * (1 + RealDamage)
    elseif bits2[CommonFun.AttrEffect.NormalSkillDam] == 1 and (profressionID == 42 or profressionID == 43 or profressionID == 44 or profressionID == 45 or profressionID == 102 or profressionID == 103 or profressionID == 104 or profressionID == 105 or profressionID == 112 or profressionID == 113 or profressionID == 114 or profressionID == 115) then
      local targetid = targetUser:GetGuid()
      local distance = srcUser:GetDistance(targetid)
      local skilllv_1 = srcUser:GetLernedSkillLevel(133)
      local DisDam = 1
      if 10 < skilllv_1 then
        DisDam = 1 + distance / 7.5 * (skilllv_1 - 10) * 0.1
        if srcUser:HasBuffID(131080) or targetUser:IsBuffFrom(1007000, srcUser:GetGuid()) and srcUser:HasBuffID(1007050) then
          DisDam = 1 + (skilllv_1 - 10) * 0.1
        end
        DisDam = math.min(DisDam, 2)
      end
      damage = ((MAtk - BaseMAtk) * (1 + MAtkPer) + BaseMAtk + MRefine) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 + MDamIncrease) * 1.3 * (1 + RealDamage) * DisDam
    else
      damage = ((MAtk - BaseMAtk) * (1 + MAtkPer) + BaseMAtk + MRefine) * CommonFun.CalcCrit(srcUser, targetUser, skillParams) * (1 + MDamIncrease) * (1 + RealDamage)
    end
    if targetUser:GetNpcID() == 30028 then
      damage = 1
    end
    local elementDam = CommonFun.DoCalcElementDam(srcUser, targetUser, params, damageParam)
    local stateDam = CommonFun.DoCalcStateEffectDam(srcUser, targetUser)
    local fromid = targetUser:GetBuffFromID(45000120)
    local guid = srcUser:GetGuid()
    local BUffDam = 1
    if fromid == guid then
      BUffDam = 1.3
    end
    local RefineLv = srcUser:GetEquipedRefineLv(7)
    local HolyEquip = 1
    if (Weapon == 40319 or Weapon == 140319) and (profressionID == 11 or profressionID == 12 or profressionID == 13 or profressionID == 14 or profressionID == 15 or profressionID == 203 or profressionID == 204 or profressionID == 205 or profressionID == 72 or profressionID == 73 or profressionID == 74 or profressionID == 75 or profressionID == 605 or profressionID == 665) then
      HolyEquip = 1 + 0.05 * RefineLv
    end
    if (Weapon == 40360 or Weapon == 140360) and (profressionID == 11 or profressionID == 12 or profressionID == 13 or profressionID == 14 or profressionID == 15 or profressionID == 203 or profressionID == 204 or profressionID == 205 or profressionID == 72 or profressionID == 73 or profressionID == 74 or profressionID == 75 or profressionID == 605 or profressionID == 665) then
      HolyEquip = 1 + 0.05 * RefineLv
    end
    local zhufu = 1
    if srcUser:HasBuffID(129040) or srcUser:HasBuffID(129041) then
      local skilllv_zf = srcUser:GetLernedSkillLevel(3610)
      local GemValue = srcUser:GetGemValue(51161)
      zhufu = 1 + skilllv_zf * 0.02 + GemValue / 100000
    end
    local hualiBuff = srcUser:HasBuffID(24441)
    local huali = 1
    if hualiBuff == true and srcUser:HasBuffID(90001903) then
      huali = 1.25
    elseif hualiBuff == true then
      huali = 1.1
    end
    local Ninja = 1
    local NinjaDamPer = 1
    if skillID == 2010 or skillID == 2011 or skillID == 2012 or skillID == 2013 then
      local Agi = srcUser:GetProperty("Agi")
      local AgiRune = srcUser:GetRunePoint(163012)
      local AgiDam = 1 + math.floor(Agi / 10) * AgiRune * 0.004
      local Famous = 1
      local RefineLv7 = srcUser:GetEquipedRefineLv(7)
      if srcUser:HasBuffID(44360) then
        Famous = Famous * (RefineLv7 * 0.01 + 1)
      end
      if srcUser:HasBuffID(44370) then
        Famous = Famous * (RefineLv7 * 0.03 + 1)
      end
      Ninja = AgiDam * Famous
    end
    if skillID == 2011 then
      NinjaDamPer = 1.5
    end
    if skillID == 2012 then
      NinjaDamPer = 3
    end
    if skillID == 2013 then
      local Rune = srcUser:GetRunePoint(163021)
      NinjaDamPer = 6 * (1 + Rune * 0.05)
    end
    if skillID == 2200 and WeaponType == 320 then
      damage = damage * 2
    end
    if skillID == 300 or skillID == 113 or skillID == 252 then
      local guid = srcUser:GetGuid()
      local Debuff_Layer_1 = targetUser:GetBuffLayerByIDAndFromID(96082, guid)
      local Debuff_Layer_2 = targetUser:GetBuffLayerByIDAndFromID(96083, guid)
      local sw_dam = math.max(Debuff_Layer_1, Debuff_Layer_2) * 0.06 + 1
      damage = damage * sw_dam
    end
    if skillID == 300 or skillID == 113 or skillID == 252 then
      local bafeng = 1
      local skilllv_1 = srcUser:GetLernedSkillLevel(5700)
      if targetUser:IsBuffFrom(1007000, srcUser:GetGuid()) then
        bafeng = 1 + skilllv_1 * 0.05
      end
      damage = damage * bafeng
    end
    if skillID == 5204 then
      local skilllv_sishi = srcUser:GetLernedSkillLevel(5200)
      damage = damage * (1 + skilllv_sishi * 0.05)
    end
    if skillID == 173 then
      local skilllv_qihei = srcUser:GetLernedSkillLevel(194)
      if targetUser:GetBuffActive(95500) then
        damage = damage * (1 + 0.15 * skilllv_qihei)
      end
    end
    if skillID == 5904 then
      local skilllv_shengguang = srcUser:GetLernedSkillLevel(5900)
      damage = damage * (1 + 0.1 * skilllv_shengguang)
    end
    damage = damage * elementDam * stateDam * BUffDam * HolyEquip * zhufu * Ninja * NinjaDamPer * huali
  end
  local GetNpcID = targetUser:GetNpcID()
  local GetSelfID = srcUser:GetNpcID()
  if 0 < damage and GetNpcID == 30034 and srcUser:HasBuffID(121) then
    local Atk = srcUser:GetProperty("Atk")
    local MAtk = srcUser:GetProperty("MAtk")
    damage = damage + (Atk + MAtk) * 2.5
  end
  if targetUser:HasBuffID(10740) and srcUser:HasBuffID(10741) == false then
    damage = 0.2
  end
  local NormalRealDam = srcUser:GetProperty("NormalRealDam")
  local NormalMRealDam = srcUser:GetProperty("NormalMRealDam")
  local SkillRealDam = srcUser:GetProperty("SkillRealDam")
  local SkillMRealDam = srcUser:GetProperty("SkillMRealDam")
  local RefineDamReduc = targetUser:GetProperty("RefineDamReduc")
  local RefineMDamReduc = targetUser:GetProperty("RefineMDamReduc")
  local NormalAtkDam = srcUser:GetProperty("NormalAtkDam")
  local NormalAtkRes = targetUser:GetProperty("NormalAtkRes")
  local SkillDam = srcUser:GetProperty("SkillDam")
  local SkillRes = targetUser:GetProperty("SkillRes")
  if (skillID == 306 or skillID == 3303 or skillID == 819) and srcUser:HasBuffID(22000830) then
    SkillRes = math.max(SkillRes - 0.3, 0)
  end
  local ActuallySkiRes = SkillRes - SkillDam
  local ActuallyNorRes = NormalAtkRes - NormalAtkDam
  if maptype == 2 or maptype == 4 then
    ActuallySkiRes = ActuallySkiRes < -1 and -1 or 1 < ActuallySkiRes and 1 or ActuallySkiRes
    ActuallySkiRes = math.floor(ActuallySkiRes * 1000) / 1000
    ActuallySkiRes = ActuallySkiRes + 0.4 * (1 - math.sin(ActuallySkiRes * 3.14 / 2))
    ActuallyNorRes = ActuallyNorRes < -1 and -1 or 1 < ActuallyNorRes and 1 or ActuallyNorRes
    ActuallyNorRes = math.floor(ActuallyNorRes * 1000) / 1000
    ActuallyNorRes = ActuallyNorRes + 0.4 * (1 - math.sin(ActuallyNorRes * 3.14 / 2))
  end
  local NormalEnd = 1 - ActuallyNorRes
  local SkillEnd = 1 - ActuallySkiRes
  NormalEnd = math.max(NormalEnd, 0.15)
  SkillEnd = math.max(SkillEnd, 0.15)
  if skillID == 404 then
    SkillEnd = 1
  end
  if skillID == 83040 or skillID == 83041 or skillID == 83042 or skillID == 83050 or skillID == 83051 then
    SkillEnd = 1
  end
  if CommonFun.RollType.Magic == skillParams.RollType then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) and 0 < damage then
      damage = (damage + NormalMRealDam * (1 - RefineMDamReduc)) * NormalEnd
    elseif not srcUser:IsAttackSkill(params.skillIDAndLevel) and 0 < damage then
      damage = (damage + SkillMRealDam * (1 - RefineMDamReduc)) * SkillEnd
    end
  end
  if CommonFun.RollType.Attack == skillParams.RollType then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) and 0 < damage then
      damage = (damage + NormalRealDam * (1 - RefineDamReduc)) * NormalEnd
    elseif not srcUser:IsAttackSkill(params.skillIDAndLevel) and 0 < damage then
      damage = (damage + SkillRealDam * (1 - RefineDamReduc)) * SkillEnd
    end
  end
  if GetNpcID == 40021 or GetNpcID == 40023 then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID ~= 151 or srcUser:InGvgZone() == false or srcUser:NoAttackMetal() == true then
      return 0, CommonFun.DamageType.Miss
    end
    local hl_maxhp = targetUser:GetProperty("MaxHp")
    if damage >= hl_maxhp * 1 / 300 then
      damage = hl_maxhp * 1 / 300
    end
  end
  if GetNpcID == 40024 or GetNpcID == 40026 then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID ~= 151 or srcUser:InGvgZone() == false or srcUser:NoAttackMetal() == true then
      return 0, CommonFun.DamageType.Miss
    end
    local hl_maxhp = targetUser:GetProperty("MaxHp")
    if damage >= hl_maxhp * 1 / 200 then
      damage = hl_maxhp * 1 / 200
    end
  end
  if GetNpcID == 40022 or GetNpcID == 55000 then
    if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID ~= 151 then
      return 0, CommonFun.DamageType.Miss
    end
    local hl_maxhp = targetUser:GetProperty("MaxHp")
    if damage >= hl_maxhp * 1 / 30 then
      damage = hl_maxhp * 1 / 30
    end
  end
  if srcUser:HasBuffID(166450) == true and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and skillID ~= 151 then
    return 0, CommonFun.DamageType.Miss
  end
  if (CommonFun.DamageType.Normal == damageType or CommonFun.DamageType.Crit == damageType or CommonFun.DamageType.ErLianJi == damageType) and targetUser:DamageAlways1() then
    damageType = CommonFun.DamageType.Normal
    damage = 1
  end
  if targetUser:HasBuffID(159620) 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
  local Baxie = true
  if (skillID == 469 or skillID == 470 or skillID == 4228) and srcUser:HasBuffID(20910120) then
    Baxie = false
  end
  if skillID == 2227 or skillID == 2243 or skillID == 2251 then
    Baxie = false
  end
  if isCanBlock == false then
    Baxie = false
  end
  if bits2[CommonFun.AttrEffect.BaXieZhiZhen] == 1 and CommonFun.RollType.Attack == skillParams.RollType and 0 < damage and skillID ~= 411 and skillID ~= 306 and skillID ~= 3303 and skillID ~= 819 and Baxie == true then
    if targetUser.AddBuffDamage ~= nil then
      targetUser:AddBuffDamage(damage)
    end
    if srcUser.isServerCall then
      srcUser:SetMissStillBuff()
    end
    return 0, CommonFun.DamageType.Miss
  end
  if 0 < damage and (targetUser:GetNpcID() == 56941 or targetUser:GetNpcID() == 56942) and srcUser:GetNpcID() ~= 56941 and srcUser:GetNpcID() ~= 56942 then
    return 1, CommonFun.DamageType.Normal
  end
  if 0 < damage and targetUser:GetNpcID() == 300100 and srcUser:HasBuffID(180220) then
    damage = damage * 1.3
  end
  if 0 < damage and srcUser:GetNpcID() == 300100 and targetUser:HasBuffID(180219) then
    damage = damage * 0.5
  end
  if 0 < damage and targetUser:GetNpcID() == 300101 and srcUser:HasBuffID(180518) then
    damage = damage * 1.25
  end
  if 0 < damage and srcUser:GetNpcID() == 300101 and targetUser:HasBuffID(180517) then
    damage = damage * 0.7
  end
  if (targetUser:HasBuffID(121030) == true or targetUser:HasBuffID(55693) == true or targetUser:HasBuffID(90003955) == true or targetUser:HasBuffID(90005555) == true) and CommonFun.RollType.Magic == skillParams.RollType and 0 < damage and isCanBlock == true then
    return 0, CommonFun.DamageType.DefMagic
  end
  if (targetUser:HasBuffID(90003975) == true or targetUser:HasBuffID(90005405) == 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) and isCanBlock == true and 0 < damage then
    local Bufflv = targetUser:GetBuffLevel(107330)
    if CommonFun.IsInRate(Bufflv * 3, srcUser:GetRandom()) then
      return 0, CommonFun.DamageType.WeaponBlock
    end
  end
  local JGBH = 1
  if (targetUser:HasBuffID(100660) == true or targetUser:HasBuffID(21430114) == true or targetUser:HasBuffID(1010230) == true) and 0 < damage then
    local GemValue = targetUser:GetProperty("JinGangRate")
    JGBH = 0.15 - GemValue
    local skilllv_ab = srcUser:GetLernedSkillLevel(306)
    if 5 < skilllv_ab and skillID == 306 or skillID == 3303 or skillID == 819 then
      JGBH = 1
    end
    damage = math.floor(damage * JGBH)
  end
  local ZFZ = 1
  if targetUser:HasBuffID(117105) == true and 0 < damage then
    local skilllv_zfz = targetUser:GetBuffLevel(117105)
    ZFZ = 1 - 0.15 * (skilllv_zfz - 5)
    damage = math.floor(damage * ZFZ)
  end
  if targetUser:HasBuffID(31790) and 0 < damage then
    damage = damage * 1.2
  end
  local targetEnemyNum = targetUser:GetRangeEnemy(5)
  if (targetUser:HasBuffID(59240) or targetUser:HasBuffID(605710) or targetUser:HasBuffID(605720) or targetUser:HasBuffID(605730) or targetUser:HasBuffID(605740) or targetUser:HasBuffID(605750)) and 1 <= targetEnemyNum and 0 < damage then
    damage = damage * (1 - math.min(targetEnemyNum * 0.02, 0.1))
  end
  if targetUser:HasBuffID(136240) then
    local MoonReduc = targetUser:GetProperty("MoonReduc")
    if targetUser:GetMoonMark(srcUser) then
      damage = damage * (1 - MoonReduc)
    end
  end
  if srcUser:HasBuffID(136581) ~= true and targetUser:HasBuffID(136580) and 0 < damage then
    local TreeReduc = targetUser:GetProperty("TreeReduc")
    damage = damage * (1 - TreeReduc)
  end
  if targetUser:HasBuffID(136600) or targetUser:HasBuffID(136522) and 0 < damage then
    local DragonReduc = targetUser:GetProperty("DragonReduc")
    damage = damage * (1 - DragonReduc)
  end
  if targetUser:HasBuffID(165542) and 0 < damage then
    damage = damage * 1.5
  end
  if targetUser:HasBuffID(166580) and 0 < damage then
    damage = damage * 1.3
  end
  if CommonFun.RollType.Attack == skillParams.RollType and targetUser:HasBuffID(10110) and 0 < damage then
    damage = damage * 0.01
  end
  if targetUser:HasBuffID(90003554) and 0 < damage then
    local MaxHp = targetUser:GetProperty("MaxHp")
    local Hp = targetUser:GetProperty("Hp")
    if Hp / MaxHp >= 0.9 then
      damage = damage * 0.5
    end
  end
  local targetTeamNum = targetUser:GetRangeTeammate(5)
  if targetUser:HasBuffID(29650) and 1 <= targetTeamNum then
    damage = damage * 0.97
  elseif targetUser:HasBuffID(29651) and 1 <= targetTeamNum then
    damage = damage * 0.94
  elseif targetUser:HasBuffID(29652) and 1 <= targetTeamNum then
    damage = damage * 0.85
  end
  if targetUser:HasBuffID(135240) == true then
    local skilllv_sz = targetUser:GetBuffLevel(135240)
    damage = damage * (1 - 0.1 * skilllv_sz)
  end
  if targetUser:HasBuffID(135361) or targetUser:HasBuffID(135363) then
    local SoulNum = targetUser:GetProperty("Soul_Linker")
    damage = damage / math.max(1, SoulNum)
  end
  if targetUser:HasBuffID(30031100) and 0 < damage then
    local mateNum = targetUser:GetMapTeammateNum()
    local fentan = 1
    if targetUser:HasBuffID(30031101) then
      fentan = 0.9
    elseif targetUser:HasBuffID(30031102) then
      fentan = 0.75
    elseif targetUser:HasBuffID(30031103) then
      fentan = 0.6
    end
    damage = damage / math.max(1, mateNum) * fentan
  end
  local MaxHpsrcUser = srcUser:GetProperty("MaxHp")
  local MaxHptargetUser = targetUser:GetProperty("MaxHp")
  local MaxHp_hpper = MaxHptargetUser / MaxHpsrcUser
  if targetUser:HasBuffID(63180) and 0 < damage and 1 < MaxHp_hpper then
    damage = damage * 0.95
  end
  local StateEffectGashapon = srcUser:GetProperty("StateEffect")
  local bits = CommonFun.getBits(StateEffectGashapon)
  if bits[CommonFun.StateEffect.Poison] == 1 and targetUser:HasBuffID(64350) and 0 < damage then
    damage = damage * 0.9
  end
  if targetUser:HasBuffID(90003164) and targetUser:InMoveStatus() == true and 0 < damage then
    damage = damage * 0.7
  end
  if targetUser:HasBuffID(90003984) and targetUser:InMoveStatus() == true and 0 < damage then
    damage = damage * 0.95
  end
  if targetUser:HasBuffID(56510) then
    local guid = targetUser:GetGuid()
    local Debuff_Layer = srcUser:GetBuffLayerByIDAndFromID(96083, guid)
    damage = damage * (1 - 0.06 * Debuff_Layer)
  end
  if CommonFun.Shape.L == targetUser.shape and CommonFun.RollType.Magic == skillParams.RollType and 0 < damage then
    local largedam = 1
    if srcUser:HasBuffID(71930) then
      largedam = largedam + 0.25
    end
    local CardMedia = srcUser:GetEquipCardNum(7, 23265)
    largedam = largedam + CardMedia * 0.15
    local CardLabore = srcUser:GetEquipCardNum(7, 23284)
    largedam = largedam + CardLabore * 0.1
    if srcUser:HasBuffID(29440) then
      largedam = largedam + 0.04
    elseif srcUser:HasBuffID(29441) then
      largedam = largedam + 0.08
    elseif srcUser:HasBuffID(29442) then
      largedam = largedam + 0.2
    end
    if srcUser:HasBuffID(118271) then
      local skilllv_ruihua = srcUser:GetLernedSkillLevel(1324)
      largedam = largedam + (skilllv_ruihua - 5) * 0.06
    end
    damage = damage * largedam
  end
  if CommonFun.Shape.M == targetUser.shape and CommonFun.RollType.Magic == skillParams.RollType and 0 < damage then
    local mediumdam = 1
    local RefineLv = srcUser:GetEquipedRefineLv(8)
    if srcUser:HasBuffID(72280) then
      mediumdam = mediumdam + 0.05 + RefineLv * 0.01
    end
    if srcUser:HasBuffID(57300) then
      mediumdam = mediumdam + 0.02 + RefineLv * 0.01
    end
    if srcUser:HasBuffID(57310) then
      mediumdam = mediumdam + 0.05 + RefineLv * 0.01
    end
    damage = damage * mediumdam
  end
  if srcUser:HasBuffID(187550) then
    local mapid, maptype = srcUser:GetMapInfo()
    if mapid == 141 or mapid == 142 or mapid == 143 then
      local MaxHpMijing = targetUser:GetProperty("MaxHp")
      local layerMijing = srcUser:GetBuffLayer(187550)
      local HpMijing = targetUser:GetProperty("Hp")
      if HpMijing <= MaxHpMijing * 0.3 then
        damage = damage * (1 + layerMijing * 0.2)
      end
    end
  end
  local NoHurtRatio = targetUser:GetProperty("NoHurtRatio")
  if 0 < NoHurtRatio and NoHurtRatio ~= nil and 0 < damage then
    local Str_qy = targetUser:GetProperty("Str")
    local Vit_qy = targetUser:GetProperty("Vit")
    if damage <= (Str_qy + Vit_qy) * NoHurtRatio then
      if srcUser.isServerCall then
        targetUser:AddBuff(136732, targetUser:GetGuid())
      end
      return 0, CommonFun.DamageType.Barrier
    end
  end
  if targetUser:HasBuffID(128120) and srcUser:HasBuffID(128123) == false and 0 < damage then
    local Ensemble = targetUser:GetProperty("Ensemble")
    damage = damage * (1 - Ensemble % 1000 * 0.1)
  end
  if srcUser:HasBuffID(128120) and targetUser:HasBuffID(128123) == false and 0 < damage then
    local GemValue1 = srcUser:GetGemValue(102162)
    local GemValue2 = srcUser:GetGemValue(112162)
    damage = damage * (1 + GemValue1 / 100000 + GemValue2 / 100000)
  end
  if targetUser:HasBuffID(131530) then
    local skill_lv = targetUser:GetBuffLevel(131530)
    local MaxHp = targetUser:GetProperty("MaxHp")
    local SeaJudgePer = targetUser:GetProperty("SeaJudgePer")
    local SeaReducPer = targetUser:GetProperty("SeaReducPer")
    if damage >= MaxHp * (0.2 - SeaJudgePer) then
      damage = damage * (1 - skill_lv * 0.03 - SeaReducPer)
      if srcUser.isServerCall then
        targetUser:AddBuff(131531, targetUser:GetGuid())
        if targetUser:HasBuffID(22000090) then
          targetUser:AddBuff(131502, srcUser:GetGuid())
          targetUser:AddBuff(131503, srcUser:GetGuid())
        end
      end
    end
  end
  local WeaponType = targetUser:GetEquipedWeaponType()
  local WeaponType2 = srcUser:GetEquipedWeaponType()
  local Baw = targetUser:GetProperty("BaWangRate")
  if WeaponType == 250 and 0 < damage then
    damage = damage * (1 - Baw)
  end
  local anxiang = 1
  if targetUser:HasBuffID(1008010) and (WeaponType2 == 190 or WeaponType2 == 210 or WeaponType2 == 260 or WeaponType2 == 270 or WeaponType2 == 310 or WeaponType2 == 320) and WeaponType == 210 and 0 < damage then
    local skill_anxiang = targetUser:GetBuffLevel(1008010)
    damage = damage * (1 - skill_anxiang * 0.06)
  end
  if targetUser:HasBuffID(119092) or 1 <= targetUser:GetBuffLayer(119097) then
    local rain_num = targetUser:GetBuffLayer(119092) + targetUser:GetBuffLayer(119097)
    local skill_meisheng = srcUser:GetLernedSkillLevel(5503)
    local skill_meisheng1 = srcUser:GetLernedSkillLevel(5553)
    if 1 <= skill_meisheng or 1 <= skill_meisheng1 then
      damage = damage * (1 + 0.01 * (skill_meisheng + skill_meisheng1) * rain_num)
    end
  end
  local targetid = targetUser:GetGuid()
  local distance = srcUser:GetDistance(targetid)
  if CommonFun.LaunchType.LongAttack == skillParams.Launch_Type and (targetUser:HasBuffID(115004) or targetUser:HasBuffID(115080)) and 2 <= distance then
    local BuffNum = targetUser:GetBuffLevel(115080)
    if BuffNum == 0 then
      BuffNum = targetUser:GetBuffLevel(115004)
    end
    damage = math.floor(damage * (1 - (0.15 * BuffNum - 0.05)))
  end
  if targetUser:HasBuffID(1010100) and 3 < distance then
    local lianxugongji = targetUser:GetBuffLevel(1010100)
    damage = damage * (1 - lianxugongji * 0.06)
  end
  if targetUser:HasBuffID(137840) and 5 < distance then
    local Bufflv = targetUser:GetBuffLevel(137840)
    damage = damage * (1 - Bufflv * 0.08)
  end
  if bits3[CommonFun.AttrEffect2.MDamageTo1] == 1 and CommonFun.RollType.Magic == skillParams.RollType then
    return 1, CommonFun.DamageType.Normal
  end
  if bits3[CommonFun.AttrEffect2.DamageTo1] == 1 and CommonFun.RollType.Attack == skillParams.RollType then
    return 1, CommonFun.DamageType.Normal
  end
  local RaidType = srcUser:GetRaidType()
  if RaidType == 32 then
    local ball66 = 1
    if srcUser:HasBuffID(210010) and targetUser:HasBuffID(107340) then
      ball66 = 0.9
    elseif srcUser:HasBuffID(210010) and targetUser:HasBuffID(107341) then
      ball66 = 0.8
    elseif srcUser:HasBuffID(210010) and targetUser:HasBuffID(107342) then
      ball66 = 0.7
    elseif srcUser:HasBuffID(210010) and targetUser:HasBuffID(107343) then
      ball66 = 0.6
    end
    if 0 < damage then
      damage = damage * ball66
    end
  end
  if RaidType == 44 then
    local ball66 = 1
    if srcUser:HasBuffID(210200) and targetUser:HasBuffID(107340) then
      ball66 = 0.96
    elseif srcUser:HasBuffID(210200) and targetUser:HasBuffID(107341) then
      ball66 = 0.92
    elseif srcUser:HasBuffID(210200) and targetUser:HasBuffID(107342) then
      ball66 = 0.88
    elseif srcUser:HasBuffID(210200) and targetUser:HasBuffID(107343) then
      ball66 = 0.84
    end
    if 0 < damage then
      damage = damage * ball66
    end
  end
  if RaidType == 50 then
    local CarRealDam = srcUser:GetProperty("CarRealDam")
    local CarRealDamPer = srcUser:GetProperty("CarRealDamPer")
    local TwlPlayerReduc = targetUser:GetProperty("TwlPlayerReduc")
    local TwlMonsterReduc = targetUser:GetProperty("TwlMonsterReduc")
    local TwlMonsterDam = srcUser:GetProperty("TwlMonsterDam")
    local MaxHp = targetUser:GetProperty("MaxHp")
    if GetSelfID == 0 and 0 < damage then
      damage = damage * (1 - TwlPlayerReduc)
    end
    if GetSelfID ~= 0 and srcUser:HasBuffID(151028) == false and 0 < damage then
      damage = damage * (1 - TwlMonsterReduc)
    end
    if GetSelfID == 0 and GetNpcID ~= 0 and targetUser:HasBuffID(151028) == false and 0 < damage then
      damage = damage * (1 + TwlMonsterDam)
    elseif GetSelfID ~= 0 and GetNpcID ~= 0 and targetUser:HasBuffID(151028) == false and targetUser:HasBuffID(160000) == true and 0 < damage then
      damage = damage * (1 + TwlMonsterDam / 3)
    elseif GetSelfID ~= 0 and GetNpcID ~= 0 and targetUser:HasBuffID(151028) == false and targetUser:HasBuffID(160000) == false and 0 < damage then
      damage = damage * (1 + TwlMonsterDam)
    end
    if srcUser:HasBuffID(151028) and GetNpcID == 0 and targetUser:HasBuffID(151200) == false then
      damage = damage + 0.1 * MaxHp
    elseif not srcUser:HasBuffID(151028) or GetNpcID ~= 0 or targetUser:HasBuffID(151200) then
    end
    if targetUser:HasBuffID(151028) then
      if srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage then
        return 0, CommonFun.DamageType.Miss
      elseif srcUser:IsAttackSkill(params.skillIDAndLevel) == false and damage < 0 then
        return 0, CommonFun.DamageType.None
      else
        damage = math.min(damage, MaxHp * 0.003) + CarRealDam * (1 + CarRealDamPer)
      end
    end
    local Master = srcUser:GetMasterUser()
    if targetUser:HasBuffID(151028) and srcUser:HasBuffID(151231) == false and (GetSelfID == 0 or Master ~= nil) and srcUser:HasBuffID(151200) == false then
      damage = 0
    elseif not targetUser:HasBuffID(151028) or srcUser:HasBuffID(151200) then
    end
  end
  local FinalDam = CommonFun.calcFinalDam(srcUser, targetUser, params, logger)
  local MonsterFinalDam = CommonFun.calcMonsterFinalDam(srcUser, targetUser, params, logger)
  if 0 < damage then
    local ResultDamInc = srcUser:GetProperty("ResultDamInc")
    local ResultDamRes = targetUser:GetProperty("ResultDamRes")
    local BossRealDam = srcUser:GetProperty("BossRealDam")
    local BossRealReduc = targetUser:GetProperty("BossRealReduc")
    if targetUser.boss == false then
      BossRealDam = 0
    end
    local Result = 1 + ResultDamInc - ResultDamRes
    Result = math.max(Result, 0.1)
    local BossResult = 1 + BossRealDam - BossRealReduc
    BossResult = math.max(BossResult, 0.01)
    damage = damage * FinalDam * MonsterFinalDam * Result * BossResult
  end
  if 0 < damage and (GetNpcID == 81000 or GetNpcID == 81001 or GetNpcID == 81002 or GetNpcID == 81003 or GetNpcID == 81004 or GetNpcID == 81005) then
    damage = CommonFun.calcATMDam(srcUser, targetUser, params, logger)
    return damage, damageType
  end
  if 0 < damage and (GetNpcID == 250300 or GetNpcID == 250310 or GetNpcID == 250330 or GetNpcID == 260300 or GetNpcID == 260310 or GetNpcID == 260330 or GetNpcID == 270300 or GetNpcID == 270310 or GetNpcID == 270330) then
    damage = damage * CommonFun.calcBOSSFinalDam(srcUser, targetUser, params, logger)
  end
  if targetUser:HasBuffID(159530) and 0 < damage then
    local Limit_Dam = targetUser:GetProperty("MaxHp")
    if damage < Limit_Dam * 0.02 then
      damage = 0
    end
  end
  if 0 < damage and GetNpcID == 280711 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 476 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280708 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 480 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280709 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 188 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280710 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1111 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280734 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1104 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280720 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2035 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280721 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2020 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280745 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2041 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280722 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2019 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280746 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2045 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280459 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2045 or skillID == 2019 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280735 or GetNpcID == 280732 or GetNpcID == 280733) then
    local college = 0.01
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280717 or GetNpcID == 280741) then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 172 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280449 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 172 or skillID == 143 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280718 or GetNpcID == 280742) then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 143 and srcUser:HasBuffID(117320) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280705 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1423 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280729 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1433 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280830 or GetNpcID == 280706) then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1373 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280730 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1384 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280723 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1247 or skillID == 1251 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280747 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 138 or skillID == 201 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280731 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 300 and (srcUser:HasBuffID(117410) or srcUser:HasBuffID(117411)) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280707 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 300 and srcUser:HasBuffID(90200) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280700 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 360 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280724 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 360 or skillID == 1180 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280701 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1164 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280725 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1165 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280702 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if (skillID == 3209 or skillID == 79 or skillID == 74 or skillID == 107 or skillID == 1312) and (srcUser:HasBuffID(118340) or srcUser:HasBuffID(118341) or srcUser:HasBuffID(118342) or srcUser:HasBuffID(118343) or srcUser:HasBuffID(118344)) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280726 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1305 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280703 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 21 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280727 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 21 or skillID == 1261 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280425 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 13 and (srcUser:HasBuffID(80110) or srcUser:HasBuffID(80113) or srcUser:HasBuffID(117630)) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280704 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 13 and (srcUser:HasBuffID(80110) or srcUser:HasBuffID(80113)) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280728 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 13 and srcUser:HasBuffID(117630) then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280713 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 448 or skillID == 402 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280737 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1122 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280443 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1625 or skillID == 1637 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280714 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1625 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280738 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1637 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280715 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1612 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280739 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1614 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280719 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1203 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280743 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 1208 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and (GetNpcID == 280489 or GetNpcID == 280490) then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2200 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280748 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2202 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280750 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2202 or skillID == 2224 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280749 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2227 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280751 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2227 or skillID == 2207 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280755 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2323 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if 0 < damage and GetNpcID == 280756 then
    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
    local college = 0.01
    if skillID == 2323 or skillID == 2301 then
      college = 1
    end
    damage = math.floor(damage * college)
  end
  if bits2[CommonFun.AttrEffect.InGodStatus] == 1 and 0 < damage then
    return 0, CommonFun.DamageType.Miss
  end
  if GetSelfID == 0 and (GetNpcID == 301200 or GetNpcID == 301201 or GetNpcID == 301202 or GetNpcID == 301203 or GetNpcID == 301204 or GetNpcID == 301205 or GetNpcID == 301206) then
    return 0, CommonFun.DamageType.Miss
  end
  if targetUser:HasBuffID(32290) and 0 < damage and targetUser:HasBuffID(135251) == false then
    local mapid, maptype = srcUser:GetMapInfo()
    local pvpRatio = 5
    if maptype == 2 or maptype == 4 then
      pvpRatio = 20
    end
    local Sp = targetUser:GetProperty("Sp")
    if Sp > damage / pvpRatio then
      damage = damage / pvpRatio
      return damage, CommonFun.DamageType.Normal_Sp
    elseif 0 < Sp and Sp < damage / pvpRatio then
      damage = damage - Sp * pvpRatio
      local Hp = targetUser:GetProperty("Hp")
      if damage >= Hp then
        return damage, damageType
      end
      if srcUser.isServerCall then
        srcUser:AddBuff(32291, targetUser:GetGuid())
      end
    end
  end
  if srcUser:HasBuffID(154690) and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage then
    local skilllv_luk = srcUser:GetBoKiSkillLv(4520)
    local skilllv_lukdam = srcUser:GetBoKiSkillLv(4521)
    local Rate = skilllv_luk * 3
    if CommonFun.IsInRate(Rate, srcUser:GetRandom()) then
      damage = damage * (1.3 + skilllv_lukdam * 0.03)
      damageType = CommonFun.DamageType.Crit
      local skilllv_lukzs = srcUser:GetBoKiSkillLv(4522)
      if 0 < skilllv_lukzs and srcUser.isServerCall then
        srcUser:AddBuff(154340, targetUser:GetGuid())
      end
    end
  end
  local TaichiSecretLandGemLv = targetUser:GetSecretLandGemLv(384009)
  if TaichiSecretLandGemLv ~= 0 and 0 < damage then
    local reduceRatio = TaichiSecretLandGemLv * 0.002 + math.max(TaichiSecretLandGemLv - 30, 0) * 0.001 + math.max(TaichiSecretLandGemLv - 60, 0) * 0.002
    local loseValue = damage * reduceRatio
    damage = damage - loseValue
    if srcUser.isServerCall then
      targetUser:ChangeHpDuringTime(-loseValue, 3, srcUser:GetGuid())
    end
  end
  local skilllv_1 = skillParams.id
  if (srcUser:HasBuffID(35600) or srcUser:HasBuffID(43230) or srcUser:HasBuffID(55170) or srcUser:HasBuffID(66730) or srcUser:HasBuffID(55890) or srcUser:HasBuffID(70450) or srcUser:HasBuffID(56700) or srcUser:HasBuffID(56730) or srcUser:HasBuffID(55710) or srcUser:HasBuffID(73550) or srcUser:HasBuffID(57700) or srcUser:HasBuffID(57170) or srcUser:HasBuffID(23200) or srcUser:HasBuffLayer(23200, EBUFFERLAYER_SHADOW) or srcUser:HasBuffID(602110) or srcUser:HasBuffID(602120) or srcUser:HasBuffID(602130) or srcUser:HasBuffID(602140) or srcUser:HasBuffID(602150) or srcUser:HasBuffID(59510) or srcUser:HasBuffID(602610) or srcUser:HasBuffID(602620) or srcUser:HasBuffID(602630) or srcUser:HasBuffID(602640) or srcUser:HasBuffID(602650) or srcUser:HasBuffID(602910) or srcUser:HasBuffID(602920) or srcUser:HasBuffID(602930) or srcUser:HasBuffID(602940) or srcUser:HasBuffID(602950)) and 0 < damage then
    local Luk = srcUser:GetProperty("Luk")
    local CriDamNum = 1.5 + math.floor(Luk / 6) / 100
    if srcUser:HasBuffID(81002780) then
      CriDamNum = CriDamNum + math.floor(Luk / 6) / 1000
    end
    local CriDamPer = srcUser:GetProperty("CriDamPer")
    if srcUser:HasBuffID(81005110) then
      CriDamNum = CriDamNum + math.floor(CriDamPer * 100 / 20) / 100
    end
    local Ring1 = srcUser:GetEquipedID(5)
    local RefineLv1 = srcUser:GetEquipedRefineLv(5)
    local Ring2 = srcUser:GetEquipedID(6)
    local RefineLv2 = srcUser:GetEquipedRefineLv(6)
    local RefineLv7 = srcUser:GetEquipedRefineLv(7)
    local CriNum1 = 0
    if srcUser:HasBuffID(35600) then
      CriNum1 = 20
    end
    local a = 0
    local b = 0
    if (Ring1 == 44076 or Ring1 == 144076) and RefineLv1 < 8 then
      a = 3
    elseif (Ring1 == 44076 or Ring1 == 144076) and 8 <= RefineLv1 and RefineLv1 < 12 then
      a = 6
    elseif (Ring1 == 44076 or Ring1 == 144076) and RefineLv1 >= 12 then
      a = 10
    end
    if (Ring2 == 44076 or Ring2 == 144076) and RefineLv2 < 8 then
      b = 3
    elseif (Ring2 == 44076 or Ring2 == 144076) and 8 <= RefineLv2 and RefineLv2 < 12 then
      b = 6
    elseif (Ring2 == 44076 or Ring2 == 144076) and RefineLv2 >= 12 then
      b = 10
    end
    local aa = 0
    local bb = 0
    local equipRing5 = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_EQUIP, CommonFun.EquipPos.EEQUIPPOS_ACCESSORY1)
    if equipRing5.id == 44166 or equipRing5.id == 144166 then
      if 0 <= equipRing5.refinelv and 8 > equipRing5.refinelv then
        aa = 3
      elseif 8 <= equipRing5.refinelv and equipRing5.refinelv < 12 then
        aa = 6
      elseif equipRing5.refinelv >= 12 then
        aa = 10
      end
    end
    local equipRingSD5 = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_SHADOWEQUIP, CommonFun.EquipPos.EEQUIPPOS_ACCESSORY1)
    if equipRingSD5.id == 44166 or equipRingSD5.id == 144166 then
      if 0 <= equipRingSD5.refinelv and 8 > equipRingSD5.refinelv then
        aa = 3 * equipRingSD5.quench_per / 100
      elseif 8 <= equipRingSD5.refinelv and equipRingSD5.refinelv < 12 then
        aa = 6 * equipRingSD5.quench_per / 100
      elseif equipRingSD5.refinelv >= 12 then
        aa = 10 * equipRingSD5.quench_per / 100
      end
    end
    local equipRing6 = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_EQUIP, CommonFun.EquipPos.EEQUIPPOS_ACCESSORY2)
    if equipRing6.id == 44166 or equipRing6.id == 144166 then
      if 0 <= equipRing6.refinelv and 8 > equipRing6.refinelv then
        bb = 3
      elseif 8 <= equipRing6.refinelv and equipRing6.refinelv < 12 then
        bb = 6
      elseif equipRing6.refinelv >= 12 then
        bb = 10
      end
    end
    local equipRingSD6 = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_SHADOWEQUIP, CommonFun.EquipPos.EEQUIPPOS_ACCESSORY2)
    if equipRingSD6.id == 44166 or equipRingSD6.id == 144166 then
      if 0 <= equipRingSD6.refinelv and 8 > equipRingSD6.refinelv then
        bb = 3 * equipRingSD6.quench_per / 100
      elseif 8 <= equipRingSD6.refinelv and equipRingSD6.refinelv < 12 then
        bb = 6 * equipRingSD6.quench_per / 100
      elseif equipRingSD6.refinelv >= 12 then
        bb = 10 * equipRingSD6.quench_per / 100
      end
    end
    local CriNum2 = a + b + aa + bb
    local CardBK = srcUser:GetEquipCardNum(7, 20189)
    local CardBK1 = srcUser:GetEquipCardNum(7, 24113)
    local CardKL = srcUser:GetEquipCardNum(7, 23256)
    local CardConjuror = srcUser:GetEquipCardNum(2, 23252)
    local CardCamorra = srcUser:GetEquipCardNum(7, 23334)
    local Card23334 = 0
    if 1 <= CardCamorra then
      Card23334 = srcUser:GetBuffLayer(602910) * 1 + srcUser:GetBuffLayer(602920) * 2 + srcUser:GetBuffLayer(602930) * 3 + srcUser:GetBuffLayer(602940) * 4 + srcUser:GetBuffLayer(602950) * 5
    end
    local CardBE = srcUser:GetEquipCardNum(8, 23455)
    local Card23455 = 0
    if 1 <= CardBE then
      Card23455 = srcUser:GetBuffLayer(602610) * 1 + srcUser:GetBuffLayer(602620) * 2 + srcUser:GetBuffLayer(602630) * 3 + srcUser:GetBuffLayer(602640) * 4 + srcUser:GetBuffLayer(602650) * 5
    end
    local CriNum3 = CardBK * 15 + CardBK1 * 17.5 + CardKL * 10 + CardConjuror * 10 + CardCamorra * (5 + RefineLv7) + CardBE * 10 + Card23455 + Card23334
    local CardNumH1 = srcUser:GetEquipCardNum(5, 23064)
    local CardNumH2 = srcUser:GetEquipCardNum(6, 23064)
    local Card23064 = 0
    if 1 <= CardNumH1 + CardNumH2 then
      Card23064 = srcUser:GetBuffLayer(602110) * 1 + srcUser:GetBuffLayer(602120) * 2 + srcUser:GetBuffLayer(602130) * 3 + srcUser:GetBuffLayer(602140) * 4 + srcUser:GetBuffLayer(602150) * 5
    end
    local CardNumB1 = srcUser:GetEquipCardNum(5, 23324)
    local CardNumB2 = srcUser:GetEquipCardNum(6, 23324)
    local CriNum5 = CardNumH1 * 10 + CardNumH2 * 10 + Card23064 + CardNumB1 * 8 + CardNumB2 * 8
    local CriNum4 = 0
    local RefineLv3 = srcUser:GetEquipedRefineLv(11)
    if srcUser:HasBuffID(66730) and 6 <= RefineLv3 then
      CriNum4 = 20
    elseif srcUser:HasBuffID(66730) and RefineLv3 < 6 then
      CriNum4 = 10
    end
    local CriNum6 = 0
    local RefineLv10 = srcUser:GetEquipedRefineLv(10)
    if srcUser:HasBuffID(70450) then
      CriNum6 = 5 + RefineLv10 * 1
    end
    local CriNum7 = 0
    local RefineLv8 = srcUser:GetEquipedRefineLv(8)
    if srcUser:HasBuffID(73550) then
      CriNum7 = 10 + RefineLv8 * 1
    end
    local CriNum = CriNum1 + CriNum2 + CriNum3 + CriNum4 + CriNum5 + CriNum6 + CriNum7
    if CommonFun.RollType.Magic == skillParams.RollType and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage and CommonFun.IsInRate(CriNum, srcUser:GetRandom()) and (mapid == 7200 or mapid == 7204 or mapid == 7505 or mapid == 7510 or mapid == 7515 or mapid == 7520 or mapid == 154 or srcUser:InDamReduceRaid() == true and srcUser:IsUserCamp() == true) then
      return math.min(damage * CriDamNum), CommonFun.DamageType.Crit
    elseif CommonFun.RollType.Magic == skillParams.RollType and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage and CommonFun.IsInRate(CriNum, srcUser:GetRandom()) then
      return math.min(damage * CriDamNum, 2147483647), CommonFun.DamageType.Crit
    end
  end
  damage = math.floor(damage)
  local count = params.hitedCount
  local index = params.hitedIndex
  if skillParams.Logic_Param.spotter ~= nil and index ~= 1 then
    local spotter = srcUser:GetSpotter(params.skillIDAndLevel) + skillParams.Logic_Param.spotter
    return math.min(damage * spotter, 2147483647), damageType
  end
  if skillID == 252 and count == 1 and srcUser:HasBuffID(20410160) then
    local spotter = srcUser:GetSpotter(params.skillIDAndLevel) + skillParams.Logic_Param.spotter
    return math.min(damage * (1 + spotter * 0.3 * 2), 2147483647), damageType
  end
  if skillID == 253 and index == 1 then
    return 0, 0
  end
  local mapid, maptype = srcUser:GetMapInfo()
  if damage >= 2147483647 and (mapid == 7200 or mapid == 7204 or mapid == 7505 or mapid == 7510 or mapid == 7515 or mapid == 7520 or mapid == 154 or srcUser:InDamReduceRaid() == true and srcUser:IsUserCamp() == true) then
  elseif damage >= 2147483647 then
    damage = 2147483647
  end
  if skillParams.Logic == "SkillLockedTarget" and skillParams.Logic_Param.range == nil and srcUser:HasBuffID(311000) then
    local rate1 = srcUser:GetBuffLayer(311010)
    local rate2 = srcUser:GetBuffLayer(311200) * 10
    local rate = rate1
    if rate1 == 10 then
      rate = rate1 + rate2
    end
    local baoshang = 2
    if rate1 == 10 then
      baoshang = srcUser:GetBuffLayer(311100) * 0.2 + 2
    end
    if CommonFun.IsInRate(rate, srcUser:GetRandom()) then
      damage = damage * baoshang
      damageType = CommonFun.DamageType.Crit
      if srcUser:HasBuffID(311300) and srcUser.isServerCall then
        srcUser:AddBuff(311301, srcUser:GetGuid())
      end
      if srcUser:HasBuffID(311400) and srcUser.isServerCall then
        srcUser:AddBuff(311401, targetUser:GetGuid())
      end
    end
  end
  return damage, damageType
end

Version History

Loading dependencies...
Loading usage...