@@ -751,10 +751,6 @@ function calcs.offence(env, actor, activeSkill)
751751 end
752752 end
753753 end
754- -- Snipe doesn't grab the max stages multiplier from the gem when granted by Assailum so we add it back here
755- if skillModList :Flag (nil , " TriggeredByAssailum" ) and activeSkill .skillTypes [SkillType .Triggerable ] then
756- skillModList :NewMod (" Multiplier:SnipeStagesMax" , " BASE" , 6 , " Snipe Max Stages" , { type = " GlobalEffect" , effectType = " Buff" , unscalable = true })
757- end
758754 if skillModList :Sum (" BASE" , nil , " CritMultiplierAppliesToDegen" ) > 0 then
759755 for i , value in ipairs (skillModList :Tabulate (" BASE" , skillCfg , " CritMultiplier" )) do
760756 local mod = value .mod
@@ -1534,40 +1530,6 @@ function calcs.offence(env, actor, activeSkill)
15341530 skillModList :NewMod (" PhysicalMax" , " BASE" , m_floor (output .ManaCost * multiplier ), " Sacrificial Zeal" , ModFlag .Spell )
15351531 end
15361532
1537- -- account for Manaforged Arrows
1538- if skillData .triggeredByManaPercentSpent and skillData .triggerSource then
1539- local reqManaCostMulti = skillData .TriggerSkillManaSpentMultiRequirement
1540- local uuid = cacheSkillUUID (skillData .triggerSource )
1541- if GlobalCache .cachedData [" CACHE" ][uuid ] then
1542- local cachedTriggerData = GlobalCache .cachedData [" CACHE" ][uuid ]
1543- local manaThreshold = output .ManaCost * reqManaCostMulti
1544- local manaSpendPerSec = cachedTriggerData .ManaCost * cachedTriggerData .Speed
1545- local manaSpendTriggerRate = manaSpendPerSec / manaThreshold
1546- output .SourceTriggerRate = manaSpendTriggerRate
1547- local trigRate = m_min (manaSpendTriggerRate , skillData .triggerRate )
1548- -- Account for chance to trigger
1549- local manaforgeTriggerChance = 100.0
1550- trigRate = trigRate * manaforgeTriggerChance / 100.0
1551- if breakdown then
1552- t_insert (breakdown .SimData , s_format (" " ))
1553- t_insert (breakdown .SimData , s_format (" and" ))
1554- t_insert (breakdown .SimData , s_format (" " ))
1555- t_insert (breakdown .SimData , s_format (" (%d ^8(trigger mana cost)" , cachedTriggerData .ManaCost ))
1556- t_insert (breakdown .SimData , s_format (" x %.2f) ^8(trigger attack speed)" , cachedTriggerData .Speed ))
1557- t_insert (breakdown .SimData , s_format (" / (%d ^8(triggered skill mana cost)" , output .ManaCost ))
1558- t_insert (breakdown .SimData , s_format (" x %.2f) ^8(manaforge skill multiplier)" , reqManaCostMulti ))
1559- t_insert (breakdown .SimData , s_format (" " ))
1560- t_insert (breakdown .SimData , s_format (" Trigger Skill Mana-spending trigger rate:" ))
1561- t_insert (breakdown .SimData , s_format (" = %.2f ^8per second" , manaSpendTriggerRate ))
1562- breakdown .ServerTriggerRate = {
1563- s_format (" %.2f ^8(smaller of 'cap' and 'skill' trigger rates)" , trigRate ),
1564- }
1565- end
1566- activeSkill .skillData .triggerRate = trigRate
1567- output .ServerTriggerRate = trigRate
1568- end
1569- end
1570-
15711533 runSkillFunc (" preDamageFunc" )
15721534
15731535 -- Handle corpse and enemy explosions
@@ -1982,7 +1944,7 @@ function calcs.offence(env, actor, activeSkill)
19821944 output .Speed = output .Speed * totemActionSpeed
19831945 output .CastRate = output .Speed
19841946 end
1985- if output .Cooldown then
1947+ if output .Cooldown and not activeSkill . skillTypes [ SkillType . Channel ] then
19861948 output .Speed = m_min (output .Speed , 1 / output .Cooldown * output .Repeats )
19871949 end
19881950 if output .Cooldown and skillFlags .selfCast then
@@ -2036,9 +1998,14 @@ function calcs.offence(env, actor, activeSkill)
20361998 end
20371999 elseif skillData .hitTimeMultiplier and output .Time and not skillData .triggeredOnDeath then
20382000 output .HitTime = output .Time * skillData .hitTimeMultiplier
2039- output .HitSpeed = 1 / output .HitTime
2001+ if output .Cooldown and skillData .triggered then
2002+ output .HitSpeed = 1 / (m_max (output .HitTime , output .Cooldown ))
2003+ elseif output .Cooldown then
2004+ output .HitSpeed = 1 / (output .HitTime + output .Cooldown )
2005+ else
2006+ output .HitSpeed = 1 / output .HitTime
2007+ end
20402008 end
2041-
20422009 -- Other Misc DPS multipliers (like custom source)
20432010 skillData .dpsMultiplier = ( skillData .dpsMultiplier or 1 ) * ( 1 + skillModList :Sum (" INC" , cfg , " DPS" ) / 100 ) * skillModList :More (cfg , " DPS" )
20442011 if env .configInput .repeatMode == " FINAL" or skillModList :Flag (nil , " OnlyFinalRepeat" ) then
@@ -2056,6 +2023,7 @@ function calcs.offence(env, actor, activeSkill)
20562023 combineStat (" HitChance" , " AVERAGE" )
20572024 combineStat (" Speed" , " AVERAGE" )
20582025 combineStat (" HitSpeed" , " OR" )
2026+ combineStat (" HitTime" , " OR" )
20592027 if output .Speed == 0 then
20602028 output .Time = 0
20612029 else
@@ -2073,6 +2041,47 @@ function calcs.offence(env, actor, activeSkill)
20732041 }
20742042 end
20752043 end
2044+ if skillData .hitTimeOverride and not skillData .triggeredOnDeath then
2045+ output .HitTime = skillData .hitTimeOverride
2046+ output .HitSpeed = 1 / output .HitTime
2047+ elseif skillData .hitTimeMultiplier and output .Time and not skillData .triggeredOnDeath then
2048+ output .HitTime = output .Time * skillData .hitTimeMultiplier
2049+ if output .Cooldown and skillData .triggered then
2050+ output .HitSpeed = 1 / (m_max (output .HitTime , output .Cooldown ))
2051+ elseif output .Cooldown then
2052+ output .HitSpeed = 1 / (output .HitTime + output .Cooldown )
2053+ else
2054+ output .HitSpeed = m_min (1 / output .HitTime , data .misc .ServerTickRate )
2055+ end
2056+ end
2057+ end
2058+ if breakdown then
2059+ if skillData .hitTimeOverride and not skillData .triggeredOnDeath then
2060+ breakdown .HitSpeed = { }
2061+ t_insert (breakdown .HitSpeed , s_format (" 1 / %.2f ^8(hit time override)" , output .HitTime ))
2062+ t_insert (breakdown .HitSpeed , s_format (" = %.2f" , output .HitSpeed ))
2063+ elseif skillData .hitTimeMultiplier and output .Time and not skillData .triggeredOnDeath then
2064+ breakdown .HitTime = { }
2065+ if m_floor (skillData .hitTimeMultiplier ) ~= skillData .hitTimeMultiplier then
2066+ t_insert (breakdown .HitTime , s_format (colorCodes .CUSTOM .. " NOTE: First stage has a %.2fx channel time multiplier" , skillData .hitTimeMultiplier - m_floor (skillData .hitTimeMultiplier )))
2067+ end
2068+ if isAttack then
2069+ t_insert (breakdown .HitTime , s_format (" %.2f ^8(attack time)" , output .Time ))
2070+ else
2071+ t_insert (breakdown .HitTime , s_format (" %.2f ^8(cast time)" , output .Time ))
2072+ end
2073+ t_insert (breakdown .HitTime , s_format (" x %.2f ^8(channel time multiplier)" , skillData .hitTimeMultiplier ))
2074+ t_insert (breakdown .HitTime , s_format (" = %.2f" , output .HitTime ))
2075+ breakdown .HitSpeed = { }
2076+ if output .Cooldown and skillData .triggered then
2077+ t_insert (breakdown .HitSpeed , s_format (" 1 / min(%.2f, %.2f) ^8min(hit time, cooldown)" , output .HitTime , output .Cooldown ))
2078+ elseif output .Cooldown then
2079+ t_insert (breakdown .HitSpeed , s_format (" 1 / (%.2f + %.2f) ^8(hit time + cooldown)" , output .HitTime , output .Cooldown ))
2080+ else
2081+ t_insert (breakdown .HitSpeed , s_format (" 1 / %.2f ^8(hit time)" , output .HitTime ))
2082+ end
2083+ t_insert (breakdown .HitSpeed , s_format (" = %.2f" , output .HitSpeed ))
2084+ end
20762085 end
20772086
20782087 -- Grab quantity multiplier
0 commit comments