diff --git a/README.md b/README.md
new file mode 100644
index 0000000..319dfe0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,30 @@
+# Recipe Radar
+
+##Description
+Recipe Radar is a World of Warcraft UI addon that assists players in finding recipes. It knows about vendors who sell recipes in the current region or by profession. It has a number of filtering options and can even locate vendors on the world map.
+
+
+
+
+
+When you get in game, you may want to map a key to toggle Recipe Radar.
+You should be able to find the option to do this in your Key Bindings menu,
+all the way at the bottom. Otherwise, you can hit the new icon on your
+minimap to open Recipe Radar or use the slash command, '/rrdr'.
+
+#Last changes:
+
+- Added MBB compatibility (better minimap button managment),
+- Added RUru localization by Maus
+
+#Download
+
+https://github.com/laytya/RecipeRadar-vanilla
+
+#Installation
+
+Just copy "RecipeRadar" folder to your addon's directory.
+
+#Credits
+
+originaly made by Jay Miller [jnmiller@cryptofreak.org]
diff --git a/RecipeRadar/Availability.lua b/RecipeRadar/Availability.lua
new file mode 100644
index 0000000..5d581f1
--- /dev/null
+++ b/RecipeRadar/Availability.lua
@@ -0,0 +1,440 @@
+
+-- Availability.lua: logic for the availability of recipes to characters
+-- $Id: Availability.lua 451 2006-09-11 03:23:04Z jnmiller $
+
+-----------------------------------------------------------------------------
+-- Generic, abstracted availability entry points
+-----------------------------------------------------------------------------
+
+function RecipeRadar_Availability_Init()
+
+ if (RecipeRadar_Options.RealmAvailability) then
+ RecipeRadar_RealmAvailDropDown:Show()
+ RecipeRadar_PersonAvailDropDown:Hide()
+ else
+ RecipeRadar_PersonAvailDropDown:Show()
+ RecipeRadar_RealmAvailDropDown:Hide()
+ end
+
+end
+
+function RecipeRadar_Availability_Toggle()
+
+ if (RecipeRadar_RealmAvailDropDown:IsVisible()) then
+ RecipeRadar_PersonAvailDropDown:Show()
+ RecipeRadar_RealmAvailDropDown:Hide()
+ RecipeRadar_Options.RealmAvailability = false
+ else
+ RecipeRadar_RealmAvailDropDown:Show()
+ RecipeRadar_PersonAvailDropDown:Hide()
+ RecipeRadar_Options.RealmAvailability = true
+ end
+
+ RecipeRadar_FrameUpdate()
+
+end
+
+-----------------------------------------------------------------------------
+-- Indicator for vendor/recipe item lists
+-----------------------------------------------------------------------------
+
+-- Returns a colored indication of a recipe's availability.
+function RecipeRadar_Availability_GetIndicator(recipe)
+
+ if (RecipeRadar_Options.RealmAvailability) then
+ return RecipeRadar_RealmAvail_GetIndicator(recipe)
+ else
+ return RecipeRadar_PersonAvail_GetIndicator(recipe)
+ end
+
+end
+
+-- Returns a string with the recipe's skill in parens.
+function RecipeRadar_PersonAvail_GetIndicator(recipe)
+
+ return format(TEXT(PARENS_TEMPLATE), recipe.Skill)
+
+end
+
+-- Returns a string with a little colored realm-wide availability
+-- indicator for the main vendor/recipe list.
+function RecipeRadar_RealmAvail_GetIndicator(recipe)
+
+ local key = RecipeRadar_Availability_GetKey(recipe)
+ if (not key) then return "" end
+
+ return RecipeRadar_ColorToCode(RecipeRadar_Availabilities[key].Color) ..
+ "*" .. FONT_COLOR_CODE_CLOSE
+
+end
+
+-----------------------------------------------------------------------------
+-- Availability tooltip code
+-----------------------------------------------------------------------------
+
+-- Populates the tooltip that displays on recipe button mouseover.
+function RecipeRadar_Availability_CreateTooltip(recipe)
+
+ local recipe_name = RecipeRadar_GetSafeItemInfo(recipe.ID)
+
+ if (recipe_name == RRS("Uncached Recipe")) then
+
+ -- uncached recipes have a special tooltip and warning
+ -- I'm just coloring 'Warning:' red here for max contrast
+ local warn = RRS("Warning: if your server has")
+ local colon = string.find(warn, ":")
+ local warning =
+ RecipeRadar_ColorToCode(RecipeRadar_Colors.TooltipWarning) ..
+ string.sub(warn, 1, colon) .. FONT_COLOR_CODE_CLOSE ..
+ string.sub(warn, colon + 1)
+
+ -- the layout of the tooltip, with colors for each line
+ local tooltip = {
+ { text = RRS("Uncached Recipe"), color = RecipeRadar_Colors.UncachedRecipe },
+ { text = "", color = nil },
+ { text = RRS("You may mouse over the [?]"), color = RecipeRadar_Colors.TooltipHeading },
+ { text = RRS("icon to lookup this recipe."), color = RecipeRadar_Colors.TooltipHeading },
+ { text = "", color = nil },
+ { text = warning, color = RecipeRadar_Colors.TooltipHeading },
+ { text = RRS("not yet seen this item, you"), color = RecipeRadar_Colors.TooltipHeading },
+ { text = RRS("will be disconnected!"), color = RecipeRadar_Colors.TooltipHeading }, }
+ for _, line in tooltip do
+ RecipeRadar_AvailabilityTooltip_AddLine(line.text, line.color)
+ end
+ return
+
+ end
+
+ local avail, prosp, known, line_info = { }, { }, { }, { }
+ local num_avail, num_prosp, num_known = 0, 0, 0
+
+ -- recipe labels are not saved in the skill database
+ recipe_name = RecipeRadar_TrimRecipeLabel(recipe_name)
+
+ -- iterate through each character on this realm
+ for player, player_info in RecipeRadar_SkillDB[GetRealmName()] do
+
+ -- do the rest only if the character has the profession
+ if (player_info.Professions[recipe.Type] and
+ player_info.Professions[recipe.Type].Rank > 0) then
+
+ -- get player's rank
+ local rank = player_info.Professions[recipe.Type].Rank
+
+ -- get player's relevant faction standing, if any
+ local rep = nil
+ if (recipe.Faction and player_info.Factions[recipe.Faction]) then
+ rep = getglobal("FACTION_STANDING_LABEL" ..
+ player_info.Factions[recipe.Faction])
+ end
+
+ -- get player's specialty, if any
+ local spec = nil
+ if (recipe.Specialty) then
+ spec = player_info.Professions[recipe.Type].Specialty
+ end
+
+ -- now test all of the possible recipe statuses
+ if (RecipeRadar_Availability_IsAvailable(player, recipe)) then
+ num_avail = num_avail + 1
+ avail[num_avail] = {
+ Name = player, Rank = rank, Rep = rep, Spec = spec }
+
+ elseif (RecipeRadar_Availability_IsProspect(player, recipe)) then
+ num_prosp = num_prosp + 1
+ prosp[num_prosp] = {
+ Name = player, Rank = rank, Rep = rep, Spec = spec }
+
+ elseif (RecipeRadar_Availability_IsKnown(player, recipe)) then
+ num_known = num_known + 1
+ known[num_known] = {
+ Name = player, Rank = rank, Rep = rep, Spec = spec }
+
+ else
+ local bleh = 0
+ if (knows) then bleh = 1 end
+ RecipeRadar_Print("ASSERT FAILED: " .. player .. " - " ..
+ recipe.Type .. ", " .. recipe_name .. ", " .. recipe.Skill ..
+ " (have " .. rank .. ") knows = " .. bleh)
+ end
+
+ end
+
+ end
+
+ -- populate the "available now" entries
+ if (num_avail > 0) then
+
+ RecipeRadar_AvailabilityTooltip_AddLine(
+ RecipeRadar_Availabilities["LearnableByPlayer"].Tooltip.Heading,
+ RecipeRadar_Colors.TooltipHeading)
+ table.sort(avail, RecipeRadar_Availability_NameSort)
+
+ for _, line in avail do
+
+ local color = RecipeRadar_Colors.LearnableByAlt
+ if (line.Name == UnitName("player")) then
+ color = RecipeRadar_Colors.LearnableByPlayer
+ end
+
+ local rank_suffix = line.Rank
+ if (line.Rep) then -- reputation is relevant to this line
+ rank_suffix = rank_suffix .. " - " .. line.Rep
+ end
+ rank_suffix = format(TEXT(PARENS_TEMPLATE), rank_suffix)
+
+ RecipeRadar_AvailabilityTooltip_AddLine(
+ " " .. line.Name .. " " .. rank_suffix, color)
+
+ end
+
+ end
+
+ -- populate the "available soon" entries
+ if (num_prosp > 0) then
+
+ if (num_avail > 0) then
+ RecipeRadar_AvailabilityTooltip_AddLine()
+ end
+ RecipeRadar_AvailabilityTooltip_AddLine(
+ RecipeRadar_Availabilities["ProspectForPlayer"].Tooltip.Heading,
+ RecipeRadar_Colors.TooltipHeading)
+ table.sort(prosp, RecipeRadar_Availability_NameSort)
+
+ for _, line in prosp do
+
+ local color = RecipeRadar_Colors.ProspectForAlt
+ if (line.Name == UnitName("player")) then
+ color = RecipeRadar_Colors.ProspectForPlayer
+ end
+
+ local factors = RecipeRadar_Availability_GetLimitingFactors(
+ line.Name, recipe)
+
+ local rank = string.format(RRS("%d of %d"), line.Rank, recipe.Skill)
+ if (factors["rank"]) then
+ rank = RecipeRadar_HighlightString(rank, color)
+ end
+ local suffix = rank -- always include rank in the tooltip
+
+ if (line.Rep) then
+ local rep = line.Rep
+ if (factors["rep"]) then
+ rep = RecipeRadar_HighlightString(rep, color)
+ end
+ suffix = suffix .. " - " .. rep
+ end
+
+ if (line.Spec) then
+ local spec = line.Spec
+ if (factors["spec"]) then
+ spec = RecipeRadar_HighlightString(spec, color)
+ end
+ suffix = suffix .. " - " .. spec
+ end
+
+ suffix = format(TEXT(PARENS_TEMPLATE), suffix)
+ RecipeRadar_AvailabilityTooltip_AddLine(
+ " " .. line.Name .. " " .. suffix, color)
+
+ end
+
+ end
+
+ -- populate the "already known" entries
+ if (num_known > 0) then
+
+ if (num_prosp > 0 or num_avail > 0) then
+ RecipeRadar_AvailabilityTooltip_AddLine()
+ end
+ RecipeRadar_AvailabilityTooltip_AddLine(
+ RecipeRadar_Availabilities["KnownByPlayer"].Tooltip.Heading,
+ RecipeRadar_Colors.TooltipHeading)
+ table.sort(known, RecipeRadar_Availability_NameSort)
+
+ for _, line in known do
+
+ local color = RecipeRadar_Colors.KnownByAlt
+ if (line.Name == UnitName("player")) then
+ color = RecipeRadar_Colors.KnownByPlayer
+ end
+
+ local rank_suffix = line.Rank
+ if (line.Rep) then -- reputation is relevant to this line
+ rank_suffix = rank_suffix .. " - " .. line.Rep
+ end
+ rank_suffix = format(TEXT(PARENS_TEMPLATE), rank_suffix)
+
+ RecipeRadar_AvailabilityTooltip_AddLine(
+ " " .. line.Name .. " " .. rank_suffix, color)
+
+ end
+
+ end
+
+end
+
+-- Boolean test for availability used by CreateTooltip(), above
+function RecipeRadar_Availability_NameSort(line1, line2)
+
+ return line1.Name < line2.Name
+
+end
+
+-- Returns a set of booleans from which one can derive the availability
+-- of any recipe relative to any player.
+function RecipeRadar_Availability_GetBooleans(player, recipe)
+
+ local info = RecipeRadar_SkillDB_GetSafePlayerDB(player)
+
+ -- if the player doesn't even have the profession, just return
+ if (not info.Professions[recipe.Type]) then return false end
+
+ local recipe_name = RecipeRadar_GetSafeItemInfo(recipe.ID)
+ recipe_name = RecipeRadar_TrimRecipeLabel(recipe_name)
+
+ if (recipe_name == RRS("Uncached Recipe")) then
+ return nil
+ end
+
+ -- otherwise, get the other relevant booleans
+ local has_rec = info.Professions[recipe.Type].Recipes[recipe_name]
+ local has_rank = info.Professions[recipe.Type].Rank >= recipe.Skill
+ local has_rep = RecipeRadar_SkillDB_HasRep(player, recipe)
+ local has_spec = RecipeRadar_SkillDB_HasSpec(player, recipe)
+
+ return true, has_rec, has_rank, has_rep, has_spec
+
+end
+
+-- Boolean test for availability used by CreateTooltip() and GetKey()
+function RecipeRadar_Availability_IsAvailable(player, recipe)
+
+ local has_prof, has_rec, has_rank, has_rep, has_spec =
+ RecipeRadar_Availability_GetBooleans(player, recipe)
+
+ return (has_prof and not has_rec and has_rank and has_rep and has_spec)
+
+end
+
+-- Boolean test for availability used by CreateTooltip() and GetKey()
+function RecipeRadar_Availability_IsProspect(player, recipe)
+
+ local has_prof, has_rec, has_rank, has_rep, has_spec =
+ RecipeRadar_Availability_GetBooleans(player, recipe)
+
+ return (has_prof and not has_rec and
+ (not has_rank or not has_rep or not has_spec))
+
+end
+
+-- Boolean test for availability used by CreateTooltip() and GetKey()
+function RecipeRadar_Availability_IsKnown(player, recipe)
+
+ local has_prof, has_rec, has_rank, has_rep, has_spec =
+ RecipeRadar_Availability_GetBooleans(player, recipe)
+
+ return (has_prof and has_rec and has_rank and has_rep and has_spec)
+
+end
+
+-- Returns a table of strings that specify why the given recipe is not
+-- available to the given player.
+function RecipeRadar_Availability_GetLimitingFactors(player, recipe)
+
+ local has_prof, has_rec, has_rank, has_rep, has_spec =
+ RecipeRadar_Availability_GetBooleans(player, recipe)
+ local factors = { }
+
+ if (not has_prof) then factors["prof"] = 1 end
+ if (not has_rec) then factors["rec"] = 1 end
+ if (not has_rank) then factors["rank"] = 1 end
+ if (not has_rep) then factors["rep"] = 1 end
+ if (not has_spec) then factors["spec"] = 1 end
+
+ return factors
+
+end
+
+-----------------------------------------------------------------------------
+-- Availability testing for filtering and dropdowns
+-----------------------------------------------------------------------------
+
+-- This function tests whether the recipe is learnable either by
+-- the player or an alt if realm-wide availability is on.
+function RecipeRadar_Availability_IsLearnable(recipe, set_filter)
+
+ local name = RecipeRadar_GetSafeItemInfo(recipe.ID)
+
+ local avail = RecipeRadar_Availability_GetKey(recipe)
+ if (not avail) then return false end
+
+ if (set_filter) then
+ recipe.IsFilteredByAvailability =
+ RecipeRadar_IsAvailabilityFiltered(avail)
+ end
+
+ if (RecipeRadar_Options.RealmAvailability) then
+ return avail == "LearnableByPlayer" or avail == "LearnableByAlt"
+ else
+ return avail == "LearnableByPlayer"
+ end
+
+end
+
+-- Wrapper for the above that makes its functionality clearer.
+function RecipeRadar_Availability_SetAvailabilityFilter(recipe)
+
+ RecipeRadar_Availability_IsLearnable(recipe, true)
+
+end
+
+-- Generic function returns the key to the RecipeRadar_Availabilities
+-- table so the caller can get whatever related info she needs.
+function RecipeRadar_Availability_GetKey(recipe)
+
+ if (RecipeRadar_Availability_IsAvailable(player, recipe)) then
+ return "LearnableByPlayer"
+
+ elseif (RecipeRadar_Options.RealmAvailability and
+ RecipeRadar_Availability_IsSatisfiedByAlt(recipe,
+ RecipeRadar_Availability_IsAvailable)) then
+ return "LearnableByAlt"
+
+ elseif (RecipeRadar_Availability_IsProspect(player, recipe)) then
+ return "ProspectForPlayer"
+
+ elseif (RecipeRadar_Options.RealmAvailability and
+ RecipeRadar_Availability_IsSatisfiedByAlt(recipe,
+ RecipeRadar_Availability_IsProspect)) then
+ return "ProspectForAlt"
+
+ elseif (RecipeRadar_Availability_IsKnown(player, recipe)) then
+ return "KnownByPlayer"
+
+ elseif (RecipeRadar_Options.RealmAvailability and
+ RecipeRadar_Availability_IsSatisfiedByAlt(recipe,
+ RecipeRadar_Availability_IsKnown)) then
+ return "KnownByAlt"
+
+ else
+ return "NotApplicable"
+ end
+
+end
+
+-- Boolean test for availability used by GetKey(), above.
+function RecipeRadar_Availability_IsSatisfiedByAlt(recipe, sat_func)
+
+ for player, player_info in RecipeRadar_SkillDB[GetRealmName()] do
+
+ if (player_info.Team ~= RecipeRadar_GetOpposingFaction("player") and
+ player ~= UnitName("player") and
+ sat_func(player, recipe)) then
+ return true
+ end
+
+ end
+ return false
+
+end
diff --git a/RecipeRadar/AvailabilityTooltip.lua b/RecipeRadar/AvailabilityTooltip.lua
new file mode 100644
index 0000000..7ba415b
--- /dev/null
+++ b/RecipeRadar/AvailabilityTooltip.lua
@@ -0,0 +1,98 @@
+
+-- AvailabilityTooltip.lua: handles the recipe availability tooltip
+-- $Id: AvailabilityTooltip.lua 282 2006-04-12 08:41:25Z jnmiller $
+
+function RecipeRadar_AvailabilityTooltip_AddLine(msg, color)
+
+ if (RecipeRadarAvailabilityTooltip.Lines ==
+ RecipeRadar_AvailabilityTooltip_MaxLines) then
+ RecipeRadar_Print("ASSERT FAILED: tooltip has too many lines.")
+ return
+ end
+
+ local line_num = RecipeRadarAvailabilityTooltip.Lines + 1
+ local line = getglobal("RecipeRadarAvailabilityTooltipText" .. line_num)
+
+ -- handle null colors
+ if (color) then
+ line:SetTextColor(color.r, color.g, color.b)
+ else
+ line:SetTextColor(1, 1, 1)
+ end
+
+ -- handle null messages
+ if (not msg or msg == "") then
+ line:SetText(" ")
+ else
+ line:SetText(msg)
+ end
+
+ line:Show()
+
+ RecipeRadarAvailabilityTooltip.Lines = line_num
+
+end
+
+function RecipeRadar_AvailabilityTooltip_Show(frame)
+
+ if (not frame or RecipeRadarAvailabilityTooltip.Lines == 0) then
+ RecipeRadar_AvailabilityTooltip_Hide()
+ return
+ end
+
+ -- calculate the width of the tooltip
+ local height = 20
+ local width = 0
+ for i = 1, RecipeRadarAvailabilityTooltip.Lines do
+ local line = getglobal("RecipeRadarAvailabilityTooltipText" .. i)
+ height = height + line:GetHeight() + 2
+ if (line:GetWidth() + 20 > width) then
+ width = line:GetWidth() + 20
+ end
+ end
+
+ RecipeRadarAvailabilityTooltip:SetWidth(width)
+ RecipeRadarAvailabilityTooltip:SetHeight(height)
+ RecipeRadarAvailabilityTooltip:ClearAllPoints()
+
+ -- place on the left or right according to the position of the main frame
+ local frame_left = (frame:GetLeft() or 0) - width
+ local frame_right = GetScreenWidth() - (frame:GetRight() or 0) - width
+
+ local offset = 0
+ if (RecipeRadar_Options.ActiveTab == 2) then
+ offset = RECIPERADAR_VENDOR_OFFSET
+ end
+
+ if (frame_left < frame_right) then
+ if (RecipeRadarListScrollFrame:IsVisible()) then
+ RecipeRadarAvailabilityTooltip:SetPoint(
+ "TOPLEFT", frame:GetName(), "TOPRIGHT", 35, 0)
+ else
+ RecipeRadarAvailabilityTooltip:SetPoint(
+ "TOPLEFT", frame:GetName(), "TOPRIGHT", 13, 0)
+ end
+ else
+ RecipeRadarAvailabilityTooltip:SetPoint(
+ "TOPRIGHT", frame:GetName(), "TOPLEFT", -33 + offset, 0)
+ end
+
+ -- basic drawing code
+ RecipeRadarAvailabilityTooltip:SetBackdropColor(
+ TOOLTIP_DEFAULT_BACKGROUND_COLOR.r,
+ TOOLTIP_DEFAULT_BACKGROUND_COLOR.g,
+ TOOLTIP_DEFAULT_BACKGROUND_COLOR.b)
+ RecipeRadarAvailabilityTooltip:Show()
+
+end
+
+function RecipeRadar_AvailabilityTooltip_Hide()
+
+ for i = 1, RecipeRadarAvailabilityTooltip.Lines do
+ getglobal("RecipeRadarAvailabilityTooltipText" .. i):Hide()
+ end
+
+ RecipeRadarAvailabilityTooltip.Lines = 0
+ --RecipeRadarAvailabilityTooltip:Hide()
+
+end
diff --git a/RecipeRadar/AvailabilityTooltip.xml b/RecipeRadar/AvailabilityTooltip.xml
new file mode 100644
index 0000000..a8c77b4
--- /dev/null
+++ b/RecipeRadar/AvailabilityTooltip.xml
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -- this allows for 18 alts per server, though I think 8 is the max
+ RecipeRadar_AvailabilityTooltip_MaxLines = 24
+ RecipeRadarAvailabilityTooltip.Lines = 0
+
+
+ RecipeRadar_AvailabilityTooltip_Hide()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RecipeRadar/Bindings.xml b/RecipeRadar/Bindings.xml
new file mode 100644
index 0000000..2b627cd
--- /dev/null
+++ b/RecipeRadar/Bindings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ RecipeRadar_Toggle()
+
+
diff --git a/RecipeRadar/ChangeLog.txt b/RecipeRadar/ChangeLog.txt
new file mode 100644
index 0000000..a8538ce
--- /dev/null
+++ b/RecipeRadar/ChangeLog.txt
@@ -0,0 +1,107 @@
+Recipe Radar (vanilla) ChangeLog
+
+v1.14; 2.02.2017
+
+- Added MBB compatibility (better minimap button managment),
+- Added RUru localization by Maus
+- backported some fixes from original 1.14 release
+
+v1.11; September 18, 2006
+
+- Fixed item linking bug (thank you, TDurden!).
+- Fixed a bug that could occur for unlucky Dragonscale/Elemental LWers
+ and Armorsmiths (thank you, Arilaw!).
+
+v1.10; September 16, 2006
+
+- I'd forgotten to enable specialization checking! It should now work.
+- Auctioneer and Recipe Book are now supported in the recipe icon
+ mouseover. Thanks very much to borohir for this functionality!
+
+v1.9; September 5, 2006
+
+- Recipes names are now cached when learned. This should make new
+ Blizzard patches less of a hassle.
+- Availability checking now takes faction reputation and trade skill
+ specialties into account.
+- Adjusted some vendor information.
+- Reduced memory usage significantly.
+
+v1.8; July 11, 2006
+
+- Several new German region names were missing in v1.7. Hopefully they
+ are all correct now.
+- Adjusted some vendor information.
+
+v1.7; June 24, 2006
+
+- Fixed the nasty profession selection bug for non-English versions.
+- Profession icons should now show up for non-English versions.
+- Unlearning a profession should now be handled correctly.
+- Fixed several new 1.11 German region names.
+- Added the new 1.11 Cenarion Circle recipes.
+- Several vendors were incorrectly marked as Alliance-only (thank you,
+ Howlin!).
+
+v1.6; June 21, 2006
+
+- Added a right-click context menu to the scroll frame. From this
+ menu users can map vendors and expand/collapse all items.
+- Fixed bug causing non-English profession stuff to suck (thank you
+ ElKano and Jeremy Gurr!).
+- Alts of a different team should no longer appear in the availability
+ list.
+- Adjusted the German translation.
+- Adjusted some vendor locations.
+
+v1.5; May 11, 2006
+
+- All recipes that are named differently after learning (eg. transmutes)
+ should now show up correctly as known or not. This applies, in theory,
+ to all locales.
+- Revamped the filtering code and fixed filtering, I hope, for non-
+ English versions.
+- Nonapplicable professions and known recipes are now different filtering
+ categories in both availability modes.
+- Fixed the incompatibility with Metamap, more or less.
+- Tweaked the German translation and some vendor locations.
+
+v1.4; May 7, 2006
+
+- Revised German translation (thanks to DJMars and Elkano!).
+- Dropdown filters are now effected every time Recipe Radar is opened.
+ Filters should now work much more intuitively.
+- Fixed a bug that sometimes caused an error message on startup and/or
+ zone changes.
+- Changed Alliance color to blue.
+- Added a couple of missing vendors/recipes and improved the positions of
+ several others.
+- Enchant Bracer - Healing should now show up correctly as known or not.
+
+v1.3; April 29, 2006
+
+- Fixed a bug that was preventing about half of the maps from displaying
+ on non-English clients.
+- Adjusted some vendor locations.
+
+v1.2; April 28, 2006
+
+- Fixed chat message parsing bugs in non-English versions.
+- Added an option to auto-map (but not auto-unmap!) contributive vendors.
+- Added the number of learnable recipes to mapped vendor tooltips.
+- Changed the '/rr' slash command to '/rrdr'.
+- Map tooltips will hopefully no longer run off the screen.
+
+v1.1; April 27, 2006
+
+- Added support for the frFR locale. (I hope it works..)
+- Added the ability to view regions other than the current region. The
+ relevant settings now appear in the Options frame.
+- Instance vendors can no longer be mapped.
+- Non-English versions should now be able to use the dropdowns (I hope).
+- Now accounting for WoW's "Mithril Head Trout" bug - it should now show
+ up correctly as known or not.
+
+v1.0; April 24, 2006
+
+- Initial public release!
diff --git a/RecipeRadar/DropDowns.lua b/RecipeRadar/DropDowns.lua
new file mode 100644
index 0000000..07a2ec3
--- /dev/null
+++ b/RecipeRadar/DropDowns.lua
@@ -0,0 +1,546 @@
+
+-- DropDowns.lua: code concerned the dropdowns and corresponding filters
+-- $Id: DropDowns.lua 433 2006-08-31 20:22:07Z jnmiller $
+
+function RecipeRadar_DropDowns_Init()
+
+ -- can't use the OnLoad events because we use saved variables
+ RecipeRadar_TeamDropDown_OnLoad()
+ RecipeRadar_Prof1DropDown_OnLoad()
+ RecipeRadar_RealmAvailDropDown_OnLoad()
+ RecipeRadar_Prof2DropDown_OnLoad()
+ RecipeRadar_PersonAvailDropDown_OnLoad()
+
+ -- initialize the recipe filters and recipe tab icon
+ RecipeRadar_SetProf2Filter(RecipeRadar_Options.CurrentProfession)
+
+ if (RecipeRadar_Options.RealmAvailability) then
+ return RecipeRadar_RealmAvailDropDown:Show()
+ else
+ return RecipeRadar_PersonAvailDropDown:Show()
+ end
+
+end
+
+-----------------------------------------------------------------------------
+-- Realm-wide availability drop down and filtering
+-----------------------------------------------------------------------------
+
+function RecipeRadar_RealmAvailDropDown_OnLoad()
+
+ local dropdown = getglobal("RecipeRadar_RealmAvailDropDown")
+ UIDropDownMenu_Initialize(dropdown, RecipeRadar_RealmAvailDropDown_Init)
+ UIDropDownMenu_SetText(RRS("Availability"), dropdown)
+ UIDropDownMenu_SetWidth(135, RecipeRadar_RealmAvailDropDown)
+
+end
+
+function RecipeRadar_RealmAvailDropDown_Init()
+
+ -- sort our drop down list by table-specified order
+ local t = { }
+ for key, val in RecipeRadar_Availabilities do
+ t[val.DropDown.ROrder] = key
+ end
+
+ for _, key in t do
+
+ local info = RecipeRadar_Availabilities[key]
+ local checked, item = nil, { }
+
+ item.text = RecipeRadar_ColorToCode(info.Color) ..
+ info.Text .. FONT_COLOR_CODE_CLOSE
+ item.value = key
+ item.func = RecipeRadar_RealmAvailDropDown_OnClick
+ item.checked = not RecipeRadar_IsRealmAvailFiltered(key)
+ item.keepShownOnClick = 1
+
+ UIDropDownMenu_AddButton(item)
+
+ end
+
+end
+
+function RecipeRadar_RealmAvailDropDown_OnClick()
+
+ -- the logic here seems backwards, doesn't it?
+ if (UIDropDownMenuButton_GetChecked()) then
+ RecipeRadar_SetRealmAvailFilter(this.value, true)
+ else
+ RecipeRadar_SetRealmAvailFilter(this.value, false)
+ end
+
+ RecipeRadarListScrollFrameScrollBar:SetValue(0)
+
+end
+
+function RecipeRadar_IsRealmAvailFiltered(avail)
+
+ return RecipeRadar_Filters.RealmAvails[avail]
+
+end
+
+function RecipeRadar_SetRealmAvailFilter(avail, is_filtered)
+
+ RecipeRadar_Filters.RealmAvails[avail] = is_filtered
+ -- we filter out vendors here to keep the Update() quick
+ RecipeRadar_FilterVendors("avail", avail, is_filtered)
+ RecipeRadar_FilterRecipes("avail", avail, is_filtered)
+ RecipeRadar_FrameUpdate()
+
+end
+
+-----------------------------------------------------------------------------
+-- Personal availability drop down and filtering
+-----------------------------------------------------------------------------
+
+function RecipeRadar_PersonAvailDropDown_OnLoad()
+
+ local dropdown = getglobal("RecipeRadar_PersonAvailDropDown")
+ UIDropDownMenu_Initialize(dropdown, RecipeRadar_PersonAvailDropDown_Init)
+ UIDropDownMenu_SetText(RRS("Availability"), dropdown)
+ UIDropDownMenu_SetWidth(135, RecipeRadar_PersonAvailDropDown)
+
+end
+
+function RecipeRadar_PersonAvailDropDown_Init()
+
+ -- sort our drop down list by table-specified order
+ local t = { }
+ for key, val in RecipeRadar_Availabilities do
+ if (val.DropDown.POrder) then
+ t[val.DropDown.POrder] = key
+ end
+ end
+
+ for _, key in t do
+
+ local info = RecipeRadar_Availabilities[key]
+ local checked, item = nil, { }
+
+ item.text = RecipeRadar_ColorToCode(info.Color) ..
+ info.Text .. FONT_COLOR_CODE_CLOSE
+ item.value = key
+ item.func = RecipeRadar_PersonAvailDropDown_OnClick
+ item.checked = not RecipeRadar_IsPersonAvailFiltered(key)
+ item.keepShownOnClick = 1
+
+ UIDropDownMenu_AddButton(item)
+
+ end
+
+end
+
+function RecipeRadar_PersonAvailDropDown_OnClick()
+
+ -- the logic here seems backwards, doesn't it?
+ if (UIDropDownMenuButton_GetChecked()) then
+ RecipeRadar_SetPersonAvailFilter(this.value, true)
+ else
+ RecipeRadar_SetPersonAvailFilter(this.value, false)
+ end
+
+ RecipeRadarListScrollFrameScrollBar:SetValue(0)
+
+end
+
+function RecipeRadar_IsPersonAvailFiltered(avail)
+
+ return RecipeRadar_Filters.PersonAvails[avail]
+
+end
+
+function RecipeRadar_SetPersonAvailFilter(avail, is_filtered)
+
+ RecipeRadar_Filters.PersonAvails[avail] = is_filtered
+ -- we filter out vendors here to keep the Update() quick
+ RecipeRadar_FilterVendors("avail", avail, is_filtered)
+ RecipeRadar_FilterRecipes("avail", avail, is_filtered)
+ RecipeRadar_FrameUpdate()
+
+end
+
+-- Generic tester for those who don't care about the current mode.
+function RecipeRadar_IsAvailabilityFiltered(avail)
+
+ if (RecipeRadar_Options.RealmAvailability) then
+ return RecipeRadar_IsRealmAvailFiltered(avail)
+ else
+ return RecipeRadar_IsPersonAvailFiltered(avail)
+ end
+
+end
+
+-----------------------------------------------------------------------------
+-- Teams/factions drop down and filtering
+-----------------------------------------------------------------------------
+
+function RecipeRadar_TeamDropDown_OnLoad()
+
+ local dropdown = getglobal("RecipeRadar_TeamDropDown")
+ UIDropDownMenu_Initialize(dropdown, RecipeRadar_TeamDropDown_Init)
+ UIDropDownMenu_SetText(RRS("Factions"), dropdown)
+ UIDropDownMenu_SetWidth(112, RecipeRadar_TeamDropDown)
+
+end
+
+function RecipeRadar_TeamDropDown_Init()
+
+ -- sort our drop down list by table key
+ local t = { }
+ table.foreach(RecipeRadar_Teams,
+ function (k) table.insert(t, k) end)
+ table.sort(t)
+
+ for _, key in t do
+
+ local info = RecipeRadar_Teams[key]
+ local checked, item = nil, { }
+
+ item.text = RecipeRadar_ColorToCode(info.Color) ..
+ info.Name .. FONT_COLOR_CODE_CLOSE
+ item.value = key
+ item.func = RecipeRadar_TeamDropDown_OnClick
+ item.checked = not RecipeRadar_IsTeamFiltered(key)
+ item.keepShownOnClick = 1
+
+ UIDropDownMenu_AddButton(item)
+
+ end
+
+end
+
+function RecipeRadar_TeamDropDown_OnClick()
+
+ -- the logic here seems backwards, doesn't it?
+ if (UIDropDownMenuButton_GetChecked()) then
+ RecipeRadar_SetTeamFilter(this.value, true)
+ else
+ RecipeRadar_SetTeamFilter(this.value, false)
+ end
+
+ RecipeRadarListScrollFrameScrollBar:SetValue(0)
+
+end
+
+function RecipeRadar_IsTeamFiltered(team)
+
+ return RecipeRadar_Filters.Teams[team]
+
+end
+
+function RecipeRadar_SetTeamFilter(team, is_filtered)
+
+ RecipeRadar_Filters.Teams[team] = is_filtered
+ -- we filter out vendors here to keep the Update() quick
+ RecipeRadar_FilterVendors("team", team, is_filtered)
+ RecipeRadar_FilterRecipes("team", team, is_filtered)
+ RecipeRadar_FrameUpdate()
+
+end
+
+-----------------------------------------------------------------------------
+-- Multi-select professions drop down and filtering (for radar tab)
+-----------------------------------------------------------------------------
+
+function RecipeRadar_Prof1DropDown_OnLoad()
+
+ local dropdown = getglobal("RecipeRadar_Prof1DropDown")
+ UIDropDownMenu_Initialize(dropdown, RecipeRadar_Prof1DropDown_Init)
+ UIDropDownMenu_SetText(RRS("Professions"), dropdown)
+ UIDropDownMenu_SetWidth(135, RecipeRadar_Prof1DropDown)
+
+end
+
+function RecipeRadar_Prof1DropDown_Init()
+
+ -- sort our drop down list by table key
+ local t = { }
+ table.foreach(RecipeRadar_Professions,
+ function (k) table.insert(t, k) end)
+ table.sort(t)
+
+ for _, key in t do
+
+ local info = RecipeRadar_Professions[key]
+ local checked, item = nil, { }
+
+ item.text = info.Name
+ item.value = key
+ item.func = RecipeRadar_Prof1DropDown_OnClick
+ item.checked = not RecipeRadar_IsProfFiltered(key)
+ item.keepShownOnClick = 1
+
+ UIDropDownMenu_AddButton(item)
+
+ end
+
+end
+
+function RecipeRadar_Prof1DropDown_OnClick()
+
+ -- the logic here seems backwards, doesn't it?
+ if (UIDropDownMenuButton_GetChecked()) then
+ RecipeRadar_SetProfFilter(this.value, true)
+ else
+ RecipeRadar_SetProfFilter(this.value, false)
+ end
+
+ RecipeRadarListScrollFrameScrollBar:SetValue(0)
+
+end
+
+function RecipeRadar_IsProfFiltered(prof)
+
+ return RecipeRadar_Filters.Professions[prof]
+
+end
+
+function RecipeRadar_SetProfFilter(prof, is_filtered)
+
+ RecipeRadar_Filters.Professions[prof] = is_filtered
+ -- we filter out vendors here to keep the Update() quick
+ RecipeRadar_FilterVendors("prof", prof, is_filtered)
+ RecipeRadar_FrameUpdate()
+
+end
+
+-----------------------------------------------------------------------------
+-- Single-select professions drop down and filtering (for recipes tab)
+-----------------------------------------------------------------------------
+
+function RecipeRadar_Prof2DropDown_OnLoad()
+
+ local dropdown = getglobal("RecipeRadar_Prof2DropDown")
+ UIDropDownMenu_Initialize(dropdown, RecipeRadar_Prof2DropDown_Init)
+ UIDropDownMenu_SetText(RRS("Professions"), dropdown)
+ UIDropDownMenu_SetWidth(135, RecipeRadar_Prof2DropDown)
+
+end
+
+function RecipeRadar_Prof2DropDown_Init()
+
+ -- sort our drop down list by table key
+ local t = { }
+ table.foreach(RecipeRadar_Professions,
+ function (k) table.insert(t, k) end)
+ table.sort(t)
+
+ for _, key in t do
+
+ local info = RecipeRadar_Professions[key]
+ local checked, item = nil, { }
+
+ if (RecipeRadar_IsCurrentProfession(key)) then
+ checked = 1
+ end
+
+ item.text = info.Name
+ item.value = key
+ item.func = RecipeRadar_Prof2DropDown_OnClick
+ item.checked = checked
+
+ UIDropDownMenu_AddButton(item)
+
+ end
+
+end
+
+function RecipeRadar_Prof2DropDown_OnClick()
+
+ UIDropDownMenu_SetSelectedID(RecipeRadar_Prof2DropDown, this:GetID())
+ RecipeRadar_SetProf2Filter(this.value)
+ RecipeRadarListScrollFrameScrollBar:SetValue(0)
+
+end
+
+function RecipeRadar_IsCurrentProfession(prof)
+
+ return RecipeRadar_Options.CurrentProfession == prof
+
+end
+
+function RecipeRadar_SetProf2Filter(prof)
+
+ RecipeRadarRecipesTabFrame:SetNormalTexture(
+ RecipeRadar_Professions[prof].Icon)
+ RecipeRadar_Options.CurrentProfession = prof
+ RecipeRadar_InitRecipeFilters()
+ RecipeRadar_FrameUpdate()
+
+end
+
+-----------------------------------------------------------------------------
+-- Radar tab filtering code
+-----------------------------------------------------------------------------
+
+-- Checks for recipe filtering by either profession or availability.
+function RecipeRadar_IsRecipeFiltered(recipe)
+
+ return recipe.IsFilteredByTeam or recipe.IsFilteredByProfession or
+ recipe.IsFilteredByAvailability
+
+end
+
+-- Iterate through all vendors or recipes and set their filter state.
+-- This function is only useful for the radar tab, not the recipes tab.
+-- filter_type is one of 'team', 'prof' or 'avail', filter_on is the
+-- key on which to filter (eg. "Horde"), and is_filtered is the new state.
+function RecipeRadar_FilterVendors(filter_type, filter_on, is_filtered)
+
+ local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
+ if (not region) then return end
+
+ for _, vendor in region.Vendors do
+
+ -- this bit filters vendors by their team
+ if (filter_type == "team" and filter_on == vendor.Team) then
+
+ vendor.IsFiltered = is_filtered
+
+ -- if the to-be-filtered vendor is "active", unselect her
+ if (RecipeRadarRadarTabFrame.SelectedVendor == vendor) then
+ RecipeRadar_RadarTab_ClearSelection()
+ end
+
+ -- this bit filters recipes by their profession
+ elseif (filter_type == "prof") then
+
+ for _, recipe in vendor.Recipes do
+
+ if (filter_on == recipe.Type) then
+
+ recipe.IsFilteredByProfession = is_filtered
+
+ -- if the to-be-filtered recipe is selected, unselect it
+ if (RecipeRadarRadarTabFrame.SelectedRecipe == recipe) then
+ RecipeRadar_RadarTab_ClearSelection()
+ end
+
+ end
+
+ end
+
+ -- this bit filters recipes by their availability state
+ elseif (filter_type == "avail") then
+
+ for _, recipe in vendor.Recipes do
+
+ if (filter_on == RecipeRadar_Availability_GetKey(recipe)) then
+
+ recipe.IsFilteredByAvailability = is_filtered
+
+ -- if the to-be-filtered recipe is selected, unselect it
+ if (RecipeRadarRadarTabFrame.SelectedRecipe == recipe) then
+ RecipeRadar_RadarTab_ClearSelection()
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+end
+
+-- Initializes vendor/recipe filters according to saved filter settings.
+function RecipeRadar_InitVendorFilters()
+
+ local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
+ if (not region) then return end
+
+ for _, vendor in region.Vendors do
+
+ -- set team filter
+ vendor.IsFiltered = RecipeRadar_IsTeamFiltered(vendor.Team)
+
+ for _, recipe in vendor.Recipes do
+
+ -- set profession filter
+ recipe.IsFilteredByProfession =
+ RecipeRadar_IsProfFiltered(recipe.Type)
+
+ -- set availability filter (the 'true') and auto-map if necessary
+ if (RecipeRadar_Availability_IsLearnable(recipe, true) and
+ RecipeRadar_Options.AutoMapVendors) then
+ RecipeRadar_Maps_AddVendor(vendor,
+ RecipeRadar_Options.CurrentRegion)
+ end
+
+ end
+
+ end
+
+end
+
+-----------------------------------------------------------------------------
+-- Recipes tab filtering code
+-----------------------------------------------------------------------------
+
+-- Iterate through all recipes and set their filter state.
+-- This function is only useful for the recipes tab, not the radar tab.
+-- filter_type is one of 'team' or 'avail', filter_on is the
+-- key on which to filter (eg. "Horde"), and is_filtered is the new state.
+function RecipeRadar_FilterRecipes(filter_type, filter_on, is_filtered)
+
+ local prof = RecipeRadar_RecipeData[RecipeRadar_Options.CurrentProfession]
+
+ for _, recipe in prof.Recipes do
+
+ -- this bit filters recipes by their availability state
+ if (filter_type == "avail" and
+ filter_on == RecipeRadar_Availability_GetKey(recipe)) then
+
+ recipe.IsFilteredByAvailability = is_filtered
+
+ -- if the to-be-filtered recipe is "active", unselect it
+ if (RecipeRadarRecipesTabFrame.SelectedRecipe == recipe) then
+ RecipeRadar_RecipesTab_ClearSelection()
+ end
+
+ -- this bit filters vendors by their team
+ elseif (filter_type == "team") then
+
+ for _, location in recipe.Locations do
+
+ if (filter_on == location.Team) then
+
+ location.IsFiltered = is_filtered
+
+ -- if the to-be-filtered recipe is selected, unselect it
+ if (RecipeRadarRecipesTabFrame.SelectedLocation ==
+ location.Region) then
+ RecipeRadar_RecipesTab_ClearSelection()
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+end
+
+-- Initializes vendor/recipe filters according to saved filter settings.
+function RecipeRadar_InitRecipeFilters()
+
+ local prof = RecipeRadar_RecipeData[RecipeRadar_Options.CurrentProfession]
+ if (not prof) then return end
+
+ for _, recipe in prof.Recipes do
+
+ -- set availability filter (the 'true')
+ RecipeRadar_Availability_SetAvailabilityFilter(recipe)
+
+ for _, location in recipe.Locations do
+ -- set team filter
+ location.IsFiltered = RecipeRadar_IsTeamFiltered(location.Team)
+ end
+
+ end
+
+end
diff --git a/RecipeRadar/FrameTemplates.xml b/RecipeRadar/FrameTemplates.xml
new file mode 100644
index 0000000..4d02348
--- /dev/null
+++ b/RecipeRadar/FrameTemplates.xml
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ScrollFrame_OnLoad()
+ this.scrollBarHideable = 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RecipeRadar/Globals.lua b/RecipeRadar/Globals.lua
new file mode 100644
index 0000000..fcb53a3
--- /dev/null
+++ b/RecipeRadar/Globals.lua
@@ -0,0 +1,267 @@
+
+-- Globals.lua: global/saved variables and some related initialization code
+-- $Id: Globals.lua 466 2006-09-18 18:10:31Z jnmiller $
+
+RECIPERADAR_VERSION = GetAddOnMetadata("RecipeRadar", "Version");
+
+RECIPERADAR_VENDORS_DISPLAYED = 8
+RECIPERADAR_VENDOR_HEIGHT = 16
+RECIPERADAR_VENDOR_OFFSET = 20
+RECIPERADAR_IMAGE_ROOT = "Interface\\Addons\\RecipeRadar\\Images\\"
+
+-- this should be <= the number of RecipeRadar*Icons
+RECIPERADAR_MAPPED_VENDORS_MAX = 20
+
+BINDING_HEADER_RECIPERADAR_HEADER = RRS("Recipe Radar Bindings")
+BINDING_NAME_RECIPERADAR_TOGGLE = RRS("Toggle Recipe Radar")
+
+RecipeRadar_Options = { }
+
+RecipeRadar_Filters = {
+ Teams = { },
+ Professions = { },
+ RealmAvails = { },
+ PersonAvails = { },
+}
+
+RecipeRadar_Colors = {
+
+ MainFont = { r = 1.0, g = 0.75, b = 0.0 },
+ Alliance = { r = 0.5, g = 0.625, b = 1.0 },
+ Horde = { r = 1.0, g = 0.125, b = 0.25 },
+ Neutral = { r = 1.0, g = 0.82, b = 0.0 },
+ LightGray = { r = 0.9, g = 0.9, b = 0.9 },
+ UncachedRecipe = { r = 0.75, g = 0.75, b = 0.75 },
+ DisabledGray = { r = 0.5, g = 0.5, b = 0.5 },
+
+ TooltipHeading = { r = 0.9, g = 0.9, b = 0.9 },
+ TooltipWarning = { r = 1.0, g = 0.3, b = 0.3 },
+
+ -- realm-wide availability tooltip/indicator colors
+ LearnableByPlayer = { r = 0.0, g = 1.0, b = 0.0 },
+ LearnableByAlt = { r = 0.0, g = 0.8, b = 0.0 },
+ ProspectForPlayer = { r = 1.0, g = 0.2, b = 0.2 },
+ ProspectForAlt = { r = 0.8, g = 0.2, b = 0.2 },
+ KnownByPlayer = { r = 0.7, g = 0.7, b = 0.7 },
+ KnownByAlt = { r = 0.5, g = 0.5, b = 0.5 },
+ NotApplicable = { r = 0.5, g = 0.5, b = 0.5 },
+
+ -- person-wide availability tooltip/indicator colors
+ Available = GREEN_FONT_COLOR,
+ Unavailable = RED_FONT_COLOR,
+ AlreadyKnown = GRAY_FONT_COLOR,
+
+ -- amount that colors will be phased to highlight the text
+ Highlight = 0.2,
+
+}
+
+RecipeRadar_Continents = {
+
+ [0] = RRS("Instances"),
+ [1] = RRS("Kalimdor"),
+ [2] = RRS("Eastern Kingdoms"),
+
+}
+
+RecipeRadar_Teams = {
+
+ ["Alliance"] = {
+ Name = FACTION_ALLIANCE,
+ Color = RecipeRadar_Colors.Alliance,
+ },
+ ["Horde"] = {
+ Name = FACTION_HORDE,
+ Color = RecipeRadar_Colors.Horde,
+ },
+ ["Neutral"] = {
+ Name = RRS("Neutral"),
+ Color = RecipeRadar_Colors.Neutral,
+ },
+
+}
+
+RecipeRadar_Professions = {
+
+ [RRS("Alchemy")] = {
+ Name = RRS("Alchemy"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "Alchemy",
+ },
+ [RRS("Blacksmithing")] = {
+ Name = RRS("Blacksmithing"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "Blacksmithing",
+ },
+ [RRS("Cooking")] = {
+ Name = RRS("Cooking"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "Cooking",
+ },
+ [RRS("Enchanting")] = {
+ Name = RRS("Enchanting"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "Enchanting",
+ },
+ [RRS("Engineering")] = {
+ Name = RRS("Engineering"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "Engineering",
+ },
+ [RRS("First Aid")] = {
+ Name = RRS("First Aid"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "First-Aid",
+ },
+ [RRS("Fishing")] = {
+ Name = RRS("Fishing"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "Fishing",
+ },
+ [RRS("Leatherworking")] = {
+ Name = RRS("Leatherworking"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "Leatherworking",
+ },
+ [RRS("Tailoring")] = {
+ Name = RRS("Tailoring"),
+ Icon = RECIPERADAR_IMAGE_ROOT .. "Icons\\" .. "Tailoring",
+ },
+
+}
+
+RecipeRadar_Specialties = {
+
+ [RRS("Gnomish Engineer")] = RRS("Engineering"),
+ [RRS("Goblin Engineer")] = RRS("Engineering"),
+ [RRS("Tribal Leatherworking")] = RRS("Leatherworking"),
+ [RRS("Elemental Leatherworking")] = RRS("Leatherworking"),
+ [RRS("Dragonscale Leatherworking")] = RRS("Leatherworking"),
+ [RRS("Armorsmith")] = RRS("Blacksmithing"),
+ [RRS("Weaponsmith")] = RRS("Blacksmithing"),
+ [RRS("Master Axesmith")] = RRS("Blacksmithing"),
+ [RRS("Master Swordsmith")] = RRS("Blacksmithing"),
+ [RRS("Master Hammersmith")] = RRS("Blacksmithing"),
+
+}
+
+RecipeRadar_Factions = {
+
+ RRS("Argent Dawn"),
+ RRS("Cenarion Circle"),
+ RRS("Thorium Brotherhood"),
+ RRS("Timbermaw Hold"),
+ RRS("Zandalar Tribe"),
+
+}
+
+RecipeRadar_Availabilities = {
+
+ ["LearnableByPlayer"] = {
+ Text = RRS("Available Now (Player)"),
+ Tooltip = { Group = 1, Heading = RRS("Available For:") },
+ DropDown = { POrder = 1, ROrder = 1 },
+ Color = RecipeRadar_Colors.LearnableByPlayer,
+ TestFunction = RecipeRadar_Availability_IsLearnableByPlayer,
+ },
+ ["LearnableByAlt"] = {
+ Text = RRS("Available Now (Alts)"),
+ Tooltip = { Group = 1, Heading = RRS("Available For:") },
+ DropDown = { POrder = nil, ROrder = 2 },
+ Color = RecipeRadar_Colors.LearnableByAlt,
+ TestFunction = RecipeRadar_Availability_IsLearnableByAlt,
+ },
+ ["ProspectForPlayer"] = {
+ Text = RRS("Future Prospect (Player)"),
+ Tooltip = { Group = 2, Heading = RRS("Future Prospect For:") },
+ DropDown = { POrder = 2, ROrder = 3 },
+ Color = RecipeRadar_Colors.ProspectForPlayer,
+ TestFunction = RecipeRadar_Availability_IsProspectForPlayer,
+ },
+ ["ProspectForAlt"] = {
+ Text = RRS("Future Prospect (Alts)"),
+ Tooltip = { Group = 2, Heading = RRS("Future Prospect For:") },
+ DropDown = { POrder = nil, ROrder = 4 },
+ Color = RecipeRadar_Colors.ProspectForAlt,
+ TestFunction = RecipeRadar_Availability_IsProspectForAlt,
+ },
+ ["KnownByPlayer"] = {
+ Text = RRS("Already Known (Player)"),
+ Tooltip = { Group = 3, Heading = RRS("Already Known By:") },
+ DropDown = { POrder = 3, ROrder = 5 },
+ Color = RecipeRadar_Colors.KnownByPlayer,
+ TestFunction = RecipeRadar_Availability_IsKnownByPlayer,
+ },
+ ["KnownByAlt"] = {
+ Text = RRS("Already Known (Alts)"),
+ Tooltip = { Group = 3, Heading = RRS("Already Known By:") },
+ DropDown = { POrder = nil, ROrder = 6 },
+ Color = RecipeRadar_Colors.KnownByAlt,
+ TestFunction = RecipeRadar_Availability_IsKnownByAlt,
+ },
+ ["NotApplicable"] = {
+ Text = RRS("Inapplicable Professions"),
+ Tooltip = { Group = 0 }, -- do not show in tooltip
+ DropDown = { POrder = 4, ROrder = 7 },
+ Color = RecipeRadar_Colors.NotApplicable,
+ TestFunction = nil, -- don't need to test the default case
+ },
+
+}
+
+
+-----------------------------------------------------------------------------
+-- Global initialization functions
+-----------------------------------------------------------------------------
+
+-- This function "upgrades" the user's saved variables, if necessary.
+function RecipeRadar_Globals_Init(force)
+
+ RecipeRadar_Options_Init()
+
+ if (not force and RecipeRadar_Options.Version >= RECIPERADAR_VERSION) then
+ return -- running version is current
+ end
+ RecipeRadar_Options.Version = RECIPERADAR_VERSION
+end
+
+-- Initializes the Options table with some defaults.
+function RecipeRadar_Options_Init()
+
+ if (RecipeRadar_Options.Version == nil) then
+ RecipeRadar_Options.Version = RECIPERADAR_VERSION
+ end
+
+ if (RecipeRadar_Options.MinimapButtonPosition == nil) then
+ RecipeRadar_Options.MinimapButtonPosition = 256
+ end
+
+ if (RecipeRadar_Options.ShowMinimapButton == nil) then
+ RecipeRadar_Options.ShowMinimapButton = true
+ RecipeRadarMinimapButtonFrame:Show()
+ end
+
+ if (not RecipeRadar_IsProfession(
+ RecipeRadar_Options.CurrentProfession)) then
+ RecipeRadar_Options.CurrentProfession = RRS("Cooking")
+ end
+
+ if (RecipeRadar_Options.RealmAvailability == nil) then
+ RecipeRadar_Options.RealmAvailability = true
+ RecipeRadar_RealmAvailDropDown:Show()
+ end
+
+ if (RecipeRadar_Options.Locked == nil) then
+ RecipeRadar_Options.Locked = false
+ end
+
+ if (RecipeRadar_Options.AutoSelectRegion == nil) then
+ RecipeRadar_Options.AutoSelectRegion = true
+ end
+
+ if (RecipeRadar_Options.AutoMapVendors == nil) then
+ RecipeRadar_Options.AutoMapVendors = false
+ end
+
+end
+
+-- Copies 'IsFiltered' members from t2 to t1.
+function RecipeRadar_CopyFilterSettings(t1, t2)
+
+ for key, val in t2 do
+ t1[key].IsFiltered = val.IsFiltered
+ end
+
+end
diff --git a/RecipeRadar/Images/Frame/FrameBottomLeft.blp b/RecipeRadar/Images/Frame/FrameBottomLeft.blp
new file mode 100644
index 0000000..1ac358e
Binary files /dev/null and b/RecipeRadar/Images/Frame/FrameBottomLeft.blp differ
diff --git a/RecipeRadar/Images/Frame/FrameBottomRight.blp b/RecipeRadar/Images/Frame/FrameBottomRight.blp
new file mode 100644
index 0000000..dd55c2a
Binary files /dev/null and b/RecipeRadar/Images/Frame/FrameBottomRight.blp differ
diff --git a/RecipeRadar/Images/Frame/FrameTopLeft.blp b/RecipeRadar/Images/Frame/FrameTopLeft.blp
new file mode 100644
index 0000000..5bb97ad
Binary files /dev/null and b/RecipeRadar/Images/Frame/FrameTopLeft.blp differ
diff --git a/RecipeRadar/Images/Frame/FrameTopRight.blp b/RecipeRadar/Images/Frame/FrameTopRight.blp
new file mode 100644
index 0000000..5e23bdd
Binary files /dev/null and b/RecipeRadar/Images/Frame/FrameTopRight.blp differ
diff --git a/RecipeRadar/Images/Frame/HorizontalBarLeft.blp b/RecipeRadar/Images/Frame/HorizontalBarLeft.blp
new file mode 100644
index 0000000..3c450e8
Binary files /dev/null and b/RecipeRadar/Images/Frame/HorizontalBarLeft.blp differ
diff --git a/RecipeRadar/Images/Frame/HorizontalBarRight.blp b/RecipeRadar/Images/Frame/HorizontalBarRight.blp
new file mode 100644
index 0000000..25c15e8
Binary files /dev/null and b/RecipeRadar/Images/Frame/HorizontalBarRight.blp differ
diff --git a/RecipeRadar/Images/Frame/LockButton-Locked-Down.blp b/RecipeRadar/Images/Frame/LockButton-Locked-Down.blp
new file mode 100644
index 0000000..5ef7d65
Binary files /dev/null and b/RecipeRadar/Images/Frame/LockButton-Locked-Down.blp differ
diff --git a/RecipeRadar/Images/Frame/LockButton-Locked-Up.blp b/RecipeRadar/Images/Frame/LockButton-Locked-Up.blp
new file mode 100644
index 0000000..07d11ed
Binary files /dev/null and b/RecipeRadar/Images/Frame/LockButton-Locked-Up.blp differ
diff --git a/RecipeRadar/Images/Frame/LockButton-Unlocked-Down.blp b/RecipeRadar/Images/Frame/LockButton-Unlocked-Down.blp
new file mode 100644
index 0000000..c19124b
Binary files /dev/null and b/RecipeRadar/Images/Frame/LockButton-Unlocked-Down.blp differ
diff --git a/RecipeRadar/Images/Frame/LockButton-Unlocked-Up.blp b/RecipeRadar/Images/Frame/LockButton-Unlocked-Up.blp
new file mode 100644
index 0000000..c35645a
Binary files /dev/null and b/RecipeRadar/Images/Frame/LockButton-Unlocked-Up.blp differ
diff --git a/RecipeRadar/Images/Frame/Tab-Right.blp b/RecipeRadar/Images/Frame/Tab-Right.blp
new file mode 100644
index 0000000..fa31abc
Binary files /dev/null and b/RecipeRadar/Images/Frame/Tab-Right.blp differ
diff --git a/RecipeRadar/Images/Icons/Alchemy.blp b/RecipeRadar/Images/Icons/Alchemy.blp
new file mode 100644
index 0000000..99ff5dd
Binary files /dev/null and b/RecipeRadar/Images/Icons/Alchemy.blp differ
diff --git a/RecipeRadar/Images/Icons/Blacksmithing.blp b/RecipeRadar/Images/Icons/Blacksmithing.blp
new file mode 100644
index 0000000..3ebd8fd
Binary files /dev/null and b/RecipeRadar/Images/Icons/Blacksmithing.blp differ
diff --git a/RecipeRadar/Images/Icons/Cooking.blp b/RecipeRadar/Images/Icons/Cooking.blp
new file mode 100644
index 0000000..236608e
Binary files /dev/null and b/RecipeRadar/Images/Icons/Cooking.blp differ
diff --git a/RecipeRadar/Images/Icons/Enchanting.blp b/RecipeRadar/Images/Icons/Enchanting.blp
new file mode 100644
index 0000000..65f3b21
Binary files /dev/null and b/RecipeRadar/Images/Icons/Enchanting.blp differ
diff --git a/RecipeRadar/Images/Icons/Engineering.blp b/RecipeRadar/Images/Icons/Engineering.blp
new file mode 100644
index 0000000..a2a9c84
Binary files /dev/null and b/RecipeRadar/Images/Icons/Engineering.blp differ
diff --git a/RecipeRadar/Images/Icons/First-Aid.blp b/RecipeRadar/Images/Icons/First-Aid.blp
new file mode 100644
index 0000000..db36064
Binary files /dev/null and b/RecipeRadar/Images/Icons/First-Aid.blp differ
diff --git a/RecipeRadar/Images/Icons/Fishing.blp b/RecipeRadar/Images/Icons/Fishing.blp
new file mode 100644
index 0000000..b7aeb79
Binary files /dev/null and b/RecipeRadar/Images/Icons/Fishing.blp differ
diff --git a/RecipeRadar/Images/Icons/Highlight.blp b/RecipeRadar/Images/Icons/Highlight.blp
new file mode 100644
index 0000000..b8ca35e
Binary files /dev/null and b/RecipeRadar/Images/Icons/Highlight.blp differ
diff --git a/RecipeRadar/Images/Icons/Leatherworking.blp b/RecipeRadar/Images/Icons/Leatherworking.blp
new file mode 100644
index 0000000..086333f
Binary files /dev/null and b/RecipeRadar/Images/Icons/Leatherworking.blp differ
diff --git a/RecipeRadar/Images/Icons/Tailoring.blp b/RecipeRadar/Images/Icons/Tailoring.blp
new file mode 100644
index 0000000..323b7e5
Binary files /dev/null and b/RecipeRadar/Images/Icons/Tailoring.blp differ
diff --git a/RecipeRadar/Images/Misc/Flag.blp b/RecipeRadar/Images/Misc/Flag.blp
new file mode 100644
index 0000000..c179a0a
Binary files /dev/null and b/RecipeRadar/Images/Misc/Flag.blp differ
diff --git a/RecipeRadar/Images/Misc/IconHighlight.blp b/RecipeRadar/Images/Misc/IconHighlight.blp
new file mode 100644
index 0000000..bd97e8c
Binary files /dev/null and b/RecipeRadar/Images/Misc/IconHighlight.blp differ
diff --git a/RecipeRadar/Images/Misc/MinimapButtonDown.blp b/RecipeRadar/Images/Misc/MinimapButtonDown.blp
new file mode 100644
index 0000000..6727ae9
Binary files /dev/null and b/RecipeRadar/Images/Misc/MinimapButtonDown.blp differ
diff --git a/RecipeRadar/Images/Misc/MinimapButtonUp.blp b/RecipeRadar/Images/Misc/MinimapButtonUp.blp
new file mode 100644
index 0000000..91fd4e3
Binary files /dev/null and b/RecipeRadar/Images/Misc/MinimapButtonUp.blp differ
diff --git a/RecipeRadar/Images/Misc/QuestionMark.blp b/RecipeRadar/Images/Misc/QuestionMark.blp
new file mode 100644
index 0000000..30bac18
Binary files /dev/null and b/RecipeRadar/Images/Misc/QuestionMark.blp differ
diff --git a/RecipeRadar/Images/Misc/Radar.blp b/RecipeRadar/Images/Misc/Radar.blp
new file mode 100644
index 0000000..9b8fd4c
Binary files /dev/null and b/RecipeRadar/Images/Misc/Radar.blp differ
diff --git a/RecipeRadar/Images/Misc/RecipeHighlight.blp b/RecipeRadar/Images/Misc/RecipeHighlight.blp
new file mode 100644
index 0000000..5eb8043
Binary files /dev/null and b/RecipeRadar/Images/Misc/RecipeHighlight.blp differ
diff --git a/RecipeRadar/Images/Misc/Scroll.blp b/RecipeRadar/Images/Misc/Scroll.blp
new file mode 100644
index 0000000..c5ca963
Binary files /dev/null and b/RecipeRadar/Images/Misc/Scroll.blp differ
diff --git a/RecipeRadar/Images/Regions/Alterac-Mountains.blp b/RecipeRadar/Images/Regions/Alterac-Mountains.blp
new file mode 100644
index 0000000..9215aea
Binary files /dev/null and b/RecipeRadar/Images/Regions/Alterac-Mountains.blp differ
diff --git a/RecipeRadar/Images/Regions/Arathi-Highlands.blp b/RecipeRadar/Images/Regions/Arathi-Highlands.blp
new file mode 100644
index 0000000..52866a8
Binary files /dev/null and b/RecipeRadar/Images/Regions/Arathi-Highlands.blp differ
diff --git a/RecipeRadar/Images/Regions/Ashenvale.blp b/RecipeRadar/Images/Regions/Ashenvale.blp
new file mode 100644
index 0000000..c8c218e
Binary files /dev/null and b/RecipeRadar/Images/Regions/Ashenvale.blp differ
diff --git a/RecipeRadar/Images/Regions/Azshara.blp b/RecipeRadar/Images/Regions/Azshara.blp
new file mode 100644
index 0000000..2a6ce6b
Binary files /dev/null and b/RecipeRadar/Images/Regions/Azshara.blp differ
diff --git a/RecipeRadar/Images/Regions/Badlands.blp b/RecipeRadar/Images/Regions/Badlands.blp
new file mode 100644
index 0000000..9b5628f
Binary files /dev/null and b/RecipeRadar/Images/Regions/Badlands.blp differ
diff --git a/RecipeRadar/Images/Regions/Blasted-Lands.blp b/RecipeRadar/Images/Regions/Blasted-Lands.blp
new file mode 100644
index 0000000..77d9d69
Binary files /dev/null and b/RecipeRadar/Images/Regions/Blasted-Lands.blp differ
diff --git a/RecipeRadar/Images/Regions/Burning-Steppes.blp b/RecipeRadar/Images/Regions/Burning-Steppes.blp
new file mode 100644
index 0000000..aac6885
Binary files /dev/null and b/RecipeRadar/Images/Regions/Burning-Steppes.blp differ
diff --git a/RecipeRadar/Images/Regions/Darkshore.blp b/RecipeRadar/Images/Regions/Darkshore.blp
new file mode 100644
index 0000000..8b102a3
Binary files /dev/null and b/RecipeRadar/Images/Regions/Darkshore.blp differ
diff --git a/RecipeRadar/Images/Regions/Darnassus.blp b/RecipeRadar/Images/Regions/Darnassus.blp
new file mode 100644
index 0000000..51a3763
Binary files /dev/null and b/RecipeRadar/Images/Regions/Darnassus.blp differ
diff --git a/RecipeRadar/Images/Regions/Desolace.blp b/RecipeRadar/Images/Regions/Desolace.blp
new file mode 100644
index 0000000..09bf2a4
Binary files /dev/null and b/RecipeRadar/Images/Regions/Desolace.blp differ
diff --git a/RecipeRadar/Images/Regions/Dun-Morogh.blp b/RecipeRadar/Images/Regions/Dun-Morogh.blp
new file mode 100644
index 0000000..b492da1
Binary files /dev/null and b/RecipeRadar/Images/Regions/Dun-Morogh.blp differ
diff --git a/RecipeRadar/Images/Regions/Durotar.blp b/RecipeRadar/Images/Regions/Durotar.blp
new file mode 100644
index 0000000..f66d3d3
Binary files /dev/null and b/RecipeRadar/Images/Regions/Durotar.blp differ
diff --git a/RecipeRadar/Images/Regions/Duskwood.blp b/RecipeRadar/Images/Regions/Duskwood.blp
new file mode 100644
index 0000000..7e26009
Binary files /dev/null and b/RecipeRadar/Images/Regions/Duskwood.blp differ
diff --git a/RecipeRadar/Images/Regions/Dustwallow-Marsh.blp b/RecipeRadar/Images/Regions/Dustwallow-Marsh.blp
new file mode 100644
index 0000000..af01bc2
Binary files /dev/null and b/RecipeRadar/Images/Regions/Dustwallow-Marsh.blp differ
diff --git a/RecipeRadar/Images/Regions/Eastern-Plaguelands.blp b/RecipeRadar/Images/Regions/Eastern-Plaguelands.blp
new file mode 100644
index 0000000..b52dc5f
Binary files /dev/null and b/RecipeRadar/Images/Regions/Eastern-Plaguelands.blp differ
diff --git a/RecipeRadar/Images/Regions/Elwynn-Forest.blp b/RecipeRadar/Images/Regions/Elwynn-Forest.blp
new file mode 100644
index 0000000..7ea7329
Binary files /dev/null and b/RecipeRadar/Images/Regions/Elwynn-Forest.blp differ
diff --git a/RecipeRadar/Images/Regions/Felwood.blp b/RecipeRadar/Images/Regions/Felwood.blp
new file mode 100644
index 0000000..75be8c5
Binary files /dev/null and b/RecipeRadar/Images/Regions/Felwood.blp differ
diff --git a/RecipeRadar/Images/Regions/Feralas.blp b/RecipeRadar/Images/Regions/Feralas.blp
new file mode 100644
index 0000000..758d0d3
Binary files /dev/null and b/RecipeRadar/Images/Regions/Feralas.blp differ
diff --git a/RecipeRadar/Images/Regions/Hillsbrad-Foothills.blp b/RecipeRadar/Images/Regions/Hillsbrad-Foothills.blp
new file mode 100644
index 0000000..fe4e1ef
Binary files /dev/null and b/RecipeRadar/Images/Regions/Hillsbrad-Foothills.blp differ
diff --git a/RecipeRadar/Images/Regions/Ironforge.blp b/RecipeRadar/Images/Regions/Ironforge.blp
new file mode 100644
index 0000000..b513b31
Binary files /dev/null and b/RecipeRadar/Images/Regions/Ironforge.blp differ
diff --git a/RecipeRadar/Images/Regions/Loch-Modan.blp b/RecipeRadar/Images/Regions/Loch-Modan.blp
new file mode 100644
index 0000000..36420d5
Binary files /dev/null and b/RecipeRadar/Images/Regions/Loch-Modan.blp differ
diff --git a/RecipeRadar/Images/Regions/Moonglade.blp b/RecipeRadar/Images/Regions/Moonglade.blp
new file mode 100644
index 0000000..2702838
Binary files /dev/null and b/RecipeRadar/Images/Regions/Moonglade.blp differ
diff --git a/RecipeRadar/Images/Regions/Mulgore.blp b/RecipeRadar/Images/Regions/Mulgore.blp
new file mode 100644
index 0000000..2369ee2
Binary files /dev/null and b/RecipeRadar/Images/Regions/Mulgore.blp differ
diff --git a/RecipeRadar/Images/Regions/Orgrimmar.blp b/RecipeRadar/Images/Regions/Orgrimmar.blp
new file mode 100644
index 0000000..14360f6
Binary files /dev/null and b/RecipeRadar/Images/Regions/Orgrimmar.blp differ
diff --git a/RecipeRadar/Images/Regions/Redridge-Mountains.blp b/RecipeRadar/Images/Regions/Redridge-Mountains.blp
new file mode 100644
index 0000000..1a4fbee
Binary files /dev/null and b/RecipeRadar/Images/Regions/Redridge-Mountains.blp differ
diff --git a/RecipeRadar/Images/Regions/Silithus.blp b/RecipeRadar/Images/Regions/Silithus.blp
new file mode 100644
index 0000000..db6e8b7
Binary files /dev/null and b/RecipeRadar/Images/Regions/Silithus.blp differ
diff --git a/RecipeRadar/Images/Regions/Silverpine-Forest.blp b/RecipeRadar/Images/Regions/Silverpine-Forest.blp
new file mode 100644
index 0000000..8891fde
Binary files /dev/null and b/RecipeRadar/Images/Regions/Silverpine-Forest.blp differ
diff --git a/RecipeRadar/Images/Regions/Stonetalon-Mountains.blp b/RecipeRadar/Images/Regions/Stonetalon-Mountains.blp
new file mode 100644
index 0000000..4c74883
Binary files /dev/null and b/RecipeRadar/Images/Regions/Stonetalon-Mountains.blp differ
diff --git a/RecipeRadar/Images/Regions/Stormwind-City.blp b/RecipeRadar/Images/Regions/Stormwind-City.blp
new file mode 100644
index 0000000..f943ff0
Binary files /dev/null and b/RecipeRadar/Images/Regions/Stormwind-City.blp differ
diff --git a/RecipeRadar/Images/Regions/Stormwind.blp b/RecipeRadar/Images/Regions/Stormwind.blp
new file mode 100644
index 0000000..f943ff0
Binary files /dev/null and b/RecipeRadar/Images/Regions/Stormwind.blp differ
diff --git a/RecipeRadar/Images/Regions/Stranglethorn-Vale.blp b/RecipeRadar/Images/Regions/Stranglethorn-Vale.blp
new file mode 100644
index 0000000..cb5ee0d
Binary files /dev/null and b/RecipeRadar/Images/Regions/Stranglethorn-Vale.blp differ
diff --git a/RecipeRadar/Images/Regions/Swamp-of-Sorrows.blp b/RecipeRadar/Images/Regions/Swamp-of-Sorrows.blp
new file mode 100644
index 0000000..7403f9e
Binary files /dev/null and b/RecipeRadar/Images/Regions/Swamp-of-Sorrows.blp differ
diff --git a/RecipeRadar/Images/Regions/Tanaris.blp b/RecipeRadar/Images/Regions/Tanaris.blp
new file mode 100644
index 0000000..f8de931
Binary files /dev/null and b/RecipeRadar/Images/Regions/Tanaris.blp differ
diff --git a/RecipeRadar/Images/Regions/Teldrassil.blp b/RecipeRadar/Images/Regions/Teldrassil.blp
new file mode 100644
index 0000000..97b3eb4
Binary files /dev/null and b/RecipeRadar/Images/Regions/Teldrassil.blp differ
diff --git a/RecipeRadar/Images/Regions/The-Barrens.blp b/RecipeRadar/Images/Regions/The-Barrens.blp
new file mode 100644
index 0000000..446503e
Binary files /dev/null and b/RecipeRadar/Images/Regions/The-Barrens.blp differ
diff --git a/RecipeRadar/Images/Regions/The-Hinterlands.blp b/RecipeRadar/Images/Regions/The-Hinterlands.blp
new file mode 100644
index 0000000..a33ebfc
Binary files /dev/null and b/RecipeRadar/Images/Regions/The-Hinterlands.blp differ
diff --git a/RecipeRadar/Images/Regions/Thousand-Needles.blp b/RecipeRadar/Images/Regions/Thousand-Needles.blp
new file mode 100644
index 0000000..cb13e47
Binary files /dev/null and b/RecipeRadar/Images/Regions/Thousand-Needles.blp differ
diff --git a/RecipeRadar/Images/Regions/Thunder-Bluff.blp b/RecipeRadar/Images/Regions/Thunder-Bluff.blp
new file mode 100644
index 0000000..cd1ef9e
Binary files /dev/null and b/RecipeRadar/Images/Regions/Thunder-Bluff.blp differ
diff --git a/RecipeRadar/Images/Regions/Tirisfal-Glades.blp b/RecipeRadar/Images/Regions/Tirisfal-Glades.blp
new file mode 100644
index 0000000..2e43201
Binary files /dev/null and b/RecipeRadar/Images/Regions/Tirisfal-Glades.blp differ
diff --git a/RecipeRadar/Images/Regions/Un-Goro-Crater.blp b/RecipeRadar/Images/Regions/Un-Goro-Crater.blp
new file mode 100644
index 0000000..d0b07a7
Binary files /dev/null and b/RecipeRadar/Images/Regions/Un-Goro-Crater.blp differ
diff --git a/RecipeRadar/Images/Regions/Undercity.blp b/RecipeRadar/Images/Regions/Undercity.blp
new file mode 100644
index 0000000..762409c
Binary files /dev/null and b/RecipeRadar/Images/Regions/Undercity.blp differ
diff --git a/RecipeRadar/Images/Regions/Western-Plaguelands.blp b/RecipeRadar/Images/Regions/Western-Plaguelands.blp
new file mode 100644
index 0000000..a88d194
Binary files /dev/null and b/RecipeRadar/Images/Regions/Western-Plaguelands.blp differ
diff --git a/RecipeRadar/Images/Regions/Westfall.blp b/RecipeRadar/Images/Regions/Westfall.blp
new file mode 100644
index 0000000..1d8db1f
Binary files /dev/null and b/RecipeRadar/Images/Regions/Westfall.blp differ
diff --git a/RecipeRadar/Images/Regions/Wetlands.blp b/RecipeRadar/Images/Regions/Wetlands.blp
new file mode 100644
index 0000000..82ab3c6
Binary files /dev/null and b/RecipeRadar/Images/Regions/Wetlands.blp differ
diff --git a/RecipeRadar/Images/Regions/Winterspring.blp b/RecipeRadar/Images/Regions/Winterspring.blp
new file mode 100644
index 0000000..c4b30e8
Binary files /dev/null and b/RecipeRadar/Images/Regions/Winterspring.blp differ
diff --git a/RecipeRadar/Localization.lua b/RecipeRadar/Localization.lua
new file mode 100644
index 0000000..c6c2bfb
--- /dev/null
+++ b/RecipeRadar/Localization.lua
@@ -0,0 +1,1341 @@
+
+-- Localization.lua: localization strings and code
+-- Auto generated on 9/18/2006 12:35:41 PM
+
+RecipeRadar_Strings = { }
+
+-- String translation function. Looks up the given string in the string
+-- table and returns the result, or the original string if no result is
+-- found. This means that localizations needn't account for every string -
+-- the missing strings will just match the hardcoded defaults.
+function RRS(s)
+
+ if (RecipeRadar_Strings[s] and RecipeRadar_Strings[s] ~= "") then
+ return RecipeRadar_Strings[s]
+ end
+ return s
+
+end
+
+-- This is a sample locale that includes null translations of all strings
+-- used by the addon. Real translations will contain a subset of these
+-- with, of course, mappings to actual strings in other languages. This
+-- section is purely for the benefit of translators and doesn't affect the
+-- operation of the addon in any way (note the behavior of RRS(), above).
+if (GetLocale() == "sample") then
+
+ -- the name of the addon!
+ RecipeRadar_Strings["Recipe Radar"] = ""
+
+ -- these show up in the game's Key Bindings screen
+ RecipeRadar_Strings["Recipe Radar Bindings"] = ""
+ RecipeRadar_Strings["Toggle Recipe Radar"] = ""
+
+ -- options button and corresponding options frame
+ RecipeRadar_Strings["Options"] = ""
+ RecipeRadar_Strings["Auto-select Current Region"] = ""
+ RecipeRadar_Strings["Check Availability for Alts"] = ""
+ RecipeRadar_Strings["Minimap Button Position"] = ""
+ RecipeRadar_Strings["Show Minimap Button"] = ""
+
+ -- format strings used in the map tooltips
+ RecipeRadar_Strings["1 recipe"] = ""
+ RecipeRadar_Strings["%d learnable"] = ""
+ RecipeRadar_Strings["%d recipes"] = ""
+
+ -- this appears when the recipe is not in your local database
+ RecipeRadar_Strings["Uncached Recipe"] = ""
+
+ -- uncached recipe tooltip - see RecipeRadar_Availability_CreateTooltip()
+ RecipeRadar_Strings["You may mouse over the [?]"] = ""
+ RecipeRadar_Strings["icon to lookup this recipe."] = ""
+ RecipeRadar_Strings["Warning: if your server has"] = ""
+ RecipeRadar_Strings["not yet seen this item, you"] = ""
+ RecipeRadar_Strings["will be disconnected!"] = ""
+
+ -- some regions don't have any recipes for sale
+ RecipeRadar_Strings["No recipes for sale in this region."] = ""
+
+ -- radio button (and tooltip) that indicates a mapped vendor
+ RecipeRadar_Strings["Locate Vendor on Map"] = ""
+ RecipeRadar_Strings["Shift-click a vendor to add or remove her location on the world map."] = ""
+
+ -- strings in the faction filtering dropdown; we don't need 'Horde' or 'Alliance' because Blizzard provides them for us
+ RecipeRadar_Strings["Factions"] = ""
+ RecipeRadar_Strings["Neutral"] = ""
+
+ -- profession filtering dropdown - these strings must match those returned by GetTradeSkillLine() and GetCraftDisplaySkillLine()
+ RecipeRadar_Strings["Professions"] = ""
+ RecipeRadar_Strings["Alchemy"] = ""
+ RecipeRadar_Strings["Blacksmithing"] = ""
+ RecipeRadar_Strings["Cooking"] = ""
+ RecipeRadar_Strings["Enchanting"] = ""
+ RecipeRadar_Strings["Engineering"] = ""
+ RecipeRadar_Strings["First Aid"] = ""
+ RecipeRadar_Strings["Fishing"] = ""
+ RecipeRadar_Strings["Leatherworking"] = ""
+ RecipeRadar_Strings["Tailoring"] = ""
+
+ -- strings in the availability filtering dropdown
+ RecipeRadar_Strings["Availability"] = ""
+ RecipeRadar_Strings["Already Known (Alts)"] = ""
+ RecipeRadar_Strings["Already Known (Player)"] = ""
+ RecipeRadar_Strings["Available Now (Alts)"] = ""
+ RecipeRadar_Strings["Available Now (Player)"] = ""
+ RecipeRadar_Strings["Future Prospect (Alts)"] = ""
+ RecipeRadar_Strings["Future Prospect (Player)"] = ""
+ RecipeRadar_Strings["Inapplicable Professions"] = ""
+
+ -- headings for the availability tooltip
+ RecipeRadar_Strings["Available For:"] = ""
+ RecipeRadar_Strings["Already Known By:"] = ""
+ RecipeRadar_Strings["Future Prospect For:"] = ""
+
+ -- format string for rank indicator for future prospects; that is, it tells you how soon you can learn the recipe - eg. "163 of 175"
+ RecipeRadar_Strings["%d of %d"] = ""
+
+ -- special notes for vendor requirements follow vendor names (eg. "Seasonal Vendor")
+ RecipeRadar_Strings["%s Vendor"] = ""
+ RecipeRadar_Strings["Intermittent"] = ""
+ RecipeRadar_Strings["Quest"] = ""
+ RecipeRadar_Strings["Roving"] = ""
+ RecipeRadar_Strings["Seasonal"] = ""
+
+ -- faction names for recipe reputation requirements
+ RecipeRadar_Strings["Argent Dawn"] = ""
+ RecipeRadar_Strings["Cenarion Circle"] = ""
+ RecipeRadar_Strings["Thorium Brotherhood"] = ""
+ RecipeRadar_Strings["Timbermaw Hold"] = ""
+ RecipeRadar_Strings["Zandalar Tribe"] = ""
+
+ -- other recipe requirements
+ RecipeRadar_Strings["Rogue Only"] = ""
+
+ -- menu item in the right-click context menu for mapped vendor buttons
+ RecipeRadar_Strings["Unmap Vendor"] = ""
+ RecipeRadar_Strings["Collapse"] = ""
+ RecipeRadar_Strings["Collapse All"] = ""
+ RecipeRadar_Strings["Expand"] = ""
+ RecipeRadar_Strings["Expand All"] = ""
+ RecipeRadar_Strings["Map Vendor"] = ""
+
+ -- trade skill specialties
+ RecipeRadar_Strings["Gnomish Engineer"] = ""
+ RecipeRadar_Strings["Armorsmith"] = ""
+ RecipeRadar_Strings["Dragonscale Leatherworking"] = ""
+ RecipeRadar_Strings["Elemental Leatherworking"] = ""
+ RecipeRadar_Strings["Goblin Engineer"] = ""
+ RecipeRadar_Strings["Master Axesmith"] = ""
+ RecipeRadar_Strings["Master Hammersmith"] = ""
+ RecipeRadar_Strings["Master Swordsmith"] = ""
+ RecipeRadar_Strings["Tribal Leatherworking"] = ""
+ RecipeRadar_Strings["Weaponsmith"] = ""
+
+ -- continent names for alternate region selection
+ RecipeRadar_Strings["Kalimdor"] = ""
+ RecipeRadar_Strings["Eastern Kingdoms"] = ""
+ RecipeRadar_Strings["Instances"] = ""
+
+ -- these are the location names returned by GetRealZoneText()
+ -- feel free to add regions not present in this list, too, of course
+ RecipeRadar_Strings["Alterac Mountains"] = ""
+ RecipeRadar_Strings["Arathi Highlands"] = ""
+ RecipeRadar_Strings["Ashenvale"] = ""
+ RecipeRadar_Strings["Azshara"] = ""
+ RecipeRadar_Strings["Badlands"] = ""
+ RecipeRadar_Strings["Blackrock Depths"] = ""
+ RecipeRadar_Strings["Blasted Lands"] = ""
+ RecipeRadar_Strings["Burning Steppes"] = ""
+ RecipeRadar_Strings["Darkshore"] = ""
+ RecipeRadar_Strings["Darnassus"] = ""
+ RecipeRadar_Strings["Desolace"] = ""
+ RecipeRadar_Strings["Dire Maul"] = ""
+ RecipeRadar_Strings["Dun Morogh"] = ""
+ RecipeRadar_Strings["Durotar"] = ""
+ RecipeRadar_Strings["Duskwood"] = ""
+ RecipeRadar_Strings["Dustwallow Marsh"] = ""
+ RecipeRadar_Strings["Eastern Plaguelands"] = ""
+ RecipeRadar_Strings["Elwynn Forest"] = ""
+ RecipeRadar_Strings["Felwood"] = ""
+ RecipeRadar_Strings["Feralas"] = ""
+ RecipeRadar_Strings["Gnomeregan"] = ""
+ RecipeRadar_Strings["Hillsbrad Foothills"] = ""
+ RecipeRadar_Strings["Ironforge"] = ""
+ RecipeRadar_Strings["Loch Modan"] = ""
+ RecipeRadar_Strings["Moonglade"] = ""
+ RecipeRadar_Strings["Mulgore"] = ""
+ RecipeRadar_Strings["Naxxramas"] = ""
+ RecipeRadar_Strings["Orgrimmar"] = ""
+ RecipeRadar_Strings["Redridge Mountains"] = ""
+ RecipeRadar_Strings["Silithus"] = ""
+ RecipeRadar_Strings["Silverpine Forest"] = ""
+ RecipeRadar_Strings["Stonetalon Mountains"] = ""
+ RecipeRadar_Strings["Stormwind City"] = ""
+ RecipeRadar_Strings["Stranglethorn Vale"] = ""
+ RecipeRadar_Strings["Swamp of Sorrows"] = ""
+ RecipeRadar_Strings["Tanaris"] = ""
+ RecipeRadar_Strings["Teldrassil"] = ""
+ RecipeRadar_Strings["The Barrens"] = ""
+ RecipeRadar_Strings["The Hinterlands"] = ""
+ RecipeRadar_Strings["Thousand Needles"] = ""
+ RecipeRadar_Strings["Thunder Bluff"] = ""
+ RecipeRadar_Strings["Tirisfal Glades"] = ""
+ RecipeRadar_Strings["Undercity"] = ""
+ RecipeRadar_Strings["Un'Goro Crater"] = ""
+ RecipeRadar_Strings["Wailing Caverns"] = ""
+ RecipeRadar_Strings["Western Plaguelands"] = ""
+ RecipeRadar_Strings["Westfall"] = ""
+ RecipeRadar_Strings["Wetlands"] = ""
+ RecipeRadar_Strings["Winterspring"] = ""
+
+ -- some vendor names may need translating
+ RecipeRadar_Strings["Abigail Shiel"] = ""
+ RecipeRadar_Strings["Aendel Windspear"] = ""
+ RecipeRadar_Strings["Alchemist Pestlezugg"] = ""
+ RecipeRadar_Strings["Alexandra Bolero"] = ""
+ RecipeRadar_Strings["Algernon"] = ""
+ RecipeRadar_Strings["Amy Davenport"] = ""
+ RecipeRadar_Strings["Andrew Hilbert"] = ""
+ RecipeRadar_Strings["Androd Fadran"] = ""
+ RecipeRadar_Strings["Argent Quartermaster Hasana"] = ""
+ RecipeRadar_Strings["Argent Quartermaster Lightspark"] = ""
+ RecipeRadar_Strings["Balai Lok'Wein"] = ""
+ RecipeRadar_Strings["Bale"] = ""
+ RecipeRadar_Strings["Banalash"] = ""
+ RecipeRadar_Strings["Blimo Gadgetspring"] = ""
+ RecipeRadar_Strings["Blixrez Goodstitch"] = ""
+ RecipeRadar_Strings["Blizrik Buckshot"] = ""
+ RecipeRadar_Strings["Bliztik"] = ""
+ RecipeRadar_Strings["Bombus Finespindle"] = ""
+ RecipeRadar_Strings["Borya"] = ""
+ RecipeRadar_Strings["Brienna Starglow"] = ""
+ RecipeRadar_Strings["Bro'kin"] = ""
+ RecipeRadar_Strings["Bronk"] = ""
+ RecipeRadar_Strings["Catherine Leland"] = ""
+ RecipeRadar_Strings["Christoph Jeffcoat"] = ""
+ RecipeRadar_Strings["Clyde Ranthal"] = ""
+ RecipeRadar_Strings["Constance Brisboise"] = ""
+ RecipeRadar_Strings["Corporal Bluth"] = ""
+ RecipeRadar_Strings["Cowardly Crosby"] = ""
+ RecipeRadar_Strings["Crazk Sparks"] = ""
+ RecipeRadar_Strings["Dalria"] = ""
+ RecipeRadar_Strings["Daniel Bartlett"] = ""
+ RecipeRadar_Strings["Danielle Zipstitch"] = ""
+ RecipeRadar_Strings["Darian Singh"] = ""
+ RecipeRadar_Strings["Darnall"] = ""
+ RecipeRadar_Strings["Defias Profiteer"] = ""
+ RecipeRadar_Strings["Deneb Walker"] = ""
+ RecipeRadar_Strings["Derak Nightfall"] = ""
+ RecipeRadar_Strings["Dirge Quikcleave"] = ""
+ RecipeRadar_Strings["Drac Roughcut"] = ""
+ RecipeRadar_Strings["Drake Lindgren"] = ""
+ RecipeRadar_Strings["Drovnar Strongbrew"] = ""
+ RecipeRadar_Strings["Elynna"] = ""
+ RecipeRadar_Strings["Emrul Riknussun"] = ""
+ RecipeRadar_Strings["Erika Tate"] = ""
+ RecipeRadar_Strings["Evie Whirlbrew"] = ""
+ RecipeRadar_Strings["Fradd Swiftgear"] = ""
+ RecipeRadar_Strings["Fyldan"] = ""
+ RecipeRadar_Strings["Gagsprocket"] = ""
+ RecipeRadar_Strings["Gearcutter Cogspinner"] = ""
+ RecipeRadar_Strings["George Candarte"] = ""
+ RecipeRadar_Strings["Gharash"] = ""
+ RecipeRadar_Strings["Ghok'kah"] = ""
+ RecipeRadar_Strings["Gigget Zipcoil"] = ""
+ RecipeRadar_Strings["Gikkix"] = ""
+ RecipeRadar_Strings["Gina MacGregor"] = ""
+ RecipeRadar_Strings["Gloria Femmel"] = ""
+ RecipeRadar_Strings["Glyx Brewright"] = ""
+ RecipeRadar_Strings["Gnaz Blunderflame"] = ""
+ RecipeRadar_Strings["Gretta Ganter"] = ""
+ RecipeRadar_Strings["Grimtak"] = ""
+ RecipeRadar_Strings["Hagrus"] = ""
+ RecipeRadar_Strings["Hammon Karwn"] = ""
+ RecipeRadar_Strings["Harggan"] = ""
+ RecipeRadar_Strings["Harklan Moongrove"] = ""
+ RecipeRadar_Strings["Harlown Darkweave"] = ""
+ RecipeRadar_Strings["Harn Longcast"] = ""
+ RecipeRadar_Strings["Heldan Galesong"] = ""
+ RecipeRadar_Strings["Helenia Olden"] = ""
+ RecipeRadar_Strings["Himmik"] = ""
+ RecipeRadar_Strings["Hula'mahi"] = ""
+ RecipeRadar_Strings["Jabbey"] = ""
+ RecipeRadar_Strings["Jandia"] = ""
+ RecipeRadar_Strings["Janet Hommers"] = ""
+ RecipeRadar_Strings["Jangdor Swiftstrider"] = ""
+ RecipeRadar_Strings["Jannos Ironwill"] = ""
+ RecipeRadar_Strings["Jaquilina Dramet"] = ""
+ RecipeRadar_Strings["Jase Farlane"] = ""
+ RecipeRadar_Strings["Jazzrik"] = ""
+ RecipeRadar_Strings["Jeeda"] = ""
+ RecipeRadar_Strings["Jennabink Powerseam"] = ""
+ RecipeRadar_Strings["Jessara Cordell"] = ""
+ RecipeRadar_Strings["Jinky Twizzlefixxit"] = ""
+ RecipeRadar_Strings["Joseph Moore"] = ""
+ RecipeRadar_Strings["Jubie Gadgetspring"] = ""
+ RecipeRadar_Strings["Jun'ha"] = ""
+ RecipeRadar_Strings["Jutak"] = ""
+ RecipeRadar_Strings["Kaita Deepforge"] = ""
+ RecipeRadar_Strings["Kalldan Felmoon"] = ""
+ RecipeRadar_Strings["Kania"] = ""
+ RecipeRadar_Strings["Keena"] = ""
+ RecipeRadar_Strings["Kelsey Yance"] = ""
+ RecipeRadar_Strings["Kendor Kabonka"] = ""
+ RecipeRadar_Strings["Khara Deepwater"] = ""
+ RecipeRadar_Strings["Khole Jinglepocket"] = ""
+ RecipeRadar_Strings["Kiknikle"] = ""
+ RecipeRadar_Strings["Killian Sanatha"] = ""
+ RecipeRadar_Strings["Kilxx"] = ""
+ RecipeRadar_Strings["Kireena"] = ""
+ RecipeRadar_Strings["Kithas"] = ""
+ RecipeRadar_Strings["Knaz Blunderflame"] = ""
+ RecipeRadar_Strings["Kor'geld"] = ""
+ RecipeRadar_Strings["Kriggon Talsone"] = ""
+ RecipeRadar_Strings["Krinkle Goodsteel"] = ""
+ RecipeRadar_Strings["Kulwia"] = ""
+ RecipeRadar_Strings["Kzixx"] = ""
+ RecipeRadar_Strings["Laird"] = ""
+ RecipeRadar_Strings["Lardan"] = ""
+ RecipeRadar_Strings["Leo Sarn"] = ""
+ RecipeRadar_Strings["Leonard Porter"] = ""
+ RecipeRadar_Strings["Lilly"] = ""
+ RecipeRadar_Strings["Lindea Rabonne"] = ""
+ RecipeRadar_Strings["Lizbeth Cromwell"] = ""
+ RecipeRadar_Strings["Logannas"] = ""
+ RecipeRadar_Strings["Lokhtos Darkbargainer"] = ""
+ RecipeRadar_Strings["Lorelae Wintersong"] = ""
+ RecipeRadar_Strings["Magnus Frostwake"] = ""
+ RecipeRadar_Strings["Mahu"] = ""
+ RecipeRadar_Strings["Mallen Swain"] = ""
+ RecipeRadar_Strings["Malygen"] = ""
+ RecipeRadar_Strings["Maria Lumere"] = ""
+ RecipeRadar_Strings["Martine Tramblay"] = ""
+ RecipeRadar_Strings["Masat T'andr"] = ""
+ RecipeRadar_Strings["Master Craftsman Omarion"] = ""
+ RecipeRadar_Strings["Mavralyn"] = ""
+ RecipeRadar_Strings["Mazk Snipeshot"] = ""
+ RecipeRadar_Strings["Meilosh"] = ""
+ RecipeRadar_Strings["Micha Yance"] = ""
+ RecipeRadar_Strings["Millie Gregorian"] = ""
+ RecipeRadar_Strings["Mishta"] = ""
+ RecipeRadar_Strings["Montarr"] = ""
+ RecipeRadar_Strings["Muuran"] = ""
+ RecipeRadar_Strings["Mythrin'dir"] = ""
+ RecipeRadar_Strings["Naal Mistrunner"] = ""
+ RecipeRadar_Strings["Namdo Bizzfizzle"] = ""
+ RecipeRadar_Strings["Nandar Branson"] = ""
+ RecipeRadar_Strings["Nardstrum Copperpinch"] = ""
+ RecipeRadar_Strings["Narj Deepslice"] = ""
+ RecipeRadar_Strings["Narkk"] = ""
+ RecipeRadar_Strings["Nata Dawnstrider"] = ""
+ RecipeRadar_Strings["Nergal"] = ""
+ RecipeRadar_Strings["Nerrist"] = ""
+ RecipeRadar_Strings["Nessa Shadowsong"] = ""
+ RecipeRadar_Strings["Nina Lightbrew"] = ""
+ RecipeRadar_Strings["Nioma"] = ""
+ RecipeRadar_Strings["Nyoma"] = ""
+ RecipeRadar_Strings["Ogg'marr"] = ""
+ RecipeRadar_Strings["Old Man Heming"] = ""
+ RecipeRadar_Strings["Otho Moji'ko"] = ""
+ RecipeRadar_Strings["Outfitter Eric"] = ""
+ RecipeRadar_Strings["Penney Copperpinch"] = ""
+ RecipeRadar_Strings["Plugger Spazzring"] = ""
+ RecipeRadar_Strings["Pratt McGrubben"] = ""
+ RecipeRadar_Strings["Qia"] = ""
+ RecipeRadar_Strings["Quartermaster Miranda Breechlock"] = ""
+ RecipeRadar_Strings["Ranik"] = ""
+ RecipeRadar_Strings["Rann Flamespinner"] = ""
+ RecipeRadar_Strings["Rartar"] = ""
+ RecipeRadar_Strings["Rikqiz"] = ""
+ RecipeRadar_Strings["Rin'wosho the Trader"] = ""
+ RecipeRadar_Strings["Rizz Loosebolt"] = ""
+ RecipeRadar_Strings["Ronald Burch"] = ""
+ RecipeRadar_Strings["Ruppo Zipcoil"] = ""
+ RecipeRadar_Strings["Saenorion"] = ""
+ RecipeRadar_Strings["Seersa Copperpinch"] = ""
+ RecipeRadar_Strings["Sewa Mistrunner"] = ""
+ RecipeRadar_Strings["Shandrina"] = ""
+ RecipeRadar_Strings["Shankys"] = ""
+ RecipeRadar_Strings["Sheendra Tallgrass"] = ""
+ RecipeRadar_Strings["Shen'dralar Provisioner"] = ""
+ RecipeRadar_Strings["Sheri Zipstitch"] = ""
+ RecipeRadar_Strings["Smudge Thunderwood"] = ""
+ RecipeRadar_Strings["Soolie Berryfizz"] = ""
+ RecipeRadar_Strings["Sovik"] = ""
+ RecipeRadar_Strings["Stuart Fleming"] = ""
+ RecipeRadar_Strings["Sumi"] = ""
+ RecipeRadar_Strings["Super-Seller 680"] = ""
+ RecipeRadar_Strings["Tamar"] = ""
+ RecipeRadar_Strings["Tansy Puddlefizz"] = ""
+ RecipeRadar_Strings["Tarban Hearthgrain"] = ""
+ RecipeRadar_Strings["Tari'qa"] = ""
+ RecipeRadar_Strings["Thaddeus Webb"] = ""
+ RecipeRadar_Strings["Tharynn Bouden"] = ""
+ RecipeRadar_Strings["Tilli Thistlefuzz"] = ""
+ RecipeRadar_Strings["Truk Wildbeard"] = ""
+ RecipeRadar_Strings["Tunkk"] = ""
+ RecipeRadar_Strings["Ulthaan"] = ""
+ RecipeRadar_Strings["Ulthir"] = ""
+ RecipeRadar_Strings["Uthok"] = ""
+ RecipeRadar_Strings["Vaean"] = ""
+ RecipeRadar_Strings["Valdaron"] = ""
+ RecipeRadar_Strings["Vargus"] = ""
+ RecipeRadar_Strings["Veenix"] = ""
+ RecipeRadar_Strings["Vendor-Tron 1000"] = ""
+ RecipeRadar_Strings["Vharr"] = ""
+ RecipeRadar_Strings["Vivianna"] = ""
+ RecipeRadar_Strings["Vizzklick"] = ""
+ RecipeRadar_Strings["Wenna Silkbeard"] = ""
+ RecipeRadar_Strings["Werg Thickblade"] = ""
+ RecipeRadar_Strings["Wik'Tar"] = ""
+ RecipeRadar_Strings["Worb Strongstitch"] = ""
+ RecipeRadar_Strings["Wrahk"] = ""
+ RecipeRadar_Strings["Wulan"] = ""
+ RecipeRadar_Strings["Wulmort Jinglepocket"] = ""
+ RecipeRadar_Strings["Wunna Darkmane"] = ""
+ RecipeRadar_Strings["Xandar Goodbeard"] = ""
+ RecipeRadar_Strings["Xen'to"] = ""
+ RecipeRadar_Strings["Xizk Goodstitch"] = ""
+ RecipeRadar_Strings["Xizzer Fizzbolt"] = ""
+ RecipeRadar_Strings["Yonada"] = ""
+ RecipeRadar_Strings["Yuka Screwspigot"] = ""
+ RecipeRadar_Strings["Zan Shivsproket"] = ""
+ RecipeRadar_Strings["Zannok Hidepiercer"] = ""
+ RecipeRadar_Strings["Zansoa"] = ""
+ RecipeRadar_Strings["Zarena Cromwind"] = ""
+ RecipeRadar_Strings["Zargh"] = ""
+ RecipeRadar_Strings["Zixil"] = ""
+ RecipeRadar_Strings["Zorbin Fandazzle"] = ""
+
+end
+
+-- actual locales and the relevant string tables follow
+if (GetLocale() == "ruRU") then
+
+-- Version : Russian ( by Maus )
+
+ -- the name of the addon!
+ RecipeRadar_Strings["Recipe Radar"] = "Радар Рецептов"
+
+ -- these show up in the game's Key Bindings screen
+ RecipeRadar_Strings["Recipe Radar Bindings"] = "Настройки клавиш Радара Рецептов"
+ RecipeRadar_Strings["Toggle Recipe Radar"] = "Включить Радар Рецептов"
+
+ -- options button and corresponding options frame
+ RecipeRadar_Strings["Options"] = "Настройки"
+ RecipeRadar_Strings["Auto-select Current Region"] = "Автоматически выбирать текущую \nтерриторию"
+ RecipeRadar_Strings["Auto-map Contributive Vendors"] = "Автоматически показывать продавцов \nс доступными рецептами на мини-карте"
+ RecipeRadar_Strings["Check Availability for Alts"] = "Проверять доступность для альтов"
+ RecipeRadar_Strings["Minimap Button Position"] = "Позиция кнопки у мини-карты"
+ RecipeRadar_Strings["Show Minimap Button"] = "Показывать кнопку у мини-карты"
+
+ -- format strings used in the map tooltips
+ RecipeRadar_Strings["1 recipe"] = "1 рецепт"
+ RecipeRadar_Strings["%d learnable"] = "%d можно изучить"
+ RecipeRadar_Strings["%d recipes"] = "Рецептов: %d"
+
+ -- this appears when the recipe is not in your local database
+ RecipeRadar_Strings["Uncached Recipe"] = "Неизвестный рецепт"
+
+ -- uncached recipe tooltip - see RecipeRadar_Availability_CreateTooltip()
+ RecipeRadar_Strings["You may mouse over the [?]"] = "Вы можете провести мышью через иконку"
+ RecipeRadar_Strings["icon to lookup this recipe."] = "чтобы узнать этот рецепт."
+ RecipeRadar_Strings["Warning: if your server has"] = "Внимание: если ваш сервер"
+ RecipeRadar_Strings["not yet seen this item, you"] = "еще не имеет этого предмета, вы"
+ RecipeRadar_Strings["will be disconnected!"] = "будете отсоеденены!"
+
+ -- some regions don't have any recipes for sale
+ RecipeRadar_Strings["No recipes for sale in this region."] = "В этой территории нет рецептов"
+
+ -- radio button (and tooltip) that indicates a mapped vendor
+ RecipeRadar_Strings["Locate Vendor on Map"] = "Показывать продавцов на карте"
+ RecipeRadar_Strings["Shift-click a vendor to add or remove her location on the world map."] = "Shift-клик чтобы добавить или убрать местонахождение продавца на карте мира"
+
+ -- strings in the faction filtering dropdown; we don't need 'Horde' or 'Alliance' because Blizzard provides them for us
+ RecipeRadar_Strings["Factions"] = "Фракции"
+ RecipeRadar_Strings["Neutral"] = "Нейтрально"
+
+ -- profession filtering dropdown - these strings must match those returned by GetTradeSkillLine() and GetCraftDisplaySkillLine()
+ RecipeRadar_Strings["Professions"] = "Профессии"
+ RecipeRadar_Strings["Alchemy"] = "Алхимия"
+ RecipeRadar_Strings["Blacksmithing"] = "Кузнечное дело"
+ RecipeRadar_Strings["Cooking"] = "Кулинария"
+ RecipeRadar_Strings["Enchanting"] = "Наложение чар"
+ RecipeRadar_Strings["Engineering"] = "Инженерное дело"
+ RecipeRadar_Strings["First Aid"] = "Первая помощь"
+ RecipeRadar_Strings["Fishing"] = "Рыбная ловля"
+ RecipeRadar_Strings["Leatherworking"] = "Кожевничество"
+ RecipeRadar_Strings["Tailoring"] = "Портняжное дело"
+
+ -- strings in the availability filtering dropdown
+ RecipeRadar_Strings["Availability"] = "Доступно"
+ RecipeRadar_Strings["Already Known (Alts)"] = "Уже известно (альт)"
+ RecipeRadar_Strings["Already Known (Player)"] = "Уже известно (игрок)"
+ RecipeRadar_Strings["Available Now (Alts)"] = "Доступно (альт)"
+ RecipeRadar_Strings["Available Now (Player)"] = "Доступно (игрок)"
+ RecipeRadar_Strings["Future Prospect (Alts)"] = "Будет доступно (альт)"
+ RecipeRadar_Strings["Future Prospect (Player)"] = "Будет доступно (игрок)"
+ RecipeRadar_Strings["Inapplicable Professions"] = "Неприменимые Профессии "
+
+ -- headings for the availability tooltip
+ RecipeRadar_Strings["Available For:"] = "Доступно для:"
+ RecipeRadar_Strings["Already Known By:"] = "Уже известно:"
+ RecipeRadar_Strings["Future Prospect For:"] = "Будет доступно для:"
+
+ -- format string for rank indicator for future prospects; that is, it tells you how soon you can learn the recipe - eg. "163 of 175"
+ RecipeRadar_Strings["%d of %d"] = "%d из %d"
+
+ -- special notes for vendor requirements follow vendor names (eg. "Seasonal Vendor")
+ RecipeRadar_Strings["%s Vendor"] = "%s продавец"
+ RecipeRadar_Strings["Intermittent"] = "Перемещяющийся"
+ RecipeRadar_Strings["Quest"] = "C заданий"
+ RecipeRadar_Strings["Roving"] = "Бродячий"
+ RecipeRadar_Strings["Seasonal"] = "Сезонный"
+
+ -- faction names for recipe reputation requirements
+ RecipeRadar_Strings["Argent Dawn"] = "Серебряный Рассвет"
+ RecipeRadar_Strings["Cenarion Circle"] = "Круг Кенария"
+ RecipeRadar_Strings["Thorium Brotherhood"] = "Братство Тория"
+ RecipeRadar_Strings["Timbermaw Hold"] = "Древобрюхи"
+ RecipeRadar_Strings["Zandalar Tribe"] = "Племя Зандалар"
+
+ -- other recipe requirements
+ RecipeRadar_Strings["Rogue Only"] = "Только разбойник"
+
+ -- menu item in the right-click context menu for mapped vendor buttons
+ RecipeRadar_Strings["Unmap Vendor"] = "Убрать продовца с карты"
+ RecipeRadar_Strings["Collapse"] = "Свернуть"
+ RecipeRadar_Strings["Collapse All"] = "Свернуть все"
+ RecipeRadar_Strings["Expand"] = "Раскрыть"
+ RecipeRadar_Strings["Expand All"] = "Раскрыть все"
+ RecipeRadar_Strings["Map Vendor"] = "Показать продовца на карте"
+
+ -- trade skill specialties
+ RecipeRadar_Strings["Gnomish Engineer"] = "Гномский механик"
+ RecipeRadar_Strings["Armorsmith"] = "Бронник"
+ RecipeRadar_Strings["Dragonscale Leatherworking"] = "Кожевничество: чешуя дракона"
+ RecipeRadar_Strings["Elemental Leatherworking"] = "Кожевничество: сила стихий"
+ RecipeRadar_Strings["Goblin Engineer"] = "Гоблинский механик"
+ RecipeRadar_Strings["Master Axesmith"] = "Мастер школы топора"
+ RecipeRadar_Strings["Master Hammersmith"] = "Мастер школы молота"
+ RecipeRadar_Strings["Master Swordsmith"] = "Мастер ковки клинков"
+ RecipeRadar_Strings["Tribal Leatherworking"] = "Кожевничество: традиции предков"
+ RecipeRadar_Strings["Weaponsmith"] = "Оружейник"
+
+ -- continent names for alternate region selection
+ RecipeRadar_Strings["Kalimdor"] = "Калимдор"
+ RecipeRadar_Strings["Eastern Kingdoms"] = "Восточные королевства"
+ RecipeRadar_Strings["Instances"] = "Подземелья"
+
+ -- these are the location names returned by GetRealZoneText()
+ -- feel free to add regions not present in this list, too, of course
+ -- added from wotlk addons (ruRU)
+ RecipeRadar_Strings["Alterac Mountains"] = "Альтеракские горы"
+ RecipeRadar_Strings["Arathi Highlands"] = "Нагорье Арати"
+ RecipeRadar_Strings["Ashenvale"] = "Ясеневый лес"
+ RecipeRadar_Strings["Azshara"] = "Азшара"
+ RecipeRadar_Strings["Azuremyst Isle"] = "Остров Лазурной Дымки"
+ RecipeRadar_Strings["Badlands"] = "Бесплодные земли"
+ RecipeRadar_Strings["Black Temple"] = "Черный Храм"
+ RecipeRadar_Strings["Blackrock Depths"] = "Глубины Черной горы"
+ RecipeRadar_Strings["Blade's Edge Mountains"] = "Острогорье"
+ RecipeRadar_Strings["Blasted Lands"] = "Выжженные земли"
+ RecipeRadar_Strings["Bloodmyst Isle"] = "Остров Кровавой Дымки"
+ RecipeRadar_Strings["Borean Tundra"] = "Борейская тундра"
+ RecipeRadar_Strings["Burning Steppes"] = "Пылающие степи"
+ RecipeRadar_Strings["Crystalsong Forest"] = "Лес Хрустальной Песни"
+ RecipeRadar_Strings["Dalaran"] = "Даларан"
+ RecipeRadar_Strings["Darkshore"] = "Темные берега"
+ RecipeRadar_Strings["Darnassus"] = "Дарнас"
+ RecipeRadar_Strings["Deadwind Pass"] = "Перевал Мертвого Ветра"
+ RecipeRadar_Strings["Desolace"] = "Пустоши"
+ RecipeRadar_Strings["Dire Maul"] = "Забытый Город"
+ RecipeRadar_Strings["Dragonblight"] = "Драконий Погост"
+ RecipeRadar_Strings["Dun Morogh"] = "Дун Морог"
+ RecipeRadar_Strings["Durotar"] = "Дуротар"
+ RecipeRadar_Strings["Duskwood"] = "Сумеречный лес"
+ RecipeRadar_Strings["Dustwallow Marsh"] = "Пылевые топи"
+ RecipeRadar_Strings["Eastern Plaguelands"] = "Восточные Чумные земли"
+ RecipeRadar_Strings["Elwynn Forest"] = "Элвиннский лес"
+ RecipeRadar_Strings["Eversong Woods"] = "Леса Вечной Песни"
+ RecipeRadar_Strings["Felwood"] = "Оскверненный лес"
+ RecipeRadar_Strings["Feralas"] = "Фералас"
+ RecipeRadar_Strings["Ghostlands"] = "Призрачные земли"
+ RecipeRadar_Strings["Gnomeregan"] = "Гномреган"
+ RecipeRadar_Strings["Grizzly Hills"] = "Седые холмы"
+ RecipeRadar_Strings["Hellfire Peninsula"] = "Полуостров Адского Пламени"
+ RecipeRadar_Strings["Hillsbrad Foothills"] = "Предгорья Хилсбрада"
+ RecipeRadar_Strings["Howling Fjord"] = "Ревущий фьорд"
+ RecipeRadar_Strings["Hyjal Summit"] = "Вершина Хиджала"
+ RecipeRadar_Strings["Icecrown"] = "Ледяная Корона"
+ RecipeRadar_Strings["Ironforge"] = "Стальгорн"
+ RecipeRadar_Strings["Isle of Quel'Danas"] = "Остров Кель'Данас"
+ RecipeRadar_Strings["Karazhan"] = "Каражан"
+ RecipeRadar_Strings["Loch Modan"] = "Лок Модан"
+ RecipeRadar_Strings["Moonglade"] = "Лунная поляна"
+ RecipeRadar_Strings["Mulgore"] = "Мулгор"
+ RecipeRadar_Strings["Nagrand"] = "Награнд"
+ RecipeRadar_Strings["Naxxramas"] = "Наксрамас"
+ RecipeRadar_Strings["Netherstorm"] = "Пустоверть"
+ RecipeRadar_Strings["Old Hillsbrad Foothills"] = "Старые предгорья Хилсбрада"
+ RecipeRadar_Strings["Orgrimmar"] = "Оргриммар"
+ RecipeRadar_Strings["Redridge Mountains"] = "Красногорье"
+ RecipeRadar_Strings["Ruins of Ahn'Qiraj"] = "Руины Ан'Киража"
+ RecipeRadar_Strings["Searing Gorge"] = "Тлеющее ущелье"
+ RecipeRadar_Strings["Shadowmoon Valley"] = "Долина Призрачной Луны"
+ RecipeRadar_Strings["Shattrath City"] = "Шаттрат"
+ RecipeRadar_Strings["Sholazar Basin"] = "Низина Шолазар"
+ RecipeRadar_Strings["Silithus"] = "Силитус"
+ RecipeRadar_Strings["Silvermoon City"] = "Луносвет"
+ RecipeRadar_Strings["Silverpine Forest"] = "Серебряный бор"
+ RecipeRadar_Strings["Stonetalon Mountains"] = "Когтистые горы"
+ RecipeRadar_Strings["Stormwind City"] = "Штормград"
+ RecipeRadar_Strings["Stranglethorn Vale"] = "Тернистая долина"
+ RecipeRadar_Strings["Swamp of Sorrows"] = "Болото Печали"
+ RecipeRadar_Strings["Tanaris"] = "Танарис"
+ RecipeRadar_Strings["Teldrassil"] = "Тельдрассил"
+ RecipeRadar_Strings["Terokkar Forest"] = "Лес Тероккар"
+ RecipeRadar_Strings["The Barrens"] = "Степи"
+ RecipeRadar_Strings["The Exodar"] = "Экзодар"
+ RecipeRadar_Strings["The Hinterlands"] = "Внутренние земли"
+ RecipeRadar_Strings["The Storm Peaks"] = "Грозовая Гряда"
+ RecipeRadar_Strings["Thousand Needles"] = "Тысяча Игл"
+ RecipeRadar_Strings["Thunder Bluff"] = "Громовой Утес"
+ RecipeRadar_Strings["Tirisfal Glades"] = "Тирисфальские леса"
+ RecipeRadar_Strings["Undercity"] = "Подгород"
+ RecipeRadar_Strings["Un'Goro Crater"] = "Кратер Ун'Горо"
+ RecipeRadar_Strings["Wailing Caverns"] = "Пещеры Стенаний"
+ RecipeRadar_Strings["Western Plaguelands"] = "Западные Чумные земли"
+ RecipeRadar_Strings["Westfall"] = "Западный Край"
+ RecipeRadar_Strings["Wetlands"] = "Болотина"
+ RecipeRadar_Strings["Wintergrasp"] = "Озеро Ледяных Оков"
+ RecipeRadar_Strings["Winterspring"] = "Зимние Ключи"
+ RecipeRadar_Strings["Zangarmarsh"] = "Зангартопь"
+ RecipeRadar_Strings["Zul'Drak"] = "Зул'Драк"
+
+ -- some vendor names may need translating
+ -- added from wotlk addons (ruRU)
+ RecipeRadar_Strings["\"Cookie\" McWeaksauce"] = "\"Поваренок\" Максъедобус"
+ RecipeRadar_Strings["Aaron Hollman"] = "Аарон Холлман"
+ RecipeRadar_Strings["Abigail Shiel"] = "Эбигейл Шиль"
+ RecipeRadar_Strings["Aendel Windspear"] = "Эндель Копье Ветра"
+ RecipeRadar_Strings["Aged Dalaran Wizard"] = "Даларанский старый волшебник"
+ RecipeRadar_Strings["Ainderu Summerleaf"] = "Айндеру Летний Лист"
+ RecipeRadar_Strings["Alchemist Gribble"] = "Алхимик Гриббл"
+ RecipeRadar_Strings["Alchemist Pestlezugg"] = "Алхимик Пестычинс"
+ RecipeRadar_Strings["Aldraan"] = "Алдраан"
+ RecipeRadar_Strings["Alexandra Bolero"] = "Александра Болеро"
+ RecipeRadar_Strings["Algernon"] = "Алжернон"
+ RecipeRadar_Strings["Almaador"] = "Альмаадор"
+ RecipeRadar_Strings["Altaa"] = "Алтаа"
+ RecipeRadar_Strings["Alurmi"] = "Алурми"
+ RecipeRadar_Strings["Alys Vol'tyr"] = "Алис Вол'тир"
+ RecipeRadar_Strings["Amy Davenport"] = "Ами Девенпорт"
+ RecipeRadar_Strings["Andormu"] = "Андорму"
+ RecipeRadar_Strings["Andrew Hilbert"] = "Эндрю Гилберт"
+ RecipeRadar_Strings["Andrion Darkspinner"] = "Андрион Темнопряд"
+ RecipeRadar_Strings["Androd Fadran"] = "Андрод Фадран"
+ RecipeRadar_Strings["Apothecary Antonivich"] = "Аптекарь Антонивич"
+ RecipeRadar_Strings["Apprentice Darius"] = "Ученик Дариус"
+ RecipeRadar_Strings["Archmage Alvareaux"] = "Верховный маг Алварекс"
+ RecipeRadar_Strings["Aresella"] = "Ареселла"
+ RecipeRadar_Strings["Argent Quartermaster Hasana"] = "Интендант Хасна из ордена Серебряного Рассвета"
+ RecipeRadar_Strings["Argent Quartermaster Lightspark"] = "Интендант Искромет из ордена Серебряного Рассвета"
+ RecipeRadar_Strings["Arille Azuregaze"] = "Арилль Лазурный Взгляд"
+ RecipeRadar_Strings["Arras"] = "Аррас"
+ RecipeRadar_Strings["Arred"] = "Арред"
+ RecipeRadar_Strings["Arrond"] = "Арронд"
+ RecipeRadar_Strings["Asarnan"] = "Азарнан"
+ RecipeRadar_Strings["Balai Lok'Wein"] = "Бала Лок'Вен"
+ RecipeRadar_Strings["Bale"] = "Тюкн"
+ RecipeRadar_Strings["Banalash"] = "Баналаш"
+ RecipeRadar_Strings["Baxter"] = "Бакстер"
+ RecipeRadar_Strings["Blackwing"] = "Крыло Тьмы"
+ RecipeRadar_Strings["Blimo Gadgetspring"] = "Блимо Прибамбас"
+ RecipeRadar_Strings["Blixrez Goodstitch"] = "Бликрез Ладноскрой"
+ RecipeRadar_Strings["Blizrik Buckshot"] = "Близрик Шрапнельс"
+ RecipeRadar_Strings["Bliztik"] = "Близтик"
+ RecipeRadar_Strings["Bombus Finespindle"] = "Бомбус Остроигл"
+ RecipeRadar_Strings["Borto"] = "Борто"
+ RecipeRadar_Strings["Borya"] = "Боря"
+ RecipeRadar_Strings["Bradley Towns"] = "Бредли Таунс"
+ RecipeRadar_Strings["Braeg Stoutbeard"] = "Брейг Пивобород"
+ RecipeRadar_Strings["Brienna Starglow"] = "Бриенна Мерцание Звезд"
+ RecipeRadar_Strings["Bro'kin"] = "Бро'кин"
+ RecipeRadar_Strings["Bronk"] = "Бронк"
+ RecipeRadar_Strings["Burbik Gearspanner"] = "Бурбик Гайковерт"
+ RecipeRadar_Strings["Burko"] = "Бюрко"
+ RecipeRadar_Strings["Captain O'Neal"] = "Капитан О'Нил"
+ RecipeRadar_Strings["Captured Gnome"] = "Пленный гном"
+ RecipeRadar_Strings["Catherine Leland"] = "Катрин Лиланд"
+ RecipeRadar_Strings["Christoph Jeffcoat"] = "Кристоф Френч"
+ RecipeRadar_Strings["Cielstrasza"] = "Небостраза"
+ RecipeRadar_Strings["Clyde Ranthal"] = "Клайд Рантал"
+ RecipeRadar_Strings["Constance Brisboise"] = "Констанция Брибуа"
+ RecipeRadar_Strings["Cookie One-Eye"] = "Поваренок Одноглаз"
+ RecipeRadar_Strings["Coreiel"] = "Кориэль"
+ RecipeRadar_Strings["Corporal Bluth"] = "Капрал Блуф"
+ RecipeRadar_Strings["Cowardly Crosby"] = "Трусишка Кросби"
+ RecipeRadar_Strings["Crazk Sparks"] = "Кразк Искрец"
+ RecipeRadar_Strings["Cro Threadstrong"] = "Кро Ладнокрой"
+ RecipeRadar_Strings["Daga Ramba"] = "Дага Рамба"
+ RecipeRadar_Strings["Daggle Ironshaper"] = "Даггл Литейщик"
+ RecipeRadar_Strings["Dalria"] = "Дальрия"
+ RecipeRadar_Strings["Daniel Bartlett"] = "Даниэль Бартлетт"
+ RecipeRadar_Strings["Danielle Zipstitch"] = "Даниэлла Рваношов"
+ RecipeRadar_Strings["Darian Singh"] = "Дариан Сингх"
+ RecipeRadar_Strings["Darnall"] = "Дарналл"
+ RecipeRadar_Strings["Dealer Malij"] = "Делец Малиж"
+ RecipeRadar_Strings["Defias Profiteer"] = "Спекулянт из Братства Справедливости"
+ RecipeRadar_Strings["Deneb Walker"] = "Денеб Уокер"
+ RecipeRadar_Strings["Derak Nightfall"] = "Дерек Приход Тьмы"
+ RecipeRadar_Strings["Derek Odds"] = "Дерек Оддс"
+ RecipeRadar_Strings["Deynna"] = "Дейна"
+ RecipeRadar_Strings["Dirge Quikcleave"] = "Могиль Быстроруб"
+ RecipeRadar_Strings["Doba"] = "Доба"
+ RecipeRadar_Strings["Doris Volanthius"] = "Дорисса Волантий"
+ RecipeRadar_Strings["Drac Roughcut"] = "Драк Грубиян"
+ RecipeRadar_Strings["Drake Lindgren"] = "Дрейк Линдгрен"
+ RecipeRadar_Strings["Drovnar Strongbrew"] = "Дровнар Густовар"
+ RecipeRadar_Strings["Duchess Mynx"] = "Герцогиня Минкс"
+ RecipeRadar_Strings["Edna Mullby"] = "Эдна Милби"
+ RecipeRadar_Strings["Eebee Jinglepocket"] = "Лореала Деньгозвон"
+ RecipeRadar_Strings["Egomis"] = "Эгомис"
+ RecipeRadar_Strings["Eiin"] = "Эйин"
+ RecipeRadar_Strings["Eldara Dawnrunner"] = "Эльдара Вестница Зари"
+ RecipeRadar_Strings["Elynna"] = "Элинна"
+ RecipeRadar_Strings["Emrul Riknussun"] = "Эмруль Рикнуссен"
+ RecipeRadar_Strings["Eriden"] = "Эриден"
+ RecipeRadar_Strings["Erika Tate"] = "Эрика Тейт"
+ RecipeRadar_Strings["Erilia"] = "Эрилия"
+ RecipeRadar_Strings["Evie Whirlbrew"] = "Иви Бурноварка"
+ RecipeRadar_Strings["Fariel Starsong"] = "Фариэль Песнь Звезд"
+ RecipeRadar_Strings["Fazu"] = "Фазу"
+ RecipeRadar_Strings["Fedryen Swiftspear"] = "Федриен Быстрое Копье"
+ RecipeRadar_Strings["Feera"] = "Феера"
+ RecipeRadar_Strings["Felannia"] = "Феланния"
+ RecipeRadar_Strings["Felicia Doan"] = "Фелиция Доан"
+ RecipeRadar_Strings["Felika"] = "Фелика"
+ RecipeRadar_Strings["Fradd Swiftgear"] = "Фрадд Бынструмент"
+ RecipeRadar_Strings["Fyldan"] = "Филдан"
+ RecipeRadar_Strings["Gagsprocket"] = "Заглушестер"
+ RecipeRadar_Strings["Galley Chief Alunwea"] = "Галерный кок Алунвея"
+ RecipeRadar_Strings["Galley Chief Gathers"] = "Галерный кок Сборень"
+ RecipeRadar_Strings["Galley Chief Grace"] = "Галерный повар Грейс"
+ RecipeRadar_Strings["Galley Chief Halumvorea"] = "Галерный кок Галумвория"
+ RecipeRadar_Strings["Galley Chief Mariss"] = "Галерный кок Марисс"
+ RecipeRadar_Strings["Galley Chief Steelbelly"] = "Галерный кок Сталебрюх"
+ RecipeRadar_Strings["Gambarinka"] = "Гамбаринко"
+ RecipeRadar_Strings["Gara Skullcrush"] = "Гара Череполом"
+ RecipeRadar_Strings["Gaston"] = "Гастон"
+ RecipeRadar_Strings["Gearcutter Cogspinner"] = "Зуборез Шестеренок"
+ RecipeRadar_Strings["Geen"] = "Джин"
+ RecipeRadar_Strings["Gelanthis"] = "Гелантис"
+ RecipeRadar_Strings["George Candarte"] = "Джорлж Кандарте"
+ RecipeRadar_Strings["Gharash"] = "Гхарраш"
+ RecipeRadar_Strings["Ghok'kah"] = "Гхок'ка"
+ RecipeRadar_Strings["Gidge Spellweaver"] = "Гиджа Чароплетка"
+ RecipeRadar_Strings["Gigget Zipcoil"] = "Гиджет Свистопулька"
+ RecipeRadar_Strings["Gikkix"] = "Гиккикс"
+ RecipeRadar_Strings["Gina MacGregor"] = "Джина Макгрегор"
+ RecipeRadar_Strings["Gloria Femmel"] = "Глория Даммель"
+ RecipeRadar_Strings["Glyx Brewright"] = "Гликс Пивоправ"
+ RecipeRadar_Strings["Gnaz Blunderflame"] = "Гназ Огнепых"
+ RecipeRadar_Strings["Gretta Ganter"] = "Гретта Гантер"
+ RecipeRadar_Strings["Grimtak"] = "Гримтак"
+ RecipeRadar_Strings["Haalrun"] = "Хаалрун"
+ RecipeRadar_Strings["Haferet"] = "Хаферет"
+ RecipeRadar_Strings["Hagrus"] = "Хагрус"
+ RecipeRadar_Strings["Hammon Karwn"] = "Хаммон Карун"
+ RecipeRadar_Strings["Harggan"] = "Харгган"
+ RecipeRadar_Strings["Harklan Moongrove"] = "Харклан Лунная Роща"
+ RecipeRadar_Strings["Harlon Thornguard"] = "Харлон Терновый Страж"
+ RecipeRadar_Strings["Harlown Darkweave"] = "Харлон Темный Узор"
+ RecipeRadar_Strings["Harn Longcast"] = "Харн Далекий Заброс"
+ RecipeRadar_Strings["Haughty Modiste"] = "Отти Кутюри"
+ RecipeRadar_Strings["Heldan Galesong"] = "Хельдан Рокот Прибоя"
+ RecipeRadar_Strings["Helenia Olden"] = "Еления Ольден"
+ RecipeRadar_Strings["Himmik"] = "Химмик"
+ RecipeRadar_Strings["Hotoppik Copperpinch"] = "Ферера Меднокноп"
+ RecipeRadar_Strings["Hula'mahi"] = "Хула'махи"
+ RecipeRadar_Strings["Ildine Sorrowspear"] = "Ильдина Печальная Осока"
+ RecipeRadar_Strings["Indormi"] = "Индорми"
+ RecipeRadar_Strings["Innkeeper Biribi"] = "Хозяйка таверны Бириби"
+ RecipeRadar_Strings["Innkeeper Fizzgrimble"] = "Хозяин таверны Ворчунелло"
+ RecipeRadar_Strings["Innkeeper Grilka"] = "Хозяйка таверны Грилка"
+ RecipeRadar_Strings["Jabbey"] = "Джабби"
+ RecipeRadar_Strings["Jandia"] = "Джандия"
+ RecipeRadar_Strings["Janet Hommers"] = "Джанет Хоммерс"
+ RecipeRadar_Strings["Jangdor Swiftstrider"] = "Джангор Быстрый Странник"
+ RecipeRadar_Strings["Jannos Ironwill"] = "Джаннос Неуступ"
+ RecipeRadar_Strings["Jaquilina Dramet"] = "Жаклина Драмет"
+ RecipeRadar_Strings["Jase Farlane"] = "Джез Фарлен"
+ RecipeRadar_Strings["Jazzrik"] = "Джаззрик"
+ RecipeRadar_Strings["Jeeda"] = "Джиида"
+ RecipeRadar_Strings["Jennabink Powerseam"] = "Дженнабик Мелкостёжка"
+ RecipeRadar_Strings["Jessara Cordell"] = "Джессара Корделл"
+ RecipeRadar_Strings["Jim Saltit"] = "Джим Соленит"
+ RecipeRadar_Strings["Jinky Twizzlefixxit"] = "Джинки Дзыньбламбум"
+ RecipeRadar_Strings["Johan Barnes"] = "Йохан Барнс"
+ RecipeRadar_Strings["Joseph Moore"] = "Джозеф Мур"
+ RecipeRadar_Strings["Jubie Gadgetspring"] = "Джуби Прибамбас"
+ RecipeRadar_Strings["Jun'ha"] = "Джун'ха"
+ RecipeRadar_Strings["Juno Dufrain"] = "Джуно Дюфрейн"
+ RecipeRadar_Strings["Jutak"] = "Ютак"
+ RecipeRadar_Strings["Kaita Deepforge"] = "Кайта Подземная Кузня"
+ RecipeRadar_Strings["Kalaen"] = "Келаен"
+ RecipeRadar_Strings["Kalldan Felmoon"] = "Калидан Лунный Серп"
+ RecipeRadar_Strings["Kania"] = "Кания"
+ RecipeRadar_Strings["Karaaz"] = "Карааз"
+ RecipeRadar_Strings["Keena"] = "Кеена"
+ RecipeRadar_Strings["Kelsey Yance"] = "Келси Янс"
+ RecipeRadar_Strings["Kendor Kabonka"] = "Кендор Кабонка"
+ RecipeRadar_Strings["Khara Deepwater"] = "Хара Рыбовод"
+ RecipeRadar_Strings["Khole Jinglepocket"] = "Деор Деньгозвон"
+ RecipeRadar_Strings["Kiknikle"] = "Пниподзад"
+ RecipeRadar_Strings["Killian Sanatha"] = "Киллиан Саната"
+ RecipeRadar_Strings["Kilxx"] = "Кликс"
+ RecipeRadar_Strings["Kireena"] = "Киреена"
+ RecipeRadar_Strings["Kithas"] = "Китхас"
+ RecipeRadar_Strings["Knaz Blunderflame"] = "Наз Огнепых"
+ RecipeRadar_Strings["Knight Dameron"] = "Рыцарь Дамерон"
+ RecipeRadar_Strings["Koren"] = "Корен"
+ RecipeRadar_Strings["Kor'geld"] = "Кор'гельд"
+ RecipeRadar_Strings["Krek Cragcrush"] = "Крек Скалолом"
+ RecipeRadar_Strings["Kriggon Talsone"] = "Криггон Талсон"
+ RecipeRadar_Strings["Krinkle Goodsteel"] = "Кринкель Сталлер"
+ RecipeRadar_Strings["Kulwia"] = "Кульвия"
+ RecipeRadar_Strings["Kzixx"] = "Кзикс"
+ RecipeRadar_Strings["Lady Palanseer"] = "Леди Палансир"
+ RecipeRadar_Strings["Laird"] = "Лайрд"
+ RecipeRadar_Strings["Lalla Brightweave"] = "Лала Светопряд"
+ RecipeRadar_Strings["Landraelanis"] = "Ландреленис"
+ RecipeRadar_Strings["Lardan"] = "Лардан"
+ RecipeRadar_Strings["Lebowski"] = "Лебовский"
+ RecipeRadar_Strings["Leeli Longhaggle"] = "Леели Нудноторг"
+ RecipeRadar_Strings["Leo Sarn"] = "Лео Сарн"
+ RecipeRadar_Strings["Leonard Porter"] = "Леонард Портер"
+ RecipeRadar_Strings["Librarian Erickson"] = "Библиотекарь Эриксон"
+ RecipeRadar_Strings["Lieutenant General Andorov"] = "Генерал-лейтенант Андоров"
+ RecipeRadar_Strings["Lillehoff"] = "Лиллехофф"
+ RecipeRadar_Strings["Lilly"] = "Лилли"
+ RecipeRadar_Strings["Lindea Rabonne"] = "Линди Рабонн"
+ RecipeRadar_Strings["Linna Bruder"] = "Линна Брудер"
+ RecipeRadar_Strings["Lizbeth Cromwell"] = "Лизбет Кромвель"
+ RecipeRadar_Strings["Logannas"] = "Логаннас"
+ RecipeRadar_Strings["Logistics Officer Brighton"] = "Офицер-логистик Брайтон"
+ RecipeRadar_Strings["Logistics Officer Silverstone"] = "Офицер-логистик Сильверстоун"
+ RecipeRadar_Strings["Logistics Officer Ulrike"] = "Офицер-логистик Ульрика"
+ RecipeRadar_Strings["Lokhtos Darkbargainer"] = "Локтос Зловещий Торговец"
+ RecipeRadar_Strings["Loolruna"] = "Лооруна"
+ RecipeRadar_Strings["Lorelae Wintersong"] = "Лорелея Песнь Зимы"
+ RecipeRadar_Strings["Lucan Cordell"] = "Лукан Корделл"
+ RecipeRadar_Strings["Lyna"] = "Лина"
+ RecipeRadar_Strings["Madame Ruby"] = "Мадам Рубина"
+ RecipeRadar_Strings["Magnus Frostwake"] = "Магнус Хладоступ"
+ RecipeRadar_Strings["Mahu"] = "Маху"
+ RecipeRadar_Strings["Mallen Swain"] = "Маллен Свейн"
+ RecipeRadar_Strings["Malygen"] = "Малиген"
+ RecipeRadar_Strings["Mari Stonehand"] = "Мари Камнерук"
+ RecipeRadar_Strings["Maria Lumere"] = "Мария Лумере"
+ RecipeRadar_Strings["Martine Tramblay"] = "Мартин Трамбле"
+ RecipeRadar_Strings["Masat T'andr"] = "Масат Т'андр"
+ RecipeRadar_Strings["Master Chef Mouldier"] = "Главный шеф-повар Плеснер"
+ RecipeRadar_Strings["Master Craftsman Omarion"] = "Мастер-ремесленник Омарион"
+ RecipeRadar_Strings["Mathar G'ochar"] = "Матар Гочар"
+ RecipeRadar_Strings["Mavralyn"] = "Мавралинн"
+ RecipeRadar_Strings["Mazk Snipeshot"] = "Мазк Карабинс"
+ RecipeRadar_Strings["Meilosh"] = "Мелиош"
+ RecipeRadar_Strings["Melaris"] = "Меларис"
+ RecipeRadar_Strings["Micha Yance"] = "Мика Янс"
+ RecipeRadar_Strings["Millie Gregorian"] = "Милли Грегориан"
+ RecipeRadar_Strings["Misensi"] = "Мизенси"
+ RecipeRadar_Strings["Mishta"] = "Мишта"
+ RecipeRadar_Strings["Mixie Farshot"] = "Микси Дальнострел"
+ RecipeRadar_Strings["Modoru"] = "Модору"
+ RecipeRadar_Strings["Montarr"] = "Монтарр"
+ RecipeRadar_Strings["Morgan Day"] = "Морган Дей"
+ RecipeRadar_Strings["Muheru the Weaver"] = "Мугеру Ткач"
+ RecipeRadar_Strings["Muuran"] = "Мууран"
+ RecipeRadar_Strings["Mycah"] = "Микаа"
+ RecipeRadar_Strings["Mythrin'dir"] = "Митрин'дир"
+ RecipeRadar_Strings["Naal Mistrunner"] = "Наал Вестник Туманов"
+ RecipeRadar_Strings["Naka"] = "Нака"
+ RecipeRadar_Strings["Nakodu"] = "Накоду"
+ RecipeRadar_Strings["Namdo Bizzfizzle"] = "Намдо Вклвыкл"
+ RecipeRadar_Strings["Nandar Branson"] = "Нандар Брансон"
+ RecipeRadar_Strings["Nardstrum Copperpinch"] = "Арман Меднокноп"
+ RecipeRadar_Strings["Narj Deepslice"] = "Нардж Ломтерез"
+ RecipeRadar_Strings["Narkk"] = "Наркк"
+ RecipeRadar_Strings["Nasmara Moonsong"] = "Назмара Песнь Луны"
+ RecipeRadar_Strings["Nata Dawnstrider"] = "Ната Рассветная Странница"
+ RecipeRadar_Strings["Neal Allen"] = "Нил Аллен"
+ RecipeRadar_Strings["Neii"] = "Нейи"
+ RecipeRadar_Strings["Nergal"] = "Нергал"
+ RecipeRadar_Strings["Nerrist"] = "Неррист"
+ RecipeRadar_Strings["Nessa Shadowsong"] = "Несса Песня Теней"
+ RecipeRadar_Strings["Nina Lightbrew"] = "Ниней Легковар"
+ RecipeRadar_Strings["Nioma"] = "Ниома"
+ RecipeRadar_Strings["Nula the Butcher"] = "Нула Мясник"
+ RecipeRadar_Strings["Nyoma"] = "Ньома"
+ RecipeRadar_Strings["Ogg'marr"] = "Огг'марр"
+ RecipeRadar_Strings["Okuno"] = "Окуно"
+ RecipeRadar_Strings["Old Man Heming"] = "Старик Хеминг"
+ RecipeRadar_Strings["Ontuvo"] = "Онтуво"
+ RecipeRadar_Strings["Otho Moji'ko"] = "Отхо Можи'ко"
+ RecipeRadar_Strings["Outfitter Eric"] = "Галантерейщик Эрик"
+ RecipeRadar_Strings["Paulsta'ats"] = "Пауласта'атс"
+ RecipeRadar_Strings["Penney Copperpinch"] = "Ликоста Меднокноп"
+ RecipeRadar_Strings["Phea"] = "Фэа"
+ RecipeRadar_Strings["Plugger Spazzring"] = "Штоппор Наливалс"
+ RecipeRadar_Strings["Pratt McGrubben"] = "Пратт Макгруббен"
+ RecipeRadar_Strings["Provisioner Lorkran"] = "Поставщик Лоркран"
+ RecipeRadar_Strings["Provisioner Nasela"] = "Поставщик Несела"
+ RecipeRadar_Strings["Qia"] = "Кийя"
+ RecipeRadar_Strings["Quartermaster Davian Vaclav"] = "Интендант Дэвиан Ваклав"
+ RecipeRadar_Strings["Quartermaster Endarin"] = "Интендант Эндарин"
+ RecipeRadar_Strings["Quartermaster Enuril"] = "Интендант Инурил"
+ RecipeRadar_Strings["Quartermaster Jaffrey Noreliqe"] = "Интендант Джеффри Норелик"
+ RecipeRadar_Strings["Quartermaster Miranda Breechlock"] = "Интендант Миранда Бричлок"
+ RecipeRadar_Strings["Quartermaster Urgronn"] = "Интендант Ургронн"
+ RecipeRadar_Strings["Quelis"] = "Келис"
+ RecipeRadar_Strings["Ranik"] = "Раник"
+ RecipeRadar_Strings["Rann Flamespinner"] = "Ранн Пламепряд"
+ RecipeRadar_Strings["Rartar"] = "Рартар"
+ RecipeRadar_Strings["Rathis Tomber"] = "Ратис Могильщик"
+ RecipeRadar_Strings["Rikqiz"] = "Риккиз"
+ RecipeRadar_Strings["Rin'wosho the Trader"] = "Рин'вошо Торговец"
+ RecipeRadar_Strings["Rizz Loosebolt"] = "Ризз Болтень"
+ RecipeRadar_Strings["Rohok"] = "Рохок"
+ RecipeRadar_Strings["Ronald Burch"] = "Рональд Берч"
+ RecipeRadar_Strings["Rungor"] = "Рунгор"
+ RecipeRadar_Strings["Ruppo Zipcoil"] = "Руппо Свистопулькин"
+ RecipeRadar_Strings["Saenorion"] = "Санарион"
+ RecipeRadar_Strings["Sairuk"] = "Сайрук"
+ RecipeRadar_Strings["Sassa Weldwell"] = "Сасса Крутоварка"
+ RecipeRadar_Strings["Sebastian Crane"] = "Себастьян Крейн"
+ RecipeRadar_Strings["Seer Janidi"] = "Ясновидящая Джаниди"
+ RecipeRadar_Strings["Seersa Copperpinch"] = "Лигерфа Меднокноп"
+ RecipeRadar_Strings["Sewa Mistrunner"] = "Сива Вестница Туманов"
+ RecipeRadar_Strings["Shaani"] = "Шаани"
+ RecipeRadar_Strings["Shadi Mistrunner"] = "Шади Вестница Туманов"
+ RecipeRadar_Strings["Shandrina"] = "Шандрина"
+ RecipeRadar_Strings["Shankys"] = "Шанкис"
+ RecipeRadar_Strings["Sheendra Tallgrass"] = "Шиендра Высокая Трава"
+ RecipeRadar_Strings["Shen'dralar Provisioner"] = "Шен'драларский поставщик"
+ RecipeRadar_Strings["Sheri Zipstitch"] = "Шери Рваношов"
+ RecipeRadar_Strings["Sid Limbardi"] = "Сид Лимбарди"
+ RecipeRadar_Strings["Skreah"] = "Скреах"
+ RecipeRadar_Strings["Smudge Thunderwood"] = "Клякс Громодрев"
+ RecipeRadar_Strings["Soolie Berryfizz"] = "Сули Гонобобельзз"
+ RecipeRadar_Strings["Sovik"] = "Совик"
+ RecipeRadar_Strings["Stone Guard Mukar"] = "Каменный стражник Мукар"
+ RecipeRadar_Strings["Stuart Fleming"] = "Стюарт Флеминг"
+ RecipeRadar_Strings["Sumi"] = "Суми"
+ RecipeRadar_Strings["Super-Seller 680"] = "Робо-торговец 680"
+ RecipeRadar_Strings["Supply Officer Mills"] = "Снабженец Миллс"
+ RecipeRadar_Strings["Tamar"] = "Тамар"
+ RecipeRadar_Strings["Tanaika"] = "Танайка"
+ RecipeRadar_Strings["Tanak"] = "Танак"
+ RecipeRadar_Strings["Tansy Puddlefizz"] = "Танси Грязебульк"
+ RecipeRadar_Strings["Tarban Hearthgrain"] = "Тарбан Домашний Очаг"
+ RecipeRadar_Strings["Tari'qa"] = "Тарик'ка"
+ RecipeRadar_Strings["Tatiana"] = "Татьяна"
+ RecipeRadar_Strings["Thaddeus Webb"] = "Таддеус Уэбб"
+ RecipeRadar_Strings["Tharynn Bouden"] = "Таринн Боуден"
+ RecipeRadar_Strings["Thomas Yance"] = "Томас Янс"
+ RecipeRadar_Strings["Tiffany Cartier"] = "Тиффани Картье"
+ RecipeRadar_Strings["Tilli Thistlefuzz"] = "Тилли Чертополуш"
+ RecipeRadar_Strings["Trader Narasu"] = "Торговец Нарасу"
+ RecipeRadar_Strings["Truk Wildbeard"] = "Трук Косматая Борода"
+ RecipeRadar_Strings["Tunkk"] = "Тункк"
+ RecipeRadar_Strings["Ulthaan"] = "Ультаан"
+ RecipeRadar_Strings["Ulthir"] = "Ультир"
+ RecipeRadar_Strings["Uriku"] = "Урику"
+ RecipeRadar_Strings["Uthok"] = "Утхок"
+ RecipeRadar_Strings["Vaean"] = "Ваеан"
+ RecipeRadar_Strings["Valdaron"] = "Вальдарон"
+ RecipeRadar_Strings["Vanessa Sellers"] = "Ванесса Селлерс"
+ RecipeRadar_Strings["Vargus"] = "Варгус"
+ RecipeRadar_Strings["Veenix"] = "Виеникс"
+ RecipeRadar_Strings["Vendor-Tron 1000"] = "Торготрон 1000"
+ RecipeRadar_Strings["Veteran Crusader Aliocha Segard"] = "Рыцарь-ветеран Алеча Сегард"
+ RecipeRadar_Strings["Vharr"] = "Вхарр"
+ RecipeRadar_Strings["Viggz Shinesparked"] = "Виггз Синеискр"
+ RecipeRadar_Strings["Vivianna"] = "Вивианна"
+ RecipeRadar_Strings["Vix Chromeblaster"] = "Vix Chromeblaster" -- ?? wolk Vix Chromeblaster Borean Tundra.
+ RecipeRadar_Strings["Vizzklick"] = "Визглик"
+ RecipeRadar_Strings["Vodesiin"] = "Водесиин"
+ RecipeRadar_Strings["Wenna Silkbeard"] = "Венна Шелкобород"
+ RecipeRadar_Strings["Werg Thickblade"] = "Верг Крепкий Клинок"
+ RecipeRadar_Strings["Wik'Tar"] = "Вик'Тар"
+ RecipeRadar_Strings["Wind Trader Lathrai"] = "Латрай Торговец Ветром"
+ RecipeRadar_Strings["Wolgren Jinglepocket"] = "Черут Деньгозвон"
+ RecipeRadar_Strings["Worb Strongstitch"] = "Ворб Крепкий Шов"
+ RecipeRadar_Strings["Wrahk"] = "Ракх"
+ RecipeRadar_Strings["Wulan"] = "Вулан"
+ RecipeRadar_Strings["Wulmort Jinglepocket"] = "Карден Деньгозвон"
+ RecipeRadar_Strings["Wunna Darkmane"] = "Вунна Темная Грива"
+ RecipeRadar_Strings["Xandar Goodbeard"] = "Ксаварик"
+ RecipeRadar_Strings["Xen'to"] = "Ксен'то"
+ RecipeRadar_Strings["Xerintha Ravenoak"] = "Зеринта Воронья Ольха"
+ RecipeRadar_Strings["Xizk Goodstitch"] = "Зиск Ладноскрой"
+ RecipeRadar_Strings["Xizzer Fizzbolt"] = "Ксиззер Шумоболт"
+ RecipeRadar_Strings["Yatheon"] = "Ятеон"
+ RecipeRadar_Strings["Yonada"] = "Йонада"
+ RecipeRadar_Strings["Ythyar"] = "Айтар"
+ RecipeRadar_Strings["Yuka Screwspigot"] = "Юка Крутипроб"
+ RecipeRadar_Strings["Yurial Soulwater"] = "Юриал Душа Воды"
+ RecipeRadar_Strings["Zan Shivsproket"] = "Зан Кругореззик"
+ RecipeRadar_Strings["Zannok Hidepiercer"] = "Заннок Проткни-Шкуру"
+ RecipeRadar_Strings["Zansoa"] = "Зансоа"
+ RecipeRadar_Strings["Zaralda"] = "Заральда"
+ RecipeRadar_Strings["Zarena Cromwind"] = "Зарена Кромвинд"
+ RecipeRadar_Strings["Zargh"] = "Заргх"
+ RecipeRadar_Strings["Zixil"] = "Зиксиль"
+ RecipeRadar_Strings["Zorbin Fandazzle"] = "Зорбин Дребезгун"
+ RecipeRadar_Strings["Zurai"] = "Зурай"
+
+end
+
+if (GetLocale() == "deDE") then
+
+ RecipeRadar_Strings["Toggle Recipe Radar"] = "Recipe Radar umschalten"
+ RecipeRadar_Strings["Recipe Radar Bindings"] = "Recipe Radar Tastenbelegung"
+ RecipeRadar_Strings["Auto-select Current Region"] = "Automatisch aktuelle Zone wählen"
+ RecipeRadar_Strings["Check Availability for Alts"] = "Verwendbarkeit für Alts prüfen"
+ RecipeRadar_Strings["Minimap Button Position"] = "Position des Minimap-Button"
+ RecipeRadar_Strings["Show Minimap Button"] = "Minimap-Button anzeigen"
+ RecipeRadar_Strings["Options"] = "Optionen"
+ RecipeRadar_Strings["%d learnable"] = "%d lernbar"
+ RecipeRadar_Strings["%d recipes"] = "%d Rezepte"
+ RecipeRadar_Strings["1 recipe"] = "1 Rezept"
+ RecipeRadar_Strings["Uncached Recipe"] = "Rezept nicht im Cache"
+ RecipeRadar_Strings["You may mouse over the [?]"] = "Bewege die Maus über das [?]-Symbol"
+ RecipeRadar_Strings["icon to lookup this recipe."] = "um dieses Rezept nachzuschlagen."
+ RecipeRadar_Strings["Warning: if your server has"] = "Warnung: wenn der Server dieses"
+ RecipeRadar_Strings["not yet seen this item, you"] = "Rezept noch nicht gesehen hat"
+ RecipeRadar_Strings["will be disconnected!"] = "wird die Verbindung getrennt!"
+ RecipeRadar_Strings["No recipes for sale in this region."] = "Keine Rezepte zum Verkauf in dieser Region."
+ RecipeRadar_Strings["Shift-click a vendor to add or remove her location on the world map."] = "Shift-Klicke einen Händler, um seine Position auf der Weltkarte und Minikarte hinzuzufügen oder zu entfernen."
+ RecipeRadar_Strings["Locate Vendor on Map"] = "Händler auf Karte zeigen"
+ RecipeRadar_Strings["Factions"] = "Parteien"
+ RecipeRadar_Strings["Alchemy"] = "Alchimie"
+ RecipeRadar_Strings["Blacksmithing"] = "Schmiedekunst"
+ RecipeRadar_Strings["Cooking"] = "Kochkunst"
+ RecipeRadar_Strings["Enchanting"] = "Verzauberkunst"
+ RecipeRadar_Strings["Engineering"] = "Ingenieurskunst"
+ RecipeRadar_Strings["First Aid"] = "Erste Hilfe"
+ RecipeRadar_Strings["Fishing"] = "Angeln"
+ RecipeRadar_Strings["Leatherworking"] = "Lederverarbeitung"
+ RecipeRadar_Strings["Tailoring"] = "Schneiderei"
+ RecipeRadar_Strings["Professions"] = "Berufe"
+ RecipeRadar_Strings["Already Known (Alts)"] = "Bereits bekannt (Alts)"
+ RecipeRadar_Strings["Already Known (Player)"] = "Bereits bekannt (Spieler)"
+ RecipeRadar_Strings["Available Now (Alts)"] = "Vorhanden jetzt (Alts)"
+ RecipeRadar_Strings["Available Now (Player)"] = "Vorhanden jetzt (Spieler)"
+ RecipeRadar_Strings["Future Prospect (Alts)"] = "Zukünftige Aussicht (Alts)"
+ RecipeRadar_Strings["Future Prospect (Player)"] = "Zukünftige Aussicht (Spieler)"
+ RecipeRadar_Strings["Inapplicable Professions"] = "Nicht vorhandene Berufe"
+ RecipeRadar_Strings["Availability"] = "Verwendbarkeit"
+ RecipeRadar_Strings["Already Known By:"] = "Bereits bekannt für:"
+ RecipeRadar_Strings["Future Prospect For:"] = "Zukünftige Aussicht für:"
+ RecipeRadar_Strings["Available For:"] = "Vorhanden für:"
+ RecipeRadar_Strings["%d of %d"] = "%d von %d"
+ RecipeRadar_Strings["Intermittent"] = "Zeitweiliger"
+ RecipeRadar_Strings["Quest"] = "Quest"
+ RecipeRadar_Strings["Roving"] = "Wandernder"
+ RecipeRadar_Strings["Seasonal"] = "Saisonaler"
+ RecipeRadar_Strings["%s Vendor"] = "%s Händler"
+ RecipeRadar_Strings["Cenarion Circle"] = "Zirkel des Cenarius"
+ RecipeRadar_Strings["Thorium Brotherhood"] = "Thorium-Bruderschaft"
+ RecipeRadar_Strings["Timbermaw Hold"] = "Holzschlundfeste"
+ RecipeRadar_Strings["Zandalar Tribe"] = "Zandalar"
+ RecipeRadar_Strings["Argent Dawn"] = "Argentumdämmerung"
+ RecipeRadar_Strings["Rogue Only"] = "Nur Schurke"
+ RecipeRadar_Strings["Collapse"] = "Einsturz"
+ RecipeRadar_Strings["Collapse All"] = "Stürzen Alle Ein"
+ RecipeRadar_Strings["Expand"] = "Erweitern Sie"
+ RecipeRadar_Strings["Expand All"] = "Erweitern Sie"
+ RecipeRadar_Strings["Map Vendor"] = "Betraghändler auf Diagramm"
+ RecipeRadar_Strings["Unmap Vendor"] = "Händler entfernen"
+ RecipeRadar_Strings["Armorsmith"] = "Rüstungsschmied"
+ RecipeRadar_Strings["Dragonscale Leatherworking"] = "Drachenschuppenlederverarbeitung"
+ RecipeRadar_Strings["Elemental Leatherworking"] = "Elementarlederverarbeitung"
+ RecipeRadar_Strings["Goblin Engineer"] = "Goblin-Ingenieur"
+ RecipeRadar_Strings["Master Axesmith"] = "Axtschmiedemeister"
+ RecipeRadar_Strings["Master Hammersmith"] = "Hammerschmiedemeister"
+ RecipeRadar_Strings["Master Swordsmith"] = "Schwertschmiedemeister"
+ RecipeRadar_Strings["Tribal Leatherworking"] = "Stammeslederverarbeitung"
+ RecipeRadar_Strings["Weaponsmith"] = "Waffenschmied"
+ RecipeRadar_Strings["Gnomish Engineer"] = "Gnomen-Ingenieur"
+ RecipeRadar_Strings["Eastern Kingdoms"] = "Lordaeron"
+ RecipeRadar_Strings["Instances"] = "Instanzen"
+
+ RecipeRadar_Strings["Alterac Mountains"] = "Alteracgebirge"
+ RecipeRadar_Strings["Arathi Highlands"] = "Arathihochland"
+ RecipeRadar_Strings["Badlands"] = "Ödland"
+ RecipeRadar_Strings["Blackrock Depths"] = "Blackrocktiefen"
+ RecipeRadar_Strings["Blasted Lands"] = "Verwüstete Lande"
+ RecipeRadar_Strings["Burning Steppes"] = "Brennende Steppe"
+ RecipeRadar_Strings["Darkshore"] = "Dunkelküste"
+ RecipeRadar_Strings["Dire Maul"] = "Düsterbruch"
+ RecipeRadar_Strings["Duskwood"] = "Dämmerwald"
+ RecipeRadar_Strings["Dustwallow Marsh"] = "Marschen von Dustwallow"
+ RecipeRadar_Strings["Eastern Plaguelands"] = "Östliche Pestländer"
+ RecipeRadar_Strings["Elwynn Forest"] = "Wald von Elwynn"
+ RecipeRadar_Strings["Felwood"] = "Teufelswald"
+ RecipeRadar_Strings["Hillsbrad Foothills"] = "Vorgebirge von Hillsbrad"
+ RecipeRadar_Strings["Ironforge"] = "Eisenschmiede"
+ RecipeRadar_Strings["Redridge Mountains"] = "Rotkammgebirge"
+ RecipeRadar_Strings["Silverpine Forest"] = "Silberwald"
+ RecipeRadar_Strings["Stonetalon Mountains"] = "Steinkrallengebirge"
+ RecipeRadar_Strings["Stormwind City"] = "Sturmwind"
+ RecipeRadar_Strings["Stranglethorn Vale"] = "Schlingendorntal"
+ RecipeRadar_Strings["Swamp of Sorrows"] = "Sümpfe des Elends"
+ RecipeRadar_Strings["The Barrens"] = "Brachland"
+ RecipeRadar_Strings["The Hinterlands"] = "Hinterland"
+ RecipeRadar_Strings["Thousand Needles"] = "Tausend Nadeln"
+ RecipeRadar_Strings["Thunder Bluff"] = "Donnerfels"
+ RecipeRadar_Strings["Tirisfal Glades"] = "Tirisfal"
+ RecipeRadar_Strings["Undercity"] = "Unterstadt"
+ RecipeRadar_Strings["Un'Goro Crater"] = "Un'Goro-Krater"
+ RecipeRadar_Strings["Wailing Caverns"] = "Höhlen des Wehklagens"
+ RecipeRadar_Strings["Western Plaguelands"] = "Westliche Pestländer"
+ RecipeRadar_Strings["Wetlands"] = "Sumpfland"
+
+ RecipeRadar_Strings["Alchemist Pestlezugg"] = "Alchimist Pestlezugg"
+ RecipeRadar_Strings["Argent Quartermaster Hasana"] = "Argentum-Rüstmeister Hasana"
+ RecipeRadar_Strings["Argent Quartermaster Lightspark"] = "Argentum-Rüstmeister Lightspark"
+ RecipeRadar_Strings["Cowardly Crosby"] = "Feiger Crosby"
+ RecipeRadar_Strings["Defias Profiteer"] = "Schieber der Defias"
+ RecipeRadar_Strings["Outfitter Eric"] = "Ausstatter Eric"
+ RecipeRadar_Strings["Quartermaster Miranda Breechlock"] = "Rüstmeisterin Miranda Breechlock"
+ RecipeRadar_Strings["Rin'wosho the Trader"] = "Rin'wosho der Händler"
+ RecipeRadar_Strings["Shen'dralar Provisioner"] = "Shen'dralar-Versorger"
+ RecipeRadar_Strings["Super-Seller 680"] = "Superverkaufomat 680"
+ RecipeRadar_Strings["Vendor-Tron 1000"] = "Kaufotron 1000"
+
+end
+
+if (GetLocale() == "frFR") then
+
+ RecipeRadar_Strings["Toggle Recipe Radar"] = "Recipe Radar À bascule"
+ RecipeRadar_Strings["Recipe Radar Bindings"] = "Attaches De Recipe Radar"
+ RecipeRadar_Strings["Auto-select Current Region"] = "Auto-choisissez région courante"
+ RecipeRadar_Strings["Check Availability for Alts"] = "Examinez la disponibilité pour assurer alts"
+ RecipeRadar_Strings["Minimap Button Position"] = "Position De Bouton De Minimap"
+ RecipeRadar_Strings["Show Minimap Button"] = "Montrez Le Bouton De Minimap"
+ RecipeRadar_Strings["%d learnable"] = "%d utilisables"
+ RecipeRadar_Strings["%d recipes"] = "%d recettes"
+ RecipeRadar_Strings["1 recipe"] = "1 recette"
+ RecipeRadar_Strings["Uncached Recipe"] = "Recette Non cachée"
+ RecipeRadar_Strings["You may mouse over the [?]"] = "Vous pouvez souris au-dessus de l'icône"
+ RecipeRadar_Strings["icon to lookup this recipe."] = "de [?] à la consultation cette recette."
+ RecipeRadar_Strings["Warning: if your server has"] = "Avertissement: si votre serveur n'a"
+ RecipeRadar_Strings["not yet seen this item, you"] = "pas encore vu cet article, vous serez"
+ RecipeRadar_Strings["will be disconnected!"] = "débranchés!"
+ RecipeRadar_Strings["No recipes for sale in this region."] = "Aucunes recettes à vendre dans cette région."
+ RecipeRadar_Strings["Shift-click a vendor to add or remove her location on the world map."] = "Décaler-déclic un fournisseur pour ajouter ou enlever son endroit sur la carte du monde. "
+ RecipeRadar_Strings["Locate Vendor on Map"] = "Endroit sur la carte"
+ RecipeRadar_Strings["Neutral"] = "Neutre"
+ RecipeRadar_Strings["Alchemy"] = "Alchimie"
+ RecipeRadar_Strings["Blacksmithing"] = "Forge"
+ RecipeRadar_Strings["Cooking"] = "Cuisine"
+ RecipeRadar_Strings["Enchanting"] = "Enchantement"
+ RecipeRadar_Strings["Engineering"] = "Ingénierie"
+ RecipeRadar_Strings["First Aid"] = "Secourisme"
+ RecipeRadar_Strings["Fishing"] = "Pêche"
+ RecipeRadar_Strings["Leatherworking"] = "Travail du cuir"
+ RecipeRadar_Strings["Tailoring"] = "Couture"
+ RecipeRadar_Strings["Professions"] = "Métiers"
+ RecipeRadar_Strings["Already Known (Alts)"] = "Déjà Connu (Alts)"
+ RecipeRadar_Strings["Already Known (Player)"] = "Déjà Connu (Joueur)"
+ RecipeRadar_Strings["Available Now (Alts)"] = "Disponible Maintenant (Alts)"
+ RecipeRadar_Strings["Available Now (Player)"] = "Disponible Maintenant (Joueur) "
+ RecipeRadar_Strings["Future Prospect (Alts)"] = "Future Perspective (Alts)"
+ RecipeRadar_Strings["Future Prospect (Player)"] = "Future Perspective (Joueur)"
+ RecipeRadar_Strings["Inapplicable Professions"] = "Métiers Inapplicables"
+ RecipeRadar_Strings["Availability"] = "Disponibilité"
+ RecipeRadar_Strings["Already Known By:"] = "Déjà Connu Par:"
+ RecipeRadar_Strings["Future Prospect For:"] = "Future Perspective Pour:"
+ RecipeRadar_Strings["Available For:"] = "Disponible Pour:"
+ RecipeRadar_Strings["%d of %d"] = "%d de %d"
+ RecipeRadar_Strings["Quest"] = "Quête"
+ RecipeRadar_Strings["Roving"] = "Boudinage"
+ RecipeRadar_Strings["Seasonal"] = "Saisonnier"
+ RecipeRadar_Strings["%s Vendor"] = "%s Marchand"
+ RecipeRadar_Strings["Cenarion Circle"] = "Le Cercle de Cenarius"
+ RecipeRadar_Strings["Thorium Brotherhood"] = "La Confrérie du thorium"
+ RecipeRadar_Strings["Timbermaw Hold"] = "Furbolgs Timbermaw"
+ RecipeRadar_Strings["Zandalar Tribe"] = "Fournitures et réparations Zandalar"
+ RecipeRadar_Strings["Argent Dawn"] = "L'Aube d'argent"
+ RecipeRadar_Strings["Rogue Only"] = "Voleur Seulement"
+ RecipeRadar_Strings["Collapse"] = "Effondrement"
+ RecipeRadar_Strings["Collapse All"] = "S'effondrent Tous"
+ RecipeRadar_Strings["Expand"] = "Effondrement"
+ RecipeRadar_Strings["Expand All"] = "Augmentez Tous"
+ RecipeRadar_Strings["Map Vendor"] = "Établissez le marchand sur la carte"
+ RecipeRadar_Strings["Unmap Vendor"] = "Enlevez Marchand"
+ RecipeRadar_Strings["Armorsmith"] = "Fabricant d'armures"
+ RecipeRadar_Strings["Dragonscale Leatherworking"] = "Travail du cuir d'écailles de dragon"
+ RecipeRadar_Strings["Elemental Leatherworking"] = "Travail du cuir élémentaire"
+ RecipeRadar_Strings["Goblin Engineer"] = "Ingénieur gobelin"
+ RecipeRadar_Strings["Master Axesmith"] = "Maître fabricant de haches"
+ RecipeRadar_Strings["Master Hammersmith"] = "Maître Fabricant de marteaux"
+ RecipeRadar_Strings["Master Swordsmith"] = "Maître Fabricant d'épées"
+ RecipeRadar_Strings["Tribal Leatherworking"] = "Travail du cuir tribal"
+ RecipeRadar_Strings["Weaponsmith"] = "Fabricant d'armes"
+ RecipeRadar_Strings["Gnomish Engineer"] = "Ingénieur gnome"
+ RecipeRadar_Strings["Eastern Kingdoms"] = "Royaumes de l'est"
+
+ RecipeRadar_Strings["Alterac Mountains"] = "Montagnes d'Alterac"
+ RecipeRadar_Strings["Arathi Highlands"] = "Hautes-terres d'Arathi"
+ RecipeRadar_Strings["Badlands"] = "Terres ingrates (Badlands)"
+ RecipeRadar_Strings["Blackrock Depths"] = "Profondeurs de Blackrock"
+ RecipeRadar_Strings["Blasted Lands"] = "Terres foudroyées (Blasted Lands)"
+ RecipeRadar_Strings["Burning Steppes"] = "Steppes Ardentes"
+ RecipeRadar_Strings["Darkshore"] = "Sombrivage (DarkShore)"
+ RecipeRadar_Strings["Desolace"] = "Désolace"
+ RecipeRadar_Strings["Dire Maul"] = "Hache-Tripes"
+ RecipeRadar_Strings["Duskwood"] = "Bois de la pénombre (Duskwood)"
+ RecipeRadar_Strings["Dustwallow Marsh"] = "Marécage d'Âprefange (Dustwallow Marsh)"
+ RecipeRadar_Strings["Eastern Plaguelands"] = "Maleterres de l'est (Eastern Plaguelands)"
+ RecipeRadar_Strings["Elwynn Forest"] = "Forêt d'Elwynn"
+ RecipeRadar_Strings["Felwood"] = "Gangrebois (Felwood)"
+ RecipeRadar_Strings["Hillsbrad Foothills"] = "Contreforts d'Hillsbrad"
+ RecipeRadar_Strings["Moonglade"] = "Reflet-de-lune (Moonglade)"
+ RecipeRadar_Strings["Redridge Mountains"] = "Les Carmines (Redridge Mts)"
+ RecipeRadar_Strings["Silverpine Forest"] = "Forêt des pins argentés (Silverpine Forest)"
+ RecipeRadar_Strings["Stonetalon Mountains"] = "Les Serres-Rocheuses (Stonetalon Mts)"
+ RecipeRadar_Strings["Stormwind City"] = "Cité de Stormwind"
+ RecipeRadar_Strings["Stranglethorn Vale"] = "Vallée de Strangleronce (Stranglethorn Vale)"
+ RecipeRadar_Strings["Swamp of Sorrows"] = "Marais des Chagrins (Swamp of Sorrows)"
+ RecipeRadar_Strings["The Barrens"] = "Les Tarides (the Barrens)"
+ RecipeRadar_Strings["The Hinterlands"] = "Les Hinterlands"
+ RecipeRadar_Strings["Thousand Needles"] = "Mille pointes (Thousand Needles)"
+ RecipeRadar_Strings["Tirisfal Glades"] = "Clairières de Tirisfal"
+ RecipeRadar_Strings["Un'Goro Crater"] = "Cratère d'Un'Goro"
+ RecipeRadar_Strings["Wailing Caverns"] = "Cavernes des lamentations"
+ RecipeRadar_Strings["Western Plaguelands"] = "Maleterres de l'ouest (Western Plaguelands)"
+ RecipeRadar_Strings["Westfall"] = "Marche de l'Ouest (Westfall)"
+ RecipeRadar_Strings["Wetlands"] = "Les Paluns (Wetlands)"
+ RecipeRadar_Strings["Winterspring"] = "Berceau-de-l'Hiver (Winterspring)"
+
+ RecipeRadar_Strings["Alchemist Pestlezugg"] = "Alchimiste Pestlezugg"
+ RecipeRadar_Strings["Argent Quartermaster Hasana"] = "Quartier-maître de l'Aube d'argent Hasana"
+ RecipeRadar_Strings["Argent Quartermaster Lightspark"] = "Quartier-maître de l'Aube d'argent Lightspark"
+ RecipeRadar_Strings["Cowardly Crosby"] = "Crosby la Trouille"
+ RecipeRadar_Strings["Defias Profiteer"] = "Profiteur Defias"
+ RecipeRadar_Strings["Outfitter Eric"] = "Eric le tailleur"
+ RecipeRadar_Strings["Quartermaster Miranda Breechlock"] = "Quartier-maître Miranda Breechlock"
+ RecipeRadar_Strings["Rin'wosho the Trader"] = "Rin'wosho le marchand"
+ RecipeRadar_Strings["Shen'dralar Provisioner"] = "Approvisionneur Shen'dralar"
+ RecipeRadar_Strings["Super-Seller 680"] = "Super-Vendeur 680"
+ RecipeRadar_Strings["Vendor-Tron 1000"] = "Vendeur-Tron 1000"
+
+end
+
+if (GetLocale() == "esES") then
+
+ RecipeRadar_Strings["Toggle Recipe Radar"] = "Barra del Recipe Radar"
+ RecipeRadar_Strings["Auto-select Current Region"] = "Automóvil-seleccionar la región actual"
+ RecipeRadar_Strings["Check Availability for Alts"] = "Comprobar la disponibilidad para saber si hay alts"
+ RecipeRadar_Strings["Minimap Button Position"] = "Posición del Icono"
+ RecipeRadar_Strings["Show Minimap Button"] = "Mostrar botón en el Minimapa"
+ RecipeRadar_Strings["Options"] = "Opciones"
+ RecipeRadar_Strings["%d recipes"] = "%d recetas"
+ RecipeRadar_Strings["1 recipe"] = "1 receta"
+ RecipeRadar_Strings["Uncached Recipe"] = "Receta no Depositada"
+ RecipeRadar_Strings["You may mouse over the [?]"] = "Puedes el excedente del ratón [?]"
+ RecipeRadar_Strings["icon to lookup this recipe."] = "icono a las operaciones de búsqueda"
+ RecipeRadar_Strings["Warning: if your server has"] = "esta receta. Advertencia: ¡si tu"
+ RecipeRadar_Strings["not yet seen this item, you"] = "servidor todavía no ha visto este"
+ RecipeRadar_Strings["will be disconnected!"] = "artículo, te desconectarán!"
+ RecipeRadar_Strings["No recipes for sale in this region."] = "Ningunas recetas para la venta en esta región."
+ RecipeRadar_Strings["Shift-click a vendor to add or remove her location on the world map."] = "Cambiar de puesto-tecleo un vendedor para agregar o para quitar su localización en el mapa del mundo."
+ RecipeRadar_Strings["Locate Vendor on Map"] = "Localizar a Vendedor en Mapa"
+ RecipeRadar_Strings["Factions"] = "Bandos"
+ RecipeRadar_Strings["Alchemy"] = "Alquimia"
+ RecipeRadar_Strings["Blacksmithing"] = "Herrería"
+ RecipeRadar_Strings["Cooking"] = "Cocina"
+ RecipeRadar_Strings["Enchanting"] = "Encantamiento"
+ RecipeRadar_Strings["Engineering"] = "Ingeniería"
+ RecipeRadar_Strings["First Aid"] = "Primeros auxilios"
+ RecipeRadar_Strings["Fishing"] = "Pesca"
+ RecipeRadar_Strings["Leatherworking"] = "Marroquinería"
+ RecipeRadar_Strings["Tailoring"] = "Costura"
+ RecipeRadar_Strings["Professions"] = "Profesiones"
+ RecipeRadar_Strings["Already Known (Alts)"] = "Sabido Ya (Alts)"
+ RecipeRadar_Strings["Already Known (Player)"] = "Sabido Ya (Jugador)"
+ RecipeRadar_Strings["Available Now (Alts)"] = "Disponible Nhora (Alts)"
+ RecipeRadar_Strings["Available Now (Player)"] = "Disponible Nhora (Jugador)"
+ RecipeRadar_Strings["Future Prospect (Alts)"] = "Perspectiva Futura (Alts)"
+ RecipeRadar_Strings["Future Prospect (Player)"] = "Perspectiva Futura (Jugador)"
+ RecipeRadar_Strings["Inapplicable Professions"] = "Profesiones Inaplicables"
+ RecipeRadar_Strings["Availability"] = "Disponibilidad"
+ RecipeRadar_Strings["Already Known By:"] = "Sabido ya por:"
+ RecipeRadar_Strings["Future Prospect For:"] = "Perspectiva futura del:"
+ RecipeRadar_Strings["Available For:"] = "Disponible para el:"
+ RecipeRadar_Strings["%d of %d"] = "%d de %d"
+ RecipeRadar_Strings["Intermittent"] = "Intermitente"
+ RecipeRadar_Strings["Quest"] = "Misión"
+ RecipeRadar_Strings["Roving"] = "Vagueación"
+ RecipeRadar_Strings["Seasonal"] = "Estacional"
+ RecipeRadar_Strings["%s Vendor"] = "%s Vendedor"
+ RecipeRadar_Strings["Cenarion Circle"] = "El Círculo Cenarion"
+ RecipeRadar_Strings["Thorium Brotherhood"] = "La Hermandad del torio"
+ RecipeRadar_Strings["Zandalar Tribe"] = "Tribu de Zandalar"
+ RecipeRadar_Strings["Argent Dawn"] = "El Alba Argenta"
+ RecipeRadar_Strings["Rogue Only"] = "Pícaro Solamente"
+ RecipeRadar_Strings["Collapse"] = "Derrumbamiento"
+ RecipeRadar_Strings["Collapse All"] = "Se Derrumban Todos"
+ RecipeRadar_Strings["Expand"] = "Ampliarte"
+ RecipeRadar_Strings["Expand All"] = "Ampliar Todos"
+ RecipeRadar_Strings["Map Vendor"] = "Asignar a Vendedor"
+ RecipeRadar_Strings["Unmap Vendor"] = "Quitar a vendedor"
+ RecipeRadar_Strings["Goblin Engineer"] = "Ingeniería goblin"
+ RecipeRadar_Strings["Gnomish Engineer"] = "Ingeniería gnome"
+ RecipeRadar_Strings["Eastern Kingdoms"] = "Reinos del Este"
+ RecipeRadar_Strings["Instances"] = "Instancias"
+
+ RecipeRadar_Strings["Alterac Mountains"] = "Montañas de Alterac"
+ RecipeRadar_Strings["Arathi Highlands"] = "Tierras Altas de Arathi"
+ RecipeRadar_Strings["Ashenvale"] = "Vallefresno"
+ RecipeRadar_Strings["Badlands"] = "Tierras Inhóspitas"
+ RecipeRadar_Strings["Blackrock Depths"] = "Profundidades de Roca Negra"
+ RecipeRadar_Strings["Blasted Lands"] = "Las Tierras Devastadas"
+ RecipeRadar_Strings["Burning Steppes"] = "Las Estepas Ardientes"
+ RecipeRadar_Strings["Darkshore"] = "Costa Oscura"
+ RecipeRadar_Strings["Dire Maul"] = "La Masacre"
+ RecipeRadar_Strings["Duskwood"] = "Bosque del Ocaso"
+ RecipeRadar_Strings["Dustwallow Marsh"] = "Marjal Revolcafango"
+ RecipeRadar_Strings["Eastern Plaguelands"] = "Tierras de la Peste del Este"
+ RecipeRadar_Strings["Elwynn Forest"] = "Bosque de Elwynn"
+ RecipeRadar_Strings["Felwood"] = "Frondavil"
+ RecipeRadar_Strings["Hillsbrad Foothills"] = "Laderas de Trabalomas"
+ RecipeRadar_Strings["Ironforge"] = "Forjaz"
+ RecipeRadar_Strings["Moonglade"] = "Claro de la Luna"
+ RecipeRadar_Strings["Redridge Mountains"] = "Montañas Crestagrana"
+ RecipeRadar_Strings["Silverpine Forest"] = "Bosque de Argénteos"
+ RecipeRadar_Strings["Stonetalon Mountains"] = "Sierra Espolón"
+ RecipeRadar_Strings["Stormwind City"] = "Ciudad de Ventormenta"
+ RecipeRadar_Strings["Stranglethorn Vale"] = "Vega de Tuercespina"
+ RecipeRadar_Strings["Swamp of Sorrows"] = "Pantano de las Penas"
+ RecipeRadar_Strings["The Barrens"] = "Los Baldíos"
+ RecipeRadar_Strings["The Hinterlands"] = "Tierras del Interior"
+ RecipeRadar_Strings["Thousand Needles"] = "Las Mil Agujas"
+ RecipeRadar_Strings["Thunder Bluff"] = "Cima del Trueno"
+ RecipeRadar_Strings["Tirisfal Glades"] = "Claros de Tirisfal"
+ RecipeRadar_Strings["Undercity"] = "Entrañas"
+ RecipeRadar_Strings["Un'Goro Crater"] = "Cráter de Un'Goro"
+ RecipeRadar_Strings["Wailing Caverns"] = "Cuevas de los Lamentos"
+ RecipeRadar_Strings["Western Plaguelands"] = "Tierras de la Peste del Oeste"
+ RecipeRadar_Strings["Westfall"] = "Páramos de Poniente"
+ RecipeRadar_Strings["Wetlands"] = "Los Humedales"
+ RecipeRadar_Strings["Winterspring"] = "Cuna del Invierno"
+
+ RecipeRadar_Strings["Rin'wosho the Trader"] = "Rin'wosho el Mercader"
+ RecipeRadar_Strings["Super-Seller 680"] = "Supervendedor 680"
+
+end
\ No newline at end of file
diff --git a/RecipeRadar/MainFrame.lua b/RecipeRadar/MainFrame.lua
new file mode 100644
index 0000000..c87688f
--- /dev/null
+++ b/RecipeRadar/MainFrame.lua
@@ -0,0 +1,356 @@
+
+-- MainFrame.lua: main Recipe Radar window code
+-- $Id: MainFrame.lua 459 2006-09-16 18:33:44Z jnmiller $
+
+function RecipeRadar_MainFrame_Init()
+
+ RecipeRadarFrame:RegisterForDrag("LeftButton")
+
+ RecipeRadarListScrollFrameScrollBar:SetMinMaxValues(0, 0)
+ RecipeRadarListScrollFrameScrollBar:SetValue(0)
+ RecipeRadarListScrollFrameScrollBar.scrollBarHideable = 1
+
+ RecipeRadarOptionsButton:SetText(RRS("Options"))
+ RecipeRadarMapVendorIndicatorText:SetText(RRS("Locate Vendor on Map"))
+ RecipeRadar_UpdateLock()
+
+ RecipeRadar_RadarTab_Init()
+
+ RECIPERADAR_TOOLTIP_LINK = ""
+
+end
+
+function RecipeRadar_Toggle()
+
+ if (RecipeRadarFrame:IsVisible()) then
+ HideUIPanel(RecipeRadarFrame)
+ else
+ RecipeRadar_InitVendorFilters()
+ RecipeRadar_InitRecipeFilters()
+ RecipeRadar_Frame_Show()
+ end
+
+end
+
+function RecipeRadar_Frame_Show()
+
+ ShowUIPanel(RecipeRadarFrame)
+ RecipeRadar_SkillDB_ParseSpellbookFrame()
+ RecipeRadar_SkillDB_ParseSkillFrame()
+ RecipeRadar_SkillDB_ParseReputationFrame()
+ RecipeRadar_FrameUpdate()
+
+end
+
+function RecipeRadar_FrameUpdate()
+
+ if (RecipeRadar_Options.ActiveTab == 1) then
+ RecipeRadar_RadarTab_Update()
+ else
+ RecipeRadar_RecipesTab_Update()
+ end
+
+end
+
+------------------------------------------------------------------------
+-- Tab code
+------------------------------------------------------------------------
+
+-- Draws the borders around each tab according to which is active.
+function RecipeRadar_SetActiveTab(id)
+
+ local active_tab_height, background_tab_height = 33, 29
+
+ if (id == 1) then
+ RecipeRadarRadarTabFrameMiddle:SetHeight(active_tab_height)
+ RecipeRadarRadarTabFrameRight:SetHeight(active_tab_height)
+ RecipeRadarRecipesTabFrameLeft:SetHeight(background_tab_height)
+ RecipeRadarRecipesTabFrameMiddle:SetHeight(background_tab_height)
+ RecipeRadarRecipesTabFrameRight:SetHeight(background_tab_height)
+ RecipeRadar_Options.ActiveTab = 1
+ else
+ RecipeRadarRadarTabFrameMiddle:SetHeight(background_tab_height)
+ RecipeRadarRadarTabFrameRight:SetHeight(background_tab_height)
+ RecipeRadarRecipesTabFrameLeft:SetHeight(active_tab_height)
+ RecipeRadarRecipesTabFrameMiddle:SetHeight(active_tab_height)
+ RecipeRadarRecipesTabFrameRight:SetHeight(active_tab_height)
+ RecipeRadar_Options.ActiveTab = 2
+ end
+
+end
+
+-- Sets the button color and the corresponding highlight color.
+function RecipeRadar_SetButtonColors(button, text_color)
+
+ button:SetTextColor(text_color.r, text_color.g, text_color.b)
+ button:SetHighlightTextColor(
+ text_color.r + RecipeRadar_Colors.Highlight,
+ text_color.g + RecipeRadar_Colors.Highlight,
+ text_color.b + RecipeRadar_Colors.Highlight)
+
+end
+
+-- Common drawing code for list items in the scroll frame.
+function RecipeRadar_DrawListItem(index, recipe)
+
+ local button = getglobal("RecipeRadarVendor" .. index)
+
+ -- get and set the text color according to recipe availability
+ local name = RecipeRadar_GetSafeItemInfo(recipe.ID)
+ local indicator = RecipeRadar_Availability_GetIndicator(recipe)
+
+ if (name == RRS("Uncached Recipe")) then
+ RecipeRadar_SetButtonColors(button, RecipeRadar_Colors.UncachedRecipe)
+ else
+ RecipeRadar_SetButtonColors(button, RecipeRadar_Colors.LightGray)
+ end
+
+ -- basic drawing code
+ if (RecipeRadar_Options.RealmAvailability) then
+ button:SetText(name .. indicator)
+ else
+ button:SetText(name)
+ end
+ button:SetID(index)
+ button:Show()
+
+ -- drawing code for the little subtext field
+ local subtext = getglobal("RecipeRadarVendor" .. index .. "SubText")
+ if (not RecipeRadar_Options.RealmAvailability) then
+ local avail = RecipeRadar_Availability_GetKey(recipe)
+ if (avail) then
+ button.r = RecipeRadar_Availabilities[avail].Color.r
+ button.g = RecipeRadar_Availabilities[avail].Color.g
+ button.b = RecipeRadar_Availabilities[avail].Color.b
+ else
+ button.r = RecipeRadar_Colors.UncachedRecipe.r
+ button.g = RecipeRadar_Colors.UncachedRecipe.g
+ button.b = RecipeRadar_Colors.UncachedRecipe.b
+ end
+ subtext:SetText(indicator)
+ subtext:SetTextColor(button.r, button.g, button.b)
+ subtext:SetPoint("LEFT", "RecipeRadarVendor" .. index .. "Text",
+ "RIGHT", 10, 0)
+ subtext:Show()
+ else
+ subtext:Hide()
+ end
+
+ -- provide information for the availability tooltip
+ button.Recipe = recipe
+
+end
+
+------------------------------------------------------------------------
+-- Base vendor/recipe selection code
+------------------------------------------------------------------------
+
+-- OnClick handler for the vendor/recipe buttons in the scroll frame.
+function RecipeRadar_VendorButton_OnClick(button)
+
+ local offset = FauxScrollFrame_GetOffset(RecipeRadarListScrollFrame)
+ local index = this:GetID() + offset
+
+ RecipeRadar_ServiceClickIndex(index, button)
+
+ if (button == "LeftButton") then
+ RecipeRadar_FrameUpdate()
+ end
+
+end
+
+-- Selects the first visible recipe (not vendor).
+function RecipeRadar_SelectFirstRecipe()
+
+ RecipeRadar_ServiceClickIndex(-1)
+
+end
+
+-- Abstracts front for click handlers.
+function RecipeRadar_ServiceClickIndex(index, button)
+
+ if (RecipeRadar_Options.ActiveTab == 1) then
+ RecipeRadar_RadarTab_ServiceClickIndex(index, button)
+ else
+ RecipeRadar_RecipesTab_ServiceClickIndex(index, button)
+ end
+
+end
+
+------------------------------------------------------------------------
+-- Recipe details and map frames
+------------------------------------------------------------------------
+
+function RecipeRadar_ShowRecipeDetails()
+
+ RecipeDetailName:Show()
+ RecipeDetailIcon:Show()
+ RecipeDetailCostText:Show()
+ RecipeDetailMoneyFrame:Show()
+
+end
+
+function RecipeRadar_HideRecipeDetails()
+
+ RecipeDetailName:Hide()
+ RecipeDetailIcon:Hide()
+ RecipeDetailCostText:Hide()
+ RecipeDetailMoneyFrame:Hide()
+ RecipeDetailNoteText:Hide()
+ RecipeDetailRequirements:Hide()
+ RecipeRadarRegionMap:Hide()
+
+ -- reset the mapped indicator to red/off
+ RecipeRadarMapVendorIndicator:SetVertexColor(1.0, 0, 0)
+
+ -- hide all of our little mapping scrolls
+ for i = 1, RecipeRadar_MaxVendorCoordinates do
+ getglobal("RecipeRadarScroll" .. i):Hide()
+ end
+
+end
+
+-- When a recipe is actually selected, this function handles the
+-- subsequent drawing in the lower details and map frames.
+function RecipeRadar_SetSelection(vendor, recipe, region_name)
+
+ local name, link, colorcode, _, _, _, texture, cached =
+ RecipeRadar_GetSafeItemInfo(recipe.ID)
+
+ RecipeDetailName:SetText(name)
+
+ -- handle the little icon in the details frame
+ RecipeDetailIcon:SetNormalTexture(texture)
+ RecipeDetailIcon.NeedsUpdate = not cached
+ RecipeDetailIcon.Name = name
+ RecipeDetailIcon.Link = link
+ RecipeDetailIcon.Hyperlink =
+ RecipeRadar_GetHyperlinkByParts(name, link, colorcode)
+
+ -- set the color/content of the money text
+ if (GetMoney() >= recipe.Cost) then
+ SetMoneyFrameColor("RecipeDetailMoneyFrame", 1.0, 1.0, 1.0);
+ else
+ SetMoneyFrameColor("RecipeDetailMoneyFrame", 1.0, 0.1, 0.1);
+ end
+ MoneyFrame_Update("RecipeDetailMoneyFrame", recipe.Cost);
+
+ -- some vendors have special requirements
+ if (RecipeRadar_GetRecipeReqsString(recipe)) then
+ RecipeDetailRequirements:SetText(RecipeRadar_GetRecipeReqsString(recipe))
+ RecipeDetailNoteText:Show()
+ RecipeDetailRequirements:Show()
+ else
+ RecipeDetailNoteText:Hide()
+ RecipeDetailRequirements:Hide()
+ end
+
+ -- sets the color on the little radio button at the top
+ if (vendor.IsMapped) then
+ RecipeRadarMapVendorIndicator:SetVertexColor(0, 1.0, 0)
+ else
+ RecipeRadarMapVendorIndicator:SetVertexColor(1.0, 0, 0)
+ end
+
+ if (vendor.Coordinates) then
+
+ if (not region_name) then
+ region_name = RecipeRadar_Options.CurrentRegion
+ end
+
+ local region = RecipeRadar_RegionData[region_name]
+ if (not region) then return end
+
+ -- draw the map first
+ RecipeRadarRegionMap:SetTexture(
+ RECIPERADAR_IMAGE_ROOT .. "Regions\\" .. region.MapFile)
+ RecipeRadarRegionMap:Show()
+
+ -- then draw the little icon (or multiple icons for moble vendors)
+ for i = 1, RecipeRadar_MaxVendorCoordinates do
+
+ local scroll_icon = getglobal("RecipeRadarScroll" .. i)
+ local coords = vendor.Coordinates[i]
+
+ if (not coords) then
+ scroll_icon:Hide()
+ else
+ local x = RecipeRadarMapFrame:GetWidth() * coords.x
+ local y = RecipeRadarMapFrame:GetHeight() * -coords.y
+ scroll_icon.Vendor = vendor
+ scroll_icon:SetPoint("CENTER", "RecipeRadarMapFrame",
+ "TOPLEFT", x, y)
+ scroll_icon:Show()
+ end
+
+ end
+
+ else -- no vendor coordinates means no map
+
+ RecipeRadarRegionMap:Hide()
+ for i = 1, RecipeRadar_MaxVendorCoordinates do
+ getglobal("RecipeRadarScroll" .. i):Hide()
+ end
+
+ end
+
+end
+
+function RecipeRadar_RecipeDetailIcon_ShowToolTip()
+
+ GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
+ GameTooltip:SetHyperlink(RecipeDetailIcon.Link)
+ GameTooltip:Show()
+
+ if RecipeDetailIcon.NeedsUpdate then return end
+
+ if (RecipeBook_DoHookedFunction) then
+ RecipeBook_DoHookedFunction(GameTooltip, RecipeDetailIcon.Link)
+ end
+
+ if (EnhTooltip and EnhTooltip.TooltipCall) then
+ EnhTooltip.TooltipCall(GameTooltip, RecipeDetailIcon.Name,
+ RecipeDetailIcon.Hyperlink, nil, 1)
+ end
+
+end
+
+-------------------------------------------------------------------------
+-- Frame Movement
+-------------------------------------------------------------------------
+
+function RecipeRadar_ToggleLock()
+
+ if (RecipeRadar_Options.Locked) then
+ RecipeRadar_Options.Locked = false
+ RecipeRadar_UpdateLock()
+ else
+ RecipeRadar_Options.Locked = true
+ RecipeRadar_UpdateLock()
+ end
+
+end
+
+function RecipeRadar_UpdateLock()
+
+ if (RecipeRadar_Options.Locked) then
+ RecipeRadarLockNormal:SetTexture(
+ RECIPERADAR_IMAGE_ROOT .. "Frame\\LockButton-Locked-Up")
+ RecipeRadarLockPushed:SetTexture(
+ RECIPERADAR_IMAGE_ROOT .. "Frame\\LockButton-Locked-Down")
+ else
+ RecipeRadarLockNormal:SetTexture(
+ RECIPERADAR_IMAGE_ROOT .. "Frame\\LockButton-Unlocked-Up")
+ RecipeRadarLockPushed:SetTexture(
+ RECIPERADAR_IMAGE_ROOT .. "Frame\\LockButton-Unlocked-Down")
+ end
+
+end
+
+function RecipeRadar_StartMoving()
+
+ if (not RecipeRadar_Options.Locked) then
+ RecipeRadarFrame:StartMoving()
+ end
+
+end
diff --git a/RecipeRadar/Maps.lua b/RecipeRadar/Maps.lua
new file mode 100644
index 0000000..d6d58ba
--- /dev/null
+++ b/RecipeRadar/Maps.lua
@@ -0,0 +1,222 @@
+
+-- Maps.lua: generic mapping code and map "base class"
+-- $Id: Maps.lua 443 2006-09-01 04:41:40Z jnmiller $
+
+-- Initializes the state of the map overlays and settings.
+function RecipeRadar_Maps_Init()
+
+ RecipeRadar_Minimap_Init()
+ RecipeRadar_Worldmap_Init()
+
+ RecipeRadar_MappedVendors = { }
+
+end
+
+-- find the next unused icon; we just check minimap icons since
+-- world/mini icons should always correspond
+function RecipeRadar_Maps_FindNextID()
+
+ for i = 1, RECIPERADAR_MAPPED_VENDORS_MAX do
+ if (not getglobal("RecipeRadarMinimapIcon" .. i).IsMapped) then
+ return i
+ end
+ end
+
+ return nil
+
+end
+
+-- Add the given vendor to the list of mapped vendors.
+function RecipeRadar_Maps_AddVendor(vendor, region)
+
+ if (vendor.IsMapped) then return end -- vendor is already mapped
+
+ local continent = RecipeRadar_RegionData[region].Continent
+ if (continent == 0) then return end -- instance vendor
+
+ if (not vendor.Coordinates) then
+ RecipeRadar_Print("ASSERT FAILED: " .. vendor.Name ..
+ " has no coordinates.")
+ return
+ end
+
+ local id = RecipeRadar_Maps_FindNextID()
+ if (not id) then return end
+
+ RecipeRadar_Worldmap_AddVendor(id, vendor, region, continent)
+ RecipeRadar_Minimap_AddVendor(id, vendor, region)
+
+ RecipeRadar_MappedVendors[vendor.Name] = id
+ vendor.IsMapped = true
+
+end
+
+-- Unmap the vendor.
+function RecipeRadar_Maps_RemoveVendor(vendor)
+
+ local id = RecipeRadar_MappedVendors[vendor.Name]
+
+ RecipeRadar_Minimap_RemoveVendor(id)
+ RecipeRadar_Worldmap_RemoveVendor(id)
+
+ RecipeRadar_MappedVendors[vendor.Name] = nil
+ vendor.IsMapped = false
+
+end
+
+-- Creates and displays the tooltip that displays on mouseover for all
+-- of our maps - minimap, worldmap and our custom Recipe Radar map.
+-- tooltip is the tooltip to draw (eg. GameTooltip), and frame is the
+-- owner button.
+function RecipeRadar_Maps_SetTooltip(tooltip, frame)
+
+ local line1, line2 = RecipeRadar_GetColoredTeamString(
+ frame.Vendor.Team, frame.Vendor.Name)
+ local anchor = "ANCHOR_BOTTOMLEFT"
+
+ local count = table.getn(frame.Vendor.Recipes)
+ if (count == 1) then
+ line2 = RRS("1 recipe")
+ else
+ line2 = string.format(RRS("%d recipes"), count)
+ end
+
+ count = RecipeRadar_CountLearnableRecipes(frame.Vendor.Recipes)
+ line2 = line2 .. " " .. format(TEXT(PARENS_TEMPLATE),
+ format(RRS("%d learnable"), count))
+
+ -- make sure our tooltip doesn't hit the screen edge
+ if (frame:GetLeft() < 200) then
+ anchor = "ANCHOR_RIGHT"
+ end
+
+ tooltip:SetOwner(frame, anchor)
+ tooltip:SetText(line1)
+ tooltip:AddLine(line2)
+ if (frame.Vendor.Notes and frame.Vendor.Notes ~= "") then
+ tooltip:AddLine(RecipeRadar_FormatVendorNote(frame.Vendor.Notes, true))
+ end
+ tooltip:Show()
+
+end
+
+-- OnLoad event handler for the right-click context menu for map buttons.
+function RecipeRadar_Maps_ContextMenuOnLoad()
+
+ RecipeRadar_ContextMenuGlobal = { }
+ UIDropDownMenu_Initialize(this, RecipeRadar_Maps_ContextMenuInit, "MENU")
+
+end
+
+-- Initialization routine for the right-click context menu for map buttons.
+function RecipeRadar_Maps_ContextMenuInit()
+
+ local item
+
+ -- putting in the vendor's name as the title of the popup
+ if (RecipeRadar_ContextMenuGlobal.Vendor) then
+ item = { }
+ item.text = RecipeRadar_ContextMenuGlobal.Vendor.Name
+ item.isTitle = 1
+ item.notCheckable = 1
+ UIDropDownMenu_AddButton(item)
+ end
+
+ item = { }
+ item.text = RRS("Unmap Vendor")
+ item.value = "unmap"
+ item.notCheckable = 1
+ item.func = RecipeRadar_Maps_ContextMenuOnClick
+ UIDropDownMenu_AddButton(item)
+
+ item = { }
+ item.text = CANCEL
+ item.notCheckable = 1
+ item.func = RecipeRadar_Maps_ContextMenuOnClick
+ UIDropDownMenu_AddButton(item)
+
+end
+
+-- OnClick event handler for the right-click context menu for map buttons.
+function RecipeRadar_Maps_ContextMenuOnClick()
+
+ if (this.value == "unmap") then
+ RecipeRadar_Maps_RemoveVendor(RecipeRadar_ContextMenuGlobal.Vendor)
+ RecipeRadar_FrameUpdate()
+ end
+
+end
+
+-- Changes local (region map) coordinates to absolute coordinates.
+function RecipeRadar_Maps_LocalToAbsolute(local_x, local_y, region)
+
+ local region = RecipeRadar_RegionData[region]
+ if (not region) then return end
+
+ local absolute_x = local_x * region.MapScale + region.MapOffset.x
+ local absolute_y = local_y * region.MapScale + region.MapOffset.y
+
+ return absolute_x, absolute_y
+
+end
+
+-- Changes local (region map) coordinates to absolute coordinates.
+function RecipeRadar_Maps_LocalToAbsoluteTable(local_coords, region)
+
+ local region = RecipeRadar_RegionData[region]
+ if (not region) then return end
+
+ local absolute = { }
+ absolute.x = local_coords.x * region.MapScale + region.MapOffset.x
+ absolute.y = local_coords.y * region.MapScale + region.MapOffset.y
+
+ return absolute
+
+end
+
+-- Map constants (from MapNotes).
+RecipeRadar_MapData = {
+
+ IndoorZoomRatio = {
+ [0] = 1.565,
+ [1] = 1.687,
+ [2] = 1.882,
+ [3] = 2.210,
+ [4] = 2.575,
+ [5] = 2.651,
+ },
+
+ Worldmap = {
+ [1] = {
+ Scale = 0.815775262,
+ Offset = { x = -0.185568684, y = 0.064012977 },
+ },
+ [2] = {
+ Scale = 0.790967532,
+ Offset = { x = 0.371931204, y = 0.081458069 },
+ },
+ },
+
+ [1] = {
+ Scale = { -- continent scale rates
+ [0] = { x = 11016.6, y = 7399.9 },
+ [1] = { x = 12897.3, y = 8638.1 },
+ [2] = { x = 15478.8, y = 10368.0 },
+ [3] = { x = 19321.8, y = 12992.7 },
+ [4] = { x = 25650.4, y = 17253.2 },
+ [5] = { x = 38787.7, y = 26032.1 },
+ }
+ },
+
+ [2] = {
+ Scale = { -- continent scale rates
+ [0] = { x = 10448.3, y = 7072.7 },
+ [1] = { x = 12160.5, y = 8197.8 },
+ [2] = { x = 14703.1, y = 9825.0 },
+ [3] = { x = 18568.7, y = 12472.2 },
+ [4] = { x = 24390.3, y = 15628.5 },
+ [5] = { x = 37012.2, y = 25130.6 },
+ },
+ },
+
+}
diff --git a/RecipeRadar/Maps.xml b/RecipeRadar/Maps.xml
new file mode 100644
index 0000000..3220b78
--- /dev/null
+++ b/RecipeRadar/Maps.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RecipeRadar_Maps_ContextMenuOnLoad()
+
+
+
+
+
diff --git a/RecipeRadar/Minimap.lua b/RecipeRadar/Minimap.lua
new file mode 100644
index 0000000..8e018de
--- /dev/null
+++ b/RecipeRadar/Minimap.lua
@@ -0,0 +1,209 @@
+
+-- Minimap.lua: minimap vendor plotting code
+-- $Id: Minimap.lua 429 2006-08-22 19:16:17Z jnmiller $
+-- Note: the mapping code in here is from MapNotes, by Sir.Bender, et al.
+
+-- Initializes the state of the minimap overlays and settings.
+function RecipeRadar_Minimap_Init()
+
+ -- time between minimap updates, in seconds
+ RECIPERADAR_MINIMAP_UPDATE = 0.1
+
+ -- determine minimap scale
+ RecipeRadar_Minimap_SetIndoorness()
+
+ for i = 1, RECIPERADAR_MAPPED_VENDORS_MAX do
+ local button = getglobal("RecipeRadarMinimapIcon" .. i)
+ button.Elapsed = 0
+ button:Hide()
+ end
+
+end
+
+function RecipeRadar_Minimap_OnNewRegion()
+
+ SetMapToCurrentZone()
+ for i = 1, RECIPERADAR_MAPPED_VENDORS_MAX do
+ local button = getglobal("RecipeRadarMinimapIcon" .. i)
+ if (button.IsMapped and button.Region == GetRealZoneText()) then
+ button:Show()
+ else
+ button:Hide()
+ end
+ end
+
+end
+
+-- Map the given icon to the given vendor.
+function RecipeRadar_Minimap_AddVendor(id, vendor, region)
+
+ local button = getglobal("RecipeRadarMinimapIcon" .. id)
+
+ button.Vendor = vendor
+ button.Region = region
+ button.Elapsed = RECIPERADAR_MINIMAP_UPDATE
+ button.IsMapped = true
+ button:Show()
+
+end
+
+-- Resets and unmaps the given icon.
+function RecipeRadar_Minimap_RemoveVendor(id)
+
+ local button = getglobal("RecipeRadarMinimapIcon" .. id)
+
+ button.Vendor = nil
+ button.Region = nil
+ button.IsMapped = false
+ button:Hide()
+
+end
+
+function RecipeRadar_Minimap_OnUpdate(elapsed)
+
+ if (this.Region ~= GetRealZoneText()) then
+ this:Hide()
+ return
+ end
+
+ this.Elapsed = this.Elapsed + elapsed
+ if (this.Elapsed < RECIPERADAR_MINIMAP_UPDATE) then
+ return
+ end
+ this.Elapsed = 0
+
+ RecipeRadar_Minimap_UpdateButton(this)
+
+end
+
+-- Determines whether the minimap is displaying an indoor location
+-- by comparing the minimapZoom and minimapInsideZoom CVars (from MapNotes).
+function RecipeRadar_Minimap_SetIndoorness()
+
+ local test_zoom = 0
+
+ if (GetCVar("minimapZoom") == GetCVar("minimapInsideZoom")) then
+ if (GetCVar("minimapInsideZoom") + 0 >= 3) then
+ Minimap:SetZoom(Minimap:GetZoom() - 1)
+ test_zoom = 1
+ else
+ Minimap:SetZoom(Minimap:GetZoom() + 1)
+ test_zoom = -1
+ end
+ end
+
+ RecipeRadar_Minimap_IsIndoor =
+ (GetCVar("minimapInsideZoom") + 0 == Minimap:GetZoom())
+
+ Minimap:SetZoom(Minimap:GetZoom() + test_zoom)
+
+end
+
+-- Computes the distance between two points on the minimap.
+function RecipeRadar_Minimap_Distance(p1_x, p1_y, p2_x, p2_y)
+
+ local dist_x, dist_y = p2_x - p1_x, p2_y - p1_y
+
+ return dist_x, dist_y
+
+end
+
+-- Computes the length of the hypotenuse between two lines.
+function RecipeRadar_Minimap_Pythagorean(length1, length2)
+
+ local distance = math.sqrt(length1 * length1 + length2 * length2)
+
+ if (distance == 0) then
+ return 0.0000000001
+ end
+ return distance
+
+end
+
+-- Retrieves the appropriate scaling constants from our MapData table.
+function RecipeRadar_Minimap_GetScale(continent, is_indoor, zoom)
+
+ if (continent == 0) then
+ RecipeRadar_Print("ASSERT FAILED: continent = 0")
+ return nil
+ end
+
+ local scale_x = RecipeRadar_MapData[continent].Scale[zoom].x
+ local scale_y = RecipeRadar_MapData[continent].Scale[zoom].y
+
+ if (is_indoor == true) then
+ scale_x = scale_x * RecipeRadar_MapData.IndoorZoomRatio[zoom]
+ scale_y = scale_y * RecipeRadar_MapData.IndoorZoomRatio[zoom]
+ end
+
+ return scale_x, scale_y
+
+end
+
+-- Finds the appropriate location on the minimap, accounting for the fact
+-- that the minimap has a radius of only 57 (or so) units (from MapNotes).
+function RecipeRadar_Minimap_GetPosition(offs_x, offs_y, scale_x, scale_y)
+
+ local map_x, map_y = offs_x * scale_x, offs_y * scale_y
+ local dist = RecipeRadar_Minimap_Pythagorean(map_x, map_y)
+
+ if (dist >= 57) then
+
+ local flip_axis = 1
+ if (map_x == 0) then
+ map_x = 0.0000000001
+ elseif (map_x < 0) then
+ flip_axis = -1
+ end
+
+ local angle = math.atan(map_y / map_x)
+ map_x = math.cos(angle) * 58 * flip_axis
+ map_y = math.sin(angle) * 58 * flip_axis
+
+ end
+
+ return map_x, map_y
+
+end
+
+-- Plots the given button on the minimap.
+function RecipeRadar_Minimap_UpdateButton(button)
+
+ local pl_x, pl_y = GetPlayerMapPosition("player")
+ if (pl_x == 0 and pl_y == 0) then
+ button:Hide() -- the player is in an unmappable location
+ return
+ end
+
+ -- only mapping the first location in our database
+ local vendor = button.Vendor.Coordinates[1]
+ if (not vendor) then return end
+
+ -- some code to display the current coordinates for debugging
+ if (RecipeRadar_Options.PositionDebug) then
+ RecipeRadar_Print("Debugging " .. button.Vendor.Name)
+ RecipeRadar_Print("Database Coords: " .. vendor.x .. ", " .. vendor.y)
+ RecipeRadar_Print("Player Coords: " .. pl_x .. ", " .. pl_y)
+ RecipeRadar_Options.PositionDebug = false
+ end
+
+ -- we don't need all these computations if the player isn't moving
+ if (pl_x == button.pl_x and pl_y == button.pl_y) then return end
+ button.pl_x, button.pl_y = pl_x, pl_y
+
+ pl_x, pl_y = RecipeRadar_Maps_LocalToAbsolute(pl_x, pl_y, button.Region)
+ vendor = RecipeRadar_Maps_LocalToAbsoluteTable(vendor, button.Region)
+
+ local offs_x, offs_y = RecipeRadar_Minimap_Distance(pl_x, pl_y,
+ vendor.x, vendor.y)
+
+ local region = RecipeRadar_RegionData[button.Region]
+ local scale_x, scale_y = RecipeRadar_Minimap_GetScale(
+ region.Continent, RecipeRadar_Minimap_IsIndoor, Minimap:GetZoom())
+
+ local pos_x, pos_y = RecipeRadar_Minimap_GetPosition(
+ offs_x, offs_y, scale_x, scale_y)
+
+ button:SetPoint("CENTER", "Minimap", "CENTER", pos_x, -pos_y)
+
+end
diff --git a/RecipeRadar/MinimapButton.lua b/RecipeRadar/MinimapButton.lua
new file mode 100644
index 0000000..9ba6efb
--- /dev/null
+++ b/RecipeRadar/MinimapButton.lua
@@ -0,0 +1,91 @@
+
+-- MinimapButton.lua: code to handle the little Recipe Radar minimap button
+-- $Id: MinimapButton.lua 279 2006-04-12 07:55:40Z jnmiller $
+
+function RecipeRadar_MinimapButton_OnClick()
+
+ RecipeRadar_Toggle()
+
+end
+
+function RecipeRadar_MinimapButton_Init()
+
+ if (RecipeRadar_Options.ShowMinimapButton) then
+ RecipeRadarMinimapButton:Show()
+ else
+ RecipeRadarMinimapButton:Hide()
+ end
+ RecipeRadar_MinimapButton_UpdatePosition()
+
+end
+
+function RecipeRadar_MinimapButton_Toggle()
+
+ if (RecipeRadarMinimapButton:IsVisible()) then
+ RecipeRadarMinimapButton:Hide()
+ RecipeRadar_Options.ShowMinimapButton = false
+ else
+ RecipeRadarMinimapButton:Show()
+ RecipeRadar_Options.ShowMinimapButton = true
+ end
+
+end
+
+-- Turns on the slow highlight/outline flash.
+function RecipeRadar_MinimapButton_Flash()
+
+ RECIPERADAR_FLASH_MINIMAP_BUTTON = true
+ RecipeRadarMinimapButton:LockHighlight()
+
+end
+
+-- OnUpdate event handler manages the flashing highlight when appropriate.
+function RecipeRadar_MinimapButton_OnUpdate(elapsed)
+
+ if (not RECIPERADAR_FLASH_MINIMAP_BUTTON) then
+ return
+ end
+
+ this.total = this.total + elapsed
+ local cntr = this.cntr + elapsed
+ local sign = this.sign
+ local alpha
+
+ -- alternate coming/going every half-second
+ if (cntr > 0.5) then
+ sign = -sign
+ this.sign = sign
+ end
+ cntr = mod(cntr, 0.5)
+ this.cntr = cntr
+
+ -- only make the new value visible if the button is also visible
+ if (RecipeRadarMinimapButton:IsVisible()) then
+ if (sign == 1) then
+ RecipeRadarMinimapButton:LockHighlight();
+ else
+ RecipeRadarMinimapButton:UnlockHighlight();
+ end
+ end
+
+
+ -- only flash for a few seconds, then shut off
+ if (this.total > 4) then
+ RecipeRadarMinimapButton:UnlockHighlight()
+ RECIPERADAR_FLASH_MINIMAP_BUTTON = false
+ this.total = 0
+ end
+
+end
+
+-- Sets the location of the button according to the current options.
+function RecipeRadar_MinimapButton_UpdatePosition()
+ local xmin,ymin,xm,ym = Minimap:GetLeft(), Minimap:GetBottom(), Minimap:GetRight(), Minimap:GetTop();
+ local scale = Minimap:GetEffectiveScale();
+ local xdelta, ydelta = (xm - xmin)/2*scale, (ym - ymin) /2 * scale;
+ local scale2 = RecipeRadarMinimapButton:GetEffectiveScale();
+ local x = (xdelta * cos(RecipeRadar_Options.MinimapButtonPosition))/scale2;
+ local y = (ydelta * sin(RecipeRadar_Options.MinimapButtonPosition))/scale2;
+ RecipeRadarMinimapButton:SetPoint("TOPLEFT", "Minimap", "CENTER", x - 17 , y + 17)
+
+end
diff --git a/RecipeRadar/MinimapButton.xml b/RecipeRadar/MinimapButton.xml
new file mode 100644
index 0000000..afa360f
--- /dev/null
+++ b/RecipeRadar/MinimapButton.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/RecipeRadar/NameMap.lua b/RecipeRadar/NameMap.lua
new file mode 100644
index 0000000..a5002be
--- /dev/null
+++ b/RecipeRadar/NameMap.lua
@@ -0,0 +1,107 @@
+
+-- NameMap.lua: recipes named differently after learning
+-- Auto generated on 9/17/2006 3:42:09 PM
+
+RecipeRadar_NameMap = {
+
+ ["enUS"] = {
+ -- Alchemy
+ ["Philosophers' Stone"] = "Philosopher's Stone",
+ ["Transmute: Iron to Gold"] = "Transmute Iron to Gold",
+ ["Transmute: Mithril to Truesilver"] = "Transmute Mithril to Truesilver",
+ ["Transmute: Arcanite"] = "Transmute Arcanite",
+ ["Transmute: Air to Fire"] = "Transmute Air to Fire",
+ ["Transmute: Earth to Water"] = "Transmute Earth to Water",
+ ["Transmute: Fire to Earth"] = "Transmute Fire to Earth",
+ ["Transmute: Water to Air"] = "Transmute Water to Air",
+ ["Greater Dreamless Sleep Potion"] = "Greater Dreamless Sleep",
+ ["Transmute: Elemental Fire"] = "Transmute Elemental Fire",
+ -- Enchanting
+ ["Enchant Bracer - Healing Power"] = "Enchant Bracer - Healing",
+ -- Cooking
+ ["Mithril Headed Trout"] = "Mithril Head Trout",
+ },
+
+ ["enGB"] = {
+ -- Alchemy
+ ["Philosophers' Stone"] = "Philosopher's Stone",
+ ["Transmute: Iron to Gold"] = "Transmute Iron to Gold",
+ ["Transmute: Mithril to Truesilver"] = "Transmute Mithril to Truesilver",
+ ["Transmute: Arcanite"] = "Transmute Arcanite",
+ ["Transmute: Air to Fire"] = "Transmute Air to Fire",
+ ["Transmute: Earth to Water"] = "Transmute Earth to Water",
+ ["Transmute: Fire to Earth"] = "Transmute Fire to Earth",
+ ["Transmute: Water to Air"] = "Transmute Water to Air",
+ ["Greater Dreamless Sleep Potion"] = "Greater Dreamless Sleep",
+ ["Transmute: Elemental Fire"] = "Transmute Elemental Fire",
+ -- Enchanting
+ ["Enchant Bracer - Healing Power"] = "Enchant Bracer - Healing",
+ -- Cooking
+ ["Mithril Headed Trout"] = "Mithril Head Trout",
+ },
+
+ ["deDE"] = {
+ -- Alchemy
+ ["Transmutieren: Eisen in Gold"] = "Eisen in Gold transmutieren",
+ ["Transmutieren: Mithril in Echtsilber"] = "Mithril in Echtsilber transmutieren",
+ ["Transmutieren: Arkanit"] = "Arkanit transmutieren",
+ ["Transmutieren: Luft zu Feuer"] = "Luft zu Feuer transmutieren",
+ ["Transmutieren: Erde zu Wasser"] = "Erde zu Wasser transmutieren",
+ ["Transmutieren: Feuer zu Erde"] = "Feuer zu Erde transmutieren",
+ ["Transmutieren: Wasser zu Luft"] = "Wasser zu Luft transmutieren",
+ -- Enchanting
+ ["Zweihandwaffen - Beweglichkeit"] = "Zweihandwaffe - Beweglichkeit",
+ ["Armschiene - Heilkraft"] = "Armschiene - Heilung",
+ -- Engineering
+ ["Gnomen-Universalfernbedienung"] = "Gnomenuniversalfernbedienung",
+ ["Goblin-Überbrückungskabel"] = "Goblinüberbrückungskabel",
+ ["Echtsilber-Umwandler"] = "Echtsilberumwandler",
+ -- Cooking
+ ["Westfall-Eintopf"] = "Westfalleintopf",
+ },
+
+ ["frFR"] = {
+ -- Alchemy
+ ["Potion de Rage"] = "Potion de rage",
+ ["Transmutation : Fer en Or"] = "Transmutation du fer en or",
+ ["Transmutation de mithril en vrai-argent"] = "Transmutation du mithril en vrai-argent",
+ ["Elixir de Puissance de l'ombre"] = "Elixir de puissance de l'Ombre",
+ ["Elixir de Tueur de démons"] = "Elixir de tueur de démons",
+ ["Potion de soins majeure"] = "Potion de Soins majeure",
+ ["Potion de sommeil sans rêve supérieure"] = "Sommeil sans rêve supérieur",
+ ["Transmutation : Feu élémentaire"] = "Transmutation du feu élémentaire",
+ -- Enchanting
+ ["Ench. de plastron (Mana mineur)"] = "Enchantement de plastron (Mana mineur)",
+ ["Ench. de plastron (Mana inférieur)"] = "Enchantement de plastron (Mana inférieur)",
+ ["Ench. d'arme 2M (Intelligence inférieure)"] = "Enchantement d'arme 2M (Intelligence inférieure)",
+ ["Ench. de cape (Agilité mineure)"] = "Enchantement de cape (Agilité mineure)",
+ ["Ench. de bottes (Agilité mineure)"] = "Bottes enchantées (Agilité mineure)",
+ ["Ench. de bracelets (Force inférieure)"] = "Enchantement de bracelets (Force inférieure)",
+ ["Ench. de bracelets (Déviation inférieure)"] = "Enchantement de bracelets (Déviation inférieure)",
+ ["Ench. de bracelets (Déviation)"] = "Enchantement de bracelets (Déviation)",
+ ["Ench. de bouclier (Endurance supérieure)"] = "Enchantement de bouclier (Endurance supérieure)",
+ ["Ench. de plastron (Vie majeure)"] = "Enchantement de plastron (Santé majeure)",
+ ["Ench. de cape (Défense excellente)"] = "Enchantement de cape (Défense excellent)",
+ ["Ench. d'arme (Force)"] = "Enchantement d'arme (Force)",
+ ["Ench. d'arme (Agilité)"] = "Enchantement d'arme (Agilité)",
+ ["Ench. de bracelets (Régénération de mana)"] = "Enchantement de bracelets (Régénération de mana)",
+ ["Ench. d'arme 2M (Agilité)"] = "Enchantement d'arme 2M (Agilité)",
+ ["Ench. de bracelets (Pouvoir de guérison)"] = "Enchantement de bracelets (Soin)",
+ ["Ench. d'arme (Esprit renforcé)"] = "Enchantement d'arme (Esprit renforcé)",
+ ["Ench. d'arme (Intelligence renforcée)"] = "Enchantement d'arme (Intelligence renforcée)",
+ ["Ench. de cape (Résistance au Feu supérieure)"] = "Enchantement de cape (Résistance au feu supérieure)",
+ ["Ench. de cape (Résistance à la Nature supérieure)"] = "Enchantement de cape (Résistance à la nature supérieure)",
+ -- Engineering
+ ["Rouage en thorium"] = "Rouages en thorium",
+ -- Leatherworking
+ ["Ceinture en cuir clouté de gemmes"] = "Ceinture en cuir cloutée de gemmes",
+ ["Demi-bottes de l'aube"] = "Bottines de l'aube",
+ ["Jambières de l'ours de guerre"] = "Haut-de-chausses de l'ours de guerre",
+ -- Tailoring
+ ["Jambières en vignesang"] = "Jambières en vignesang",
+ -- Cooking
+ ["Biscuit au pain d'épices"] = "Biscuit de pain d'épice",
+ },
+
+}
+
diff --git a/RecipeRadar/OptionsFrame.lua b/RecipeRadar/OptionsFrame.lua
new file mode 100644
index 0000000..ff834fb
--- /dev/null
+++ b/RecipeRadar/OptionsFrame.lua
@@ -0,0 +1,207 @@
+
+function RecipeRadar_OptionsFrame_OnLoad()
+
+ UIPanelWindows["RecipeRadarOptionsFrame"] = { area = "center" }
+ RecipeRadarOptionsFrameHeaderText:SetText(RRS("Recipe Radar"))
+
+end
+
+function RecipeRadar_OptionsFrame_Toggle()
+
+ if (RecipeRadarOptionsFrame:IsVisible()) then
+ RecipeRadarOptionsFrame:Hide()
+ else
+ RecipeRadarOptionsFrame:Show()
+ end
+
+end
+
+function RecipeRadar_OptionsFrame_Init()
+
+ RecipeRadarRealmAvailability:SetChecked(
+ RecipeRadar_Options.RealmAvailability)
+
+ RecipeRadarShowMinimapButton:SetChecked(
+ RecipeRadar_Options.ShowMinimapButton)
+
+ RecipeRadarMinimapButtonPositionSlider:SetValue(
+ RecipeRadar_Options.MinimapButtonPosition)
+
+ RecipeRadarAutoSelectRegionButton:SetChecked(
+ RecipeRadar_Options.AutoSelectRegion)
+ RecipeRadar_OptionsFrame_AutoSelectRegion_OnClick()
+
+ RecipeRadarAutoMapVendorsButton:SetChecked(
+ RecipeRadar_Options.AutoMapVendors)
+
+end
+
+function RecipeRadar_OptionsFrame_OnShow()
+
+ RecipeRadar_OptionsFrame_Init()
+ UIDropDownMenu_Initialize(RecipeRadar_ContinentDropDown,
+ RecipeRadar_ContinentDropDown_Init)
+ UIDropDownMenu_Initialize(RecipeRadar_RegionDropDown,
+ RecipeRadar_RegionDropDown_Init)
+
+end
+
+function RecipeRadar_OptionsFrame_AutoSelectRegion_OnClick()
+
+ if (RecipeRadarAutoSelectRegionButton:GetChecked()) then
+
+ PlaySound("igMainMenuOptionCheckBoxOn")
+ RecipeRadar_Options.AutoSelectRegion = true
+ RecipeRadar_OptionsFrame_DisableDropDown(RecipeRadar_ContinentDropDown)
+ RecipeRadar_OptionsFrame_DisableDropDown(RecipeRadar_RegionDropDown)
+
+ -- auto-select the current region
+ RecipeRadar_NewRegion(GetRealZoneText())
+ UIDropDownMenu_ClearAll(RecipeRadar_ContinentDropDown)
+ UIDropDownMenu_Initialize(RecipeRadar_ContinentDropDown,
+ RecipeRadar_ContinentDropDown_Init)
+ UIDropDownMenu_Initialize(RecipeRadar_RegionDropDown,
+ RecipeRadar_RegionDropDown_Init)
+
+ else
+
+ PlaySound("igMainMenuOptionCheckBoxOff")
+ RecipeRadar_Options.AutoSelectRegion = false
+ RecipeRadar_OptionsFrame_EnableDropDown(RecipeRadar_ContinentDropDown)
+ RecipeRadar_OptionsFrame_EnableDropDown(RecipeRadar_RegionDropDown)
+
+ end
+
+end
+
+-----------------------------------------------------------------------------
+-- Continent/region drop down code
+-----------------------------------------------------------------------------
+
+function RecipeRadar_ContinentDropDown_OnLoad()
+
+ UIDropDownMenu_ClearAll(this)
+ UIDropDownMenu_SetWidth(140)
+
+end
+
+function RecipeRadar_ContinentDropDown_Init()
+
+ for index, name in RecipeRadar_Continents do
+
+ local item = { }
+
+ if ((not RecipeRadar_ContinentDropDown.selectedValue and
+ index == RecipeRadar_Options.CurrentContinent) or
+ index == RecipeRadar_ContinentDropDown.selectedValue) then
+ item.checked = 1
+ end
+
+ item.text = name
+ item.value = index
+ item.func = RecipeRadar_ContinentDropDown_OnClick
+
+ UIDropDownMenu_AddButton(item)
+
+ end
+
+ if (not RecipeRadar_ContinentDropDown.selectedValue) then
+ UIDropDownMenu_SetSelectedValue(RecipeRadar_ContinentDropDown,
+ RecipeRadar_Options.CurrentContinent)
+ end
+
+end
+
+function RecipeRadar_ContinentDropDown_OnClick()
+
+ UIDropDownMenu_SetSelectedValue(RecipeRadar_ContinentDropDown, this.value)
+ UIDropDownMenu_Initialize(RecipeRadar_RegionDropDown,
+ RecipeRadar_RegionDropDown_Init)
+
+end
+
+function RecipeRadar_GetContinentIndex(continent)
+
+ for index, name in RecipeRadar_Continents do
+ if (name == continent) then
+ return index
+ end
+ end
+ return nil
+
+end
+
+function RecipeRadar_RegionDropDown_OnLoad()
+
+ UIDropDownMenu_SetWidth(140)
+
+end
+
+function RecipeRadar_RegionDropDown_Init()
+
+ local cont = UIDropDownMenu_GetSelectedValue(RecipeRadar_ContinentDropDown)
+ local regions = { }
+
+ if (cont == 0) then
+
+ -- create sorted list of relevant instances
+ table.foreach(RecipeRadar_RegionData,
+ function (k, v)
+ if (v.Continent == 0) then
+ table.insert(regions, k)
+ end
+ end)
+ table.sort(regions)
+
+ else
+
+ -- otherwise just populate with all the continent's regions
+ regions = { GetMapZones(cont) }
+
+ end
+
+
+ for id, region in regions do
+
+ local item = { }
+ item.text = region
+ item.value = id
+ item.func = RecipeRadar_RegionDropDown_OnClick
+
+ UIDropDownMenu_AddButton(item)
+
+ end
+
+ if (cont == RecipeRadar_Options.CurrentContinent) then
+ UIDropDownMenu_SetSelectedName(RecipeRadar_RegionDropDown,
+ RecipeRadar_Options.CurrentRegion)
+ else
+ UIDropDownMenu_ClearAll(RecipeRadar_RegionDropDown)
+ end
+
+end
+
+function RecipeRadar_RegionDropDown_OnClick()
+
+ UIDropDownMenu_SetSelectedID(RecipeRadar_RegionDropDown, this:GetID())
+ RecipeRadar_NewRegion(this:GetText())
+ RecipeRadarListScrollFrameScrollBar:SetValue(0)
+ RecipeRadar_FrameUpdate()
+
+end
+
+function RecipeRadar_OptionsFrame_DisableDropDown(dropdown)
+
+ getglobal(dropdown:GetName().."Text"):SetVertexColor(
+ GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b)
+ getglobal(dropdown:GetName().."Button"):Disable()
+
+end
+
+function RecipeRadar_OptionsFrame_EnableDropDown(dropdown)
+
+ getglobal(dropdown:GetName().."Text"):SetVertexColor(
+ HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
+ getglobal(dropdown:GetName().."Button"):Enable()
+
+end
diff --git a/RecipeRadar/OptionsFrame.xml b/RecipeRadar/OptionsFrame.xml
new file mode 100644
index 0000000..31a9b71
--- /dev/null
+++ b/RecipeRadar/OptionsFrame.xml
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName() .. "Text"):SetText(RRS("Check Availability for Alts"))
+
+
+ if (this:GetChecked()) then
+ PlaySound("igMainMenuOptionCheckBoxOn")
+ else
+ PlaySound("igMainMenuOptionCheckBoxOff")
+ end
+ RecipeRadar_Availability_Toggle()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName() .. "Text"):SetText(RRS("Show Minimap Button"))
+
+
+ if (this:GetChecked()) then
+ PlaySound("igMainMenuOptionCheckBoxOn")
+ else
+ PlaySound("igMainMenuOptionCheckBoxOff")
+ end
+ RecipeRadar_MinimapButton_Toggle()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName() .. "Text"):SetText(RRS("Minimap Button Position"))
+ getglobal(this:GetName() .. "High"):SetText()
+ getglobal(this:GetName() .. "Low"):SetText()
+ RecipeRadarMinimapButtonPositionSlider:SetMinMaxValues(0, 360)
+ RecipeRadarMinimapButtonPositionSlider:SetValueStep(1)
+
+
+ RecipeRadar_Options.MinimapButtonPosition = this:GetValue()
+ RecipeRadar_MinimapButton_UpdatePosition()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName() .. "Text"):SetText(RRS("Auto-select Current Region"))
+
+
+ RecipeRadar_OptionsFrame_AutoSelectRegion_OnClick()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RecipeRadar_ContinentDropDown_OnLoad()
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RecipeRadar_RegionDropDown_OnLoad()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName() .. "Text"):SetText(RRS("Auto-map Contributive Vendors"))
+
+
+ if (this:GetChecked()) then
+ PlaySound("igMainMenuOptionCheckBoxOn")
+ RecipeRadar_Options.AutoMapVendors = true
+ RecipeRadar_InitVendorFilters()
+ RecipeRadar_FrameUpdate()
+ else
+ PlaySound("igMainMenuOptionCheckBoxOff")
+ RecipeRadar_Options.AutoMapVendors = false
+ end
+
+
+
+
+
+
+
+
+
+
+ RecipeRadar_OptionsFrame_OnLoad()
+
+
+ RecipeRadar_OptionsFrame_OnShow()
+
+
+ if (arg1 == "ESCAPE") then
+ RecipeRadar_OptionsFrame_Toggle()
+ end
+
+
+
+
+
diff --git a/RecipeRadar/README.txt b/RecipeRadar/README.txt
new file mode 100644
index 0000000..a5e9673
--- /dev/null
+++ b/RecipeRadar/README.txt
@@ -0,0 +1,69 @@
+
+Recipe Radar
+
+(by Jay Miller [jnmiller@cryptofreak.org])
+
+http://www.cryptofreak.org/projects/reciperadar
+
+$Id: README.txt 299 2006-04-24 17:34:12Z jnmiller $
+
+
+Installation
+~~~~~~~~~~~~
+You've probably already installed the addon. In case you're not sure how
+to do it, unzip the archive to your
+
+ ... \World of Warcraft\Interface\AddOns
+
+directory. A new directory called 'RecipeRadar' should appear, along with
+several files and subdirectories. That should be all you need to do to
+use Recipe Radar.
+
+When you get in game, you may want to map a key to toggle Recipe Radar.
+You should be able to find the option to do this in your Key Bindings menu,
+all the way at the bottom. Otherwise, you can hit the new icon on your
+minimap to open Recipe Radar or use the slash command, '/rrdr'.
+
+
+Bugs
+~~~~
+If you spot a bug in this software, *please let me know!* The best way
+to do so is to hit the bug tracker at
+
+ http://sourceforge.net/tracker/?group_id=165127
+
+and leave a short report on what was happening at the time. If possible,
+please include the version of Recipe Radar that caused the bug and the
+language of your WoW client.
+
+Also in the bugs category are misplaced vendors. The location information
+for all of the vendors in the Recipe Radar database was retrieved in a
+mostly automated way, so some coordinates are incorrect. If you come upon
+a vendor whose mapped location does not match their actual location, please
+let me know! The most helpful thing you can do is this quick process:
+
+ 1) Unmap all but the problematic vendor.
+ 2) Move your toon exactly on top of the vendor.
+ 3) Type '/rrdr debug vendor'.
+ 4) Record the text you see. It should resemble this:
+
+ Debugging Drac Roughcut
+ Database Coords: 0.356, 0.491
+ Player Coords: 0.35588067770004, 0.48890501260757
+
+ 5) File a bug report and include this text.
+
+Thank you very much for your help!
+
+
+Acknowledgements
+~~~~~~~~~~~~~~~~
+- I'd like to thank Nimrah for passing on Technetium's TGAtoBLP2 code.
+ It dropped the almost 50 maps from 343k each to 130k each!
+- I stole the clean, simple minimap button code from Atlas, as well
+ as the nice version display idea.
+- The minimap mapping methods and constants are all from the original
+ MapNotes - awesome work, it was.
+
+
+Thanks for trying Recipe Radar! Enjoy!
diff --git a/RecipeRadar/RadarTab.lua b/RecipeRadar/RadarTab.lua
new file mode 100644
index 0000000..08430ec
--- /dev/null
+++ b/RecipeRadar/RadarTab.lua
@@ -0,0 +1,498 @@
+
+-- RadarTab.lua: handles clicking and drawing for the Radar tab
+-- $Id: RadarTab.lua 443 2006-09-01 04:41:40Z jnmiller $
+
+function RecipeRadar_RadarTab_Init()
+
+ RecipeRadar_Prof1DropDown:Show()
+ RecipeRadar_Prof2DropDown:Hide()
+
+ RecipeRadar_SetActiveTab(1)
+
+ RecipeRadar_RadarTab_Update()
+ RecipeRadarListScrollFrameScrollBar:SetValue(
+ RecipeRadarRadarTabFrame.ScrollValue)
+
+end
+
+function RecipeRadar_RadarTab_OnClick()
+
+ if (RecipeRadar_Options.ActiveTab == 1) then
+ return
+ end
+
+ PlaySound("igSpellBookClose")
+ RecipeRadar_RadarTab_Init()
+
+end
+
+function RecipeRadar_RadarTab_ExpandAll(expand)
+
+ local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
+ if (not region) then return end
+
+ for _, vendor in region.Vendors do
+ vendor.IsExpanded = expand
+ end
+
+ RecipeRadar_SelectFirstRecipe()
+ RecipeRadar_FrameUpdate()
+
+end
+
+function RecipeRadar_RadarTab_Update()
+
+ if (RecipeRadar_Options.ActiveTab ~= 1) then
+ return
+ end
+
+ local title = RRS("Recipe Radar")
+ if (RecipeRadar_Options.CurrentRegion) then
+ title = title .. " - " .. RecipeRadar_Options.CurrentRegion
+ local parens = string.find(title, " %(")
+ if (parens) then -- remove parenthesized zone title
+ title = string.sub(title, 1, parens - 1)
+ end
+ end
+ TitleBarText:SetText(title)
+
+ -- some globals for the Update() procedure
+ RecipeRadar_row = 0
+ RecipeRadar_last_button = ""
+ RecipeRadar_ContextMenuGlobal.RadarTabHasExpanded = false
+ RecipeRadar_ContextMenuGlobal.RadarTabHasCollapsed = false
+
+ RecipeRadarHighlightFrame:Hide()
+
+ local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
+ -- only populate the scroll frame if we have valid region data
+ if (region) then
+ RecipeRadar_SortVendors(region)
+ table.foreach(region.Vendors, RecipeRadar_RadarTab_AddVendor)
+ end
+
+ -- update the scroll position and the width of the highlight frame
+ FauxScrollFrame_Update(RecipeRadarListScrollFrame, RecipeRadar_row,
+ RECIPERADAR_VENDORS_DISPLAYED, RECIPERADAR_VENDOR_HEIGHT,
+ nil, nil, nil, RecipeRadarHighlightFrame, 361, 384)
+
+ -- update the widths of the vendor/recipe buttons after scroll update
+ for i = 1, RECIPERADAR_VENDORS_DISPLAYED do
+ local button = getglobal("RecipeRadarVendor" .. i)
+ if (i > RecipeRadar_row) then
+ button:Hide()
+ elseif (button.Recipe) then
+ if (RecipeRadarListScrollFrame:IsVisible()) then
+ button:SetWidth(361 - RECIPERADAR_VENDOR_OFFSET)
+ else
+ button:SetWidth(384 - RECIPERADAR_VENDOR_OFFSET)
+ end
+ else
+ if (RecipeRadarListScrollFrame:IsVisible()) then
+ button:SetWidth(361)
+ else
+ button:SetWidth(384)
+ end
+ end
+ end
+
+ -- update the current selection (or lack thereof)
+ if (not region or not RecipeRadarRadarTabFrame.SelectedRecipe) then
+ RecipeRadar_HideRecipeDetails()
+ elseif (RecipeRadarRadarTabFrame.SelectedVendor) then
+ RecipeRadar_SetSelection(RecipeRadarRadarTabFrame.SelectedVendor,
+ RecipeRadarRadarTabFrame.SelectedRecipe)
+ RecipeRadar_ShowRecipeDetails()
+ end
+
+end
+
+-- This function is called for each vendor during the main update. It
+-- adds the vendor and her recipes, if appropriate, to the main scroll frame.
+function RecipeRadar_RadarTab_AddVendor(key, vendor)
+
+ -- don't add the vendor if she or her recipes are filtered
+ if (vendor.IsFiltered or not RecipeRadar_VendorHasRecipes(vendor)) then
+ if (vendor.IsMapped) then
+ RecipeRadar_Maps_RemoveVendor(vendor)
+ end
+ return
+ end
+
+ RecipeRadar_row = RecipeRadar_row + 1
+
+ local offset = FauxScrollFrame_GetOffset(RecipeRadarListScrollFrame)
+ local index = RecipeRadar_row - offset
+
+ -- reset our radio button to red/off in case there are no listed vendors
+ RecipeRadarMapVendorIndicator:SetVertexColor(1.0, 0, 0)
+
+ -- only do the following if we're in the scroll frame's visible portion
+ if (index > 0 and index <= RECIPERADAR_VENDORS_DISPLAYED) then
+
+ local button = getglobal("RecipeRadarVendor" .. index)
+
+ -- decide the horizontal offset of this button
+ if (index == 1) then
+ button:SetPoint("TOPLEFT", "RecipeRadarFrame",
+ "TOPLEFT", 22, -96)
+ elseif (RecipeRadar_last_button == "recipe") then
+ button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index - 1,
+ "BOTTOMLEFT", -RECIPERADAR_VENDOR_OFFSET, 0)
+ elseif (RecipeRadar_last_button == "vendor") then
+ button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index - 1,
+ "BOTTOMLEFT", 0, 0)
+ end
+
+ -- this variable decides the next button's horizontal offset
+ RecipeRadar_last_button = "vendor"
+
+ -- basic drawing code
+ button:UnlockHighlight()
+ button:SetText(vendor.Name)
+ RecipeRadar_SetButtonColors(button, RecipeRadar_Teams[vendor.Team].Color)
+ button:SetID(index)
+ button:Show()
+
+ -- drawing code for the little subtext field
+ local subtext = getglobal("RecipeRadarVendor" .. index .. "SubText")
+ if (vendor.Notes and vendor.Notes ~= "") then
+ local note = RecipeRadar_FormatVendorNote(vendor.Notes, true)
+ VendorNameDummySubText:SetText(note .. " ")
+ subtext:SetText(note)
+ button.r = RecipeRadar_Teams[vendor.Team].Color.r
+ button.g = RecipeRadar_Teams[vendor.Team].Color.g
+ button.b = RecipeRadar_Teams[vendor.Team].Color.b
+ subtext:SetTextColor(
+ RecipeRadar_Teams[vendor.Team].Color.r,
+ RecipeRadar_Teams[vendor.Team].Color.g,
+ RecipeRadar_Teams[vendor.Team].Color.b)
+ subtext:SetPoint("LEFT", "RecipeRadarVendor" .. index .. "Text",
+ "RIGHT", 10, 0)
+ subtext:Show()
+ else
+ subtext:Hide()
+ end
+
+ -- show or hide the little mapped indicator check mark
+ local check = getglobal("RecipeRadarVendor" .. index .. "Check")
+ if (vendor.IsMapped) then
+ VendorNameDummyText:SetText(vendor.Name .. " ")
+ local check_offset = VendorNameDummyText:GetWidth() + 24
+ if (vendor.Notes and vendor.Notes ~= "") then
+ check_offset = check_offset + VendorNameDummySubText:GetWidth()
+ end
+ check:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index, "TOPLEFT",
+ check_offset, 0)
+ check:Show()
+ else
+ check:Hide()
+ end
+
+ -- unset to indicate this is a vendor header for the tooltip stuff
+ button.Recipe = nil
+
+ -- icon highlight is different for vendors than recipes
+ getglobal("RecipeRadarVendor" .. index .. "Highlight"):SetTexture(
+ "Interface\\Buttons\\UI-PlusButton-Hilight")
+
+ if (vendor.IsExpanded ~= false) then
+ RecipeRadar_ContextMenuGlobal.RadarTabHasExpanded = true
+ button:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up")
+ else
+ RecipeRadar_ContextMenuGlobal.RadarTabHasCollapsed = true
+ button:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up")
+ return
+ end
+
+ else
+
+ -- if the vendor is collapsed, we don't need to count her recipes
+ if (vendor.IsExpanded == false) then
+ RecipeRadar_ContextMenuGlobal.RadarTabHasCollapsed = true
+ return
+ else
+ RecipeRadar_ContextMenuGlobal.RadarTabHasExpanded = true
+ end
+
+ end
+
+ RecipeRadar_SortRecipes(vendor)
+
+ for _, recipe in vendor.Recipes do
+
+ -- skip filtered recipes, of course
+ if (not RecipeRadar_IsRecipeFiltered(recipe)) then
+
+ RecipeRadar_row = RecipeRadar_row + 1
+ index = RecipeRadar_row - offset;
+
+ -- only do this if we're in the scroll frame's visible portion
+ if (index > 0 and index <= RECIPERADAR_VENDORS_DISPLAYED) then
+
+ local button = getglobal("RecipeRadarVendor" .. index)
+
+ -- decide the horizontal offset of this button
+ if (index == 1) then
+ button:SetPoint("TOPLEFT", "RecipeRadarFrame",
+ "TOPLEFT", 22 + RECIPERADAR_VENDOR_OFFSET, -96)
+ elseif (RecipeRadar_last_button == "recipe") then
+ button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index - 1,
+ "BOTTOMLEFT", 0, 0)
+ elseif (RecipeRadar_last_button == "vendor") then
+ button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index - 1,
+ "BOTTOMLEFT", RECIPERADAR_VENDOR_OFFSET, 0)
+ end
+
+ -- this variable decides the next button's horizontal offset
+ RecipeRadar_last_button = "recipe"
+
+ -- generic list item drawing
+ RecipeRadar_DrawListItem(index, recipe)
+
+ -- radar tab-specific list item drawing
+ button:SetNormalTexture(RecipeRadar_Professions[recipe.Type].Icon)
+ getglobal("RecipeRadarVendor" .. index .. "Check"):Hide()
+ getglobal("RecipeRadarVendor" .. index .. "Highlight"):
+ SetTexture(RECIPERADAR_IMAGE_ROOT .. "Icons\\Highlight")
+
+ -- selected recipes look a little bit different
+ if (RecipeRadarRadarTabFrame.SelectedRecipe == recipe) then
+ RecipeRadarHighlightFrame:SetPoint("TOPLEFT",
+ "RecipeRadarVendor" .. index, "TOPLEFT", -22, 0)
+ RecipeRadarHighlightFrame:Show()
+ button:LockHighlight()
+ else
+ button:UnlockHighlight()
+ end
+
+ end
+
+ end
+
+ end
+
+end
+
+-- Handles a vendor/recipe button click in the main scroll frame. The
+-- supplied index is row + offset in the scroll frame. index may also
+-- be set to -1 to select the first visible recipe.
+function RecipeRadar_RadarTab_ServiceClickIndex(index, button)
+
+ local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
+ if (not region) then return end
+
+ if (not button) then button = "LeftButton" end
+
+ -- save this index so we can return to it on tab switch
+ RecipeRadarRadarTabFrame.SelectedIndex = index
+
+ -- sort the vendors so we're counting in the right order
+ RecipeRadar_SortVendors(region)
+ local row = 0
+
+ -- iterate through each vendor, counting up to index
+ for _, vendor in region.Vendors do
+
+ -- if this vendor is filtered, she does not count towards our index
+ if (not vendor.IsFiltered and RecipeRadar_VendorHasRecipes(vendor)) then
+
+ row = row + 1
+
+ if (row == index) then
+
+ if (button == "LeftButton") then
+
+ -- if the shift key is down, the user wants to (un)map this vendor
+ if (IsShiftKeyDown()) then
+ if (vendor.IsMapped) then
+ RecipeRadar_Maps_RemoveVendor(vendor)
+ else
+ RecipeRadar_Maps_AddVendor(vendor,
+ RecipeRadar_Options.CurrentRegion)
+ end
+
+ -- otherwise, we collapse or expand the vendor button
+ else
+ RecipeRadar_RadarTab_ToggleExpanded(vendor)
+ end
+
+ return
+
+ elseif (button == "RightButton") then
+
+ HideDropDownMenu(1)
+ RecipeRadar_ContextMenuGlobal.Vendor = vendor
+ RecipeRadar_RadarTab_ContextMenuOnLoad()
+ ToggleDropDownMenu(1, nil, RadarTabDropDown,
+ this:GetName(), GetCursorPosition(), 0)
+ return
+
+ end
+
+ end
+
+ if (vendor.IsExpanded ~= false) then
+
+ -- sort the recipes so we're counting in the right order
+ RecipeRadar_SortRecipes(vendor)
+ local vendor_index = row
+
+ -- iterate through each recipe, counting up to index
+ for _, recipe in vendor.Recipes do
+
+ -- don't count filtered recipes
+ if (not RecipeRadar_IsRecipeFiltered(recipe)) then
+
+ row = row + 1
+
+ -- if index is -1, this catches on the first iteration
+ if (row == index or index == -1) then
+
+ if (button == "LeftButton") then
+
+ -- if the shift key is down, we map this recipe's vendor
+ if (IsShiftKeyDown()) then
+ if (vendor.IsMapped) then
+ RecipeRadar_Maps_RemoveVendor(vendor)
+ else
+ RecipeRadar_Maps_AddVendor(vendor,
+ RecipeRadar_Options.CurrentRegion)
+ end
+ end
+
+ -- otherwise, select this recipe and show its details
+ RecipeRadarRadarTabFrame.SelectedVendor = vendor
+ RecipeRadarRadarTabFrame.SelectedRecipe = recipe
+ RecipeRadar_SetSelection(vendor, recipe)
+ RecipeRadar_ShowRecipeDetails()
+ return
+
+ elseif (button == "RightButton") then
+
+ HideDropDownMenu(1)
+ RecipeRadar_ContextMenuGlobal.Vendor = vendor
+ RecipeRadar_RadarTab_ContextMenuOnLoad()
+ ToggleDropDownMenu(1, nil, RadarTabDropDown,
+ this:GetName(), GetCursorPosition(), 0)
+ return
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ -- if the index was not found, select nothing
+ RecipeRadar_RadarTab_ClearSelection()
+ RecipeRadar_HideRecipeDetails()
+
+end
+
+function RecipeRadar_RadarTab_ToggleExpanded(vendor)
+
+ if (vendor.IsExpanded == false) then
+ vendor.IsExpanded = true
+ else
+ vendor.IsExpanded = false
+ end
+ RecipeRadar_RadarTab_ClearSelection()
+ RecipeRadar_FrameUpdate()
+
+end
+
+function RecipeRadar_RadarTab_ClearSelection()
+
+ RecipeRadarRadarTabFrame.SelectedVendor = nil
+ RecipeRadarRadarTabFrame.SelectedRecipe = nil
+
+end
+
+-- OnLoad event handler for the right-click context menu for map buttons.
+function RecipeRadar_RadarTab_ContextMenuOnLoad()
+
+ UIDropDownMenu_Initialize(RadarTabDropDown,
+ RecipeRadar_RadarTab_ContextMenuInit, "MENU")
+
+end
+
+-- Initialization routine for the right-click context menu for map buttons.
+function RecipeRadar_RadarTab_ContextMenuInit()
+
+ if (not RecipeRadar_ContextMenuGlobal.Vendor) then return end
+
+ -- putting in the vendor's name as the title of the popup
+ local item = { }
+ item.text = RecipeRadar_ContextMenuGlobal.Vendor.Name
+ item.isTitle = 1
+ item.notCheckable = 1
+ UIDropDownMenu_AddButton(item)
+
+ item = { }
+ if (RecipeRadar_ContextMenuGlobal.Vendor.IsMapped) then
+ item.text = RRS("Unmap Vendor")
+ item.value = "unmap"
+ else
+ item.text = RRS("Map Vendor")
+ item.value = "map"
+ end
+ item.notCheckable = 1
+ item.func = RecipeRadar_RadarTab_ContextMenuOnClick
+ UIDropDownMenu_AddButton(item)
+
+ item = { }
+ item.text = RRS("Expand All")
+ item.value = "expandall"
+ item.notCheckable = 1
+ item.func = RecipeRadar_RadarTab_ContextMenuOnClick
+ if (not RecipeRadar_ContextMenuGlobal.RadarTabHasCollapsed) then
+ item.disabled = 1
+ end
+ UIDropDownMenu_AddButton(item)
+
+ item = { }
+ item.text = RRS("Collapse All")
+ item.value = "collapseall"
+ item.notCheckable = 1
+ item.func = RecipeRadar_RadarTab_ContextMenuOnClick
+ if (not RecipeRadar_ContextMenuGlobal.RadarTabHasExpanded) then
+ item.disabled = 1
+ end
+ UIDropDownMenu_AddButton(item)
+
+ item = { }
+ item.text = CANCEL
+ item.notCheckable = 1
+ item.func = RecipeRadar_RadarTab_ContextMenuOnClick
+ UIDropDownMenu_AddButton(item)
+
+end
+
+-- OnClick event handler for the right-click context menu for map buttons.
+function RecipeRadar_RadarTab_ContextMenuOnClick()
+
+ if (this.value == "unmap") then
+ RecipeRadar_Maps_RemoveVendor(RecipeRadar_ContextMenuGlobal.Vendor)
+ RecipeRadar_FrameUpdate()
+
+ elseif (this.value == "map") then
+ RecipeRadar_Maps_AddVendor(RecipeRadar_ContextMenuGlobal.Vendor,
+ RecipeRadar_Options.CurrentRegion)
+ RecipeRadar_FrameUpdate()
+
+ elseif (this.value == "expandall") then
+ RecipeRadar_RadarTab_ExpandAll(true)
+
+ elseif (this.value == "collapseall") then
+ RecipeRadar_RadarTab_ExpandAll(false)
+ end
+
+end
diff --git a/RecipeRadar/RecipeData.lua b/RecipeRadar/RecipeData.lua
new file mode 100644
index 0000000..c93b686
--- /dev/null
+++ b/RecipeRadar/RecipeData.lua
@@ -0,0 +1,3328 @@
+
+-- RecipeData.lua: all recipes organized by profession
+-- Auto generated on 9/18/2006 12:35:41 PM
+
+RecipeRadar_RecipeData = {
+
+
+[RRS("Alchemy")] = {
+ Recipes = {
+ {
+ ID = 13477,
+ Type = RRS("Alchemy"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Ulthir"), Team = "Alliance" },
+ { Region = RRS("Undercity"), Vendor = RRS("Algernon"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 13478,
+ Type = RRS("Alchemy"),
+ Skill = 265,
+ Cost = 13000,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Soolie Berryfizz"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kor'geld"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5640,
+ Type = RRS("Alchemy"),
+ Skill = 60,
+ Cost = 100,
+ Locations = {
+ { Region = RRS("Westfall"), Vendor = RRS("Defias Profiteer"), Team = "Alliance" },
+ { Region = RRS("Loch Modan"), Vendor = RRS("Xandar Goodbeard"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Hagrus"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Ranik"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 5642,
+ Type = RRS("Alchemy"),
+ Skill = 150,
+ Cost = 1800,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Soolie Berryfizz"), Team = "Alliance" },
+ { Region = RRS("Darnassus"), Vendor = RRS("Ulthir"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kor'geld"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 5643,
+ Type = RRS("Alchemy"),
+ Skill = 175,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Ulthir"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Hagrus"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6053,
+ Type = RRS("Alchemy"),
+ Skill = 100,
+ Cost = 800,
+ Locations = {
+ { Region = RRS("Loch Modan"), Vendor = RRS("Xandar Goodbeard"), Team = "Alliance" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Hula'mahi"), Team = "Horde" },
+ { Region = RRS("Duskwood"), Vendor = RRS("Kzixx"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6055,
+ Type = RRS("Alchemy"),
+ Skill = 165,
+ Cost = 1500,
+ Locations = {
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Nandar Branson"), Team = "Alliance" },
+ { Region = RRS("Stonetalon Mountains"), Vendor = RRS("Jeeda"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6056,
+ Type = RRS("Alchemy"),
+ Skill = 190,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Drovnar Strongbrew"), Team = "Alliance" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Glyx Brewright"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6057,
+ Type = RRS("Alchemy"),
+ Skill = 190,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Logannas"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Bronk"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Glyx Brewright"), Team = "Neutral" },
+ { Region = RRS("Tanaris"), Vendor = RRS("Alchemist Pestlezugg"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 9300,
+ Type = RRS("Alchemy"),
+ Skill = 250,
+ Cost = 10000,
+ Locations = {
+ { Region = RRS("Blasted Lands"), Vendor = RRS("Nina Lightbrew"), Team = "Alliance" },
+ { Region = RRS("Swamp of Sorrows"), Vendor = RRS("Rartar"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 9301,
+ Type = RRS("Alchemy"),
+ Skill = 250,
+ Cost = 10000,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Maria Lumere"), Team = "Alliance" },
+ { Region = RRS("Undercity"), Vendor = RRS("Algernon"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 9302,
+ Type = RRS("Alchemy"),
+ Skill = 245,
+ Cost = 9000,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Logannas"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Bronk"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6068,
+ Type = RRS("Alchemy"),
+ Skill = 165,
+ Cost = 1500,
+ Locations = {
+ { Region = RRS("Thousand Needles"), Vendor = RRS("Montarr"), Team = "Horde" },
+ { Region = RRS("Duskwood"), Vendor = RRS("Bliztik"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6054,
+ Type = RRS("Alchemy"),
+ Skill = 135,
+ Cost = 900,
+ Locations = {
+ { Region = RRS("Ashenvale"), Vendor = RRS("Harklan Moongrove"), Team = "Alliance" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Christoph Jeffcoat"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 14634,
+ Type = RRS("Alchemy"),
+ Skill = 200,
+ Cost = 2500,
+ Locations = {
+ { Region = RRS("Alterac Mountains"), Vendor = RRS("Bro'kin"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13480,
+ Type = RRS("Alchemy"),
+ Skill = 275,
+ Cost = 15000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Evie Whirlbrew"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 9303,
+ Type = RRS("Alchemy"),
+ Skill = 225,
+ Cost = 8000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Alchemist Pestlezugg"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12958,
+ Type = RRS("Alchemy"),
+ Skill = 275,
+ Cost = 50000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Alchemist Pestlezugg"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 9304,
+ Type = RRS("Alchemy"),
+ Skill = 225,
+ Cost = 8000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Alchemist Pestlezugg"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 9305,
+ Type = RRS("Alchemy"),
+ Skill = 225,
+ Cost = 8000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Alchemist Pestlezugg"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13501,
+ Type = RRS("Alchemy"),
+ Skill = 295,
+ Cost = 30000,
+ Locations = {
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Magnus Frostwake"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13483,
+ Type = RRS("Alchemy"),
+ Skill = 275,
+ Cost = 15000,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Plugger Spazzring"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13482,
+ Type = RRS("Alchemy"),
+ Skill = 275,
+ Cost = 15000,
+ Faction = RRS("Argent Dawn"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13484,
+ Type = RRS("Alchemy"),
+ Skill = 275,
+ Cost = 15000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13485,
+ Type = RRS("Alchemy"),
+ Skill = 275,
+ Cost = 15000,
+ Locations = {
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Magnus Frostwake"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20013,
+ Type = RRS("Alchemy"),
+ Skill = 285,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 8,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20011,
+ Type = RRS("Alchemy"),
+ Skill = 275,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20014,
+ Type = RRS("Alchemy"),
+ Skill = 290,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20012,
+ Type = RRS("Alchemy"),
+ Skill = 275,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20761,
+ Type = RRS("Alchemy"),
+ Skill = 300,
+ Cost = 120000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+[RRS("Blacksmithing")] = {
+ Recipes = {
+ {
+ ID = 12162,
+ Type = RRS("Blacksmithing"),
+ Skill = 160,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kaita Deepforge"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Sumi"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Jutak"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12164,
+ Type = RRS("Blacksmithing"),
+ Skill = 185,
+ Cost = 4400,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Vharr"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Jaquilina Dramet"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7995,
+ Type = RRS("Blacksmithing"),
+ Skill = 215,
+ Cost = 6000,
+ Locations = {
+ { Region = RRS("The Hinterlands"), Vendor = RRS("Harggan"), Team = "Alliance" },
+ { Region = RRS("Swamp of Sorrows"), Vendor = RRS("Gharash"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 10858,
+ Type = RRS("Blacksmithing"),
+ Skill = 155,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Jannos Ironwill"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Muuran"), Team = "Horde" },
+ { Region = RRS("Badlands"), Vendor = RRS("Jazzrik"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6047,
+ Type = RRS("Blacksmithing"),
+ Skill = 190,
+ Cost = 4400,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Krinkle Goodsteel"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12163,
+ Type = RRS("Blacksmithing"),
+ Skill = 180,
+ Cost = 4400,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Zarena Cromwind"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 8030,
+ Type = RRS("Blacksmithing"),
+ Skill = 255,
+ Cost = 10000,
+ Locations = {
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Magnus Frostwake"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12823,
+ Type = RRS("Blacksmithing"),
+ Skill = 280,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Magnus Frostwake"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12819,
+ Type = RRS("Blacksmithing"),
+ Skill = 275,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Magnus Frostwake"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12703,
+ Type = RRS("Blacksmithing"),
+ Skill = 295,
+ Cost = 40000,
+ Locations = {
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Magnus Frostwake"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19208,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 70000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Specialty = RRS("Weaponsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19209,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 70000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 8,
+ Specialty = RRS("Weaponsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19211,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 120000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 8,
+ Specialty = RRS("Master Swordsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19210,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 120000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 8,
+ Specialty = RRS("Master Hammersmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19212,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 120000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 8,
+ Specialty = RRS("Master Axesmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17051,
+ Type = RRS("Blacksmithing"),
+ Skill = 295,
+ Cost = 70000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 5,
+ Specialty = RRS("Armorsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17060,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 220000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 8,
+ Specialty = RRS("Master Axesmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19207,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 80000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Specialty = RRS("Armorsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19206,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 60000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Specialty = RRS("Armorsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17052,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 180000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 8,
+ Specialty = RRS("Armorsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17059,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 220000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 6,
+ Specialty = RRS("Master Swordsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20040,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 80000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 8,
+ Specialty = RRS("Armorsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17049,
+ Type = RRS("Blacksmithing"),
+ Skill = 295,
+ Cost = 90000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 6,
+ Specialty = RRS("Armorsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17053,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 200000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Specialty = RRS("Armorsmith"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19202,
+ Type = RRS("Blacksmithing"),
+ Skill = 290,
+ Cost = 22000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19204,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19203,
+ Type = RRS("Blacksmithing"),
+ Skill = 290,
+ Cost = 22000,
+ Faction = RRS("Argent Dawn"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19205,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Argent Dawn"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19781,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19780,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19779,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19778,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19777,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19776,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22209,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Vargus"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22214,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Vargus"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22766,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Vargus"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22767,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Vargus"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22768,
+ Type = RRS("Blacksmithing"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Vargus"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+[RRS("Enchanting")] = {
+ Recipes = {
+ {
+ ID = 6349,
+ Type = RRS("Enchanting"),
+ Skill = 100,
+ Cost = 500,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Tilli Thistlefuzz"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kithas"), Team = "Horde" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Leo Sarn"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Nata Dawnstrider"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 11223,
+ Type = RRS("Enchanting"),
+ Skill = 235,
+ Cost = 5800,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Mythrin'dir"), Team = "Alliance" },
+ { Region = RRS("Swamp of Sorrows"), Vendor = RRS("Banalash"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 11163,
+ Type = RRS("Enchanting"),
+ Skill = 170,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Micha Yance"), Team = "Alliance" },
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Keena"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 11101,
+ Type = RRS("Enchanting"),
+ Skill = 140,
+ Cost = 2500,
+ Locations = {
+ { Region = RRS("Ashenvale"), Vendor = RRS("Dalria"), Team = "Alliance" },
+ { Region = RRS("Stonetalon Mountains"), Vendor = RRS("Kulwia"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6342,
+ Type = RRS("Enchanting"),
+ Skill = 20,
+ Cost = 300,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Jessara Cordell"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tilli Thistlefuzz"), Team = "Alliance" },
+ { Region = RRS("Darnassus"), Vendor = RRS("Vaean"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kithas"), Team = "Horde" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Leo Sarn"), Team = "Horde" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Lilly"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Nata Dawnstrider"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Thaddeus Webb"), Team = "Horde" },
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 11039,
+ Type = RRS("Enchanting"),
+ Skill = 110,
+ Cost = 800,
+ Locations = {
+ { Region = RRS("Ashenvale"), Vendor = RRS("Dalria"), Team = "Alliance" },
+ { Region = RRS("Stonetalon Mountains"), Vendor = RRS("Kulwia"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 16217,
+ Type = RRS("Enchanting"),
+ Skill = 265,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Mythrin'dir"), Team = "Alliance" },
+ { Region = RRS("Undercity"), Vendor = RRS("Daniel Bartlett"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6377,
+ Type = RRS("Enchanting"),
+ Skill = 125,
+ Cost = 1000,
+ Locations = {
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Nata Dawnstrider"), Team = "Horde" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Zixil"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6346,
+ Type = RRS("Enchanting"),
+ Skill = 80,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kithas"), Team = "Horde" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Lilly"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 16221,
+ Type = RRS("Enchanting"),
+ Skill = 275,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Qia"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 16224,
+ Type = RRS("Enchanting"),
+ Skill = 285,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Moonglade"), Vendor = RRS("Lorelae Wintersong"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 16243,
+ Type = RRS("Enchanting"),
+ Skill = 290,
+ Cost = 22000,
+ Locations = {
+ { Region = RRS("Moonglade"), Vendor = RRS("Lorelae Wintersong"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20758,
+ Type = RRS("Enchanting"),
+ Skill = 45,
+ Cost = 125,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ { Region = RRS("Darnassus"), Vendor = RRS("Vaean"), Team = "Alliance" },
+ { Region = RRS("Stormwind City"), Vendor = RRS("Jessara Cordell"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Leo Sarn"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Nata Dawnstrider"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Thaddeus Webb"), Team = "Horde" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kithas"), Team = "Horde" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tilli Thistlefuzz"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Lilly"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 20752,
+ Type = RRS("Enchanting"),
+ Skill = 150,
+ Cost = 750,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Vaean"), Team = "Alliance" },
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ { Region = RRS("Stormwind City"), Vendor = RRS("Jessara Cordell"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Leo Sarn"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Nata Dawnstrider"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Thaddeus Webb"), Team = "Horde" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tilli Thistlefuzz"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kithas"), Team = "Horde" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Lilly"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 20753,
+ Type = RRS("Enchanting"),
+ Skill = 200,
+ Cost = 1000,
+ Locations = {
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Nata Dawnstrider"), Team = "Horde" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Lilly"), Team = "Horde" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tilli Thistlefuzz"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kithas"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Thaddeus Webb"), Team = "Horde" },
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ { Region = RRS("Darnassus"), Vendor = RRS("Vaean"), Team = "Alliance" },
+ { Region = RRS("Stormwind City"), Vendor = RRS("Jessara Cordell"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Leo Sarn"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 20754,
+ Type = RRS("Enchanting"),
+ Skill = 250,
+ Cost = 2500,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20755,
+ Type = RRS("Enchanting"),
+ Skill = 275,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19449,
+ Type = RRS("Enchanting"),
+ Skill = 300,
+ Cost = 100000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19448,
+ Type = RRS("Enchanting"),
+ Skill = 300,
+ Cost = 80000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19444,
+ Type = RRS("Enchanting"),
+ Skill = 290,
+ Cost = 30000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19445,
+ Type = RRS("Enchanting"),
+ Skill = 290,
+ Cost = 30000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19447,
+ Type = RRS("Enchanting"),
+ Skill = 300,
+ Cost = 60000,
+ Faction = RRS("Argent Dawn"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19446,
+ Type = RRS("Enchanting"),
+ Skill = 290,
+ Cost = 30000,
+ Faction = RRS("Argent Dawn"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20756,
+ Type = RRS("Enchanting"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20732,
+ Type = RRS("Enchanting"),
+ Skill = 300,
+ Cost = 100000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20733,
+ Type = RRS("Enchanting"),
+ Skill = 300,
+ Cost = 100000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20757,
+ Type = RRS("Enchanting"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22392,
+ Type = RRS("Enchanting"),
+ Skill = 290,
+ Cost = 25000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+[RRS("Engineering")] = {
+ Recipes = {
+ {
+ ID = 18649,
+ Type = RRS("Engineering"),
+ Skill = 150,
+ Cost = 1800,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Darian Singh"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Gearcutter Cogspinner"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 10607,
+ Type = RRS("Engineering"),
+ Skill = 230,
+ Cost = 3600,
+ Locations = {
+ { Region = RRS("Azshara"), Vendor = RRS("Jubie Gadgetspring"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7560,
+ Type = RRS("Engineering"),
+ Skill = 125,
+ Cost = 1200,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Gearcutter Cogspinner"), Team = "Alliance" },
+ { Region = RRS("Thousand Needles"), Vendor = RRS("Jinky Twizzlefixxit"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13309,
+ Type = RRS("Engineering"),
+ Skill = 120,
+ Cost = 1000,
+ Locations = {
+ { Region = RRS("Wetlands"), Vendor = RRS("Fradd Swiftgear"), Team = "Alliance" },
+ { Region = RRS("Thousand Needles"), Vendor = RRS("Jinky Twizzlefixxit"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14639,
+ Type = RRS("Engineering"),
+ Skill = 140,
+ Cost = 1500,
+ Locations = {
+ { Region = RRS("Wetlands"), Vendor = RRS("Fradd Swiftgear"), Team = "Alliance" },
+ { Region = RRS("Gnomeregan"), Vendor = RRS("Namdo Bizzfizzle"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 10609,
+ Type = RRS("Engineering"),
+ Skill = 250,
+ Cost = 4000,
+ Locations = {
+ { Region = RRS("The Hinterlands"), Vendor = RRS("Ruppo Zipcoil"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 16041,
+ Type = RRS("Engineering"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Gearcutter Cogspinner"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Sovik"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 16042,
+ Type = RRS("Engineering"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Gearcutter Cogspinner"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Sovik"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 18647,
+ Type = RRS("Engineering"),
+ Skill = 150,
+ Cost = 1800,
+ Locations = {
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Sovik"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 13310,
+ Type = RRS("Engineering"),
+ Skill = 180,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Mazk Snipeshot"), Team = "Neutral" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 10602,
+ Type = RRS("Engineering"),
+ Skill = 210,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Knaz Blunderflame"), Team = "Neutral" },
+ { Region = RRS("Burning Steppes"), Vendor = RRS("Yuka Screwspigot"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 16050,
+ Type = RRS("Engineering"),
+ Skill = 285,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Xizzer Fizzbolt"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7742,
+ Type = RRS("Engineering"),
+ Skill = 200,
+ Cost = 2400,
+ Locations = {
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Zan Shivsproket"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7561,
+ Type = RRS("Engineering"),
+ Skill = 165,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Duskwood"), Vendor = RRS("Kzixx"), Team = "Neutral" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ { Region = RRS("Stonetalon Mountains"), Vendor = RRS("Veenix"), Team = "Neutral" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Zixil"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 18648,
+ Type = RRS("Engineering"),
+ Skill = 150,
+ Cost = 1800,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Crazk Sparks"), Team = "Neutral" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Gagsprocket"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 18652,
+ Type = RRS("Engineering"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Xizzer Fizzbolt"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13308,
+ Type = RRS("Engineering"),
+ Skill = 155,
+ Cost = 1800,
+ Locations = {
+ { Region = RRS("Alterac Mountains"), Vendor = RRS("Rizz Loosebolt"), Team = "Neutral" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 16046,
+ Type = RRS("Engineering"),
+ Skill = 275,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Xizzer Fizzbolt"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13311,
+ Type = RRS("Engineering"),
+ Skill = 200,
+ Cost = 10000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Gnaz Blunderflame"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 18656,
+ Type = RRS("Engineering"),
+ Skill = 275,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Xizzer Fizzbolt"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 16047,
+ Type = RRS("Engineering"),
+ Skill = 275,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Xizzer Fizzbolt"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 18651,
+ Type = RRS("Engineering"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Mazk Snipeshot"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20001,
+ Type = RRS("Engineering"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20000,
+ Type = RRS("Engineering"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19027,
+ Type = RRS("Engineering"),
+ Skill = 250,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Zorbin Fandazzle"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 18650,
+ Type = RRS("Engineering"),
+ Skill = 200,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Blizrik Buckshot"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+[RRS("Leatherworking")] = {
+ Recipes = {
+ {
+ ID = 18949,
+ Type = RRS("Leatherworking"),
+ Skill = 155,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Saenorion"), Team = "Alliance" },
+ { Region = RRS("Undercity"), Vendor = RRS("Joseph Moore"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5973,
+ Type = RRS("Leatherworking"),
+ Skill = 170,
+ Cost = 650,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Hammon Karwn"), Team = "Alliance" },
+ { Region = RRS("Ashenvale"), Vendor = RRS("Lardan"), Team = "Alliance" },
+ { Region = RRS("Thousand Needles"), Vendor = RRS("Jandia"), Team = "Horde" },
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Keena"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7289,
+ Type = RRS("Leatherworking"),
+ Skill = 100,
+ Cost = 650,
+ Locations = {
+ { Region = RRS("Redridge Mountains"), Vendor = RRS("Clyde Ranthal"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 20576,
+ Type = RRS("Leatherworking"),
+ Skill = 100,
+ Cost = 350,
+ Locations = {
+ { Region = RRS("Redridge Mountains"), Vendor = RRS("Amy Davenport"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 15751,
+ Type = RRS("Leatherworking"),
+ Skill = 285,
+ Cost = 20000,
+ Specialty = RRS("Dragonscale Leatherworking"),
+ Locations = {
+ { Region = RRS("Azshara"), Vendor = RRS("Blimo Gadgetspring"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15729,
+ Type = RRS("Leatherworking"),
+ Skill = 265,
+ Cost = 12000,
+ Specialty = RRS("Tribal Leatherworking"),
+ Locations = {
+ { Region = RRS("Azshara"), Vendor = RRS("Blimo Gadgetspring"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7613,
+ Type = RRS("Leatherworking"),
+ Skill = 155,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Wetlands"), Vendor = RRS("Wenna Silkbeard"), Team = "Alliance" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("George Candarte"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7451,
+ Type = RRS("Leatherworking"),
+ Skill = 190,
+ Cost = 2800,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Pratt McGrubben"), Team = "Alliance" },
+ { Region = RRS("Darnassus"), Vendor = RRS("Saenorion"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Jangdor Swiftstrider"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Joseph Moore"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 18731,
+ Type = RRS("Leatherworking"),
+ Skill = 150,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Bombus Finespindle"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Tamar"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 7361,
+ Type = RRS("Leatherworking"),
+ Skill = 135,
+ Cost = 1800,
+ Locations = {
+ { Region = RRS("Ashenvale"), Vendor = RRS("Harlown Darkweave"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 15735,
+ Type = RRS("Leatherworking"),
+ Skill = 270,
+ Cost = 14000,
+ Specialty = RRS("Tribal Leatherworking"),
+ Locations = {
+ { Region = RRS("The Hinterlands"), Vendor = RRS("Gigget Zipcoil"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15734,
+ Type = RRS("Leatherworking"),
+ Skill = 270,
+ Cost = 14000,
+ Specialty = RRS("Elemental Leatherworking"),
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Pratt McGrubben"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Jangdor Swiftstrider"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5786,
+ Type = RRS("Leatherworking"),
+ Skill = 90,
+ Cost = 550,
+ Locations = {
+ { Region = RRS("Westfall"), Vendor = RRS("Gina MacGregor"), Team = "Alliance" },
+ { Region = RRS("Darkshore"), Vendor = RRS("Mavralyn"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Andrew Hilbert"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5787,
+ Type = RRS("Leatherworking"),
+ Skill = 95,
+ Cost = 600,
+ Locations = {
+ { Region = RRS("Westfall"), Vendor = RRS("Gina MacGregor"), Team = "Alliance" },
+ { Region = RRS("Darkshore"), Vendor = RRS("Mavralyn"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Andrew Hilbert"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5789,
+ Type = RRS("Leatherworking"),
+ Skill = 190,
+ Cost = 2800,
+ Locations = {
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Helenia Olden"), Team = "Alliance" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Blixrez Goodstitch"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 8409,
+ Type = RRS("Leatherworking"),
+ Skill = 210,
+ Cost = 4000,
+ Locations = {
+ { Region = RRS("The Hinterlands"), Vendor = RRS("Nioma"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Jangdor Swiftstrider"), Team = "Horde" },
+ { Region = RRS("Feralas"), Vendor = RRS("Worb Strongstitch"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 13288,
+ Type = RRS("Leatherworking"),
+ Skill = 165,
+ Cost = 2500,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Androd Fadran"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 7290,
+ Type = RRS("Leatherworking"),
+ Skill = 120,
+ Cost = 1600,
+ Locations = {
+ { Region = RRS("Wetlands"), Vendor = RRS("Wenna Silkbeard"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 15741,
+ Type = RRS("Leatherworking"),
+ Skill = 275,
+ Cost = 16000,
+ Specialty = RRS("Elemental Leatherworking"),
+ Locations = {
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Leonard Porter"), Team = "Alliance" },
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Werg Thickblade"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5788,
+ Type = RRS("Leatherworking"),
+ Skill = 170,
+ Cost = 650,
+ Locations = {
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Micha Yance"), Team = "Alliance" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Christoph Jeffcoat"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Blixrez Goodstitch"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 8385,
+ Type = RRS("Leatherworking"),
+ Skill = 205,
+ Cost = 3500,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Pratt McGrubben"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Jangdor Swiftstrider"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 15725,
+ Type = RRS("Leatherworking"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Leonard Porter"), Team = "Alliance" },
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Werg Thickblade"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 13287,
+ Type = RRS("Leatherworking"),
+ Skill = 165,
+ Cost = 2500,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Tunkk"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6474,
+ Type = RRS("Leatherworking"),
+ Skill = 90,
+ Cost = 550,
+ Locations = {
+ { Region = RRS("Wailing Caverns"), Vendor = RRS("Kalldan Felmoon"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6475,
+ Type = RRS("Leatherworking"),
+ Skill = 105,
+ Cost = 1500,
+ Locations = {
+ { Region = RRS("Wailing Caverns"), Vendor = RRS("Kalldan Felmoon"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15758,
+ Type = RRS("Leatherworking"),
+ Skill = 290,
+ Cost = 22000,
+ Specialty = RRS("Tribal Leatherworking"),
+ Locations = {
+ { Region = RRS("Un'Goro Crater"), Vendor = RRS("Nergal"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7362,
+ Type = RRS("Leatherworking"),
+ Skill = 135,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Zixil"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15740,
+ Type = RRS("Leatherworking"),
+ Skill = 275,
+ Cost = 16000,
+ Specialty = RRS("Tribal Leatherworking"),
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Qia"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14635,
+ Type = RRS("Leatherworking"),
+ Skill = 185,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rikqiz"), Team = "Neutral" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15726,
+ Type = RRS("Leatherworking"),
+ Skill = 260,
+ Cost = 12000,
+ Specialty = RRS("Dragonscale Leatherworking"),
+ Locations = {
+ { Region = RRS("Swamp of Sorrows"), Vendor = RRS("Masat T'andr"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15724,
+ Type = RRS("Leatherworking"),
+ Skill = 255,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Zannok Hidepiercer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15762,
+ Type = RRS("Leatherworking"),
+ Skill = 295,
+ Cost = 25000,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Zannok Hidepiercer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15756,
+ Type = RRS("Leatherworking"),
+ Skill = 290,
+ Cost = 22000,
+ Locations = {
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Jase Farlane"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 18239,
+ Type = RRS("Leatherworking"),
+ Skill = 200,
+ Cost = 3500,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rikqiz"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 15759,
+ Type = RRS("Leatherworking"),
+ Skill = 290,
+ Cost = 22000,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Plugger Spazzring"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17025,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 160000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 6,
+ Specialty = RRS("Dragonscale Leatherworking"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19331,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 90000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Specialty = RRS("Dragonscale Leatherworking"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19332,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 90000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17022,
+ Type = RRS("Leatherworking"),
+ Skill = 295,
+ Cost = 150000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 5,
+ Specialty = RRS("Tribal Leatherworking"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19330,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 60000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19333,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 90000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Specialty = RRS("Elemental Leatherworking"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17023,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 160000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 5,
+ Specialty = RRS("Elemental Leatherworking"),
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20253,
+ Type = RRS("Leatherworking"),
+ Skill = 275,
+ Cost = 16000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 5,
+ Specialty = RRS("Tribal Leatherworking"),
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20254,
+ Type = RRS("Leatherworking"),
+ Skill = 285,
+ Cost = 20000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19327,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19326,
+ Type = RRS("Leatherworking"),
+ Skill = 290,
+ Cost = 22000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19328,
+ Type = RRS("Leatherworking"),
+ Skill = 290,
+ Cost = 22000,
+ Faction = RRS("Argent Dawn"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19329,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Argent Dawn"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19771,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19773,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19770,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19772,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19769,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20382,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 60000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 8,
+ Specialty = RRS("Dragonscale Leatherworking"),
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20506,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20507,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20508,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20509,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20510,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20511,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22769,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22770,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22771,
+ Type = RRS("Leatherworking"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Aendel Windspear"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+[RRS("Tailoring")] = {
+ Recipes = {
+ {
+ ID = 7089,
+ Type = RRS("Tailoring"),
+ Skill = 175,
+ Cost = 1500,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Brienna Starglow"), Team = "Alliance" },
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Jun'ha"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 7114,
+ Type = RRS("Tailoring"),
+ Skill = 145,
+ Cost = 1000,
+ Locations = {
+ { Region = RRS("Wetlands"), Vendor = RRS("Wenna Silkbeard"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Kireena"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6272,
+ Type = RRS("Tailoring"),
+ Skill = 70,
+ Cost = 300,
+ Locations = {
+ { Region = RRS("Elwynn Forest"), Vendor = RRS("Drake Lindgren"), Team = "Alliance" },
+ { Region = RRS("Darnassus"), Vendor = RRS("Elynna"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Andrew Hilbert"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Wrahk"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Ranik"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6270,
+ Type = RRS("Tailoring"),
+ Skill = 55,
+ Cost = 200,
+ Locations = {
+ { Region = RRS("Elwynn Forest"), Vendor = RRS("Tharynn Bouden"), Team = "Alliance" },
+ { Region = RRS("Darkshore"), Vendor = RRS("Valdaron"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Borya"), Team = "Horde" },
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Constance Brisboise"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Wrahk"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6274,
+ Type = RRS("Tailoring"),
+ Skill = 100,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Westfall"), Vendor = RRS("Gina MacGregor"), Team = "Alliance" },
+ { Region = RRS("Stormwind City"), Vendor = RRS("Alexandra Bolero"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Borya"), Team = "Horde" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Mallen Swain"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Yonada"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 14627,
+ Type = RRS("Tailoring"),
+ Skill = 135,
+ Cost = 800,
+ Locations = {
+ { Region = RRS("Duskwood"), Vendor = RRS("Danielle Zipstitch"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 6401,
+ Type = RRS("Tailoring"),
+ Skill = 155,
+ Cost = 1100,
+ Locations = {
+ { Region = RRS("Duskwood"), Vendor = RRS("Sheri Zipstitch"), Team = "Alliance" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Mallen Swain"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6275,
+ Type = RRS("Tailoring"),
+ Skill = 115,
+ Cost = 800,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Elynna"), Team = "Alliance" },
+ { Region = RRS("Wetlands"), Vendor = RRS("Jennabink Powerseam"), Team = "Alliance" },
+ { Region = RRS("Loch Modan"), Vendor = RRS("Rann Flamespinner"), Team = "Alliance" },
+ { Region = RRS("Duskwood"), Vendor = RRS("Sheri Zipstitch"), Team = "Alliance" },
+ { Region = RRS("Undercity"), Vendor = RRS("Millie Gregorian"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Ranik"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 4355,
+ Type = RRS("Tailoring"),
+ Skill = 200,
+ Cost = 1500,
+ Locations = {
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Micha Yance"), Team = "Alliance" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Ghok'kah"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 10314,
+ Type = RRS("Tailoring"),
+ Skill = 230,
+ Cost = 4000,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Outfitter Eric"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Borya"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 10311,
+ Type = RRS("Tailoring"),
+ Skill = 220,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Elynna"), Team = "Alliance" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Mahu"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 10317,
+ Type = RRS("Tailoring"),
+ Skill = 235,
+ Cost = 4000,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Outfitter Eric"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Borya"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5771,
+ Type = RRS("Tailoring"),
+ Skill = 70,
+ Cost = 200,
+ Locations = {
+ { Region = RRS("Westfall"), Vendor = RRS("Gina MacGregor"), Team = "Alliance" },
+ { Region = RRS("Darkshore"), Vendor = RRS("Valdaron"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Andrew Hilbert"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Mahu"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5772,
+ Type = RRS("Tailoring"),
+ Skill = 115,
+ Cost = 500,
+ Locations = {
+ { Region = RRS("Redridge Mountains"), Vendor = RRS("Amy Davenport"), Team = "Alliance" },
+ { Region = RRS("Wetlands"), Vendor = RRS("Jennabink Powerseam"), Team = "Alliance" },
+ { Region = RRS("Loch Modan"), Vendor = RRS("Rann Flamespinner"), Team = "Alliance" },
+ { Region = RRS("Darkshore"), Vendor = RRS("Valdaron"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Borya"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Mahu"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Millie Gregorian"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Wrahk"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Yonada"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Kiknikle"), Team = "Neutral" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Zixil"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 10326,
+ Type = RRS("Tailoring"),
+ Skill = 250,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Outfitter Eric"), Team = "Alliance" },
+ { Region = RRS("Undercity"), Vendor = RRS("Millie Gregorian"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 10323,
+ Type = RRS("Tailoring"),
+ Skill = 245,
+ Cost = 4500,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Outfitter Eric"), Team = "Alliance" },
+ { Region = RRS("Undercity"), Vendor = RRS("Millie Gregorian"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 10321,
+ Type = RRS("Tailoring"),
+ Skill = 240,
+ Cost = 4500,
+ Locations = {
+ { Region = RRS("Ironforge"), Vendor = RRS("Outfitter Eric"), Team = "Alliance" },
+ { Region = RRS("Undercity"), Vendor = RRS("Millie Gregorian"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 10325,
+ Type = RRS("Tailoring"),
+ Skill = 250,
+ Cost = 10000,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Alexandra Bolero"), Team = "Alliance" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Mahu"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 10318,
+ Type = RRS("Tailoring"),
+ Skill = 240,
+ Cost = 7000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Cowardly Crosby"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 10728,
+ Type = RRS("Tailoring"),
+ Skill = 200,
+ Cost = 1500,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Narkk"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7087,
+ Type = RRS("Tailoring"),
+ Skill = 180,
+ Cost = 1200,
+ Locations = {
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Xizk Goodstitch"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 7088,
+ Type = RRS("Tailoring"),
+ Skill = 205,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Vizzklick"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14630,
+ Type = RRS("Tailoring"),
+ Skill = 165,
+ Cost = 1000,
+ Locations = {
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Xizk Goodstitch"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14483,
+ Type = RRS("Tailoring"),
+ Skill = 275,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Moonglade"), Vendor = RRS("Lorelae Wintersong"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14526,
+ Type = RRS("Tailoring"),
+ Skill = 250,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Qia"), Team = "Neutral" },
+ { Region = RRS("Winterspring"), Vendor = RRS("Evie Whirlbrew"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14468,
+ Type = RRS("Tailoring"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Qia"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14488,
+ Type = RRS("Tailoring"),
+ Skill = 280,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Moonglade"), Vendor = RRS("Darnall"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14472,
+ Type = RRS("Tailoring"),
+ Skill = 265,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Moonglade"), Vendor = RRS("Darnall"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14481,
+ Type = RRS("Tailoring"),
+ Skill = 275,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Winterspring"), Vendor = RRS("Qia"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 14469,
+ Type = RRS("Tailoring"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Moonglade"), Vendor = RRS("Darnall"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 18487,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 40000,
+ Locations = {
+ { Region = RRS("Dire Maul"), Vendor = RRS("Shen'dralar Provisioner"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17018,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 80000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19220,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 90000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17017,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 180000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19219,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 60000,
+ Faction = RRS("Thorium Brotherhood"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Blackrock Depths"), Vendor = RRS("Lokhtos Darkbargainer"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19215,
+ Type = RRS("Tailoring"),
+ Skill = 290,
+ Cost = 22000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19218,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Timbermaw Hold"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Meilosh"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19216,
+ Type = RRS("Tailoring"),
+ Skill = 290,
+ Cost = 22000,
+ Faction = RRS("Argent Dawn"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19217,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 40000,
+ Faction = RRS("Argent Dawn"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19766,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19765,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 19764,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Zandalar Tribe"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Rin'wosho the Trader"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 21358,
+ Type = RRS("Tailoring"),
+ Skill = 260,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Vizzklick"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22307,
+ Type = RRS("Tailoring"),
+ Skill = 225,
+ Cost = 6000,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Vaean"), Team = "Alliance" },
+ { Region = RRS("Stormwind City"), Vendor = RRS("Jessara Cordell"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Leo Sarn"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Nata Dawnstrider"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Thaddeus Webb"), Team = "Horde" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Kithas"), Team = "Horde" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tilli Thistlefuzz"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Lilly"), Team = "Horde" },
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22308,
+ Type = RRS("Tailoring"),
+ Skill = 275,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Kania"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22312,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Mishta"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22310,
+ Type = RRS("Tailoring"),
+ Skill = 275,
+ Cost = 20000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Mishta"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22683,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 90000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Mishta"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22772,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 5,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Mishta"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22773,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Mishta"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 22774,
+ Type = RRS("Tailoring"),
+ Skill = 300,
+ Cost = 50000,
+ Faction = RRS("Cenarion Circle"),
+ Level = 7,
+ Locations = {
+ { Region = RRS("Silithus"), Vendor = RRS("Mishta"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+[RRS("Cooking")] = {
+ Recipes = {
+ {
+ ID = 16072,
+ Type = RRS("Cooking"),
+ Skill = 125,
+ Cost = 10000,
+ Locations = {
+ { Region = RRS("Ashenvale"), Vendor = RRS("Shandrina"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Wulan"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 13949,
+ Type = RRS("Cooking"),
+ Skill = 275,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Vivianna"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Sheendra Tallgrass"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 4609,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 1000,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Narj Deepslice"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 2889,
+ Type = RRS("Cooking"),
+ Skill = 25,
+ Cost = 240,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 3734,
+ Type = RRS("Cooking"),
+ Skill = 110,
+ Cost = 1600,
+ Locations = {
+ { Region = RRS("Ashenvale"), Vendor = RRS("Ulthaan"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 3679,
+ Type = RRS("Cooking"),
+ Skill = 60,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 6325,
+ Type = RRS("Cooking"),
+ Skill = 1,
+ Cost = 40,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Catherine Leland"), Team = "Alliance" },
+ { Region = RRS("Dun Morogh"), Vendor = RRS("Gretta Ganter"), Team = "Alliance" },
+ { Region = RRS("Loch Modan"), Vendor = RRS("Khara Deepwater"), Team = "Alliance" },
+ { Region = RRS("Teldrassil"), Vendor = RRS("Nyoma"), Team = "Alliance" },
+ { Region = RRS("Elwynn Forest"), Vendor = RRS("Tharynn Bouden"), Team = "Alliance" },
+ { Region = RRS("Mulgore"), Vendor = RRS("Harn Longcast"), Team = "Horde" },
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Martine Tramblay"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Sewa Mistrunner"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Lizbeth Cromwell"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6330,
+ Type = RRS("Cooking"),
+ Skill = 100,
+ Cost = 1200,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Catherine Leland"), Team = "Alliance" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Lindea Rabonne"), Team = "Alliance" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Derak Nightfall"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Naal Mistrunner"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Sewa Mistrunner"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Ronald Burch"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Kilxx"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 5528,
+ Type = RRS("Cooking"),
+ Skill = 90,
+ Cost = 800,
+ Locations = {
+ { Region = RRS("Darkshore"), Vendor = RRS("Heldan Galesong"), Team = "Alliance" },
+ { Region = RRS("Westfall"), Vendor = RRS("Kriggon Talsone"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 2698,
+ Type = RRS("Cooking"),
+ Skill = 85,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 3681,
+ Type = RRS("Cooking"),
+ Skill = 120,
+ Cost = 1600,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 3678,
+ Type = RRS("Cooking"),
+ Skill = 80,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 3682,
+ Type = RRS("Cooking"),
+ Skill = 130,
+ Cost = 1600,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Keena"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Nerrist"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 12239,
+ Type = RRS("Cooking"),
+ Skill = 200,
+ Cost = 7000,
+ Locations = {
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Helenia Olden"), Team = "Alliance" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Ogg'marr"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 5485,
+ Type = RRS("Cooking"),
+ Skill = 50,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Darkshore"), Vendor = RRS("Laird"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 3683,
+ Type = RRS("Cooking"),
+ Skill = 110,
+ Cost = 1600,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 2697,
+ Type = RRS("Cooking"),
+ Skill = 50,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 12240,
+ Type = RRS("Cooking"),
+ Skill = 200,
+ Cost = 7000,
+ Locations = {
+ { Region = RRS("Desolace"), Vendor = RRS("Janet Hommers"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Kireena"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 20075,
+ Type = RRS("Cooking"),
+ Skill = 150,
+ Cost = 2000,
+ Locations = {
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Ogg'marr"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 3735,
+ Type = RRS("Cooking"),
+ Skill = 125,
+ Cost = 1800,
+ Locations = {
+ { Region = RRS("The Barrens"), Vendor = RRS("Zargh"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12229,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Vivianna"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Sheendra Tallgrass"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12231,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Corporal Bluth"), Team = "Alliance" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Nerrist"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 5489,
+ Type = RRS("Cooking"),
+ Skill = 110,
+ Cost = 1200,
+ Locations = {
+ { Region = RRS("Ashenvale"), Vendor = RRS("Ulthaan"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13947,
+ Type = RRS("Cooking"),
+ Skill = 275,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Vivianna"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Sheendra Tallgrass"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6329,
+ Type = RRS("Cooking"),
+ Skill = 50,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Loch Modan"), Vendor = RRS("Khara Deepwater"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 6328,
+ Type = RRS("Cooking"),
+ Skill = 50,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Loch Modan"), Vendor = RRS("Khara Deepwater"), Team = "Alliance" },
+ { Region = RRS("Teldrassil"), Vendor = RRS("Nyoma"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tansy Puddlefizz"), Team = "Alliance" },
+ { Region = RRS("Elwynn Forest"), Vendor = RRS("Tharynn Bouden"), Team = "Alliance" },
+ { Region = RRS("Mulgore"), Vendor = RRS("Harn Longcast"), Team = "Horde" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Killian Sanatha"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Naal Mistrunner"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Lizbeth Cromwell"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 13948,
+ Type = RRS("Cooking"),
+ Skill = 275,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Feralas"), Vendor = RRS("Vivianna"), Team = "Alliance" },
+ { Region = RRS("Feralas"), Vendor = RRS("Sheendra Tallgrass"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 17062,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 2200,
+ Locations = {
+ { Region = RRS("Darkshore"), Vendor = RRS("Heldan Galesong"), Team = "Alliance" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Lindea Rabonne"), Team = "Alliance" },
+ { Region = RRS("Wetlands"), Vendor = RRS("Stuart Fleming"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tansy Puddlefizz"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Shankys"), Team = "Horde" },
+ { Region = RRS("Ashenvale"), Vendor = RRS("Wik'Tar"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Wulan"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Kelsey Yance"), Team = "Neutral" },
+ { Region = RRS("Undercity"), Vendor = RRS("Lizbeth Cromwell"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 3680,
+ Type = RRS("Cooking"),
+ Skill = 90,
+ Cost = 1600,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 12233,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Helenia Olden"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Janet Hommers"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6368,
+ Type = RRS("Cooking"),
+ Skill = 50,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Catherine Leland"), Team = "Alliance" },
+ { Region = RRS("Darkshore"), Vendor = RRS("Heldan Galesong"), Team = "Alliance" },
+ { Region = RRS("Westfall"), Vendor = RRS("Kriggon Talsone"), Team = "Alliance" },
+ { Region = RRS("Teldrassil"), Vendor = RRS("Nessa Shadowsong"), Team = "Alliance" },
+ { Region = RRS("Wetlands"), Vendor = RRS("Stuart Fleming"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Killian Sanatha"), Team = "Horde" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Shankys"), Team = "Horde" },
+ { Region = RRS("Durotar"), Vendor = RRS("Zansoa"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Ronald Burch"), Team = "Horde" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Kilxx"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 2699,
+ Type = RRS("Cooking"),
+ Skill = 100,
+ Cost = 800,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 12228,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Corporal Bluth"), Team = "Alliance" },
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Hammon Karwn"), Team = "Alliance" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Helenia Olden"), Team = "Alliance" },
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Keena"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Nerrist"), Team = "Horde" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Ogg'marr"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6369,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 2200,
+ Locations = {
+ { Region = RRS("Darkshore"), Vendor = RRS("Heldan Galesong"), Team = "Alliance" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Lindea Rabonne"), Team = "Alliance" },
+ { Region = RRS("Wetlands"), Vendor = RRS("Stuart Fleming"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tansy Puddlefizz"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Shankys"), Team = "Horde" },
+ { Region = RRS("Ashenvale"), Vendor = RRS("Wik'Tar"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Wulan"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Kelsey Yance"), Team = "Neutral" },
+ { Region = RRS("Undercity"), Vendor = RRS("Lizbeth Cromwell"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 2701,
+ Type = RRS("Cooking"),
+ Skill = 100,
+ Cost = 1600,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 6326,
+ Type = RRS("Cooking"),
+ Skill = 1,
+ Cost = 40,
+ Locations = {
+ { Region = RRS("Westfall"), Vendor = RRS("Kriggon Talsone"), Team = "Alliance" },
+ { Region = RRS("Teldrassil"), Vendor = RRS("Nessa Shadowsong"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Tansy Puddlefizz"), Team = "Alliance" },
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Martine Tramblay"), Team = "Horde" },
+ { Region = RRS("Durotar"), Vendor = RRS("Zansoa"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 6892,
+ Type = RRS("Cooking"),
+ Skill = 40,
+ Cost = 250,
+ Locations = {
+ { Region = RRS("Loch Modan"), Vendor = RRS("Drac Roughcut"), Team = "Alliance" },
+ { Region = RRS("Silverpine Forest"), Vendor = RRS("Andrew Hilbert"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 16111,
+ Type = RRS("Cooking"),
+ Skill = 225,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Westfall"), Vendor = RRS("Kriggon Talsone"), Team = "Alliance" },
+ { Region = RRS("Swamp of Sorrows"), Vendor = RRS("Banalash"), Team = "Horde" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Uthok"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 2700,
+ Type = RRS("Cooking"),
+ Skill = 110,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 18046,
+ Type = RRS("Cooking"),
+ Skill = 225,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("The Hinterlands"), Vendor = RRS("Truk Wildbeard"), Team = "Alliance" },
+ { Region = RRS("Tanaris"), Vendor = RRS("Dirge Quikcleave"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 728,
+ Type = RRS("Cooking"),
+ Skill = 75,
+ Cost = 200,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Kendor Kabonka"), Team = "Alliance" },
+ },
+ },
+ {
+ ID = 12226,
+ Type = RRS("Cooking"),
+ Skill = 1,
+ Cost = 25,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Abigail Shiel"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5488,
+ Type = RRS("Cooking"),
+ Skill = 100,
+ Cost = 400,
+ Locations = {
+ { Region = RRS("The Barrens"), Vendor = RRS("Tari'qa"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5484,
+ Type = RRS("Cooking"),
+ Skill = 35,
+ Cost = 240,
+ Locations = {
+ { Region = RRS("Mulgore"), Vendor = RRS("Wunna Darkmane"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5483,
+ Type = RRS("Cooking"),
+ Skill = 20,
+ Cost = 140,
+ Locations = {
+ { Region = RRS("Durotar"), Vendor = RRS("Grimtak"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 5486,
+ Type = RRS("Cooking"),
+ Skill = 50,
+ Cost = 440,
+ Locations = {
+ { Region = RRS("The Barrens"), Vendor = RRS("Tari'qa"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 12232,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Swamp of Sorrows"), Vendor = RRS("Banalash"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Kireena"), Team = "Horde" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Ogg'marr"), Team = "Horde" },
+ { Region = RRS("Desolace"), Vendor = RRS("Vendor-Tron 1000"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13940,
+ Type = RRS("Cooking"),
+ Skill = 225,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Kelsey Yance"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13941,
+ Type = RRS("Cooking"),
+ Skill = 225,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Kelsey Yance"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 6039,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Kelsey Yance"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13942,
+ Type = RRS("Cooking"),
+ Skill = 240,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Gikkix"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13943,
+ Type = RRS("Cooking"),
+ Skill = 240,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Kelsey Yance"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 12227,
+ Type = RRS("Cooking"),
+ Skill = 125,
+ Cost = 1600,
+ Locations = {
+ { Region = RRS("Desolace"), Vendor = RRS("Super-Seller 680"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 16110,
+ Type = RRS("Cooking"),
+ Skill = 225,
+ Cost = 12000,
+ Locations = {
+ { Region = RRS("Felwood"), Vendor = RRS("Malygen"), Team = "Alliance" },
+ { Region = RRS("Felwood"), Vendor = RRS("Bale"), Team = "Horde" },
+ { Region = RRS("Winterspring"), Vendor = RRS("Himmik"), Team = "Neutral" },
+ { Region = RRS("Winterspring"), Vendor = RRS("Qia"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13945,
+ Type = RRS("Cooking"),
+ Skill = 250,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Gikkix"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13946,
+ Type = RRS("Cooking"),
+ Skill = 250,
+ Cost = 20000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Gikkix"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 13939,
+ Type = RRS("Cooking"),
+ Skill = 225,
+ Cost = 16000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Gikkix"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 16767,
+ Type = RRS("Cooking"),
+ Skill = 225,
+ Cost = 3000,
+ Locations = {
+ { Region = RRS("Tanaris"), Vendor = RRS("Jabbey"), Team = "Neutral" },
+ },
+ },
+ {
+ ID = 17201,
+ Type = RRS("Cooking"),
+ Skill = 35,
+ Cost = 240,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Khole Jinglepocket"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Wulmort Jinglepocket"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Penney Copperpinch"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Seersa Copperpinch"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Nardstrum Copperpinch"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 17200,
+ Type = RRS("Cooking"),
+ Skill = 1,
+ Cost = 25,
+ Locations = {
+ { Region = RRS("Stormwind City"), Vendor = RRS("Khole Jinglepocket"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Wulmort Jinglepocket"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Penney Copperpinch"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Seersa Copperpinch"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Nardstrum Copperpinch"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 21099,
+ Type = RRS("Cooking"),
+ Skill = 80,
+ Cost = 500,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Fyldan"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Wulan"), Team = "Horde" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Derak Nightfall"), Team = "Horde" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Micha Yance"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Emrul Riknussun"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Xen'to"), Team = "Horde" },
+ { Region = RRS("Redridge Mountains"), Vendor = RRS("Gloria Femmel"), Team = "Alliance" },
+ { Region = RRS("Stormwind City"), Vendor = RRS("Erika Tate"), Team = "Alliance" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Kelsey Yance"), Team = "Neutral" },
+ { Region = RRS("Teldrassil"), Vendor = RRS("Nyoma"), Team = "Alliance" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Tarban Hearthgrain"), Team = "Horde" },
+ { Region = RRS("The Hinterlands"), Vendor = RRS("Otho Moji'ko"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Naal Mistrunner"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Ronald Burch"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 21219,
+ Type = RRS("Cooking"),
+ Skill = 175,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Darnassus"), Vendor = RRS("Fyldan"), Team = "Alliance" },
+ { Region = RRS("Desolace"), Vendor = RRS("Wulan"), Team = "Horde" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Derak Nightfall"), Team = "Horde" },
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Micha Yance"), Team = "Alliance" },
+ { Region = RRS("Ironforge"), Vendor = RRS("Emrul Riknussun"), Team = "Alliance" },
+ { Region = RRS("Orgrimmar"), Vendor = RRS("Xen'to"), Team = "Horde" },
+ { Region = RRS("Redridge Mountains"), Vendor = RRS("Gloria Femmel"), Team = "Alliance" },
+ { Region = RRS("Stormwind City"), Vendor = RRS("Erika Tate"), Team = "Alliance" },
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Kelsey Yance"), Team = "Neutral" },
+ { Region = RRS("Teldrassil"), Vendor = RRS("Nyoma"), Team = "Alliance" },
+ { Region = RRS("The Barrens"), Vendor = RRS("Tarban Hearthgrain"), Team = "Horde" },
+ { Region = RRS("The Hinterlands"), Vendor = RRS("Otho Moji'ko"), Team = "Horde" },
+ { Region = RRS("Thunder Bluff"), Vendor = RRS("Naal Mistrunner"), Team = "Horde" },
+ { Region = RRS("Undercity"), Vendor = RRS("Ronald Burch"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 18160,
+ Type = RRS("Cooking"),
+ Skill = 60,
+ Cost = 200,
+ Notes = RRS("Rogue Only"),
+ Locations = {
+ { Region = RRS("Hillsbrad Foothills"), Vendor = RRS("Smudge Thunderwood"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+[RRS("Fishing")] = {
+ Recipes = {
+ {
+ ID = 16083,
+ Type = RRS("Fishing"),
+ Skill = 125,
+ Cost = 10000,
+ Locations = {
+ { Region = RRS("Stranglethorn Vale"), Vendor = RRS("Old Man Heming"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+[RRS("First Aid")] = {
+ Recipes = {
+ {
+ ID = 16084,
+ Type = RRS("First Aid"),
+ Skill = 125,
+ Cost = 10000,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Deneb Walker"), Team = "Alliance" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Balai Lok'Wein"), Team = "Horde" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Ghok'kah"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 16112,
+ Type = RRS("First Aid"),
+ Skill = 180,
+ Cost = 2200,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Deneb Walker"), Team = "Alliance" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Balai Lok'Wein"), Team = "Horde" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Ghok'kah"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 16113,
+ Type = RRS("First Aid"),
+ Skill = 210,
+ Cost = 5000,
+ Locations = {
+ { Region = RRS("Arathi Highlands"), Vendor = RRS("Deneb Walker"), Team = "Alliance" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Balai Lok'Wein"), Team = "Horde" },
+ { Region = RRS("Dustwallow Marsh"), Vendor = RRS("Ghok'kah"), Team = "Horde" },
+ },
+ },
+ {
+ ID = 19442,
+ Type = RRS("First Aid"),
+ Skill = 300,
+ Cost = 100000,
+ Faction = RRS("Argent Dawn"),
+ Level = 6,
+ Locations = {
+ { Region = RRS("Tirisfal Glades"), Vendor = RRS("Argent Quartermaster Hasana"), Team = "Neutral" },
+ { Region = RRS("Western Plaguelands"), Vendor = RRS("Argent Quartermaster Lightspark"), Team = "Neutral" },
+ { Region = RRS("Eastern Plaguelands"), Vendor = RRS("Quartermaster Miranda Breechlock"), Team = "Neutral" },
+ },
+ },
+ },
+},
+
+}
+
diff --git a/RecipeRadar/RecipeRadar.lua b/RecipeRadar/RecipeRadar.lua
new file mode 100644
index 0000000..b3983f1
--- /dev/null
+++ b/RecipeRadar/RecipeRadar.lua
@@ -0,0 +1,628 @@
+
+-- RecipeRadar.lua: main event code and general utility functions
+-- $Id: RecipeRadar.lua 464 2006-09-18 18:05:57Z jnmiller $
+
+function RecipeRadar_OnLoad()
+
+ tinsert(UISpecialFrames, "RecipeRadarFrame")
+ UIPanelWindows["RecipeRadarFrame"] = nil
+
+ SLASH_RecipeRadar1 = "/rrdr"
+ SLASH_RecipeRadar2 = "/reciperadar"
+ SlashCmdList["RecipeRadar"] = RecipeRadar_SlashHandler
+
+ this:RegisterEvent("VARIABLES_LOADED")
+ this:RegisterEvent("ZONE_CHANGED_NEW_AREA")
+ this:RegisterEvent("MINIMAP_UPDATE_ZOOM")
+ this:RegisterEvent("WORLD_MAP_UPDATE")
+ this:RegisterEvent("CRAFT_SHOW")
+ this:RegisterEvent("TRADE_SKILL_SHOW")
+ this:RegisterEvent("CHAT_MSG_SKILL")
+ this:RegisterEvent("CHAT_MSG_SYSTEM")
+ this:RegisterEvent("PLAYER_ENTERING_WORLD")
+
+ -- RecipeRadar_Print("Recipe Radar loaded!")
+
+end
+
+function RecipeRadar_OnEvent()
+
+ if (event == "VARIABLES_LOADED") then
+
+ RecipeRadar_Globals_Init()
+ RecipeRadar_MinimapButton_Init()
+ RecipeRadar_Availability_Init()
+ RecipeRadar_Maps_Init()
+ RecipeRadar_SkillDB_Init()
+ RecipeRadar_MainFrame_Init()
+ RecipeRadar_DropDowns_Init()
+ RecipeRadar_SelectFirstRecipe()
+
+ elseif (event == "ZONE_CHANGED_NEW_AREA") then
+
+ if (RecipeRadar_RegionHasLearnableRecipe(GetRealZoneText())) then
+ RecipeRadar_MinimapButton_Flash()
+ end
+ RecipeRadar_Minimap_OnNewRegion()
+ if (RecipeRadar_Options.AutoSelectRegion) then
+ RecipeRadar_NewRegion(GetRealZoneText())
+ end
+
+ elseif (event == "ADDON_LOADED" and arg1 == "RecipeRadar") then
+
+ --
+
+ elseif (event == "PLAYER_ENTERING_WORLD") then
+
+ if (RecipeRadar_Filters.Teams["Horde"] == nil) then
+ -- this should be the first run of the addon, so set team filters
+ RecipeRadar_Filters.Teams[UnitFactionGroup("player")] = false
+ RecipeRadar_Filters.Teams
+ [RecipeRadar_GetOpposingFaction("player")] = true
+ end
+
+ elseif (event == "MINIMAP_UPDATE_ZOOM") then
+
+ RecipeRadar_Minimap_SetIndoorness()
+
+ elseif (event == "WORLD_MAP_UPDATE") then
+
+ RecipeRadar_Worldmap_UpdateButtons()
+
+ elseif (event == "CRAFT_SHOW") then
+
+ RecipeRadar_SkillDB_Refresh("craft")
+
+ elseif (event == "TRADE_SKILL_SHOW") then
+
+ RecipeRadar_SkillDB_Refresh("trade")
+
+ elseif (event == "CHAT_MSG_SKILL") then
+
+ -- arg1 = eg. "Your skill in Cooking has increased to 221."
+ RecipeRadar_ParseChatMessage(arg1)
+
+ elseif (event == "CHAT_MSG_SYSTEM") then
+
+ -- arg1 = eg. "You have learned how to create a new item: Bristle Whisker Catfish."
+ RecipeRadar_ParseChatMessage(arg1)
+
+ end
+
+end
+
+function RecipeRadar_OnShow()
+
+ --PlaySound("igCharacterInfoOpen")
+
+end
+
+function RecipeRadar_OnHide()
+
+ PlaySound("igCharacterInfoClose")
+ RecipeRadarFrame:StopMovingOrSizing()
+
+end
+
+function RecipeRadar_SlashHandler(msg)
+
+ local _, _, cmd, arg1, arg2 = string.find(msg, "(%w+)%s*(%w*)%s*(%w*)")
+
+ if (cmd == "debug") then
+
+ if (arg1 == "vendor") then
+ RecipeRadar_Options.PositionDebug = true
+ end
+
+ if (arg1 == "skills") then
+ RecipeRadar_SkillDB_Print(arg2)
+ end
+
+ if (arg1 == "clear") then
+ RecipeRadar_SkillDB_Clear(arg2)
+ end
+
+ return
+
+ end
+
+ if (cmd == "radar") then
+
+ local region = RecipeRadar_RegionData[GetRealZoneText()]
+ if (not region) then return end
+
+ for _, vendor in region.Vendors do
+
+ RecipeRadar_Print(RecipeRadar_GetColoredTeamString(
+ vendor.Team, vendor.Name) .. " (" ..
+ string.format("%d", vendor.Coordinates[1].x * 100) .. ", " ..
+ string.format("%d", vendor.Coordinates[1].y * 100) .. "):")
+
+ table.sort(vendor.Recipes, RecipeRadar_CompareSkills)
+ table.foreach(vendor.Recipes, RecipeRadar_PrintRecipe)
+
+ end
+
+ return
+
+ end
+
+ RecipeRadar_Toggle()
+
+end
+
+-- Function to be called on selecting a new region to initialize the
+-- main frame and any active filters.
+function RecipeRadar_NewRegion(region)
+
+ if (not region or region == "") then return end
+
+ RecipeRadar_Options.CurrentRegion = region
+ RecipeRadar_Options.CurrentContinent = RecipeRadar_GetCurrentContinent()
+ RecipeRadar_InitVendorFilters()
+ RecipeRadar_SelectFirstRecipe()
+ RecipeRadar_FrameUpdate()
+
+end
+
+-- Returns whether the given region contains at least one recipe that
+-- is learnable by the player or (optionally) alts
+function RecipeRadar_RegionHasLearnableRecipe(region_name)
+
+ local region_data = RecipeRadar_RegionData[region_name]
+ if (not region_data) then return false end
+
+ for _, vendor in region_data.Vendors do
+ for _, recipe in vendor.Recipes do
+ if (RecipeRadar_Availability_IsLearnable(recipe)) then
+ return true
+ end
+ end
+ end
+
+ return false
+
+end
+
+-- Given a table of recipes, returns the number of recipes that are
+-- learnable by the player or (optionally) alts.
+function RecipeRadar_CountLearnableRecipes(recipes)
+
+ if (not recipes) then return 0 end
+
+ local total = 0
+
+ for _, recipe in recipes do
+ if (RecipeRadar_Availability_IsLearnable(recipe)) then
+ total = total + 1
+ end
+ end
+
+ return total
+
+end
+
+-- Returns the index of the current region's continent, or 0 if the
+-- player is not in a known map zone (eg. she's in an instance).
+function RecipeRadar_GetCurrentContinent()
+
+ local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
+
+ -- this mess derives the current continent from the current region
+ if (region) then
+ return region.Continent
+ else
+ -- region is not one with recipes, so we search for it
+ for cont_id, _ in { GetMapContinents() } do
+ for _, zone in { GetMapZones(cont_id) } do
+ if (RecipeRadar_Options.CurrentRegion == zone) then
+ return cont_id
+ end
+ end
+ end
+ return 0
+ end
+
+end
+
+-- Converts a format string to one that LUA can understand. I've
+-- shamelessly stolen this from Innerfire in order to (I hope) prevent
+-- the combat chatlog parsing errors.
+function RecipeRadar_ConvertFormat(fmt)
+
+ -- remove non-English format params like "%1$s"
+ local find = string.gsub(fmt, "%%%d%$", "%%")
+
+ -- remove any special characters with escaped versions
+ find = string.gsub(find, "([%^%$%(%)%.%[%]%*%+%-%?])", "%%%1")
+
+ -- finally replace standard "%s" and "%d"
+ find = string.gsub(find, "%%s", "(.+)")
+ find = string.gsub(find, "%%d", "(%%d+)")
+ return find
+
+end
+
+-- Parses the input for a couple of known message formats to gain information
+-- about changes in the character's skills.
+function RecipeRadar_ParseChatMessage(msg)
+
+ -- messages of the form 'Your skill in %s has increased to %d.'
+ local start, _, prof, rank =
+ string.find(msg, RecipeRadar_ConvertFormat(ERR_SKILL_UP_SI))
+ if (start) then
+ RecipeRadar_SkillDB_SetRank(prof, rank)
+ end
+
+ -- messages of the form 'You have unlearned %s.'
+ start, _, prof =
+ string.find(msg, RecipeRadar_ConvertFormat(ERR_SPELL_UNLEARNED_S))
+ if (prof) then
+ RecipeRadar_SkillDB_GetPlayerProfessions()[prof] = nil
+ end
+
+end
+
+-- Foreach function that prints a recipe link and its cost.
+function RecipeRadar_PrintRecipe(index, recipe)
+
+ RecipeRadar_Print(" " .. RecipeRadar_GetHyperlinkByID(recipe.ID) ..
+ ", " .. RecipeRadar_GetGSCString(recipe.Cost))
+
+end
+
+-- Returns a string describing an item link from an item ID.
+function RecipeRadar_GetHyperlinkByID(id)
+
+ local name, link, color = RecipeRadar_GetSafeItemInfo(id)
+ return RecipeRadar_GetHyperlinkByParts(name, link, color)
+
+end
+
+-- Returns a string describing an item link from link components.
+function RecipeRadar_GetHyperlinkByParts(name, link, color)
+
+ return string.format("%s|H%s|h[%s]|h|r", color, link, name)
+
+end
+
+-- If an item is not in your local cache, GetItemInfo() fails. To work
+-- around this, we just return 'uncached' along with the details we do know.
+-- If an item is recognized by the client, we cache the name so that future
+-- requests don't end up fully 'uncached'. The final return value is a
+-- boolean indicating whether it was a cached ID.
+function RecipeRadar_GetSafeItemInfo(id)
+
+ local name, link, rarity, _, _, _, _, _, texture = GetItemInfo(id)
+
+ -- initialize our name cache if necessary
+ if (not RecipeRadar_NameCache) then RecipeRadar_NameCache = { } end
+
+ if (name == nil) then
+
+ -- set returned name according to whether we've already seen the id
+ if (RecipeRadar_NameCache[id]) then
+ name = RecipeRadar_NameCache[id]
+ else
+ name = RRS("Uncached Recipe")
+ end
+
+ -- create our own tooltip for uncached items
+ return name, "item:" .. id .. ":0:0:0",
+ RecipeRadar_ColorToCode(RecipeRadar_Colors.UncachedRecipe),
+ RecipeRadar_Colors.UncachedRecipe.r,
+ RecipeRadar_Colors.UncachedRecipe.g,
+ RecipeRadar_Colors.UncachedRecipe.b,
+ RECIPERADAR_IMAGE_ROOT .. "Misc\\QuestionMark",
+ false -- boolean to indicate whether we got a real recipe
+
+ else
+ RecipeRadar_NameCache[id] = name -- cache names
+ local r, g, b, colorcode = GetItemQualityColor(rarity)
+ return name, link, colorcode, r, g, b, texture, true
+ end
+
+end
+
+function RecipeRadar_RegionNameToID(region_name, continent)
+
+ local index = 0
+
+ for _, zone in { GetMapZones(continent) } do
+ index = index + 1
+ if (region_name == zone) then
+ return index
+ end
+ end
+
+ RecipeRadar_Print("ASSERT FAILED: region '" .. region_name ..
+ "' not found by GetMapZones()!")
+ return nil
+
+end
+
+-- Formats the subtext that applies to a few vendors. include_parens is
+-- a boolean that specifies whether the string should be in parens.
+function RecipeRadar_FormatVendorNote(note, include_parens)
+
+ if (include_parens) then
+ return format(TEXT(PARENS_TEMPLATE), format(RRS("%s Vendor"), note))
+ end
+ return format(RRS("%s Vendor"), note)
+
+end
+
+-- Get gold, silver, copper from total copper.
+function RecipeRadar_GetGSC(copper)
+
+ if (copper == nil) then
+ copper = 0
+ end
+
+ local g = math.floor(copper / 10000)
+ local s = math.floor((copper - (g * 10000)) / 100)
+ local c = math.floor(copper - (g * 10000) - (s * 100))
+
+ return g, s, c
+
+end
+
+-- Format text by color for gold, silver and copper (from EnhTooltip).
+function RecipeRadar_GetGSCString(copper)
+
+ local TEXT_NONE = "0"
+ local GSC_GOLD = "ffd100"
+ local GSC_SILVER = "e6e6e6"
+ local GSC_COPPER = "c8602c"
+ local GSC_FMT = "|cff%s%d|r"
+ local GSC_PART = ".|cff%s%02d|r"
+ local GSC_NONE = "|cffa0a0a0" .. TEXT_NONE .. "|r"
+
+ local g, s, c = RecipeRadar_GetGSC(copper)
+ local gsc = ""
+
+ if (g > 0) then
+ gsc = string.format(GSC_FMT, GSC_GOLD, g)
+ if (s > 0) then
+ gsc = gsc .. string.format(GSC_PART, GSC_SILVER, s)
+ end
+ if exact then
+ gsc = gsc .. string.format(GSC_PART,GSC_COPPER, c)
+ end
+ elseif (s > 0) then
+ gsc = string.format(GSC_FMT, GSC_SILVER, s)
+ if (c > 0) then
+ gsc = gsc .. string.format(GSC_PART, GSC_COPPER, c)
+ end
+ elseif (c > 0) then
+ gsc = gsc .. string.format(GSC_FMT, GSC_COPPER, c)
+ else
+ gsc = GSC_NONE
+ end
+
+ return gsc
+
+end
+
+-- Returns the name of the player's opposing faction.
+-- These strings shouldn't need to be localized.
+function RecipeRadar_GetOpposingFaction()
+
+ if (UnitFactionGroup("player") == "Alliance") then
+ return "Horde"
+ elseif (UnitFactionGroup("player") == "Horde") then
+ return "Alliance"
+ end
+ return "Unknown"
+
+end
+
+-- Formats a string in the color specified by the key 'team'.
+function RecipeRadar_GetColoredTeamString(team, s)
+
+ if (not RecipeRadar_Teams[team]) then return end
+ return RecipeRadar_ColorToCode(RecipeRadar_Teams[team].Color) ..
+ s .. FONT_COLOR_CODE_CLOSE
+
+end
+
+-- Returns whether the skill is an applicable profession.
+function RecipeRadar_IsProfession(skill_name)
+
+ for name, _ in RecipeRadar_Professions do
+ if (name == skill_name) then
+ return true
+ end
+ end
+
+ return false
+
+end
+
+-- Returns the profession under which a trade skill specialty belongs,
+-- or false if skill_name is not a known specialty.
+function RecipeRadar_IsProfessionSpecialty(skill_name)
+
+ for spec, prof in RecipeRadar_Specialties do
+ if (spec == skill_name) then
+ return prof
+ end
+ end
+
+ return false
+
+end
+
+-- Returns whether the supplied faction is one that Recipe Radar cares about.
+function RecipeRadar_IsKnownFaction(faction)
+
+ for _, name in RecipeRadar_Factions do
+ if (name == faction) then
+ return true
+ end
+ end
+
+ return false
+
+end
+
+-- Returns whether the given vendor has at least one unfiltered recipe.
+function RecipeRadar_VendorHasRecipes(vendor)
+
+ for _, recipe in vendor.Recipes do
+ if (not RecipeRadar_IsRecipeFiltered(recipe)) then
+ return true
+ end
+ end
+
+ return false
+
+end
+
+-- Returns whether the given recipe has at least one unfiltered location.
+function RecipeRadar_RecipeHasLocations(recipe)
+
+ for _, location in recipe.Locations do
+ if (not location.IsFiltered) then
+ return true
+ end
+ end
+
+ return false
+
+end
+
+-- Returns a string describing the requirements to buy the given recipe
+-- according to the recipe's Notes/Faction member, or nil.
+function RecipeRadar_GetRecipeReqsString(recipe)
+
+ if (recipe.Notes and recipe.Notes ~= "") then
+ return recipe.Notes
+ end
+ if (recipe.Faction and recipe.Faction ~= "") then
+ return recipe.Faction .. ", " ..
+ getglobal("FACTION_STANDING_LABEL" .. recipe.Level)
+ end
+ return nil
+
+end
+
+-- Given a recipe name of the form 'Label: Name', returns 'Name'. It
+-- does this by checking for a ':' and looking ahead two characters.
+-- TODO: verify this with Asian/other languages.
+function RecipeRadar_TrimRecipeLabel(recipe_name)
+
+ local label_end = string.find(recipe_name, ":")
+ if (label_end) then
+ return string.sub(recipe_name, label_end + 2)
+ end
+ return recipe_name
+
+end
+
+-- Sorts the vendors in a given region.
+function RecipeRadar_SortVendors(region_data)
+
+ if (region_data.IsVendorTableSorted) then
+ return
+ end
+
+ table.sort(region_data.Vendors, RecipeRadar_CompareNames)
+ region_data.IsVendorTableSorted = true
+
+end
+
+-- Sorts the recipes on a given vendor.
+function RecipeRadar_SortRecipes(container)
+
+ if (container.IsRecipeTableSorted) then
+ return
+ end
+
+ table.sort(container.Recipes, RecipeRadar_CompareSkills)
+ container.IsRecipeTableSorted = true
+
+end
+
+-- Sorts the locations on a given recipe.
+function RecipeRadar_SortLocations(recipe_data)
+
+ if (recipe_data.IsLocationsTableSorted) then
+ return
+ end
+
+ table.sort(recipe_data.Locations, RecipeRadar_CompareRegions)
+ recipe_data.IsRecipeTableSorted = true
+
+end
+
+-- Sort comparison function on required skill first, then the recipe's
+-- ID (to insure a deterministic order).
+function RecipeRadar_CompareSkills(recipe1, recipe2)
+
+ if (recipe1.Skill == recipe2.Skill) then
+ return recipe1.ID < recipe2.ID
+ end
+ return recipe1.Skill < recipe2.Skill
+
+end
+
+-- Sort comparison function on vendor names.
+function RecipeRadar_CompareNames(vendor1, vendor2)
+
+ return vendor1.Name < vendor2.Name
+
+end
+
+-- Sort comparison function on location names.
+function RecipeRadar_CompareRegions(location1, location2)
+
+ if (location1.Region == location2.Region) then
+ return location1.Vendor < location2.Vendor
+ end
+ return location1.Region < location2.Region
+
+end
+
+-- Returns the result of the "<" operator on both major and minor portions.
+function RecipeRadar_IsVersionLessThan(version1, version2)
+
+ local major1, minor1 = string.match(version1, "(%d+)\.(%d+)")
+ local major2, minor2 = string.match(version2, "(%d+)\.(%d+)")
+
+ if (major1 ~= major2) then
+ return major1+0 < major2+0
+ end
+ return minor1+0 < minor2+0
+
+end
+
+-- Returns a color code string converted from RGB decimals.
+function RecipeRadar_ColorToCode(color)
+
+ return string.format("|cff%02x%02x%02x",
+ 255 * color.r, 255 * color.g, 255 * color.b)
+
+end
+
+-- Returns the given string surrounded by the highlighted version of
+-- base_color.
+function RecipeRadar_HighlightString(s, base_color)
+
+ local highlight = {
+ r = math.min(1.0, base_color.r + RecipeRadar_Colors.Highlight),
+ g = math.min(1.0, base_color.g + RecipeRadar_Colors.Highlight),
+ b = math.min(1.0, base_color.b + RecipeRadar_Colors.Highlight), }
+ return RecipeRadar_ColorToCode(highlight) .. s .. FONT_COLOR_CODE_CLOSE
+
+end
+
+-- Basic chat frame printing function.
+function RecipeRadar_Print(msg, r, g, b)
+
+ DEFAULT_CHAT_FRAME:AddMessage(msg,
+ (r or RecipeRadar_Colors.MainFont.r),
+ (g or RecipeRadar_Colors.MainFont.g),
+ (b or RecipeRadar_Colors.MainFont.b))
+
+end
diff --git a/RecipeRadar/RecipeRadar.toc b/RecipeRadar/RecipeRadar.toc
new file mode 100644
index 0000000..7860861
--- /dev/null
+++ b/RecipeRadar/RecipeRadar.toc
@@ -0,0 +1,19 @@
+## Interface: 11200
+## Version: 1.14
+## Title: Recipe Radar
+## Author: Jay Miller
+## Notes: Locates vendors who sell recipes in the current region or by profession.
+## Notes-ruRU: Показывает вендоров, которые продают рецепты в данной территории или все свитки профессии.
+## Notes-deDE: Lokalisiert Händler, die Rezepte im Strombereich oder durch Beruf verkaufen.
+## Notes-frFR: Localise les marchands qui vendent des recettes dans la région courante ou par profession.
+## Notes-esES: Localiza a vendedores que venden recetas en la región actual o por la profesión.
+## SavedVariables: RecipeRadar_SkillDB RecipeRadar_NameCache
+## SavedVariablesPerCharacter: RecipeRadar_Options RecipeRadar_Filters
+Localization.lua
+Globals.lua
+FrameTemplates.xml
+Maps.xml
+MinimapButton.xml
+AvailabilityTooltip.xml
+RecipeRadar.xml
+OptionsFrame.xml
diff --git a/RecipeRadar/RecipeRadar.xml b/RecipeRadar/RecipeRadar.xml
new file mode 100644
index 0000000..a7a5da1
--- /dev/null
+++ b/RecipeRadar/RecipeRadar.xml
@@ -0,0 +1,826 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RecipeRadarAvailabilityTooltip:Hide()
+ FauxScrollFrame_OnVerticalScroll(RECIPERADAR_VENDOR_HEIGHT, RecipeRadar_FrameUpdate)
+ if (RecipeRadar_Options.ActiveTab == 1) then
+ RecipeRadarRadarTabFrame.ScrollValue = getglobal(this:GetName() .. "ScrollBar"):GetValue()
+ else
+ RecipeRadarRecipesTabFrame.ScrollValue = getglobal(this:GetName() .. "ScrollBar"):GetValue()
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RecipeRadarMapVendorIndicator:SetVertexColor(1.0, 0, 0)
+
+
+ GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
+ GameTooltip:SetText(RRS("Shift-click a vendor to add or remove her location on the world map."), nil, nil, nil, nil, 1)
+
+
+ GameTooltip:Hide()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SmallMoneyFrame_OnLoad()
+ MoneyFrame_SetType("STATIC")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --RecipeRadar_RadarTab_ContextMenuOnLoad()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --RecipeRadar_RecipesTab_ContextMenuOnLoad()
+
+
+
+
+
+
+
+
+ RecipeRadar_OnLoad()
+
+
+ RecipeRadar_OnEvent()
+
+
+ RecipeRadar_OnShow()
+
+
+ RecipeRadar_OnHide()
+
+
+ if(arg1 == "LeftButton") then RecipeRadar_StartMoving() end
+
+
+ RecipeRadarFrame:StopMovingOrSizing()
+
+
+ RecipeRadarFrame:StopMovingOrSizing()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RecipeRadar/RecipesTab.lua b/RecipeRadar/RecipesTab.lua
new file mode 100644
index 0000000..efd209b
--- /dev/null
+++ b/RecipeRadar/RecipesTab.lua
@@ -0,0 +1,510 @@
+
+-- RecipesTab.lua: handles clicking and drawing for the Recipes tab
+-- $Id: RecipesTab.lua 443 2006-09-01 04:41:40Z jnmiller $
+
+------------------------------------------------------------------------
+-- Main window refresh code
+------------------------------------------------------------------------
+
+function RecipeRadar_RecipesTab_Init()
+
+ -- reset some of the RegionData GUI settings just once here
+ for i = 1, RECIPERADAR_VENDORS_DISPLAYED do
+
+ local button = getglobal("RecipeRadarVendor" .. i)
+
+ -- reset items' horizontal offsets
+ if (i == 1) then
+ button:SetPoint("TOPLEFT", "RecipeRadarFrame",
+ "TOPLEFT", 22, -96)
+ else
+ button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. i - 1,
+ "BOTTOMLEFT", 0, 0)
+ end
+
+ -- turn off highlights and textures for these items
+ getglobal("RecipeRadarVendor" .. i .. "Check"):Hide()
+
+ -- unset to preclude tooltips for these items
+ button.Recipe = nil
+
+ end
+
+ RecipeRadar_Prof1DropDown:Hide()
+ RecipeRadar_Prof2DropDown:Show()
+
+ RecipeRadar_SetActiveTab(2)
+
+ RecipeRadar_RecipesTab_Update()
+ RecipeRadarListScrollFrameScrollBar:SetValue(
+ RecipeRadarRecipesTabFrame.ScrollValue)
+
+end
+
+function RecipeRadar_RecipesTab_OnClick()
+
+ if (RecipeRadar_Options.ActiveTab == 2) then
+ return
+ end
+
+ PlaySound("igSpellBookClose")
+ RecipeRadar_RecipesTab_Init()
+
+end
+
+function RecipeRadar_RecipesTab_ExpandAll(expand)
+
+ local prof = RecipeRadar_RecipeData[RecipeRadar_Options.CurrentProfession]
+ if (not prof) then return end
+
+ for _, recipe in prof.Recipes do
+ recipe.IsExpanded = expand
+ end
+
+ RecipeRadar_SelectFirstRecipe()
+ RecipeRadar_FrameUpdate()
+
+end
+
+function RecipeRadar_RecipesTab_Update()
+
+ if (RecipeRadar_Options.ActiveTab ~= 2) then
+ return
+ end
+
+ local prof = RecipeRadar_Options.CurrentProfession
+
+ TitleBarText:SetText(RRS("Recipe Radar") .. " - " .. prof .. " " ..
+ format(TEXT(PARENS_TEMPLATE), RecipeRadar_SkillDB_GetRank(prof)))
+
+ -- some globals for the Update() procedure
+ RecipeRadar_row = 0
+ RecipeRadar_ContextMenuGlobal.RecipesTabHasExpanded = false
+ RecipeRadar_ContextMenuGlobal.RecipesTabHasCollapsed = false
+
+ RecipeRadarHighlightFrame:Hide()
+
+ RecipeRadar_SortRecipes(RecipeRadar_RecipeData[prof])
+ table.foreach(RecipeRadar_RecipeData[prof].Recipes,
+ RecipeRadar_RecipesTab_AddRecipe)
+
+ -- update the scroll position and the width of the highlight frame
+ FauxScrollFrame_Update(RecipeRadarListScrollFrame, RecipeRadar_row,
+ RECIPERADAR_VENDORS_DISPLAYED, RECIPERADAR_VENDOR_HEIGHT,
+ nil, nil, nil, RecipeRadarHighlightFrame, 361, 384)
+
+ -- hide unused item buttons
+ for i = 1, RECIPERADAR_VENDORS_DISPLAYED do
+ local button = getglobal("RecipeRadarVendor" .. i)
+ if (i > RecipeRadar_row) then
+ button:Hide()
+ else
+ if (RecipeRadarListScrollFrame:IsVisible()) then
+ button:SetWidth(361)
+ else
+ button:SetWidth(384)
+ end
+ end
+ end
+
+ -- update the current selection (or lack thereof)
+ if (not prof or not RecipeRadarRecipesTabFrame.SelectedRecipe) then
+ RecipeRadar_HideRecipeDetails()
+ elseif (RecipeRadarRecipesTabFrame.SelectedVendor) then
+ RecipeRadar_SetSelection(RecipeRadarRecipesTabFrame.SelectedVendor,
+ RecipeRadarRecipesTabFrame.SelectedRecipe,
+ RecipeRadarRecipesTabFrame.SelectedLocation)
+ RecipeRadar_ShowRecipeDetails()
+ end
+
+end
+
+function RecipeRadar_RecipesTab_AddRecipe(key, recipe)
+
+ if (RecipeRadar_IsRecipeFiltered(recipe) or
+ not RecipeRadar_RecipeHasLocations(recipe)) then
+ return
+ end
+
+ RecipeRadar_row = RecipeRadar_row + 1
+
+ local offset = FauxScrollFrame_GetOffset(RecipeRadarListScrollFrame)
+ local index = RecipeRadar_row - offset
+
+ -- only do the following if we're in the scroll frame's visible portion
+ if (index > 0 and index <= RECIPERADAR_VENDORS_DISPLAYED) then
+
+ local button = getglobal("RecipeRadarVendor" .. index)
+
+ -- generic list item drawing
+ RecipeRadar_DrawListItem(index, recipe)
+
+ button:UnlockHighlight()
+ getglobal("RecipeRadarVendor" .. index .. "Check"):Hide()
+ getglobal("RecipeRadarVendor" .. index .. "Highlight"):SetTexture(
+ "Interface\\Buttons\\UI-PlusButton-Hilight")
+
+ if (recipe.IsExpanded) then
+ RecipeRadar_ContextMenuGlobal.RecipesTabHasExpanded = true
+ button:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up")
+ else
+ RecipeRadar_ContextMenuGlobal.RecipesTabHasCollapsed = true
+ button:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up")
+ return
+ end
+
+ else
+
+ -- if the recipe is collapsed, we don't need to traverse its locations
+ if (recipe.IsExpanded) then
+ RecipeRadar_ContextMenuGlobal.RecipesTabHasExpanded = true
+ else
+ RecipeRadar_ContextMenuGlobal.RecipesTabHasCollapsed = true
+ return
+ end
+
+ end
+
+ RecipeRadar_SortLocations(recipe)
+
+ for _, location in recipe.Locations do
+
+ -- skip and unmap filtered recipes
+ if (location.IsFiltered) then
+
+ local vendor = RecipeRadar_RecipesTab_FindVendor(
+ location.Region, location.Vendor)
+ if (vendor.IsMapped) then
+ RecipeRadar_Maps_RemoveVendor(vendor)
+ end
+
+ else
+
+ RecipeRadar_row = RecipeRadar_row + 1
+ index = RecipeRadar_row - offset;
+
+ -- only do this if we're in the scroll frame's visible portion
+ if (index > 0 and index <= RECIPERADAR_VENDORS_DISPLAYED) then
+
+ local button = getglobal("RecipeRadarVendor" .. index)
+
+ -- turn off highlighting textures for these items
+ button:SetNormalTexture("")
+ getglobal("RecipeRadarVendor" .. index .. "Highlight"):SetTexture("")
+
+ -- basic drawing code
+ button:SetText(location.Region)
+ VendorNameDummyText:SetText(location.Region)
+ button:SetTextColor(
+ RecipeRadar_Colors.LightGray.r,
+ RecipeRadar_Colors.LightGray.g,
+ RecipeRadar_Colors.LightGray.b)
+ button:SetID(index)
+ button:Show()
+
+ -- drawing code for the little subtext field
+ local subtext = getglobal("RecipeRadarVendor" .. index .. "SubText")
+ local vendor = RecipeRadar_RecipesTab_FindVendor(
+ location.Region, location.Vendor)
+ local content = location.Vendor
+ if (vendor.Notes and vendor.Notes ~= "") then
+ content = content .. " - " ..
+ RecipeRadar_FormatVendorNote(vendor.Notes)
+ end
+ content = format(TEXT(PARENS_TEMPLATE), content)
+ subtext:SetText(content)
+ VendorNameDummySubText:SetText(content)
+ button.r = RecipeRadar_Teams[vendor.Team].Color.r
+ button.g = RecipeRadar_Teams[vendor.Team].Color.g
+ button.b = RecipeRadar_Teams[vendor.Team].Color.b
+ subtext:SetTextColor(
+ RecipeRadar_Teams[vendor.Team].Color.r,
+ RecipeRadar_Teams[vendor.Team].Color.g,
+ RecipeRadar_Teams[vendor.Team].Color.b)
+ subtext:SetPoint("LEFT", "RecipeRadarVendor" .. index .. "Text",
+ "RIGHT", 10, 0)
+ subtext:Show()
+
+ -- unset to indicate this is a vendor item for the tooltip stuff
+ button.Recipe = nil
+
+ -- show or hide the little mapped indicator check mark
+ local check = getglobal("RecipeRadarVendor" .. index .. "Check")
+ if (vendor.IsMapped) then
+ local check_offset = VendorNameDummyText:GetWidth() + 42
+ check_offset = check_offset + VendorNameDummySubText:GetWidth()
+ check:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index, "TOPLEFT",
+ check_offset, 0)
+ check:Show()
+ else
+ check:Hide()
+ end
+
+ -- selected recipes look a little bit different
+ if (RecipeRadarRecipesTabFrame.SelectedLocation == location.Region and
+ RecipeRadarRecipesTabFrame.SelectedRecipe == recipe and
+ RecipeRadarRecipesTabFrame.SelectedVendor.Name == location.Vendor) then
+ RecipeRadarHighlightFrame:SetPoint("TOPLEFT",
+ "RecipeRadarVendor" .. index, "TOPLEFT", -2, 0)
+ RecipeRadarHighlightFrame:Show()
+ button:LockHighlight()
+ else
+ button:UnlockHighlight()
+ end
+
+ end
+
+ end
+
+ end
+
+end
+
+-- Handles a vendor/recipe button click in the main scroll frame. The
+-- supplied index is row + offset in the scroll frame. index may also
+-- be set to -1 to select the first visible recipe.
+function RecipeRadar_RecipesTab_ServiceClickIndex(index, button)
+
+ local prof = RecipeRadar_Options.CurrentProfession
+
+ if (not button) then button = "LeftButton" end
+
+ -- save this index so we can return to it on tab switch
+ RecipeRadarRecipesTabFrame.SelectedIndex = index
+
+ -- sort the recipes so we're counting in the right order
+ RecipeRadar_SortRecipes(RecipeRadar_RecipeData[prof])
+ local row = 0
+
+ -- iterate through each recipe, counting up to index
+ for _, recipe in RecipeRadar_RecipeData[prof].Recipes do
+
+ -- if this recipe is filtered, it does not count towards our index
+ if (not RecipeRadar_IsRecipeFiltered(recipe) and
+ RecipeRadar_RecipeHasLocations(recipe)) then
+
+ row = row + 1
+
+ if (row == index) then
+
+ if (button == "LeftButton") then
+
+ RecipeRadar_RecipesTab_ToggleExpanded(recipe)
+ return
+
+ elseif (button == "RightButton") then
+
+ HideDropDownMenu(1)
+ RecipeRadar_ContextMenuGlobal.Recipe = recipe
+ RecipeRadar_ContextMenuGlobal.Location = nil
+ RecipeRadar_RecipesTab_ContextMenuOnLoad()
+ ToggleDropDownMenu(1, nil, RecipesTabDropDown,
+ this:GetName(), GetCursorPosition(), 0)
+ return
+
+ end
+
+ end
+
+ if (recipe.IsExpanded) then
+
+ -- sort the locations so we're counting in the right order
+ RecipeRadar_SortLocations(recipe)
+ local vendor_index = row
+
+ -- iterate through each recipe, counting up to index
+ for _, location in recipe.Locations do
+
+ if (not location.IsFiltered) then
+
+ row = row + 1
+
+ -- if index is -1, this catches on the first iteration
+ if (row == index or index == -1) then
+
+ if (button == "LeftButton") then
+
+ local vendor = RecipeRadar_RecipesTab_FindVendor(
+ location.Region, location.Vendor)
+
+ -- if the shift key is down, (un)map this vendor
+ if (IsShiftKeyDown()) then
+ if (vendor.IsMapped) then
+ RecipeRadar_Maps_RemoveVendor(vendor)
+ else
+ RecipeRadar_Maps_AddVendor(vendor, location.Region)
+ end
+ end
+
+ -- select this location and show its details
+ RecipeRadarRecipesTabFrame.SelectedVendor = vendor
+ RecipeRadarRecipesTabFrame.SelectedRecipe = recipe
+ RecipeRadarRecipesTabFrame.SelectedLocation =
+ location.Region
+ RecipeRadar_SetSelection(vendor, recipe, location.Region)
+ RecipeRadar_ShowRecipeDetails()
+ return
+
+ elseif (button == "RightButton") then
+
+ HideDropDownMenu(1)
+ RecipeRadar_ContextMenuGlobal.Recipe = recipe
+ RecipeRadar_ContextMenuGlobal.Location = location
+ RecipeRadar_RecipesTab_ContextMenuOnLoad()
+ ToggleDropDownMenu(1, nil, RecipesTabDropDown,
+ this:GetName(), GetCursorPosition(), 0)
+ return
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ end
+
+ -- if the index was not found, select nothing
+ RecipeRadar_RecipesTab_ClearSelection()
+ RecipeRadar_HideRecipeDetails()
+
+end
+
+function RecipeRadar_RecipesTab_ToggleExpanded(recipe)
+
+ if (recipe.IsExpanded) then
+ recipe.IsExpanded = false
+ else
+ recipe.IsExpanded = true
+ end
+ RecipeRadar_RecipesTab_ClearSelection()
+ RecipeRadar_FrameUpdate()
+
+end
+
+-- Retrieves a vendor's info table from her name and region.
+function RecipeRadar_RecipesTab_FindVendor(region_name, vendor_name)
+
+ local region_data = RecipeRadar_RegionData[region_name]
+ if (not region_data) then return end
+
+ for _, vendor in region_data.Vendors do
+ if (vendor.Name == vendor_name) then
+ return vendor
+ end
+ end
+
+ return nil
+
+end
+
+function RecipeRadar_RecipesTab_ClearSelection()
+
+ RecipeRadarRecipesTabFrame.SelectedVendor = nil
+ RecipeRadarRecipesTabFrame.SelectedRecipe = nil
+ RecipeRadarRecipesTabFrame.SelectedLocation = nil
+
+end
+
+-- OnLoad event handler for the right-click context menu for map buttons.
+function RecipeRadar_RecipesTab_ContextMenuOnLoad()
+
+ UIDropDownMenu_Initialize(RecipesTabDropDown,
+ RecipeRadar_RecipesTab_ContextMenuInit, "MENU")
+
+end
+
+-- Initialization routine for the right-click context menu for map buttons.
+function RecipeRadar_RecipesTab_ContextMenuInit()
+
+ if (not RecipeRadar_ContextMenuGlobal.Recipe) then return end
+
+ if (RecipeRadar_ContextMenuGlobal.Location) then
+
+ local vendor = RecipeRadar_RecipesTab_FindVendor(
+ RecipeRadar_ContextMenuGlobal.Location.Region,
+ RecipeRadar_ContextMenuGlobal.Location.Vendor)
+
+ -- putting in the vendor's name as the title of the popup
+ local item = { }
+ item.text = RecipeRadar_ContextMenuGlobal.Location.Vendor
+ item.isTitle = 1
+ item.notCheckable = 1
+ UIDropDownMenu_AddButton(item)
+
+ item = { }
+ if (vendor.IsMapped) then
+ item.text = RRS("Unmap Vendor")
+ item.value = "unmap"
+ else
+ item.text = RRS("Map Vendor")
+ item.value = "map"
+ end
+ item.notCheckable = 1
+ item.func = RecipeRadar_RecipesTab_ContextMenuOnClick
+ UIDropDownMenu_AddButton(item)
+
+ end
+
+ item = { }
+ item.text = RRS("Expand All")
+ item.value = "expandall"
+ item.notCheckable = 1
+ item.func = RecipeRadar_RecipesTab_ContextMenuOnClick
+ if (not RecipeRadar_ContextMenuGlobal.RecipesTabHasCollapsed) then
+ item.disabled = 1
+ end
+ UIDropDownMenu_AddButton(item)
+
+ item = { }
+ item.text = RRS("Collapse All")
+ item.value = "collapseall"
+ item.notCheckable = 1
+ item.func = RecipeRadar_RecipesTab_ContextMenuOnClick
+ if (not RecipeRadar_ContextMenuGlobal.RecipesTabHasExpanded) then
+ item.disabled = 1
+ end
+ UIDropDownMenu_AddButton(item)
+
+ item = { }
+ item.text = CANCEL
+ item.notCheckable = 1
+ item.func = RecipeRadar_RecipesTab_ContextMenuOnClick
+ UIDropDownMenu_AddButton(item)
+
+end
+
+-- OnClick event handler for the right-click context menu for map buttons.
+function RecipeRadar_RecipesTab_ContextMenuOnClick()
+
+ if (RecipeRadar_ContextMenuGlobal.Location) then
+
+ local vendor = RecipeRadar_RecipesTab_FindVendor(
+ RecipeRadar_ContextMenuGlobal.Location.Region,
+ RecipeRadar_ContextMenuGlobal.Location.Vendor)
+
+ if (this.value == "unmap") then
+ RecipeRadar_Maps_RemoveVendor(vendor)
+ RecipeRadar_FrameUpdate()
+
+ elseif (this.value == "map") then
+ RecipeRadar_Maps_AddVendor(vendor,
+ RecipeRadar_ContextMenuGlobal.Location.Region)
+ RecipeRadar_FrameUpdate()
+ end
+
+ end
+
+ if (this.value == "expandall") then
+ RecipeRadar_RecipesTab_ExpandAll(true)
+
+ elseif (this.value == "collapseall") then
+ RecipeRadar_RecipesTab_ExpandAll(false)
+ end
+
+end
diff --git a/RecipeRadar/RegionData.lua b/RecipeRadar/RegionData.lua
new file mode 100644
index 0000000..37cd842
--- /dev/null
+++ b/RecipeRadar/RegionData.lua
@@ -0,0 +1,3055 @@
+
+-- RegionData.lua: all recipes organized by region
+-- Auto generated on 9/18/2006 12:35:42 PM
+
+RecipeRadar_RegionData = {
+
+
+[RRS("Stormwind City")] = {
+ IsCity = true,
+ Continent = 2,
+ MapFile = "Stormwind-City",
+ MapScale = 0.03819701270887,
+ MapOffset = { x = 0.41531450060561, y = 0.67097280492581 },
+ Vendors = {
+ {
+ Name = RRS("Alexandra Bolero"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.434, y = 0.739 },
+ },
+ Recipes = {
+ { ID = 6274, Type = RRS("Tailoring"), Skill = 100, Cost = 400 },
+ { ID = 10325, Type = RRS("Tailoring"), Skill = 250, Cost = 10000 },
+ },
+ },
+ {
+ Name = RRS("Catherine Leland"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.458, y = 0.585 },
+ },
+ Recipes = {
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 6330, Type = RRS("Cooking"), Skill = 100, Cost = 1200 },
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ },
+ },
+ {
+ Name = RRS("Darian Singh"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.297, y = 0.677 },
+ },
+ Recipes = {
+ { ID = 18649, Type = RRS("Engineering"), Skill = 150, Cost = 1800 },
+ },
+ },
+ {
+ Name = RRS("Jessara Cordell"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.436, y = 0.642 },
+ },
+ Recipes = {
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Kaita Deepforge"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.564, y = 0.173 },
+ },
+ Recipes = {
+ { ID = 12162, Type = RRS("Blacksmithing"), Skill = 160, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Kendor Kabonka"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.746, y = 0.37 },
+ },
+ Recipes = {
+ { ID = 2889, Type = RRS("Cooking"), Skill = 25, Cost = 240 },
+ { ID = 3679, Type = RRS("Cooking"), Skill = 60, Cost = 400 },
+ { ID = 2698, Type = RRS("Cooking"), Skill = 85, Cost = 400 },
+ { ID = 3681, Type = RRS("Cooking"), Skill = 120, Cost = 1600 },
+ { ID = 3678, Type = RRS("Cooking"), Skill = 80, Cost = 400 },
+ { ID = 3682, Type = RRS("Cooking"), Skill = 130, Cost = 1600 },
+ { ID = 3683, Type = RRS("Cooking"), Skill = 110, Cost = 1600 },
+ { ID = 2697, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 3680, Type = RRS("Cooking"), Skill = 90, Cost = 1600 },
+ { ID = 2699, Type = RRS("Cooking"), Skill = 100, Cost = 800 },
+ { ID = 2701, Type = RRS("Cooking"), Skill = 100, Cost = 1600 },
+ { ID = 2700, Type = RRS("Cooking"), Skill = 110, Cost = 400 },
+ { ID = 728, Type = RRS("Cooking"), Skill = 75, Cost = 200 },
+ },
+ },
+ {
+ Name = RRS("Khole Jinglepocket"),
+ Team = "Alliance",
+ Notes = RRS("Seasonal"),
+ Coordinates = {
+ { x = 0.555, y = 0.601 },
+ },
+ Recipes = {
+ { ID = 17201, Type = RRS("Cooking"), Skill = 35, Cost = 240 },
+ { ID = 17200, Type = RRS("Cooking"), Skill = 1, Cost = 25 },
+ },
+ },
+ {
+ Name = RRS("Maria Lumere"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.459, y = 0.783 },
+ },
+ Recipes = {
+ { ID = 9301, Type = RRS("Alchemy"), Skill = 250, Cost = 10000 },
+ },
+ },
+ {
+ Name = RRS("Erika Tate"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.76, y = 0.372 },
+ },
+ Recipes = {
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Redridge Mountains")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Redridge-Mountains",
+ MapScale = 0.06170112311456,
+ MapOffset = { x = 0.49917278340928, y = 0.68359285304999 },
+ Vendors = {
+ {
+ Name = RRS("Amy Davenport"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.291, y = 0.473 },
+ },
+ Recipes = {
+ { ID = 20576, Type = RRS("Leatherworking"), Skill = 100, Cost = 350 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ {
+ Name = RRS("Clyde Ranthal"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.885, y = 0.701 },
+ },
+ Recipes = {
+ { ID = 7289, Type = RRS("Leatherworking"), Skill = 100, Cost = 650 },
+ },
+ },
+ {
+ Name = RRS("Gloria Femmel"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.266, y = 0.435 },
+ },
+ Recipes = {
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Arathi Highlands")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Arathi-Highlands",
+ MapScale = 0.10227310921644,
+ MapOffset = { x = 0.47916793249546, y = 0.32386170078419 },
+ Vendors = {
+ {
+ Name = RRS("Androd Fadran"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.451, y = 0.469 },
+ },
+ Recipes = {
+ { ID = 13288, Type = RRS("Leatherworking"), Skill = 165, Cost = 2500 },
+ },
+ },
+ {
+ Name = RRS("Deneb Walker"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.27, y = 0.588 },
+ },
+ Recipes = {
+ { ID = 16084, Type = RRS("First Aid"), Skill = 125, Cost = 10000 },
+ { ID = 16112, Type = RRS("First Aid"), Skill = 180, Cost = 2200 },
+ { ID = 16113, Type = RRS("First Aid"), Skill = 210, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Drovnar Strongbrew"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.463, y = 0.47 },
+ },
+ Recipes = {
+ { ID = 6056, Type = RRS("Alchemy"), Skill = 190, Cost = 2000 },
+ },
+ },
+ {
+ Name = RRS("Hammon Karwn"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.467, y = 0.475 },
+ },
+ Recipes = {
+ { ID = 5973, Type = RRS("Leatherworking"), Skill = 170, Cost = 650 },
+ { ID = 12228, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Jannos Ironwill"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.459, y = 0.475 },
+ },
+ Recipes = {
+ { ID = 10858, Type = RRS("Blacksmithing"), Skill = 155, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Narj Deepslice"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.455, y = 0.475 },
+ },
+ Recipes = {
+ { ID = 4609, Type = RRS("Cooking"), Skill = 175, Cost = 1000 },
+ },
+ },
+ {
+ Name = RRS("Jun'ha"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.73, y = 0.361 },
+ },
+ Recipes = {
+ { ID = 7089, Type = RRS("Tailoring"), Skill = 175, Cost = 1500 },
+ },
+ },
+ {
+ Name = RRS("Keena"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.738, y = 0.326 },
+ },
+ Recipes = {
+ { ID = 11163, Type = RRS("Enchanting"), Skill = 170, Cost = 3000 },
+ { ID = 5973, Type = RRS("Leatherworking"), Skill = 170, Cost = 650 },
+ { ID = 3682, Type = RRS("Cooking"), Skill = 130, Cost = 1600 },
+ { ID = 12228, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Tunkk"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.742, y = 0.346 },
+ },
+ Recipes = {
+ { ID = 13287, Type = RRS("Leatherworking"), Skill = 165, Cost = 2500 },
+ },
+ },
+ },
+},
+
+[RRS("Azshara")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Azshara",
+ MapScale = 0.13779501505279,
+ MapOffset = { x = 0.55282036918049, y = 0.30400571307545 },
+ Vendors = {
+ {
+ Name = RRS("Blimo Gadgetspring"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.455, y = 0.897 },
+ },
+ Recipes = {
+ { ID = 15751, Type = RRS("Leatherworking"), Skill = 285, Cost = 20000, Specialty = RRS("Dragonscale Leatherworking") },
+ { ID = 15729, Type = RRS("Leatherworking"), Skill = 265, Cost = 12000, Specialty = RRS("Tribal Leatherworking") },
+ },
+ },
+ {
+ Name = RRS("Jubie Gadgetspring"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.453, y = 0.91 },
+ },
+ Recipes = {
+ { ID = 10607, Type = RRS("Engineering"), Skill = 230, Cost = 3600 },
+ },
+ },
+ },
+},
+
+[RRS("Ironforge")] = {
+ IsCity = true,
+ Continent = 2,
+ MapFile = "Ironforge",
+ MapScale = 0.02248317426784,
+ MapOffset = { x = 0.47481923366335, y = 0.51289242617182 },
+ Vendors = {
+ {
+ Name = RRS("Bombus Finespindle"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.395, y = 0.343 },
+ },
+ Recipes = {
+ { ID = 18731, Type = RRS("Leatherworking"), Skill = 150, Cost = 2000 },
+ },
+ },
+ {
+ Name = RRS("Gearcutter Cogspinner"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.68, y = 0.434 },
+ },
+ Recipes = {
+ { ID = 18649, Type = RRS("Engineering"), Skill = 150, Cost = 1800 },
+ { ID = 7560, Type = RRS("Engineering"), Skill = 125, Cost = 1200 },
+ { ID = 16041, Type = RRS("Engineering"), Skill = 260, Cost = 12000 },
+ { ID = 16042, Type = RRS("Engineering"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Outfitter Eric"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.432, y = 0.287 },
+ },
+ Recipes = {
+ { ID = 10314, Type = RRS("Tailoring"), Skill = 230, Cost = 4000 },
+ { ID = 10317, Type = RRS("Tailoring"), Skill = 235, Cost = 4000 },
+ { ID = 10326, Type = RRS("Tailoring"), Skill = 250, Cost = 5000 },
+ { ID = 10323, Type = RRS("Tailoring"), Skill = 245, Cost = 4500 },
+ { ID = 10321, Type = RRS("Tailoring"), Skill = 240, Cost = 4500 },
+ },
+ },
+ {
+ Name = RRS("Soolie Berryfizz"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.668, y = 0.551 },
+ },
+ Recipes = {
+ { ID = 13478, Type = RRS("Alchemy"), Skill = 265, Cost = 13000 },
+ { ID = 5642, Type = RRS("Alchemy"), Skill = 150, Cost = 1800 },
+ },
+ },
+ {
+ Name = RRS("Tansy Puddlefizz"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.479, y = 0.059 },
+ },
+ Recipes = {
+ { ID = 6328, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6326, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ },
+ },
+ {
+ Name = RRS("Tilli Thistlefuzz"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.609, y = 0.443 },
+ },
+ Recipes = {
+ { ID = 6349, Type = RRS("Enchanting"), Skill = 100, Cost = 500 },
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Wulmort Jinglepocket"),
+ Team = "Alliance",
+ Notes = RRS("Seasonal"),
+ Coordinates = {
+ { x = 0.332, y = 0.666 },
+ },
+ Recipes = {
+ { ID = 17201, Type = RRS("Cooking"), Skill = 35, Cost = 240 },
+ { ID = 17200, Type = RRS("Cooking"), Skill = 1, Cost = 25 },
+ },
+ },
+ {
+ Name = RRS("Emrul Riknussun"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.602, y = 0.378 },
+ },
+ Recipes = {
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Feralas")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Feralas",
+ MapScale = 0.18885970960818,
+ MapOffset = { x = 0.31589651244686, y = 0.61820581746798 },
+ Vendors = {
+ {
+ Name = RRS("Brienna Starglow"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.891, y = 0.46 },
+ },
+ Recipes = {
+ { ID = 7089, Type = RRS("Tailoring"), Skill = 175, Cost = 1500 },
+ },
+ },
+ {
+ Name = RRS("Logannas"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.327, y = 0.44 },
+ },
+ Recipes = {
+ { ID = 9302, Type = RRS("Alchemy"), Skill = 245, Cost = 9000 },
+ { ID = 6057, Type = RRS("Alchemy"), Skill = 190, Cost = 2000 },
+ },
+ },
+ {
+ Name = RRS("Pratt McGrubben"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.303, y = 0.422 },
+ },
+ Recipes = {
+ { ID = 7451, Type = RRS("Leatherworking"), Skill = 190, Cost = 2800 },
+ { ID = 15734, Type = RRS("Leatherworking"), Skill = 270, Cost = 14000, Specialty = RRS("Elemental Leatherworking") },
+ { ID = 8385, Type = RRS("Leatherworking"), Skill = 205, Cost = 3500 },
+ },
+ },
+ {
+ Name = RRS("Vivianna"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.314, y = 0.434 },
+ },
+ Recipes = {
+ { ID = 13949, Type = RRS("Cooking"), Skill = 275, Cost = 20000 },
+ { ID = 12229, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 13947, Type = RRS("Cooking"), Skill = 275, Cost = 20000 },
+ { ID = 13948, Type = RRS("Cooking"), Skill = 275, Cost = 20000 },
+ },
+ },
+ {
+ Name = RRS("Bronk"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.758, y = 0.431 },
+ },
+ Recipes = {
+ { ID = 9302, Type = RRS("Alchemy"), Skill = 245, Cost = 9000 },
+ { ID = 6057, Type = RRS("Alchemy"), Skill = 190, Cost = 2000 },
+ },
+ },
+ {
+ Name = RRS("Jangdor Swiftstrider"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.744, y = 0.428 },
+ },
+ Recipes = {
+ { ID = 7451, Type = RRS("Leatherworking"), Skill = 190, Cost = 2800 },
+ { ID = 15734, Type = RRS("Leatherworking"), Skill = 270, Cost = 14000, Specialty = RRS("Elemental Leatherworking") },
+ { ID = 8409, Type = RRS("Leatherworking"), Skill = 210, Cost = 4000 },
+ { ID = 8385, Type = RRS("Leatherworking"), Skill = 205, Cost = 3500 },
+ },
+ },
+ {
+ Name = RRS("Sheendra Tallgrass"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.744, y = 0.425 },
+ },
+ Recipes = {
+ { ID = 13949, Type = RRS("Cooking"), Skill = 275, Cost = 20000 },
+ { ID = 12229, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 13947, Type = RRS("Cooking"), Skill = 275, Cost = 20000 },
+ { ID = 13948, Type = RRS("Cooking"), Skill = 275, Cost = 20000 },
+ },
+ },
+ {
+ Name = RRS("Worb Strongstitch"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.742, y = 0.425 },
+ },
+ Recipes = {
+ { ID = 8409, Type = RRS("Leatherworking"), Skill = 210, Cost = 4000 },
+ },
+ },
+ {
+ Name = RRS("Zorbin Fandazzle"),
+ Team = "Neutral",
+ Notes = RRS("Quest"),
+ Coordinates = {
+ { x = 0.445, y = 0.434 },
+ },
+ Recipes = {
+ { ID = 19027, Type = RRS("Engineering"), Skill = 250, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Stranglethorn Vale")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Stranglethorn-Vale",
+ MapScale = 0.18128603034401,
+ MapOffset = { x = 0.39145470225916, y = 0.79412224886668 },
+ Vendors = {
+ {
+ Name = RRS("Corporal Bluth"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.38, y = 0.03 },
+ },
+ Recipes = {
+ { ID = 12231, Type = RRS("Cooking"), Skill = 175, Cost = 3000 },
+ { ID = 12228, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Nerrist"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.324, y = 0.287 },
+ },
+ Recipes = {
+ { ID = 3682, Type = RRS("Cooking"), Skill = 130, Cost = 1600 },
+ { ID = 12231, Type = RRS("Cooking"), Skill = 175, Cost = 3000 },
+ { ID = 12228, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Uthok"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.314, y = 0.282 },
+ },
+ Recipes = {
+ { ID = 16111, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Vharr"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.322, y = 0.287 },
+ },
+ Recipes = {
+ { ID = 12164, Type = RRS("Blacksmithing"), Skill = 185, Cost = 4400 },
+ },
+ },
+ {
+ Name = RRS("Blixrez Goodstitch"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.281, y = 0.771 },
+ },
+ Recipes = {
+ { ID = 5789, Type = RRS("Leatherworking"), Skill = 190, Cost = 2800 },
+ { ID = 5788, Type = RRS("Leatherworking"), Skill = 170, Cost = 650 },
+ },
+ },
+ {
+ Name = RRS("Cowardly Crosby"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.27, y = 0.825 },
+ },
+ Recipes = {
+ { ID = 10318, Type = RRS("Tailoring"), Skill = 240, Cost = 7000 },
+ },
+ },
+ {
+ Name = RRS("Crazk Sparks"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.283, y = 0.765 },
+ },
+ Recipes = {
+ { ID = 18648, Type = RRS("Engineering"), Skill = 150, Cost = 1800 },
+ },
+ },
+ {
+ Name = RRS("Glyx Brewright"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.283, y = 0.771 },
+ },
+ Recipes = {
+ { ID = 6056, Type = RRS("Alchemy"), Skill = 190, Cost = 2000 },
+ { ID = 6057, Type = RRS("Alchemy"), Skill = 190, Cost = 2000 },
+ },
+ },
+ {
+ Name = RRS("Gnaz Blunderflame"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.512, y = 0.352 },
+ },
+ Recipes = {
+ { ID = 13311, Type = RRS("Engineering"), Skill = 200, Cost = 10000 },
+ },
+ },
+ {
+ Name = RRS("Jaquilina Dramet"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.357, y = 0.111 },
+ },
+ Recipes = {
+ { ID = 12164, Type = RRS("Blacksmithing"), Skill = 185, Cost = 4400 },
+ },
+ },
+ {
+ Name = RRS("Jutak"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.273, y = 0.774 },
+ },
+ Recipes = {
+ { ID = 12162, Type = RRS("Blacksmithing"), Skill = 160, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Kelsey Yance"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.282, y = 0.743 },
+ },
+ Recipes = {
+ { ID = 13940, Type = RRS("Cooking"), Skill = 225, Cost = 16000 },
+ { ID = 13941, Type = RRS("Cooking"), Skill = 225, Cost = 16000 },
+ { ID = 6039, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 13943, Type = RRS("Cooking"), Skill = 240, Cost = 16000 },
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Knaz Blunderflame"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.512, y = 0.352 },
+ },
+ Recipes = {
+ { ID = 10602, Type = RRS("Engineering"), Skill = 210, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Mazk Snipeshot"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.285, y = 0.751 },
+ },
+ Recipes = {
+ { ID = 13310, Type = RRS("Engineering"), Skill = 180, Cost = 2000 },
+ { ID = 18651, Type = RRS("Engineering"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Narkk"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.283, y = 0.742 },
+ },
+ Recipes = {
+ { ID = 10728, Type = RRS("Tailoring"), Skill = 200, Cost = 1500 },
+ },
+ },
+ {
+ Name = RRS("Old Man Heming"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.274, y = 0.772 },
+ },
+ Recipes = {
+ { ID = 16083, Type = RRS("Fishing"), Skill = 125, Cost = 10000 },
+ },
+ },
+ {
+ Name = RRS("Rikqiz"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.283, y = 0.757 },
+ },
+ Recipes = {
+ { ID = 14635, Type = RRS("Leatherworking"), Skill = 185, Cost = 3000 },
+ { ID = 18239, Type = RRS("Leatherworking"), Skill = 200, Cost = 3500 },
+ },
+ },
+ {
+ Name = RRS("Rin'wosho the Trader"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.151, y = 0.16 },
+ },
+ Recipes = {
+ { ID = 20013, Type = RRS("Alchemy"), Skill = 285, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 8 },
+ { ID = 20011, Type = RRS("Alchemy"), Skill = 275, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 7 },
+ { ID = 20014, Type = RRS("Alchemy"), Skill = 290, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 6 },
+ { ID = 20012, Type = RRS("Alchemy"), Skill = 275, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 5 },
+ { ID = 19781, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 5 },
+ { ID = 19780, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 6 },
+ { ID = 19779, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 7 },
+ { ID = 19778, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 5 },
+ { ID = 19777, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 6 },
+ { ID = 19776, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 7 },
+ { ID = 20756, Type = RRS("Enchanting"), Skill = 300, Cost = 40000, Faction = RRS("Zandalar Tribe"), Level = 6 },
+ { ID = 20001, Type = RRS("Engineering"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 5 },
+ { ID = 20000, Type = RRS("Engineering"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 6 },
+ { ID = 19771, Type = RRS("Leatherworking"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 5 },
+ { ID = 19773, Type = RRS("Leatherworking"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 6 },
+ { ID = 19770, Type = RRS("Leatherworking"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 6 },
+ { ID = 19772, Type = RRS("Leatherworking"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 7 },
+ { ID = 19769, Type = RRS("Leatherworking"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 7 },
+ { ID = 19766, Type = RRS("Tailoring"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 5 },
+ { ID = 19765, Type = RRS("Tailoring"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 6 },
+ { ID = 19764, Type = RRS("Tailoring"), Skill = 300, Cost = 50000, Faction = RRS("Zandalar Tribe"), Level = 7 },
+ { ID = 20757, Type = RRS("Enchanting"), Skill = 300, Cost = 40000, Faction = RRS("Zandalar Tribe"), Level = 5 },
+ },
+ },
+ {
+ Name = RRS("Xizk Goodstitch"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.283, y = 0.762 },
+ },
+ Recipes = {
+ { ID = 7087, Type = RRS("Tailoring"), Skill = 180, Cost = 1200 },
+ { ID = 14630, Type = RRS("Tailoring"), Skill = 165, Cost = 1000 },
+ },
+ },
+ {
+ Name = RRS("Zarena Cromwind"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.285, y = 0.754 },
+ },
+ Recipes = {
+ { ID = 12163, Type = RRS("Blacksmithing"), Skill = 180, Cost = 4400 },
+ },
+ },
+ },
+},
+
+[RRS("Ashenvale")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Ashenvale",
+ MapScale = 0.15670371525706,
+ MapOffset = { x = 0.41757282062541, y = 0.33126468682991 },
+ Vendors = {
+ {
+ Name = RRS("Dalria"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.361, y = 0.516 },
+ },
+ Recipes = {
+ { ID = 11101, Type = RRS("Enchanting"), Skill = 140, Cost = 2500 },
+ { ID = 11039, Type = RRS("Enchanting"), Skill = 110, Cost = 800 },
+ },
+ },
+ {
+ Name = RRS("Harklan Moongrove"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.51, y = 0.67 },
+ },
+ Recipes = {
+ { ID = 6054, Type = RRS("Alchemy"), Skill = 135, Cost = 900 },
+ },
+ },
+ {
+ Name = RRS("Harlown Darkweave"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.184, y = 0.592 },
+ },
+ Recipes = {
+ { ID = 7361, Type = RRS("Leatherworking"), Skill = 135, Cost = 1800 },
+ },
+ },
+ {
+ Name = RRS("Lardan"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.344, y = 0.493 },
+ },
+ Recipes = {
+ { ID = 5973, Type = RRS("Leatherworking"), Skill = 170, Cost = 650 },
+ },
+ },
+ {
+ Name = RRS("Shandrina"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.495, y = 0.671 },
+ },
+ Recipes = {
+ { ID = 16072, Type = RRS("Cooking"), Skill = 125, Cost = 10000 },
+ },
+ },
+ {
+ Name = RRS("Ulthaan"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.5, y = 0.666 },
+ },
+ Recipes = {
+ { ID = 3734, Type = RRS("Cooking"), Skill = 110, Cost = 1600 },
+ { ID = 5489, Type = RRS("Cooking"), Skill = 110, Cost = 1200 },
+ },
+ },
+ {
+ Name = RRS("Wik'Tar"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.121, y = 0.34 },
+ },
+ Recipes = {
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ },
+ },
+ },
+},
+
+[RRS("Duskwood")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Duskwood",
+ MapScale = 0.07670475476181,
+ MapOffset = { x = 0.43087243362495, y = 0.73224350550454 },
+ Vendors = {
+ {
+ Name = RRS("Danielle Zipstitch"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.759, y = 0.456 },
+ },
+ Recipes = {
+ { ID = 14627, Type = RRS("Tailoring"), Skill = 135, Cost = 800 },
+ },
+ },
+ {
+ Name = RRS("Sheri Zipstitch"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.757, y = 0.456 },
+ },
+ Recipes = {
+ { ID = 6401, Type = RRS("Tailoring"), Skill = 155, Cost = 1100 },
+ { ID = 6275, Type = RRS("Tailoring"), Skill = 115, Cost = 800 },
+ },
+ },
+ {
+ Name = RRS("Bliztik"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.18, y = 0.543 },
+ },
+ Recipes = {
+ { ID = 6068, Type = RRS("Alchemy"), Skill = 165, Cost = 1500 },
+ },
+ },
+ {
+ Name = RRS("Kzixx"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.811, y = 0.205 },
+ },
+ Recipes = {
+ { ID = 6053, Type = RRS("Alchemy"), Skill = 100, Cost = 800 },
+ { ID = 7561, Type = RRS("Engineering"), Skill = 165, Cost = 2000 },
+ },
+ },
+ },
+},
+
+[RRS("Westfall")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Westfall",
+ MapScale = 0.09943208435841,
+ MapOffset = { x = 0.36884571674582, y = 0.71874918595783 },
+ Vendors = {
+ {
+ Name = RRS("Defias Profiteer"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.436, y = 0.677 },
+ },
+ Recipes = {
+ { ID = 5640, Type = RRS("Alchemy"), Skill = 60, Cost = 100 },
+ },
+ },
+ {
+ Name = RRS("Gina MacGregor"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.572, y = 0.54 },
+ },
+ Recipes = {
+ { ID = 5786, Type = RRS("Leatherworking"), Skill = 90, Cost = 550 },
+ { ID = 5787, Type = RRS("Leatherworking"), Skill = 95, Cost = 600 },
+ { ID = 6274, Type = RRS("Tailoring"), Skill = 100, Cost = 400 },
+ { ID = 5771, Type = RRS("Tailoring"), Skill = 70, Cost = 200 },
+ },
+ },
+ {
+ Name = RRS("Kriggon Talsone"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.365, y = 0.891 },
+ },
+ Recipes = {
+ { ID = 5528, Type = RRS("Cooking"), Skill = 90, Cost = 800 },
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6326, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 16111, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ },
+},
+
+[RRS("Loch Modan")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Loch-Modan",
+ MapScale = 0.07839152145224,
+ MapOffset = { x = 0.51118749188138, y = 0.50940913489577 },
+ Vendors = {
+ {
+ Name = RRS("Drac Roughcut"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.356, y = 0.491 },
+ },
+ Recipes = {
+ { ID = 6892, Type = RRS("Cooking"), Skill = 40, Cost = 250 },
+ },
+ },
+ {
+ Name = RRS("Rann Flamespinner"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.359, y = 0.46 },
+ },
+ Recipes = {
+ { ID = 6275, Type = RRS("Tailoring"), Skill = 115, Cost = 800 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ {
+ Name = RRS("Khara Deepwater"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.402, y = 0.393 },
+ },
+ Recipes = {
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 6329, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6328, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ },
+ },
+ {
+ Name = RRS("Xandar Goodbeard"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.826, y = 0.633 },
+ },
+ Recipes = {
+ { ID = 6053, Type = RRS("Alchemy"), Skill = 100, Cost = 800 },
+ { ID = 5640, Type = RRS("Alchemy"), Skill = 60, Cost = 100 },
+ },
+ },
+ },
+},
+
+[RRS("Elwynn Forest")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Elwynn-Forest",
+ MapScale = 0.09860350595046,
+ MapOffset = { x = 0.41092682316676, y = 0.65651531970162 },
+ Vendors = {
+ {
+ Name = RRS("Drake Lindgren"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.833, y = 0.667 },
+ },
+ Recipes = {
+ { ID = 6272, Type = RRS("Tailoring"), Skill = 70, Cost = 300 },
+ },
+ },
+ {
+ Name = RRS("Tharynn Bouden"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.418, y = 0.672 },
+ },
+ Recipes = {
+ { ID = 6270, Type = RRS("Tailoring"), Skill = 55, Cost = 200 },
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 6328, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ },
+ },
+ },
+},
+
+[RRS("Darnassus")] = {
+ IsCity = true,
+ Continent = 1,
+ MapFile = "Darnassus",
+ MapScale = 0.02876626176374,
+ MapOffset = { x = 0.38392150175204, y = 0.10441296545475 },
+ Vendors = {
+ {
+ Name = RRS("Elynna"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.643, y = 0.217 },
+ },
+ Recipes = {
+ { ID = 6272, Type = RRS("Tailoring"), Skill = 70, Cost = 300 },
+ { ID = 6275, Type = RRS("Tailoring"), Skill = 115, Cost = 800 },
+ { ID = 10311, Type = RRS("Tailoring"), Skill = 220, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Mythrin'dir"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.609, y = 0.176 },
+ },
+ Recipes = {
+ { ID = 11223, Type = RRS("Enchanting"), Skill = 235, Cost = 5800 },
+ { ID = 16217, Type = RRS("Enchanting"), Skill = 265, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Saenorion"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.633, y = 0.223 },
+ },
+ Recipes = {
+ { ID = 18949, Type = RRS("Leatherworking"), Skill = 155, Cost = 2000 },
+ { ID = 7451, Type = RRS("Leatherworking"), Skill = 190, Cost = 2800 },
+ },
+ },
+ {
+ Name = RRS("Ulthir"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.555, y = 0.243 },
+ },
+ Recipes = {
+ { ID = 5642, Type = RRS("Alchemy"), Skill = 150, Cost = 1800 },
+ { ID = 5643, Type = RRS("Alchemy"), Skill = 175, Cost = 2000 },
+ { ID = 13477, Type = RRS("Alchemy"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Vaean"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.58, y = 0.15 },
+ },
+ Recipes = {
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Fyldan"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.48, y = 0.211 },
+ },
+ Recipes = {
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ },
+ },
+ },
+},
+
+[RRS("Wetlands")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Wetlands",
+ MapScale = 0.11745423014662,
+ MapOffset = { x = 0.46561438951659, y = 0.40971063365152 },
+ Vendors = {
+ {
+ Name = RRS("Fradd Swiftgear"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.26, y = 0.255 },
+ },
+ Recipes = {
+ { ID = 13309, Type = RRS("Engineering"), Skill = 120, Cost = 1000 },
+ { ID = 14639, Type = RRS("Engineering"), Skill = 140, Cost = 1500 },
+ },
+ },
+ {
+ Name = RRS("Jennabink Powerseam"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.081, y = 0.558 },
+ },
+ Recipes = {
+ { ID = 6275, Type = RRS("Tailoring"), Skill = 115, Cost = 800 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ {
+ Name = RRS("Stuart Fleming"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.082, y = 0.584 },
+ },
+ Recipes = {
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ },
+ },
+ {
+ Name = RRS("Wenna Silkbeard"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.258, y = 0.255 },
+ },
+ Recipes = {
+ { ID = 7613, Type = RRS("Leatherworking"), Skill = 155, Cost = 2000 },
+ { ID = 7290, Type = RRS("Leatherworking"), Skill = 120, Cost = 1600 },
+ { ID = 7114, Type = RRS("Tailoring"), Skill = 145, Cost = 1000 },
+ },
+ },
+ },
+},
+
+[RRS("The Hinterlands")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "The-Hinterlands",
+ MapScale = 0.10937523495111,
+ MapOffset = { x = 0.49929119700867, y = 0.25567971676068 },
+ Vendors = {
+ {
+ Name = RRS("Gigget Zipcoil"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.346, y = 0.39 },
+ },
+ Recipes = {
+ { ID = 15735, Type = RRS("Leatherworking"), Skill = 270, Cost = 14000, Specialty = RRS("Tribal Leatherworking") },
+ },
+ },
+ {
+ Name = RRS("Harggan"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.135, y = 0.446 },
+ },
+ Recipes = {
+ { ID = 7995, Type = RRS("Blacksmithing"), Skill = 215, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Nioma"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.133, y = 0.434 },
+ },
+ Recipes = {
+ { ID = 8409, Type = RRS("Leatherworking"), Skill = 210, Cost = 4000 },
+ },
+ },
+ {
+ Name = RRS("Ruppo Zipcoil"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.344, y = 0.375 },
+ },
+ Recipes = {
+ { ID = 10609, Type = RRS("Engineering"), Skill = 250, Cost = 4000 },
+ },
+ },
+ {
+ Name = RRS("Truk Wildbeard"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.144, y = 0.423 },
+ },
+ Recipes = {
+ { ID = 18046, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Otho Moji'ko"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.795, y = 0.795 },
+ },
+ Recipes = {
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Dun Morogh")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Dun-Morogh",
+ MapScale = 0.13991525534426,
+ MapOffset = { x = 0.40335096278072, y = 0.48339696712179 },
+ Vendors = {
+ {
+ Name = RRS("Gretta Ganter"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.314, y = 0.443 },
+ },
+ Recipes = {
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ },
+ },
+ },
+},
+
+[RRS("Darkshore")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Darkshore",
+ MapScale = 0.17799008894522,
+ MapOffset = { x = 0.38383175154516, y = 0.18206216123156 },
+ Vendors = {
+ {
+ Name = RRS("Heldan Galesong"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.37, y = 0.563 },
+ },
+ Recipes = {
+ { ID = 5528, Type = RRS("Cooking"), Skill = 90, Cost = 800 },
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ },
+ },
+ {
+ Name = RRS("Laird"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.368, y = 0.443 },
+ },
+ Recipes = {
+ { ID = 5485, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ },
+ },
+ {
+ Name = RRS("Mavralyn"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.373, y = 0.411 },
+ },
+ Recipes = {
+ { ID = 5786, Type = RRS("Leatherworking"), Skill = 90, Cost = 550 },
+ { ID = 5787, Type = RRS("Leatherworking"), Skill = 95, Cost = 600 },
+ },
+ },
+ {
+ Name = RRS("Valdaron"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.377, y = 0.411 },
+ },
+ Recipes = {
+ { ID = 6270, Type = RRS("Tailoring"), Skill = 55, Cost = 200 },
+ { ID = 5771, Type = RRS("Tailoring"), Skill = 70, Cost = 200 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ },
+},
+
+[RRS("Dustwallow Marsh")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Dustwallow-Marsh",
+ MapScale = 0.14266384095509,
+ MapOffset = { x = 0.49026338351379, y = 0.60461876174686 },
+ Vendors = {
+ {
+ Name = RRS("Helenia Olden"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.664, y = 0.515 },
+ },
+ Recipes = {
+ { ID = 5789, Type = RRS("Leatherworking"), Skill = 190, Cost = 2800 },
+ { ID = 12239, Type = RRS("Cooking"), Skill = 200, Cost = 7000 },
+ { ID = 12233, Type = RRS("Cooking"), Skill = 175, Cost = 3000 },
+ { ID = 12228, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Balai Lok'Wein"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.361, y = 0.308 },
+ },
+ Recipes = {
+ { ID = 16084, Type = RRS("First Aid"), Skill = 125, Cost = 10000 },
+ { ID = 16112, Type = RRS("First Aid"), Skill = 180, Cost = 2200 },
+ { ID = 16113, Type = RRS("First Aid"), Skill = 210, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Ghok'kah"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.355, y = 0.311 },
+ },
+ Recipes = {
+ { ID = 4355, Type = RRS("Tailoring"), Skill = 200, Cost = 1500 },
+ { ID = 16084, Type = RRS("First Aid"), Skill = 125, Cost = 10000 },
+ { ID = 16112, Type = RRS("First Aid"), Skill = 180, Cost = 2200 },
+ { ID = 16113, Type = RRS("First Aid"), Skill = 210, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Ogg'marr"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.359, y = 0.308 },
+ },
+ Recipes = {
+ { ID = 12232, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 12239, Type = RRS("Cooking"), Skill = 200, Cost = 7000 },
+ { ID = 20075, Type = RRS("Cooking"), Skill = 150, Cost = 2000 },
+ { ID = 12228, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Desolace")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Desolace",
+ MapScale = 0.12219839120669,
+ MapOffset = { x = 0.34873187115693, y = 0.50331046935371 },
+ Vendors = {
+ {
+ Name = RRS("Janet Hommers"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.662, y = 0.066 },
+ },
+ Recipes = {
+ { ID = 12240, Type = RRS("Cooking"), Skill = 200, Cost = 7000 },
+ { ID = 12233, Type = RRS("Cooking"), Skill = 175, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Kireena"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.514, y = 0.537 },
+ },
+ Recipes = {
+ { ID = 7114, Type = RRS("Tailoring"), Skill = 145, Cost = 1000 },
+ { ID = 12232, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 12240, Type = RRS("Cooking"), Skill = 200, Cost = 7000 },
+ },
+ },
+ {
+ Name = RRS("Muuran"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.555, y = 0.563 },
+ },
+ Recipes = {
+ { ID = 10858, Type = RRS("Blacksmithing"), Skill = 155, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Wulan"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.266, y = 0.698 },
+ },
+ Recipes = {
+ { ID = 16072, Type = RRS("Cooking"), Skill = 125, Cost = 10000 },
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Super-Seller 680"),
+ Team = "Neutral",
+ Notes = RRS("Intermittent"),
+ Coordinates = {
+ { x = 0.405, y = 0.793 },
+ },
+ Recipes = {
+ { ID = 13310, Type = RRS("Engineering"), Skill = 180, Cost = 2000 },
+ { ID = 7561, Type = RRS("Engineering"), Skill = 165, Cost = 2000 },
+ { ID = 13308, Type = RRS("Engineering"), Skill = 155, Cost = 1800 },
+ { ID = 7087, Type = RRS("Tailoring"), Skill = 180, Cost = 1200 },
+ { ID = 6401, Type = RRS("Tailoring"), Skill = 155, Cost = 1100 },
+ { ID = 14630, Type = RRS("Tailoring"), Skill = 165, Cost = 1000 },
+ { ID = 4609, Type = RRS("Cooking"), Skill = 175, Cost = 1000 },
+ { ID = 3734, Type = RRS("Cooking"), Skill = 110, Cost = 1600 },
+ { ID = 12239, Type = RRS("Cooking"), Skill = 200, Cost = 7000 },
+ { ID = 12229, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 12227, Type = RRS("Cooking"), Skill = 125, Cost = 1600 },
+ { ID = 12233, Type = RRS("Cooking"), Skill = 175, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Vendor-Tron 1000"),
+ Team = "Neutral",
+ Notes = RRS("Intermittent"),
+ Coordinates = {
+ { x = 0.605, y = 0.378 },
+ },
+ Recipes = {
+ { ID = 5642, Type = RRS("Alchemy"), Skill = 150, Cost = 1800 },
+ { ID = 5643, Type = RRS("Alchemy"), Skill = 175, Cost = 2000 },
+ { ID = 14635, Type = RRS("Leatherworking"), Skill = 185, Cost = 3000 },
+ { ID = 7613, Type = RRS("Leatherworking"), Skill = 155, Cost = 2000 },
+ { ID = 7451, Type = RRS("Leatherworking"), Skill = 190, Cost = 2800 },
+ { ID = 12232, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 12240, Type = RRS("Cooking"), Skill = 200, Cost = 7000 },
+ { ID = 3735, Type = RRS("Cooking"), Skill = 125, Cost = 1800 },
+ { ID = 12231, Type = RRS("Cooking"), Skill = 175, Cost = 3000 },
+ { ID = 5489, Type = RRS("Cooking"), Skill = 110, Cost = 1200 },
+ { ID = 12228, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 5973, Type = RRS("Leatherworking"), Skill = 170, Cost = 650 },
+ },
+ },
+ },
+},
+
+[RRS("Western Plaguelands")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Western-Plaguelands",
+ MapScale = 0.12215946583965,
+ MapOffset = { x = 0.44270955019641, y = 0.17471356786018 },
+ Vendors = {
+ {
+ Name = RRS("Leonard Porter"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.431, y = 0.843 },
+ },
+ Recipes = {
+ { ID = 15741, Type = RRS("Leatherworking"), Skill = 275, Cost = 16000, Specialty = RRS("Elemental Leatherworking") },
+ { ID = 15725, Type = RRS("Leatherworking"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Argent Quartermaster Lightspark"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.428, y = 0.837 },
+ },
+ Recipes = {
+ { ID = 13482, Type = RRS("Alchemy"), Skill = 275, Cost = 15000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19203, Type = RRS("Blacksmithing"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19205, Type = RRS("Blacksmithing"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19447, Type = RRS("Enchanting"), Skill = 300, Cost = 60000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19446, Type = RRS("Enchanting"), Skill = 290, Cost = 30000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19328, Type = RRS("Leatherworking"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19329, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19216, Type = RRS("Tailoring"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19217, Type = RRS("Tailoring"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19442, Type = RRS("First Aid"), Skill = 300, Cost = 100000, Faction = RRS("Argent Dawn"), Level = 6 },
+ },
+ },
+ {
+ Name = RRS("Magnus Frostwake"),
+ Team = "Neutral",
+ Notes = RRS("Quest"),
+ Coordinates = {
+ { x = 0.678, y = 0.771 },
+ },
+ Recipes = {
+ { ID = 13501, Type = RRS("Alchemy"), Skill = 295, Cost = 30000 },
+ { ID = 13485, Type = RRS("Alchemy"), Skill = 275, Cost = 15000 },
+ { ID = 8030, Type = RRS("Blacksmithing"), Skill = 255, Cost = 10000 },
+ { ID = 12823, Type = RRS("Blacksmithing"), Skill = 280, Cost = 20000 },
+ { ID = 12819, Type = RRS("Blacksmithing"), Skill = 275, Cost = 16000 },
+ { ID = 12703, Type = RRS("Blacksmithing"), Skill = 295, Cost = 40000 },
+ },
+ },
+ },
+},
+
+[RRS("Hillsbrad Foothills")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Hillsbrad-Foothills",
+ MapScale = 0.09090931690055,
+ MapOffset = { x = 0.4242436124746, y = 0.30113436864162 },
+ Vendors = {
+ {
+ Name = RRS("Lindea Rabonne"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.506, y = 0.609 },
+ },
+ Recipes = {
+ { ID = 6330, Type = RRS("Cooking"), Skill = 100, Cost = 1200 },
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ },
+ },
+ {
+ Name = RRS("Micha Yance"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.489, y = 0.55 },
+ },
+ Recipes = {
+ { ID = 11163, Type = RRS("Enchanting"), Skill = 170, Cost = 3000 },
+ { ID = 5788, Type = RRS("Leatherworking"), Skill = 170, Cost = 650 },
+ { ID = 4355, Type = RRS("Tailoring"), Skill = 200, Cost = 1500 },
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Nandar Branson"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.504, y = 0.572 },
+ },
+ Recipes = {
+ { ID = 6055, Type = RRS("Alchemy"), Skill = 165, Cost = 1500 },
+ },
+ },
+ {
+ Name = RRS("Christoph Jeffcoat"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.625, y = 0.191 },
+ },
+ Recipes = {
+ { ID = 6054, Type = RRS("Alchemy"), Skill = 135, Cost = 900 },
+ { ID = 5788, Type = RRS("Leatherworking"), Skill = 170, Cost = 650 },
+ },
+ },
+ {
+ Name = RRS("Derak Nightfall"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.623, y = 0.196 },
+ },
+ Recipes = {
+ { ID = 6330, Type = RRS("Cooking"), Skill = 100, Cost = 1200 },
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("George Candarte"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.914, y = 0.39 },
+ },
+ Recipes = {
+ { ID = 7613, Type = RRS("Leatherworking"), Skill = 155, Cost = 2000 },
+ },
+ },
+ {
+ Name = RRS("Mallen Swain"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.617, y = 0.214 },
+ },
+ Recipes = {
+ { ID = 6274, Type = RRS("Tailoring"), Skill = 100, Cost = 400 },
+ { ID = 6401, Type = RRS("Tailoring"), Skill = 155, Cost = 1100 },
+ },
+ },
+ {
+ Name = RRS("Zan Shivsproket"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.841, y = 0.184 },
+ },
+ Recipes = {
+ { ID = 7742, Type = RRS("Engineering"), Skill = 200, Cost = 2400 },
+ },
+ },
+ {
+ Name = RRS("Zixil"),
+ Team = "Neutral",
+ Notes = RRS("Roving"),
+ Coordinates = {
+ { x = 0.609, y = 0.205 },
+ { x = 0.555, y = 0.194 },
+ { x = 0.559, y = 0.296 },
+ { x = 0.514, y = 0.393 },
+ { x = 0.506, y = 0.499 },
+ },
+ Recipes = {
+ { ID = 6377, Type = RRS("Enchanting"), Skill = 125, Cost = 1000 },
+ { ID = 7561, Type = RRS("Engineering"), Skill = 165, Cost = 2000 },
+ { ID = 7362, Type = RRS("Leatherworking"), Skill = 135, Cost = 2000 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ {
+ Name = RRS("Smudge Thunderwood"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.842, y = 0.185 },
+ },
+ Recipes = {
+ { ID = 18160, Type = RRS("Cooking"), Skill = 60, Cost = 200, Notes = RRS("Rogue Only") },
+ },
+ },
+ },
+},
+
+[RRS("Felwood")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Felwood",
+ MapScale = 0.15625084006464,
+ MapOffset = { x = 0.41995800144849, y = 0.23097545880609 },
+ Vendors = {
+ {
+ Name = RRS("Malygen"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.623, y = 0.256 },
+ },
+ Recipes = {
+ { ID = 16110, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Bale"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.348, y = 0.528 },
+ },
+ Recipes = {
+ { ID = 16110, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Meilosh"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.66, y = 0.028 },
+ },
+ Recipes = {
+ { ID = 13484, Type = RRS("Alchemy"), Skill = 275, Cost = 15000, Faction = RRS("Timbermaw Hold"), Level = 5 },
+ { ID = 19202, Type = RRS("Blacksmithing"), Skill = 290, Cost = 22000, Faction = RRS("Timbermaw Hold"), Level = 6 },
+ { ID = 19204, Type = RRS("Blacksmithing"), Skill = 300, Cost = 40000, Faction = RRS("Timbermaw Hold"), Level = 7 },
+ { ID = 19445, Type = RRS("Enchanting"), Skill = 290, Cost = 30000, Faction = RRS("Timbermaw Hold"), Level = 6 },
+ { ID = 19326, Type = RRS("Leatherworking"), Skill = 290, Cost = 22000, Faction = RRS("Timbermaw Hold"), Level = 6 },
+ { ID = 19327, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Timbermaw Hold"), Level = 7 },
+ { ID = 20253, Type = RRS("Leatherworking"), Skill = 275, Cost = 16000, Faction = RRS("Timbermaw Hold"), Level = 5, Specialty = RRS("Tribal Leatherworking") },
+ { ID = 20254, Type = RRS("Leatherworking"), Skill = 285, Cost = 20000, Faction = RRS("Timbermaw Hold"), Level = 5 },
+ { ID = 19215, Type = RRS("Tailoring"), Skill = 290, Cost = 22000, Faction = RRS("Timbermaw Hold"), Level = 6 },
+ { ID = 19218, Type = RRS("Tailoring"), Skill = 300, Cost = 40000, Faction = RRS("Timbermaw Hold"), Level = 7 },
+ { ID = 22392, Type = RRS("Enchanting"), Skill = 290, Cost = 25000, Faction = RRS("Timbermaw Hold"), Level = 5 },
+ },
+ },
+ },
+},
+
+[RRS("Gnomeregan")] = {
+ IsCity = false,
+ Continent = 0,
+ MapFile = "Gnomeregan",
+ Vendors = {
+ {
+ Name = RRS("Namdo Bizzfizzle"),
+ Team = "Alliance",
+ Recipes = {
+ { ID = 14639, Type = RRS("Engineering"), Skill = 140, Cost = 1500 },
+ },
+ },
+ },
+},
+
+[RRS("Teldrassil")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Teldrassil",
+ MapScale = 0.13836131003639,
+ MapOffset = { x = 0.36011098024729, y = 0.0394832297921 },
+ Vendors = {
+ {
+ Name = RRS("Nessa Shadowsong"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.562, y = 0.924 },
+ },
+ Recipes = {
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6326, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ },
+ },
+ {
+ Name = RRS("Nyoma"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.57, y = 0.604 },
+ },
+ Recipes = {
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 6328, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Blasted Lands")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Blasted-Lands",
+ MapScale = 0.09517074521836,
+ MapOffset = { x = 0.48982154167011, y = 0.7684651998651 },
+ Vendors = {
+ {
+ Name = RRS("Nina Lightbrew"),
+ Team = "Alliance",
+ Coordinates = {
+ { x = 0.668, y = 0.182 },
+ },
+ Recipes = {
+ { ID = 9300, Type = RRS("Alchemy"), Skill = 250, Cost = 10000 },
+ },
+ },
+ },
+},
+
+[RRS("Tirisfal Glades")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Tirisfal-Glades",
+ MapScale = 0.12837403412087,
+ MapOffset = { x = 0.36837217317549, y = 0.15464954319582 },
+ Vendors = {
+ {
+ Name = RRS("Abigail Shiel"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.607, y = 0.516 },
+ },
+ Recipes = {
+ { ID = 12226, Type = RRS("Cooking"), Skill = 1, Cost = 25 },
+ },
+ },
+ {
+ Name = RRS("Constance Brisboise"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.523, y = 0.554 },
+ },
+ Recipes = {
+ { ID = 6270, Type = RRS("Tailoring"), Skill = 55, Cost = 200 },
+ },
+ },
+ {
+ Name = RRS("Martine Tramblay"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.662, y = 0.592 },
+ },
+ Recipes = {
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 6326, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ },
+ },
+ {
+ Name = RRS("Werg Thickblade"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.833, y = 0.697 },
+ },
+ Recipes = {
+ { ID = 15741, Type = RRS("Leatherworking"), Skill = 275, Cost = 16000, Specialty = RRS("Elemental Leatherworking") },
+ { ID = 15725, Type = RRS("Leatherworking"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Argent Quartermaster Hasana"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.832, y = 0.68 },
+ },
+ Recipes = {
+ { ID = 13482, Type = RRS("Alchemy"), Skill = 275, Cost = 15000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19203, Type = RRS("Blacksmithing"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19205, Type = RRS("Blacksmithing"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19447, Type = RRS("Enchanting"), Skill = 300, Cost = 60000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19446, Type = RRS("Enchanting"), Skill = 290, Cost = 30000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19328, Type = RRS("Leatherworking"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19329, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19216, Type = RRS("Tailoring"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19217, Type = RRS("Tailoring"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19442, Type = RRS("First Aid"), Skill = 300, Cost = 100000, Faction = RRS("Argent Dawn"), Level = 6 },
+ },
+ },
+ },
+},
+
+[RRS("Undercity")] = {
+ IsCity = true,
+ Continent = 2,
+ MapFile = "Undercity",
+ MapScale = 0.02727719546939,
+ MapOffset = { x = 0.4297399924566, y = 0.23815358517831 },
+ Vendors = {
+ {
+ Name = RRS("Algernon"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.523, y = 0.736 },
+ },
+ Recipes = {
+ { ID = 9301, Type = RRS("Alchemy"), Skill = 250, Cost = 10000 },
+ { ID = 13477, Type = RRS("Alchemy"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Daniel Bartlett"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.639, y = 0.384 },
+ },
+ Recipes = {
+ { ID = 16217, Type = RRS("Enchanting"), Skill = 265, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Joseph Moore"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.707, y = 0.592 },
+ },
+ Recipes = {
+ { ID = 18949, Type = RRS("Leatherworking"), Skill = 155, Cost = 2000 },
+ { ID = 7451, Type = RRS("Leatherworking"), Skill = 190, Cost = 2800 },
+ },
+ },
+ {
+ Name = RRS("Lizbeth Cromwell"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.813, y = 0.311 },
+ },
+ Recipes = {
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 6328, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ },
+ },
+ {
+ Name = RRS("Millie Gregorian"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.707, y = 0.296 },
+ },
+ Recipes = {
+ { ID = 6275, Type = RRS("Tailoring"), Skill = 115, Cost = 800 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ { ID = 10326, Type = RRS("Tailoring"), Skill = 250, Cost = 5000 },
+ { ID = 10323, Type = RRS("Tailoring"), Skill = 245, Cost = 4500 },
+ { ID = 10321, Type = RRS("Tailoring"), Skill = 240, Cost = 4500 },
+ },
+ },
+ {
+ Name = RRS("Ronald Burch"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.631, y = 0.44 },
+ },
+ Recipes = {
+ { ID = 6330, Type = RRS("Cooking"), Skill = 100, Cost = 1200 },
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Thaddeus Webb"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.615, y = 0.61 },
+ },
+ Recipes = {
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Nardstrum Copperpinch"),
+ Team = "Horde",
+ Notes = RRS("Seasonal"),
+ Coordinates = {
+ { x = 0.686, y = 0.396 },
+ },
+ Recipes = {
+ { ID = 17200, Type = RRS("Cooking"), Skill = 1, Cost = 25 },
+ { ID = 17201, Type = RRS("Cooking"), Skill = 35, Cost = 240 },
+ },
+ },
+ },
+},
+
+[RRS("Silverpine Forest")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Silverpine-Forest",
+ MapScale = 0.11931848806212,
+ MapOffset = { x = 0.3565350229009, y = 0.24715695496522 },
+ Vendors = {
+ {
+ Name = RRS("Andrew Hilbert"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.428, y = 0.402 },
+ },
+ Recipes = {
+ { ID = 5786, Type = RRS("Leatherworking"), Skill = 90, Cost = 550 },
+ { ID = 5787, Type = RRS("Leatherworking"), Skill = 95, Cost = 600 },
+ { ID = 6272, Type = RRS("Tailoring"), Skill = 70, Cost = 300 },
+ { ID = 5771, Type = RRS("Tailoring"), Skill = 70, Cost = 200 },
+ { ID = 6892, Type = RRS("Cooking"), Skill = 40, Cost = 250 },
+ },
+ },
+ {
+ Name = RRS("Killian Sanatha"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.33, y = 0.176 },
+ },
+ Recipes = {
+ { ID = 6328, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ },
+ },
+ {
+ Name = RRS("Leo Sarn"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.541, y = 0.821 },
+ },
+ Recipes = {
+ { ID = 6349, Type = RRS("Enchanting"), Skill = 100, Cost = 500 },
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Lilly"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.428, y = 0.504 },
+ },
+ Recipes = {
+ { ID = 6346, Type = RRS("Enchanting"), Skill = 80, Cost = 400 },
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ },
+ },
+ },
+},
+
+[RRS("Swamp of Sorrows")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Swamp-of-Sorrows",
+ MapScale = 0.06516347991404,
+ MapOffset = { x = 0.5176979527207, y = 0.72815974701615 },
+ Vendors = {
+ {
+ Name = RRS("Banalash"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.447, y = 0.572 },
+ },
+ Recipes = {
+ { ID = 11223, Type = RRS("Enchanting"), Skill = 235, Cost = 5800 },
+ { ID = 12232, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ { ID = 16111, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Gharash"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.457, y = 0.519 },
+ },
+ Recipes = {
+ { ID = 7995, Type = RRS("Blacksmithing"), Skill = 215, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Rartar"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.449, y = 0.572 },
+ },
+ Recipes = {
+ { ID = 9300, Type = RRS("Alchemy"), Skill = 250, Cost = 10000 },
+ },
+ },
+ {
+ Name = RRS("Masat T'andr"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.254, y = 0.314 },
+ },
+ Recipes = {
+ { ID = 15726, Type = RRS("Leatherworking"), Skill = 260, Cost = 12000, Specialty = RRS("Dragonscale Leatherworking") },
+ },
+ },
+ },
+},
+
+[RRS("Orgrimmar")] = {
+ IsCity = true,
+ Continent = 1,
+ MapFile = "Orgrimmar",
+ MapScale = 0.03811449638057,
+ MapOffset = { x = 0.56378554142668, y = 0.42905218646258 },
+ Vendors = {
+ {
+ Name = RRS("Borya"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.629, y = 0.507 },
+ },
+ Recipes = {
+ { ID = 6270, Type = RRS("Tailoring"), Skill = 55, Cost = 200 },
+ { ID = 6274, Type = RRS("Tailoring"), Skill = 100, Cost = 400 },
+ { ID = 10314, Type = RRS("Tailoring"), Skill = 230, Cost = 4000 },
+ { ID = 10317, Type = RRS("Tailoring"), Skill = 235, Cost = 4000 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ {
+ Name = RRS("Hagrus"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.457, y = 0.457 },
+ },
+ Recipes = {
+ { ID = 5643, Type = RRS("Alchemy"), Skill = 175, Cost = 2000 },
+ { ID = 5640, Type = RRS("Alchemy"), Skill = 60, Cost = 100 },
+ },
+ },
+ {
+ Name = RRS("Kithas"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.533, y = 0.372 },
+ },
+ Recipes = {
+ { ID = 6349, Type = RRS("Enchanting"), Skill = 100, Cost = 500 },
+ { ID = 6346, Type = RRS("Enchanting"), Skill = 80, Cost = 400 },
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Kor'geld"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.563, y = 0.337 },
+ },
+ Recipes = {
+ { ID = 13478, Type = RRS("Alchemy"), Skill = 265, Cost = 13000 },
+ { ID = 5642, Type = RRS("Alchemy"), Skill = 150, Cost = 1800 },
+ },
+ },
+ {
+ Name = RRS("Penney Copperpinch"),
+ Team = "Horde",
+ Notes = RRS("Seasonal"),
+ Coordinates = {
+ { x = 0.529, y = 0.669 },
+ },
+ Recipes = {
+ { ID = 17201, Type = RRS("Cooking"), Skill = 35, Cost = 240 },
+ { ID = 17200, Type = RRS("Cooking"), Skill = 1, Cost = 25 },
+ },
+ },
+ {
+ Name = RRS("Shankys"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.689, y = 0.296 },
+ },
+ Recipes = {
+ { ID = 17062, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6369, Type = RRS("Cooking"), Skill = 175, Cost = 2200 },
+ },
+ },
+ {
+ Name = RRS("Sovik"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.752, y = 0.246 },
+ },
+ Recipes = {
+ { ID = 18647, Type = RRS("Engineering"), Skill = 150, Cost = 1800 },
+ { ID = 16041, Type = RRS("Engineering"), Skill = 260, Cost = 12000 },
+ { ID = 16042, Type = RRS("Engineering"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Sumi"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.816, y = 0.226 },
+ },
+ Recipes = {
+ { ID = 12162, Type = RRS("Blacksmithing"), Skill = 160, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Tamar"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.627, y = 0.443 },
+ },
+ Recipes = {
+ { ID = 18731, Type = RRS("Leatherworking"), Skill = 150, Cost = 2000 },
+ },
+ },
+ {
+ Name = RRS("Xen'to"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.574, y = 0.531 },
+ },
+ Recipes = {
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Durotar")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Durotar",
+ MapScale = 0.1436829497008,
+ MapOffset = { x = 0.517097827091, y = 0.44802818134926 },
+ Vendors = {
+ {
+ Name = RRS("Grimtak"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.512, y = 0.422 },
+ },
+ Recipes = {
+ { ID = 5483, Type = RRS("Cooking"), Skill = 20, Cost = 140 },
+ },
+ },
+ {
+ Name = RRS("Zansoa"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.566, y = 0.733 },
+ },
+ Recipes = {
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 6326, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ },
+ },
+ },
+},
+
+[RRS("Mulgore")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Mulgore",
+ MapScale = 0.13960673216274,
+ MapOffset = { x = 0.40811854919226, y = 0.53286226907346 },
+ Vendors = {
+ {
+ Name = RRS("Harn Longcast"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.475, y = 0.548 },
+ },
+ Recipes = {
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 6328, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ },
+ },
+ {
+ Name = RRS("Wunna Darkmane"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.459, y = 0.584 },
+ },
+ Recipes = {
+ { ID = 5484, Type = RRS("Cooking"), Skill = 35, Cost = 240 },
+ },
+ },
+ },
+},
+
+[RRS("The Barrens")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "The-Barrens",
+ MapScale = 0.27539211944292,
+ MapOffset = { x = 0.3924934733345, y = 0.45601063260257 },
+ Vendors = {
+ {
+ Name = RRS("Hula'mahi"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.516, y = 0.296 },
+ },
+ Recipes = {
+ { ID = 6053, Type = RRS("Alchemy"), Skill = 100, Cost = 800 },
+ },
+ },
+ {
+ Name = RRS("Tari'qa"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.518, y = 0.305 },
+ },
+ Recipes = {
+ { ID = 5488, Type = RRS("Cooking"), Skill = 100, Cost = 400 },
+ { ID = 5486, Type = RRS("Cooking"), Skill = 50, Cost = 440 },
+ },
+ },
+ {
+ Name = RRS("Wrahk"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.525, y = 0.314 },
+ },
+ Recipes = {
+ { ID = 6272, Type = RRS("Tailoring"), Skill = 70, Cost = 300 },
+ { ID = 6270, Type = RRS("Tailoring"), Skill = 55, Cost = 200 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ {
+ Name = RRS("Yonada"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.453, y = 0.595 },
+ },
+ Recipes = {
+ { ID = 6274, Type = RRS("Tailoring"), Skill = 100, Cost = 400 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ {
+ Name = RRS("Zargh"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.525, y = 0.296 },
+ },
+ Recipes = {
+ { ID = 3735, Type = RRS("Cooking"), Skill = 125, Cost = 1800 },
+ },
+ },
+ {
+ Name = RRS("Gagsprocket"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.626, y = 0.363 },
+ },
+ Recipes = {
+ { ID = 18648, Type = RRS("Engineering"), Skill = 150, Cost = 1800 },
+ },
+ },
+ {
+ Name = RRS("Kiknikle"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.418, y = 0.384 },
+ },
+ Recipes = {
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ },
+ },
+ {
+ Name = RRS("Kilxx"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.628, y = 0.382 },
+ },
+ Recipes = {
+ { ID = 6330, Type = RRS("Cooking"), Skill = 100, Cost = 1200 },
+ { ID = 6368, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ },
+ },
+ {
+ Name = RRS("Ranik"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.619, y = 0.387 },
+ },
+ Recipes = {
+ { ID = 5640, Type = RRS("Alchemy"), Skill = 60, Cost = 100 },
+ { ID = 6272, Type = RRS("Tailoring"), Skill = 70, Cost = 300 },
+ { ID = 6275, Type = RRS("Tailoring"), Skill = 115, Cost = 800 },
+ },
+ },
+ {
+ Name = RRS("Tarban Hearthgrain"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.557, y = 0.317 },
+ },
+ Recipes = {
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Thousand Needles")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Thousand-Needles",
+ MapScale = 0.1195658287792,
+ MapOffset = { x = 0.47554411191734, y = 0.6834235638965 },
+ Vendors = {
+ {
+ Name = RRS("Jandia"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.457, y = 0.51 },
+ },
+ Recipes = {
+ { ID = 5973, Type = RRS("Leatherworking"), Skill = 170, Cost = 650 },
+ },
+ },
+ {
+ Name = RRS("Montarr"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.451, y = 0.499 },
+ },
+ Recipes = {
+ { ID = 6068, Type = RRS("Alchemy"), Skill = 165, Cost = 1500 },
+ },
+ },
+ {
+ Name = RRS("Jinky Twizzlefixxit"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.77, y = 0.762 },
+ },
+ Recipes = {
+ { ID = 7560, Type = RRS("Engineering"), Skill = 125, Cost = 1200 },
+ { ID = 13309, Type = RRS("Engineering"), Skill = 120, Cost = 1000 },
+ },
+ },
+ },
+},
+
+[RRS("Stonetalon Mountains")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Stonetalon-Mountains",
+ MapScale = 0.13272833611061,
+ MapOffset = { x = 0.37556627748617, y = 0.40285135292988 },
+ Vendors = {
+ {
+ Name = RRS("Jeeda"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.473, y = 0.616 },
+ },
+ Recipes = {
+ { ID = 6055, Type = RRS("Alchemy"), Skill = 165, Cost = 1500 },
+ },
+ },
+ {
+ Name = RRS("Kulwia"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.455, y = 0.595 },
+ },
+ Recipes = {
+ { ID = 11101, Type = RRS("Enchanting"), Skill = 140, Cost = 2500 },
+ { ID = 11039, Type = RRS("Enchanting"), Skill = 110, Cost = 800 },
+ },
+ },
+ {
+ Name = RRS("Veenix"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.582, y = 0.517 },
+ },
+ Recipes = {
+ { ID = 7561, Type = RRS("Engineering"), Skill = 165, Cost = 2000 },
+ },
+ },
+ },
+},
+
+[RRS("Thunder Bluff")] = {
+ IsCity = true,
+ Continent = 1,
+ MapFile = "Thunder-Bluff",
+ MapScale = 0.02836291430658,
+ MapOffset = { x = 0.44972878210917, y = 0.55638479002362 },
+ Vendors = {
+ {
+ Name = RRS("Mahu"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.441, y = 0.446 },
+ },
+ Recipes = {
+ { ID = 10311, Type = RRS("Tailoring"), Skill = 220, Cost = 3000 },
+ { ID = 5771, Type = RRS("Tailoring"), Skill = 70, Cost = 200 },
+ { ID = 5772, Type = RRS("Tailoring"), Skill = 115, Cost = 500 },
+ { ID = 10325, Type = RRS("Tailoring"), Skill = 250, Cost = 10000 },
+ },
+ },
+ {
+ Name = RRS("Naal Mistrunner"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.518, y = 0.519 },
+ },
+ Recipes = {
+ { ID = 6330, Type = RRS("Cooking"), Skill = 100, Cost = 1200 },
+ { ID = 6328, Type = RRS("Cooking"), Skill = 50, Cost = 400 },
+ { ID = 21099, Type = RRS("Cooking"), Skill = 80, Cost = 500 },
+ { ID = 21219, Type = RRS("Cooking"), Skill = 175, Cost = 5000 },
+ },
+ },
+ {
+ Name = RRS("Nata Dawnstrider"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.453, y = 0.399 },
+ },
+ Recipes = {
+ { ID = 6349, Type = RRS("Enchanting"), Skill = 100, Cost = 500 },
+ { ID = 6377, Type = RRS("Enchanting"), Skill = 125, Cost = 1000 },
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ },
+ },
+ {
+ Name = RRS("Sewa Mistrunner"),
+ Team = "Horde",
+ Coordinates = {
+ { x = 0.561, y = 0.478 },
+ },
+ Recipes = {
+ { ID = 6325, Type = RRS("Cooking"), Skill = 1, Cost = 40 },
+ { ID = 6330, Type = RRS("Cooking"), Skill = 100, Cost = 1200 },
+ },
+ },
+ {
+ Name = RRS("Seersa Copperpinch"),
+ Team = "Horde",
+ Notes = RRS("Seasonal"),
+ Coordinates = {
+ { x = 0.438, y = 0.589 },
+ },
+ Recipes = {
+ { ID = 17200, Type = RRS("Cooking"), Skill = 1, Cost = 25 },
+ { ID = 17201, Type = RRS("Cooking"), Skill = 35, Cost = 240 },
+ },
+ },
+ },
+},
+
+[RRS("Silithus")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Silithus",
+ MapScale = 0.09468465888932,
+ MapOffset = { x = 0.39731975488374, y = 0.76460608512626 },
+ Vendors = {
+ {
+ Name = RRS("Aendel Windspear"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.626, y = 0.498 },
+ },
+ Recipes = {
+ { ID = 20382, Type = RRS("Leatherworking"), Skill = 300, Cost = 60000, Faction = RRS("Cenarion Circle"), Level = 8, Specialty = RRS("Dragonscale Leatherworking") },
+ { ID = 20506, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Cenarion Circle"), Level = 5 },
+ { ID = 20507, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Cenarion Circle"), Level = 6 },
+ { ID = 20508, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Cenarion Circle"), Level = 7 },
+ { ID = 20509, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Cenarion Circle"), Level = 5 },
+ { ID = 20510, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Cenarion Circle"), Level = 6 },
+ { ID = 20511, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Cenarion Circle"), Level = 7 },
+ { ID = 22769, Type = RRS("Leatherworking"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 5 },
+ { ID = 22770, Type = RRS("Leatherworking"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 6 },
+ { ID = 22771, Type = RRS("Leatherworking"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 7 },
+ },
+ },
+ {
+ Name = RRS("Zannok Hidepiercer"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.82, y = 0.177 },
+ },
+ Recipes = {
+ { ID = 15724, Type = RRS("Leatherworking"), Skill = 255, Cost = 12000 },
+ { ID = 15762, Type = RRS("Leatherworking"), Skill = 295, Cost = 25000 },
+ },
+ },
+ {
+ Name = RRS("Kania"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.518, y = 0.396 },
+ },
+ Recipes = {
+ { ID = 20732, Type = RRS("Enchanting"), Skill = 300, Cost = 100000, Faction = RRS("Cenarion Circle"), Level = 5 },
+ { ID = 20733, Type = RRS("Enchanting"), Skill = 300, Cost = 100000, Faction = RRS("Cenarion Circle"), Level = 6 },
+ { ID = 6342, Type = RRS("Enchanting"), Skill = 20, Cost = 300 },
+ { ID = 20758, Type = RRS("Enchanting"), Skill = 45, Cost = 125 },
+ { ID = 20752, Type = RRS("Enchanting"), Skill = 150, Cost = 750 },
+ { ID = 20754, Type = RRS("Enchanting"), Skill = 250, Cost = 2500 },
+ { ID = 20755, Type = RRS("Enchanting"), Skill = 275, Cost = 5000 },
+ { ID = 20753, Type = RRS("Enchanting"), Skill = 200, Cost = 1000 },
+ { ID = 22307, Type = RRS("Tailoring"), Skill = 225, Cost = 6000 },
+ { ID = 22308, Type = RRS("Tailoring"), Skill = 275, Cost = 20000 },
+ },
+ },
+ {
+ Name = RRS("Mishta"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.499, y = 0.363 },
+ },
+ Recipes = {
+ { ID = 22312, Type = RRS("Tailoring"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 7 },
+ { ID = 22310, Type = RRS("Tailoring"), Skill = 275, Cost = 20000, Faction = RRS("Cenarion Circle"), Level = 5 },
+ { ID = 22772, Type = RRS("Tailoring"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 5 },
+ { ID = 22773, Type = RRS("Tailoring"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 6 },
+ { ID = 22774, Type = RRS("Tailoring"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 7 },
+ { ID = 22683, Type = RRS("Tailoring"), Skill = 300, Cost = 90000, Faction = RRS("Cenarion Circle"), Level = 7 },
+ },
+ },
+ {
+ Name = RRS("Vargus"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.512, y = 0.389 },
+ },
+ Recipes = {
+ { ID = 22209, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 5 },
+ { ID = 22214, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 6 },
+ { ID = 22766, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 7 },
+ { ID = 22767, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 6 },
+ { ID = 22768, Type = RRS("Blacksmithing"), Skill = 300, Cost = 50000, Faction = RRS("Cenarion Circle"), Level = 5 },
+ },
+ },
+ },
+},
+
+[RRS("Tanaris")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Tanaris",
+ MapScale = 0.18750104661175,
+ MapOffset = { x = 0.46971301480866, y = 0.76120931364891 },
+ Vendors = {
+ {
+ Name = RRS("Alchemist Pestlezugg"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.509, y = 0.27 },
+ },
+ Recipes = {
+ { ID = 6057, Type = RRS("Alchemy"), Skill = 190, Cost = 2000 },
+ { ID = 9303, Type = RRS("Alchemy"), Skill = 225, Cost = 8000 },
+ { ID = 12958, Type = RRS("Alchemy"), Skill = 275, Cost = 50000 },
+ { ID = 9304, Type = RRS("Alchemy"), Skill = 225, Cost = 8000 },
+ { ID = 9305, Type = RRS("Alchemy"), Skill = 225, Cost = 8000 },
+ },
+ },
+ {
+ Name = RRS("Dirge Quikcleave"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.526, y = 0.281 },
+ },
+ Recipes = {
+ { ID = 18046, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Gikkix"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.666, y = 0.22 },
+ },
+ Recipes = {
+ { ID = 13942, Type = RRS("Cooking"), Skill = 240, Cost = 16000 },
+ { ID = 13945, Type = RRS("Cooking"), Skill = 250, Cost = 20000 },
+ { ID = 13946, Type = RRS("Cooking"), Skill = 250, Cost = 20000 },
+ { ID = 13939, Type = RRS("Cooking"), Skill = 225, Cost = 16000 },
+ },
+ },
+ {
+ Name = RRS("Jabbey"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.67, y = 0.219 },
+ },
+ Recipes = {
+ { ID = 16767, Type = RRS("Cooking"), Skill = 225, Cost = 3000 },
+ },
+ },
+ {
+ Name = RRS("Krinkle Goodsteel"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.515, y = 0.288 },
+ },
+ Recipes = {
+ { ID = 6047, Type = RRS("Blacksmithing"), Skill = 190, Cost = 4400 },
+ },
+ },
+ {
+ Name = RRS("Vizzklick"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.51, y = 0.273 },
+ },
+ Recipes = {
+ { ID = 7088, Type = RRS("Tailoring"), Skill = 205, Cost = 5000 },
+ { ID = 21358, Type = RRS("Tailoring"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Blizrik Buckshot"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.518, y = 0.279 },
+ },
+ Recipes = {
+ { ID = 18650, Type = RRS("Engineering"), Skill = 200, Cost = 5000 },
+ },
+ },
+ },
+},
+
+[RRS("Alterac Mountains")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Alterac-Mountains",
+ MapScale = 0.07954563533736,
+ MapOffset = { x = 0.43229874660542, y = 0.25425926375262 },
+ Vendors = {
+ {
+ Name = RRS("Bro'kin"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.382, y = 0.389 },
+ },
+ Recipes = {
+ { ID = 14634, Type = RRS("Alchemy"), Skill = 200, Cost = 2500 },
+ },
+ },
+ {
+ Name = RRS("Rizz Loosebolt"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.473, y = 0.352 },
+ },
+ Recipes = {
+ { ID = 13308, Type = RRS("Engineering"), Skill = 155, Cost = 1800 },
+ },
+ },
+ },
+},
+
+[RRS("Moonglade")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Moonglade",
+ MapScale = 0.06292695969921,
+ MapOffset = { x = 0.50130287793373, y = 0.17560823085517 },
+ Vendors = {
+ {
+ Name = RRS("Darnall"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.515, y = 0.333 },
+ },
+ Recipes = {
+ { ID = 14488, Type = RRS("Tailoring"), Skill = 280, Cost = 12000 },
+ { ID = 14472, Type = RRS("Tailoring"), Skill = 265, Cost = 12000 },
+ { ID = 14469, Type = RRS("Tailoring"), Skill = 260, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Lorelae Wintersong"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.482, y = 0.401 },
+ },
+ Recipes = {
+ { ID = 16224, Type = RRS("Enchanting"), Skill = 285, Cost = 20000 },
+ { ID = 16243, Type = RRS("Enchanting"), Skill = 290, Cost = 22000 },
+ { ID = 14483, Type = RRS("Tailoring"), Skill = 275, Cost = 16000 },
+ },
+ },
+ },
+},
+
+[RRS("Winterspring")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Winterspring",
+ MapScale = 0.19293573573141,
+ MapOffset = { x = 0.47237382938446, y = 0.17390990272233 },
+ Vendors = {
+ {
+ Name = RRS("Evie Whirlbrew"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.608, y = 0.379 },
+ },
+ Recipes = {
+ { ID = 13480, Type = RRS("Alchemy"), Skill = 275, Cost = 15000 },
+ { ID = 14526, Type = RRS("Tailoring"), Skill = 250, Cost = 20000 },
+ },
+ },
+ {
+ Name = RRS("Himmik"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.613, y = 0.392 },
+ },
+ Recipes = {
+ { ID = 16110, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Qia"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.612, y = 0.372 },
+ },
+ Recipes = {
+ { ID = 16221, Type = RRS("Enchanting"), Skill = 275, Cost = 16000 },
+ { ID = 15740, Type = RRS("Leatherworking"), Skill = 275, Cost = 16000, Specialty = RRS("Tribal Leatherworking") },
+ { ID = 14526, Type = RRS("Tailoring"), Skill = 250, Cost = 20000 },
+ { ID = 14468, Type = RRS("Tailoring"), Skill = 260, Cost = 12000 },
+ { ID = 14481, Type = RRS("Tailoring"), Skill = 275, Cost = 16000 },
+ { ID = 16110, Type = RRS("Cooking"), Skill = 225, Cost = 12000 },
+ },
+ },
+ {
+ Name = RRS("Xizzer Fizzbolt"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.608, y = 0.386 },
+ },
+ Recipes = {
+ { ID = 16050, Type = RRS("Engineering"), Skill = 285, Cost = 20000 },
+ { ID = 18652, Type = RRS("Engineering"), Skill = 260, Cost = 12000 },
+ { ID = 16046, Type = RRS("Engineering"), Skill = 275, Cost = 16000 },
+ { ID = 18656, Type = RRS("Engineering"), Skill = 275, Cost = 16000 },
+ { ID = 16047, Type = RRS("Engineering"), Skill = 275, Cost = 16000 },
+ },
+ },
+ },
+},
+
+[RRS("Eastern Plaguelands")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Eastern-Plaguelands",
+ MapScale = 0.10996723642661,
+ MapOffset = { x = 0.51663255550387, y = 0.15624753972085 },
+ Vendors = {
+ {
+ Name = RRS("Jase Farlane"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.806, y = 0.576 },
+ },
+ Recipes = {
+ { ID = 15756, Type = RRS("Leatherworking"), Skill = 290, Cost = 22000 },
+ },
+ },
+ {
+ Name = RRS("Quartermaster Miranda Breechlock"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.816, y = 0.6 },
+ },
+ Recipes = {
+ { ID = 13482, Type = RRS("Alchemy"), Skill = 275, Cost = 15000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19203, Type = RRS("Blacksmithing"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19205, Type = RRS("Blacksmithing"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19447, Type = RRS("Enchanting"), Skill = 300, Cost = 60000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19446, Type = RRS("Enchanting"), Skill = 290, Cost = 30000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19328, Type = RRS("Leatherworking"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19329, Type = RRS("Leatherworking"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19216, Type = RRS("Tailoring"), Skill = 290, Cost = 22000, Faction = RRS("Argent Dawn"), Level = 6 },
+ { ID = 19217, Type = RRS("Tailoring"), Skill = 300, Cost = 40000, Faction = RRS("Argent Dawn"), Level = 7 },
+ { ID = 19442, Type = RRS("First Aid"), Skill = 300, Cost = 100000, Faction = RRS("Argent Dawn"), Level = 6 },
+ },
+ },
+ },
+},
+
+[RRS("Badlands")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Badlands",
+ MapScale = 0.07066771883566,
+ MapOffset = { x = 0.51361415033147, y = 0.56915717993261 },
+ Vendors = {
+ {
+ Name = RRS("Jazzrik"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.418, y = 0.531 },
+ },
+ Recipes = {
+ { ID = 10858, Type = RRS("Blacksmithing"), Skill = 155, Cost = 3000 },
+ },
+ },
+ },
+},
+
+[RRS("Wailing Caverns")] = {
+ IsCity = false,
+ Continent = 0,
+ MapFile = "Wailing-Caverns",
+ Vendors = {
+ {
+ Name = RRS("Kalldan Felmoon"),
+ Team = "Neutral",
+ Recipes = {
+ { ID = 6474, Type = RRS("Leatherworking"), Skill = 90, Cost = 550 },
+ { ID = 6475, Type = RRS("Leatherworking"), Skill = 105, Cost = 1500 },
+ },
+ },
+ },
+},
+
+[RRS("Blackrock Depths")] = {
+ IsCity = false,
+ Continent = 0,
+ MapFile = "Blackrock-Depths",
+ Vendors = {
+ {
+ Name = RRS("Lokhtos Darkbargainer"),
+ Team = "Neutral",
+ Recipes = {
+ { ID = 19208, Type = RRS("Blacksmithing"), Skill = 300, Cost = 70000, Faction = RRS("Thorium Brotherhood"), Level = 7, Specialty = RRS("Weaponsmith") },
+ { ID = 19209, Type = RRS("Blacksmithing"), Skill = 300, Cost = 70000, Faction = RRS("Thorium Brotherhood"), Level = 8, Specialty = RRS("Weaponsmith") },
+ { ID = 19211, Type = RRS("Blacksmithing"), Skill = 300, Cost = 120000, Faction = RRS("Thorium Brotherhood"), Level = 8, Specialty = RRS("Master Swordsmith") },
+ { ID = 17051, Type = RRS("Blacksmithing"), Skill = 295, Cost = 70000, Faction = RRS("Thorium Brotherhood"), Level = 5, Specialty = RRS("Armorsmith") },
+ { ID = 17060, Type = RRS("Blacksmithing"), Skill = 300, Cost = 220000, Faction = RRS("Thorium Brotherhood"), Level = 8, Specialty = RRS("Master Axesmith") },
+ { ID = 19207, Type = RRS("Blacksmithing"), Skill = 300, Cost = 80000, Faction = RRS("Thorium Brotherhood"), Level = 7, Specialty = RRS("Armorsmith") },
+ { ID = 19206, Type = RRS("Blacksmithing"), Skill = 300, Cost = 60000, Faction = RRS("Thorium Brotherhood"), Level = 7, Specialty = RRS("Armorsmith") },
+ { ID = 17052, Type = RRS("Blacksmithing"), Skill = 300, Cost = 180000, Faction = RRS("Thorium Brotherhood"), Level = 8, Specialty = RRS("Armorsmith") },
+ { ID = 17059, Type = RRS("Blacksmithing"), Skill = 300, Cost = 220000, Faction = RRS("Thorium Brotherhood"), Level = 6, Specialty = RRS("Master Swordsmith") },
+ { ID = 20040, Type = RRS("Blacksmithing"), Skill = 300, Cost = 80000, Faction = RRS("Thorium Brotherhood"), Level = 8, Specialty = RRS("Armorsmith") },
+ { ID = 19210, Type = RRS("Blacksmithing"), Skill = 300, Cost = 120000, Faction = RRS("Thorium Brotherhood"), Level = 8, Specialty = RRS("Master Hammersmith") },
+ { ID = 17049, Type = RRS("Blacksmithing"), Skill = 295, Cost = 90000, Faction = RRS("Thorium Brotherhood"), Level = 6, Specialty = RRS("Armorsmith") },
+ { ID = 17053, Type = RRS("Blacksmithing"), Skill = 300, Cost = 200000, Faction = RRS("Thorium Brotherhood"), Level = 7, Specialty = RRS("Armorsmith") },
+ { ID = 19212, Type = RRS("Blacksmithing"), Skill = 300, Cost = 120000, Faction = RRS("Thorium Brotherhood"), Level = 8, Specialty = RRS("Master Axesmith") },
+ { ID = 19449, Type = RRS("Enchanting"), Skill = 300, Cost = 100000, Faction = RRS("Thorium Brotherhood"), Level = 7 },
+ { ID = 19448, Type = RRS("Enchanting"), Skill = 300, Cost = 80000, Faction = RRS("Thorium Brotherhood"), Level = 6 },
+ { ID = 19444, Type = RRS("Enchanting"), Skill = 290, Cost = 30000, Faction = RRS("Thorium Brotherhood"), Level = 5 },
+ { ID = 17025, Type = RRS("Leatherworking"), Skill = 300, Cost = 160000, Faction = RRS("Thorium Brotherhood"), Level = 6, Specialty = RRS("Dragonscale Leatherworking") },
+ { ID = 19331, Type = RRS("Leatherworking"), Skill = 300, Cost = 90000, Faction = RRS("Thorium Brotherhood"), Level = 7, Specialty = RRS("Dragonscale Leatherworking") },
+ { ID = 19332, Type = RRS("Leatherworking"), Skill = 300, Cost = 90000, Faction = RRS("Thorium Brotherhood"), Level = 7 },
+ { ID = 17022, Type = RRS("Leatherworking"), Skill = 295, Cost = 150000, Faction = RRS("Thorium Brotherhood"), Level = 5, Specialty = RRS("Tribal Leatherworking") },
+ { ID = 19330, Type = RRS("Leatherworking"), Skill = 300, Cost = 60000, Faction = RRS("Thorium Brotherhood"), Level = 7 },
+ { ID = 19333, Type = RRS("Leatherworking"), Skill = 300, Cost = 90000, Faction = RRS("Thorium Brotherhood"), Level = 7, Specialty = RRS("Elemental Leatherworking") },
+ { ID = 17023, Type = RRS("Leatherworking"), Skill = 300, Cost = 160000, Faction = RRS("Thorium Brotherhood"), Level = 5, Specialty = RRS("Elemental Leatherworking") },
+ { ID = 17018, Type = RRS("Tailoring"), Skill = 300, Cost = 80000, Faction = RRS("Thorium Brotherhood"), Level = 5 },
+ { ID = 19220, Type = RRS("Tailoring"), Skill = 300, Cost = 90000, Faction = RRS("Thorium Brotherhood"), Level = 7 },
+ { ID = 17017, Type = RRS("Tailoring"), Skill = 300, Cost = 180000, Faction = RRS("Thorium Brotherhood"), Level = 6 },
+ { ID = 19219, Type = RRS("Tailoring"), Skill = 300, Cost = 60000, Faction = RRS("Thorium Brotherhood"), Level = 6 },
+ { ID = 20761, Type = RRS("Alchemy"), Skill = 300, Cost = 120000, Faction = RRS("Thorium Brotherhood"), Level = 5 },
+ },
+ },
+ {
+ Name = RRS("Plugger Spazzring"),
+ Team = "Neutral",
+ Recipes = {
+ { ID = 13483, Type = RRS("Alchemy"), Skill = 275, Cost = 15000 },
+ { ID = 15759, Type = RRS("Leatherworking"), Skill = 290, Cost = 22000 },
+ },
+ },
+ },
+},
+
+[RRS("Un'Goro Crater")] = {
+ IsCity = false,
+ Continent = 1,
+ MapFile = "Un-Goro-Crater",
+ MapScale = 0.10054401185671,
+ MapOffset = { x = 0.4492759445152, y = 0.76494573629405 },
+ Vendors = {
+ {
+ Name = RRS("Nergal"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.434, y = 0.082 },
+ },
+ Recipes = {
+ { ID = 15758, Type = RRS("Leatherworking"), Skill = 290, Cost = 22000, Specialty = RRS("Tribal Leatherworking") },
+ },
+ },
+ },
+},
+
+[RRS("Dire Maul")] = {
+ IsCity = false,
+ Continent = 0,
+ MapFile = "Dire-Maul",
+ Vendors = {
+ {
+ Name = RRS("Shen'dralar Provisioner"),
+ Team = "Neutral",
+ Recipes = {
+ { ID = 18487, Type = RRS("Tailoring"), Skill = 300, Cost = 40000 },
+ },
+ },
+ },
+},
+
+[RRS("Burning Steppes")] = {
+ IsCity = false,
+ Continent = 2,
+ MapFile = "Burning-Steppes",
+ MapScale = 0.08321525646393,
+ MapOffset = { x = 0.04621224670174, y = 0.61780780524905 },
+ Vendors = {
+ {
+ Name = RRS("Yuka Screwspigot"),
+ Team = "Neutral",
+ Coordinates = {
+ { x = 0.656, y = 0.226 },
+ },
+ Recipes = {
+ { ID = 10602, Type = RRS("Engineering"), Skill = 210, Cost = 3000 },
+ },
+ },
+ },
+},
+
+[RRS("Naxxramas")] = {
+ IsCity = false,
+ Continent = 0,
+ MapFile = "Naxxramas",
+ Vendors = {
+ {
+ Name = RRS("Master Craftsman Omarion"),
+ Team = "Neutral",
+ Recipes = {
+ },
+ },
+ },
+},
+
+}
+
+RecipeRadar_MaxVendorsByLocation = 20
+RecipeRadar_MaxVendorCoordinates = 5
+
diff --git a/RecipeRadar/SkillDB.lua b/RecipeRadar/SkillDB.lua
new file mode 100644
index 0000000..02bcebe
--- /dev/null
+++ b/RecipeRadar/SkillDB.lua
@@ -0,0 +1,429 @@
+
+-- SkillDB.lua: interface to the characters' known skill database
+-- $Id: SkillDB.lua 462 2006-09-18 15:50:04Z jnmiller $
+
+function RecipeRadar_SkillDB_Init()
+
+ if (not RecipeRadar_SkillDB) then
+ RecipeRadar_SkillDB = { }
+ end
+
+ if (not RecipeRadar_SkillDB[GetRealmName()]) then
+ RecipeRadar_SkillDB[GetRealmName()] = { }
+ end
+
+ local db = RecipeRadar_SkillDB_GetPlayerProfessions()
+
+ -- fishing doesn't get an auto-reset during the spellbook parsing
+ if (not db[RRS("Fishing")] or not db[RRS("Fishing")].Recipes) then
+ db[RRS("Fishing")] = { Rank = 0, Recipes = { } }
+ end
+
+end
+
+-- This function safely initializes the player's personal skill database.
+-- If no player is supplied, the current player is assumed.
+function RecipeRadar_SkillDB_GetSafePlayerDB(player)
+
+ if (not player) then player = UnitName("player") end
+
+ local db = RecipeRadar_SkillDB[GetRealmName()]
+
+ if (not db[player]) then
+ db[player] = { }
+ end
+
+ if (not db[player].Team) then
+ db[player].Team = UnitFactionGroup("player")
+ end
+
+ if (not db[player].Professions) then
+ db[player].Professions = { }
+ end
+
+ if (not db[player].Factions) then
+ db[player].Factions = { }
+ end
+
+ return db[player]
+
+end
+
+-- This is a safe function to retrieve the current character's team.
+function RecipeRadar_SkillDB_GetPlayerTeam(player)
+
+ return RecipeRadar_SkillDB_GetSafePlayerDB(player).Team
+
+end
+
+-- This is a safe function to retrieve the current character's skills.
+function RecipeRadar_SkillDB_GetPlayerProfessions(player)
+
+ return RecipeRadar_SkillDB_GetSafePlayerDB(player).Professions
+
+end
+
+-- This is a safe function to retrieve the current character's reputation.
+function RecipeRadar_SkillDB_GetPlayerFactions(player)
+
+ return RecipeRadar_SkillDB_GetSafePlayerDB(player).Factions
+
+end
+
+-- Refreshes the DB for the current player and currently open skill window.
+-- prof_type is one of 'trade' or 'craft'.
+function RecipeRadar_SkillDB_Refresh(prof_type)
+
+ local profs = RecipeRadar_SkillDB_GetPlayerProfessions()
+ local prof_name, prof_rank, max_rank =
+ RecipeRadar_SkillDB_GetProfInfo(prof_type)
+
+ if (not prof_name) then -- Beast Training, for instance, will cause this
+ return
+ end
+
+ if (not profs[prof_name]) then profs[prof_name] = { } end
+ profs[prof_name].Rank = prof_rank
+ profs[prof_name].Recipes = { }
+
+ -- this line might help avoid the 0 count that I seem to get on
+ -- some early invocations of this function?
+ local dummy = RecipeRadar_SkillDB_GetRecipeCount(prof_type)
+
+ -- iterate over each listed recipe in the currently open skill window
+ for i = 1, RecipeRadar_SkillDB_GetRecipeCount(prof_type) do
+
+ local recipe, hdr = RecipeRadar_SkillDB_GetRecipeInfo(prof_type, i)
+
+ if (recipe and hdr ~= "header") then
+
+ -- map craft window names to real recipe names
+ local map = RecipeRadar_NameMap[GetLocale()]
+ if (map and map[recipe]) then
+ profs[prof_name].Recipes[recipe] = nil
+ recipe = map[recipe]
+ end
+
+ -- if it's not a header, the character knows this recipe
+ profs[prof_name].Recipes[recipe] = 1
+
+ end
+
+ end
+
+ RecipeRadar_SkillDB_HandleSpecialCase(profs, prof_name, max_rank)
+
+end
+
+-- Adds unlisted/implied "recipes" to the skill DB.
+function RecipeRadar_SkillDB_HandleSpecialCase(profs, prof_name, max_rank)
+
+ if (prof_name == RRS("First Aid") and max_rank > 150) then
+ -- Expert First Aid - Under Wraps
+ local name = RecipeRadar_GetSafeItemInfo(16084)
+ if (name ~= RRS("Uncached Recipe")) then
+ profs[RRS("First Aid")].Recipes[name] = 1
+ end
+ end
+
+ if (prof_name == RRS("Fishing") and max_rank > 150) then
+ -- Expert Fishing - The Bass and You
+ local name = RecipeRadar_GetSafeItemInfo(16083)
+ if (name ~= RRS("Uncached Recipe")) then
+ profs[RRS("Fishing")].Recipes[name] = 1
+ end
+ end
+
+ if (prof_name == RRS("Cooking") and max_rank > 150) then
+ -- Expert Cookbook
+ local name = RecipeRadar_GetSafeItemInfo(16072)
+ if (name ~= RRS("Uncached Recipe")) then
+ profs[RRS("Cooking")].Recipes[name] = 1
+ end
+ end
+
+end
+
+-- Quick function to retrieve a profession rank.
+function RecipeRadar_SkillDB_GetRank(prof)
+
+ local prof_db = RecipeRadar_SkillDB_GetPlayerProfessions()[prof]
+ if (not prof_db) then return 0 end
+
+ return prof_db.Rank
+
+end
+
+-- Quick function to set a new profession rank.
+function RecipeRadar_SkillDB_SetRank(prof, rank)
+
+ local prof_db = RecipeRadar_SkillDB_GetPlayerProfessions()[prof]
+ if (not prof_db) then return end
+
+ prof_db.Rank = tonumber(rank)
+
+ RecipeRadar_FrameUpdate()
+
+end
+
+-- Boolean function to determine whether a player in the DB has the
+-- reputation necessary to learn the supplied recipe.
+function RecipeRadar_SkillDB_HasRep(player, recipe)
+
+ if (not recipe.Faction or recipe.Faction == "") then return true end
+
+ local factions = RecipeRadar_SkillDB_GetPlayerFactions(player)
+ if (not factions[recipe.Faction]) then return false end
+
+ return factions[recipe.Faction] >= recipe.Level
+
+end
+
+-- Boolean function to determine whether a player in the DB has the
+-- specialty necessary to learn the supplied recipe.
+function RecipeRadar_SkillDB_HasSpec(player, recipe)
+
+ if (not recipe.Specialty or recipe.Specialty == "") then return true end
+
+ local db = RecipeRadar_SkillDB_GetPlayerProfessions(player)
+ if (not db[recipe.Type]) then return false end
+
+ return recipe.Specialty == db[recipe.Type].Specialty
+
+end
+
+-- Debug function to clear some or all of the skill DB.
+function RecipeRadar_SkillDB_Clear(player)
+
+ local hdr = "Clearing all known recipes"
+ if (player ~= "") then
+ hdr = hdr .. " for " .. player
+ end
+ RecipeRadar_Print(hdr .. ".")
+
+ if (RecipeRadar_SkillDB[GetRealmName()][player]) then
+ RecipeRadar_SkillDB[GetRealmName()][player] = { }
+ else
+ RecipeRadar_SkillDB[GetRealmName()] = { }
+ end
+
+end
+
+-- Debug function to print the skill database.
+function RecipeRadar_SkillDB_Print(player)
+
+ local hdr = "Printing all known recipes"
+ if (player ~= "") then
+ hdr = hdr .. " for " .. player
+ end
+ RecipeRadar_Print(hdr .. ".")
+
+ for realm_name, player_table in RecipeRadar_SkillDB do
+ RecipeRadar_Print(" Realm: " .. realm_name)
+
+ for player_name, prof_table in player_table.Professions do
+
+ if (player == "" or player == player_name) then
+
+ RecipeRadar_Print(" Player: " .. player_name)
+ for prof_name, recipe_table in prof_table do
+ RecipeRadar_Print(" Skill: " .. prof_name ..
+ " (Rank " .. recipe_table.Rank .. ")")
+ if (recipe_table.Recipes) then
+ for recipe_name, valid in recipe_table.Recipes do
+ RecipeRadar_Print(" Recipe: " .. recipe_name)
+ end
+ end
+ end
+
+ end
+
+ end
+
+ end
+
+end
+
+------------------------------------------------------------------------------
+-- Abstractions to account for the difference between crafts and trade skills
+------------------------------------------------------------------------------
+
+function RecipeRadar_SkillDB_GetProfInfo(prof_type)
+
+ if (prof_type == "trade") then
+ return GetTradeSkillLine()
+ elseif (prof_type == "craft") then
+ return GetCraftDisplaySkillLine()
+ end
+
+end
+
+function RecipeRadar_SkillDB_GetRecipeCount(prof_type)
+
+ if (prof_type == "trade") then
+ return GetNumTradeSkills()
+ elseif (prof_type == "craft") then
+ return GetNumCrafts()
+ end
+
+ return 0
+
+end
+
+function RecipeRadar_SkillDB_GetRecipeInfo(prof_type, index)
+
+ local name, hdr
+
+ if (prof_type == "trade") then
+ name, hdr = GetTradeSkillInfo(index)
+ elseif (prof_type == "craft") then
+ name, _, hdr = GetCraftInfo(index)
+ end
+
+ return name, hdr
+
+end
+
+------------------------------------------------------------------------------
+-- Functions to open/parse various frames to update skill info.
+------------------------------------------------------------------------------
+
+-- Attempts to open the spellbook and returns true if successful or false if
+-- the spellbook was already open.
+function RecipeRadar_SkillDB_ShowSpellbookFrame()
+
+ if (not SpellBookFrame:IsVisible()) then
+ ToggleSpellBook(BOOKTYPE_SPELL)
+ return true
+ end
+ return false
+
+end
+
+-- Closes the spellbook if it's visible and need_close is true.
+function RecipeRadar_SkillDB_HideSpellbookFrame(need_close)
+
+ if (SpellBookFrame:IsVisible() and need_close) then
+ ToggleSpellBook(BOOKTYPE_SPELL)
+ end
+
+end
+
+-- Opens the spellbook and finds profession windows to open in order
+-- to parse skill data from each.
+function RecipeRadar_SkillDB_ParseSpellbookFrame()
+
+ local need_close = RecipeRadar_SkillDB_ShowSpellbookFrame()
+
+ _, _, _, num_spells = GetSpellTabInfo(1)
+
+ for i = 1, num_spells do
+
+ local name = GetSpellName(i, BOOKTYPE_SPELL)
+ if (not name) then return end
+
+ -- open each of the player's crafting windows
+ if (RecipeRadar_IsProfession(name) and name ~= RRS("Fishing")) then
+ CastSpell(i, BOOKTYPE_SPELL)
+ end
+
+ -- check for trade skill specializations
+ local spec_prof = RecipeRadar_IsProfessionSpecialty(name)
+ if (spec_prof) then
+ local profs = RecipeRadar_SkillDB_GetPlayerProfessions()
+ if (not profs[spec_prof]) then profs[spec_prof] = { } end
+ profs[spec_prof].Specialty = name
+ end
+
+ end
+
+ HideUIPanel(TradeSkillFrame)
+ HideUIPanel(CraftFrame)
+
+ RecipeRadar_SkillDB_HideSpellbookFrame(need_close)
+
+end
+
+-- Opens the character window and sets it to the skill frame.
+function RecipeRadar_SkillDB_ShowSkillFrame()
+
+ PanelTemplates_SetTab(CharacterFrame, getglobal("SkillFrame"):GetID())
+ ShowUIPanel(CharacterFrame)
+ CharacterFrame_ShowSubFrame("SkillFrame")
+
+end
+
+-- Closes the character window.
+function RecipeRadar_SkillDB_HideSkillFrame()
+
+ HideUIPanel(CharacterFrame)
+
+end
+
+-- Opens the skill frame and parses profession data from the display.
+-- Just checking for fishing rank right now, as getting only rank (without
+-- recipe data) could be misleading for other professions.
+function RecipeRadar_SkillDB_ParseSkillFrame()
+
+ local profs = RecipeRadar_SkillDB_GetPlayerProfessions()
+
+ RecipeRadar_SkillDB_ShowSkillFrame()
+
+ for i = 1, GetNumSkillLines() do
+
+ local name, hdr, _, rank, _, modifier, max_rank = GetSkillLineInfo(i)
+
+ if (name == RRS("Fishing")) then
+
+ if (not profs[name]) then
+ profs[name] = { }
+ end
+
+ profs[name].Rank = rank
+ RecipeRadar_SkillDB_HandleSpecialCase(profs, name, max_rank)
+
+ end
+
+ end
+
+ RecipeRadar_SkillDB_HideSkillFrame()
+
+end
+
+-- Opens the character window and sets it to the reputation frame.
+function RecipeRadar_SkillDB_ShowReputationFrame()
+
+ PanelTemplates_SetTab(CharacterFrame, getglobal("ReputationFrame"):GetID())
+ ShowUIPanel(CharacterFrame)
+ CharacterFrame_ShowSubFrame("ReputationFrame")
+
+end
+
+-- Closes the character window.
+function RecipeRadar_SkillDB_HideReputationFrame()
+
+ HideUIPanel(CharacterFrame)
+
+end
+
+-- Opens the reputation frame and parses data from the display.
+function RecipeRadar_SkillDB_ParseReputationFrame()
+
+ local factions = RecipeRadar_SkillDB_GetPlayerFactions()
+
+ RecipeRadar_SkillDB_ShowReputationFrame()
+
+ for i = 1, GetNumFactions() do
+
+ -- note that we're skipping collapsed headers
+ local name, _, level = GetFactionInfo(i);
+
+ if (RecipeRadar_IsKnownFaction(name)) then
+ factions[name] = level
+ end
+
+ end
+
+ RecipeRadar_SkillDB_HideReputationFrame()
+
+end
diff --git a/RecipeRadar/Worldmap.lua b/RecipeRadar/Worldmap.lua
new file mode 100644
index 0000000..26ada01
--- /dev/null
+++ b/RecipeRadar/Worldmap.lua
@@ -0,0 +1,105 @@
+
+-- Worldmap.lua: worldmap vendor plotting code
+-- $Id: Worldmap.lua 430 2006-08-22 19:18:01Z jnmiller $
+
+-- Initializes the state of the worldmap overlays and settings.
+function RecipeRadar_Worldmap_Init()
+
+ for i = 1, RECIPERADAR_MAPPED_VENDORS_MAX do
+ getglobal("RecipeRadarWorldmapIcon" .. i):Hide()
+ end
+
+ -- this bit hooks the world map's OnHide event to reset the current zone
+ local map_frame = getglobal("WorldMapFrame")
+ local on_hide = map_frame:GetScript("OnHide")
+ if (on_hide) then
+ map_frame.RecipeRadar_OnHide = on_hide
+ map_frame:SetScript("OnHide",
+ function()
+ this.RecipeRadar_OnHide()
+ RecipeRadar_Minimap_OnNewRegion()
+ end)
+ end
+
+end
+
+-- Map the given icon to the given vendor.
+function RecipeRadar_Worldmap_AddVendor(id, vendor, region, continent)
+
+ local button = getglobal("RecipeRadarWorldmapIcon" .. id)
+ button.Vendor = vendor
+ button.Continent = continent
+ button.RegionName = region
+ button.RegionID = RecipeRadar_RegionNameToID(region, continent)
+ button.IsMapped = true
+
+end
+
+-- Resets and unmaps the given icon.
+function RecipeRadar_Worldmap_RemoveVendor(id)
+
+ local button = getglobal("RecipeRadarWorldmapIcon" .. id)
+ button.Vendor = nil
+ button.RegionID = nil
+ button.Continent = nil
+ button.IsMapped = false
+ button:Hide()
+
+end
+
+-- Calls TranslateCoords() on all active icons.
+function RecipeRadar_Worldmap_UpdateButtons()
+
+ for i = 1, RECIPERADAR_MAPPED_VENDORS_MAX do
+ local button = getglobal("RecipeRadarWorldmapIcon" .. i)
+ if (button.IsMapped) then
+ RecipeRadar_Worldmap_TranslateCoords(button)
+ end
+ end
+
+end
+
+-- Plot a vendor - called iteratively on the MappedVendors table.
+function RecipeRadar_Worldmap_TranslateCoords(button)
+
+ local cont, zone = GetCurrentMapContinent(), GetCurrentMapZone()
+
+ -- map is showing the vendor's region, so no translation is needed
+ if (cont == button.Continent and zone == button.RegionID) then
+
+ -- only mapping the first coordinate in our database
+ RecipeRadar_Worldmap_PlotVendor(button, button.Vendor.Coordinates[1])
+
+ -- map is showing the vendor's continent, so perform absolute translation
+ elseif (cont == button.Continent and zone == 0) then
+
+ local coords = RecipeRadar_Maps_LocalToAbsoluteTable(
+ button.Vendor.Coordinates[1], button.RegionName)
+ RecipeRadar_Worldmap_PlotVendor(button, coords)
+
+ -- worldmap is shown, so perform absolute/division translation
+ elseif (cont == 0 and zone == 0) then
+
+ local trans = RecipeRadar_MapData.Worldmap[button.Continent]
+ local coords = RecipeRadar_Maps_LocalToAbsoluteTable(
+ button.Vendor.Coordinates[1], button.RegionName)
+ coords.x = coords.x * trans.Scale + trans.Offset.x
+ coords.y = coords.y * trans.Scale + trans.Offset.y
+ RecipeRadar_Worldmap_PlotVendor(button, coords)
+
+ else
+ button:Hide()
+ end
+
+end
+
+-- Plot a vendor - convert x, y to WorldMapDetailFrame coordinates.
+function RecipeRadar_Worldmap_PlotVendor(button, coords)
+
+ local x = coords.x * WorldMapDetailFrame:GetWidth()
+ local y = -coords.y * WorldMapDetailFrame:GetHeight()
+
+ button:SetPoint("CENTER", "WorldMapDetailFrame", "TOPLEFT", x, y)
+ button:Show()
+
+end