Enhanced enemy detection addon for World of Warcraft 1.12.1 (Vanilla)
- Installation
- Commands & Usage
- Detection Features
- Configuration Options
- KoS System
- Troubleshooting
- Support
- 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 (SetMapToCurrentZone only runs once on initialization)
- Invert Player Positioning - Players anchor from BOTTOMLEFT of MainWindow going upward
- Grip Offset Calculation - Resize grips dynamically reposition based on
bgHeight + 2offset
Version: 4.2.0
Release Date: December 29, 2025
Requirements: SuperWoW 1.12.1+ (MANDATORY), UnitXP (OPTIONAL for Distance Display)
- Win/Loss Statistics Fix - Fixed Win/Loss tracking for deaths caused by melee attacks or stealth openers. Uses 1.0s delay + enemy cache fallback to reliably detect the killer.
- Non-PvP Enemy Skip - Enemies without PvP flag are no longer cached, drastically reducing memory in enemy cities (Orgrimmar/Stormwind with 200 players but only 10 PvP flagged)
- Dead/Ghost Player Fix - Fixed distance display "blinking" when enemy players die or release their corpse
- Ghost Detection - Added UnitIsGhost and HP=0 checks to properly filter dead/ghost players from display
- Distance Cache Fix - Distance cache is now cleared when player dies, preventing stale distance values
- Debug Mode Performance - Cached debug mode check (IsDebugMode function) reduces 100 table lookups/sec to 4/sec
- Combat Log Filter - FRIENDLY/TRADESKILLS/SELF events are now skipped entirely for better performance
- LastAttack Faction Check - LastAttack only tracks actual enemies, not friendly players
- New Debug Command - Added
/spydeadcommand to debug dead/ghost player states
- Massive Performance Fix for Large Battles - Optimized for 200+ player fights (e.g., 200 Horde vs 200 Alliance)
- Friendly Units Skip - Friendly players completely ignored (no tracking, no caching) = 50% less GUIDs tracked in faction battles
- Combat Log Throttling - Limited to 20 events/sec instead of 500+, reducing pattern matching by 95%
- Stealth Detection Optimization - Buff scanning only for stealth-capable classes (Rogue/Druid/Night Elf) = 80% fewer buff checks
- Scan Interval Increased - Changed from 0.5s to 1.0s for 50% less CPU usage during scanning
- Debug Mode Caching - Cached debug mode setting to eliminate repeated table lookups
Performance Impact: In 400-player battles (200v200), tracking reduced from 400 to 200 GUIDs, buff checks reduced by 95%, and pattern matching reduced by 95%. Should eliminate lag in massive world PvP scenarios.
- ✅ Timer Leak Fix - Fixed AceTimer leak that caused "146 live timers" warning after multiple enable/disable cycles or zone changes
- ✅ Removed Duplicate Timer - Removed redundant ManageExpirations timer in MainWindow.lua that was never cancelled
Technical Details: Previously, each call to OnEnable() (via /spy show, options toggle, or ResetMainWindow()) created a new repeating timer without cancelling the old one. This caused timer accumulation over time, especially for players frequently entering/leaving battlegrounds.
- ✅ Major Performance Fix - Fixed massive lag spikes when 80+ enemies are detected with "Sort by Range" enabled
- ✅ Distance Display Toggle - Added on/off toggle in Data Management to completely disable distance tracking for maximum performance
- ✅ Configurable Update Rate - Added slider (1-5 Hz) to control how often distance values update, allowing players to balance smoothness vs CPU usage
- ✅ Lazy Distance Caching - Distance sorting now uses pre-calculated cache instead of calling expensive UnitXP() during sort operations
- ✅ Optimized Cache System - Global distance cache updates in background for ALL detected players, eliminating sort-time calculations
Performance Impact: With 80 detected enemies, sorting by range no longer causes lag spikes. Distance display can now be toggled off entirely for extreme cases.
- ✅ Fixed shared scans missing out on specific classes or races.
- ✅ Fixed players changing their PvP state to non-pvp to still show the range update on nearby frame.
- ✅Several performance improvements for the frames.
- ✅ Data Management rework, added a slider to let the player decide after how many minutes non-detected players are removed from the nearby frame.
- ✅ Fixed shared scans from other Spy users not being shown in the "Statistics" window.:
- ✅ Different Fonts can be properly changed and applied now to the "Nearby" Window.
- ✅ Little fixup for enemy detection logics, no more players from the same faction in the list.
- ✅ Gave the Distance display a black outline.
- ✅ Announce nearby players (right clicking on the nearby player frame) will work properly now in group, raid, localdefense and guild.
-
✅ LOS Check on Range indicator/numbers:
-
🟢 Green = Line of Sight free → Player can be attacked
-
🔴 Red = Line of Sight blocked → Player can't be attacked
-
⚪ White = Out of range/not found "--" (NO GUID/No available
-
✅ Fixed Player Frames Overlapping when more then 15 Players are in range.)
- ✅ Complete Rework of Frame System - Individual persistent frames for each player instead of reusable row pool
- ✅ Live HP Bars - Real-time health percentage display with class-colored bars
- ✅ Improved Click Detection - Frames no longer hide/show on every refresh, fixing click reliability issues
- ✅ Frame Persistence - Each player maintains their own frame, eliminating visual flickering
- ✅ Sorting Stability - Uses millisecond-precision DetectionTimestamp instead of second-precision time()
- ✅ Minimum Window Width - Set to 190 pixels (matches default configuration)
- ✅ Frame Clamping - Window cannot be dragged outside screen boundaries
- ✅ Position-Only Updates - Frames only update position during sorting, not entire frame recreation
- ✅ Reduced Flickering - Frames remain visible when player stays in list, only hidden when actually removed
- ✅ Click Detection Fixed - Removed frame hide/show on every refresh that was blocking clicks
- ✅ OnClick Stability - OnClick handler set only once during frame creation, not on every refresh
- ✅ GUID Updates - PlayerGUID updated intelligently only when invalid or missing
- ✅ Frame Level Management - Proper SetFrameLevel to ensure frames are clickable above other UI elements
- ✅ PlayerFrames Table - New persistent frame storage:
Spy.MainWindow.PlayerFrames[playerName] - ✅ OnUpdate HP System - 0.2s throttled HP updates per frame (similar to ShaguScan)
- ✅ Smart Frame Hiding - Only hides frames not in current list, not all frames on every refresh
- ✅ Removed Legacy Code - Cleaned up ButtonClicked() function and /spyclick debug command
Old System (Row Pool):
- Fixed number of reusable rows
- Rows constantly reassigned to different players
- RefreshCurrentList() rebuilt entire list 15-35 times/second
- Caused visual flickering and click detection issues
New System (Persistent Frames):
- One frame per player, created once
- Frames persist until player leaves list
- Only position updates during sorting
- No flickering, reliable click detection
- ✅ Reduced Refresh Overhead - Frames only created once per player, not on every refresh
- ✅ Throttled HP Updates - 0.2s update interval prevents excessive processing
- ✅ Smart GUID Caching - GUID stored on frame, only refreshed when invalid
- ✅ Position Caching - Frame position only updated when actually changed
Version: 4.0.0
Release Date: November 5, 2025
Requirements: SuperWoW 1.12.1+ (MANDATORY), UnitXP (OPTIONAL for Distance Display)
⚠️ BREAKING CHANGE: This version completely rebuilds the frame system. If upgrading from 3.9.6, a /reload is recommended after installation.
Without SuperWoW, Spy will NOT function!
- ❌ Without SuperWoW → Spy automatically DISABLES itself on login
- ✅ With SuperWoW → Full GUID-based detection similar to ShaguScan
Official Repository: https://codeberg.org/konaka/UnitXP_SP3/releases
Official Repository: https://github.com/balakethelock/SuperWoW
Follow the installation instructions in the SuperWoW repository to set it up correctly.
Note: This Spy version is specifically designed for SuperWoW and will not work with other detection methods. For the best experience, ensure SuperWoW is properly installed before using Spy.
- World of Warcraft 1.12.1 (Vanilla)
- SuperWoW 1.12.1+ (MANDATORY) - Download here
-
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, check the chat window:
- ✅ Success:
[SpySW] SuperWoW DETECTED ✓→ Spy is fully functional - ❌ Error:
[Spy] CRITICAL ERROR: SuperWoW NOT DETECTED!→ Spy is disabled, install SuperWoW
Type /spy to open the main window.
| 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 <name> |
Toggle KoS for player |
/spy ignore <name> |
Toggle ignore for player |
| Command | Description |
|---|---|
/spystatus |
Show SuperWoW status and statistics |
/spydebug |
Toggle debug mode (shows detection events) |
/spyevent |
Toggle cast event logging (developer tool) |
/spybuff |
Test buff detection methods (developer tool) |
/spypet |
Test pet detection (developer tool) |
/spytarget |
Test targeting methods (developer tool) |
- 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 for nearby enemy players every 0.5 seconds (this is only for already detected players - new detected players will be scanned instantly)
- Works WITHOUT combat - finds idle/stealthed players
- GUID-based tracking for accuracy
Spy uses three complementary methods to detect stealthed enemies:
- How it works: Scans target's buffs using tooltip analysis
- Detects: Stealth, Prowl, Shadowmeld, Vanish
- Languages: English and German patterns supported
- Interval: Every 0.5 seconds for detected players
- Advantage: Works on any targeted enemy
- How it works: Listens for stealth spell casts in real-time
- Detects: Instant notification when stealth is activated
- Spell IDs tracked:
- Stealth (Rogue): 1784, 1785, 1786, 1787
- Prowl (Druid): 5215, 6783, 9913
- Shadowmeld (Night Elf): 20580
- Vanish (Rogue): 1856, 1857
- Advantage: Zero delay, immediate alert
- How it works: Detects stealthed players even when Spy is disabled
- Enable: Set
WarnOnStealthEvenIfDisabled = truein config - Classes filtered: Only processes Rogues, Druids, and Night Elves
- Use case: Perfect for battlegrounds/instances where you want main Spy off but still need stealth alerts
- Advantage: Minimal resource usage while maintaining stealth awareness
- ✅ Only tracks: Players + Hostile + PvP Flagged + Alive
- ✅ Ignores: Friendlies, Pets, NPCs, Same-Faction (even in duels)
- ✅ Separate caches for enemies/friendlies
- ✅ Automatic pet detection via class check + UnitPlayerControlled
- Auto-disable in sanctuaries (Booty Bay, Gadgetzan, Everlook, Ratchet, etc.)
- Battleground support (enable/disable via settings)
- PvP flag requirement option
- Taxi mode (stop alerts while on flight paths)
- Sort by: Name, Level, Class, Guild, Wins, Loses, Time
- Filter Options:
- Search by name or guild (real-time)
- Show only KoS players
- Show only players with Win/Loss records
- Show only players with KoS reasons
- Display Information:
- Player name, level, class, guild
- Win/Loss statistics
- KoS reasons
- Last seen location and time
- List indicator (shows which lists player is on)
- Shift-Click Spy button → Open/close statistics
- Enable Spy - Master on/off switch (instant, no reload!)
- Enabled in Battlegrounds - Allow detection in BGs
- Disable When PvP Unflagged - Only detect when flagged
- Disabled in Zones - Select sanctuary zones
- Show on Detection - Auto-show window when enemy detected
- Hide Spy - Auto-hide when no enemies nearby
- Stop Alerts on Taxi - Pause alerts while flying
- Window Opacity - Normal and battleground alpha
- Lock Windows - Prevent accidental moving
- Invert Spy - Flip window upside-down (title at bottom)
- Auto-Resize - Window grows/shrinks with player count
- Resize Limit - Maximum bars to display (1-15)
- Display Data - Choose what to show in bars (Name/Level/Class/Guild combinations)
- Font Selection - Choose from available fonts
- Bar Texture - Customize bar appearance
- Row Height - Adjust bar size (8-20 pixels)
- Tooltip Options - Position, content, anchor point
- Show Minimap Icon - Toggle LDB icon visibility
- Enable Sound - Master sound toggle
- Sound Channel - Choose audio channel (Master/SFX/Music/Ambience)
- Only Sound for KoS - Silence regular detections
- Stop Alerts on Taxi - No sounds while flying
- Announce To - Auto-announce to: None/Self/Party/Guild/Raid/LocalDefense
- Only Announce KoS - Limit announcements
- Display Warnings - Alert style: Default/ErrorFrame/Moveable
- Warn on Stealth - Alert for stealthed players
- Warn on Stealth (Even if Disabled) - NEW! Stealth-only mode
- Warn on KoS - Alert for KoS players
- Warn on KoS Guild - Alert if guild member is KoS
- Warn on Race - Alert for specific enemy race
- Minimap Detection - Scan minimap tooltips (legacy feature)
- Minimap Details - Show class/level in tooltips
- Remove Undetected - Auto-cleanup timer: Always/1-15 min/Never
- Purge Data - Old data cleanup: 1-90 days
- Purge KoS - Include KoS in purge
- Purge Win/Loss Data - Include combat stats in purge
- Share Data - Send detections to other Spy users
- Use Data - Receive detections from others
- Share KoS Between Characters - Sync KoS across your account
- Add to KoS:
/spy kos <name>or Shift-Click in list - Remove from KoS: Same command/click again
- Set Reason: Right-click player → KoS Reason menu
- Custom Reason: Select "Other" and type reason
- 🔴 Red border alert for KoS players
- 🟡 Yellow border for KoS guild members
- 📢 Announce KoS detections to party/raid
- 🎵 Special sound for KoS alerts
- 📝 Multiple reasons per player
- 🔄 Cross-character KoS sharing
- 📊 KoS tab in statistics window
- Add to Ignore:
/spy ignore <name>or Ctrl-Click in list - Effect: Completely blocks detection for that player
- Use Cases: Friendly enemy players, RPers, etc.
- Events: UPDATE_MOUSEOVER_UNIT, PLAYER_TARGET_CHANGED, UNIT_COMBAT, etc.
- Stores GUIDs of all players encountered
- Name-to-GUID mapping for targeting
- Interval: 0.5 seconds (configurable)
- Filter: IsPlayer + IsHostile + IsPvPFlagged + IsAlive
- Cleanup: Every 5 seconds (removes non-existent GUIDs)
- Level (exact, no guessing!)
- Class & Race
- Guild
- Stealth status (via buff scanning)
- Faction (for duel detection)
- Buff scanning with Tooltip Scanner (works with GUIDs!)
- UNIT_CASTEVENT for instant detection
- Multi-language support (EN/DE patterns)
- Same-faction filtering (no duel alerts)
- Scan Interval: 0.5s (500ms)
- CPU Load: ~0.5% with 50 tracked GUIDs
- Memory: Minimal, automatic cleanup
- Pet Filtering: Intelligent class + UnitPlayerControlled check
Check:
- Folder structure:
Interface/AddOns/Spy/Spy.luamust exist - Only ONE Spy version installed
- Delete
Spy_OLDcopies
Fix:
Delete Interface/AddOns/Spy*
Extract fresh Spy-SuperWoW.zip
Symptoms:
- Error message on login
/spystatusshows "NOT AVAILABLE"
Fix:
- Verify SuperWoW installation: https://github.com/balakethelock/SuperWoW
- Check for SuperWoW DLL in WoW folder
- Test with other SuperWoW addons (ShaguQuest, pfUI)
- Reinstall SuperWoW
Causes:
- Debug mode active
- Low scan interval
Fix:
/spydebug- Disable debug mode- Edit
SpySuperWoW.lualine ~85:SpySW.SCAN_INTERVAL = 1.0(default: 0.5)
Check:
- Target enemy player
/spybuff- Test buff detection- Check which methods work
- Enable debug:
/spydebug
Note: Tooltip Scanner (Method 8) should work best with SuperWoW
Symptoms:
- Lua error when changing profiles
- "attempt to index nil value"
Fix:
- Fixed in 3.9.3! Profile system now works correctly
- If still happening,
/reloadafter profile change
Symptoms:
- Click doesn't target
- "Cannot target" in debug
Check:
- SuperWoW installed? (GUID targeting requires it)
- Player out of range? (SuperWoW can target further than normal)
- Enable debug:
/spydebugand check GUID tracking
Symptoms:
- Hunter/Warlock pets in list
- "Wolf" or "Voidwalker" detected
Status: Fixed in 3.9.3!
- Dual-check: NOT IsPlayer AND IsPlayerControlled = Pet
- Class verification (pets have no class)
- See debug: "SKIPPED PET: "
Check with /spystatus:
========== SpySuperWoW Status ==========
SuperWoW: AVAILABLE
Spy Mode: SuperWoW 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
========================================
- ✅ GUID-based player detection (SuperWoW)
- ✅ Proactive scanning (finds idle enemies)
- ✅ Advanced stealth detection (3 methods)
- ✅ Stealth-only mode (works when Spy disabled)
- ✅ Real level data (no guessing)
- ✅ Nearby counter with visual indicator
- ✅ Quick announce button (say/party/raid)
- ✅ Win/Loss tracking (PvP statistics)
- ✅ KoS system with reasons
- ✅ Ignore list
- ✅ Cross-character KoS sharing
- ✅ Advanced statistics window
- ✅ Real-time filtering (name/guild)
- ✅ Auto-resize window
- ✅ Smart pet filtering
- ✅ Zone-based control
- ✅ Battleground support
- ✅ Profile system
- ✅ Minimap icon (LDB)
- ✅ Unlimited range targeting
- ✅ Instant enable/disable
- ❌ Map display (requires TBC+ API)
- ❌ KoS button on target frame (no target frame API)
- ❌ Astrolabe integration (TBC+ library)
- Scan Interval: 1.0s (default in v4.1.0) - perfect balance of detection speed and performance
- Debug Mode: OFF except for testing
- Auto-Resize: ON for dynamic window size
- Stealth-Only Mode: Great for instances/BGs where you want Spy off
- Large battles (200+ players): Version 4.1.0 is specifically optimized for this - no further tuning needed
- High player density (>100): Scan interval already at 1.0s (optimal balance)
- During raids: Turn off debug mode
- Low FPS: Consider increasing scan interval to 2.0s in
SpySuperWoW.lualine 87
- Best Method: UNIT_CASTEVENT (instant, no delay)
- Backup: Buff scanning (0.5s delay)
- Most Reliable: Both enabled (default)
- SuperWoW allows targeting beyond normal range
- Click player in list, even if they're far away
- GUID-based targeting works as long as they were detected once
- Immolation - Original Spy addon creator (TBC/WotLK)
- laytya - Vanilla 1.12.1 port and maintenance
- me0wg4ming - SuperWoW integration and enhancements
- Shagu - ShaguScan inspiration for GUID-based detection system
- SuperWoW Team - SuperWoW framework development
- Shagu - pfUI tooltip scanning techniques
- Abstr4ctz - ModernSpellAlert cast event scanning techniques
- Community - Bug reports, feature suggestions, and testing
- All players who provided feedback and bug reports
- Private server communities for testing support
- Contributors to the Vanilla WoW addon development scene
Same as original Spy addon - free to use and modify.
- Check
/spystatus- Verify SuperWoW is detected - Enable
/spydebug- See what errors appear in chat - Test
/spybuffon enemy player - Verify stealth detection - Verify SuperWoW installation - Check for DLL in WoW folder
- Visit GitHub - Check for known issues or create a new one
- Repository: https://github.com/me0wg4ming/Spy
- Issues: https://github.com/me0wg4ming/Spy/issues
When reporting issues, please include:
- SuperWoW version
- WoW client version (1.12.1)
- Output of
/spystatus - Error message from
/spydebug(if any) - Steps to reproduce the issue
- Screenshots (if applicable)
Q: Can I use Spy without SuperWoW?
A: No, SuperWoW is mandatory. Spy will auto-disable without it.
Q: Why can't I target players by clicking?
A: SuperWoW must be installed for GUID-based targeting.
Q: Does Spy work on private servers?
A: Yes, fully compatible with Vanilla 1.12.1 servers.
Q: Can I import KoS lists from old Spy?
A: Yes, KoS data is preserved when updating.
Q: Why do I see pets in my list?
A: Fixed in 3.9.3, update to latest version.
⚠️ SuperWoW is REQUIRED - No exceptions!- 🔍 Spy detects enemies automatically, no action needed
- 🎵 Adjust sound settings to your preference
- 📊 Use statistics to track rivals
- 🔴 Mark dangerous players as KoS
- ⚪ Ignore friendly enemies
- 🐛 Report bugs with
/spystatusoutput
Have fun hunting in Azeroth! 🗡️
- GitHub Repository: https://github.com/me0wg4ming/Spy
- SuperWoW: https://github.com/balakethelock/SuperWoW
- Report Issues: https://github.com/me0wg4ming/Spy/issues
Version: 4.1.0
Release Date: December 13, 2025
Compatibility: World of Warcraft 1.12.1 (Vanilla)
Requirement: SuperWoW 1.12.1+
Status: Stable & Production-Ready (Optimized for Large Battles)
License: Free to use and modify