From 5679d18159107da0d88baf067adf12d89fca066e Mon Sep 17 00:00:00 2001 From: torhal Date: Mon, 8 Jun 2009 05:08:03 +0000 Subject: [PATCH] Moved addon:GetKnownProfessions() and addon:GetTradeSpecialty() to local functions within a do block. Changed addon:PopulateRepFilters() to a local function. More table re-use, and some variable renames for readability. --- AckisRecipeList.lua | 418 ++++++++++++++++++++------------------------------- 1 file changed, 161 insertions(+), 257 deletions(-) diff --git a/AckisRecipeList.lua b/AckisRecipeList.lua index eb84e35..1eb61d7 100644 --- a/AckisRecipeList.lua +++ b/AckisRecipeList.lua @@ -99,7 +99,6 @@ local table = table local twipe = table.wipe local tremove = table.remove local tconcat = table.concat -local tsort = table.sort local tinsert = table.insert local string = string @@ -294,11 +293,8 @@ end function addon:OnEnable() - -- Make addon respond to the tradeskill windows being shown - self:RegisterEvent("TRADE_SKILL_SHOW") - - -- Addon responds to tradeskill windows being closed. - self:RegisterEvent("TRADE_SKILL_CLOSE") + self:RegisterEvent("TRADE_SKILL_SHOW") -- Make addon respond to the tradeskill windows being shown + self:RegisterEvent("TRADE_SKILL_CLOSE") -- Addon responds to tradeskill windows being closed. if (addon.db.profile.scantrainers) then self:RegisterEvent("TRAINER_SHOW") @@ -448,27 +444,27 @@ do local GetFactionInfo = GetFactionInfo local CollapseFactionHeader = CollapseFactionHeader local ExpandFactionHeader = ExpandFactionHeader + local rep_list = {} -- Description: Scans all reputations to get reputation levels to determine if the player can learn a reputation recipe - function addon:GetFactionLevels(RepTable) -- Bug here when I reload UI if (not RepTable) then return end - local t = {} + twipe(rep_list) -- Number of factions before we expand local numfactions = GetNumFactions() -- Lets expand all the headers - for i=numfactions,1,-1 do + for i = numfactions, 1, -1 do local name, _, _, _, _, _, _, _, _, isCollapsed = GetFactionInfo(i) if (isCollapsed) then ExpandFactionHeader(i) - t[name] = true + rep_list[name] = true end end @@ -476,8 +472,8 @@ do numfactions = GetNumFactions() -- Get the rep levels - for i=1,numfactions,1 do - local name,_,replevel = GetFactionInfo(i) + for i = 1, numfactions, 1 do + local name, _, replevel = GetFactionInfo(i) -- If the rep is greater than neutral if (replevel > 4) then @@ -487,10 +483,10 @@ do end -- Collapse the headers again - for i=numfactions,1,-1 do + for i = numfactions, 1, -1 do local name = GetFactionInfo(i) - if (t[name]) then + if (rep_list[name]) then CollapseFactionHeader(i) end end @@ -499,64 +495,6 @@ do end -- do block -do - - local GetSpellName = GetSpellName - local BOOKTYPE_SPELL = BOOKTYPE_SPELL - - -- Description: Scans first 25 spellbook slots to identify all applicable professions - - function addon:GetKnownProfessions(ProfTable) - - -- Reset the table, they may have unlearnt a profession - for i in pairs(ProfTable) do - ProfTable[i] = false - end - - -- Scan through the spell book getting the spell names - for index=1,25,1 do - - local spellName = GetSpellName(index, BOOKTYPE_SPELL) - - if (not spellName) or (index == 25) then - -- Nothing found - break - end - if (ProfTable[spellName] == false or spellName == GetSpellInfo(2656)) then - if spellName == GetSpellInfo(2656) then - ProfTable[GetSpellInfo(32606)] = true - else - ProfTable[spellName] = true - end - end - end - - end - - -- Description: Scans first 25 spellbook slots to identify which trade skill Specialty we have - - function addon:GetTradeSpecialty(SpecialtyTable, playerData) - - --Scan the first 25 entries - for index=1,25,1 do - - local spellName = GetSpellName(index, BOOKTYPE_SPELL) - - -- Nothing found, return nothing - if (not spellName) or (index == 25) then - return "" - -- We have a match, return that spell name - elseif (SpecialtyTable[playerData.playerProfession]) and (SpecialtyTable[playerData.playerProfession][spellName]) then - local ID = smatch(GetSpellLink(spellName), "^|c%x%x%x%x%x%x%x%x|Hspell:(%d+)") - return ID - end - - end - - end - -end -- do block - --[[ Tradeskill functions --]] @@ -1365,8 +1303,7 @@ do end -- Description: Creates an array of which factions we want to include in our display and which ones to ignore - -function addon:PopulateRepFilters(RepTable) +local function PopulateRepFilters(RepTable) local repfilters = addon.db.profile.filters.rep @@ -1476,38 +1413,40 @@ end ]]-- --- Description: Determines which profession we are dealing with and loads up the recipe information for it. -local function InitializeRecipes(RecipeDB, playerProfession) - -- Table of all possible professions with init functions - local professiontable = { - [GetSpellInfo(51304)] = addon.InitAlchemy, - [GetSpellInfo(51300)] = addon.InitBlacksmithing, - [GetSpellInfo(51296)] = addon.InitCooking, - [GetSpellInfo(51313)] = addon.InitEnchanting, - [GetSpellInfo(51306)] = addon.InitEngineering, - [GetSpellInfo(45542)] = addon.InitFirstAid, - -- Hack to get first aid working on frFR since I can't seem to get a proper spell ID :P - ["Premiers soins"] = addon.InitFirstAid, - [GetSpellInfo(51302)] = addon.InitLeatherworking, - [GetSpellInfo(32606)] = addon.InitSmelting, - [GetSpellInfo(51309)] = addon.InitTailoring, - [GetSpellInfo(51311)] = addon.InitJewelcrafting, - [GetSpellInfo(45363)] = addon.InitInscription, - [GetSpellInfo(53428)] = addon.InitRuneforging, - } - -- Check for player profession to fix some bugs with addons that interface with ARL - -- This source code is release under Public Domain - -- Thanks to sylvanaar/xinhuan for the code snippet - if (playerProfession) then - local a = professiontable[playerProfession] - - if a then - return a(addon, RecipeDB) - else - addon:Print(L["UnknownTradeSkill"]:format(playerProfession)) +local InitializeRecipes +do + local profession_table = {} -- Table of all possible professions with init functions + + -- Description: Determines which profession we are dealing with and loads up the recipe information for it. + function InitializeRecipes(RecipeDB, playerProfession) + profession_table[GetSpellInfo(51304)] = addon.InitAlchemy + profession_table[GetSpellInfo(51300)] = addon.InitBlacksmithing + profession_table[GetSpellInfo(51296)] = addon.InitCooking + profession_table[GetSpellInfo(51313)] = addon.InitEnchanting + profession_table[GetSpellInfo(51306)] = addon.InitEngineering + profession_table[GetSpellInfo(45542)] = addon.InitFirstAid + profession_table["Premiers soins"] = addon.InitFirstAid -- Hack to get first aid working on frFR since I can't seem to get a proper spell ID :P + profession_table[GetSpellInfo(51302)] = addon.InitLeatherworking + profession_table[GetSpellInfo(32606)] = addon.InitSmelting + profession_table[GetSpellInfo(51309)] = addon.InitTailoring + profession_table[GetSpellInfo(51311)] = addon.InitJewelcrafting + profession_table[GetSpellInfo(45363)] = addon.InitInscription + profession_table[GetSpellInfo(53428)] = addon.InitRuneforging + + -- Check for player profession to fix some bugs with addons that interface with ARL + -- This source code is release under Public Domain + -- Thanks to sylvanaar/xinhuan for the code snippet + if (playerProfession) then + local a = profession_table[playerProfession] + + if a then + return a(addon, RecipeDB) + else + addon:Print(L["UnknownTradeSkill"]:format(playerProfession)) + end end end -end +end -- do -- Description: Determines what to do when the slash command is called. @@ -1543,6 +1482,7 @@ do local UnitClass = UnitClass local UnitFactionGroup = UnitFactionGroup + local tsort = table.sort local RecipeList = nil @@ -1557,13 +1497,10 @@ do local AllSpecialtiesTable = nil local SpecialtyTable = nil - local playerData = nil - - local tradewindowopened = false - -- Variables for getting the locations - local locationlist = {} - local locationchecklist = {} + -- Tables for getting the locations + local location_list = {} + local location_checklist = {} -- Description: Determines all the locations a given recipe can be obtained @@ -1571,132 +1508,178 @@ do if not RecipeList or not RecipeList[SpellID] then return "" end - wipe(locationlist) - wipe(locationchecklist) + wipe(location_list) + wipe(location_checklist) - local recipeacquire = RecipeList[SpellID]["Acquire"] + local recipe_acquire = RecipeList[SpellID]["Acquire"] - for i in pairs(recipeacquire) do + for i in pairs(recipe_acquire) do -- Trainer - if (recipeacquire[i]["Type"] == 1) then + if (recipe_acquire[i]["Type"] == 1) then if (TrainerList) then --@alpha@ - if (not TrainerList[recipeacquire[i]["ID"]]) then - self:Print("Missing trainer in database: " .. recipeacquire[i]["ID"]) + if (not TrainerList[recipe_acquire[i]["ID"]]) then + self:Print("Missing trainer in database: " .. recipe_acquire[i]["ID"]) return end --@end-alpha@ - local location = TrainerList[recipeacquire[i]["ID"]]["Location"] - if (not locationchecklist[location]) then + local location = TrainerList[recipe_acquire[i]["ID"]]["Location"] + if (not location_checklist[location]) then -- Add the location to the list - tinsert(locationlist,location) - locationchecklist[location] = true + tinsert(location_list, location) + location_checklist[location] = true end end -- Vendor - elseif (recipeacquire[i]["Type"] == 2) then + elseif (recipe_acquire[i]["Type"] == 2) then if (VendorList) then --@alpha@ - if (not VendorList[recipeacquire[i]["ID"]]) then - self:Print("Missing vendor in database: " .. recipeacquire[i]["ID"]) + if (not VendorList[recipe_acquire[i]["ID"]]) then + self:Print("Missing vendor in database: " .. recipe_acquire[i]["ID"]) end --@end-alpha@ - local location = VendorList[recipeacquire[i]["ID"]]["Location"] - if (not locationchecklist[location]) then + local location = VendorList[recipe_acquire[i]["ID"]]["Location"] + if (not location_checklist[location]) then -- Add the location to the list - tinsert(locationlist,location) - locationchecklist[location] = true + tinsert(location_list, location) + location_checklist[location] = true end end -- Mob Drop - elseif (recipeacquire[i]["Type"] == 3) then + elseif (recipe_acquire[i]["Type"] == 3) then if (MobList) then --@alpha@ - if (not MobList[recipeacquire[i]["ID"]]) then - self:Print("Missing mob in database: " .. recipeacquire[i]["ID"]) + if (not MobList[recipe_acquire[i]["ID"]]) then + self:Print("Missing mob in database: " .. recipe_acquire[i]["ID"]) end --@end-alpha@ - local location = MobList[recipeacquire[i]["ID"]]["Location"] - if (not locationchecklist[location]) then + local location = MobList[recipe_acquire[i]["ID"]]["Location"] + if (not location_checklist[location]) then -- Add the location to the list - tinsert(locationlist,location) - locationchecklist[location] = true + tinsert(location_list, location) + location_checklist[location] = true end end -- Quest - elseif (recipeacquire[i]["Type"] == 4) then + elseif (recipe_acquire[i]["Type"] == 4) then if (QuestList) then --@alpha@ - if (not QuestList[recipeacquire[i]["ID"]]) then - self:Print("Missing quest in database: " .. recipeacquire[i]["ID"]) + if (not QuestList[recipe_acquire[i]["ID"]]) then + self:Print("Missing quest in database: " .. recipe_acquire[i]["ID"]) end --@end-alpha@ - local location = QuestList[recipeacquire[i]["ID"]]["Location"] - if (not locationchecklist[location]) then + local location = QuestList[recipe_acquire[i]["ID"]]["Location"] + if (not location_checklist[location]) then -- Add the location to the list - tinsert(locationlist,location) - locationchecklist[location] = true + tinsert(location_list, location) + location_checklist[location] = true end end -- World Drop - elseif (recipeacquire[i]["Type"] == 7) then + elseif (recipe_acquire[i]["Type"] == 7) then local location = L["World Drop"] - if (not locationchecklist[location]) then + if (not location_checklist[location]) then -- Add the location to the list - tinsert(locationlist,location) - locationchecklist[location] = true + tinsert(location_list, location) + location_checklist[location] = true end end end -- Sort the list by the name - tsort(locationlist, function(a, b) return a < b end) + tsort(location_list, function(a, b) return a < b end) -- Return the list as a string - if (#locationlist == 0)then + if (#location_list == 0)then return "" else - return tconcat(locationlist,",") + return tconcat(location_list, ",") end end -- Description: Toggles the flag that a trade window is opened + local TRADE_WINDOW_OPENED = false + function addon:OpenTradeWindow() - tradewindowopened = true + TRADE_WINDOW_OPENED = true end -- Description: Toggles the flag that a trade window is opened function addon:CloseTradeWindow() - tradewindowopened = false + TRADE_WINDOW_OPENED = false end - -- Description: Updates the reputation table. This only happens seldomly so I'm not worried about effeciency + ------------------------------------------------------------------------------- + -- Upvalued globals + ------------------------------------------------------------------------------- + local GetSpellName = GetSpellName + local BOOKTYPE_SPELL = BOOKTYPE_SPELL - function addon:SetRepDB() + ------------------------------------------------------------------------------- + -- Description: Scans first 25 spellbook slots to identify all applicable professions + ------------------------------------------------------------------------------- + local function GetKnownProfessions(ProfTable) + -- Reset the table, they may have unlearnt a profession + for i in pairs(ProfTable) do + ProfTable[i] = false + end - if (playerData and playerData["Reputation"]) then - self:GetFactionLevels(playerData["Reputation"]) + -- Scan through the spell book getting the spell names + for index=1,25,1 do + + local spellName = GetSpellName(index, BOOKTYPE_SPELL) + + if (not spellName) or (index == 25) then + -- Nothing found + break + end + if (ProfTable[spellName] == false or spellName == GetSpellInfo(2656)) then + if spellName == GetSpellInfo(2656) then + ProfTable[GetSpellInfo(32606)] = true + else + ProfTable[spellName] = true + end + end end end - -- Description: Initializes and adds data relavent to the player character + ------------------------------------------------------------------------------- + -- Scans first 25 spellbook slots to identify which trade skill Specialty we have + ------------------------------------------------------------------------------- + local function GetTradeSpecialty(SpecialtyTable, playerData) + --Scan the first 25 entries + for index = 1, 25, 1 do + local spellName = GetSpellName(index, BOOKTYPE_SPELL) - local function InitPlayerData() + -- Nothing found, return nothing + if (not spellName) or (index == 25) then + return "" + -- We have a match, return that spell name + elseif (SpecialtyTable[playerData.playerProfession]) and (SpecialtyTable[playerData.playerProfession][spellName]) then + local ID = smatch(GetSpellLink(spellName), "^|c%x%x%x%x%x%x%x%x|Hspell:(%d+)") + return ID + end + end + end - local pData = {} + ------------------------------------------------------------------------------- + -- Initializes and adds data relavent to the player character + ------------------------------------------------------------------------------- + local playerData = {} - pData.playerFaction = UnitFactionGroup("player") - local _ - _, pData.playerClass = UnitClass("player") + local function InitPlayerData() + local _, cls = UnitClass("player") - pData["Reputation"] = {} + playerData.playerFaction = UnitFactionGroup("player") + playerData.playerClass = cls + playerData["Reputation"] = {} - addon:GetFactionLevels(pData["Reputation"]) + addon:GetFactionLevels(playerData["Reputation"]) - pData["Professions"] = { + playerData["Professions"] = { [GetSpellInfo(51304)] = false, -- Alchemy [GetSpellInfo(51300)] = false, -- Blacksmithing [GetSpellInfo(51296)] = false, -- Cooking @@ -1711,8 +1694,7 @@ do [GetSpellInfo(45363)] = false, -- Inscription [GetSpellInfo(53428)] = false, -- Runeforging } - - addon:GetKnownProfessions(pData["Professions"]) + GetKnownProfessions(playerData["Professions"]) -- All Alchemy Specialties local AlchemySpec = { @@ -1767,13 +1749,18 @@ do for i in pairs(EngineeringSpec) do AllSpecialtiesTable[i] = true end for i in pairs(LeatherworkSpec) do AllSpecialtiesTable[i] = true end for i in pairs(TailorSpec) do AllSpecialtiesTable[i] = true end + end + + -- Description: Updates the reputation table. This only happens seldomly so I'm not worried about effeciency + function addon:SetRepDB() - return pData + if (playerData and playerData["Reputation"]) then + self:GetFactionLevels(playerData["Reputation"]) + end end -- Description: Initalizes all the recipe databases to their initial - local function InitDatabases() -- Initializes the custom list @@ -1841,14 +1828,14 @@ do function addon:AckisRecipeList_Command(textdump) -- If we don't have a trade skill window open, lets return out of here - if (not tradewindowopened) then + if (not TRADE_WINDOW_OPENED) then self:Print(L["OpenTradeSkillWindow"]) return -- Trade type skills else -- First time a scan has been run, we need to get the player specifc data, specifically faction information, profession information and other pertinant data. - if (playerData == nil) then - playerData = InitPlayerData() + if not playerData.playerClass then + InitPlayerData() end -- Lets create all the databases needed if this is the first time everything has been run. if (RecipeList == nil) then @@ -1858,14 +1845,14 @@ do playerData.playerProfession, playerData.playerProfessionLevel = GetTradeSkillLine() -- Get the current profession Specialty - playerData.playerSpecialty = self:GetTradeSpecialty(SpecialtyTable, playerData) + playerData.playerSpecialty = GetTradeSpecialty(SpecialtyTable, playerData) -- Add the recipes to the database playerData.totalRecipes = InitializeRecipes(RecipeList, playerData.playerProfession) -- Scan all recipes and mark the ones which ones we know self:ScanForKnownRecipes(RecipeList, playerData) -- Update the table containing which reps to display - self:PopulateRepFilters(RepFilters) + PopulateRepFilters(RepFilters) -- Add filtering flags to the recipes self:UpdateFilters(RecipeList, AllSpecialtiesTable, playerData) -- Mark excluded recipes @@ -1957,94 +1944,13 @@ end --[[ - Sorting Functions - -]]-- - -do - -- Sorting functions - local sortFuncs = nil - - -- Create a new array for the sorted index - local SortedRecipeIndex = {} - - -- Description: Sorts the recipe Database depending on the settings defined in the database. - function addon:SortMissingRecipes(RecipeDB) - if (not sortFuncs) then - sortFuncs = {} - sortFuncs["SkillAsc"] = function(a, b) - if (RecipeDB[a]["Level"] == RecipeDB[b]["Level"]) then - return RecipeDB[a]["Name"] < RecipeDB[b]["Name"] - else - return RecipeDB[a]["Level"] < RecipeDB[b]["Level"] - end - end - - sortFuncs["SkillDesc"] = function(a, b) - if (RecipeDB[a]["Level"] == RecipeDB[b]["Level"]) then - return RecipeDB[a]["Name"] < RecipeDB[b]["Name"] - else - return RecipeDB[b]["Level"] < RecipeDB[a]["Level"] - end - end - - sortFuncs["Name"] = function(a, b) - return RecipeDB[a]["Name"] < RecipeDB[b]["Name"] - end - - -- Will only sort based off of the first acquire type - sortFuncs["Acquisition"] = function (a, b) - local reca = RecipeDB[a]["Acquire"][1] - local recb = RecipeDB[b]["Acquire"][1] - if (reca and recb) then - if (reca["Type"] == recb["Type"]) then - return RecipeDB[a]["Name"] < RecipeDB[b]["Name"] - else - return reca["Type"] < recb["Type"] - end - else - return not not reca - end - end - - -- Will only sort based off of the first acquire type - sortFuncs["Location"] = function (a, b) - -- We do the or "" because of nil's, I think this would be better if I just left it as a table which was returned - local reca = RecipeDB[a]["Locations"] or "" - local recb = RecipeDB[b]["Locations"] or "" - reca = smatch(reca,"(%w+),") or "" - recb = smatch(recb,"(%w+),") or "" - if (reca == recb) then - return RecipeDB[a]["Name"] < RecipeDB[b]["Name"] - else - return (reca < recb) - end - end - end - twipe(SortedRecipeIndex) - - -- Get all the indexes of the RecipeListing - for n, v in pairs(RecipeDB) do - tinsert(SortedRecipeIndex, n) - end - - tsort(SortedRecipeIndex, sortFuncs[addon.db.profile.sorting]) - - return SortedRecipeIndex - - end - -end - ---[[ - Recipe Exclusion Functions --]] -- Description: Marks all exclusions in the recipe database to not be displayed -function addon:GetExclusions(RecipeDB,prof) +function addon:GetExclusions(RecipeDB, prof) local exclusionlist = addon.db.profile.exclusionlist local countknown = 0 @@ -2071,9 +1977,7 @@ function addon:GetExclusions(RecipeDB,prof) end end - return countknown, countunknown - end -- Description: Removes or adds a recipe to the exclusion list. -- 1.7.9.5