The Spy addon scans the combat log for actions performed by enemy players and announces their presence when they are detected. By warning you about nearby enemy players you can prepare for possible PvP combat. If an enemy player is detected Spy will attempt to determine their class, race and level based on the ability that was used. It will then sound an alert and add the enemy player to the Nearby List. Spy can be configured to announce enemy player encounters and share data with other Spy users in your party, raid or guild.
The Spy Window
The Spy window will initially appear under your character portrait, but can be moved by dragging the title bar. The title bar contains the following buttons:
- Stats: Opens the Statistics Window which shows a list of all enemies encountered
- Clear: Manually clears all enemy players that have currently been detected.Holding the Control key down while clicking this button will turn Spy off / on while leaving the window displayed.Holding the Shift key down while clicking this button will turn off / on all audio alerts.
- Left/Right: Used to navigates between the Nearby, Last Hour, Ignore and Kill On Sight lists..
- Close: Hides the Spy window. Spy is configured by default to show itself again when the next enemy player is detected. Alternatively you can type /spy show to manually show the Spy Window.
The Nearby List
As enemy players are detected they will be added to the Nearby list. Hovering over entries in the list will display a tooltip with the enemy player's details, including the last seen time and location. Right-clicking on them will displays a drop down menu which will allow you to:
- Remove the enemy player from the Nearby ist.
- Add/remove the enemy player to/from your Ignore or Kill On Sight list.
- Announce the enemy player's details to a chat channel of your choice.
- Set multiple Kill On Sight reasons, if the player is on your Kill On Sight list.
If enemy players remain undetected they will be removed from the Nearby list after a configurable amount of time. The Nearby list will always sort by the time each enemy player was initially detected, with enemy players who are on the Kill On Sight list or actively performing actions being placed at the top of the list. Spy is configured by default to switch back to the Nearby list when the next enemy player is detected.
The Kill On Sight List
The Kill On Sight list is for enemy players you especially want to know about. When enemy players on your Kill On Sight list are detected a warning will be displayed and an alarm will sound. You can use the drop down menu to add/remove enemy players to/from the Kill On Sight list, or hold the Shift key down while clicking an entry in the list to add/remove enemy players.
The Ignore List
The Ignore list is where you can place enemy players you have deemed harmless. Spy will not generate any alerts for enemy players on your Ignore list. You can use the drop down menu to add/remove enemy players to/from the Ignore list, or hold the Control key down while clicking on an entry in the list to add/remove enemy players.
The Last Hour List
The Last Hour list displays enemy players that have been detected in the last hour. It will always be sorted by the time each enemy player was initially detected, with those most recently detected appearing at the top of the list.
The Statistics Window
The Statistics window contains a list of all enemy encounters. By default it is sorted by the last time an enemy was detected. It can be also sorted by name, level, guild, wins and losses. The Statistics window also provides the capability to search for a specific enemy by name or guild and has filters to show enemies that are marked as Kill on Sight, with a Win/Loss or entered Reasons.
Additional Information
For more information see the tooltips associated with each option in the Interface Addons Spy configuration menu and the README file. To see a list of slash commands type: /spy
Localizations
Currently enUS, deDE, koKR, ptBR, zhCN and zhTW.
Contact me on this site if you are able to provide translations for other languages.
Authors
Created by Immolation from Cho'gall (US).
Updated by Slipjack.
Comments and Suggestions
Comments and suggestions are welcome. To report issues or ask for new features, use this site:
https://www.curseforge.com/wow/addons/spy/issues
When i enter in Oribos, the addon detects many alliance and make me disconnect from server
In reply to vickelodeon10:
That shouldn't be happening since Oribos is a sanctuary location. How are you entering Oribos? Hearth, Flying or portal?
BIG THX for the quick update ;)
This is a list of errors after launch with 9.0.1
1.
Message: Interface\AddOns\Spy\Spy.lua:14: attempt to index global 'MAX_PLAYER_LEVEL_TABLE' (a nil value)
Time: Wed Oct 14 16:50:20 2020
Count: 1
Stack: Interface\AddOns\Spy\Spy.lua:14: attempt to index global 'MAX_PLAYER_LEVEL_TABLE' (a nil value)
[string "@Interface\AddOns\Spy\Spy.lua"]:14: in main chunk
Locals: SM = <table> {
OverrideMedia = <table> {
}
callbacks = <table> {
}
LOCALE_BIT_zhTW = 8
SetDefault = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:293
GetDefault = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:289
LOCALE_BIT_ruRU = 2
UnregisterAllCallbacks = <function> defined @Interface\AddOns\Accountant_Classic\Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua:174
MediaType = <table> {
}
LOCALE_BIT_western = 128
SetGlobal = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:280
GetGlobal = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:276
List = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:266
HashTable = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:262
MediaTable = <table> {
}
RegisterCallback = <function> defined @Interface\AddOns\Accountant_Classic\Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua:90
IsValid = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:258
LOCALE_BIT_zhCN = 4
UnregisterCallback = <function> defined @Interface\AddOns\Accountant_Classic\Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua:153
Fetch = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:251
DefaultMedia = <table> {
}
Register = <function> defined @Interface\AddOns\DBM-Core\Libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua:218
MediaList = <table> {
}
LOCALE_BIT_koKR = 1
}
HBD = <table> {
mapData = <table> {
}
GetAllMapIDs = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:333
UpdateCurrentPosition = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:252
callbacks = <table> {
}
GetPlayerZone = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:537
___DIIDO = <table> {
}
transforms = <table> {
}
GetLocalizedMap = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:317
eventFrame = <unnamed> {
}
GetPlayerZonePosition = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:545
GetPlayerWorldPosition = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:525
GetZoneDistance = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:469
GetUnitWorldPosition = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:513
GetWorldCoordinatesFromZone = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:345
GetWorldDistance = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:455
RegisterCallback = <function> defined @Interface\AddOns\Accountant_Classic\Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua:90
GetWorldCoordinatesFromAzerothWorldMap = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:360
UnregisterCallback = <function> defined @Interface\AddOns\Accountant_Classic\Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua:153
GetZoneSize = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:324
worldMapData = <table> {
}
GetZoneCoordinatesFromWorld = <function> defined @Interface\AddOns\GatherMate2\Libs\HereBeDragons\HereBeDragons-2.0.lua:377
TranslateZoneCoordinates = <function> defined @Inte
2.
Message: [string "SpyStatsTabFrameTabContentFrame:OnLoad"]:1: attempt to call method 'SetBackdropColor' (a nil value)
Time: Wed Oct 14 16:50:20 2020
Count: 1
Stack: [string "SpyStatsTabFrameTabContentFrame:OnLoad"]:1: attempt to call method 'SetBackdropColor' (a nil value)
[string "*:OnLoad"]:1: in function <[string "*:OnLoad"]:1>
Locals: self = SpyStatsTabFrameTabContentFrame {
0 = <userdata>
}
(*temporary) = nil
(*temporary) = SpyStatsTabFrameTabContentFrame {
0 = <userdata>
}
(*temporary) = 0
(*temporary) = 0
(*temporary) = 0
(*temporary) = 0.500000
(*temporary) = "attempt to call method 'SetBackdropColor' (a nil value)"
3.
Message: [string "SpyStatsFilterBox:OnLoad"]:1: attempt to call method 'SetBackdropColor' (a nil value)
Time: Wed Oct 14 16:50:20 2020
Count: 1
Stack: [string "SpyStatsFilterBox:OnLoad"]:1: attempt to call method 'SetBackdropColor' (a nil value)
[string "*:OnLoad"]:1: in function <[string "*:OnLoad"]:1>
Locals: self = SpyStatsFilterBox {
0 = <userdata>
}
(*temporary) = nil
(*temporary) = SpyStatsFilterBox {
0 = <userdata>
}
(*temporary) = 0
(*temporary) = 0
(*temporary) = 0
(*temporary) = 0.650000
(*temporary) = "attempt to call method 'SetBackdropColor' (a nil value)"
4.
Message: [string "SpyStatsFrame:OnLoad"]:1: attempt to call method 'SetBackdropColor' (a nil value)
Time: Wed Oct 14 16:50:20 2020
Count: 1
Stack: [string "SpyStatsFrame:OnLoad"]:1: attempt to call method 'SetBackdropColor' (a nil value)
[string "*:OnLoad"]:1: in function <[string "*:OnLoad"]:1>
Locals: self = SpyStatsFrame {
0 = <userdata>
}
(*temporary) = nil
(*temporary) = SpyStatsFrame {
0 = <userdata>
}
(*temporary) = 0
(*temporary) = 0
(*temporary) = 0
(*temporary) = 0.950000
(*temporary) = "attempt to call method 'SetBackdropColor' (a nil value)"
5.
Message: Interface\AddOns\Spy\SpyData.lua:75: attempt to call method 'SetDataDb' (a nil value)
Time: Wed Oct 14 16:50:20 2020
Count: 1
Stack: Interface\AddOns\Spy\SpyData.lua:75: attempt to call method 'SetDataDb' (a nil value)
[string "@Interface\AddOns\Spy\SpyData.lua"]:75: in function <Interface\AddOns\Spy\SpyData.lua:74>
[string "=[C]"]: ?
[string "@Interface\AddOns\Accountant_Classic\Libs\AceAddon-3.0\AceAddon-3.0.lua"]:70: in function <...ccountant_Classic\Libs\AceAddon-3.0\AceAddon-3.0.lua:65>
[string "@Interface\AddOns\Accountant_Classic\Libs\AceAddon-3.0\AceAddon-3.0.lua"]:498: in function `InitializeAddon'
[string "@Interface\AddOns\Accountant_Classic\Libs\AceAddon-3.0\AceAddon-3.0.lua"]:623: in function <...ccountant_Classic\Libs\AceAddon-3.0\AceAddon-3.0.lua:615>
Locals: <none>
6.
Message: Interface\AddOns\Spy\MainWindow.lua:1349: attempt to index field 'db' (a nil value)
Time: Wed Oct 14 16:51:29 2020
Count: 7
Stack: Interface\AddOns\Spy\MainWindow.lua:1349: attempt to index field 'db' (a nil value)
[string "=[C]"]: ?
[string "@Interface\AddOns\Spy\MainWindow.lua"]:1349: in function <Interface\AddOns\Spy\MainWindow.lua:1348>
[string "=[C]"]: in function `TargetFrame_Update'
[string "@Interface\FrameXML\TargetFrame.lua"]:160: in function `OnEvent'
[string "@Interface\FrameXML\UnitFrame.lua"]:921: in function <Interface\FrameXML\UnitFrame.lua:919>
Locals:
Hope this helps with the fix
In reply to wyr3d:
Thanks - there is still an issue with the backdrops on the Statistics Window which was taking longer to fix then I expected. So I this will give me time to find a better solution.
Edit: I have a working solution for the backdrops which will be in the next update.
after prepatch for me the addon loaded and shows no errors in bug sack but it didnt show in options and the ui didnt show up to any idea. ? Warmode without spy is a mess
In reply to Corefanatik:
Same for me.
In reply to Corefanatik:
Yes - the older version is not compatible with Shadowlands. An update was just posted.
Please, update that great addon for Shadowlands prepatch.
In reply to vorfare:
Glad you like the addon. An update for patch 9.0.1 was recently posted - but its still a work in progress...
Getting this when ever I try to use the addon...
Date: 2020-09-23 17:03:24
ID: 3
Error occured in: Global
Count: 1
Message: ..\AddOns\Spy\SpyStats.lua line 89:
attempt to call global 'GetStatistic' (a nil value)
Debug:
Spy\SpyStats.lua:89: Show()
Spy\SpyStats.lua:106: Toggle()
Spy\MainWindow.lua:759:
Spy\MainWindow.lua:758
Locals:
self = <table> {
SetDefaultModuleLibraries = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:367
Enable = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:294
NewModule = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:235
EnableModule = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:332
modules = <table> {
}
CancelTimer = <function> defined @Interface\AddOns\GatherLite\libraries\AceTimer-3.0\AceTimer-3.0.lua:147
IterateEmbeds = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:442
SetSortColumn = <function> defined @Interface\AddOns\Spy\SpyStats.lua:134
defaultModuleLibraries = <table> {
}
TimeLeft = <function> defined @Interface\AddOns\GatherLite\libraries\AceTimer-3.0\AceTimer-3.0.lua:172
Hide = <function> defined @Interface\AddOns\Spy\SpyStats.lua:96
ScheduleRepeatingTimer = <function> defined @Interface\AddOns\GatherLite\libraries\AceTimer-3.0\AceTimer-3.0.lua:129
CancelAllTimers = <function> defined @Interface\AddOns\GatherLite\libraries\AceTimer-3.0\AceTimer-3.0.lua:160
SetDefaultModulePrototype = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:409
Show = <function> defined @Interface\AddOns\Spy\SpyStats.lua:84
name = "Spy_SpyStats"
UpdateView = <function> defined @Interface\AddOns\Spy\SpyStats.lua:114
IsEnabled = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:451
orderedModules = <table> {
}
ScheduleTimer = <function> defined @Interface\AddOns\GatherLite\libraries\AceTimer-3.0\AceTimer-3.0.lua:94
DisableModule = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:350
view = 1
OnNewEvent = <function> defined @Interface\AddOns\Spy\SpyStats.lua:130
IsModule = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:217
Toggle = <function> defined @Interface\AddOns\Spy\SpyStats.lua:102
SetDefaultModuleState = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:387
sortBy = "time"
baseName = "Spy"
SetEnabledState = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:424
Cleanup = <function> defined @Interface\AddOns\Spy\SpyStats.lua:344
enabledState = true
OnRefreshButtonUpdate = <function> defined @Interface\AddOns\Spy\SpyStats.lua:317
Filter = <function> defined @Interface\AddOns\Spy\SpyStats.lua:168
Refresh = <function> defined @Interface\AddOns\Spy\SpyStats.lua:197
Recalulate = <function> defined @Interface\AddOns\Spy\SpyStats.lua:142
IsShown = <function> defined @Interface\AddOns\Spy\SpyStats.lua:110
OnInitialize = <function> defined @Interface\AddOns\Spy\SpyStats.lua:36
IterateModules = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:437
Disable = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:314
OnDisable = <function> defined @Interface\AddOns\Spy\SpyStats.lua:80
GetModule = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:210
moduleName = "SpyStats"
GetName = <function> defined @Interface\AddOns\Recount\Libs\AceAddon-3.0\AceAddon-3.0.lua:279
defaultModuleState = true
}
(*temporary) = <function> defined =[C]:-1
(*temporary) = SpyStatsHonorKillsText {
0 = <userdata>
}
(*temporary) = "Honor Kills"
(*temporary) = ": "
(*temporary) = nil
(*temporary) = 588
(*temporary) = "attempt to call global 'GetStatistic' (a nil value)"
L = <table> {
About = "About"
PurgeData = "Purge undetected enemy player data after:"
StealthWarning = "Stealth player detected: "
SlashCommand = "Slash Command"
OnlyAnnounceKoSDescription = "Set this to only announce enemy players that are on your Kill On Sight list."
Draenei = "Draenei"
AlertTitle_kosguildaway = "Kill On Sight player guild located by "
HideDescription = "Hides the main window."
Alpha = "Transparency"
DisabledInZones = "Disable Spy while in these locations"
Master = "Master"
Fil
AddOns:
Swatter, v8.2.6511 (SwimmingSeadragon)
AtlasLootClassic, vv1.5.6
AtlasLootClassicData, vv1.5.6
AtlasLootClassicDungeonsAndRaids, vv1.5.6
AucAdvanced, v8.2.6471 (SwimmingSeadragon)
AucFilterBasic, v8.2.6497 (SwimmingSeadragon)
AucScanData, v8.2.6498 (SwimmingSeadragon)
AucStatHistogram, v8.2.6499 (SwimmingSeadragon)
AucStatiLevel, v8.2.6503 (SwimmingSeadragon)
AucStatPurchased, v8.2.6500 (SwimmingSeadragon)
AucStatSimple, v8.2.6501 (SwimmingSeadragon)
AucStatStdDev, v8.2.6502 (SwimmingSeadragon)
AucUtilFixAH, v8.2.6504 (SwimmingSeadragon)
Auctionator, v8.1.0
BeanCounter, v8.2.6505 (SwimmingSeadragon)
DBMCore, v1.13.60
DBMDefaultSkin, v
DBMStatusBarTimers, v
Enchantrix, v8.2.6506 (SwimmingSeadragon)
EnchantrixBarker, v8.2.6507 (SwimmingSeadragon)
ExtendedCharacterStats, v2.6.1
GatherLite, v3.2.5
HealBot, v1.13.5.3
HealBotData, v1.13.5.3
HealBoten, v1.13.5.3
HealBotExtraSkins, v1.13.5.3
HealBotOptions, v1.13.5.3
HealBotTips, v1.13.5.3
Informant, v8.2.6508 (SwimmingSeadragon)
Questie, v6.0.5
Recount, vv1.13.5b
SlideBar, v8.2.6509 (SwimmingSeadragon)
Spy, v3.7.1
Stubby, v8.2.6510 (SwimmingSeadragon)
TargetHealth, v1.0.3
ThreatClassic2, v2.24
TitanClassic, v1.2.4.11305
TitanClassicAmmo, v1.2.4.11305
TitanClassicBag, v1.2.4.11305
TitanClassicClock, v1.2.4.11305
TitanClassicGold, v1.2.4.11305
TitanClassicLocation, v1.2.4.11305
TitanClassicLootType, v1.2.4.11305
TitanClassicPerformance, v1.2.4.11305
TitanClassicRegen, v1.2.4.11305
TitanClassicRepair, v1.2.4.11305
TitanClassicVolume, v1.2.4.11305
TitanClassicXP, v1.2.4.11305
VendorPrice, v1.3.7
WorldBuffTracker, v11330
BlizRuntimeLib_enUS v1.13.5.11305 <none>
(ck=6c1)
In reply to ghadzooks121:
Try reloading. You might be missing a file.
Getting this when logging on. I removed a bunch of players last night, and it started correctly today but when I swapped to alts it started spamming errors. This is on classic.
In reply to nimchip:
This keeps happening, on my main (where i deleted all the kos people) it works fine, but on my alts it keeps giving me that error.
In reply to nimchip:
Hi everyone, since the current maintainer hasn't replied to my issue I decided to correct it by altering the List.lua code:
If you get this same issue simply check to see if PlayerData exists in the DB - or simply replace the entire function with this. Hopefully Slipjack gets around to implementing this - or if anyone knows if I can make a PR for this anywhere do let me know.
In reply to nimchip:
Thanks - for posting this and figuring out a fix. I have been away for a bit working on some RL stuff that has kept me rather busy.
This will be in the next update.
Edit: Also I am not getting alerts when someone posts a comment or an issue - again. :(
Is there a way to manually add players to KoS?
Someone camped my Friend but i couldnt come in time to see this guy after he left after 20 Min and i want to add this idiot manually but due to i didnt saw him on my own i cant see how i add someone manually.
found it on my own
/spy kos PLAYERNAME
ty
Would it be possible to add options to turn off the background and autohide the title bar and buttons? Also a broker plugin for Bazooka/Titanpanel/etc would be nice to have ^^
Hello, is there any way i can see my full "Kill on Sight List"? Like the entire list of players ive added?
In reply to Forge_User_35882008:
Yes - go the the statistics window and use the filter for KOS at the bottom. This will show you a list of all the KOS enemies that you have added. .