mirror of
https://github.com/MarkuruThunderhoof/RecipeRadar.git
synced 2026-09-22 07:26:56 +00:00
434 lines
12 KiB
Lua
434 lines
12 KiB
Lua
|
|
-- 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 RecipeRadar_SkillDB) then
|
|
RecipeRadar_SkillDB_Init()
|
|
end
|
|
|
|
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
|