Formula Source
function CommonFun.DoCalcDamage(srcUser, targetUser, params, logger) local damage = 0 local damageType 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 MaxHp = targetUser:GetProperty("MaxHp") local BaseLv = targetUser.BaseLv local BaseLv1 = srcUser.BaseLv local TransformID = srcUser:GetProperty("TransformID") local MRefine = srcUser:GetProperty("MRefine") local skillParams = Table_Skill[params.skillIDAndLevel] local damageParamList = skillParams.Damage for i = 1, #damageParamList do local damageParam = damageParamList[i] local func = CommonFun.CalcDamageFuncs[damageParam.type] if nil ~= func then local partDamage, partDamageType = func(srcUser, targetUser, params, damageParam, logger) local elementDam = CommonFun.DoCalcElementDam(srcUser, targetUser, params, damageParam) local stateDam = CommonFun.DoCalcStateEffectDam(srcUser, targetUser) local srcAtkElement = CommonFun.GetUserAtkAttr(srcUser, params, damageParam) if (targetUser:HasBuffID(116813) or targetUser:HasBuffID(116817) or targetUser:HasBuffID(186150) or targetUser:HasBuffID(156111) or targetUser:HasBuffID(135271) or targetUser:HasBuffID(232130) or targetUser:HasBuffID(116810) and targetUser.boss == false and targetUser.mini == false) and 0 < partDamage then local Numjianyu = srcUser:GetRunePoint(223021) local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel) local GemValue = srcUser:GetGemValue(21161) if skillID == 1915 or skillID == 1908 or skillID == 1941 then if 1 <= Numjianyu and targetUser:HasBuffID(116810) then partDamage = partDamage * Numjianyu * 0.2 else partDamage = 0 partDamageType = CommonFun.DamageType.WeaponBlock end elseif skillID == 1164 then if targetUser:HasBuffID(116810) and srcUser:HasBuffID(22000010) then elseif 0 < GemValue and srcAtkElement == 8 then elseif srcUser:HasBuffID(1000031) and srcAtkElement == 8 then elseif 0 < GemValue and srcAtkElement ~= 8 then partDamage = 0 else partDamage = 0 partDamageType = CommonFun.DamageType.WeaponBlock end elseif srcAtkElement ~= 8 then partDamage = 0 partDamageType = CommonFun.DamageType.WeaponBlock end end if (srcAtkElement == 5 or srcAtkElement == 6 or srcAtkElement == 8) and targetUser:HasBuffID(154910) then partDamage = 0 end if srcAtkElement == 3 and targetUser:HasBuffID(154920) then partDamage = 0 end if srcAtkElement == 4 and (targetUser:HasBuffID(154920) or targetUser:HasBuffID(10570)) then partDamage = 0 end if (srcAtkElement == 1 or srcAtkElement == 2) and targetUser:HasBuffID(154930) then partDamage = 0 end if (srcAtkElement == 7 or srcAtkElement == 9) and targetUser:HasBuffID(154940) then partDamage = 0 end if srcAtkElement == 10 and (targetUser:HasBuffID(154940) or targetUser:HasBuffID(10580)) then partDamage = 0 end if srcAtkElement == 1 and targetUser:HasBuffID(49160) then partDamage = partDamage * 0.4 end if srcAtkElement == 2 and targetUser:HasBuffID(49170) then partDamage = partDamage * 0.4 end if srcAtkElement == 3 and targetUser:HasBuffID(49180) then partDamage = partDamage * 0.4 end if srcAtkElement == 4 and targetUser:HasBuffID(49190) then partDamage = partDamage * 0.4 end if srcAtkElement == 6 and targetUser:HasBuffID(49270) then partDamage = partDamage * 0.4 end if srcAtkElement == 7 and targetUser:HasBuffID(49280) then partDamage = partDamage * 0.4 end if srcAtkElement == 8 and targetUser:HasBuffID(49290) then partDamage = partDamage * 0.4 end if srcAtkElement == 10 and targetUser:HasBuffID(49300) then partDamage = partDamage * 0.4 end if srcAtkElement == 5 and targetUser:HasBuffID(49310) then partDamage = partDamage * 0.4 end if (srcAtkElement == 3 or srcAtkElement == 4) and targetUser:HasBuffID(159570) then partDamage = partDamage * 0.8 end if (srcAtkElement == 2 or srcAtkElement == 4) and targetUser:HasBuffID(159571) then partDamage = partDamage * 0.8 end if (srcAtkElement == 1 or srcAtkElement == 2) and targetUser:HasBuffID(159572) then partDamage = partDamage * 0.8 end if (srcAtkElement == 1 or srcAtkElement == 3) and targetUser:HasBuffID(159573) then partDamage = partDamage * 0.8 end if srcAtkElement ~= 8 and targetUser:HasBuffID(159574) then partDamage = partDamage * 0.8 end if srcAtkElement == 6 and targetUser:HasBuffID(159575) then partDamage = partDamage * 0.8 end if srcUser:HasBuffID(178100) and targetUser:HasBuffID(177930) then local fuhua = targetUser:GetBuffLayer(177930) partDamage = partDamage * (1 + math.min(fuhua * 0.2, 0.6)) end partDamage = partDamage * elementDam * stateDam damage = damage + partDamage if nil ~= partDamageType then damageType = partDamageType end else logger.error(string.format("CommonFun.CalcDamageFuncs[%s] is nil", tostring(damageParam.type))) end end damage = math.floor(damage) if 0 < damage and targetUser:GetNpcID() == 30043 then local damageParam = damageParamList[1] if damageParam ~= nil and damageParam.type ~= 8002 then return 1, CommonFun.DamageType.Normal end end if 0 < damage and (targetUser:GetNpcID() == 56008 or targetUser:GetNpcID() == 56009 or targetUser:GetNpcID() == 56010 or targetUser:GetNpcID() == 56011 or targetUser:GetNpcID() == 56012 or targetUser:GetNpcID() == 56013) then local damageParam = damageParamList[1] if damageParam ~= nil and damageParam.type ~= 8020 and damageParam.type ~= 8021 then return 1, CommonFun.DamageType.Normal end end if 0 < damage and (targetUser:GetNpcID() == 56107 or targetUser:GetNpcID() == 56108 or targetUser:GetNpcID() == 56109) then local damageParam = damageParamList[1] if damageParam ~= nil and damageParam.type ~= 8010 and damageParam.type ~= 8011 then return 1, CommonFun.DamageType.Normal end end if targetUser:HasBuffID(155031) then local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel) if skillID == 79338 then return 0, CommonFun.DamageType.Miss end end if srcUser:GetNpcID() == 300102 or srcUser:GetNpcID() == 301300 or srcUser:GetNpcID() == 301301 or srcUser:GetNpcID() == 301302 or srcUser:GetNpcID() == 301303 then local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel) if skillID == 79342 then local targetid = targetUser:GetGuid() local distance = srcUser:GetDistance(targetid) if distance <= 7 then return 0, CommonFun.DamageType.None end end end if srcUser.boss and targetUser.boss == false then local mapid, maptype = srcUser:GetMapInfo() if maptype == 5 then return math.floor(damage * (1 + RealDamage)), damageType elseif srcUser:GetNpcID() == 291100 or srcUser:GetNpcID() == 291200 or srcUser:GetNpcID() == 291300 or srcUser:GetNpcID() == 292100 or srcUser:GetNpcID() == 292200 or srcUser:GetNpcID() == 292300 or srcUser:GetNpcID() == 293100 or srcUser:GetNpcID() == 293200 or srcUser:GetNpcID() == 293300 then return math.floor(damage * (1 + RealDamage)), damageType elseif srcUser:GetNpcID() == 294104 or srcUser:GetNpcID() == 294105 or srcUser:GetNpcID() == 294204 or srcUser:GetNpcID() == 294205 or srcUser:GetNpcID() == 294304 or srcUser:GetNpcID() == 294305 or srcUser:GetNpcID() == 295107 or srcUser:GetNpcID() == 295207 or srcUser:GetNpcID() == 295307 then return math.floor(damage * (1 + RealDamage)) + math.floor(MaxHp * math.random(1, 5) / 300) * (1 + (BaseLv1 - BaseLv) / 200), damageType elseif BaseLv <= BaseLv1 and 70 <= BaseLv1 then return math.floor(damage * (1 + RealDamage)) + math.floor(BaseLv1 * math.random(10, 25) + MRefine * 5 + MaxHp * math.random(1, 5) / 100) * (1 + (BaseLv1 - BaseLv) / 200), damageType else return math.floor(damage * (1 + RealDamage)) + math.floor(BaseLv1 * math.random(10, 25) + MRefine * 5 + MaxHp * math.random(1, 5) / 100) * (1 - (BaseLv - BaseLv1) / 200), damageType end end if targetUser.boss and srcUser:GetNpcID() == 0 and BaseLv >= BaseLv1 then return math.floor(damage * (1 + RealDamage)) * (1 - (BaseLv - BaseLv1) / 200), damageType end if TransformID ~= 0 then local AttrEffect = srcUser:GetProperty("AttrEffect2") local bits = CommonFun.getBits(AttrEffect) local temp = false if bits[CommonFun.AttrEffect2.BoliBianshen] == 1 or bits[CommonFun.AttrEffect2.GonghuiBianshen] == 1 then temp = true end if bits[CommonFun.AttrEffect2.BCatBianshen] == 1 and targetUser:GetNpcID() == 30043 then temp = true end if 240000 <= TransformID and TransformID <= 240050 then temp = true end if bits[CommonFun.AttrEffect2.UltraMan] == 1 and (targetUser:GetNpcID() == 56008 or targetUser:GetNpcID() == 56009 or targetUser:GetNpcID() == 56010 or targetUser:GetNpcID() == 56011 or targetUser:GetNpcID() == 56012 or targetUser:GetNpcID() == 56013) then temp = true end if bits[CommonFun.AttrEffect2.UltraMan] == 1 and (targetUser:GetNpcID() == 56107 or targetUser:GetNpcID() == 56108 or targetUser:GetNpcID() == 56109) then temp = true end if TransformID == 62052 or TransformID == 62143 or TransformID == 62142 then temp = true end if TransformID == 56634 or TransformID == 56635 then temp = true end if TransformID == 455003 or TransformID == 455004 or TransformID == 455005 or TransformID == 280118 or TransformID == 280119 or TransformID == 280120 then temp = true end if 80089 <= TransformID and TransformID <= 80094 then temp = true end if temp == false then return 6 end end local index = params.hitedIndex if 100 <= index and math.floor(params.skillIDAndLevel / 1000) == 144 then local Buff1 = srcUser:HasBuffID(45000130) local Num0 = srcUser:GetRunePoint(52001) local Num1 = srcUser:GetRunePoint(52040) local Num2 = srcUser:GetRunePoint(52041) local Num3 = srcUser:GetRunePoint(52042) local Num4 = srcUser:GetRunePoint(52003) local RuneDamage = (Num0 + Num1 + Num2 + Num3) * 0.1 + Num4 * 0.03 local BuffRate = 0 if Buff1 == true then BuffRate = RuneDamage end return damage * BuffRate, damageType end if damage < 0 then RealDamage = 0 end if index ~= 1 and (math.floor(params.skillIDAndLevel / 1000) == 74 or math.floor(params.skillIDAndLevel / 1000) == 79 or math.floor(params.skillIDAndLevel / 1000) == 107 or math.floor(params.skillIDAndLevel / 1000) == 1902) then local Num1 = srcUser:GetRunePoint(22070) local Num2 = srcUser:GetRunePoint(22033) local Num3 = srcUser:GetRunePoint(22080) local Num4 = srcUser:GetRunePoint(223008) local Num5 = srcUser:GetRunePoint(223012) local RuneDamage = (Num1 + Num2 + Num4) * 0.02 + (Num3 + Num5) * 0.05 return math.floor(damage * RuneDamage * (1 + RealDamage)), damageType end return math.floor(damage * (1 + RealDamage)), damageType end
No formula links
Changes: 20251127_update vs 20251105_standard_instalation
function CommonFun.DoCalcDamage(srcUser, targetUser, params, logger) local damage = 0 local damageType 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 MaxHp = targetUser:GetProperty("MaxHp") local BaseLv = targetUser.BaseLv local BaseLv1 = srcUser.BaseLv local TransformID = srcUser:GetProperty("TransformID") local MRefine = srcUser:GetProperty("MRefine") local skillParams = Table_Skill[params.skillIDAndLevel] local damageParamList = skillParams.Damage for i = 1, #damageParamList do local damageParam = damageParamList[i] local func = CommonFun.CalcDamageFuncs[damageParam.type] if nil ~= func then local partDamage, partDamageType = func(srcUser, targetUser, params, damageParam, logger) local elementDam = CommonFun.DoCalcElementDam(srcUser, targetUser, params, damageParam) local stateDam = CommonFun.DoCalcStateEffectDam(srcUser, targetUser) local srcAtkElement = CommonFun.GetUserAtkAttr(srcUser, params, damageParam) if (targetUser:HasBuffID(116813) or targetUser:HasBuffID(116817) or targetUser:HasBuffID(186150) or targetUser:HasBuffID(156111) or targetUser:HasBuffID(135271) or targetUser:HasBuffID(232130) or targetUser:HasBuffID(116810) and targetUser.boss == false and targetUser.mini == false) and 0 < partDamage then local Numjianyu = srcUser:GetRunePoint(223021) local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel) local GemValue = srcUser:GetGemValue(21161) if skillID == 1915 or skillID == 1908 or skillID == 1941 then if 1 <= Numjianyu and targetUser:HasBuffID(116810) then partDamage = partDamage * Numjianyu * 0.2 else partDamage = 0 partDamageType = CommonFun.DamageType.WeaponBlock end elseif skillID == 1164 then if targetUser:HasBuffID(116810) and srcUser:HasBuffID(22000010) then elseif 0 < GemValue and srcAtkElement == 8 then + elseif srcUser:HasBuffID(1000031) and srcAtkElement == 8 then elseif 0 < GemValue and srcAtkElement ~= 8 then partDamage = 0 else partDamage = 0 partDamageType = CommonFun.DamageType.WeaponBlock end elseif srcAtkElement ~= 8 then partDamage = 0 partDamageType = CommonFun.DamageType.WeaponBlock end end if (srcAtkElement == 5 or srcAtkElement == 6 or srcAtkElement == 8) and targetUser:HasBuffID(154910) then partDamage = 0 end if srcAtkElement == 3 and targetUser:HasBuffID(154920) then partDamage = 0 end if srcAtkElement == 4 and (targetUser:HasBuffID(154920) or targetUser:HasBuffID(10570)) then partDamage = 0 end if (srcAtkElement == 1 or srcAtkElement == 2) and targetUser:HasBuffID(154930) then partDamage = 0 end if (srcAtkElement == 7 or srcAtkElement == 9) and targetUser:HasBuffID(154940) then partDamage = 0 end if srcAtkElement == 10 and (targetUser:HasBuffID(154940) or targetUser:HasBuffID(10580)) then partDamage = 0 end if srcAtkElement == 1 and targetUser:HasBuffID(49160) then partDamage = partDamage * 0.4 end if srcAtkElement == 2 and targetUser:HasBuffID(49170) then partDamage = partDamage * 0.4 end if srcAtkElement == 3 and targetUser:HasBuffID(49180) then partDamage = partDamage * 0.4 end if srcAtkElement == 4 and targetUser:HasBuffID(49190) then partDamage = partDamage * 0.4 end if srcAtkElement == 6 and targetUser:HasBuffID(49270) then partDamage = partDamage * 0.4 end if srcAtkElement == 7 and targetUser:HasBuffID(49280) then partDamage = partDamage * 0.4 end if srcAtkElement == 8 and targetUser:HasBuffID(49290) then partDamage = partDamage * 0.4 end if srcAtkElement == 10 and targetUser:HasBuffID(49300) then partDamage = partDamage * 0.4 end if srcAtkElement == 5 and targetUser:HasBuffID(49310) then partDamage = partDamage * 0.4 end if (srcAtkElement == 3 or srcAtkElement == 4) and targetUser:HasBuffID(159570) then partDamage = partDamage * 0.8 end if (srcAtkElement == 2 or srcAtkElement == 4) and targetUser:HasBuffID(159571) then partDamage = partDamage * 0.8 end if (srcAtkElement == 1 or srcAtkElement == 2) and targetUser:HasBuffID(159572) then partDamage = partDamage * 0.8 end if (srcAtkElement == 1 or srcAtkElement == 3) and targetUser:HasBuffID(159573) then partDamage = partDamage * 0.8 end if srcAtkElement ~= 8 and targetUser:HasBuffID(159574) then partDamage = partDamage * 0.8 end if srcAtkElement == 6 and targetUser:HasBuffID(159575) then partDamage = partDamage * 0.8 end if srcUser:HasBuffID(178100) and targetUser:HasBuffID(177930) then local fuhua = targetUser:GetBuffLayer(177930) partDamage = partDamage * (1 + math.min(fuhua * 0.2, 0.6)) end partDamage = partDamage * elementDam * stateDam damage = damage + partDamage if nil ~= partDamageType then damageType = partDamageType end else logger.error(string.format("CommonFun.CalcDamageFuncs[%s] is nil", tostring(damageParam.type))) end end damage = math.floor(damage) if 0 < damage and targetUser:GetNpcID() == 30043 then local damageParam = damageParamList[1] if damageParam ~= nil and damageParam.type ~= 8002 then return 1, CommonFun.DamageType.Normal end end if 0 < damage and (targetUser:GetNpcID() == 56008 or targetUser:GetNpcID() == 56009 or targetUser:GetNpcID() == 56010 or targetUser:GetNpcID() == 56011 or targetUser:GetNpcID() == 56012 or targetUser:GetNpcID() == 56013) then local damageParam = damageParamList[1] if damageParam ~= nil and damageParam.type ~= 8020 and damageParam.type ~= 8021 then return 1, CommonFun.DamageType.Normal end end if 0 < damage and (targetUser:GetNpcID() == 56107 or targetUser:GetNpcID() == 56108 or targetUser:GetNpcID() == 56109) then local damageParam = damageParamList[1] if damageParam ~= nil and damageParam.type ~= 8010 and damageParam.type ~= 8011 then return 1, CommonFun.DamageType.Normal end end if targetUser:HasBuffID(155031) then local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel) if skillID == 79338 then return 0, CommonFun.DamageType.Miss end end if srcUser:GetNpcID() == 300102 or srcUser:GetNpcID() == 301300 or srcUser:GetNpcID() == 301301 or srcUser:GetNpcID() == 301302 or srcUser:GetNpcID() == 301303 then local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel) if skillID == 79342 then local targetid = targetUser:GetGuid() local distance = srcUser:GetDistance(targetid) if distance <= 7 then return 0, CommonFun.DamageType.None end end end if srcUser.boss and targetUser.boss == false then local mapid, maptype = srcUser:GetMapInfo() if maptype == 5 then return math.floor(damage * (1 + RealDamage)), damageType elseif srcUser:GetNpcID() == 291100 or srcUser:GetNpcID() == 291200 or srcUser:GetNpcID() == 291300 or srcUser:GetNpcID() == 292100 or srcUser:GetNpcID() == 292200 or srcUser:GetNpcID() == 292300 or srcUser:GetNpcID() == 293100 or srcUser:GetNpcID() == 293200 or srcUser:GetNpcID() == 293300 then return math.floor(damage * (1 + RealDamage)), damageType elseif srcUser:GetNpcID() == 294104 or srcUser:GetNpcID() == 294105 or srcUser:GetNpcID() == 294204 or srcUser:GetNpcID() == 294205 or srcUser:GetNpcID() == 294304 or srcUser:GetNpcID() == 294305 or srcUser:GetNpcID() == 295107 or srcUser:GetNpcID() == 295207 or srcUser:GetNpcID() == 295307 then return math.floor(damage * (1 + RealDamage)) + math.floor(MaxHp * math.random(1, 5) / 300) * (1 + (BaseLv1 - BaseLv) / 200), damageType elseif BaseLv <= BaseLv1 and 70 <= BaseLv1 then return math.floor(damage * (1 + RealDamage)) + math.floor(BaseLv1 * math.random(10, 25) + MRefine * 5 + MaxHp * math.random(1, 5) / 100) * (1 + (BaseLv1 - BaseLv) / 200), damageType else return math.floor(damage * (1 + RealDamage)) + math.floor(BaseLv1 * math.random(10, 25) + MRefine * 5 + MaxHp * math.random(1, 5) / 100) * (1 - (BaseLv - BaseLv1) / 200), damageType end end if targetUser.boss and srcUser:GetNpcID() == 0 and BaseLv >= BaseLv1 then return math.floor(damage * (1 + RealDamage)) * (1 - (BaseLv - BaseLv1) / 200), damageType end if TransformID ~= 0 then local AttrEffect = srcUser:GetProperty("AttrEffect2") local bits = CommonFun.getBits(AttrEffect) local temp = false if bits[CommonFun.AttrEffect2.BoliBianshen] == 1 or bits[CommonFun.AttrEffect2.GonghuiBianshen] == 1 then temp = true end if bits[CommonFun.AttrEffect2.BCatBianshen] == 1 and targetUser:GetNpcID() == 30043 then temp = true end if 240000 <= TransformID and TransformID <= 240050 then temp = true end if bits[CommonFun.AttrEffect2.UltraMan] == 1 and (targetUser:GetNpcID() == 56008 or targetUser:GetNpcID() == 56009 or targetUser:GetNpcID() == 56010 or targetUser:GetNpcID() == 56011 or targetUser:GetNpcID() == 56012 or targetUser:GetNpcID() == 56013) then temp = true end if bits[CommonFun.AttrEffect2.UltraMan] == 1 and (targetUser:GetNpcID() == 56107 or targetUser:GetNpcID() == 56108 or targetUser:GetNpcID() == 56109) then temp = true end if TransformID == 62052 or TransformID == 62143 or TransformID == 62142 then temp = true end if TransformID == 56634 or TransformID == 56635 then temp = true end if TransformID == 455003 or TransformID == 455004 or TransformID == 455005 or TransformID == 280118 or TransformID == 280119 or TransformID == 280120 then temp = true end if 80089 <= TransformID and TransformID <= 80094 then temp = true end if temp == false then return 6 end end local index = params.hitedIndex if 100 <= index and math.floor(params.skillIDAndLevel / 1000) == 144 then local Buff1 = srcUser:HasBuffID(45000130) local Num0 = srcUser:GetRunePoint(52001) local Num1 = srcUser:GetRunePoint(52040) local Num2 = srcUser:GetRunePoint(52041) local Num3 = srcUser:GetRunePoint(52042) local Num4 = srcUser:GetRunePoint(52003) local RuneDamage = (Num0 + Num1 + Num2 + Num3) * 0.1 + Num4 * 0.03 local BuffRate = 0 if Buff1 == true then BuffRate = RuneDamage end return damage * BuffRate, damageType end if damage < 0 then RealDamage = 0 end if index ~= 1 and (math.floor(params.skillIDAndLevel / 1000) == 74 or math.floor(params.skillIDAndLevel / 1000) == 79 or math.floor(params.skillIDAndLevel / 1000) == 107 or math.floor(params.skillIDAndLevel / 1000) == 1902) then local Num1 = srcUser:GetRunePoint(22070) local Num2 = srcUser:GetRunePoint(22033) local Num3 = srcUser:GetRunePoint(22080) local Num4 = srcUser:GetRunePoint(223008) local Num5 = srcUser:GetRunePoint(223012) local RuneDamage = (Num1 + Num2 + Num4) * 0.02 + (Num3 + Num5) * 0.05 return math.floor(damage * RuneDamage * (1 + RealDamage)), damageType end return math.floor(damage * (1 + RealDamage)), damageType end