CommonFun

CommonFun.CalcShareDamage

Dataset · 20251127_update

Formula Source

function CommonFun.CalcShareDamage(srcUser, tUser, damage, damagetype)
  if Table_Buffer == nil then
    return damage, nil
  end
  local result
  local newdamage = damage
  local buffs = {
    70047011,
    115001,
    115002,
    116260,
    116261,
    116262,
    116263,
    116264,
    116265,
    116266,
    116267,
    116268,
    116269,
    181171,
    181173,
    181175,
    1004100
  }
  if buffs == nil or #buffs == 0 then
    return damage, nil
  end
  local findok = false
  local buffID, oneresult
  for i = 1, #buffs do
    buffID = buffs[i]
    local buff = Table_Buffer[buffID]
    if tUser:HasBuffID(buffID) and buff ~= nil and buff.BuffEffect ~= nil and buff.BuffEffect.shareper ~= nil then
      local shareTargetID = tUser:GetBuffFromID(buffID)
      if buff.BuffEffect.share_to_being == 1 then
        shareTargetID = tUser:GetHighHpBeingGUID()
      end
      if shareTargetID ~= 0 and (buff.BuffEffect.checkbuff == nil or CommonFunHelper.HasBuffID(shareTargetID, buff.BuffEffect.checkbuff) == true) and (buff.BuffEffect.range == nil or tUser:GetDistance(shareTargetID) <= buff.BuffEffect.range) then
        local perdam = buff.BuffEffect.shareper * damage
        local decPerdam = perdam
        local damtype = damagetype
        local Rune = CommonFunHelper.GetBuffLayer(shareTargetID, 41100060)
        local dunpai = 0
        if CommonFunHelper.HasBuffID(shareTargetID, 40490) == true then
          dunpai = 0.05
        end
        if CommonFunHelper.HasBuffID(shareTargetID, 90001803) == true then
          dunpai = 0.1
        end
        if CommonFunHelper.HasBuffID(shareTargetID, 43280) == true then
          dunpai = 0.1
        end
        if CommonFunHelper.HasBuffLayer(shareTargetID, 43280, EBUFFERLAYER_SHADOW) == true then
          local equipRingSD = srcUser:getEquip(CommonFun.PackType.EPACKTYPE_SHADOWEQUIP, CommonFun.EquipPos.EEQUIPPOS_SHIELD)
          if equipRingSD.id ~= 0 then
            dunpai = 0.1 * equipRingSD.quench_per / 100
          end
        end
        local huangjia = 0
        if CommonFunHelper.HasBuffID(shareTargetID, 91000400) == true then
          huangjia = 0.1
        end
        perdam = perdam * (1 - Rune * 0.08 - dunpai - huangjia)
        if buff.BuffEffect.autoblock == 1 then
          local bits3 = CommonFun.getBits(CommonFunHelper.GetProperty(shareTargetID, "AttrEffect2"))
          if bits3 ~= nil and bits3[CommonFun.AttrEffect2.AutoDef] == 1 then
            local skilllv_1 = 0
            if tUser.isServerCall then
              skilllv_1 = CommonFunHelper.GetLernedSkillLevel(shareTargetID, 356)
            else
              local sklvbuffeff = CommonFunHelper.GetBuffEffectByType(shareTargetID, "SkillLevel")
              if sklvbuffeff and sklvbuffeff.level then
                skilllv_1 = sklvbuffeff.level
              else
                skilllv_1 = 1
              end
            end
            local rate = skilllv_1 * 4 + 10
            if CommonFun.IsInRate(rate, srcUser:GetRandom()) then
              perdam = 0
              damtype = CommonFun.DamageType.AutoBlock
            end
          end
        end
        if buff.BuffEffect.overflow == 1 then
          local hp = CommonFunHelper.GetUserHP(shareTargetID)
          if perdam > hp then
            if decPerdam >= perdam then
              decPerdam = decPerdam - perdam + hp
            else
              decPerdam = hp
            end
            perdam = hp
          end
        end
        findok = true
        newdamage = newdamage - decPerdam
        oneresult = share_temp_result[shareTargetID]
        if oneresult == nil then
          local oneresult = {}
          oneresult.damage = perdam
          oneresult.type = damtype
          oneresult.charid = shareTargetID
          share_temp_result[shareTargetID] = oneresult
        else
          oneresult.damage = oneresult.damage + perdam
        end
      end
    end
  end
  if findok == true then
    result = {}
    for k, v in pairs(share_temp_result) do
      if v.damage ~= 0 or v.type == CommonFun.DamageType.AutoBlock then
        table.insert(result, v)
        share_temp_result[k] = nil
      end
    end
  end
  if 0 < damage and newdamage < 0 then
    newdamage = 0
  end
  if newdamage == 0 then
    damagetype = CommonFun.DamageType.None
  end
  return newdamage, result, damagetype
end
No formula links

Version History

Loading dependencies...
Loading usage...