VantagePoint
Enemy ability tracker and predictor for dungeons. Install it, run dungeons,
and VantagePoint does the rest. No configuration needed.
VantagePoint learns enemy ability patterns as you play. After a few pulls
it shows ability timers on your target frame: countdowns for time-based
casts, HP thresholds for enrages and heals, and flags for interruptable,
reflectable, and stunnable abilities.
What You See
- Ability icons on your target with real-time countdowns that turn
red when a cast is imminent
- Dungeon browser (
/vp) to browse every NPC and ability you have
encountered, grouped by dungeon, with timing data and combat flags
- Smart predictions that distinguish time-based casts from
HP-triggered abilities automatically
- Combat interaction flags showing [K] interruptable, [R] reflectable,
[S] stunnable, all evidence-based from your own combat logs
How It Works
VantagePoint observes enemy casts through the combat log and builds
NPC profiles over multiple encounters. It tracks first-cast timers,
cooldowns, HP thresholds, and combat interactions (interrupts, stuns,
reflects). Data persists across sessions and gets more accurate over time.
Note: First-cast timers are most accurate when you are present
from the pull.
Commands
/vp opens the dungeon browser
/vp display toggles the combat ability frame
/vp help lists all commands
API for other Addons
VantagePoint exposes a read-only public API through the global
VantagePointAPI table. Other addons can query live predictions,
NPC profiles, and combat interaction flags.
Getting Started
if not VantagePointAPI then return end -- VantagePoint not loaded
Live Predictions (during combat)
local guid = UnitGUID("target")
local preds = VantagePointAPI.GetPredictions(guid)
if preds then
for spellID, pred in pairs(preds) do
-- pred.status: "EXPECTED_SOON" | "ON_COOLDOWN" | "UNKNOWN"
-- pred.timeUntil: seconds until next cast (nil for HP triggers)
-- pred.hpThreshold: HP fraction 0.0-1.0 (nil for time triggers)
-- pred.triggerType: "TIME" | "HP" | "UNKNOWN"
-- pred.confidence: 0.0-1.0 (higher = more observations)
-- pred.spellID: number
-- pred.spellName: string
end
end
NPC Profiles (persistent, works out of combat)
local npcID = tonumber(UnitGUID("target"):match("%-(%d+)%-[^%-]+$"))
local profile = VantagePointAPI.GetNpcProfile(npcID)
if profile then
for spellID, ability in pairs(profile.abilities) do
print(ability.spellName
.. " | first cast: " .. (ability.avgFirstCast or "?") .. "s"
.. " | cd: " .. (ability.knownCooldown or ability.avgCooldown or "?") .. "s"
.. " | trigger: " .. ability.triggerType)
end
end
Combat Interaction Flags
-- Can this spell be interrupted?
local kickable = VantagePointAPI.IsSpellInterruptable(npcID, spellID)
-- true = confirmed interruptable (a successful kick was observed)
-- false = confirmed NOT interruptable (kick dealt damage but cast continued)
-- nil = unknown
-- Is this NPC stunnable?
local stunnable = VantagePointAPI.IsNpcStunnable(npcID)
-- true = confirmed (a stun debuff landed successfully)
-- nil = unknown
-- Can this spell be reflected?
local reflectable = VantagePointAPI.IsSpellReflectable(npcID, spellID)
-- true = confirmed (Spell Reflection reflected this spell)
-- nil = unknown
All flags are evidence-based: VantagePoint only reports what it has seen in combat. IsSpellInterruptable is the only function that returns false. This happens when an interrupt dealt damage but the cast was not stopped, proving the spell itself is non-interruptable. Stun and reflect never return false because absence of evidence is not evidence of absence.
Additional Queries
-- Single ability profile
local ability = VantagePointAPI.GetAbilityProfile(npcID, spellID)
-- All profiles for a dungeon/raid zone (by instanceMapID)
local profiles = VantagePointAPI.GetProfilesByZone(zoneID)
-- Database stats
local npcCount = VantagePointAPI.GetProfileCount()
local abilityCount = VantagePointAPI.GetAbilityCount()
Display Suppression
If your addon provides its own ability display, you can suppress VantagePoint's built-in frame:
VantagePointAPI.consumers = VantagePointAPI.consumers or {}
VantagePointAPI.consumers["YourAddonName"] = true -- suppress
VantagePointAPI.consumers["YourAddonName"] = nil -- release
-- User can always re-enable with /vp display