npc help-UI, Addons and Macros-Hunter Forums-HuntsmansLodge.com

Please consider registering
guest
sp_LogInOut Log In
Lost password?
Advanced Search
Forum Scope


Match



Forum Options



Minimum search word length is 3 characters - maximum search word length is 84 characters
The forums are currently locked and only available for read only access
sp_Feed Topic RSSsp_TopicIcon
npc help
Topic Rating: 0 Topic Rating: 0 (0 votes) 
February 13, 2012
11:32 pm
Guest
Guests

Im sorry for the long post here but i finaly found my old file of npc scanner but need some help on how to redo the new..

For those who want some pets etc might wanna check this out btw

This is the new.lua file:

–[[****************************************************************************
* _NPCScan by Saiket *
* _NPCScan.lua – Scans NPCs near you for specific rare NPC IDs. *
****************************************************************************]]

local NS = select( 2, … );
_NPCScan = NS;
local L = NS.L;

NS.Frame = CreateFrame( “Frame” );
NS.Updater = NS.Frame:CreateAnimationGroup();
NS.Version = GetAddOnMetadata( …, “Version” ):match( “^([%d.]+)” );

NS.Options = {
Version = NS.Version;
};
NS.OptionsCharacter = {
Version = NS.Version;
NPCs = {};
NPCWorldIDs = {};
Achievements = {};
};

NS.OptionsDefault = {
Version = NS.Version;
CacheWarnings = true;
AchievementsAddFound = nil;
AlertSoundUnmute = nil;
AlertSound = nil; — Default sound
};

do
local DEEPHOLM = GetMapNameByID( 640 );
local MOLTEN_FRONT = GetMapNameByID( 795 );
NS.OptionsCharacterDefault = {
Version = NS.Version;
NPCs = {
[ 18684 ] = L.NPCs[ 18684 ]; — Bro’Gaz the Clanless
[ 32491 ] = L.NPCs[ 32491 ]; — Time-Lost Proto Drake
[ 33776 ] = L.NPCs[ 33776 ]; — Gondria
[ 35189 ] = L.NPCs[ 35189 ]; — Skoll
[ 38453 ] = L.NPCs[ 38453 ]; — Arcturis
[ 49822 ] = L.NPCs[ 49822 ]; — Jadefang
[ 49913 ] = L.NPCs[ 49913 ]; — Lady LaLa
[ 50005 ] = L.NPCs[ 50005 ]; — Poseidus
[ 50009 ] = L.NPCs[ 50009 ]; — Mobus
[ 50050 ] = L.NPCs[ 50050 ]; — Shok’sharak
[ 50051 ] = L.NPCs[ 50051 ]; — Ghostcrawler
[ 50052 ] = L.NPCs[ 50052 ]; — Burgy Blackheart
[ 50053 ] = L.NPCs[ 50053 ]; — Thartuk the Exile
[ 50056 ] = L.NPCs[ 50056 ]; — Garr
[ 50057 ] = L.NPCs[ 50057 ]; — Blazewing
[ 50058 ] = L.NPCs[ 50058 ]; — Terrorpene
[ 50059 ] = L.NPCs[ 50059 ]; — Golgarok
[ 50060 ] = L.NPCs[ 50060 ]; — Terborus
[ 50061 ] = L.NPCs[ 50061 ]; — Xariona
[ 50062 ] = L.NPCs[ 50062 ]; — Aeonaxx
[ 50063 ] = L.NPCs[ 50063 ]; — Akma’hat
[ 50064 ] = L.NPCs[ 50064 ]; — Cyrus the Black
[ 50065 ] = L.NPCs[ 50065 ]; — Armagedillo
[ 50085 ] = L.NPCs[ 50085 ]; — Overlord Sunderfury
[ 50086 ] = L.NPCs[ 50086 ]; — Tarvus the Vile
[ 50089 ] = L.NPCs[ 50089 ]; — Julak-Doom
[ 50138 ] = L.NPCs[ 50138 ]; — Karoma
[ 50154 ] = L.NPCs[ 50154 ]; — Madexx
[ 50159 ] = L.NPCs[ 50159 ]; — Sambas
[ 50409 ] = L.NPCs[ 50409 ]; — Mysterious Camel Figurine
[ 50410 ] = L.NPCs[ 50410 ]; — Mysterious Camel Figurine
[ 50815 ] = L.NPCs[ 50815 ]; — Skarr
[ 50959 ] = L.NPCs[ 50959 ]; — Karkin
[ 51071 ] = L.NPCs[ 51071 ]; — Captain Florence
[ 51079 ] = L.NPCs[ 51079 ]; — Captain Foulwind
[ 51401 ] = L.NPCs[ 51401 ]; — Madexx
[ 51402 ] = L.NPCs[ 51402 ]; — Madexx
[ 51403 ] = L.NPCs[ 51403 ]; — Madexx
[ 51404 ] = L.NPCs[ 51404 ]; — Madexx
[ 54318 ] = L.NPCs[ 54318 ]; — Ankha
[ 54319 ] = L.NPCs[ 54319 ]; — Magria
[ 54320 ] = L.NPCs[ 54320 ]; — Ban’thalos
[ 54321 ] = L.NPCs[ 54321 ]; — Solix
[ 54322 ] = L.NPCs[ 54322 ]; — Deth’tilac
[ 54323 ] = L.NPCs[ 54323 ]; — Kirix
[ 54324 ] = L.NPCs[ 54324 ]; — Skitterflame
[ 54338 ] = L.NPCs[ 54338 ]; — Anthriss
};
NPCWorldIDs = {
[ 18684 ] = 3; — Bro’Gaz the Clanless
[ 32491 ] = 4; — Time-Lost Proto Drake
[ 33776 ] = 4; — Gondria
[ 35189 ] = 4; — Skoll
[ 38453 ] = 4; — Arcturis
[ 49822 ] = DEEPHOLM; — Jadefang
[ 49913 ] = 2; — Lady LaLa
[ 50005 ] = 2; — Poseidus
[ 50009 ] = 2; — Mobus
[ 50050 ] = 2; — Shok’sharak
[ 50051 ] = 2; — Ghostcrawler
[ 50052 ] = 2; — Burgy Blackheart
[ 50053 ] = 1; — Thartuk the Exile
[ 50056 ] = 1; — Garr
[ 50057 ] = 1; — Blazewing
[ 50058 ] = 1; — Terrorpene
[ 50059 ] = DEEPHOLM; — Golgarok
[ 50060 ] = DEEPHOLM; — Terborus
[ 50061 ] = DEEPHOLM; — Xariona
[ 50062 ] = DEEPHOLM; — Aeonaxx
[ 50063 ] = 1; — Akma’hat
[ 50064 ] = 1; — Cyrus the Black
[ 50065 ] = 1; — Armagedillo
[ 50085 ] = 2; — Overlord Sunderfury
[ 50086 ] = 2; — Tarvus the Vile
[ 50089 ] = 2; — Julak-Doom
[ 50138 ] = 2; — Karoma
[ 50154 ] = 1; — Madexx
[ 50159 ] = 2; — Sambas
[ 50409 ] = 1; — Mysterious Camel Figurine
[ 50410 ] = 1; — Mysterious Camel Figurine
[ 50815 ] = MOLTEN_FRONT; — Skarr
[ 50959 ] = MOLTEN_FRONT; — Karkin
[ 51071 ] = 2; — Captain Florence
[ 51079 ] = 2; — Captain Foulwind
[ 51401 ] = 1; — Madexx
[ 51402 ] = 1; — Madexx
[ 51403 ] = 1; — Madexx
[ 51404 ] = 1; — Madexx
[ 54318 ] = 1; — Ankha
[ 54319 ] = 1; — Magria
[ 54320 ] = 1; — Ban’thalos
[ 54321 ] = MOLTEN_FRONT; — Solix
[ 54322 ] = MOLTEN_FRONT; — Deth’tilac
[ 54323 ] = MOLTEN_FRONT; — Kirix
[ 54324 ] = MOLTEN_FRONT; — Skitterflame
[ 54338 ] = MOLTEN_FRONT; — Anthriss
};
Achievements = {
[ 1312 ] = true; — Bloody Rare (Outlands)
[ 2257 ] = true; — Frostbitten (Northrend)
};
};
end

NS.Achievements = { — Criteria data for each achievement.
[ 1312 ] = { WorldID = 3; }; — Bloody Rare (Outlands)
[ 2257 ] = { WorldID = 4; }; — Frostbitten (Northrend)
};
do
local VirtualContinents = { — Continents without physical maps aren’t used.
[ 5 ] = true; — The Maelstrom
};
NS.ContinentNames = { GetMapContinents() };
for ContinentID in pairs( VirtualContinents ) do
NS.ContinentNames[ ContinentID ] = nil;
end
NS.ContinentIDs = {}; — Reverse lookup of NS.ContinentNames.
end

NS.NpcIDMax = 0xFFFFF; — Largest ID that will fit in a GUID’s 20-bit NPC ID field.
NS.Updater.UpdateRate = 0.1;

 

— Prints a message in the default chat window.
function NS.Print ( Message, Color )
if ( not Color ) then
Color = NORMAL_FONT_COLOR;
end
DEFAULT_CHAT_FRAME:AddMessage( L.PRINT_FORMAT:format(
NS.Options.PrintTime and date( CHAT_TIMESTAMP_FORMAT or L.TIME_FORMAT ) or “”,
Message ), Color.r, Color.g, Color.b );
end

do
local Tooltip = CreateFrame( “GameTooltip”, “_NPCScanTooltip” );
— Add template text lines
local Text = Tooltip:CreateFontString();
Tooltip:AddFontStrings( Text, Tooltip:CreateFontString() );
— Checks the cache for a given NpcID.
— @return Localized name of the NPC if cached, or nil if not.
function NS.TestID ( NpcID )
Tooltip:SetOwner( WorldFrame, “ANCHOR_NONE” );
Tooltip:SetHyperlink( ( “unit:0xF53%05X00000000” ):format( NpcID ) );
if ( Tooltip:IsShown() ) then
return Text:GetText();
end
end
end

local CacheListBuild;
do
local TempList, AlreadyListed = {}, {};
— Compiles a cache list into a printable list string.
— @param Relist True to relist NPC names that have already been printed.
— @return List string, or nil if the list was empty.
function CacheListBuild ( self, Relist )
if ( next( self ) ) then
— Build and sort list
for NpcID, Name in pairs( self ) do
if ( Relist or not AlreadyListed[ NpcID ] ) then
if ( not Relist ) then — Filtered to show NPCs only once
AlreadyListed[ NpcID ] = true; — Don’t list again
end
— Add quotes to all entries
TempList[ #TempList + 1 ] = L.CACHELIST_ENTRY_FORMAT:format( Name );
end
end

wipe( self );
if ( #TempList > 0 ) then
sort( TempList );
local ListString = table.concat( TempList, L.CACHELIST_SEPARATOR );
wipe( TempList );
return ListString;
end
end
end
end
local CacheList = {};
do
— Fills a cache list with all added NPCs, active or not.
local function CacheListPopulate ( self )
for NpcID in pairs( NS.OptionsCharacter.NPCs ) do
self[ NpcID ] = NS.TestID( NpcID );
end
for AchievementID in pairs( NS.OptionsCharacter.Achievements ) do
for CriteriaID, NpcID in pairs( NS.Achievements[ AchievementID ].Criteria ) do
if ( NS.Options.AchievementsAddFound or not select( 3, GetAchievementCriteriaInfo( CriteriaID ) ) ) then — Not completed
self[ NpcID ] = NS.TestID( NpcID );
end
end
end
end
local FirstPrint = true;
— Prints a standard message listing cached mobs.
— Will also print details about the cache the first time it’s called.
— @param ForcePrint Overrides the user’s option to not print cache warnings.
— @param FullListing Adds all cached NPCs before printing, active or not.
— @return True if list printed.
function NS.CacheListPrint ( ForcePrint, FullListing )
if ( ForcePrint or NS.Options.CacheWarnings ) then
if ( FullListing ) then
CacheListPopulate( CacheList );
end
local ListString = CacheListBuild( CacheList, ForcePrint or FullListing ); — Allow printing an NPC a second time if forced or full listing
if ( ListString ) then
NS.Print( L[ FirstPrint and “CACHED_LONG_FORMAT” or “CACHED_FORMAT” ]:format( ListString ), ForcePrint and RED_FONT_COLOR );
FirstPrint = false;
return true;
end
else
wipe( CacheList );
end
end
end

 

local next, assert = next, assert;

local ScanIDs = {}; — [ NpcID ] = Number of concurrent scans for this ID
— Begins searching for an NPC.
— @return True if successfully added.
local function ScanAdd ( NpcID )
local Name = NS.TestID( NpcID );
if ( Name ) then — Already seen
CacheList[ NpcID ] = Name;
else — Increment
if ( ScanIDs[ NpcID ] ) then
ScanIDs[ NpcID ] = ScanIDs[ NpcID ] + 1;
else
if ( not next( ScanIDs ) ) then — First
NS.Updatericon_razzlay();
end
ScanIDs[ NpcID ] = 1;
NS.Overlays.Add( NpcID );
end
return true; — Successfully added
end
end
— Stops searching for an NPC when nothing is searching for it.
local function ScanRemove ( NpcID )
local Count = assert( ScanIDs[ NpcID ], “Attempt to remove inactive scan.” );
if ( Count > 1 ) then
ScanIDs[ NpcID ] = Count – 1;
else
ScanIDs[ NpcID ] = nil;
NS.Overlays.Remove( NpcID );
if ( not next( ScanIDs ) ) then — Last
NS.Updater:Stop();
end
end
end

 

— @return True if the given WorldID is active on the current world.
local function IsWorldIDActive ( WorldID )
return not WorldID or WorldID == NS.WorldID; — False/nil active on all worlds
end

local NPCActivate, NPCDeactivate;
do
local NPCsActive = {};
— Starts actual scan for NPC if on the right world.
function NPCActivate ( NpcID, WorldID )
if ( not NPCsActive[ NpcID ] and IsWorldIDActive( WorldID ) and ScanAdd( NpcID ) ) then
NPCsActive[ NpcID ] = true;
NS.Config.Search.UpdateTab( “NPC” );
return true; — Successfully activated
end
end
— Ends actual scan for NPC.
function NPCDeactivate ( NpcID )
if ( NPCsActive[ NpcID ] ) then
NPCsActive[ NpcID ] = nil;
ScanRemove( NpcID );
NS.Config.Search.UpdateTab( “NPC” );
return true; — Successfully deactivated
end
end
— @return True if a custom NPC is actively being searched for.
function NS.NPCIsActive ( NpcID )
return NPCsActive[ NpcID ];
end
end
— Adds an NPC name and ID to settings and begins searching.
— @param NpcID Numeric ID of the NPC (See Wowhead.com).
— @param Name Temporary name to identify this NPC by in the search table.
— @param WorldID Number or localized string WorldID to limit this search to.
— @return True if custom NPC added.
function NS.NPCAdd ( NpcID, Name, WorldID )
NpcID = assert( tonumber( NpcID ), “NpcID must be numeric.” );
local Options = NS.OptionsCharacter;
if ( not Options.NPCs[ NpcID ] ) then
assert( type( Name ) == “string”, “Name must be a string.” );
assert( WorldID == nil or type( WorldID ) == “string” or type( WorldID ) == “number”, “Invalid WorldID.” );
Options.NPCs[ NpcID ], Options.NPCWorldIDs[ NpcID ] = Name, WorldID;
if ( not NPCActivate( NpcID, WorldID ) ) then — Didn’t activate
NS.Config.Search.UpdateTab( “NPC” ); — Just add row
end
return true;
end
end
— Removes an NPC from settings and stops searching for it.
— @param NpcID Numeric ID of the NPC.
— @return True if custom NPC removed.
function NS.NPCRemove ( NpcID )
NpcID = tonumber( NpcID );
local Options = NS.OptionsCharacter;
if ( Options.NPCs[ NpcID ] ) then
Options.NPCs[ NpcID ], Options.NPCWorldIDs[ NpcID ] = nil;
if ( not NPCDeactivate( NpcID ) ) then — Wasn’t active
NS.Config.Search.UpdateTab( “NPC” ); — Just remove row
end
return true;
end
end

 

— Starts searching for an achievement’s NPC if it meets all settings.
local function AchievementNPCActivate ( Achievement, NpcID, CriteriaID )
if ( Achievement.Active and not Achievement.NPCsActive[ NpcID ]
and ( NS.Options.AchievementsAddFound or not select( 3, GetAchievementCriteriaInfo( CriteriaID ) ) ) — Not completed
and ScanAdd( NpcID )
) then
Achievement.NPCsActive[ NpcID ] = CriteriaID;
NS.Config.Search.UpdateTab( Achievement.ID );
return true;
end
end
— Stops searching for an achievement’s NPC.
local function AchievementNPCDeactivate ( Achievement, NpcID )
if ( Achievement.NPCsActive[ NpcID ] ) then
Achievement.NPCsActive[ NpcID ] = nil;
ScanRemove( NpcID );
NS.Config.Search.UpdateTab( Achievement.ID );
return true;
end
end
— Starts actual scans for achievement NPCs if on the right world.
local function AchievementActivate ( Achievement )
if ( not Achievement.Active and IsWorldIDActive( Achievement.WorldID ) ) then
Achievement.Active = true;
for CriteriaID, NpcID in pairs( Achievement.Criteria ) do
AchievementNPCActivate( Achievement, NpcID, CriteriaID );
end
return true;
end
end
— Ends actual scans for achievement NPCs.
local function AchievementDeactivate ( Achievement )
if ( Achievement.Active ) then
Achievement.Active = nil;
for NpcID in pairs( Achievement.NPCsActive ) do
AchievementNPCDeactivate( Achievement, NpcID );
end
return true;
end
end
— @param Achievement Achievement data table from NS.Achievements.
— @return True if the achievement NPC is being searched for.
function NS.AchievementNPCIsActive ( Achievement, NpcID )
return Achievement.NPCsActive[ NpcID ] ~= nil;
end
— Adds a kill-related achievement to track.
— @param AchievementID Numeric ID of achievement.
— @return True if achievement added.
function NS.AchievementAdd ( AchievementID )
AchievementID = assert( tonumber( AchievementID ), “AchievementID must be numeric.” );
local Achievement = NS.Achievements[ AchievementID ];
if ( Achievement and not NS.OptionsCharacter.Achievements[ AchievementID ] ) then
if ( not next( NS.OptionsCharacter.Achievements ) ) then — First
NS.Frame:RegisterEvent( “ACHIEVEMENT_EARNED” );
NS.Frame:RegisterEvent( “CRITERIA_UPDATE” );
end
NS.OptionsCharacter.Achievements[ AchievementID ] = true;
NS.Config.Search.AchievementSetEnabled( AchievementID, true );
AchievementActivate( Achievement );
return true;
end
end
— Removes an achievement from settings and stops tracking it.
— @param AchievementID Numeric ID of achievement.
— @return True if achievement removed.
function NS.AchievementRemove ( AchievementID )
if ( NS.OptionsCharacter.Achievements[ AchievementID ] ) then
AchievementDeactivate( NS.Achievements[ AchievementID ] );
NS.OptionsCharacter.Achievements[ AchievementID ] = nil;
if ( not next( NS.OptionsCharacter.Achievements ) ) then — Last
NS.Frame:UnregisterEvent( “ACHIEVEMENT_EARNED” );
NS.Frame:UnregisterEvent( “CRITERIA_UPDATE” );
end
NS.Config.Search.AchievementSetEnabled( AchievementID, false );
return true;
end
end

 

— Enables printing cache lists on login.
— @return True if changed.
function NS.SetCacheWarnings ( Enable )
if ( not Enable ~= not NS.Options.CacheWarnings ) then
NS.Options.CacheWarnings = Enable or nil;

NS.Config.CacheWarnings:SetChecked( Enable );
return true;
end
end
— Enables adding a timestamp to printed messages.
— @return True if changed.
function NS.SetPrintTime ( Enable )
if ( not Enable ~= not NS.Options.PrintTime ) then
NS.Options.PrintTime = Enable or nil;

NS.Config.PrintTime:SetChecked( Enable );
return true;
end
end
— Enables tracking of unneeded achievement NPCs.
— @return True if changed.
function NS.SetAchievementsAddFound ( Enable )
if ( not Enable ~= not NS.Options.AchievementsAddFound ) then
NS.Options.AchievementsAddFound = Enable or nil;
NS.Config.Search.AddFoundCheckbox:SetChecked( Enable );

for _, Achievement in pairs( NS.Achievements ) do
if ( AchievementDeactivate( Achievement ) ) then — Was active
AchievementActivate( Achievement );
end
end
return true;
end
end
— Enables unmuting sound to play found alerts.
— @return True if changed.
function NS.SetAlertSoundUnmute ( Enable )
if ( not Enable ~= not NS.Options.AlertSoundUnmute ) then
NS.Options.AlertSoundUnmute = Enable or nil;

NS.Config.AlertSoundUnmute:SetChecked( Enable );
return true;
end
end
— Sets the sound to play when NPCs are found.
— @return True if changed.
function NS.SetAlertSound ( AlertSound )
assert( AlertSound == nil or type( AlertSound ) == “string”, “AlertSound must be a string or nil.” );
if ( AlertSound ~= NS.Options.AlertSound ) then
NS.Options.AlertSound = AlertSound;

UIDropDownMenu_SetText( NS.Config.AlertSound, AlertSound == nil and L.CONFIG_ALERT_SOUND_DEFAULT or AlertSound );
return true;
end
end

 

local IsDefaultNPCValid;
do
local IsHunter = select( 2, UnitClass( “player” ) ) == “HUNTER”;
local TamableExceptions = {
[ 49822 ] = true; — Jadefang drops a pet
};
local FactionRestrictions = { — [NpcID] = FactionGroup to enable for
[ 51071 ] = “Horde”; — Captain Florence
[ 51079 ] = “Alliance”; — Captain Foulwind
};
— @return True if NpcID should be a default for this character.
function IsDefaultNPCValid ( NpcID )
return ( IsHunter or not NS.TamableIDs[ NpcID ] or TamableExceptions[ NpcID ] )
and ( not FactionRestrictions[ NpcID ] or FactionRestrictions[ NpcID ] == UnitFactionGroup( “player” ) );
end
end
— Resets the scanning list and reloads it from saved settings.
function NS.Synchronize ( Options, OptionsCharacter )
— Load defaults if settings omitted
local IsDefaultScan;
if ( not Options ) then
Options = NS.OptionsDefault;
end
if ( not OptionsCharacter ) then
OptionsCharacter, IsDefaultScan = NS.OptionsCharacterDefault, true;
end

— Clear all scans
for AchievementID in pairs( NS.OptionsCharacter.Achievements ) do
NS.AchievementRemove( AchievementID );
end
for NpcID in pairs( NS.OptionsCharacter.NPCs ) do
NS.NPCRemove( NpcID );
end
assert( not next( ScanIDs ), “Orphan NpcIDs in scan pool!” );

NS.SetCacheWarnings( Options.CacheWarnings );
NS.SetPrintTime( Options.PrintTime );
NS.SetAchievementsAddFound( Options.AchievementsAddFound );
NS.SetAlertSoundUnmute( Options.AlertSoundUnmute );
NS.SetAlertSound( Options.AlertSound );

local AddAllDefaults = IsShiftKeyDown();
for NpcID, Name in pairs( OptionsCharacter.NPCs ) do
— If defaults, only add tamable custom mobs if the player is a hunter
if ( AddAllDefaults or not IsDefaultScan or IsDefaultNPCValid( NpcID ) ) then
NS.NPCAdd( NpcID, Name, OptionsCharacter.NPCWorldIDs[ NpcID ] );
end
end
for AchievementID in pairs( NS.Achievements ) do
— If defaults, don’t enable completed achievements unless explicitly allowed
if ( OptionsCharacter.Achievements[ AchievementID ] and (
not IsDefaultScan or Options.AchievementsAddFound or not select( 4, GetAchievementInfo( AchievementID ) ) — Not completed
) ) then
NS.AchievementAdd( AchievementID );
end
end
NS.CacheListPrint( false, true ); — Populates cache list with inactive mobs too before printing
end

 

do
local PetList = {};

— Prints the list of cached pets when leaving a city or inn.
function NS.Frameicon_razzLAYER_UPDATE_RESTING ()
if ( not IsResting() and next( PetList ) ) then
if ( NS.Options.CacheWarnings ) then
local ListString = CacheListBuild( PetList );
if ( ListString ) then
NS.Print( L.CACHED_PET_RESTING_FORMAT:format( ListString ), RED_FONT_COLOR );
end
else
wipe( PetList );
end
end
end

— @return True if the tamable mob is in its correct zone, else false with an optional reason string.
local function OnFoundTamable ( NpcID, Name )
local ExpectedZone = NS.TamableIDs[ NpcID ];
local ZoneIDBackup = GetCurrentMapAreaID();

local InCorrectZone, InvalidReason;
if ( ExpectedZone == true ) then — Expected zone is unknown (instance mob, etc.)
InCorrectZone = not IsResting(); — Assume any tamable mob found in a city/inn is a hunter pet
else
SetMapToCurrentZone();
InCorrectZone = ExpectedZone == GetCurrentMapAreaID();
end

if ( not InCorrectZone ) then
if ( IsResting() ) then
PetList[ NpcID ] = Name; — Suppress error message until the player stops resting
else
— Get details about expected zone
local ExpectedZoneName = GetMapNameByID( ExpectedZone );
if ( not ExpectedZoneName ) then — GetMapNameByID returns nil for continent maps
SetMapByID( ExpectedZone );
local Continent = GetCurrentMapContinent();
if ( Continent >= 1 ) then
ExpectedZoneName = select( Continent, GetMapContinents() );
end
end
InvalidReason = L.FOUND_TAMABLE_WRONGZONE_FORMAT:format(
Name, GetRealZoneText(), ExpectedZoneName or L.FOUND_ZONE_UNKNOWN, ExpectedZone );
end
end

SetMapByID( ZoneIDBackup ); — Restore previous map view
return InCorrectZone, InvalidReason;
end
— Validates found mobs before showing alerts.
local function OnFound ( NpcID, Name )
— Disable active scans
NPCDeactivate( NpcID );
for AchievementID in pairs( NS.OptionsCharacter.Achievements ) do
AchievementNPCDeactivate( NS.Achievements[ AchievementID ], NpcID );
end

local Valid, InvalidReason = true;
local Tamable = NS.TamableIDs[ NpcID ];
if ( Tamable ) then
Valid, InvalidReason = OnFoundTamable( NpcID, Name );
end

if ( Valid ) then
NS.Print( L[ Tamable and “FOUND_TAMABLE_FORMAT” or “FOUND_FORMAT” ]:format( Name ), GREEN_FONT_COLOR );
NS.Button:SetNPC( NpcID, Name ); — Sends added and found overlay messages
elseif ( InvalidReason ) then
NS.Print( InvalidReason );
end
end

local pairs = pairs;
local GetAchievementCriteriaInfo = GetAchievementCriteriaInfo;
— Scans all active criteria and removes any completed NPCs.
local function AchievementCriteriaUpdate ()
if ( not NS.Options.AchievementsAddFound ) then
for AchievementID in pairs( NS.OptionsCharacter.Achievements ) do
local Achievement = NS.Achievements[ AchievementID ];
for NpcID, CriteriaID in pairs( Achievement.NPCsActive ) do
local _, _, Complete = GetAchievementCriteriaInfo( CriteriaID );
if ( Complete ) then
AchievementNPCDeactivate( Achievement, NpcID );
end
end
end
end
end
local CriteriaUpdated = false;
— Stops tracking individual achievement NPCs when the player gets kill credit.
function NS.Frame:CRITERIA_UPDATE ()
CriteriaUpdated = true;
end

— Scans all NPCs on a timer and alerts if any are found.
function NS.Updater:OnLoop ()
if ( CriteriaUpdated ) then — CRITERIA_UPDATE bucket
CriteriaUpdated = false;
AchievementCriteriaUpdate();
end

for NpcID in pairs( ScanIDs ) do
local Name = NS.TestID( NpcID );
if ( Name ) then
OnFound( NpcID, Name );
end
end
end
end
if ( select( 2, UnitClass( “player” ) ) == “HUNTER” ) then
local StableUpdater = CreateFrame( “Frame” );

local StabledList = {};
— Stops scans for stabled hunter pets before a bogus alert can fire.
function NS.Frameicon_razzET_STABLE_UPDATE ()
for NpcID in pairs( ScanIDs ) do
local Name = NS.TestID( NpcID );
if ( Name ) then
StabledList[ NpcID ] = Name;
NPCDeactivate( NpcID );
for AchievementID in pairs( NS.OptionsCharacter.Achievements ) do
AchievementNPCDeactivate( NS.Achievements[ AchievementID ], NpcID );
end
end
end
StableUpdater:Show();
end
— Bucket to print cached stabled pets on one line.
function StableUpdater:OnUpdate ()
self:Hide();
if ( NS.Options.CacheWarnings ) then
local ListString = CacheListBuild( StabledList );
if ( ListString ) then
NS.Print( L.CACHED_STABLED_FORMAT:format( ListString ) );
end
else
wipe( StabledList );
end
end

StableUpdater:Hide();
StableUpdater:SetScript( “OnUpdate”, StableUpdater.OnUpdate );
NS.Frame:RegisterEvent( “PET_STABLE_UPDATE” );

local Backup = GetStablePetInfo;
— Prevents the pet UI from querying (and caching) pets until actually viewing the stables.
— @param Override Forces a normal query even if the stables aren’t open.
function GetStablePetInfo ( Slot, Override, … )
if ( Override or IsAtStableMaster() ) then
return Backup( Slot, Override, … );
end
end
end

 

— Loads defaults, validates settings, and starts scan.
— Used instead of ADDON_LOADED to give overlay mods a chance to load and register for messages.
function NS.Frameicon_razzLAYER_LOGIN ( Event )
self[ Event ] = nil;

local Options, OptionsCharacter = _NPCScanOptions, _NPCScanOptionsCharacter;
_NPCScanOptions, _NPCScanOptionsCharacter = NS.Options, NS.OptionsCharacter;

— Update settings incrementally
if ( Options and Options.Version ~= NS.Version ) then
if ( Options.Version == “3.0.9.2” ) then — 3.1.0.1: Added options for finding already found and tamable mobs
Options.CacheWarnings = true;
Options.Version = “3.1.0.1”;
end
Options.Version = NS.Version;
end
— Character settings
if ( OptionsCharacter and OptionsCharacter.Version ~= NS.Version ) then
local Version = OptionsCharacter.Version;

local WorldIDs = NS.OptionsCharacterDefault.NPCWorldIDs;
— Add NpcID if not already being searched for.
local function AddDefault ( NpcID )
if ( not OptionsCharacter.NPCs[ NpcID ] — Not already searched for
and IsDefaultNPCValid( NpcID )
) then
OptionsCharacter.NPCs[ NpcID ] = L.NPCs[ NpcID ];
OptionsCharacter.NPCWorldIDs[ NpcID ] = WorldIDs[ NpcID ];
end
end

if ( Version == “3.0.9.2” ) then — 3.1.0.1: Remove NPCs that are duplicated by achievements
local NPCs = OptionsCharacter.IDs;
OptionsCharacter.IDs = nil;
OptionsCharacter.NPCs = NPCs;
OptionsCharacter.Achievements = {};
local AchievementNPCs = {};
for AchievementID, Achievement in pairs( NS.Achievements ) do
for _, NpcID in pairs( Achievement.Criteria ) do
AchievementNPCs[ NpcID ] = AchievementID;
end
end
for Name, NpcID in pairs( NPCs ) do
if ( AchievementNPCs[ NpcID ] ) then
NPCs[ Name ] = nil;
OptionsCharacter.Achievements[ AchievementNPCs[ NpcID ] ] = true;
end
end
Version = “3.1.0.1”;
end
if ( Version == “3.1.0.1” or Version == “3.2.0.1” or Version == “3.2.0.2” ) then
— 3.2.0.3: Added default scan for Skoll
OptionsCharacter.NPCs[ L.NPCs[ 35189 ] ] = 35189;
Version = “3.2.0.3”;
end
if ( “3.2.0.3” <= Version and Version <= “3.3.0.1” ) then
— 3.3.0.2: Added default scan for Arcturis
OptionsCharacter.NPCs[ L.NPCs[ 38453 ] ] = 38453;
Version = “3.3.0.2”;
end
if ( Version == “3.3.0.2” or Version == “3.3.0.3” or Version == “3.3.0.4” ) then
— 3.3.5.1: Custom NPC scans are indexed by ID instead of name, and can now be map-specific
local DefaultWorldIDs = NS.OptionsCharacterDefault.NPCWorldIDs;
local NPCsNew, NPCWorldIDs = {}, {};
for Name, NpcID in pairs( OptionsCharacter.NPCs ) do
NPCsNew[ NpcID ] = Name;
NPCWorldIDs[ NpcID ] = DefaultWorldIDs[ NpcID ];
end
OptionsCharacter.NPCs, OptionsCharacter.NPCWorldIDs = NPCsNew, NPCWorldIDs;
Version = “3.3.5.1”;
end
if ( Version < “4.0.3.1” ) then
— 4.0.3.1: Added default scans for Cataclysm rares
AddDefault( 49913 ); — Lady LaLa
AddDefault( 50005 ); — Poseidus
AddDefault( 50009 ); — Mobus
AddDefault( 50050 ); — Shok’sharak
AddDefault( 50051 ); — Ghostcrawler
AddDefault( 50052 ); — Burgy Blackheart
AddDefault( 50053 ); — Thartuk the Exile
AddDefault( 50056 ); — Garr
AddDefault( 50057 ); — Blazewing
AddDefault( 50058 ); — Terrorpene
AddDefault( 50059 ); — Golgarok
AddDefault( 50060 ); — Terborus
AddDefault( 50061 ); — Xariona
AddDefault( 50062 ); — Aeonaxx
AddDefault( 50063 ); — Akma’hat
AddDefault( 50064 ); — Cyrus the Black
AddDefault( 50065 ); — Armagedillo
AddDefault( 50085 ); — Overlord Sunderfury
AddDefault( 50086 ); — Tarvus the Vile
AddDefault( 50089 ); — Julak-Doom
AddDefault( 50138 ); — Karoma
AddDefault( 50154 ); — Madexx
AddDefault( 50159 ); — Sambas
AddDefault( 50409 ); — Mysterious Camel Figurine
AddDefault( 50410 ); — Mysterious Camel Figurine
AddDefault( 51071 ); — Captain Florence
AddDefault( 51079 ); — Captain Foulwind
AddDefault( 51401 ); — Madexx
AddDefault( 51402 ); — Madexx
AddDefault( 51403 ); — Madexx
AddDefault( 51404 ); — Madexx
Version = “4.0.3.1”;
end
if ( Version < “4.0.3.3” ) then
— 4.0.3.3: Fixed omission of Jadefang.
AddDefault( 49822 ); — Jadefang
Version = “4.0.3.3”;
end
if ( Version < “4.2.0.2” ) then
— 4.2.0.2: Added 4.2’s rare hunter pets.
AddDefault( 50815 ); — Skarr
AddDefault( 50959 ); — Karkin
AddDefault( 54318 ); — Ankha
AddDefault( 54319 ); — Magria
AddDefault( 54320 ); — Ban’thalos
AddDefault( 54321 ); — Solix
AddDefault( 54322 ); — Deth’tilac
AddDefault( 54323 ); — Kirix
AddDefault( 54324 ); — Skitterflame
AddDefault( 54338 ); — Anthriss
Version = “4.2.0.2”;
end
OptionsCharacter.Version = NS.Version;
end

NS.Overlays.Register();
NS.Synchronize( Options, OptionsCharacter ); — Loads defaults if either are nil
end
do
local FirstWorld = true;
— Starts world-specific scans when entering a world.
function NS.Frameicon_razzLAYER_ENTERING_WORLD ()
— Print cached pets if player ported out of a city
selficon_razzLAYER_UPDATE_RESTING();

— Since real MapIDs aren’t available to addons, a “WorldID” is a universal ContinentID or the map’s localized name.
local MapName = GetInstanceInfo();
NS.WorldID = NS.ContinentIDs[ MapName ] or MapName;

— Activate scans on this world
for NpcID, WorldID in pairs( NS.OptionsCharacter.NPCWorldIDs ) do
NPCActivate( NpcID, WorldID );
end
for AchievementID in pairs( NS.OptionsCharacter.Achievements ) do
local Achievement = NS.Achievements[ AchievementID ];
if ( Achievement.WorldID ) then
AchievementActivate( Achievement );
end
end

if ( FirstWorld or not NS.Options.CacheWarnings ) then — Full listing of cached mobs gets printed on login
FirstWorld = false;
wipe( CacheList );
else — Print list of cached mobs specific to new world
local ListString = CacheListBuild( CacheList );
if ( ListString ) then
NS.Print( L.CACHED_WORLD_FORMAT:format( ListString, MapName ) );
end
end
end
end
— Stops world-specific scans when leaving a world.
function NS.Frameicon_razzLAYER_LEAVING_WORLD ()
— Stop scans that were only active on the previous world
for NpcID in pairs( NS.OptionsCharacter.NPCWorldIDs ) do
NPCDeactivate( NpcID );
end
for AchievementID in pairs( NS.OptionsCharacter.Achievements ) do
local Achievement = NS.Achievements[ AchievementID ];
if ( Achievement.WorldID ) then
AchievementDeactivate( Achievement );
end
end
NS.WorldID = nil;
end
— Stops tracking achievements when they finish.
function NS.Frame:ACHIEVEMENT_EARNED ( _, AchievementID )
if ( not NS.Options.AchievementsAddFound ) then
NS.AchievementRemove( AchievementID );
end
end
— Sets the update handler only after zone info is known.
function NS.Frame:ZONE_CHANGED_NEW_AREA ( Event )
self:UnregisterEvent( Event );
self[ Event ] = nil;

NS.Updater:SetScript( “OnLoop”, NS.Updater.OnLoop );
end
— Global event handler.
function NS.Frame:OnEvent ( Event, … )
if ( self[ Event ] ) then
return self[ Event ]( self, Event, … );
end
end

 

— Slash command chat handler to open the options pane and manage the NPC list.
function NS.SlashCommand ( Input )
local Command, Arguments = Input:match( “^(%S+)%s*(.-)%s*$” );
if ( Command ) then
Command = Command:upper();
if ( Command == L.CMD_ADD ) then
local ID, Name = Arguments:match( “^(%d+)%s+(.+)$” );
if ( ID ) then
ID = tonumber( ID );
NS.NPCRemove( ID );
if ( NS.NPCAdd( ID, Name ) ) then
NS.CacheListPrint( true );
end
return;
end
elseif ( Command == L.CMD_REMOVE ) then
local ID = tonumber( Arguments );
if ( not ID ) then — Search custom names
for NpcID, Name in pairs( NS.OptionsCharacter.NPCs ) do
if ( Name == Arguments ) then
ID = NpcID;
break;
end
end
end
if ( not NS.NPCRemove( ID ) ) then
NS.Print( L.CMD_REMOVENOTFOUND_FORMAT:format( Arguments ), RED_FONT_COLOR );
end
return;
elseif ( Command == L.CMD_CACHE ) then — Force print full cache list
if ( not NS.CacheListPrint( true, true ) ) then — Nothing in cache
NS.Print( L.CMD_CACHE_EMPTY, GREEN_FONT_COLOR );
end
return;
end
— Invalid subcommand
NS.Print( L.CMD_HELP );

else — No subcommand
InterfaceOptionsFrame_OpenToCategory( NS.Config.Search );
end
end

 

— Create reverse lookup of continent names
for Index, Name in pairs( NS.ContinentNames ) do
NS.ContinentIDs[ Name ] = Index;
end
— Save achievement criteria data
for AchievementID, Achievement in pairs( NS.Achievements ) do
Achievement.ID = AchievementID;
Achievement.Criteria = {}; — [ CriteriaID ] = NpcID;
Achievement.NPCsActive = {}; — [ NpcID ] = CriteriaID;
for Criteria = 1, GetAchievementNumCriteria( AchievementID ) do
local _, CriteriaType, _, _, _, _, _, AssetID, _, CriteriaID = GetAchievementCriteriaInfo( AchievementID, Criteria );
if ( CriteriaType == 0 ) then — Mob kill type
Achievement.Criteria[ CriteriaID ] = AssetID;
end
end
end

local Frame = NS.Frame;
Frame:SetScript( “OnEvent”, Frame.OnEvent );
if ( not IsLoggedIn() ) then
Frame:RegisterEvent( “PLAYER_LOGIN” );
else
Frameicon_razzLAYER_LOGIN( “PLAYER_LOGIN” );
end
Frame:RegisterEvent( “PLAYER_ENTERING_WORLD” );
Frame:RegisterEvent( “PLAYER_LEAVING_WORLD” );
Frame:RegisterEvent( “PLAYER_UPDATE_RESTING” );

NS.Updater:CreateAnimation( “Animation” ):SetDuration( NS.Updater.UpdateRate );
NS.Updater:SetLooping( “REPEAT” );
— Set update handler after zone info loads
if ( GetZoneText() == “” ) then — Zone information unknown (initial login)
Frame:RegisterEvent( “ZONE_CHANGED_NEW_AREA” );
else — Zone information is known
Frame:ZONE_CHANGED_NEW_AREA( “ZONE_CHANGED_NEW_AREA” );
end

SlashCmdList[ “_NPCSCAN” ] = NS.SlashCommand;

 

And this is the old i like to include:

_NPCScanOptionsCharacter = {
[“Achievements”] = {
[1312] = true,
[2257] = true,
},
[“NPCs”] = {
[507] = “Fenros”,
[3535] = “Blackmoss the Fetid”,
[22060] = “Fenissa the Assassin”,
[1260] = “Great Father Arctikus”,
[8503] = “Gibblewilt”,
[161icon_eek] = “Shadikith the Glider”,
[16184] = “Nerubian Overseer”,
[9046] = “Scarshield Quartermaster”,
[44759] = “Andre Firebeard”,
[100icon_eek] = “Sandarr Dunereaver”,
[6583] = “Gruff”,
[6585] = “Uhk’loc”,
[4066] = “Nal’taszar”,
[7104] = “Dessecus”,
[50061] = “Xariona”,
[10639] = “Rorgish Jowl”,
[2541] = “Lord Sakrasis”,
[14224] = “7:XT”,
[14228] = “Giggler”,
[14232] = “Dart”,
[14236] = “Lord Angler”,
[3058] = “Arra’chea”,
[1533] = “Tormented Spirit”,
[6118] = “Varo’then’s Ghost”,
[14268] = “Lord Condar”,
[14272] = “Snarlflare”,
[14276] = “Scargil”,
[142icon_eek] = “Big Samras”,
[10196] = “General Colbatann”,
[10200] = “Rak’shiri”,
[3581] = “Sewer Beast”,
[6647] = “Magister Hawkhelm”,
[6649] = “Lady Sesspira”,
[6651] = “Gatekeeper Rageroar”,
[3586] = “Miner Johnson”,
[771] = “Commander Felstrom”,
[45399] = “Optimo”,
[9218] = “Spirestone Battle Lord”,
[8200] = “Jin’Zallah the Sandbringer”,
[50062] = “Aeonaxx”,
[47012] = “Effritus”,
[8212] = “The Reak”,
[8216] = “Retherokk the Berserker”,
[519] = “Slark”,
[4132] = “Silithid Ravager”,
[520] = “Brack”,
[10823] = “Zul’Brin Warpbranch”,
[10827] = “Deathspeaker Zelendra”,
[82icon_eek] = “Shleipnarr”,
[44761] = “Aquementas the Unchained”,
[14424] = “Mirelow”,
[14428] = “Uruson”,
[14432] = “Threggil”,
[8304] = “Dreadscorn”,
[45384] = “Sagepaw”,
[14448] = “Molt Thorn”,
[2600] = “Singer”,
[46981] = “Nightlash”,
[2602] = “Ruul Onestone”,
[2603] = “Kovork”,
[2604] = “Molok the Crusher”,
[14476] = “Krellack”,
[2606] = “Nimar the Slayer”,
[6228] = “Dark Iron Ambassador”,
[14488] = “Roloch”,
[14492] = “Verifonix”,
[2108] = “Garneg Charskull”,
[45257] = “Mordak Nightbender”,
[8923] = “Panzor the Invincible”,
[11498] = “Skarr the Broken”,
[45369] = “Morich Darkbrew”,
[3652] = “Trigore the Lasher”,
[1063] = “Jade”,
[50064] = “Cyrus the Black”,
[8979] = “Gruklash”,
[99] = “Morgaine the Sly”,
[33776] = “Gondria”,
[534] = “Nefaru”,
[5785] = “Sister Hatelash”,
[22062] = “Dr. Whitherlimb”,
[1531] = “Lost Soul”,
[51658] = “Mogh the Dead”,
[51661] = “Tsul’Kalu”,
[43613] = “Doomsayer Wiserunner”,
[5797] = “Aean Swiftriver”,
[5799] = “Hannah Bladeleaf”,
[8978] = “Thauris Balgarr”,
[3672] = “Boahn”,
[50065] = “Armagedillo”,
[5icon_eek7] = “The Rake”,
[5icon_eek9] = “Sergeant Curtis”,
[45785] = “Carved One”,
[45icon_eek1] = “Eliza”,
[1841] = “Scarlet Executioner”,
[6581] = “Ravasaur Matriarch”,
[1839] = “Scarlet High Clerist”,
[10640] = “Oakpaw”,
[5823] = “Death Flayer”,
[11467] = “Tsu’zee”,
[5827] = “Brontus”,
[5829] = “Snort the Heckler”,
[5831] = “Swiftmane”,
[51071] = “Captain Florence”,
[5835] = “Foreman Grills”,
[5837] = “Stonearm”,
[1847] = “Foulmane”,
[10644] = “Mist Howler”,
[1848] = “Lord Maldazzar”,
[14229] = “Accursed Slitherblade”,
[1849] = “Dreadwhisper”,
[5849] = “Digger Flameforge”,
[5851] = “Captain Gerogg Hammertoe”,
[14429] = “Grimmaw”,
[1851] = “The Husk”,
[5346] = “Bloodroar the Stalker”,
[5859] = “Hagg Taurenbane”,
[5350] = “Qirot”,
[5352] = “Old Grizzlegut”,
[5354] = “Gnarl Leafbrother”,
[14273] = “Boulderheart”,
[2172] = “Strider Clutchmother”,
[8660] = “The Evalcharr”,
[10197] = “Mezzir the Howler”,
[10201] = “Lady Hederine”,
[45258] = “Cassia the Slitherqueen”,
[45402] = “Nix”,
[1837] = “Scarlet Judge”,
[5787] = “Enforcer Emilgund”,
[4030] = “Vengeful Ancient”,
[8201] = “Omgorn the Lost”,
[9718] = “Ghok Bashguud”,
[8296] = “Mojo the Twisted”,
[2184] = “Lady Moongazer”,
[9219] = “Spirestone Butcher”,
[2186] = “Carnivous the Breaker”,
[8205] = “Haarka the Ravenous”,
[45771] = “Marus”,
[14345] = “The Ongar”,
[8217] = “Mith’rethis the Enchanter”,
[51663] = “Pogeyan”,
[2192] = “Firecaller Radison”,
[5400] = “Zekkis”,
[43icon_eek] = “Darkmist Widow”,
[5915] = “Brother Ravenoak”,
[2175] = “Shadowclaw”,
[16855] = “Tregla”,
[2609] = “Geomancer Flintdagger”,
[10082] = “Zerillis”,
[10357] = “Ressan the Needler”,
[11383] = “High Priestess Hai’watna”,
[3735] = “Apothecary Falthis”,
[5931] = “Foreman Rigger”,
[45739] = “The Unknown Soldier”,
[8277] = “Rekk’tilac”,
[45260] = “Blackleaf”,
[12432] = “Old Vicejaw”,
[1106] = “Lost One Cook”,
[14425] = “Gnawbone”,
[8297] = “Magronos the Unyielding”,
[8301] = “Clack the Reaver”,
[9602] = “Hahk’Zor”,
[18684] = “Bro’Gaz the Clanless”,
[14445] = “Lord Captain Wyrmak”,
[45404] = “Geoshaper Maren”,
[32491] = “Time-Lost Proto Drake”,
[43488] = “Mordei the Earthrender”,
[6489] = “Ironspine”,
[10647] = “Prince Raze”,
[1112] = “Leech Widow”,
[14473] = “Lapress”,
[12433] = “Krethis the Shadowspinner”,
[10393] = “Skul”,
[1850] = “Putridius”,
[45262] = “Narixxus the Doombringer”,
[6488] = “Fallen Champion”,
[6490] = “Azshir the Sleepless”,
[10376] = “Crystal Fang”,
[14475] = “Rex Ashil”,
[14471] = “Setis”,
[11447] = “Mushgog”,
[2283] = “Ravenclaw Regent”,
[1885] = “Scarlet Smith”,
[7015] = “Flagglemurk the Cruel”,
[7017] = “Lord Sinslayer”,
[45740] = “Watcher Eva”,
[2605] = “Zalas Witherbark”,
[2749] = “Barricade”,
[8924] = “The Behemoth”,
[3773] = “Akkrilus”,
[2752] = “Rumbler”,
[2753] = “Barnabus”,
[2754] = “Anathemus”,
[472] = “Fedfennel”,
[12237] = “Meshlok the Harvester”,
[10509] = “Jed Runewatcher”,
[947] = “Rohh the Silent”,
[3270] = “Elder Mystic Razorsnout”,
[14447] = “Gilmorian”,
[50052] = “Burgy Blackheart”,
[1399] = “Magosh”,
[8976] = “Hematos”,
[2598] = “Darbel Montrose”,
[471] = “Mother Fang”,
[7057] = “Digmaster Shovelphlange”,
[1130] = “Bjarn”,
[8299] = “Spiteflayer”,
[2258] = “Stone Fury”,
[3792] = “Terrowulf Packlord”,
[1132] = “Timber”,
[10828] = “High General Abbendis”,
[45811] = “Marina DeSirrus”,
[51662] = “Mahamba”,
[5933] = “Achellios the Banished”,
[10559] = “Lady Vespia”,
[5934] = “Heartrazor”,
[10826] = “Lord Darkscythe”,
[2779] = “Prince Nazjak”,
[44224] = “Two-Toes”,
[1137] = “Edan the Howler”,
[44767] = “Occulus the Corrupted”,
[10078] = “Terrorspark”,
[6582] = “Clutchmother Zavas”,
[6584] = “King Mosh”,
[47386] = “Ainamiss the Hive Queen”,
[1140] = “Razormaw Matriarch”,
[7895] = “Ambassador Bloodrage”,
[10818] = “Death Knight Soulbearer”,
[50005] = “Poseidus”,
[572] = “Leprithus”,
[1398] = “Boss Galgosh”,
[50053] = “Thartuk the Exile”,
[1910] = “Muad”,
[573] = “Foe Reaper 4000”,
[1911] = “Deeb”,
[14222] = “Araga”,
[14226] = “Kaskk”,
[14230] = “Burgle Eye”,
[14234] = “Hayoc”,
[1552] = “Scale Belly”,
[3736] = “Darkslayer Mordenthal”,
[5356] = “Snarler”,
[14340] = “Alshirr Banebreath”,
[12037] = “Ursol’lok”,
[7137] = “Immolatus”,
[1920] = “Dalaran Spellscribe”,
[14266] = “Shanda the Spinner”,
[14270] = “Squiddic”,
[45398] = “Grizlak”,
[14278] = “Ro’Bark”,
[44225] = “Rufus Darkshot”,
[10198] = “Kashoch the Reaver”,
[10202] = “Azurous”,
[47387] = “Harakiss the Infestor”,
[6646] = “Monnos the Elder”,
[6648] = “Antilos”,
[6650] = “General Fangferror”,
[6652] = “Master Feardred”,
[3470] = “Rathorian”,
[2447] = “Narillasanz”,
[10263] = “Burning Felguard”,
[2191] = “Licilin”,
[14343] = “Olm the Wise”,
[8202] = “Cyclok the Mad”,
[47008] = “Fenwick Thatros”,
[14342] = “Ragepaw”,
[8214] = “Jalinde Summerdrake”,
[8218] = “Witherheart the Stalker”,
[8203] = “Kregg Keelhaul”,
[1037] = “Dragonmaw Battlemaster”,
[5935] = “Ironeye the Invincible”,
[5399] = “Veyzhak the Cannibal”,
[14339] = “Death Howl”,
[2744] = “Shadowforge Commander”,
[14269] = “Seeker Aqualon”,
[8281] = “Scald”,
[10icon_eek9] = “Stonespine”,
[584] = “Kazon”,
[10817] = “Duggan Wildhammer”,
[10821] = “Hed’mush the Rotting”,
[10825] = “Gish the Unmoving”,
[50159] = “Sambas”,
[44226] = “Sarltooth”,
[8282] = “Highlord Mastrogonde”,
[1425] = “Kubb”,
[2850] = “Broken Tooth”,
[14426] = “Harb Foulmountain”,
[8298] = “Akubar the Seer”,
[3872] = “Deathsworn Captain”,
[8302] = “Deatheye”,
[14446] = “Fingat”,
[10358] = “Fellicent’s Shade”,
[10077] = “Deathmaw”,
[14237] = “Oozeworm”,
[14430] = “Duskstalker”,
[1844] = “Foreman Macrid”,
[61] = “Thuros Lightfingers”,
[10356] = “Bayne”,
[14474] = “Zora”,
[14478] = “Huricanian”,
[1944] = “Rot Hide Bruiser”,
[5864] = “Swinegart Spearhide”,
[14490] = “Rippa”,
[8210] = “Razortalon”,
[763] = “Lost One Chieftain”,
[18241] = “Crusty”,
[14506] = “Lord Hel’nurath”,
[8204] = “Soriid the Devourer”,
[1948] = “Snarlmane”,
[44714] = “Fronkle the Disturbed”,
[2931] = “Zaricotl”,
[10641] = “Branch Snapper”,
[50085] = “Overlord Sunderfury”,
[44722] = “Twisted Reflection of Narain”,
[44227] = “Gazz the Loch-Hunter”,
[14235] = “The Rot”,
[50086] = “Tarvus the Vile”,
[8208] = “Murderous Blisterpaw”,
[14223] = “Cranky Benj”,
[8300] = “Ravage”,
[5838] = “Brokespear”,
[10643] = “Mugglefin”,
[5834] = “Azzere the Skyblade”,
[9604] = “Gorgon’och”,
[35189] = “Skoll”,
[596] = “Brainwashed Noble”,
[14277] = “Lady Zephris”,
[50056] = “Garr”,
[9596] = “Bannok Grimaxe”,
[47023] = “Thule Ravenclaw”,
[8981] = “Malfunctioning Reaver”,
[10119] = “Volchan”,
[4842] = “Earthcaller Halmgar”,
[1720] = “Bruegal Ironknuckle”,
[3398] = “Gesharahan”,
[5786] = “Snagglespear”,
[8213] = “Ironback”,
[599] = “Marisa du’Paige”,
[50057] = “Blazewing”,
[5847] = “Heggin Stonewhisker”,
[5828] = “Humar the Pridelord”,
[16179] = “Hyakiss the Lurker”,
[5icon_eek0] = “Marcus Bel”,
[7846] = “Teremus the Devourer”,
[5798] = “Thora Feathermoon”,
[14221] = “Gravis Slipknot”,
[5icon_eek8] = “Warlord Kolkanis”,
[14472] = “Gretheer”,
[49822] = “Jadefang”,
[2090] = “Ma’ruk Wyrmscale”,
[49913] = “Lady LaLa”,
[14477] = “Grubthor”,
[3295] = “Sludge Beast”,
[5822] = “Felweaver Scornn”,
[5824] = “Captain Flat Tusk”,
[5826] = “Geolord Mottle”,
[50009] = “Mobus”,
[5830] = “Sister Rathtalon”,
[5832] = “Thunderstomp”,
[51079] = “Captain Foulwind”,
[5836] = “Engineer Whirleygig”,
[50089] = “Julak-Doom”,
[10642] = “Eck’alom”,
[5842] = “Takk the Leaper”,
[14227] = “Hissperak”,
[14231] = “Drogoth the Roamer”,
[5848] = “Malgin Barleybrew”,
[5863] = “Geopriest Gukk’rok”,
[11688] = “Cursed Centaur”,
[5343] = “Lady Szallah”,
[5345] = “Diamond Head”,
[5347] = “Antilus the Soarer”,
[5349] = “Arash-ethis”,
[574] = “Naraxis”,
[14267] = “Emogg the Crusher”,
[14271] = “Ribchaser”,
[14275] = “Tamra Stormpike”,
[14279] = “Creepthess”,
[4339] = “Brimgore”,
[10199] = “Grizzle Snowpaw”,
[8278] = “Smoldar”,
[50409] = “Mysterious Camel Figurine”,
[39183] = “Scorpitar”,
[1936] = “Farmer Solliden”,
[1424] = “Master Digger”,
[10824] = “Ranger Lord Hawkspear”,
[100] = “Gruff Swiftbite”,
[50050] = “Shok’sharak”,
[521] = “Lupos”,
[9217] = “Spirestone Lord Magus”,
[8199] = “Warleader Krazzilak”,
[46992] = “Berard the Moon-Crazed”,
[8207] = “Emberwing”,
[8211] = “Old Cliff Jumper”,
[8215] = “Grimungous”,
[8219] = “Zul’arek Hatefowler”,
[50138] = “Karoma”,
[50154] = “Madexx”,
[5912] = “Deviate Faerie Dragon”,
[16181] = “Rokad the Ravager”,
[5916] = “Sentinel Amarassan”,
[2452] = “Skhowl”,
[2453] = “Lo’Grosh”,
[14344] = “Mongress”,
[47003] = “Bolgaff <The Mad Hunter>”,
[616] = “Chatter”,
[5928] = “Sorrow Wing”,
[5930] = “Sister Riven”,
[5932] = “Taskmaster Whipfang”,
[13896] = “Scalebeard”,
[8279] = “Faulty War Golem”,
[8283] = “Slave Master Blackheart”,
[5937] = “Vile Sting”,
[50410] = “Mysterious Camel Figurine”,
[14427] = “Gibblesnik”,
[14431] = “Fury Shelda”,
[8303] = “Grunter”,
[10081] = “Dustwraith”,
[453icon_eek] = “Ashtail”,
[10359] = “Sri’skulk”,
[2601] = “Foulbelly”,
[4425] = “Blind Hunter”,
[3068] = “Mazzranache”,
[50059] = “Golgarok”,
[47009] = “Aquarius the Unbound”,
[2476] = “Gosh-Haldir”,
[12431] = “Gorefang”,
[14479] = “Twilight Lord Everun”,
[503] = “Lord Malathrom”,
[14487] = “Gluggle”,
[14491] = “Kurmokk”,
[4015] = “Pridewing Patriarch”,
[14225] = “Prince Kellen”,
[1843] = “Foreman Jerris”,
[14233] = “Ripscale”,
[1119] = “Hammerspine”,
[2751] = “War Golem”,
[39186] = “Hellgazer”,
[45401] = “Whitefin”,
[7016] = “Lady Vespira”,
[44750] = “Caliph Scorpidsting”,
[50063] = “Akma’hat”,
[43720] = “\”Pokey\” Thornmantle”,
[46291] = “And a Dinosaur”,
[2162] = “Agal”,
[50411] = “Mysterious Camel Figurine”,
[39185] = “Slaverjaw”,
[5865] = “Dishu”,
[11497] = “The Razza”,
[1838] = “Scarlet Interrogator”,
[14433] = “Sludginn”,
[16854] = “Eldinarcus”,
[506] = “Sergeant Brashclaw”,
[462] = “Vultros”,
[3253] = “Silithid Harvester”,
[50060] = “Terborus”,
[47010] = “Indigos”,
[79] = “Narg the Taskmaster”,
[38453] = “Arcturis”,
[5841] = “Rocklance”,
[14281] = “Jimmy the Bleeder”,
},
[“Version”] = “4.0.3.6”,
[“NPCWorldIDs”] = {
[507] = 2,
[3535] = 1,
[22060] = 1,
[1260] = 2,
[8503] = 2,
[161icon_eek] = “Karazhan”,
[16184] = 2,
[9046] = 2,
[44759] = 1,
[100icon_eek] = “Zul’Farrak”,
[6583] = 1,
[6585] = 1,
[4066] = 1,
[7104] = 1,
[10639] = 1,
[2541] = 2,
[14224] = 2,
[14228] = 1,
[14232] = 1,
[14236] = 1,
[3058] = 1,
[1533] = 2,
[6118] = 1,
[14268] = 2,
[14272] = 2,
[14276] = 2,
[142icon_eek] = 2,
[10196] = 1,
[10200] = 1,
[3581] = 2,
[6647] = 1,
[6649] = 1,
[6651] = 1,
[3586] = 2,
[771] = 2,
[45399] = 2,
[8200] = 1,
[8204] = 1,
[47012] = 2,
[14344] = 1,
[8216] = 2,
[519] = 2,
[4132] = 1,
[520] = 2,
[10823] = 2,
[10827] = 2,
[82icon_eek] = 2,
[44761] = 1,
[14424] = 2,
[14428] = 1,
[14432] = 1,
[8304] = 2,
[45384] = 2,
[14448] = 2,
[2600] = 2,
[46981] = 2,
[50063] = 1,
[2603] = 2,
[2604] = 2,
[14476] = 1,
[2606] = 2,
[6228] = “Gnomeregan”,
[14488] = 2,
[14492] = 2,
[2108] = 2,
[45257] = 2,
[8923] = “Blackrock Depths”,
[11498] = 1,
[45369] = 2,
[3652] = 1,
[1063] = 2,
[50064] = “Uldum”,
[8979] = 2,
[99] = 2,
[33776] = 4,
[534] = 2,
[5785] = 1,
[22062] = 2,
[43613] = 1,
[5797] = 1,
[1837] = 2,
[1838] = 2,
[5icon_eek7] = 1,
[5icon_eek9] = 1,
[45785] = 2,
[45icon_eek1] = 2,
[1841] = 2,
[5823] = 1,
[5827] = 1,
[5829] = 1,
[5831] = 1,
[5835] = 1,
[5837] = 1,
[1847] = 2,
[10644] = 1,
[1848] = 2,
[14229] = 1,
[1849] = 2,
[5849] = 1,
[5851] = 1,
[1851] = 2,
[5346] = 1,
[5859] = 1,
[5350] = 1,
[5352] = 1,
[5354] = 1,
[14273] = 2,
[2172] = 1,
[14281] = 2,
[10197] = 1,
[10201] = 1,
[1531] = 2,
[51658] = 2,
[51661] = 2,
[8978] = 2,
[1850] = 2,
[50065] = 1,
[2184] = 1,
[1839] = 2,
[8201] = 1,
[8205] = 1,
[10640] = 1,
[14345] = 1,
[8217] = 2,
[51663] = 2,
[2192] = 1,
[5400] = 2,
[43icon_eek] = 1,
[5915] = 1,
[6581] = 1,
[2162] = 1,
[45258] = 2,
[45402] = 2,
[462] = 2,
[5787] = 1,
[3735] = 1,
[5931] = 1,
[45739] = 2,
[8277] = 2,
[45260] = 2,
[4030] = 1,
[1106] = 2,
[14425] = 2,
[14429] = 1,
[14433] = 2,
[39186] = 1,
[8296] = 2,
[14445] = 2,
[45404] = 2,
[1843] = 2,
[45401] = 2,
[16855] = 2,
[2609] = 2,
[1112] = 2,
[14473] = 1,
[12433] = 2,
[10393] = “Stratholme”,
[5841] = 1,
[10357] = 2,
[11383] = 2,
[12432] = 2,
[9602] = 2,
[18684] = 3,
[32491] = 4,
[11447] = 1,
[43488] = 1,
[1885] = 2,
[7015] = 1,
[7017] = 1,
[45740] = 2,
[44750] = 1,
[8924] = 2,
[3773] = 1,
[2752] = 2,
[2753] = 1,
[2754] = 2,
[1119] = 2,
[2186] = 1,
[7895] = 1,
[947] = 2,
[3270] = 1,
[3672] = 1,
[14475] = 1,
[14471] = 1,
[8976] = 2,
[2605] = 2,
[2602] = 2,
[7057] = 2,
[1130] = 2,
[472] = 2,
[2258] = 2,
[3792] = 1,
[1132] = 2,
[2601] = 2,
[14447] = 2,
[471] = 2,
[2598] = 2,
[16181] = “Karazhan”,
[8299] = 2,
[2779] = 2,
[44224] = 2,
[1137] = 2,
[44767] = 1,
[10078] = 2,
[6582] = 1,
[6584] = 1,
[47386] = 1,
[1140] = 2,
[1920] = 2,
[45811] = 2,
[51662] = 2,
[572] = 2,
[1398] = 2,
[50053] = 1,
[1910] = 2,
[573] = 2,
[1911] = 2,
[14222] = 2,
[14226] = 1,
[14230] = 1,
[14234] = 1,
[47387] = 1,
[10081] = “Zul’Farrak”,
[5934] = 1,
[10826] = 2,
[12037] = 1,
[7137] = 1,
[10818] = 2,
[14266] = 2,
[14270] = 2,
[1552] = 2,
[14278] = 2,
[44225] = 2,
[10198] = 1,
[10202] = 1,
[3736] = 1,
[6646] = 1,
[6648] = 1,
[6650] = 1,
[6652] = 1,
[5356] = 1,
[8212] = 2,
[5937] = 1,
[45262] = 2,
[45398] = 2,
[8202] = 1,
[1037] = 2,
[14342] = 1,
[8214] = 2,
[8218] = 2,
[3470] = 1,
[2447] = 2,
[5935] = 1,
[14343] = 1,
[47008] = 2,
[8203] = 1,
[521] = 2,
[10icon_eek9] = “Stratholme”,
[584] = 2,
[10817] = 2,
[10821] = 2,
[10825] = 2,
[5399] = 2,
[44226] = 2,
[8282] = 2,
[1425] = 2,
[14339] = 1,
[14426] = 1,
[8298] = 2,
[3872] = “Shadowfang Keep”,
[2744] = 2,
[14269] = 2,
[10358] = 2,
[8281] = 2,
[50159] = 2,
[8278] = 2,
[10077] = 2,
[61] = 2,
[14446] = 2,
[14474] = 1,
[14478] = 1,
[1944] = 2,
[14430] = 1,
[14490] = 2,
[1844] = 2,
[10356] = 2,
[18241] = 1,
[14506] = 1,
[574] = 2,
[1948] = 2,
[763] = 2,
[5864] = 1,
[8210] = 2,
[10641] = 1,
[44722] = 1,
[44227] = 2,
[5863] = 1,
[50086] = 2,
[2931] = 2,
[8208] = 1,
[50085] = 2,
[14235] = 1,
[10643] = 1,
[14277] = 2,
[14223] = 2,
[35189] = 4,
[596] = 2,
[47023] = 2,
[50056] = 1,
[5838] = 1,
[4842] = “Razorfen Kraul”,
[8981] = 2,
[5834] = 1,
[9604] = 2,
[3295] = 1,
[5786] = 1,
[14477] = 1,
[599] = 2,
[8213] = 2,
[2090] = 2,
[16179] = “Karazhan”,
[5icon_eek0] = 1,
[7846] = 2,
[3398] = 1,
[5798] = 1,
[5icon_eek8] = 1,
[50057] = 1,
[5847] = 1,
[14221] = 2,
[14472] = 1,
[5822] = 1,
[5824] = 1,
[5826] = 1,
[5828] = 1,
[5830] = 1,
[5832] = 1,
[10119] = 2,
[5836] = 1,
[50089] = 2,
[10642] = 1,
[5842] = 1,
[14227] = 1,
[14231] = 1,
[5848] = 1,
[8300] = 2,
[11688] = 1,
[5343] = 1,
[5345] = 1,
[5347] = 1,
[5349] = 1,
[44714] = 1,
[14267] = 2,
[14271] = 2,
[14275] = 2,
[14279] = 2,
[4339] = 1,
[10199] = 1,
[14237] = 1,
[50409] = 1,
[39183] = 1,
[8302] = 2,
[2850] = 1,
[1936] = 2,
[1424] = 2,
[10824] = 2,
[100] = 2,
[8199] = 1,
[46992] = 2,
[8207] = 1,
[8211] = 2,
[8215] = 2,
[8219] = 2,
[50138] = 2,
[50154] = 1,
[5912] = “Wailing Caverns”,
[2191] = 1,
[5916] = 1,
[2452] = 2,
[2453] = 2,
[14340] = 1,
[2175] = 1,
[616] = 2,
[5928] = 1,
[5930] = 1,
[5932] = 1,
[13896] = 1,
[8279] = 2,
[8283] = 2,
[5933] = 1,
[50410] = 1,
[14427] = 1,
[14431] = 1,
[8303] = 2,
[10828] = 2,
[453icon_eek] = 2,
[10359] = 2,
[10559] = 1,
[4425] = “Razorfen Kraul”,
[47003] = 2,
[50059] = “Deepholm”,
[47009] = 2,
[2476] = 2,
[12431] = 2,
[14479] = 1,
[503] = 2,
[14487] = 2,
[14491] = 2,
[4015] = 1,
[10647] = 1,
[3253] = 1,
[14225] = 1,
[1399] = 2,
[14233] = 1,
[2283] = 2,
[2749] = 2,
[7016] = 1,
[2751] = 2,
[12237] = “Maraudon”,
[43720] = 1,
[38453] = 4,
[50411] = 1,
[39185] = 1,
[10082] = “Zul’Farrak”,
[11497] = 1,
[5799] = 1,
[45771] = 2,
[16854] = 2,
[506] = 2,
[8297] = 2,
[8301] = 2,
[50060] = “Deepholm”,
[47010] = 2,
[79] = 2,
[5865] = 1,
[3068] = 1,
[8660] = 1,
},
}

Forum Timezone: America/Los_Angeles
Most Users Ever Online: 485
Currently Online:
Guest(s) 29
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Ozolin: 420
Darrwyn: 367
AFK for a bit: 366
Agio: 349
Celika: 293
Windolicker: 225
lawman30: 206
Member Stats:
Guest Posters: 0
Members: 15668
Moderators: 5
Admins: 1
Forum Stats:
Groups: 4
Forums: 11
Topics: 1393
Posts: 9479
Newest Members:
Moderators: Anj: 461, Takaas: 870, Niika: 1012, Drach: 491, Drackmire: 0
Administrators: Garwulf: 1003