Enhanced enemy detection addon for World of Warcraft 1.12.1 (Vanilla)
- Installation
- Commands & Usage
- Detection Features
- Configuration Options
- KoS System
- Troubleshooting
- Support
Spy has been fully migrated from SuperWoW to Nampower as its detection backend. SuperWoW is no longer required or supported.
- Nameplate Scanner โ Detects enemies simply standing in range without casting or moving, using Nampower's
CSimpleFrame:GetName(1)nameplate GUID API - SPELL_GO_OTHER โ Instant enemy detection on every spell cast, replaces the old
UNIT_CASTEVENT+RAW_COMBATLOGsystem - UNIT_*_GUID Events โ Proactive GUID collection via
UNIT_AURA_GUID,UNIT_FLAGS_GUID,UNIT_HEALTH_GUID,UNIT_COMBAT_GUIDโ fires once per state change per unit, extremely low CPU cost - UNIT_DIED โ Server-authoritative real death signal (not Feign Death). Immediately removes the player from all lists
- Release Spirit Detection โ
SPELL_GO_OTHERwith spell ID 8326 marks players who pressed Release, preventing false reactivation in the nearby list
The old system used UnitIsDead() which returned true for both real death and Feign Death, causing hunters to incorrectly appear as Inactive. The new system:
| Situation | Old Behavior | New Behavior |
|---|---|---|
| Hunter uses Feign Death | โ Moved to Inactive โ | โ Stays Active (hp > 0 detected) โ |
| Player dies | โ Moved to Inactive (timeout-based) | โ Immediate via GetUnitField hp=0 โ
|
| Player presses Release | โ Flickered back to Active โ | โ Stays Inactive (spell 8326 detected) โ |
| Out-of-range death | โ Stayed Active forever โ | โ hp=0 via GetUnitField โ Inactive โ
|
| Real death in range | โ Timeout cleanup (5s delay) | โ UNIT_DIED โ instant removal โ
|
RAW_COMBATLOGcompletely removed โ This event fired dozens of times per second in combat and required expensive text pattern matching on every single event. Replaced entirely bySPELL_GO_OTHERandUNIT_*_GUIDevents- HP bars now use
GetUnitFieldโ Direct memory read instead ofUnitHealth()/UnitHealthMax(), more accurate and faster - HP=0 โ Inactive transition now happens in the 0.1s HP-OnUpdate, not the 1.0s scan loop โ 10x faster visual response
- Stealth detection via
GetUnitField(guid, "aura")โ Direct aura slot scan instead of tooltip parsing
SpySuperWoW.luaโSpyNampower.lua(complete rewrite, ~1200 lines)_G.SpySWalias maintained for backwards compatibility with Spy.lua internalsNP_EnableSpellGoEvents=1CVar set automatically on initialization- Nampower version check on load (requires โฅ 3.0.0)
RawCombatLogEventremoved, replaced bySpellGoOtherLastAttackUnitCombatEventupdated to useGetUnitGUID()instead of SuperWoW's second return value fromUnitExists()
Version: 4.5.0 Release Date: March 2026 Requirements: Nampower โฅ 3.0.0 (MANDATORY), UnitXP (OPTIONAL for Distance Display)
- Inverted Player List - Players now display ABOVE the "Nearby" title bar instead of below
- Mirrored Title Texture - Uses
title-industrial2.tgafor proper visual appearance when inverted - Dynamic Resize Grips - Resize arrows reposition to top corners of player list and move with list growth
- Background Texture - Automatically adjusts height based on player count in inverted mode
- Map Jump Fix - Map no longer automatically jumps to current zone when players are detected
Without Nampower, Spy will NOT function!
- โ Without Nampower โ Spy automatically DISABLES itself on login
- โ With Nampower โ Full GUID-based detection with server-accurate death events
Official Repository: https://github.com/pepopo978/nampower
Follow the installation instructions in the Nampower repository. Nampower version 3.0.0 or higher is required.
Official Repository: https://codeberg.org/konaka/UnitXP_SP3/releases
Only needed for the distance display feature.
- World of Warcraft 1.12.1 (Vanilla)
- Nampower 3.0.0+ (MANDATORY)
- UnitXP SP3 (OPTIONAL โ for distance display)
-
Backup/Remove old Spy version:
Rename: Interface/AddOns/Spy โ Interface/AddOns/Spy_OLD -
Extract this Spy version to:
Interface/AddOns/Spy/Make sure the folder structure is:
Interface/AddOns/Spy/Spy.lua -
Launch World of Warcraft
After logging in type /spystatus to confirm Nampower is detected and scanning is active.
| Command | Description |
|---|---|
/spy |
Toggle Spy window |
/spy show |
Show Spy window |
/spy hide |
Hide Spy window |
/spy config |
Open settings |
/spy reset |
Reset window positions |
/spy clear |
Clear nearby list |
/spy stats |
Open statistics window |
/spy kos <n> |
Toggle KoS for player |
/spy ignore <n> |
Toggle ignore for player |
| Command | Description |
|---|---|
/spystatus |
Show Nampower status and detection statistics |
/spydebug |
Toggle debug mode (shows detection events in chat) |
/spyevent |
Toggle SPELL_GO_OTHER cast logger (developer tool) |
/spybuff |
Test aura scan via GetUnitField on current target |
/spypet |
Test pet detection on current target |
- Left-Click โ Target player (GUID-based, works out of range!)
- Shift + Left-Click โ Toggle KoS
- Ctrl + Left-Click โ Toggle Ignore
- Right-Click โ Open context menu
- Alt + Mouse Wheel โ Switch between lists (Nearby/Last Hour/Ignore/KoS)
- Shift-Click Clear Button โ Toggle sound on/off
- Ctrl-Click Clear Button โ Toggle Spy on/off
Scans all visible Nampower nameplate frames every 1.0 second using CSimpleFrame:GetName(1) to extract GUIDs. Catches enemies who are simply standing still without casting or triggering any events. This is the most passive and comprehensive detection source โ no action required from the enemy.
Every spell cast by a nearby enemy is intercepted in real time. Detection happens the moment a spell completes, with zero scan delay. Also handles Release Spirit (spell 8326) to prevent false reactivation after death.
Nampower fires these events once per state change per unit. Far cheaper than standard UNIT_* events which fire once per token. Used for proactive GUID collection as units appear in range:
UNIT_AURA_GUIDโ buff/debuff changesUNIT_FLAGS_GUIDโ PvP flag changesUNIT_HEALTH_GUIDโ health changesUNIT_COMBAT_GUIDโ entering/leaving combat
Two complementary methods:
Method A: SPELL_GO_OTHER (Instant) Intercepts stealth spell casts in real time. Spell IDs tracked:
- Stealth (Rogue): 1784, 1785, 1786, 1787
- Prowl (Druid): 5215, 6783, 9913
- Shadowmeld (Night Elf): 20580
- Vanish (Rogue): 1856, 1857, 11327, 11329
Method B: GetUnitField Aura Scan
Scans aura slots directly via GetUnitField(guid, "aura") for active stealth auras. Runs once per range cycle per GUID, cached to avoid redundant reads.
- โ Only tracks: Enemy players + PvP flagged + Not a ghost
- โ Feign Death hunters remain Active (hp > 0, no UNIT_DIED fired)
- โ Dead players (hp = 0) shown as Inactive immediately (0.1s response)
- โ Released players stay Inactive (spell 8326 intercepted)
- โ
Pets filtered via
UnitIsPlayer+UnitPlayerControlled+UnitClasscheck - โ Zone-based auto-disable (sanctuaries, instances)
Nameplates (1.0s) โ ScanNameplates() โ AddGUID()
SPELL_GO_OTHER โ instant detection + stealth alert + release tracking
UNIT_*_GUID events โ proactive GUID collection on state changes
Mouseover / Target โ GUID collection on interaction
UNIT_DIED โ immediate removal (real death only, not FD)
HP OnUpdate (0.1s) โ hp=0 โ Inactive, hp>0 โ Active (FD recovery)
Scan Loop (1.0s) โ iterate enemyGuids โ ReportPlayerToSpy()
Cleanup (5s) โ remove stale GUIDs
hp = GetUnitField(guid, "health")
hp == 0, no UNIT_DIED โ Feign Death or out-of-range death โ Inactive
hp == 0, UNIT_DIED fired โ Real death โ removed from all lists
hp > 0, not ghost,
not releasedGuids โ back to Active (FD hunter stood up)
SPELL_GO_OTHER spellId=8326 โ releasedGuids[guid]=true โ blocks reactivation
UNIT_DIED โ clears releasedGuids[guid]
- RAW_COMBATLOG: Removed (was firing 50โ200ร/sec in raids with full text parsing)
- UNIT_*_GUID: Fires once per state change โ negligible CPU
- SPELL_GO_OTHER: Replaces both UNIT_CASTEVENT and RAW_COMBATLOG
- GetUnitField: Direct memory read, faster than UnitHealth/UnitHealthMax
- Scan interval: 1.0s
- HP update interval: 0.1s
Check folder structure: Interface/AddOns/Spy/Spy.lua must exist. Only ONE Spy version installed.
- Verify Nampower installation (version โฅ 3.0.0 required)
- Check that Nampower DLL is in the WoW folder
- Test with other Nampower addons (pfUI, libdebuff)
- Type
/spystatusโ should show "Nampower: AVAILABLE"
- Check if enemy has their Nameplate visible (default Nampower range)
- Enable debug:
/spydebug - Test
/spybuffon a targeted enemy - Verify
NP_EnableSpellGoEventsis set to 1 (done automatically on load)
Should be fixed in 4.5.0. If still occurring, enable /spydebug and check if UNIT_DIED is incorrectly firing for FD. Report with /spystatus output.
Should be fixed in 4.5.0 via Release Spirit detection (spell 8326). Enable /spydebug to confirm SPELL_GO_OTHER is being received for the released player.
Check with /spystatus:
========== SpyNampower Status ==========
Nampower: AVAILABLE (v3.x.x)
Spy Mode: Nampower Scanning
Tracked GUIDs: 12
Enemies: 12
Statistics:
GUIDs Collected: 156
Events Processed: 2341
Scans Performed: 678
Players Detected: 23
Pets Skipped: 89
Settings:
Scan Interval: 1.0s
Cleanup Interval: 5s
Spy Status:
Enabled: true
Enabled in Zone: true
=========================================
- Immolation โ Original Spy addon creator (TBC/WotLK)
- laytya โ Vanilla 1.12.1 port and maintenance
- me0wg4ming โ SuperWoW integration and enhancements (v4.0โ4.2)
- Nampower migration โ Complete rewrite for Nampower backend (v4.5)
- Shagu โ ShaguScan inspiration for GUID-based detection system
- pepopo978 โ Nampower framework development
- Community โ Bug reports, feature suggestions, and testing
Same as original Spy addon โ free to use and modify.
- Check
/spystatusโ Verify Nampower is detected - Enable
/spydebugโ See detection events in chat - Test
/spybuffon an enemy โ Verify aura scanning works - Verify Nampower installation โ Check version โฅ 3.0.0
- GitHub Issues: https://github.com/me0wg4ming/Spy/issues
- Nampower version
- WoW client version (1.12.1)
- Output of
/spystatus - Error message (if any)
- Steps to reproduce
Version: 4.5.0 Release Date: March 2026 Compatibility: World of Warcraft 1.12.1 (Vanilla) Requirement: Nampower โฅ 3.0.0 Status: Stable & Production-Ready License: Free to use and modify