annotate core.lua @ 42:e60f43774d10

Removed tag 2.0a
author "Aaron Bregger <killermonkey99@gmail.com>"
date Tue, 04 Jan 2011 18:33:38 -0600
parents d97f61fad5b6
children 352fe939b884
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 return
killermonkey99@36 258 end
Aaron@33 259
killermonkey99@36 260 local nodeID = GatherMate.nodeIDs["RecipeProfit"][get_note_title(note, "")]
killermonkey99@36 261 GatherMate:InjectNode(zoneID, coords, "RecipeProfit", nodeID)
Aaron@16 262 end
Aaron@16 263
Aaron@16 264 function get_faction_db()
Aaron@16 265 local factionAlliance = db.profile.faction == "Alliance" or
Aaron@16 266 db.profile.faction == "default" and UnitFactionGroup("player") == "Alliance";
killermonkey99@36 267
Aaron@16 268 if(factionAlliance) then
killermonkey99@36 269 return true, ""
Aaron@16 270 else
killermonkey99@36 271 return false, ""
Aaron@16 272 end
Aaron@16 273 end
Aaron@16 274
Aaron@16 275 function safe_cache_vendor()
Aaron@16 276 if(not profile.enable_cache) then
Aaron@16 277 return
Aaron@16 278 end
Aaron@16 279
Aaron@16 280 if(not profile.location_cache[UnitName("NPC")]) then
Aaron@16 281 SetMapToCurrentZone()
Aaron@16 282 local pos = {}
Aaron@16 283 pos.x, pos.y = GetPlayerMapPosition("player")
Aaron@16 284 profile.location_cache[UnitName("NPC")] = pos
Aaron@16 285 end
Aaron@16 286 end
Aaron@15 287
Aaron@9 288 function button_update(self)
Aaron@9 289 local buttonName = _G[self:GetName().."Name"];
Aaron@9 290 local link = GetMerchantItemLink(_G[self:GetName().."ItemButton"]:GetID());
Aaron@9 291 if(not link) then
Aaron@9 292 return;
Aaron@9 293 end
Aaron@9 294
Aaron@9 295 local sName, sLink, iRarity, iLevel, iMinLevel, sType, sSubType, iStackCount = GetItemInfo(link)
Aaron@9 296
Aaron@16 297 if(sType == "Recipe" and safeRecipes[sName]) then
Aaron@16 298 safe_cache_vendor();
Aaron@9 299 SetItemButtonNameFrameVertexColor(self, 0, 0, 1.0);
Aaron@9 300 SetItemButtonSlotVertexColor(self, 0, 0, 0.5);
Aaron@9 301 buttonName:SetText("* " .. sName)
Aaron@28 302
Aaron@9 303 if(GetItemCount(link, true) == 0) then
Aaron@9 304 buttonName:SetTextColor(0,1,1);
Aaron@9 305 elseif(GetItemCount(link, true) < 5) then
Aaron@9 306 buttonName:SetTextColor(1,0,1);
Aaron@9 307 else
Aaron@9 308 buttonName:SetTextColor(1,0,0);
Aaron@9 309 end
Aaron@28 310
Aaron@9 311 else
Aaron@9 312 buttonName:SetTextColor(GameFontNormalSmall:GetTextColor());
Aaron@9 313 end
Aaron@9 314 end
Aaron@9 315
Aaron@16 316 function find_good_id(x, y)
Aaron@0 317 if ids[x.." "..y] then
Aaron@16 318 return find_good_id(x + .01, y)
Aaron@0 319 end
Aaron@0 320
Aaron@0 321 ids[x.." "..y] = true
Aaron@0 322 return x, y
Aaron@17 323 end
Aaron@17 324
Aaron@17 325 local lastNodeTextureId = 0;
Aaron@17 326
Aaron@17 327 function get_next_texture_id()
Aaron@17 328 lastNodeTextureId = lastNodeTextureId + 1;
Aaron@17 329 return lastNodeTextureId;
Aaron@17 330 end
Aaron@17 331
Aaron@17 332 function set_node_constants()
Aaron@17 333 GatherMate.nodeIDs["RecipeProfit"] = {}
Aaron@17 334 GatherMate.nodeTextures["RecipeProfit"] = {}
Aaron@17 335 GatherMate.nodeMinHarvest["RecipeProfit"] = {}
Aaron@17 336
Aaron@17 337 local nodes = GatherMate.nodeIDs["RecipeProfit"]
killermonkey99@36 338 for id, note in pairs(RECIPEPROFIT_database) do
Aaron@17 339 safeRecipes[note.item] = true;
Aaron@24 340 local id = get_next_texture_id();
killermonkey99@36 341
killermonkey99@36 342 nodes[get_note_title(note, "")] = id;
Aaron@24 343 nodeLookup[id] = note;
Aaron@17 344 end
Aaron@17 345
Aaron@17 346 for i = 1, lastNodeTextureId, 1 do
Aaron@17 347 GatherMate.nodeTextures["RecipeProfit"][i] = "Interface\\Icons\\INV_Scroll_05"
Aaron@17 348 end
Aaron@17 349
Aaron@17 350 GatherMate.reverseNodeIDs["RecipeProfit"] = GatherMate:CreateReversedTable(nodes)
Aaron@17 351 end
Aaron@17 352
Aaron@17 353 function inject_options()
killermonkey99@36 354 local acr = LibStub("AceConfigRegistry-3.0")
killermonkey99@36 355 acr:GetOptionsTable("GatherMate 2", "dialog", "RecipeProfit-1.0").args["showRecipeProfit"] = {
killermonkey99@36 356 order = 7,
Aaron@17 357 name = "Show RecipeProfit nodes.",
Aaron@17 358 desc = "Toggle showing nodes added by RecipeProfit.",
Aaron@17 359 type = "select",
Aaron@17 360 values = {
killermonkey99@36 361 always = "Always show",
killermonkey99@36 362 never = "Never show",
Aaron@17 363 },
Aaron@17 364 arg = "RecipeProfit",
Aaron@17 365 }
Aaron@17 366
killermonkey99@36 367 GatherMate:GetModule("Config"):SendMessage("GatherMate2ConfigChanged")
Aaron@17 368 end
Aaron@24 369
Aaron@24 370 function get_colored_note_name(self, nodeID)
Aaron@24 371 local text = self.reverseNodeIDs["RecipeProfit"][nodeID]
Aaron@24 372 local sName, sLink, iRarity, iLevel, iMinLevel, sType, sSubType, iStackCount = GetItemInfo(nodeLookup[nodeID].itementry)
Aaron@24 373
Aaron@24 374 if(not sLink) then
killermonkey99@36 375 RecipeProfit:ScheduleTimer("UpdateButtons", 3)
killermonkey99@36 376 return "|cFF000000(??) |cFF66DD66" .. text .. "|cFFFF0000 Please Wait (Querying Server)..."
Aaron@24 377 end
Aaron@24 378
Aaron@24 379 local count = GetItemCount(sLink, true)
Aaron@24 380 local prefix = "|cFF888888(" .. count .. ") |cFF66DD66"
Aaron@24 381
Aaron@24 382 if(count == 0) then
Aaron@24 383 prefix = "|cFF00FFFF(" .. count .. ") |cFF66DD66"
Aaron@24 384 elseif(count >= 5) then
Aaron@24 385 prefix = "|cFFFF0000(" .. count .. ") |cFF66DD66"
Aaron@24 386 end
Aaron@24 387
Aaron@24 388 return prefix .. text
Aaron@24 389 end