Formula Source
function CommonFun.CalcHitRate(srcUser, targetUser, skillParams) local Hit = srcUser:GetProperty("Hit") local Flee2 = targetUser:GetProperty("Flee") local StateEffect2 = targetUser:GetProperty("StateEffect") local bits2 = CommonFun.getBits(StateEffect2) local srcAttrEffect = srcUser:GetProperty("AttrEffect3") local bits4 = CommonFun.getBits(srcAttrEffect) local isCanBlock = true if bits4[CommonFun.AttrEffect3.MustHit] == 1 and srcUser:HasBuffID(21930030) then isCanBlock = false end local targetAttrEffect = targetUser:GetProperty("AttrEffect3") local bits5 = CommonFun.getBits(targetAttrEffect) 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 local skilllv_1 = skillParams.id local Num1 = srcUser:GetRunePoint(32011) local Num2 = srcUser:GetRunePoint(32012) local RuneHit = Num1 * 0.1 + Num2 * 0.05 local Num3 = srcUser:GetRunePoint(70130) local RuneHit2 = Num3 * 0.2 local SkillHit = skillParams.SkillHit or 0 if skilllv_1 == nil then RuneHit = 0 end if math.floor(skilllv_1 / 1000) == 181 or math.floor(skilllv_1 / 1000) == 1111 then SkillHit = (skillParams.SkillHit or 0) + RuneHit end if math.floor(skilllv_1 / 1000) == 355 then SkillHit = (skillParams.SkillHit or 0) + RuneHit2 end if math.floor(skilllv_1 / 1000) == 2020 then local fbGem = srcUser:GetGemValue(163111) SkillHit = (skillParams.SkillHit or 0) + fbGem / 100000 end if math.floor(skilllv_1 / 1000) == 188 then local xlGem = srcUser:GetGemValue(31061) SkillHit = (skillParams.SkillHit or 0) + xlGem / 100000 end if math.floor(skilllv_1 / 1000) == 228 or math.floor(skilllv_1 / 1000) == 229 or math.floor(skilllv_1 / 1000) == 1478 then local Gem = srcUser:GetGemValue(143061) SkillHit = (skillParams.SkillHit or 0) + Gem / 100000 end if math.floor(skilllv_1 / 1000) == 1261 or math.floor(skilllv_1 / 1000) == 1272 or math.floor(skilllv_1 / 1000) == 1713 or math.floor(skilllv_1 / 1000) == 1727 then local DragonGem = srcUser:GetGemValue(11003) SkillHit = (skillParams.SkillHit or 0) + DragonGem / 100000 end if srcUser:isCostBattleCount() == true and targetUser:GetNpcID() == 0 then local Monsterlevel = 0 local monster_cfg = Table_Monster[srcUser:GetNpcID()] if monster_cfg ~= nil then Monsterlevel = monster_cfg.Level end local PlayerBaseLv = targetUser.BaseLv local deltalv = Monsterlevel - PlayerBaseLv if 40 < deltalv then Hit = Hit + (deltalv - 40) * 10 + 100 else if 20 < deltalv then Hit = Hit + (deltalv - 20) * 5 else end end end local rate = (Hit + 80) * (1 + SkillHit) - Flee2 if bits2[CommonFun.StateEffect.Dizzy] == 1 or bits2[CommonFun.StateEffect.Freeze] == 1 or bits2[CommonFun.StateEffect.Stone] == 1 or bits2[CommonFun.StateEffect.Sleep] == 1 then rate = 100 end if math.floor(skilllv_1 / 1000) == 319 or math.floor(skilllv_1 / 1000) == 306 or math.floor(skilllv_1 / 1000) == 310 or math.floor(skilllv_1 / 1000) == 411 or math.floor(skilllv_1 / 1000) == 422 or math.floor(skilllv_1 / 1000) == 91001 or math.floor(skilllv_1 / 1000) == 410 then rate = 100 end if math.floor(skilllv_1 / 1000) == 1284 or math.floor(skilllv_1 / 1000) == 1288 or math.floor(skilllv_1 / 1000) == 1122 or math.floor(skilllv_1 / 1000) == 3303 or math.floor(skilllv_1 / 1000) == 819 or math.floor(skilllv_1 / 1000) == 3706 or math.floor(skilllv_1 / 1000) == 1812 or math.floor(skilllv_1 / 1000) == 1835 or math.floor(skilllv_1 / 1000) == 1817 or math.floor(skilllv_1 / 1000) == 5604 then rate = 100 end if math.floor(skilllv_1 / 1000) == 2563 or math.floor(skilllv_1 / 1000) == 2572 or math.floor(skilllv_1 / 10000) == 531 or math.floor(skilllv_1 / 10000) == 532 then rate = 100 end if srcUser:HasBuffID(115090) or srcUser:HasBuffID(115091) or srcUser:HasBuffID(232170) then local Hp = srcUser:GetProperty("Hp") local MaxHp = srcUser:GetProperty("MaxHp") if Hp > MaxHp * 0.09 and (math.floor(skilllv_1 / 1000) == 372 or math.floor(skilllv_1 / 1000) == 63022) then rate = 100 end end if srcUser:HasBuffID(128091) and rate == 100 then local MustMissRate = srcUser:GetProperty("MustMissRate") rate = 100 * (1 - MustMissRate) end if srcUser:HasBuffID(133580) or srcUser:HasBuffID(133581) then local MustMissRate = srcUser:GetProperty("MustMissRate") rate = math.min(rate, 100) * (1 - MustMissRate) end if srcUser:HasBuffID(165540) then rate = 100 end if math.floor(skilllv_1 / 1000) == 6110 and srcUser:GetBuffLayer(116080) == 15 then rate = 100 end if CommonFun.RollType.Attack == skillParams.RollType and srcUser:HasBuffID(49120) or isCanBlock == false then rate = 100 end rate = CommonFun.Clamp(rate, 5, 100) if srcUser:HasBuffID(44522) or srcUser:HasBuffID(44532) then rate = 0 end return rate end
No formula links
Changes: 20251127_update vs 20251105_standard_instalation
function CommonFun.CalcHitRate(srcUser, targetUser, skillParams) local Hit = srcUser:GetProperty("Hit") local Flee2 = targetUser:GetProperty("Flee") local StateEffect2 = targetUser:GetProperty("StateEffect") local bits2 = CommonFun.getBits(StateEffect2) local srcAttrEffect = srcUser:GetProperty("AttrEffect3") local bits4 = CommonFun.getBits(srcAttrEffect) local isCanBlock = true if bits4[CommonFun.AttrEffect3.MustHit] == 1 and srcUser:HasBuffID(21930030) then isCanBlock = false end local targetAttrEffect = targetUser:GetProperty("AttrEffect3") local bits5 = CommonFun.getBits(targetAttrEffect) 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 local skilllv_1 = skillParams.id local Num1 = srcUser:GetRunePoint(32011) local Num2 = srcUser:GetRunePoint(32012) local RuneHit = Num1 * 0.1 + Num2 * 0.05 local Num3 = srcUser:GetRunePoint(70130) local RuneHit2 = Num3 * 0.2 local SkillHit = skillParams.SkillHit or 0 if skilllv_1 == nil then RuneHit = 0 end if math.floor(skilllv_1 / 1000) == 181 or math.floor(skilllv_1 / 1000) == 1111 then SkillHit = (skillParams.SkillHit or 0) + RuneHit end if math.floor(skilllv_1 / 1000) == 355 then SkillHit = (skillParams.SkillHit or 0) + RuneHit2 end if math.floor(skilllv_1 / 1000) == 2020 then local fbGem = srcUser:GetGemValue(163111) SkillHit = (skillParams.SkillHit or 0) + fbGem / 100000 end if math.floor(skilllv_1 / 1000) == 188 then local xlGem = srcUser:GetGemValue(31061) SkillHit = (skillParams.SkillHit or 0) + xlGem / 100000 end if math.floor(skilllv_1 / 1000) == 228 or math.floor(skilllv_1 / 1000) == 229 or math.floor(skilllv_1 / 1000) == 1478 then local Gem = srcUser:GetGemValue(143061) SkillHit = (skillParams.SkillHit or 0) + Gem / 100000 end if math.floor(skilllv_1 / 1000) == 1261 or math.floor(skilllv_1 / 1000) == 1272 or math.floor(skilllv_1 / 1000) == 1713 or math.floor(skilllv_1 / 1000) == 1727 then local DragonGem = srcUser:GetGemValue(11003) SkillHit = (skillParams.SkillHit or 0) + DragonGem / 100000 end if srcUser:isCostBattleCount() == true and targetUser:GetNpcID() == 0 then local Monsterlevel = 0 local monster_cfg = Table_Monster[srcUser:GetNpcID()] if monster_cfg ~= nil then Monsterlevel = monster_cfg.Level end local PlayerBaseLv = targetUser.BaseLv local deltalv = Monsterlevel - PlayerBaseLv if 40 < deltalv then Hit = Hit + (deltalv - 40) * 10 + 100 else if 20 < deltalv then Hit = Hit + (deltalv - 20) * 5 else end end end local rate = (Hit + 80) * (1 + SkillHit) - Flee2 if bits2[CommonFun.StateEffect.Dizzy] == 1 or bits2[CommonFun.StateEffect.Freeze] == 1 or bits2[CommonFun.StateEffect.Stone] == 1 or bits2[CommonFun.StateEffect.Sleep] == 1 then rate = 100 end if math.floor(skilllv_1 / 1000) == 319 or math.floor(skilllv_1 / 1000) == 306 or math.floor(skilllv_1 / 1000) == 310 or math.floor(skilllv_1 / 1000) == 411 or math.floor(skilllv_1 / 1000) == 422 or math.floor(skilllv_1 / 1000) == 91001 or math.floor(skilllv_1 / 1000) == 410 then rate = 100 end if math.floor(skilllv_1 / 1000) == 1284 or math.floor(skilllv_1 / 1000) == 1288 or math.floor(skilllv_1 / 1000) == 1122 or math.floor(skilllv_1 / 1000) == 3303 or math.floor(skilllv_1 / 1000) == 819 or math.floor(skilllv_1 / 1000) == 3706 or math.floor(skilllv_1 / 1000) == 1812 or math.floor(skilllv_1 / 1000) == 1835 or math.floor(skilllv_1 / 1000) == 1817 or math.floor(skilllv_1 / 1000) == 5604 then rate = 100 end if math.floor(skilllv_1 / 1000) == 2563 or math.floor(skilllv_1 / 1000) == 2572 or math.floor(skilllv_1 / 10000) == 531 or math.floor(skilllv_1 / 10000) == 532 then rate = 100 end if srcUser:HasBuffID(115090) or srcUser:HasBuffID(115091) or srcUser:HasBuffID(232170) then local Hp = srcUser:GetProperty("Hp") local MaxHp = srcUser:GetProperty("MaxHp") if Hp > MaxHp * 0.09 and (math.floor(skilllv_1 / 1000) == 372 or math.floor(skilllv_1 / 1000) == 63022) then rate = 100 end end if srcUser:HasBuffID(128091) and rate == 100 then local MustMissRate = srcUser:GetProperty("MustMissRate") rate = 100 * (1 - MustMissRate) end if srcUser:HasBuffID(133580) or srcUser:HasBuffID(133581) then local MustMissRate = srcUser:GetProperty("MustMissRate") rate = math.min(rate, 100) * (1 - MustMissRate) end if srcUser:HasBuffID(165540) then rate = 100 end + if math.floor(skilllv_1 / 1000) == 6110 and srcUser:GetBuffLayer(116080) == 15 then rate = 100 end if CommonFun.RollType.Attack == skillParams.RollType and srcUser:HasBuffID(49120) or isCanBlock == false then rate = 100 end rate = CommonFun.Clamp(rate, 5, 100) if srcUser:HasBuffID(44522) or srcUser:HasBuffID(44532) then rate = 0 end return rate end