207207function calcs .calcFullDPS (build , mode , override , specEnv )
208208 local fullEnv , cachedPlayerDB , cachedEnemyDB , cachedMinionDB = calcs .initEnv (build , mode , override , specEnv )
209209 local usedEnv = nil
210+ local prepassState = calcs .performActorPrepass (fullEnv , { snapshotDBs = true })
211+ local skillPassPlayerDB = prepassState .cachedPlayerDB or cachedPlayerDB
212+ local skillPassEnemyDB = prepassState .cachedEnemyDB or cachedEnemyDB
213+ local skillPassMinionDB = prepassState .cachedMinionDB or cachedMinionDB
210214
211215 local fullDPS = {
212216 combinedDPS = 0 ,
@@ -238,7 +242,7 @@ function calcs.calcFullDPS(build, mode, override, specEnv)
238242 local activeSkillCount , enabled = getActiveSkillCount (activeSkill )
239243 if enabled then
240244 fullEnv .player .mainSkill = activeSkill
241- calcs .perform (fullEnv , true )
245+ calcs .performSkillPass (fullEnv , true , prepassState )
242246 usedEnv = fullEnv
243247 local output = usedEnv .player .output
244248 local minionOutput = usedEnv .minion and usedEnv .minion .output or nil
@@ -368,9 +372,9 @@ function calcs.calcFullDPS(build, mode, override, specEnv)
368372 everything = true ,
369373 }
370374 fullEnv , _ , _ , _ = calcs .initEnv (build , mode , override , {
371- cachedPlayerDB = cachedPlayerDB ,
372- cachedEnemyDB = cachedEnemyDB ,
373- cachedMinionDB = cachedMinionDB ,
375+ cachedPlayerDB = skillPassPlayerDB ,
376+ cachedEnemyDB = skillPassEnemyDB ,
377+ cachedMinionDB = skillPassMinionDB ,
374378 env = fullEnv ,
375379 accelerate = accelerationTbl ,
376380 cacheGeneration = fullEnv .cacheGeneration ,
@@ -452,16 +456,19 @@ function calcs.buildActiveSkill(env, mode, skill, targetUUID, limitedProcessingF
452456 skills = true ,
453457 everything = true ,
454458 } or nil
459+ local cachedSkillPrepassState = env .cachedSkillBuildPrepassState
455460 local fullEnv , _ , _ , _ = calcs .initEnv (env .build , mode , env .override , {
456- cachedPlayerDB = env .cachedPlayerDB ,
457- cachedEnemyDB = env .cachedEnemyDB ,
458- cachedMinionDB = env .cachedMinionDB ,
461+ cachedPlayerDB = cachedSkillPrepassState and cachedSkillPrepassState . cachedPlayerDB or env .cachedPlayerDB ,
462+ cachedEnemyDB = cachedSkillPrepassState and cachedSkillPrepassState . cachedEnemyDB or env .cachedEnemyDB ,
463+ cachedMinionDB = cachedSkillPrepassState and cachedSkillPrepassState . cachedMinionDB or env .cachedMinionDB ,
459464 env = env .cachedSkillBuildEnv ,
460465 accelerate = accelerationTbl ,
461466 cacheGeneration = env .cacheGeneration ,
462467 recursionGuards = recursionGuards ,
463468 })
464469 env .cachedSkillBuildEnv = fullEnv
470+ local prepassState = cachedSkillPrepassState or calcs .performActorPrepass (fullEnv , { snapshotDBs = true })
471+ env .cachedSkillBuildPrepassState = prepassState
465472
466473 -- env.limitedSkills contains a map of uuids that should be limited in calculation
467474 -- this is in order to prevent infinite recursion loops
@@ -478,7 +485,7 @@ function calcs.buildActiveSkill(env, mode, skill, targetUUID, limitedProcessingF
478485 if activeSkillUUID == targetUUID then
479486 fullEnv .player .mainSkill = activeSkill
480487 fullEnv .requestedSkillUUID = targetUUID
481- calcs .perform (fullEnv , true )
488+ calcs .performSkillPass (fullEnv , true , prepassState )
482489 fullEnv .requestedSkillUUID = nil
483490 recursionGuards .buildingSkills [guardKey ] = nil
484491 return true
0 commit comments