annotate Core.lua @ 89:a12d22ef3f39

AceSerializer has been enabled again as it?s used when exporting/importing groups. All other unused libraries are now really removed. Adjusted debug function to format only when a debug channel is available. Fixed moving from guild banks, checking if items are locked is different then with banks. Now unregistering the item locking event so it doesn?t continue to try to move every time an item is switched after the automated cycle has finished. (geeezus, this description is a total overkill) Fixed item queueing. Queue all when there?s a group without any items inside no longer crashes. Removing cached container data after closing a container.
author Zerotorescue
date Fri, 07 Jan 2011 22:19:03 +0100
parents 3bec0ea44607
children 31493364b163
rev   line source
Zerotorescue@11 1 -- You can access this addon's object through: LibStub("AceAddon-3.0"):GetAddon("Inventorium")
Zerotorescue@17 2 local addon = select(2, ...);
Zerotorescue@17 3 addon = LibStub("AceAddon-3.0"):NewAddon(addon, "Inventorium", "AceEvent-3.0");
Zerotorescue@1 4
Zerotorescue@61 5 --@debug@
Zerotorescue@61 6 local addonRevision = 1;
Zerotorescue@61 7 --@end-debug@
Zerotorescue@61 8 --[===[@non-debug@
Zerotorescue@61 9 local addonRevision = @project-revision@;
Zerotorescue@61 10 --@end-non-debug@]===]
Zerotorescue@61 11
Zerotorescue@62 12 local _G = _G;
Zerotorescue@62 13 local print, pairs, tonumber = _G.print, _G.pairs, _G.tonumber;
Zerotorescue@13 14
Zerotorescue@62 15 -- All modules must be able to retrieve our supported addons database, thus keep it a part of the addon object rather than local
Zerotorescue@13 16 addon.supportedAddons = {};
Zerotorescue@13 17 addon.supportedAddons.auctionPricing = {};
Zerotorescue@13 18 addon.supportedAddons.itemCount = {};
Zerotorescue@13 19 addon.supportedAddons.crafting = {};
Zerotorescue@0 20
Zerotorescue@0 21 function addon:OnInitialize()
Zerotorescue@0 22 -- SAVED VARIABLES
Zerotorescue@0 23
Zerotorescue@0 24 local defaults = {
Zerotorescue@0 25 global = {
Zerotorescue@61 26 version = nil,
Zerotorescue@61 27 },
Zerotorescue@61 28 profile = {
Zerotorescue@0 29 defaults = {
Zerotorescue@13 30 auctionPricingAddon = "Auctioneer",
Zerotorescue@13 31 itemCountAddon = "Altoholic",
Zerotorescue@13 32 craftingAddon = "AdvancedTradeSkillWindow",
Zerotorescue@61 33 minLocalStock = 20,
Zerotorescue@57 34 alertBelowLocalMinimum = true,
Zerotorescue@82 35 autoRefill = true,
Zerotorescue@61 36 minGlobalStock = 60,
Zerotorescue@61 37 alertBelowGlobalMinimum = true,
Zerotorescue@0 38 summaryThresholdShow = 10,
Zerotorescue@0 39 restockTarget = 60,
Zerotorescue@0 40 minCraftingQueue = 0.05,
Zerotorescue@0 41 bonusQueue = 0.1,
Zerotorescue@0 42 priceThreshold = 0,
Zerotorescue@13 43 summaryHidePriceThreshold = false,
Zerotorescue@40 44 trackAtCharacters = {
Zerotorescue@40 45 },
Zerotorescue@31 46 localItemData = {
Zerotorescue@31 47 ["Bag"] = true,
Zerotorescue@31 48 ["Auction House"] = true,
Zerotorescue@31 49 },
Zerotorescue@13 50 summary = {
Zerotorescue@13 51 speed = 5,
Zerotorescue@74 52 width = 700,
Zerotorescue@13 53 height = 600,
Zerotorescue@13 54 },
Zerotorescue@0 55 colors = {
Zerotorescue@17 56 red = 0,
Zerotorescue@17 57 orange = 0.3,
Zerotorescue@17 58 yellow = 0.6,
Zerotorescue@17 59 green = 0.95,
Zerotorescue@0 60 },
Zerotorescue@0 61 },
Zerotorescue@61 62 groups = {
Zerotorescue@61 63 },
Zerotorescue@0 64 },
Zerotorescue@0 65 factionrealm = {
Zerotorescue@40 66 characters = {
Zerotorescue@40 67 },
Zerotorescue@0 68 },
Zerotorescue@0 69 };
Zerotorescue@0 70
Zerotorescue@0 71 -- Register our saved variables database
Zerotorescue@11 72 self.db = LibStub("AceDB-3.0"):New("InventoriumDB", defaults, true);
Zerotorescue@61 73
Zerotorescue@62 74 -- SLASH COMMANDS
Zerotorescue@62 75
Zerotorescue@62 76 -- Disable the AddonLoader slash commands
Zerotorescue@62 77 SLASH_INVENTORIUM1 = nil;
Zerotorescue@62 78 SLASH_IM1 = nil;
Zerotorescue@62 79
Zerotorescue@62 80 -- Register our own slash commands
Zerotorescue@62 81 SLASH_INVENTORIUM1 = "/inventorium";
Zerotorescue@62 82 SLASH_INVENTORIUM2 = "/im";
Zerotorescue@62 83 SlashCmdList["INVENTORIUM"] = function(msg)
Zerotorescue@62 84 addon:CommandHandler(msg);
Zerotorescue@62 85 end;
Zerotorescue@62 86
Zerotorescue@62 87 -- Debug command handling
Zerotorescue@62 88 self:RegisterSlash(function(this)
Zerotorescue@62 89 this.debugChannel = false;
Zerotorescue@62 90 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@62 91 local name = GetChatWindowInfo(i);
Zerotorescue@62 92
Zerotorescue@62 93 if name:upper() == "DEBUG" then
Zerotorescue@62 94 this.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@62 95
Zerotorescue@62 96 print("A debug channel already exists, used the old one. (" .. i .. ")");
Zerotorescue@62 97 return;
Zerotorescue@62 98 end
Zerotorescue@62 99 end
Zerotorescue@62 100
Zerotorescue@62 101 if not this.debugChannel then
Zerotorescue@62 102 -- Create a new debug channel
Zerotorescue@62 103 local chatFrame = FCF_OpenNewWindow('Debug');
Zerotorescue@62 104 ChatFrame_RemoveAllMessageGroups(chatFrame);
Zerotorescue@62 105 this.debugChannel = chatFrame;
Zerotorescue@62 106
Zerotorescue@62 107 print("New debug channel created.");
Zerotorescue@62 108 end
Zerotorescue@62 109 end, { "d", "debug" });
Zerotorescue@62 110
Zerotorescue@62 111 -- Remember this character is on this account
Zerotorescue@62 112 local playerName = UnitName("player");
Zerotorescue@62 113 if not self.db.factionrealm.characters[playerName] then
Zerotorescue@62 114 self.db.factionrealm.characters[playerName] = true;
Zerotorescue@62 115
Zerotorescue@62 116 -- Default to tracking on all chars, untracking is a convenience, not tracking by default would probably get multiple issue reports.
Zerotorescue@62 117 self.db.profile.defaults.trackAtCharacters[playerName] = true;
Zerotorescue@62 118 end
Zerotorescue@66 119
Zerotorescue@66 120 self:UpdateDatabase();
Zerotorescue@62 121 end
Zerotorescue@62 122
Zerotorescue@65 123
Zerotorescue@65 124
Zerotorescue@65 125
Zerotorescue@65 126
Zerotorescue@65 127 -- Database patching after new revisions
Zerotorescue@65 128
Zerotorescue@62 129 function addon:UpdateDatabase()
Zerotorescue@61 130 if not self.db.global.version or self.db.global.version < addonRevision then
Zerotorescue@61 131 -- Is our database outdated? Then patch it.
Zerotorescue@61 132
Zerotorescue@61 133 if not self.db.global.version then
Zerotorescue@61 134 -- Old version was before version was saved, many changes were done in that revision
Zerotorescue@61 135
Zerotorescue@61 136 print("Updating Inventorium database from version " .. (self.db.global.version or "Unknown") .. " to version " .. addonRevision .. "...");
Zerotorescue@61 137
Zerotorescue@61 138 if self.db.global and self.db.global.defaults then
Zerotorescue@61 139 print("Moving all global data into your current profile...");
Zerotorescue@61 140
Zerotorescue@61 141 -- All data mustn't be global but profile-based
Zerotorescue@61 142 self.db.profile.defaults = CopyTable(self.db.global.defaults);
Zerotorescue@61 143 self.db.profile.groups = CopyTable(self.db.global.groups);
Zerotorescue@61 144
Zerotorescue@61 145 self.db.global.defaults = nil;
Zerotorescue@61 146 self.db.global.groups = nil;
Zerotorescue@61 147
Zerotorescue@62 148 self.CommandHandler = function()
Zerotorescue@62 149 message("You must /reload once to finalize the Inventorium database updates. This will only be required once during the BETA.");
Zerotorescue@61 150 end;
Zerotorescue@62 151 self:CommandHandler();
Zerotorescue@61 152 end
Zerotorescue@61 153
Zerotorescue@61 154 if self.db.profile.defaults.minimumStock then
Zerotorescue@61 155 print("Copying the minimum stock value into the minimum global stock...");
Zerotorescue@61 156
Zerotorescue@61 157 -- We added another stock option and renamed the old to be more obvious about what it means
Zerotorescue@61 158 self.db.profile.defaults.minGlobalStock = self.db.profile.defaults.minimumStock;
Zerotorescue@61 159 self.db.profile.defaults.minimumStock = nil;
Zerotorescue@61 160 end
Zerotorescue@61 161
Zerotorescue@61 162 if self.db.profile.defaults.minimumLocalStock then
Zerotorescue@61 163 print("Renaming the minimum local stock property...");
Zerotorescue@61 164
Zerotorescue@61 165 -- We added another stock option and then renamed it
Zerotorescue@61 166 self.db.profile.defaults.minLocalStock = self.db.profile.defaults.minimumLocalStock;
Zerotorescue@61 167 self.db.profile.defaults.minimumLocalStock = nil;
Zerotorescue@61 168 end
Zerotorescue@61 169
Zerotorescue@61 170 if self.db.profile.defaults.alertBelowMinimum then
Zerotorescue@61 171 print("Copying the alert below minimum value into the alert below global minimum value...");
Zerotorescue@61 172
Zerotorescue@61 173 -- We added another stock option and then renamed it
Zerotorescue@61 174 self.db.profile.defaults.alertBelowGlobalMinimum = self.db.profile.defaults.alertBelowMinimum;
Zerotorescue@61 175 self.db.profile.defaults.alertBelowMinimum = nil;
Zerotorescue@61 176 end
Zerotorescue@61 177
Zerotorescue@61 178 -- Go through all groups to see if there's one with the above two renamed variables
Zerotorescue@61 179 for groupName, values in pairs(self.db.profile.groups) do
Zerotorescue@61 180 if values.minimumStock then
Zerotorescue@61 181 values.minGlobalStock = values.minimumStock;
Zerotorescue@61 182 values.minimumStock = nil;
Zerotorescue@61 183 end
Zerotorescue@61 184 end
Zerotorescue@61 185 end
Zerotorescue@61 186
Zerotorescue@61 187 -- Remember the version of our database
Zerotorescue@61 188 self.db.global.version = addonRevision;
Zerotorescue@61 189 end
Zerotorescue@46 190 end
Zerotorescue@46 191
Zerotorescue@62 192 function addon:GetOptionByKey(groupName, optionName, noDefault)
Zerotorescue@62 193 if groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName][optionName] ~= nil then
Zerotorescue@62 194 -- If this option exists within the settings of this group
Zerotorescue@62 195
Zerotorescue@62 196 return addon.db.profile.groups[groupName][optionName];
Zerotorescue@62 197 elseif groupName and addon.db.profile.groups[groupName] and addon.db.profile.groups[groupName].virtualGroup ~= "" and not noDefault then
Zerotorescue@62 198 -- If a virtual group was selected
Zerotorescue@62 199
Zerotorescue@62 200 return self:GetOptionByKey(addon.db.profile.groups[groupName].virtualGroup, optionName, noDefault);
Zerotorescue@62 201 elseif addon.db.profile.defaults[optionName] and not noDefault then
Zerotorescue@62 202 return addon.db.profile.defaults[optionName];
Zerotorescue@62 203 else
Zerotorescue@62 204 return nil;
Zerotorescue@0 205 end
Zerotorescue@0 206 end
Zerotorescue@0 207
Zerotorescue@35 208 function addon:GetItemCountAddon(group)
Zerotorescue@35 209 local selectedExternalAddon = self:GetOptionByKey(group, "itemCountAddon");
Zerotorescue@35 210
Zerotorescue@35 211 if self.supportedAddons.itemCount[selectedExternalAddon] and self.supportedAddons.itemCount[selectedExternalAddon].IsEnabled() then
Zerotorescue@35 212 -- Try to use the default item count addon
Zerotorescue@35 213
Zerotorescue@35 214 return self.supportedAddons.itemCount[selectedExternalAddon], selectedExternalAddon;
Zerotorescue@35 215 else
Zerotorescue@35 216 -- Default not available, get the first one then
Zerotorescue@35 217
Zerotorescue@35 218 for name, value in pairs(self.supportedAddons.itemCount) do
Zerotorescue@35 219 if value.IsEnabled() then
Zerotorescue@35 220 return value, name;
Zerotorescue@35 221 end
Zerotorescue@35 222 end
Zerotorescue@35 223 end
Zerotorescue@35 224
Zerotorescue@35 225 return;
Zerotorescue@35 226 end
Zerotorescue@35 227
Zerotorescue@23 228 function addon:GetItemCount(itemId, group)
Zerotorescue@13 229 itemId = tonumber(itemId);
Zerotorescue@13 230
Zerotorescue@13 231 if not itemId then return; end
Zerotorescue@13 232
Zerotorescue@35 233 local itemCountAddon = self:GetItemCountAddon(group);
Zerotorescue@23 234
Zerotorescue@35 235 return (itemCountAddon and itemCountAddon.GetTotalCount(itemId)) or -1;
Zerotorescue@0 236 end
Zerotorescue@0 237
Zerotorescue@50 238 function addon:GetLocalItemCount(itemId, group)
Zerotorescue@50 239 itemId = tonumber(itemId);
Zerotorescue@50 240
Zerotorescue@50 241 if not itemId then return; end
Zerotorescue@50 242
Zerotorescue@50 243 local itemCountAddon = self:GetItemCountAddon(group);
Zerotorescue@50 244
Zerotorescue@50 245 local currentItemCount;
Zerotorescue@50 246
Zerotorescue@50 247 if itemCountAddon and itemCountAddon.GetCharacterCount then
Zerotorescue@50 248 local bag, bank, auctionHouse, mail = itemCountAddon.GetCharacterCount(itemId);
Zerotorescue@50 249
Zerotorescue@50 250 local selectedLocalItemCountSources = self:GetOptionByKey(group, "localItemData");
Zerotorescue@50 251
Zerotorescue@50 252 currentItemCount = 0;
Zerotorescue@50 253 if selectedLocalItemCountSources["Bag"] then
Zerotorescue@50 254 currentItemCount = currentItemCount + bag;
Zerotorescue@50 255 end
Zerotorescue@50 256 if selectedLocalItemCountSources["Bank"] then
Zerotorescue@50 257 currentItemCount = currentItemCount + bank;
Zerotorescue@50 258 end
Zerotorescue@50 259 if selectedLocalItemCountSources["Auction House"] then
Zerotorescue@50 260 currentItemCount = currentItemCount + auctionHouse;
Zerotorescue@50 261 end
Zerotorescue@50 262 if selectedLocalItemCountSources["Mailbox"] then
Zerotorescue@50 263 currentItemCount = currentItemCount + mail;
Zerotorescue@50 264 end
Zerotorescue@50 265 end
Zerotorescue@50 266
Zerotorescue@50 267 return currentItemCount or -1;
Zerotorescue@50 268 end
Zerotorescue@50 269
Zerotorescue@23 270 function addon:GetAuctionValue(itemLink, group)
Zerotorescue@23 271 if not itemLink then return -5; end
Zerotorescue@13 272
Zerotorescue@23 273 local selectedExternalAddon = self:GetOptionByKey(group, "auctionPricingAddon");
Zerotorescue@23 274
Zerotorescue@23 275 if self.supportedAddons.auctionPricing[selectedExternalAddon] and self.supportedAddons.auctionPricing[selectedExternalAddon].IsEnabled() then
Zerotorescue@13 276 -- Try to use the default auction pricing addon
Zerotorescue@1 277
Zerotorescue@23 278 return self.supportedAddons.auctionPricing[selectedExternalAddon].GetValue(itemLink);
Zerotorescue@13 279 else
Zerotorescue@13 280 -- Default not available, get the first one then
Zerotorescue@1 281
Zerotorescue@13 282 for name, value in pairs(self.supportedAddons.auctionPricing) do
Zerotorescue@13 283 if value.IsEnabled() then
Zerotorescue@13 284 return value.GetValue(itemLink);
Zerotorescue@13 285 end
Zerotorescue@1 286 end
Zerotorescue@1 287 end
Zerotorescue@7 288
Zerotorescue@7 289 return -2;
Zerotorescue@1 290 end
Zerotorescue@1 291
Zerotorescue@65 292
Zerotorescue@65 293
Zerotorescue@65 294
Zerotorescue@65 295
Zerotorescue@62 296 -- Slash commands
Zerotorescue@62 297
Zerotorescue@62 298 local slashArgs = {};
Zerotorescue@62 299 local slashError = "Wrong argument, the following arguments are available:";
Zerotorescue@62 300
Zerotorescue@62 301 function addon:CommandHandler(message)
Zerotorescue@62 302 local cmd, arg = string.split(" ", (message or ""), 2);
Zerotorescue@62 303 cmd = string.lower(cmd);
Zerotorescue@62 304
Zerotorescue@62 305 if slashArgs[cmd] then
Zerotorescue@62 306 -- Pass a reference to the addon (to be used as "self") and the provided arg
Zerotorescue@62 307 slashArgs[cmd](addon, arg);
Zerotorescue@62 308 else
Zerotorescue@62 309 print(slashError);
Zerotorescue@62 310 end
Zerotorescue@62 311 end
Zerotorescue@62 312
Zerotorescue@62 313 function addon:RegisterSlash(func, args, description)
Zerotorescue@62 314 for _, arg in pairs(args) do
Zerotorescue@62 315 slashArgs[arg] = func;
Zerotorescue@62 316 end
Zerotorescue@62 317
Zerotorescue@62 318 if description then
Zerotorescue@62 319 slashError = slashError .. "\n" .. description;
Zerotorescue@62 320 end
Zerotorescue@62 321 end
Zerotorescue@62 322
Zerotorescue@65 323
Zerotorescue@65 324
Zerotorescue@65 325
Zerotorescue@65 326
Zerotorescue@62 327 -- Readable money
Zerotorescue@62 328
Zerotorescue@62 329 local goldText = "%s%d|cffffd700g|r ";
Zerotorescue@62 330 local silverText = "%s%d|cffc7c7cfs|r ";
Zerotorescue@62 331 local copperText = "%s%d|cffeda55fc|r";
Zerotorescue@62 332
Zerotorescue@62 333 function addon:ReadableMoney(copper, clean)
Zerotorescue@62 334 local text = "";
Zerotorescue@62 335
Zerotorescue@62 336 local gold = floor( copper / COPPER_PER_GOLD );
Zerotorescue@62 337 if gold > 0 then
Zerotorescue@62 338 text = goldText:format(text, gold);
Zerotorescue@62 339 end
Zerotorescue@62 340
Zerotorescue@62 341 if not clean or (not gold or gold < 10) then
Zerotorescue@62 342 local silver = floor( ( copper % COPPER_PER_GOLD ) / COPPER_PER_SILVER );
Zerotorescue@62 343 if silver > 0 then
Zerotorescue@62 344 text = silverText:format(text, silver);
Zerotorescue@62 345 end
Zerotorescue@62 346
Zerotorescue@62 347 if not clean or (not gold or gold < 1) then
Zerotorescue@62 348 local copper = floor( copper % COPPER_PER_SILVER );
Zerotorescue@62 349 if copper > 0 or text == "" then
Zerotorescue@62 350 text = copperText:format(text, copper);
Zerotorescue@62 351 end
Zerotorescue@62 352 end
Zerotorescue@62 353 end
Zerotorescue@62 354
Zerotorescue@62 355
Zerotorescue@62 356 return string.trim(text);
Zerotorescue@62 357 end
Zerotorescue@62 358
Zerotorescue@62 359 function addon:ReadableMoneyToCopper(value)
Zerotorescue@62 360 -- If a player enters a value it will be filled without color codes
Zerotorescue@62 361 -- If it is retrieved from the database, it will be colored coded
Zerotorescue@62 362 -- Thus we look for both
Zerotorescue@62 363 local gold = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+g|r") or string.match(value, "(%d+)g"));
Zerotorescue@62 364 local silver = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+s|r") or string.match(value, "(%d+)s"));
Zerotorescue@62 365 local copper = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+c|r") or string.match(value, "(%d+)c"));
Zerotorescue@62 366
Zerotorescue@62 367 return ( (gold or 0) * COPPER_PER_GOLD ) + ( (silver or 0) * COPPER_PER_SILVER ) + (copper or 0);
Zerotorescue@62 368 end
Zerotorescue@62 369
Zerotorescue@62 370 function addon:ValidateReadableMoney(info, value)
Zerotorescue@62 371 -- If a player enters a value it will be filled without color codes
Zerotorescue@62 372 -- If it is retrieved from the database, it will be colored coded
Zerotorescue@62 373 -- Thus we look for both
Zerotorescue@62 374 local gold = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+g|r") or string.match(value, "(%d+)g"));
Zerotorescue@62 375 local silver = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+s|r") or string.match(value, "(%d+)s"));
Zerotorescue@62 376 local copper = tonumber(string.match(value, "(%d+)|c[a-fA-F0-9]+c|r") or string.match(value, "(%d+)c"));
Zerotorescue@62 377
Zerotorescue@62 378 if not gold and not silver and not copper then
Zerotorescue@62 379 return "The provided amount of money is invalid. Please provide the amount of money as #g#s#c, e.g. 591617g24s43c.";
Zerotorescue@62 380 else
Zerotorescue@62 381 return true;
Zerotorescue@62 382 end
Zerotorescue@62 383 end
Zerotorescue@62 384
Zerotorescue@0 385
Zerotorescue@0 386
Zerotorescue@65 387
Zerotorescue@65 388
Zerotorescue@13 389 -- Public
Zerotorescue@13 390
Zerotorescue@36 391 function IMRegisterPricingAddon(name, get, enabled, onSelect)
Zerotorescue@13 392 addon.supportedAddons.auctionPricing[name] = {
Zerotorescue@13 393 GetValue = get,
Zerotorescue@13 394 IsEnabled = enabled,
Zerotorescue@36 395 OnSelect = onSelect,
Zerotorescue@13 396 };
Zerotorescue@13 397 end
Zerotorescue@13 398
Zerotorescue@50 399 function IMRegisterItemCountAddon(name, getTotal, getCharacter, enabled, onSelect)
Zerotorescue@13 400 addon.supportedAddons.itemCount[name] = {
Zerotorescue@17 401 GetTotalCount = getTotal,
Zerotorescue@17 402 GetCharacterCount = getCharacter,
Zerotorescue@13 403 IsEnabled = enabled,
Zerotorescue@50 404 OnSelect = onSelect,
Zerotorescue@13 405 };
Zerotorescue@13 406 end
Zerotorescue@13 407
Zerotorescue@50 408 function IMRegisterCraftingAddon(name, queue, enabled, onSelect)
Zerotorescue@13 409 addon.supportedAddons.crafting[name] = {
Zerotorescue@13 410 Queue = queue,
Zerotorescue@13 411 IsEnabled = enabled,
Zerotorescue@50 412 OnSelect = onSelect,
Zerotorescue@13 413 };
Zerotorescue@13 414 end
Zerotorescue@13 415
Zerotorescue@62 416 -- We need a global command handler for our chat-links
Zerotorescue@62 417 function InventoriumCommandHandler(msg)
Zerotorescue@62 418 addon:CommandHandler(msg);
Zerotorescue@62 419 end
Zerotorescue@62 420
Zerotorescue@13 421
Zerotorescue@13 422
Zerotorescue@65 423
Zerotorescue@65 424
Zerotorescue@76 425 -- General
Zerotorescue@76 426
Zerotorescue@76 427 addon.Colors = {
Zerotorescue@76 428 Red = { 1, 0, 0 },
Zerotorescue@76 429 Green = { 0, 1, 0 },
Zerotorescue@76 430 }; -- easy to extend if more colors are needed
Zerotorescue@76 431 function addon:Print(text, color)
Zerotorescue@76 432 local red, green, blue;
Zerotorescue@76 433
Zerotorescue@76 434 if color then
Zerotorescue@76 435 red, green, blue = color[1], color[2], color[3];
Zerotorescue@76 436 end
Zerotorescue@76 437
Zerotorescue@76 438 DEFAULT_CHAT_FRAME:AddMessage(text or "", red, green, blue, nil, 5);
Zerotorescue@76 439 end
Zerotorescue@76 440
Zerotorescue@84 441 function addon:GetItemID(itemLink)
Zerotorescue@84 442 itemLink = itemLink and itemLink:match("|Hitem:([-0-9]+):"); -- if itemLink is nil, it won't execute the second part
Zerotorescue@84 443 itemLink = itemLink and tonumber(itemLink);
Zerotorescue@84 444
Zerotorescue@84 445 return itemLink;
Zerotorescue@84 446 end
Zerotorescue@84 447
Zerotorescue@13 448 -- Debug
Zerotorescue@0 449
Zerotorescue@89 450 function addon:Debug(t, ...)
Zerotorescue@0 451 if not self.debugChannel and self.debugChannel ~= false then
Zerotorescue@0 452 -- We want to check just once, so if you add a debug channel later just do a /reload (registering an event for this is wasted resources)
Zerotorescue@0 453 self.debugChannel = false;
Zerotorescue@0 454
Zerotorescue@0 455 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@0 456 local name = GetChatWindowInfo(i);
Zerotorescue@0 457
Zerotorescue@0 458 if name:upper() == "DEBUG" then
Zerotorescue@0 459 self.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@0 460 end
Zerotorescue@0 461 end
Zerotorescue@0 462 end
Zerotorescue@0 463
Zerotorescue@0 464 if self.debugChannel then
Zerotorescue@89 465 self.debugChannel:AddMessage(t:format(...));
Zerotorescue@0 466 end
Zerotorescue@0 467 end