Formula

CommonFun.CalcElementParam2

function CommonFun.CalcElementParam2(srcUser, targetUser, params, damageParam, logger)
  local elementInc = 0
  local elementRed = 0
  local srcAtkElement = CommonFun.GetUserAtkAttr(srcUser, targetUser, params, damageParam)
  local targetDefElement = targetUser:GetProperty("DefAttr")
  if srcUser:HasBuffID(20510031_REGARD_THE_ENEMY_AS_DARK_ELEMENT_:MAX_STACK_0) then
    targetDefElement = 7
  end
  if nil == srcAtkElement then
    logger.error(string.format("%s srcAtkElement is nil", srcUser.name))
    return 0
  end
  if nil == targetDefElement then
    logger.error(string.format("%s targetDefElement is nil", targetUser.name))
    return 0
  end
  if nil == CommonFun.NatureProps[targetDefElement] then
    logger.error(string.format("%s CommonFun.NatureProps[%s] is nil", srcUser.name, tostring(targetDefElement)))
    return 0
  end
  if nil == CommonFun.NatureProps[srcAtkElement] then
    logger.error(string.format("CommonFun.NatureProps[%s] is nil", tostring(srcAtkElement)))
    return 0
  end
  elementInc = srcUser:GetProperty(CommonFun.NatureProps[targetDefElement][1])
  elementRed = targetUser:GetProperty(CommonFun.NatureProps[srcAtkElement][2])
  elementAtk = srcUser:GetProperty(CommonFun.NatureProps[srcAtkElement][3])
  if nil == elementAtk then
    elementAtk = 0
  end
  local skilllv = srcUser:GetLernedSkillLevel(306_LORD_KNIGHT:ASURA_STRIKE)
  local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
  if 5 < skilllv and skillID == 306_LORD_KNIGHT:ASURA_STRIKE or skillID == 3303_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST or skillID == 819_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST then
    elementRed = math.max(elementRed - 0.06 * (skilllv - 5), 0)
  end
  if skillID == 1288_ASSASSIN:ARM_CANNON or skillID == 1812_HUNTER:FLAME_DRAGON_BLAST or skillID == 4310_CHRONOMANCER:PHOTON_CANNON then
    local GemValue = srcUser:GetGemValue(61002_ARM_CANNON_FLAME_DRAGON_BLAST_AND_PHOTON_CANNON_IGNORE_PERCENTAGE_OF_THE_ENEMY_S_CORRESPONDING_ATTRIBUTE_DMG_REDUC)
    elementRed = math.max(elementRed - GemValue / 100000, 0)
  end
  local result = 1 + elementAtk - elementRed
  local mapid, maptype = srcUser:GetMapInfo()
  if (maptype == PVP_MAPS) and targetUser:GetNpcID() ~= 40022_EMPERIUM then
    local pvpReduce = 0
    local Master = targetUser:GetMasterUser()
    if targetUser:GetNpcID() == 0 or Master ~= nil then
      pvpReduce = 0.2
    end
    local B = elementRed - elementAtk
    B = B < -1 and -1 or 1 < B and 1 or B
    B = math.floor(B * 1000) / 1000
    B = B + 0.3 * (1 - math.sin(B * 3.14 / 2)) + pvpReduce
    result = 1 - B
  end
  if result <= 0.15 then
    result = 0.15
  end
  return result
end