Mercurial > wow > reaction
comparison libs/AceAddon-2.0/AceAddon-2.0.lua @ 1:c11ca1d8ed91
Version 0.1
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Tue, 20 Mar 2007 21:03:57 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:4e2ce2894c21 | 1:c11ca1d8ed91 |
|---|---|
| 1 --[[ | |
| 2 Name: AceAddon-2.0 | |
| 3 Revision: $Rev: 19844 $ | |
| 4 Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) | |
| 5 Inspired By: Ace 1.x by Turan (turan@gryphon.com) | |
| 6 Website: http://www.wowace.com/ | |
| 7 Documentation: http://www.wowace.com/index.php/AceAddon-2.0 | |
| 8 SVN: http://svn.wowace.com/root/trunk/Ace2/AceAddon-2.0 | |
| 9 Description: Base for all Ace addons to inherit from. | |
| 10 Dependencies: AceLibrary, AceOO-2.0, AceEvent-2.0, (optional) AceConsole-2.0 | |
| 11 ]] | |
| 12 | |
| 13 local MAJOR_VERSION = "AceAddon-2.0" | |
| 14 local MINOR_VERSION = "$Revision: 19844 $" | |
| 15 | |
| 16 -- This ensures the code is only executed if the libary doesn't already exist, or is a newer version | |
| 17 if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end | |
| 18 if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end | |
| 19 | |
| 20 if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0.") end | |
| 21 | |
| 22 local function safecall(func,...) | |
| 23 local success, err = pcall(func,...) | |
| 24 if not success then geterrorhandler()(err) end | |
| 25 end | |
| 26 -- Localization | |
| 27 local STANDBY, TITLE, NOTES, VERSION, AUTHOR, DATE, CATEGORY, EMAIL, CREDITS, WEBSITE, CATEGORIES, ABOUT, PRINT_ADDON_INFO | |
| 28 if GetLocale() == "deDE" then | |
| 29 STANDBY = "|cffff5050(Standby)|r" -- capitalized | |
| 30 | |
| 31 TITLE = "Titel" | |
| 32 NOTES = "Anmerkung" | |
| 33 VERSION = "Version" | |
| 34 AUTHOR = "Autor" | |
| 35 DATE = "Datum" | |
| 36 CATEGORY = "Kategorie" | |
| 37 EMAIL = "E-mail" | |
| 38 WEBSITE = "Webseite" | |
| 39 CREDITS = "Credits" -- fix | |
| 40 | |
| 41 ABOUT = "\195\188ber" | |
| 42 PRINT_ADDON_INFO = "Gibt Addondaten aus" | |
| 43 | |
| 44 CATEGORIES = { | |
| 45 ["Action Bars"] = "Aktionsleisten", | |
| 46 ["Auction"] = "Auktion", | |
| 47 ["Audio"] = "Audio", | |
| 48 ["Battlegrounds/PvP"] = "Schlachtfeld/PvP", | |
| 49 ["Buffs"] = "Buffs", | |
| 50 ["Chat/Communication"] = "Chat/Kommunikation", | |
| 51 ["Druid"] = "Druide", | |
| 52 ["Hunter"] = "J?r", | |
| 53 ["Mage"] = "Magier", | |
| 54 ["Paladin"] = "Paladin", | |
| 55 ["Priest"] = "Priester", | |
| 56 ["Rogue"] = "Schurke", | |
| 57 ["Shaman"] = "Schamane", | |
| 58 ["Warlock"] = "Hexenmeister", | |
| 59 ["Warrior"] = "Krieger", | |
| 60 ["Healer"] = "Heiler", | |
| 61 ["Tank"] = "Tank", -- noone use "Brecher"... | |
| 62 ["Caster"] = "Caster", | |
| 63 ["Combat"] = "Kampf", | |
| 64 ["Compilations"] = "Compilations", -- whats that o_O | |
| 65 ["Data Export"] = "Datenexport", | |
| 66 ["Development Tools"] = "Entwicklungs Tools", | |
| 67 ["Guild"] = "Gilde", | |
| 68 ["Frame Modification"] = "Frame Modifikation", | |
| 69 ["Interface Enhancements"] = "Interface Verbesserungen", | |
| 70 ["Inventory"] = "Inventar", | |
| 71 ["Library"] = "Library", | |
| 72 ["Map"] = "Map", | |
| 73 ["Mail"] = "Mail", | |
| 74 ["Miscellaneous"] = "Diverses", | |
| 75 ["Quest"] = "Quest", | |
| 76 ["Raid"] = "Schlachtzug", | |
| 77 ["Tradeskill"] = "Handelsf\195\164higkeit", | |
| 78 ["UnitFrame"] = "UnitFrame", | |
| 79 } | |
| 80 elseif GetLocale() == "frFR" then | |
| 81 STANDBY = "|cffff5050(attente)|r" | |
| 82 | |
| 83 TITLE = "Titre" | |
| 84 NOTES = "Notes" | |
| 85 VERSION = "Version" | |
| 86 AUTHOR = "Auteur" | |
| 87 DATE = "Date" | |
| 88 CATEGORY = "Cat\195\169gorie" | |
| 89 EMAIL = "E-mail" | |
| 90 WEBSITE = "Site web" | |
| 91 CREDITS = "Credits" -- fix | |
| 92 | |
| 93 ABOUT = "A propos" | |
| 94 PRINT_ADDON_INFO = "Afficher les informations sur l'addon" | |
| 95 | |
| 96 CATEGORIES = { | |
| 97 ["Action Bars"] = "Barres d'action", | |
| 98 ["Auction"] = "H\195\180tel des ventes", | |
| 99 ["Audio"] = "Audio", | |
| 100 ["Battlegrounds/PvP"] = "Champs de bataille/JcJ", | |
| 101 ["Buffs"] = "Buffs", | |
| 102 ["Chat/Communication"] = "Chat/Communication", | |
| 103 ["Druid"] = "Druide", | |
| 104 ["Hunter"] = "Chasseur", | |
| 105 ["Mage"] = "Mage", | |
| 106 ["Paladin"] = "Paladin", | |
| 107 ["Priest"] = "Pr\195\170tre", | |
| 108 ["Rogue"] = "Voleur", | |
| 109 ["Shaman"] = "Chaman", | |
| 110 ["Warlock"] = "D\195\169moniste", | |
| 111 ["Warrior"] = "Guerrier", | |
| 112 ["Healer"] = "Soigneur", | |
| 113 ["Tank"] = "Tank", | |
| 114 ["Caster"] = "Casteur", | |
| 115 ["Combat"] = "Combat", | |
| 116 ["Compilations"] = "Compilations", | |
| 117 ["Data Export"] = "Exportation de donn\195\169es", | |
| 118 ["Development Tools"] = "Outils de d\195\169veloppement", | |
| 119 ["Guild"] = "Guilde", | |
| 120 ["Frame Modification"] = "Modification des fen\195\170tres", | |
| 121 ["Interface Enhancements"] = "Am\195\169liorations de l'interface", | |
| 122 ["Inventory"] = "Inventaire", | |
| 123 ["Library"] = "Biblioth\195\168ques", | |
| 124 ["Map"] = "Carte", | |
| 125 ["Mail"] = "Courrier", | |
| 126 ["Miscellaneous"] = "Divers", | |
| 127 ["Quest"] = "Qu\195\170tes", | |
| 128 ["Raid"] = "Raid", | |
| 129 ["Tradeskill"] = "M\195\169tiers", | |
| 130 ["UnitFrame"] = "Fen\195\170tres d'unit\195\169", | |
| 131 } | |
| 132 elseif GetLocale() == "koKR" then | |
| 133 STANDBY = "|cffff5050(????)|r" | |
| 134 | |
| 135 TITLE = "??" | |
| 136 NOTES = "??" | |
| 137 VERSION = "??" | |
| 138 AUTHOR = "???" | |
| 139 DATE = "??" | |
| 140 CATEGORY = "??" | |
| 141 EMAIL = "E-mail" | |
| 142 WEBSITE = "????" | |
| 143 CREDITS = "Credits" -- fix | |
| 144 | |
| 145 ABOUT = "??" | |
| 146 PRINT_ADDON_INFO = "??? ?? ??" | |
| 147 | |
| 148 CATEGORIES = { | |
| 149 ["Action Bars"] = "???", | |
| 150 ["Auction"] = "??", | |
| 151 ["Audio"] = "??", | |
| 152 ["Battlegrounds/PvP"] = "??/PvP", | |
| 153 ["Buffs"] = "??", | |
| 154 ["Chat/Communication"] = "??/????", | |
| 155 ["Druid"] = "????", | |
| 156 ["Hunter"] = "???", | |
| 157 ["Mage"] = "???", | |
| 158 ["Paladin"] = "???", | |
| 159 ["Priest"] = "??", | |
| 160 ["Rogue"] = "??", | |
| 161 ["Shaman"] = "???", | |
| 162 ["Warlock"] = "????", | |
| 163 ["Warrior"] = "??", | |
| 164 ["Healer"] = "??", | |
| 165 ["Tank"] = "??", | |
| 166 ["Caster"] = "???", | |
| 167 ["Combat"] = "??", | |
| 168 ["Compilations"] = "??", | |
| 169 ["Data Export"] = "?? ??", | |
| 170 ["Development Tools"] = "?? ??", | |
| 171 ["Guild"] = "??", | |
| 172 ["Frame Modification"] = "?? ??", | |
| 173 ["Interface Enhancements"] = "????? ??", | |
| 174 ["Inventory"] = "????", | |
| 175 ["Library"] = "?????", | |
| 176 ["Map"] = "??", | |
| 177 ["Mail"] = "??", | |
| 178 ["Miscellaneous"] = "??", | |
| 179 ["Quest"] = "???", | |
| 180 ["Raid"] = "???", | |
| 181 ["Tradeskill"] = "????", | |
| 182 ["UnitFrame"] = "?? ???", | |
| 183 } | |
| 184 elseif GetLocale() == "zhTW" then | |
| 185 STANDBY = "|cffff5050(??)|r" | |
| 186 | |
| 187 TITLE = "??" | |
| 188 NOTES = "??" | |
| 189 VERSION = "??" | |
| 190 AUTHOR = "??" | |
| 191 DATE = "??" | |
| 192 CATEGORY = "??" | |
| 193 EMAIL = "E-mail" | |
| 194 WEBSITE = "??" | |
| 195 CREDITS = "Credits" -- fix | |
| 196 | |
| 197 ABOUT = "??" | |
| 198 PRINT_ADDON_INFO = "??????" | |
| 199 | |
| 200 CATEGORIES = { | |
| 201 ["Action Bars"] = "???", | |
| 202 ["Auction"] = "??", | |
| 203 ["Audio"] = "??", | |
| 204 ["Battlegrounds/PvP"] = "??/PvP", | |
| 205 ["Buffs"] = "??", | |
| 206 ["Chat/Communication"] = "??/??", | |
| 207 ["Druid"] = "???", | |
| 208 ["Hunter"] = "??", | |
| 209 ["Mage"] = "??", | |
| 210 ["Paladin"] = "???", | |
| 211 ["Priest"] = "??", | |
| 212 ["Rogue"] = "??", | |
| 213 ["Shaman"] = "??", | |
| 214 ["Warlock"] = "??", | |
| 215 ["Warrior"] = "??", | |
| 216 ["Healer"] = "???", | |
| 217 ["Tank"] = "??", | |
| 218 ["Caster"] = "???", | |
| 219 ["Combat"] = "??", | |
| 220 ["Compilations"] = "??", | |
| 221 ["Data Export"] = "????", | |
| 222 ["Development Tools"] = "????", | |
| 223 ["Guild"] = "??", | |
| 224 ["Frame Modification"] = "????", | |
| 225 ["Interface Enhancements"] = "????", | |
| 226 ["Inventory"] = "??", | |
| 227 ["Library"] = "???", | |
| 228 ["Map"] = "??", | |
| 229 ["Mail"] = "??", | |
| 230 ["Miscellaneous"] = "??", | |
| 231 ["Quest"] = "??", | |
| 232 ["Raid"] = "??", | |
| 233 ["Tradeskill"] = "????", | |
| 234 ["UnitFrame"] = "????", | |
| 235 } | |
| 236 elseif GetLocale() == "zhCN" then | |
| 237 STANDBY = "|cffff5050(\230\154\130\230\140\130)|r" | |
| 238 | |
| 239 TITLE = "\230\160\135\233\162\152" | |
| 240 NOTES = "\233\153\132\230\179\168" | |
| 241 VERSION = "\231\137\136\230\156\172" | |
| 242 AUTHOR = "\228\189\156\232\128\133" | |
| 243 DATE = "\230\151\165\230\156\159" | |
| 244 CATEGORY = "\229\136\134\231\177\187" | |
| 245 EMAIL = "\231\148\181\229\173\144\233\130\174\228\187\182" | |
| 246 WEBSITE = "\231\189\145\231\171\153" | |
| 247 CREDITS = "Credits" -- fix | |
| 248 | |
| 249 ABOUT = "\229\133\179\228\186\142" | |
| 250 PRINT_ADDON_INFO = "\229\141\176\229\136\151\229\135\186\230\143\146\228\187\182\228\191\161\230\129\175" | |
| 251 | |
| 252 CATEGORIES = { | |
| 253 ["Action Bars"] = "\229\138\168\228\189\156\230\157\161", | |
| 254 ["Auction"] = "\230\139\141\229\141\150", | |
| 255 ["Audio"] = "\233\159\179\233\162\145", | |
| 256 ["Battlegrounds/PvP"] = "\230\136\152\229\156\186/PvP", | |
| 257 ["Buffs"] = "\229\162\158\231\155\138\233\173\148\230\179\149", | |
| 258 ["Chat/Communication"] = "\232\129\138\229\164\169/\228\186\164\230\181\129", | |
| 259 ["Druid"] = "\229\190\183\233\178\129\228\188\138", | |
| 260 ["Hunter"] = "\231\140\142\228\186\186", | |
| 261 ["Mage"] = "\230\179\149\229\184\136", | |
| 262 ["Paladin"] = "\229\156\163\233\170\145\229\163\171", | |
| 263 ["Priest"] = "\231\137\167\229\184\136", | |
| 264 ["Rogue"] = "\231\155\151\232\180\188", | |
| 265 ["Shaman"] = "\232\144\168\230\187\161\231\165\173\229\143\184", | |
| 266 ["Warlock"] = "\230\156\175\229\163\171", | |
| 267 ["Warrior"] = "\230\136\152\229\163\171", | |
| 268 -- ["Healer"] = "\230\178\187\231\150\151\228\191\157\233\154\156", | |
| 269 -- ["Tank"] = "\232\191\145\230\136\152\230\142\167\229\136\182", | |
| 270 -- ["Caster"] = "\232\191\156\231\168\139\232\190\147\229\135\186", | |
| 271 ["Combat"] = "\230\136\152\230\150\151", | |
| 272 ["Compilations"] = "\231\188\150\232\175\145", | |
| 273 ["Data Export"] = "\230\149\176\230\141\174\229\175\188\229\135\186", | |
| 274 ["Development Tools"] = "\229\188\128\229\143\145\229\183\165\229\133\183", | |
| 275 ["Guild"] = "\229\133\172\228\188\154", | |
| 276 ["Frame Modification"] = "\230\161\134\230\158\182\228\191\174\230\148\185", | |
| 277 ["Interface Enhancements"] = "\231\149\140\233\157\162\229\162\158\229\188\186", | |
| 278 ["Inventory"] = "\232\131\140\229\140\133", | |
| 279 ["Library"] = "\229\186\147", | |
| 280 ["Map"] = "\229\156\176\229\155\190", | |
| 281 ["Mail"] = "\233\130\174\228\187\182", | |
| 282 ["Miscellaneous"] = "\230\157\130\233\161\185", | |
| 283 ["Quest"] = "\228\187\187\229\138\161", | |
| 284 ["Raid"] = "\229\155\162\233\152\159", | |
| 285 ["Tradeskill"] = "\229\149\134\228\184\154\230\138\128\232\131\189", | |
| 286 ["UnitFrame"] = "\229\164\180\229\131\143\230\161\134\230\158\182", | |
| 287 } | |
| 288 else -- enUS | |
| 289 STANDBY = "|cffff5050(standby)|r" | |
| 290 | |
| 291 TITLE = "Title" | |
| 292 NOTES = "Notes" | |
| 293 VERSION = "Version" | |
| 294 AUTHOR = "Author" | |
| 295 DATE = "Date" | |
| 296 CATEGORY = "Category" | |
| 297 EMAIL = "E-mail" | |
| 298 WEBSITE = "Website" | |
| 299 CREDITS = "Credits" | |
| 300 | |
| 301 ABOUT = "About" | |
| 302 PRINT_ADDON_INFO = "Show information about the addon." | |
| 303 | |
| 304 CATEGORIES = { | |
| 305 ["Action Bars"] = "Action Bars", | |
| 306 ["Auction"] = "Auction", | |
| 307 ["Audio"] = "Audio", | |
| 308 ["Battlegrounds/PvP"] = "Battlegrounds/PvP", | |
| 309 ["Buffs"] = "Buffs", | |
| 310 ["Chat/Communication"] = "Chat/Communication", | |
| 311 ["Druid"] = "Druid", | |
| 312 ["Hunter"] = "Hunter", | |
| 313 ["Mage"] = "Mage", | |
| 314 ["Paladin"] = "Paladin", | |
| 315 ["Priest"] = "Priest", | |
| 316 ["Rogue"] = "Rogue", | |
| 317 ["Shaman"] = "Shaman", | |
| 318 ["Warlock"] = "Warlock", | |
| 319 ["Warrior"] = "Warrior", | |
| 320 ["Healer"] = "Healer", | |
| 321 ["Tank"] = "Tank", | |
| 322 ["Caster"] = "Caster", | |
| 323 ["Combat"] = "Combat", | |
| 324 ["Compilations"] = "Compilations", | |
| 325 ["Data Export"] = "Data Export", | |
| 326 ["Development Tools"] = "Development Tools", | |
| 327 ["Guild"] = "Guild", | |
| 328 ["Frame Modification"] = "Frame Modification", | |
| 329 ["Interface Enhancements"] = "Interface Enhancements", | |
| 330 ["Inventory"] = "Inventory", | |
| 331 ["Library"] = "Library", | |
| 332 ["Map"] = "Map", | |
| 333 ["Mail"] = "Mail", | |
| 334 ["Miscellaneous"] = "Miscellaneous", | |
| 335 ["Quest"] = "Quest", | |
| 336 ["Raid"] = "Raid", | |
| 337 ["Tradeskill"] = "Tradeskill", | |
| 338 ["UnitFrame"] = "UnitFrame", | |
| 339 } | |
| 340 end | |
| 341 | |
| 342 setmetatable(CATEGORIES, { __index = function(self, key) -- case-insensitive | |
| 343 local lowerKey = key:lower() | |
| 344 for k,v in pairs(CATEGORIES) do | |
| 345 if k:lower() == lowerKey then | |
| 346 return v | |
| 347 end | |
| 348 end | |
| 349 end }) | |
| 350 | |
| 351 -- Create the library object | |
| 352 | |
| 353 local AceOO = AceLibrary("AceOO-2.0") | |
| 354 local AceAddon = AceOO.Class() | |
| 355 local AceEvent | |
| 356 local AceConsole | |
| 357 local AceModuleCore | |
| 358 | |
| 359 function AceAddon:GetLocalizedCategory(name) | |
| 360 self:argCheck(name, 2, "string") | |
| 361 return CATEGORIES[name] or UNKNOWN | |
| 362 end | |
| 363 | |
| 364 function AceAddon:ToString() | |
| 365 return "AceAddon" | |
| 366 end | |
| 367 | |
| 368 local function print(text) | |
| 369 DEFAULT_CHAT_FRAME:AddMessage(text) | |
| 370 end | |
| 371 | |
| 372 function AceAddon:ADDON_LOADED(name) | |
| 373 while table.getn(self.nextAddon) > 0 do | |
| 374 local addon = table.remove(self.nextAddon, 1) | |
| 375 table.insert(self.addons, addon) | |
| 376 if not self.addons[name] then | |
| 377 self.addons[name] = addon | |
| 378 end | |
| 379 self:InitializeAddon(addon, name) | |
| 380 end | |
| 381 end | |
| 382 | |
| 383 local function RegisterOnEnable(self) | |
| 384 if DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.defaultLanguage then -- HACK | |
| 385 AceAddon.playerLoginFired = true | |
| 386 end | |
| 387 if AceAddon.playerLoginFired then | |
| 388 AceAddon.addonsStarted[self] = true | |
| 389 if (type(self.IsActive) ~= "function" or self:IsActive()) and (not AceModuleCore or not AceModuleCore:IsModule(self) or AceModuleCore:IsModuleActive(self)) then | |
| 390 local current = self.class | |
| 391 while true do | |
| 392 if current == AceOO.Class then | |
| 393 break | |
| 394 end | |
| 395 if current.mixins then | |
| 396 for mixin in pairs(current.mixins) do | |
| 397 if type(mixin.OnEmbedEnable) == "function" then | |
| 398 safecall(mixin.OnEmbedEnable,mixin,self) | |
| 399 end | |
| 400 end | |
| 401 end | |
| 402 current = current.super | |
| 403 end | |
| 404 if type(self.OnEnable) == "function" then | |
| 405 safecall(self.OnEnable,self) | |
| 406 end | |
| 407 if AceEvent then | |
| 408 AceEvent:TriggerEvent("Ace2_AddonEnabled", self) | |
| 409 end | |
| 410 end | |
| 411 else | |
| 412 if not AceAddon.addonsToOnEnable then | |
| 413 AceAddon.addonsToOnEnable = {} | |
| 414 end | |
| 415 table.insert(AceAddon.addonsToOnEnable, self) | |
| 416 end | |
| 417 end | |
| 418 | |
| 419 local function stripSpaces(text) | |
| 420 if type(text) == "string" then | |
| 421 return strtrim(text) | |
| 422 end | |
| 423 return text | |
| 424 end | |
| 425 | |
| 426 function AceAddon:InitializeAddon(addon, name) | |
| 427 if addon.name == nil then | |
| 428 addon.name = name | |
| 429 end | |
| 430 if GetAddOnMetadata then | |
| 431 -- TOC checks | |
| 432 if addon.title == nil then | |
| 433 addon.title = GetAddOnMetadata(name, "Title") | |
| 434 end | |
| 435 if type(addon.title) == "string" then | |
| 436 local num = addon.title:find(" |cff7fff7f %-Ace2%-|r$") | |
| 437 if num then | |
| 438 addon.title = addon.title:sub(1, num - 1) | |
| 439 end | |
| 440 addon.title = addon.title:trim() | |
| 441 end | |
| 442 if addon.notes == nil then | |
| 443 addon.notes = GetAddOnMetadata(name, "Notes") | |
| 444 end | |
| 445 if type(addon.notes) == "string" then | |
| 446 addon.notes = addon.notes:trim() | |
| 447 end | |
| 448 if addon.version == nil then | |
| 449 addon.version = GetAddOnMetadata(name, "Version") | |
| 450 end | |
| 451 if type(addon.version) == "string" then | |
| 452 if addon.version:find("%$Revision: (%d+) %$") then | |
| 453 addon.version = addon.version:gsub("%$Revision: (%d+) %$", "%1") | |
| 454 elseif addon.version:find("%$Rev: (%d+) %$") then | |
| 455 addon.version = addon.version:gsub("%$Rev: (%d+) %$", "%1") | |
| 456 elseif addon.version:find("%$LastChangedRevision: (%d+) %$") then | |
| 457 addon.version = addon.version:gsub("%$LastChangedRevision: (%d+) %$", "%1") | |
| 458 end | |
| 459 addon.version = addon.version:trim() | |
| 460 end | |
| 461 if addon.author == nil then | |
| 462 addon.author = GetAddOnMetadata(name, "Author") | |
| 463 end | |
| 464 if type(addon.author) == "string" then | |
| 465 addon.author = addon.author:trim() | |
| 466 end | |
| 467 if addon.credits == nil then | |
| 468 addon.credits = GetAddOnMetadata(name, "X-Credits") | |
| 469 end | |
| 470 if type(addon.credits) == "string" then | |
| 471 addon.credits = addon.credits:trim() | |
| 472 end | |
| 473 if addon.date == nil then | |
| 474 addon.date = GetAddOnMetadata(name, "X-Date") or GetAddOnMetadata(name, "X-ReleaseDate") | |
| 475 end | |
| 476 if type(addon.date) == "string" then | |
| 477 if addon.date:find("%$Date: (.-) %$") then | |
| 478 addon.date = addon.date:gsub("%$Date: (.-) %$", "%1") | |
| 479 elseif addon.date:find("%$LastChangedDate: (.-) %$") then | |
| 480 addon.date = addon.date:gsub("%$LastChangedDate: (.-) %$", "%1") | |
| 481 end | |
| 482 addon.date = addon.date:trim() | |
| 483 end | |
| 484 | |
| 485 if addon.category == nil then | |
| 486 addon.category = GetAddOnMetadata(name, "X-Category") | |
| 487 end | |
| 488 if type(addon.category) == "string" then | |
| 489 addon.category = addon.category:trim() | |
| 490 end | |
| 491 if addon.email == nil then | |
| 492 addon.email = GetAddOnMetadata(name, "X-eMail") or GetAddOnMetadata(name, "X-Email") | |
| 493 end | |
| 494 if type(addon.email) == "string" then | |
| 495 addon.email = addon.email:trim() | |
| 496 end | |
| 497 if addon.website == nil then | |
| 498 addon.website = GetAddOnMetadata(name, "X-Website") | |
| 499 end | |
| 500 if type(addon.website) == "string" then | |
| 501 addon.website = addon.website:trim() | |
| 502 end | |
| 503 end | |
| 504 local current = addon.class | |
| 505 while true do | |
| 506 if current == AceOO.Class then | |
| 507 break | |
| 508 end | |
| 509 if current.mixins then | |
| 510 for mixin in pairs(current.mixins) do | |
| 511 if type(mixin.OnEmbedInitialize) == "function" then | |
| 512 mixin:OnEmbedInitialize(addon, name) | |
| 513 end | |
| 514 end | |
| 515 end | |
| 516 current = current.super | |
| 517 end | |
| 518 if type(addon.OnInitialize) == "function" then | |
| 519 safecall(addon.OnInitialize, addon, name) | |
| 520 end | |
| 521 if AceEvent then | |
| 522 AceEvent:TriggerEvent("Ace2_AddonInitialized", addon) | |
| 523 end | |
| 524 RegisterOnEnable(addon) | |
| 525 end | |
| 526 | |
| 527 function AceAddon.prototype:PrintAddonInfo() | |
| 528 local x | |
| 529 if self.title then | |
| 530 x = "|cffffff7f" .. tostring(self.title) .. "|r" | |
| 531 elseif self.name then | |
| 532 x = "|cffffff7f" .. tostring(self.name) .. "|r" | |
| 533 else | |
| 534 x = "|cffffff7f<" .. tostring(self.class) .. " instance>|r" | |
| 535 end | |
| 536 if type(self.IsActive) == "function" then | |
| 537 if not self:IsActive() then | |
| 538 x = x .. " " .. STANDBY | |
| 539 end | |
| 540 end | |
| 541 if self.version then | |
| 542 x = x .. " - |cffffff7f" .. tostring(self.version) .. "|r" | |
| 543 end | |
| 544 if self.notes then | |
| 545 x = x .. " - " .. tostring(self.notes) | |
| 546 end | |
| 547 print(x) | |
| 548 if self.author then | |
| 549 print(" - |cffffff7f" .. AUTHOR .. ":|r " .. tostring(self.author)) | |
| 550 end | |
| 551 if self.credits then | |
| 552 print(" - |cffffff7f" .. CREDITS .. ":|r " .. tostring(self.credits)) | |
| 553 end | |
| 554 if self.date then | |
| 555 print(" - |cffffff7f" .. DATE .. ":|r " .. tostring(self.date)) | |
| 556 end | |
| 557 if self.category then | |
| 558 local category = CATEGORIES[self.category] | |
| 559 if category then | |
| 560 print(" - |cffffff7f" .. CATEGORY .. ":|r " .. category) | |
| 561 end | |
| 562 end | |
| 563 if self.email then | |
| 564 print(" - |cffffff7f" .. EMAIL .. ":|r " .. tostring(self.email)) | |
| 565 end | |
| 566 if self.website then | |
| 567 print(" - |cffffff7f" .. WEBSITE .. ":|r " .. tostring(self.website)) | |
| 568 end | |
| 569 end | |
| 570 | |
| 571 local options | |
| 572 function AceAddon:GetAceOptionsDataTable(target) | |
| 573 if not options then | |
| 574 options = { | |
| 575 about = { | |
| 576 name = ABOUT, | |
| 577 desc = PRINT_ADDON_INFO, | |
| 578 type = "execute", | |
| 579 func = "PrintAddonInfo", | |
| 580 order = -1, | |
| 581 } | |
| 582 } | |
| 583 end | |
| 584 return options | |
| 585 end | |
| 586 | |
| 587 function AceAddon:PLAYER_LOGIN() | |
| 588 self.playerLoginFired = true | |
| 589 if self.addonsToOnEnable then | |
| 590 while table.getn(self.addonsToOnEnable) > 0 do | |
| 591 local addon = table.remove(self.addonsToOnEnable, 1) | |
| 592 self.addonsStarted[addon] = true | |
| 593 if (type(addon.IsActive) ~= "function" or addon:IsActive()) and (not AceModuleCore or not AceModuleCore:IsModule(addon) or AceModuleCore:IsModuleActive(addon)) then | |
| 594 local current = addon.class | |
| 595 while true do | |
| 596 if current == AceOO.Class then | |
| 597 break | |
| 598 end | |
| 599 if current.mixins then | |
| 600 for mixin in pairs(current.mixins) do | |
| 601 if type(mixin.OnEmbedEnable) == "function" then | |
| 602 safecall(mixin.OnEmbedEnable,mixin,addon) | |
| 603 end | |
| 604 end | |
| 605 end | |
| 606 current = current.super | |
| 607 end | |
| 608 if type(addon.OnEnable) == "function" then | |
| 609 safecall(addon.OnEnable,addon) | |
| 610 end | |
| 611 if AceEvent then | |
| 612 AceEvent:TriggerEvent("Ace2_AddonEnabled", addon) | |
| 613 end | |
| 614 end | |
| 615 end | |
| 616 self.addonsToOnEnable = nil | |
| 617 end | |
| 618 end | |
| 619 | |
| 620 function AceAddon.prototype:Inject(t) | |
| 621 AceAddon:argCheck(t, 2, "table") | |
| 622 for k,v in pairs(t) do | |
| 623 self[k] = v | |
| 624 end | |
| 625 end | |
| 626 | |
| 627 function AceAddon.prototype:init() | |
| 628 if not AceEvent then | |
| 629 error(MAJOR_VERSION .. " requires AceEvent-2.0", 4) | |
| 630 end | |
| 631 AceAddon.super.prototype.init(self) | |
| 632 | |
| 633 self.super = self.class.prototype | |
| 634 | |
| 635 AceAddon:RegisterEvent("ADDON_LOADED", "ADDON_LOADED", true) | |
| 636 table.insert(AceAddon.nextAddon, self) | |
| 637 end | |
| 638 | |
| 639 function AceAddon.prototype:ToString() | |
| 640 local x | |
| 641 if type(self.title) == "string" then | |
| 642 x = self.title | |
| 643 elseif type(self.name) == "string" then | |
| 644 x = self.name | |
| 645 else | |
| 646 x = "<" .. tostring(self.class) .. " instance>" | |
| 647 end | |
| 648 if (type(self.IsActive) == "function" and not self:IsActive()) or (AceModuleCore and AceModuleCore:IsModule(addon) and AceModuleCore:IsModuleActive(addon)) then | |
| 649 x = x .. " " .. STANDBY | |
| 650 end | |
| 651 return x | |
| 652 end | |
| 653 | |
| 654 AceAddon.new = function(self, ...) | |
| 655 local class = AceAddon:pcall(AceOO.Classpool, self, ...) | |
| 656 return class:new() | |
| 657 end | |
| 658 | |
| 659 local function external(self, major, instance) | |
| 660 if major == "AceEvent-2.0" then | |
| 661 AceEvent = instance | |
| 662 | |
| 663 AceEvent:embed(self) | |
| 664 | |
| 665 self:RegisterEvent("PLAYER_LOGIN", "PLAYER_LOGIN", true) | |
| 666 elseif major == "AceConsole-2.0" then | |
| 667 AceConsole = instance | |
| 668 | |
| 669 local slashCommands = { "/ace2" } | |
| 670 local _,_,_,enabled,loadable = GetAddOnInfo("Ace") | |
| 671 if not enabled or not loadable then | |
| 672 table.insert(slashCommands, "/ace") | |
| 673 end | |
| 674 local function listAddon(addon, depth) | |
| 675 if not depth then | |
| 676 depth = 0 | |
| 677 end | |
| 678 | |
| 679 local s = (" "):rep(depth) .. " - " .. tostring(addon) | |
| 680 if rawget(addon, 'version') then | |
| 681 s = s .. " - |cffffff7f" .. tostring(addon.version) .. "|r" | |
| 682 end | |
| 683 if rawget(addon, 'slashCommand') then | |
| 684 s = s .. " |cffffff7f(" .. tostring(addon.slashCommand) .. ")|r" | |
| 685 end | |
| 686 print(s) | |
| 687 if type(rawget(addon, 'modules')) == "table" then | |
| 688 local i = 0 | |
| 689 for k,v in pairs(addon.modules) do | |
| 690 i = i + 1 | |
| 691 if i == 6 then | |
| 692 print((" "):rep(depth + 1) .. " - more...") | |
| 693 break | |
| 694 else | |
| 695 listAddon(v, depth + 1) | |
| 696 end | |
| 697 end | |
| 698 end | |
| 699 end | |
| 700 local function listNormalAddon(i) | |
| 701 local name,_,_,enabled,loadable = GetAddOnInfo(i) | |
| 702 if not loadable then | |
| 703 enabled = false | |
| 704 end | |
| 705 if self.addons[name] then | |
| 706 local addon = self.addons[name] | |
| 707 if not AceCoreAddon or not AceCoreAddon:IsModule(addon) then | |
| 708 listAddon(addon) | |
| 709 end | |
| 710 else | |
| 711 local s = " - " .. tostring(GetAddOnMetadata(i, "Title") or name) | |
| 712 local version = GetAddOnMetadata(i, "Version") | |
| 713 if version then | |
| 714 if version:find("%$Revision: (%d+) %$") then | |
| 715 version = version:gsub("%$Revision: (%d+) %$", "%1") | |
| 716 elseif version:find("%$Rev: (%d+) %$") then | |
| 717 version = version:gsub("%$Rev: (%d+) %$", "%1") | |
| 718 elseif version:find("%$LastChangedRevision: (%d+) %$") then | |
| 719 version = version:gsub("%$LastChangedRevision: (%d+) %$", "%1") | |
| 720 end | |
| 721 s = s .. " - |cffffff7f" .. version .. "|r" | |
| 722 end | |
| 723 if not enabled then | |
| 724 s = s .. " |cffff0000(disabled)|r" | |
| 725 end | |
| 726 if IsAddOnLoadOnDemand(i) then | |
| 727 s = s .. " |cff00ff00[LoD]|r" | |
| 728 end | |
| 729 print(s) | |
| 730 end | |
| 731 end | |
| 732 local function mySort(alpha, bravo) | |
| 733 return tostring(alpha) < tostring(bravo) | |
| 734 end | |
| 735 AceConsole.RegisterChatCommand(self, slashCommands, { | |
| 736 desc = "AddOn development framework", | |
| 737 name = "Ace2", | |
| 738 type = "group", | |
| 739 args = { | |
| 740 about = { | |
| 741 desc = "Get information about Ace2", | |
| 742 name = "About", | |
| 743 type = "execute", | |
| 744 func = function() | |
| 745 print("|cffffff7fAce2|r - |cffffff7f2.0." .. MINOR_VERSION:gsub("%$Revision: (%d+) %$", "%1") .. "|r - AddOn development framework") | |
| 746 print(" - |cffffff7f" .. AUTHOR .. ":|r Ace Development Team") | |
| 747 print(" - |cffffff7f" .. WEBSITE .. ":|r http://www.wowace.com/") | |
| 748 end | |
| 749 }, | |
| 750 list = { | |
| 751 desc = "List addons", | |
| 752 name = "List", | |
| 753 type = "group", | |
| 754 args = { | |
| 755 ace2 = { | |
| 756 desc = "List addons using Ace2", | |
| 757 name = "Ace2", | |
| 758 type = "execute", | |
| 759 func = function() | |
| 760 print("|cffffff7fAddon list:|r") | |
| 761 local AceCoreAddon = AceLibrary:HasInstance("AceCoreAddon-2.0") and AceLibrary("AceCoreAddon-2.0") | |
| 762 table.sort(self.addons, mySort) | |
| 763 for _,v in ipairs(self.addons) do | |
| 764 if not AceCoreAddon or not AceCoreAddon:IsModule(v) then | |
| 765 listAddon(v) | |
| 766 end | |
| 767 end | |
| 768 end | |
| 769 }, | |
| 770 all = { | |
| 771 desc = "List all addons", | |
| 772 name = "All", | |
| 773 type = "execute", | |
| 774 func = function() | |
| 775 print("|cffffff7fAddon list:|r") | |
| 776 local AceCoreAddon = AceLibrary:HasInstance("AceCoreAddon-2.0") and AceLibrary("AceCoreAddon-2.0") | |
| 777 local count = GetNumAddOns() | |
| 778 for i = 1, count do | |
| 779 listNormalAddon(i) | |
| 780 end | |
| 781 end | |
| 782 }, | |
| 783 enabled = { | |
| 784 desc = "List all enabled addons", | |
| 785 name = "Enabled", | |
| 786 type = "execute", | |
| 787 func = function() | |
| 788 print("|cffffff7fAddon list:|r") | |
| 789 local AceCoreAddon = AceLibrary:HasInstance("AceCoreAddon-2.0") and AceLibrary("AceCoreAddon-2.0") | |
| 790 local count = GetNumAddOns() | |
| 791 for i = 1, count do | |
| 792 local _,_,_,enabled,loadable = GetAddOnInfo(i) | |
| 793 if enabled and loadable then | |
| 794 listNormalAddon(i) | |
| 795 end | |
| 796 end | |
| 797 end | |
| 798 }, | |
| 799 disabled = { | |
| 800 desc = "List all disabled addons", | |
| 801 name = "Disabled", | |
| 802 type = "execute", | |
| 803 func = function() | |
| 804 print("|cffffff7fAddon list:|r") | |
| 805 local AceCoreAddon = AceLibrary:HasInstance("AceCoreAddon-2.0") and AceLibrary("AceCoreAddon-2.0") | |
| 806 local count = GetNumAddOns() | |
| 807 for i = 1, count do | |
| 808 local _,_,_,enabled,loadable = GetAddOnInfo(i) | |
| 809 if not enabled or not loadable then | |
| 810 listNormalAddon(i) | |
| 811 end | |
| 812 end | |
| 813 end | |
| 814 }, | |
| 815 lod = { | |
| 816 desc = "List all LoadOnDemand addons", | |
| 817 name = "LoadOnDemand", | |
| 818 type = "execute", | |
| 819 func = function() | |
| 820 print("|cffffff7fAddon list:|r") | |
| 821 local AceCoreAddon = AceLibrary:HasInstance("AceCoreAddon-2.0") and AceLibrary("AceCoreAddon-2.0") | |
| 822 local count = GetNumAddOns() | |
| 823 for i = 1, count do | |
| 824 if IsAddOnLoadOnDemand(i) then | |
| 825 listNormalAddon(i) | |
| 826 end | |
| 827 end | |
| 828 end | |
| 829 }, | |
| 830 ace1 = { | |
| 831 desc = "List all addons using Ace1", | |
| 832 name = "Ace 1.x", | |
| 833 type = "execute", | |
| 834 func = function() | |
| 835 print("|cffffff7fAddon list:|r") | |
| 836 local count = GetNumAddOns() | |
| 837 for i = 1, count do | |
| 838 local dep1, dep2, dep3, dep4 = GetAddOnDependencies(i) | |
| 839 if dep1 == "Ace" or dep2 == "Ace" or dep3 == "Ace" or dep4 == "Ace" then | |
| 840 listNormalAddon(i) | |
| 841 end | |
| 842 end | |
| 843 end | |
| 844 }, | |
| 845 libs = { | |
| 846 desc = "List all libraries using AceLibrary", | |
| 847 name = "Libraries", | |
| 848 type = "execute", | |
| 849 func = function() | |
| 850 if type(AceLibrary) == "table" and type(AceLibrary.libs) == "table" then | |
| 851 print("|cffffff7fLibrary list:|r") | |
| 852 for name, data in pairs(AceLibrary.libs) do | |
| 853 local s | |
| 854 if data.minor then | |
| 855 s = " - " .. tostring(name) .. "." .. tostring(data.minor) | |
| 856 else | |
| 857 s = " - " .. tostring(name) | |
| 858 end | |
| 859 if rawget(AceLibrary(name), 'slashCommand') then | |
| 860 s = s .. " |cffffff7f(" .. tostring(AceLibrary(name).slashCommand) .. "|cffffff7f)" | |
| 861 end | |
| 862 print(s) | |
| 863 end | |
| 864 end | |
| 865 end | |
| 866 }, | |
| 867 search = { | |
| 868 desc = "Search by name", | |
| 869 name = "Search", | |
| 870 type = "text", | |
| 871 usage = "<keyword>", | |
| 872 input = true, | |
| 873 get = false, | |
| 874 set = function(...) | |
| 875 local arg = { ... } | |
| 876 for i,v in ipairs(arg) do | |
| 877 arg[i] = v:gsub('%*', '.*'):gsub('%%', '%%%%'):lower() | |
| 878 end | |
| 879 local count = GetNumAddOns() | |
| 880 for i = 1, count do | |
| 881 local name = GetAddOnInfo(i) | |
| 882 local good = true | |
| 883 for _,v in ipairs(arg) do | |
| 884 if not name:lower():find(v) then | |
| 885 good = false | |
| 886 break | |
| 887 end | |
| 888 end | |
| 889 if good then | |
| 890 listNormalAddon(i) | |
| 891 end | |
| 892 end | |
| 893 end | |
| 894 } | |
| 895 }, | |
| 896 }, | |
| 897 enable = { | |
| 898 desc = "Enable addon", | |
| 899 name = "Enable", | |
| 900 type = "text", | |
| 901 usage = "<addon>", | |
| 902 get = false, | |
| 903 set = function(text) | |
| 904 local name,title,_,enabled,_,reason = GetAddOnInfo(text) | |
| 905 if reason == "MISSING" then | |
| 906 print(string.format("|cffffff7fAce2:|r AddOn %q does not exist", text)) | |
| 907 elseif not enabled then | |
| 908 EnableAddOn(text) | |
| 909 print(string.format("|cffffff7fAce2:|r %s is now enabled", title or name)) | |
| 910 else | |
| 911 print(string.format("|cffffff7fAce2:|r %s is already enabled", title or name)) | |
| 912 end | |
| 913 end, | |
| 914 }, | |
| 915 disable = { | |
| 916 desc = "Disable addon", | |
| 917 name = "Disable", | |
| 918 type = "text", | |
| 919 usage = "<addon>", | |
| 920 get = false, | |
| 921 set = function(text) | |
| 922 local name,title,_,enabled,_,reason = GetAddOnInfo(text) | |
| 923 if reason == "MISSING" then | |
| 924 print(string.format("|cffffff7fAce2:|r AddOn %q does not exist", text)) | |
| 925 elseif enabled then | |
| 926 DisableAddOn(text) | |
| 927 print(string.format("|cffffff7fAce2:|r %s is now disabled", title or name)) | |
| 928 else | |
| 929 print(string.format("|cffffff7fAce2:|r %s is already disabled", title or name)) | |
| 930 end | |
| 931 end, | |
| 932 }, | |
| 933 load = { | |
| 934 desc = "Load addon", | |
| 935 name = "Load", | |
| 936 type = "text", | |
| 937 usage = "<addon>", | |
| 938 get = false, | |
| 939 set = function(text) | |
| 940 local name,title,_,_,loadable,reason = GetAddOnInfo(text) | |
| 941 if reason == "MISSING" then | |
| 942 print(string.format("|cffffff7fAce2:|r AddOn %q does not exist.", text)) | |
| 943 elseif not loadable then | |
| 944 print(string.format("|cffffff7fAce2:|r AddOn %q is not loadable. Reason: %s", text, reason)) | |
| 945 else | |
| 946 LoadAddOn(text) | |
| 947 print(string.format("|cffffff7fAce2:|r %s is now loaded", title or name)) | |
| 948 end | |
| 949 end | |
| 950 }, | |
| 951 info = { | |
| 952 desc = "Display information", | |
| 953 name = "Information", | |
| 954 type = "execute", | |
| 955 func = function() | |
| 956 local mem, threshold = gcinfo() | |
| 957 print(string.format(" - |cffffff7fMemory usage [|r%.3f MiB|cffffff7f]|r", mem / 1024)) | |
| 958 if threshold then | |
| 959 print(string.format(" - |cffffff7fThreshold [|r%.3f MiB|cffffff7f]|r", threshold / 1024)) | |
| 960 end | |
| 961 print(string.format(" - |cffffff7fFramerate [|r%.0f fps|cffffff7f]|r", GetFramerate())) | |
| 962 local bandwidthIn, bandwidthOut, latency = GetNetStats() | |
| 963 bandwidthIn, bandwidthOut = floor(bandwidthIn * 1024), floor(bandwidthOut * 1024) | |
| 964 print(string.format(" - |cffffff7fLatency [|r%.0f ms|cffffff7f]|r", latency)) | |
| 965 print(string.format(" - |cffffff7fBandwidth in [|r%.0f B/s|cffffff7f]|r", bandwidthIn)) | |
| 966 print(string.format(" - |cffffff7fBandwidth out [|r%.0f B/s|cffffff7f]|r", bandwidthOut)) | |
| 967 print(string.format(" - |cffffff7fTotal addons [|r%d|cffffff7f]|r", GetNumAddOns())) | |
| 968 print(string.format(" - |cffffff7fAce2 addons [|r%d|cffffff7f]|r", table.getn(self.addons))) | |
| 969 local ace = 0 | |
| 970 local enabled = 0 | |
| 971 local disabled = 0 | |
| 972 local lod = 0 | |
| 973 for i = 1, GetNumAddOns() do | |
| 974 local dep1, dep2, dep3, dep4 = GetAddOnDependencies(i) | |
| 975 if dep1 == "Ace" or dep2 == "Ace" or dep3 == "Ace" or dep4 == "Ace" then | |
| 976 ace = ace + 1 | |
| 977 end | |
| 978 if IsAddOnLoadOnDemand(i) then | |
| 979 lod = lod + 1 | |
| 980 end | |
| 981 local _,_,_,IsActive,loadable = GetAddOnInfo(i) | |
| 982 if not IsActive or not loadable then | |
| 983 disabled = disabled + 1 | |
| 984 else | |
| 985 enabled = enabled + 1 | |
| 986 end | |
| 987 end | |
| 988 print(string.format(" - |cffffff7fAce 1.x addons [|r%d|cffffff7f]|r", ace)) | |
| 989 print(string.format(" - |cffffff7fLoadOnDemand addons [|r%d|cffffff7f]|r", lod)) | |
| 990 print(string.format(" - |cffffff7fenabled addons [|r%d|cffffff7f]|r", enabled)) | |
| 991 print(string.format(" - |cffffff7fdisabled addons [|r%d|cffffff7f]|r", disabled)) | |
| 992 local libs = 0 | |
| 993 if type(AceLibrary) == "table" and type(AceLibrary.libs) == "table" then | |
| 994 for _ in pairs(AceLibrary.libs) do | |
| 995 libs = libs + 1 | |
| 996 end | |
| 997 end | |
| 998 print(string.format(" - |cffffff7fAceLibrary instances [|r%d|cffffff7f]|r", libs)) | |
| 999 end | |
| 1000 } | |
| 1001 } | |
| 1002 }) | |
| 1003 elseif major == "AceModuleCore-2.0" then | |
| 1004 AceModuleCore = instance | |
| 1005 end | |
| 1006 end | |
| 1007 | |
| 1008 local function activate(self, oldLib, oldDeactivate) | |
| 1009 AceAddon = self | |
| 1010 | |
| 1011 if oldLib then | |
| 1012 self.playerLoginFired = oldLib.playerLoginFired or DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.defaultLanguage | |
| 1013 self.addonsToOnEnable = oldLib.addonsToOnEnable | |
| 1014 self.addons = oldLib.addons | |
| 1015 self.nextAddon = oldLib.nextAddon | |
| 1016 self.addonsStarted = oldLib.addonsStarted | |
| 1017 end | |
| 1018 if not self.addons then | |
| 1019 self.addons = {} | |
| 1020 end | |
| 1021 if not self.nextAddon then | |
| 1022 self.nextAddon = {} | |
| 1023 end | |
| 1024 if not self.addonsStarted then | |
| 1025 self.addonsStarted = {} | |
| 1026 end | |
| 1027 if oldDeactivate then | |
| 1028 oldDeactivate(oldLib) | |
| 1029 end | |
| 1030 end | |
| 1031 | |
| 1032 AceLibrary:Register(AceAddon, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) |
