annotate core.lua @ 47:c6a4525f7ba7 v2.01a release

(none)
author "Aaron Bregger <killermonkey99@gmail.com>"
date Tue, 04 Jan 2011 19:35:12 -0600
parents 352fe939b884
children bc43986f7fb0
rev   line source
Aaron@4 1 --[[--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))
Aaron@4 2
Aaron@4 3 RecipeProfit by -[@project-author@]-
Aaron@4 4
Aaron@4 5 Rev: @project-revision@
Aaron@4 6 Updated: @file-date-iso@
Aaron@4 7
Aaron@4 8 --))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))
Aaron@4 9
Aaron@22 10 URL:
Aaron@22 11 http://www.wrathguides.com/
Aaron@22 12
Aaron@22 13 License:
Aaron@22 14 This file is a part of "RecipeProfit for GatherMate."
Aaron@22 15
Aaron@22 16 This program is free software; you can redistribute it and/or
Aaron@22 17 modify it under the terms of the GNU General Public License
Aaron@22 18 as published by the Free Software Foundation, either version 3
Aaron@22 19 of the License, or (at your option) any later version.
Aaron@22 20
Aaron@22 21 This program is distributed in the hope that it will be useful,
Aaron@22 22 but WITHOUT ANY WARRANTY; without even the implied warranty of
Aaron@22 23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Aaron@22 24 GNU General Public License for more details.
Aaron@22 25
Aaron@22 26 You should have received a copy of the GNU General Public License
killermonkey99@36 27 along with this program. If not, see <http://www.gnu.org/licenses/>.
Aaron@22 28
Aaron@22 29 Note:
Aaron@22 30 This program's source code is specifically designed to work with
Aaron@22 31 World of Warcraft's interpreted AddOn system.
Aaron@22 32
Aaron@22 33 You have an implicit license to use this program with these facilities
Aaron@22 34 since that is it's designated purpose as per:
Aaron@22 35 http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat
Aaron@4 36
Aaron@4 37 --]]--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))--))
Aaron@4 38
Aaron@22 39
killermonkey99@36 40 local RecipeProfit = LibStub("AceAddon-3.0"):NewAddon("RecipeProfit", "AceEvent-3.0", "AceConsole-3.0", "AceTimer-3.0")
killermonkey99@36 41
killermonkey99@36 42 local GatherMate = LibStub("AceAddon-3.0"):GetAddon("GatherMate2")
killermonkey99@36 43
Aaron@0 44 local tabletest = {}
Aaron@16 45 local db = {}
Aaron@1 46 local safeRecipes = {}
Aaron@16 47 local ids = {}
Aaron@24 48 local nodeLookup = {}
Aaron@16 49
Aaron@17 50 local profile
Aaron@17 51
Aaron@0 52 RecipeProfit.db = db;
Aaron@0 53
Aaron@17 54 --[[ Forward Definitions (for local functions) ]]
Aaron@16 55 local get_faction_db,
Aaron@16 56 add_note,
Aaron@16 57 button_update,
Aaron@16 58 find_good_id,
Aaron@16 59 safe_cache_vendor,
Aaron@17 60 get_note_title,
Aaron@17 61 get_next_texture_id,
Aaron@17 62 set_node_constants,
Aaron@24 63 get_colored_note_name,
Aaron@17 64 inject_options;
Aaron@16 65
Aaron@17 66 --[[ Deep table inspection for debugging ]]
Aaron@0 67 function debugprint(val, indent)
Aaron@0 68 indent = indent or "";
Aaron@0 69 if not(type(val) == "table") then
Aaron@0 70 print("Not table: " .. val)
Aaron@0 71 return
Aaron@0 72 end
Aaron@0 73
Aaron@0 74 for k,v in pairs(val) do
Aaron@0 75 if(type(k) == "table" and type(v) == "table") then
Aaron@0 76 print(indent .. "table key: {")
Aaron@0 77 debugprint(k, indent .. " ")
Aaron@0 78 print(indent .. "} = {")
Aaron@0 79 debugprint(v, indent .. " ")
Aaron@0 80 print(indent .. "}")
Aaron@12 81 elseif(type(v) == "table") then
Aaron@0 82 print(indent .. k .. " = {")
Aaron@0 83 debugprint(v, indent .. " ")
Aaron@0 84 print(indent .. "}")
Aaron@0 85 else
Aaron@12 86 if(type(v) ~= "boolean") then
Aaron@12 87 print(indent .. k .. " = " .. v)
Aaron@12 88 else
Aaron@12 89 print(indent .. k .. " = " .. (v and "true" or "false"))
Aaron@12 90 end
Aaron@0 91 end
Aaron@0 92 end
Aaron@0 93 end
Aaron@8 94
Aaron@0 95 local options = {
Aaron@0 96 type = "group",
Aaron@0 97 name = "RecipeProfit", -- addon name to import from, don't localize
Aaron@0 98 handler = {},
Aaron@0 99 disabled = false,
Aaron@0 100 args = {
killermonkey99@36 101 heading = {
killermonkey99@36 102 order = 0,
killermonkey99@36 103 type = "description",
killermonkey99@36 104 name = "Thank you for using RecipeProfit for GatherMate!\n\n"..
killermonkey99@36 105 "RecipeProfit was recently updated to work with patch 4.0.x and GatherMate 2. If you find any bugs you can report them on curse.com or curseforge.com by contacting the author 'Yuffles'. "..
killermonkey99@36 106 "You can also email the author at killermonkey99".. --[[anti-spambot]] "@".."gmail.com (please try to put \"RecipeProfit\" in the subject!)\n\n"..
killermonkey99@36 107 "You can toggle the display of RecipeProfit nodes on the map and minimap by changing the options in the general GatherMate 2 menu.",
killermonkey99@36 108 width = "full",
killermonkey99@36 109 },
Aaron@0 110 }
Aaron@0 111 }
Aaron@0 112
killermonkey99@36 113 --maps wowhead IDs to localization independant map ids O_O
killermonkey99@36 114 local zidmap={[1]=27,[3]=17,[4]=19,[8]=38,[10]=34,[11]=40,[12]=30,[14]=4,
killermonkey99@36 115 [15]=141,[16]=181,[17]=11,[28]=22,[33]=37,[38]=35,[40]=39,[41]=32,[44]=36,
killermonkey99@36 116 [45]=16,[46]=29,[47]=26,[51]=28,[65]=488,[66]=496,[67]=495,[85]=20,
killermonkey99@36 117 [130]=21,[139]=23,[141]=41,[148]=42,[210]=492,[215]=9,[267]=24,[331]=43,
killermonkey99@36 118 [357]=121,[361]=182,[394]=490,[400]=61,[405]=101,[406]=81,[440]=161,
killermonkey99@36 119 [490]=201,[493]=241,[495]=491,[616]=606,[618]=281,[1377]=261,[1497]=382,
killermonkey99@36 120 [1519]=301,[1537]=341,[1637]=321,[1638]=362,[1657]=381,[3430]=462,
killermonkey99@36 121 [3433]=463,[3483]=465,[3487]=480,[3518]=477,[3519]=478,[3520]=473,
killermonkey99@36 122 [3521]=467,[3522]=475,[3523]=479,[3524]=464,[3525]=476,[3537]=486,
killermonkey99@36 123 [3557]=471,[3703]=481,[3711]=493,[4080]=499,[4197]=501,[4395]=504,
killermonkey99@36 124 [4709]=607,[4714]=545,[4720]=544,[4737]=605,[4755]=611,[4815]=610,
killermonkey99@36 125 [4922]=700,[5034]=720,[5042]=640,[5095]=708,[5144]=615,[5145]=614,
killermonkey99@36 126 [5146]=613,[5287]=673,[5339]=689,[5416]=737,[5630]=737,[5695]=772
killermonkey99@36 127 }
killermonkey99@36 128
Aaron@0 129 local defaults = {
Aaron@1 130 faction = "default",
Aaron@1 131 safebuy = "on",
Aaron@16 132
Aaron@16 133 --submitting cached data not yet implemented
Aaron@16 134 enable_cache = false,
Aaron@16 135 location_cache = {},
Aaron@0 136 }
Aaron@0 137
Aaron@0 138 function RecipeProfit:OnInitialize()
Aaron@17 139 profile = RECIPEPROFIT_profile or defaults
Aaron@7 140
Aaron@1 141 for k, v in pairs(defaults) do
Aaron@1 142 profile[k] = profile[k] or v;
Aaron@1 143 end
Aaron@1 144
Aaron@12 145 self:RegisterChatCommand("recipeprofit", "ShowOptions")
Aaron@12 146 self:RegisterChatCommand("rp", "ShowOptions")
Aaron@12 147 self:RegisterChatCommand("profit", "ShowOptions")
Aaron@12 148
Aaron@0 149 db.profile = profile
Aaron@0 150 db.storage = {}
Aaron@0 151
Aaron@0 152 GatherMate:GetModule("Config"):RegisterModule("RecipeProfit", options)
Aaron@0 153 GatherMate:RegisterDBType("RecipeProfit", db.storage)
Aaron@8 154 GatherMate.db.profile.show["RecipeProfit"] = GatherMate.db.profile.show["RecipeProfit"] or "always"
Aaron@0 155
Aaron@17 156 set_node_constants()
Aaron@17 157 inject_options()
Aaron@8 158
Aaron@0 159 GatherMate:GetModule("Config"):UpdateConfig()
killermonkey99@36 160 GatherMate:GetModule("Config"):SendMessage("GatherMate2ConfigChanged")
Aaron@24 161
Aaron@24 162 --[[ hook GetNameForNode for custom highlighting ]]
Aaron@24 163 local oldFunction = GatherMate.GetNameForNode
Aaron@24 164
Aaron@24 165 GatherMate.GetNameForNode = function(lself, type, nodeID)
Aaron@24 166 if(type == "RecipeProfit") then
Aaron@24 167 return get_colored_note_name(lself, nodeID)
Aaron@24 168 else
Aaron@24 169 return oldFunction(lself, type, nodeID)
Aaron@24 170 end
Aaron@24 171 end
Aaron@24 172
killermonkey99@36 173 --[[hook OnProfileChanged to fix cleanup database ]]
Aaron@26 174 local oldFunction2 = GatherMate.OnProfileChanged
Aaron@26 175
Aaron@26 176 GatherMate.OnProfileChanged = function(lself, ...)
Aaron@26 177 lself.db.profile.cleanupRange["RecipeProfit"] = lself.db.profile.cleanupRange["RecipeProfit"] or 15
killermonkey99@36 178 lself.db.profile.show["RecipeProfit"] = lself.db.profile.show["RecipeProfit"] == "never" and "never" or "always";
Aaron@26 179 oldFunction2(lself, ...)
Aaron@26 180 end
Aaron@26 181
Aaron@0 182 end
Aaron@0 183
Aaron@17 184
Aaron@17 185 function RecipeProfit:OnEnable()
Aaron@17 186
Aaron@17 187 _G["MerchantPrevPageButton"]:HookScript("OnClick", self.UpdateButtons)
Aaron@17 188 _G["MerchantNextPageButton"]:HookScript("OnClick", self.UpdateButtons)
Aaron@17 189
Aaron@17 190 self:RegisterEvent("MERCHANT_SHOW", "UpdateButtons")
Aaron@17 191 self:RegisterEvent("MERCHANT_UPDATE", "UpdateButtons")
Aaron@17 192 self:RegisterEvent("BAG_UPDATE", "UpdateButtons")
Aaron@28 193
Aaron@17 194 RecipeProfit:DoMerge()
killermonkey99@45 195 if(GatherMate.db.profile.show["RecipeProfit"] ~= "always" and GatherMate.db.profile.show["RecipeProfit"] ~= "never") then
killermonkey99@45 196 GatherMate.db.profile.show["RecipeProfit"] = "always"
killermonkey99@45 197 GatherMate:GetModule("Config"):SendMessage("GatherMate2ConfigChanged")
killermonkey99@45 198 end
Aaron@17 199 end
Aaron@17 200
Aaron@12 201 function RecipeProfit:ShowOptions()
killermonkey99@36 202 InterfaceOptionsFrame_OpenToCategory("GatherMate 2")
killermonkey99@36 203 LibStub("AceConfigDialog-3.0"):SelectGroup("GatherMate 2", "RecipeProfit")
Aaron@12 204 end
Aaron@12 205
Aaron@16 206 function RecipeProfit:UpdateButtons(event, ...)
Aaron@16 207 --print("UpdateButtons", event)
Aaron@28 208 if(WorldMapFrame:IsShown()) then
Aaron@28 209 local continent, zone = GetCurrentMapContinent(), GetCurrentMapZone()
Aaron@28 210 SetMapZoom(continent)
Aaron@28 211 SetMapZoom(continent, zone)
Aaron@28 212 else
Aaron@28 213 SetMapZoom(-1)
Aaron@28 214 end
Aaron@28 215
Aaron@28 216 GatherMate:GetModule("Display"):UpdateMaps()
Aaron@28 217
Aaron@16 218 if(not MerchantFrame:IsVisible()) then
Aaron@16 219 --print("UpdateButtons - (Event: ", event, ") - MerchantFrame not visible.");
Aaron@16 220 return;
Aaron@16 221 end
Aaron@16 222
Aaron@16 223 for i=1, MERCHANT_ITEMS_PER_PAGE, 1 do
Aaron@16 224 local buttonframe = _G["MerchantItem"..i];
Aaron@16 225 local index = (((MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE) + i);
Aaron@16 226 --print(index)
Aaron@16 227 if index <= GetMerchantNumItems() then
Aaron@16 228 button_update(buttonframe)
Aaron@16 229 end
Aaron@16 230 end
Aaron@17 231 end
Aaron@16 232
Aaron@16 233 function RecipeProfit:DoMerge()
Aaron@16 234 ids = {}
killermonkey99@36 235 local alliance = get_faction_db();
Aaron@16 236
Aaron@16 237 GatherMate:ClearDB("RecipeProfit")
killermonkey99@36 238 for id, note in pairs(RECIPEPROFIT_database) do
killermonkey99@36 239 if((note.a and alliance) or (note.h and not alliance)) then
killermonkey99@36 240 x, y = find_good_id(note.x, note.y)
killermonkey99@36 241 add_note(x, y, note)
killermonkey99@36 242 end
Aaron@16 243 end
Aaron@16 244
Aaron@16 245 GatherMate:SendMessage("GatherMateDataImport")
killermonkey99@36 246 GatherMate:GetModule("Config"):SendMessage("GatherMate2ConfigChanged")
Aaron@16 247 end
Aaron@16 248
Aaron@16 249 function get_note_title(note, factionTag)
Aaron@16 250 if(not factionTag) then
Aaron@16 251 _, factionTag = get_faction_db();
Aaron@16 252 end
Aaron@16 253
Aaron@16 254 return note.item.." - ("..note.vendor.." ".. factionTag ..")";
Aaron@16 255 end
Aaron@16 256
Aaron@16 257 function add_note(x, y, note)
killermonkey99@36 258 local coords = GatherMate.mapData:EncodeLoc(x/100, y/100, 0)
killermonkey99@36 259 local zoneID = zidmap[note.map]
killermonkey99@36 260 if(not zoneID) then
killermonkey99@36 261 return
killermonkey99@36 262 end
Aaron@33 263
killermonkey99@36 264 local nodeID = GatherMate.nodeIDs["RecipeProfit"][get_note_title(note, "")]
killermonkey99@36 265 GatherMate:InjectNode(zoneID, coords, "RecipeProfit", nodeID)
Aaron@16 266 end
Aaron@16 267
Aaron@16 268 function get_faction_db()
Aaron@16 269 local factionAlliance = db.profile.faction == "Alliance" or
Aaron@16 270 db.profile.faction == "default" and UnitFactionGroup("player") == "Alliance";
killermonkey99@36 271
Aaron@16 272 if(factionAlliance) then
killermonkey99@36 273 return true, ""
Aaron@16 274 else
killermonkey99@36 275 return false, ""
Aaron@16 276 end
Aaron@16 277 end
Aaron@16 278
Aaron@16 279 function safe_cache_vendor()
Aaron@16 280 if(not profile.enable_cache) then
Aaron@16 281 return
Aaron@16 282 end
Aaron@16 283
Aaron@16 284 if(not profile.location_cache[UnitName("NPC")]) then
Aaron@16 285 SetMapToCurrentZone()
Aaron@16 286 local pos = {}
Aaron@16 287 pos.x, pos.y = GetPlayerMapPosition("player")
Aaron@16 288 profile.location_cache[UnitName("NPC")] = pos
Aaron@16 289 end
Aaron@16 290 end
Aaron@15 291
Aaron@9 292 function button_update(self)
Aaron@9 293 local buttonName = _G[self:GetName().."Name"];
Aaron@9 294 local link = GetMerchantItemLink(_G[self:GetName().."ItemButton"]:GetID());
Aaron@9 295 if(not link) then
Aaron@9 296 return;
Aaron@9 297 end
Aaron@9 298
Aaron@9 299 local sName, sLink, iRarity, iLevel, iMinLevel, sType, sSubType, iStackCount = GetItemInfo(link)
Aaron@9 300
Aaron@16 301 if(sType == "Recipe" and safeRecipes[sName]) then
Aaron@16 302 safe_cache_vendor();
Aaron@9 303 SetItemButtonNameFrameVertexColor(self, 0, 0, 1.0);
Aaron@9 304 SetItemButtonSlotVertexColor(self, 0, 0, 0.5);
Aaron@9 305 buttonName:SetText("* " .. sName)
Aaron@28 306
Aaron@9 307 if(GetItemCount(link, true) == 0) then
Aaron@9 308 buttonName:SetTextColor(0,1,1);
Aaron@9 309 elseif(GetItemCount(link, true) < 5) then
Aaron@9 310 buttonName:SetTextColor(1,0,1);
Aaron@9 311 else
Aaron@9 312 buttonName:SetTextColor(1,0,0);
Aaron@9 313 end
Aaron@28 314
Aaron@9 315 else
Aaron@9 316 buttonName:SetTextColor(GameFontNormalSmall:GetTextColor());
Aaron@9 317 end
Aaron@9 318 end
Aaron@9 319
Aaron@16 320 function find_good_id(x, y)
Aaron@0 321 if ids[x.." "..y] then
Aaron@16 322 return find_good_id(x + .01, y)
Aaron@0 323 end
Aaron@0 324
Aaron@0 325 ids[x.." "..y] = true
Aaron@0 326 return x, y
Aaron@17 327 end
Aaron@17 328
Aaron@17 329 local lastNodeTextureId = 0;
Aaron@17 330
Aaron@17 331 function get_next_texture_id()
Aaron@17 332 lastNodeTextureId = lastNodeTextureId + 1;
Aaron@17 333 return lastNodeTextureId;
Aaron@17 334 end
Aaron@17 335
Aaron@17 336 function set_node_constants()
Aaron@17 337 GatherMate.nodeIDs["RecipeProfit"] = {}
Aaron@17 338 GatherMate.nodeTextures["RecipeProfit"] = {}
Aaron@17 339 GatherMate.nodeMinHarvest["RecipeProfit"] = {}
Aaron@17 340
Aaron@17 341 local nodes = GatherMate.nodeIDs["RecipeProfit"]
killermonkey99@36 342 for id, note in pairs(RECIPEPROFIT_database) do
Aaron@17 343 safeRecipes[note.item] = true;
Aaron@24 344 local id = get_next_texture_id();
killermonkey99@36 345
killermonkey99@36 346 nodes[get_note_title(note, "")] = id;
Aaron@24 347 nodeLookup[id] = note;
Aaron@17 348 end
Aaron@17 349
Aaron@17 350 for i = 1, lastNodeTextureId, 1 do
Aaron@17 351 GatherMate.nodeTextures["RecipeProfit"][i] = "Interface\\Icons\\INV_Scroll_05"
Aaron@17 352 end
Aaron@17 353
Aaron@17 354 GatherMate.reverseNodeIDs["RecipeProfit"] = GatherMate:CreateReversedTable(nodes)
Aaron@17 355 end
Aaron@17 356
Aaron@17 357 function inject_options()
killermonkey99@36 358 local acr = LibStub("AceConfigRegistry-3.0")
killermonkey99@36 359 acr:GetOptionsTable("GatherMate 2", "dialog", "RecipeProfit-1.0").args["showRecipeProfit"] = {
killermonkey99@36 360 order = 7,
Aaron@17 361 name = "Show RecipeProfit nodes.",
Aaron@17 362 desc = "Toggle showing nodes added by RecipeProfit.",
Aaron@17 363 type = "select",
Aaron@17 364 values = {
killermonkey99@36 365 always = "Always show",
killermonkey99@36 366 never = "Never show",
Aaron@17 367 },
Aaron@17 368 arg = "RecipeProfit",
Aaron@17 369 }
Aaron@17 370
killermonkey99@36 371 GatherMate:GetModule("Config"):SendMessage("GatherMate2ConfigChanged")
Aaron@17 372 end
Aaron@24 373
Aaron@24 374 function get_colored_note_name(self, nodeID)
Aaron@24 375 local text = self.reverseNodeIDs["RecipeProfit"][nodeID]
Aaron@24 376 local sName, sLink, iRarity, iLevel, iMinLevel, sType, sSubType, iStackCount = GetItemInfo(nodeLookup[nodeID].itementry)
Aaron@24 377
Aaron@24 378 if(not sLink) then
killermonkey99@36 379 RecipeProfit:ScheduleTimer("UpdateButtons", 3)
killermonkey99@36 380 return "|cFF000000(??) |cFF66DD66" .. text .. "|cFFFF0000 Please Wait (Querying Server)..."
Aaron@24 381 end
Aaron@24 382
Aaron@24 383 local count = GetItemCount(sLink, true)
Aaron@24 384 local prefix = "|cFF888888(" .. count .. ") |cFF66DD66"
Aaron@24 385
Aaron@24 386 if(count == 0) then
Aaron@24 387 prefix = "|cFF00FFFF(" .. count .. ") |cFF66DD66"
Aaron@24 388 elseif(count >= 5) then
Aaron@24 389 prefix = "|cFFFF0000(" .. count .. ") |cFF66DD66"
Aaron@24 390 end
Aaron@24 391
Aaron@24 392 return prefix .. text
Aaron@24 393 end