annotate core.lua @ 38:9c03e32a2654

Added tag v2.0 for changeset 2891ad322db6
author "Aaron Bregger <killermonkey99@gmail.com>"
date Tue, 04 Jan 2011 17:54:32 -0600
parents 1e73cfb6f363
children d97f61fad5b6
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()
Aaron@17 195 end
Aaron@17 196
Aaron@12 197 function RecipeProfit:ShowOptions()
killermonkey99@36 198 InterfaceOptionsFrame_OpenToCategory("GatherMate 2")
killermonkey99@36 199 LibStub("AceConfigDialog-3.0"):SelectGroup("GatherMate 2", "RecipeProfit")
Aaron@12 200 end
Aaron@12 201
Aaron@16 202 function RecipeProfit:UpdateButtons(event, ...)
Aaron@16 203 --print("UpdateButtons", event)
Aaron@28 204 if(WorldMapFrame:IsShown()) then
Aaron@28 205 local continent, zone = GetCurrentMapContinent(), GetCurrentMapZone()
Aaron@28 206 SetMapZoom(continent)
Aaron@28 207 SetMapZoom(continent, zone)
Aaron@28 208 else
Aaron@28 209 SetMapZoom(-1)
Aaron@28 210 end
Aaron@28 211
Aaron@28 212 GatherMate:GetModule("Display"):UpdateMaps()
Aaron@28 213
Aaron@16 214 if(not MerchantFrame:IsVisible()) then
Aaron@16 215 --print("UpdateButtons - (Event: ", event, ") - MerchantFrame not visible.");
Aaron@16 216 return;
Aaron@16 217 end
Aaron@16 218
Aaron@16 219 for i=1, MERCHANT_ITEMS_PER_PAGE, 1 do
Aaron@16 220 local buttonframe = _G["MerchantItem"..i];
Aaron@16 221 local index = (((MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE) + i);
Aaron@16 222 --print(index)
Aaron@16 223 if index <= GetMerchantNumItems() then
Aaron@16 224 button_update(buttonframe)
Aaron@16 225 end
Aaron@16 226 end
Aaron@17 227 end
Aaron@16 228
Aaron@16 229 function RecipeProfit:DoMerge()
Aaron@16 230 ids = {}
killermonkey99@36 231 local alliance = get_faction_db();
Aaron@16 232
Aaron@16 233 GatherMate:ClearDB("RecipeProfit")
killermonkey99@36 234 for id, note in pairs(RECIPEPROFIT_database) do
killermonkey99@36 235 if((note.a and alliance) or (note.h and not alliance)) then
killermonkey99@36 236 x, y = find_good_id(note.x, note.y)
killermonkey99@36 237 add_note(x, y, note)
killermonkey99@36 238 end
Aaron@16 239 end
Aaron@16 240
Aaron@16 241 GatherMate:SendMessage("GatherMateDataImport")
killermonkey99@36 242 GatherMate:GetModule("Config"):SendMessage("GatherMate2ConfigChanged")
Aaron@16 243 end
Aaron@16 244
Aaron@16 245 function get_note_title(note, factionTag)
Aaron@16 246 if(not factionTag) then
Aaron@16 247 _, factionTag = get_faction_db();
Aaron@16 248 end
Aaron@16 249
Aaron@16 250 return note.item.." - ("..note.vendor.." ".. factionTag ..")";
Aaron@16 251 end
Aaron@16 252
Aaron@16 253 function add_note(x, y, note)
killermonkey99@36 254 local coords = GatherMate.mapData:EncodeLoc(x/100, y/100, 0)
killermonkey99@36 255 local zoneID = zidmap[note.map]
killermonkey99@36 256 if(not zoneID) then
killermonkey99@36 257 print("OMFG "..note.map)
killermonkey99@36 258 return
killermonkey99@36 259 end
Aaron@33 260
killermonkey99@36 261 local nodeID = GatherMate.nodeIDs["RecipeProfit"][get_note_title(note, "")]
killermonkey99@36 262 print(nodeID)
killermonkey99@36 263 GatherMate:InjectNode(zoneID, coords, "RecipeProfit", nodeID)
Aaron@16 264 end
Aaron@16 265
Aaron@16 266 function get_faction_db()
Aaron@16 267 local factionAlliance = db.profile.faction == "Alliance" or
Aaron@16 268 db.profile.faction == "default" and UnitFactionGroup("player") == "Alliance";
killermonkey99@36 269
Aaron@16 270 if(factionAlliance) then
killermonkey99@36 271 return true, ""
Aaron@16 272 else
killermonkey99@36 273 return false, ""
Aaron@16 274 end
Aaron@16 275 end
Aaron@16 276
Aaron@16 277 function safe_cache_vendor()
Aaron@16 278 if(not profile.enable_cache) then
Aaron@16 279 return
Aaron@16 280 end
Aaron@16 281
Aaron@16 282 if(not profile.location_cache[UnitName("NPC")]) then
Aaron@16 283 SetMapToCurrentZone()
Aaron@16 284 local pos = {}
Aaron@16 285 pos.x, pos.y = GetPlayerMapPosition("player")
Aaron@16 286 profile.location_cache[UnitName("NPC")] = pos
Aaron@16 287 end
Aaron@16 288 end
Aaron@15 289
Aaron@9 290 function button_update(self)
Aaron@9 291 local buttonName = _G[self:GetName().."Name"];
Aaron@9 292 local link = GetMerchantItemLink(_G[self:GetName().."ItemButton"]:GetID());
Aaron@9 293 if(not link) then
Aaron@9 294 return;
Aaron@9 295 end
Aaron@9 296
Aaron@9 297 local sName, sLink, iRarity, iLevel, iMinLevel, sType, sSubType, iStackCount = GetItemInfo(link)
Aaron@9 298
Aaron@16 299 if(sType == "Recipe" and safeRecipes[sName]) then
Aaron@16 300 safe_cache_vendor();
Aaron@9 301 SetItemButtonNameFrameVertexColor(self, 0, 0, 1.0);
Aaron@9 302 SetItemButtonSlotVertexColor(self, 0, 0, 0.5);
Aaron@9 303 buttonName:SetText("* " .. sName)
Aaron@28 304
Aaron@9 305 if(GetItemCount(link, true) == 0) then
Aaron@9 306 buttonName:SetTextColor(0,1,1);
Aaron@9 307 elseif(GetItemCount(link, true) < 5) then
Aaron@9 308 buttonName:SetTextColor(1,0,1);
Aaron@9 309 else
Aaron@9 310 buttonName:SetTextColor(1,0,0);
Aaron@9 311 end
Aaron@28 312
Aaron@9 313 else
Aaron@9 314 buttonName:SetTextColor(GameFontNormalSmall:GetTextColor());
Aaron@9 315 end
Aaron@9 316 end
Aaron@9 317
Aaron@16 318 function find_good_id(x, y)
Aaron@0 319 if ids[x.." "..y] then
Aaron@16 320 return find_good_id(x + .01, y)
Aaron@0 321 end
Aaron@0 322
Aaron@0 323 ids[x.." "..y] = true
Aaron@0 324 return x, y
Aaron@17 325 end
Aaron@17 326
Aaron@17 327 local lastNodeTextureId = 0;
Aaron@17 328
Aaron@17 329 function get_next_texture_id()
Aaron@17 330 lastNodeTextureId = lastNodeTextureId + 1;
Aaron@17 331 return lastNodeTextureId;
Aaron@17 332 end
Aaron@17 333
Aaron@17 334 function set_node_constants()
Aaron@17 335 GatherMate.nodeIDs["RecipeProfit"] = {}
Aaron@17 336 GatherMate.nodeTextures["RecipeProfit"] = {}
Aaron@17 337 GatherMate.nodeMinHarvest["RecipeProfit"] = {}
Aaron@17 338
Aaron@17 339 local nodes = GatherMate.nodeIDs["RecipeProfit"]
killermonkey99@36 340 for id, note in pairs(RECIPEPROFIT_database) do
Aaron@17 341 safeRecipes[note.item] = true;
Aaron@24 342 local id = get_next_texture_id();
killermonkey99@36 343
killermonkey99@36 344 nodes[get_note_title(note, "")] = id;
Aaron@24 345 nodeLookup[id] = note;
Aaron@17 346 end
Aaron@17 347
Aaron@17 348 for i = 1, lastNodeTextureId, 1 do
Aaron@17 349 GatherMate.nodeTextures["RecipeProfit"][i] = "Interface\\Icons\\INV_Scroll_05"
Aaron@17 350 end
Aaron@17 351
Aaron@17 352 GatherMate.reverseNodeIDs["RecipeProfit"] = GatherMate:CreateReversedTable(nodes)
Aaron@17 353 end
Aaron@17 354
Aaron@17 355 function inject_options()
killermonkey99@36 356 local acr = LibStub("AceConfigRegistry-3.0")
killermonkey99@36 357 acr:GetOptionsTable("GatherMate 2", "dialog", "RecipeProfit-1.0").args["showRecipeProfit"] = {
killermonkey99@36 358 order = 7,
Aaron@17 359 name = "Show RecipeProfit nodes.",
Aaron@17 360 desc = "Toggle showing nodes added by RecipeProfit.",
Aaron@17 361 type = "select",
Aaron@17 362 values = {
killermonkey99@36 363 always = "Always show",
killermonkey99@36 364 never = "Never show",
Aaron@17 365 },
Aaron@17 366 arg = "RecipeProfit",
Aaron@17 367 }
Aaron@17 368
killermonkey99@36 369 GatherMate:GetModule("Config"):SendMessage("GatherMate2ConfigChanged")
Aaron@17 370 end
Aaron@24 371
Aaron@24 372 function get_colored_note_name(self, nodeID)
Aaron@24 373 local text = self.reverseNodeIDs["RecipeProfit"][nodeID]
Aaron@24 374 local sName, sLink, iRarity, iLevel, iMinLevel, sType, sSubType, iStackCount = GetItemInfo(nodeLookup[nodeID].itementry)
Aaron@24 375
Aaron@24 376 if(not sLink) then
killermonkey99@36 377 RecipeProfit:ScheduleTimer("UpdateButtons", 3)
killermonkey99@36 378 return "|cFF000000(??) |cFF66DD66" .. text .. "|cFFFF0000 Please Wait (Querying Server)..."
Aaron@24 379 end
Aaron@24 380
Aaron@24 381 local count = GetItemCount(sLink, true)
Aaron@24 382 local prefix = "|cFF888888(" .. count .. ") |cFF66DD66"
Aaron@24 383
Aaron@24 384 if(count == 0) then
Aaron@24 385 prefix = "|cFF00FFFF(" .. count .. ") |cFF66DD66"
Aaron@24 386 elseif(count >= 5) then
Aaron@24 387 prefix = "|cFFFF0000(" .. count .. ") |cFF66DD66"
Aaron@24 388 end
Aaron@24 389
Aaron@24 390 return prefix .. text
Aaron@24 391 end