This commit is contained in:
Andrew6810
2022-10-21 06:29:32 -07:00
parent 5cca051e96
commit db2a2cc2ff
161 changed files with 147766 additions and 2 deletions
+4
View File
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/">
<Script file="dkp.lua"/>
<Script file="classpriority.lua"/>
</Ui>
+29
View File
@@ -0,0 +1,29 @@
--[[
classpriority.lua
This file can be used in your guild to indicate class priority on items.
Just add an entry of the form:
ItemXXXXX = "Class";
Where XXXXX is the itemID.
The class will appear in the tooltip automatically.
]]
AtlasLootClassPriority = {
-----------------
-- Molten Core --
-----------------
--Tier 1 Loot--
--Arcanist Boots
Item16800 = "";
--Felheart Gloves
Item16805 = "";
--Cenarion Boots
Item16829 = "";
--Earthfury Boots
Item16837 = "";
--Gauntlets of Might
Item16863 = "";
--Lawbringer Boots
Item16859 = "";
};
+29
View File
@@ -0,0 +1,29 @@
--[[
dkp.lua
This file can be used in your guild to indicate dkp cost on items.
Just add an entry of the form:
ItemXXXXX = "DKP Value";
Where XXXXX is the itemID.
The DKP cost will appear in the tooltip automatically.
]]
AtlasLootDKPValues = {
-----------------
-- Molten Core --
-----------------
--Tier 1 Loot--
--Arcanist Boots
Item16800 = "";
--Felheart Gloves
Item16805 = "";
--Cenarion Boots
Item16829 = "";
--Earthfury Boots
Item16837 = "";
--Gauntlets of Might
Item16863 = "";
--Lawbringer Boots
Item16859 = "";
};
+41
View File
@@ -0,0 +1,41 @@
## Interface: 30300
## Title: AtlasLoot Ascension Edition
## Notes: Shows the possible loot from the bosses
## Author: v7 Rebuid Done by: Anch/Rvng (Original: Hegarol, Ascension: Skray/Szyler/Anch/Rvng)
## Version: v7.1.0
## X-eMail:
## X-Credits: Daviesh, Lag, Cellelach, Asurn, Pernicus and many others.
## X-Category: Map
## X-License: GPL v2
## X-Website: https://discord.gg/uYCE2X2FgA
## X-Embeds: Ace3, DewdropLib, FuBarPlugin-2.0, LibBabble-Boss-3.0, LibBabble-Faction-3.0, LibBabble-Inventory-3.0, LibBabble-Zone-3.0
## Title-deDE: AtlasLoot Enhanced
## Notes-deDE: Zeigt mögliche Beute von Bossen
## Title-frFR: AtlasLoot Enhanced
## Notes-frFR: Montre le butin possible des boss
## Title-esES: AtlasLoot Enhanced
## Notes-esES: Muestra el posible botin de los jefes finales
## Title-koKR: AtlasLoot Enhanced
## Notes-koKR: Shows the possible loot from the bosses
## Title-zhCN: AtlasLoot Enhanced
## Notes-zhCN: 显示副本中的首领与小怪可能掉落的物品
## Title-zhTW: |r|cFF0099FF[地圖]|rAL 物品掉落主程式
## Notes-zhTW: 顯示首領與小怪可能掉落的物品,並可查詢各陣營與戰場的獎勵物品、套裝物品等
## RealTitle-zhCN: [地图]副本掉落物品查询
## RealTitle-zhTW: [地圖]AL 物品掉落[主程式]
## Notes-ruRU: Отображает весю возможную добычу с боссов
## SavedVariables: AtlasLootOptions, AtlasLootDB, AtlasLootWishList
## SavedVariablesPerCharacter: AtlasLootCharDB, AtlasLootFilterDB
## OptionalDeps: LootLink, ItemSync, DewdropLib, FuBarPlugin-3.0, FuBar, Ace3, LibBabble-Boss-3.0, LibBabble-Faction-3.0, LibBabble-Inventory-3.0, LibBabble-Zone-3.0
embeds.xml
Locales\Locales.xml
Add_Ons\Addons.xml
Core\AtlasLoot.xml
Menus\Menus.xml
DefaultFrame\Frames.xml
modules.xml
+129
View File
@@ -0,0 +1,129 @@
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
AtlasLoot_Difficulty = {
-- table of difficulties and there itemID references
["Default"] = {};
["ClassicDungeon"] = {
{"Normal", 2,},
{"Bloodforged", 1,},
};
["PVP"] = {
{"Normal", 2},
{"Bloodforged", 1},
};
["ClassicDungeonExt"] = {
{"Bloodforged", 1},
{"Normal", 2},
{"Heroic", 3},
{"Mythic", 4},
{"Mythic 1", 5 }, {"Mythic 2", 6 }, {"Mythic 3", 7 }, {"Mythic 4", 8 }, {"Mythic 5", 9 },
{"Mythic 6", 10 }, {"Mythic 7", 11 }, {"Mythic 8", 12 }, {"Mythic 9", 13 }, {"Mythic 10", 14 },
{"Mythic 11", 15 }, {"Mythic 12", 16 }, {"Mythic 13", 17 }, {"Mythic 14", 18 }, {"Mythic 15", 19 },
{"Mythic 16", 20 }, {"Mythic 17", 21 }, {"Mythic 18", 22 }, {"Mythic 19", 23 }, {"Mythic 20", 24 },
{"Mythic 21", 25 }, {"Mythic 22", 26 }, {"Mythic 23", 27 }, {"Mythic 24", 28 }, {"Mythic 25", 29 },
{"Mythic 26", 30 }, {"Mythic 27", 31 }, {"Mythic 28", 32 }, {"Mythic 29", 33 }, {"Mythic 30", 34 },
{"Mythic 31", 35 }, {"Mythic 32", 36 }, {"Mythic 33", 37 }, {"Mythic 34", 38 }, {"Mythic 35", 39 },
{"Mythic 36", 40 }, {"Mythic 37", 41 }, {"Mythic 38", 42 }, {"Mythic 39", 43 }, {"Mythic 40", 44 },
};
["ClassicRaid"] = {
{"Normal Flex", 2},
{"Heroic Flex", 3},
{"Ascended", 4},
{"Bloodforged", 1},
};
["BCDungeon"] = {
{"Bloodforged", 1},
{"Normal/Heroic", 2},
{"Mythic", 4},
{"Mythic 1", 5 }, {"Mythic 2", 6 }, {"Mythic 3", 7 }, {"Mythic 4", 8 }, {"Mythic 5", 9 },
{"Mythic 6", 10 }, {"Mythic 7", 11 }, {"Mythic 8", 12 }, {"Mythic 9", 13 }, {"Mythic 10", 14 },
{"Mythic 11", 15 }, {"Mythic 12", 16 }, {"Mythic 13", 17 }, {"Mythic 14", 18 }, {"Mythic 15", 19 },
{"Mythic 16", 20 }, {"Mythic 17", 21 }, {"Mythic 18", 22 }, {"Mythic 19", 23 }, {"Mythic 20", 24 },
{"Mythic 21", 25 }, {"Mythic 22", 26 }, {"Mythic 23", 27 }, {"Mythic 24", 28 }, {"Mythic 25", 29 },
{"Mythic 26", 30 }, {"Mythic 27", 31 }, {"Mythic 28", 32 }, {"Mythic 29", 33 }, {"Mythic 30", 34 },
{"Mythic 31", 35 }, {"Mythic 32", 36 }, {"Mythic 33", 37 }, {"Mythic 34", 38 }, {"Mythic 35", 39 },
{"Mythic 36", 40 }, {"Mythic 37", 41 }, {"Mythic 38", 42 }, {"Mythic 39", 43 }, {"Mythic 40", 44 },
};
["BCRaid"] = {
{"Normal Flex", 2},
{"Heroic Flex", 3},
{"Ascended", 4},
{"Bloodforged", 1},
};
["WrathDungeon"] = {
{"Normal/Heroic", 2},
{"Mythic", 4},
{"Bloodforged", 1},
{"Mythic 1", 5 }, {"Mythic 2", 6 }, {"Mythic 3", 7 }, {"Mythic 4", 8 }, {"Mythic 5", 9 },
{"Mythic 6", 10 }, {"Mythic 7", 11 }, {"Mythic 8", 12 }, {"Mythic 9", 13 }, {"Mythic 10", 14 },
{"Mythic 11", 15 }, {"Mythic 12", 16 }, {"Mythic 13", 17 }, {"Mythic 14", 18 }, {"Mythic 15", 19 },
{"Mythic 16", 20 }, {"Mythic 17", 21 }, {"Mythic 18", 22 }, {"Mythic 19", 23 }, {"Mythic 20", 24 },
};
["WrathRaid"] = {
{"Normal Flex", 2},
{"Heroic Flex", 3},
{"Ascended", 4},
{"Bloodforged", 1},
};
["Crafting"] = {
{"Crafting Patterns", "Pattern" },
{"Item Normal", 2 },
{"Bloodforged", 1 },
};
["Search"] = {
{"Bloodforged", 1},
{"Normal", 2},
{"Heroic", 3},
{"Mythic/Ascended", 4},
{"Mythic 1", 5 }, {"Mythic 2", 6 }, {"Mythic 3", 7 }, {"Mythic 4", 8 }, {"Mythic 5", 9 },
{"Mythic 6", 10 }, {"Mythic 7", 11 }, {"Mythic 8", 12 }, {"Mythic 9", 13 }, {"Mythic 10", 14 },
{"Mythic 11", 15 }, {"Mythic 12", 16 }, {"Mythic 13", 17 }, {"Mythic 14", 18 }, {"Mythic 15", 19 },
{"Mythic 16", 20 }, {"Mythic 17", 21 }, {"Mythic 18", 22 }, {"Mythic 19", 23 }, {"Mythic 20", 24 },
{"Mythic 21", 25 }, {"Mythic 22", 26 }, {"Mythic 23", 27 }, {"Mythic 24", 28 }, {"Mythic 25", 29 },
{"Mythic 26", 30 }, {"Mythic 27", 31 }, {"Mythic 28", 32 }, {"Mythic 29", 33 }, {"Mythic 30", 34 },
{"Mythic 31", 35 }, {"Mythic 32", 36 }, {"Mythic 33", 37 }, {"Mythic 34", 38 }, {"Mythic 35", 39 },
{"Mythic 36", 40 }, {"Mythic 37", 41 }, {"Mythic 38", 42 }, {"Mythic 39", 43 }, {"Mythic 40", 44 },
};
--Enums for comparisons in code
Bloodforged = 1;
Normal = 2;
Heroic = 3;
Mythic = 4;
Ascended = 4;
MythicPlus = {
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38, 39, 40, 41, 42, 43, 44
}; --Usage AtlasLoot_Difficulty.MythicPlus[1-40];
DIF_SEARCH = 16;
DUPLICATE = 17;
MIN_DIF = 18;
MAX_DIF = 19;
}
function AtlasLoot_Difficulty:getMaxDifficulty(difficultyKey)
if(difficultyKey == "ClassicDungeon" or difficultyKey == "PVP") then
return 2;
elseif (difficultyKey == "ClassicDungeonExt" or difficultyKey == "BCDungeon" or difficultyKey == "WrathDungeon") then
return 44;
elseif (difficultyKey == "ClassicRaid" or difficultyKey == "BCRaid" or difficultyKey == "WrathRaid") then
return 4;
else
return 0;
end
end
File diff suppressed because it is too large Load Diff
+25
View File
@@ -0,0 +1,25 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/">
<!--Ascension Files-->
<Script file="AtlasDifficulty.lua"/>
<Script file="ItemIDsDatabase.lua"/>
<Script file="ItemIDsDatabase2.lua"/>
<Script file="ItemIDsDatabase3.lua"/>
<Script file="ItemIDsDatabaseFixes.lua"/>
<!--Default Files-->
<Script file="AtlasLoot.lua"/>
<Script file="Filter.lua"/>
<Script file="ExtraText.lua"/>
<Script file="TextParsing.lua"/>
<Script file="Options.lua"/>
<Script file="LootButtons.lua"/>
<Script file="Atlasloot_Maps.lua"/>
<Script file="Launchers.lua"/>
<Script file="WishList.lua"/>
<Script file="SearchAdvanced.lua"/>
<Script file="Search.lua"/>
<GameTooltip name="AtlasLootTooltip" inherits="GameTooltipTemplate" parent="UIParent" hidden="true"/>
</Ui>
File diff suppressed because it is too large Load Diff
+405
View File
@@ -0,0 +1,405 @@
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
local BabbleBoss = AtlasLoot_GetLocaleLibBabble("LibBabble-Boss-3.0")
local BabbleInventory = AtlasLoot_GetLocaleLibBabble("LibBabble-Inventory-3.0")
local BabbleFaction = AtlasLoot_GetLocaleLibBabble("LibBabble-Faction-3.0")
local BabbleZone = AtlasLoot_GetLocaleLibBabble("LibBabble-Zone-3.0")
-- Colours stored for code readability
local GREY = "|cff999999";
local RED = "|cffff0000";
local WHITE = "|cffFFFFFF";
local GREEN = "|cff1eff00";
local PURPLE = "|cff9F3FFF";
local BLUE = "|cff0070dd";
local ORANGE = "|cffFF8400";
local INDENT = " ";
AtlasLoot_ExtraText = {
AhnKahet = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
AzjolNerub = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
AuchAuchenaiCrypts = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
AuchManaTombs = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
AuchSethekkHalls = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
AuchShadowLabyrinth = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
BlackfathomDeeps = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
BlackrockDepths = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Set: The Gladiator"];
};
BlackrockSpireLower = {
"";
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Dungeon 1/2 Sets"];
};
BlackrockSpireUpper = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Dungeon 1/2 Sets"];
};
BlackTempleStart = {
"";
GREY..INDENT..AL["BT Patterns/Plans"];
GREY..INDENT..AL["Trash Mobs"];
};
BlackTempleBasement = {
"";
GREY..INDENT..AL["BT Patterns/Plans"];
GREY..INDENT..AL["Trash Mobs"];
};
BlackTempleMiddle = {
"";
GREY..INDENT..AL["BT Patterns/Plans"];
GREY..INDENT..AL["Trash Mobs"];
};
BlackTempleTop = {
"";
GREY..INDENT..AL["BT Patterns/Plans"];
GREY..INDENT..AL["Trash Mobs"];
};
BlackTempleFull = {
"";
GREY..INDENT..AL["BT Patterns/Plans"];
GREY..INDENT..AL["Trash Mobs"];
};
BlackwingLair = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Tier 2 Sets"];
};
CFRTheSteamvault = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
CFRSerpentshrineCavern = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
CoTOldHillsbrad = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
CoTBlackMorass = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
CoTHyjal = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
CoTOldStratholme = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
TheDeadmines = {
"";
GREY..INDENT..AL["Set: Defias Leather"];
};
DireMaulEast = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Dire Maul Books"];
};
DireMaulNorth = {
"";
GREY..INDENT..AL["Tribute Run"];
GREY..INDENT..AL["Dire Maul Books"];
};
DireMaulWest = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Dire Maul Books"];
};
DrakTharonKeep = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
FHTheForgeOfSouls = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
FHPitOfSaron = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
FHHallsOfReflection = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
Gnomeregan = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
Gundrak = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
HCTheShatteredHalls = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
IcecrownStart = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
IcecrownCitadelA = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
IcecrownCitadelB = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
IcecrownCitadelC = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
Karazhan = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
KarazhanStart = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
KarazhanEnd = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
MagistersTerrace = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
MoltenCore = {
"";
GREY..INDENT..AL["Tier 1 Sets"];
GREY..INDENT..AL["Random Boss Loot"];
GREY..INDENT..AL["Trash Mobs"];
};
Naxxramas = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Tier 7/8 Sets"];
};
RazorfenDowns = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
RazorfenKraul = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
TempestKeepMechanar = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
TempestKeepBotanica = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
TempestKeepArcatraz = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
TempestKeepTheEye = {
"";
GREY..INDENT..AL["Legendary Items for Kael'thas Fight"];
GREY..INDENT..AL["Trash Mobs"];
};
TheOculus = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
TheRuinsofAhnQiraj = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Class Books"];
GREY..INDENT..AL["AQ Enchants"];
GREY..INDENT..AL["AQ20 Class Sets"];
};
SMArmory = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Set: Chain of the Scarlet Crusade"];
};
SMCathedral = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Set: Chain of the Scarlet Crusade"];
};
SMGraveyard = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Set: Chain of the Scarlet Crusade"];
};
SMLibrary = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Set: Chain of the Scarlet Crusade"];
};
Scholomance = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Set: Necropile Raiment"];
GREY..INDENT..AL["Set: Cadaverous Garb"];
GREY..INDENT..AL["Set: Bloodmail Regalia"];
GREY..INDENT..AL["Set: Deathbone Guardian"];
};
ShadowfangKeep = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
TheStockade = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
Stratholme = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
SunwellPlateau = {
"";
GREY..INDENT..AL["SP Patterns/Plans"];
GREY..INDENT..AL["Trash Mobs"];
};
TheSunkenTemple = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
TheTempleofAhnQiraj = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["AQ Enchants"];
GREY..INDENT..AL["AQ40 Class Sets"];
GREY..INDENT..AL["AQ Opening Quest Chain"];
};
TrialOfTheCrusader = {
"";
GREY..INDENT..AL["Tribute Run"];
GREY..INDENT..AL["Trial of the Crusader Patterns/Plans"];
};
Uldaman = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
UlduarHallsofLightning = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
UlduarA = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Ulduar Formula/Patterns/Plans"];
GREY..INDENT..AL["Tier 7/8 Sets"];
};
UlduarB = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Ulduar Formula/Patterns/Plans"];
GREY..INDENT..AL["Tier 7/8 Sets"];
};
UlduarC = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Ulduar Formula/Patterns/Plans"];
GREY..INDENT..AL["Tier 7/8 Sets"];
};
UlduarD = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Ulduar Formula/Patterns/Plans"];
GREY..INDENT..AL["Tier 7/8 Sets"];
};
UlduarE = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Ulduar Formula/Patterns/Plans"];
GREY..INDENT..AL["Tier 7/8 Sets"];
};
UlduarHallsofStone = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
UtgardeKeep = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
UtgardePinnacle = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
VioletHold = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
WailingCaverns = {
"";
GREY..INDENT..AL["Set: Embrace of the Viper"];
};
ZulAman = {
"";
GREY..INDENT..AL["Timed Reward Chest"];
GREY..INDENT..AL["Trash Mobs"];
"";
};
ZulFarrak = {
"";
GREY..INDENT..AL["Trash Mobs"];
};
ZulGurub = {
"";
GREY..INDENT..AL["Trash Mobs"];
GREY..INDENT..AL["Random Boss Loot"];
GREY..INDENT..AL["ZG Class Sets"];
GREY..INDENT..AL["ZG Enchants"];
};
AlteracValleyNorth = {
"";
GREEN..AL["Misc. Rewards"];
GREEN..BabbleInventory["Armor"];
};
AlteracValleySouth = {
"";
GREEN..AL["Misc. Rewards"];
GREEN..BabbleInventory["Armor"];
};
ArathiBasin = {
"";
GREEN..AL["Misc. Rewards"];
GREEN..AL["Level 40-49 Rewards"];
GREEN..AL["Level 20-39 Rewards"];
"";
GREEN..AL["Arathi Basin Sets"];
};
WarsongGulch = {
"";
GREEN..AL["Misc. Rewards"];
GREEN..AL["Accessories"];
GREEN..AL["Weapons"];
GREEN..BabbleInventory["Armor"];
};
};
+374
View File
@@ -0,0 +1,374 @@
--[[
Atlasloot Enhanced
Author Daviesh
Loot browser associating loot with instance bosses
Can be integrated with Atlas (http://www.atlasmod.com)
Functions:
AtlasLoot:HideNoUsableItems()
AtlasLoot_FilterEnableButton()
<local> CreateCheckButton(parrent, text, num)
AtlasLoote_CreateFilterOptions()
]]
local BabbleInventory = AtlasLoot_GetLocaleLibBabble("LibBabble-Inventory-3.0")
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
local OptionsLoadet = false
AtlasLootFilterDB = {};
local FilterTableNames = {
["Armor"] = AL["Armor:"],
["WeaponsMeele"] = AL["Melee weapons:"],
["WeaponsMeeleTwoHand"] = BabbleInventory["Two-Hand"]..":",--.." "..AL["Melee weapons:"],
["WeaponsRanged"] = AL["Ranged weapons:"],
["Relics"] = AL["Relics:"],
["Other"] = AL["Other:"],
}
local FilterSort = {"Armor","WeaponsMeele","WeaponsMeeleTwoHand","WeaponsRanged","Relics","Other"}
local FilterTable = {
["Armor"] = {
"Cloth", --1
"Leather", --2
"Mail", --3
"Plate", --4
},
["WeaponsMeele"] = {
"Held in Off-Hand", --1
"Dagger", --2
"Mace", --3
"Staff", --4
"Axe", --5
"Polearm", --6
"Shield", --7
"Sword", --8
"Fist Weapon", --9
},
["WeaponsMeeleTwoHand"] = {
"Mace", --1
"Axe", --2
"Sword", --3
},
["WeaponsRanged"] = {
"Wand", --1
"Bow", --2
"Crossbow", --3
"Gun", --4
"Thrown", --5
},
["Relics"] = {
"Idol", --1
"Totem", --2
"Libram", --3
"Sigils", --4
},
["Other"] = {
"Ring", --1
"Trinket", --2
"Neck", --3
"Back", --4
}
}
local ClassHides = {
["DRUID"] = {["Armor"] = {true,true,false,false},["WeaponsMeele"] = {true,true,true,true,false,true,false,false,false},["WeaponsMeeleTwoHand"] = {true,false,false},["WeaponsRanged"] = {false,false,false,false,false},["Relics"] = {true,false,false,false},["Other"] = {true,true,true,true}},
["MAGE"] = {["Armor"] = {true,false,false,false},["WeaponsMeele"] = {true,true,false,true,false,false,false,true,false},["WeaponsMeeleTwoHand"] = {false,false,false},["WeaponsRanged"] = {true,false,false,false,false},["Relics"] = {false,false,false,false},["Other"] = {true,true,true,true}},
["PALADIN"] = {["Armor"] = {true,true,true,true},["WeaponsMeele"] = {true,false,true,false,true,true,true,true,false},["WeaponsMeeleTwoHand"] = {true,false,true},["WeaponsRanged"] = {false,false,false,false,false},["Relics"] = {false,false,true,false},["Other"] = {true,true,true,true}},
["PRIEST"] = {["Armor"] = {true,false,false,false},["WeaponsMeele"] = {true,true,true,true,false,false,false,false,false},["WeaponsMeeleTwoHand"] = {false,false,false},["WeaponsRanged"] = {true,false,false,false,false},["Relics"] = {false,false,false,false},["Other"] = {true,true,true,true}},
["ROGUE"] = {["Armor"] = {true,true,false,false},["WeaponsMeele"] = {true,true,true,false,true,false,false,true,true},["WeaponsMeeleTwoHand"] = {false,false,false},["WeaponsRanged"] = {false,true,true,true,true},["Relics"] = {false,false,false,false},["Other"] = {true,true,true,true}},
["HUNTER"] = {["Armor"] = {false,true,true,false},["WeaponsMeele"] = {false,true,false,true,true,true,false,true,true},["WeaponsMeeleTwoHand"] = {false,true,true},["WeaponsRanged"] = {false,true,true,true,false},["Relics"] = {false,false,false,false},["Other"] = {true,true,true,true}},
["SHAMAN"] = {["Armor"] = {true,true,true,false},["WeaponsMeele"] = {true,true,true,true,true,false,true,false,true},["WeaponsMeeleTwoHand"] = {true,true,false},["WeaponsRanged"] = {false,false,false,false,false},["Relics"] = {false,true,false,false},["Other"] = {true,true,true,true}},
["WARLOCK"] = {["Armor"] = {true,false,false,false},["WeaponsMeele"] = {true,true,false,true,false,false,false,true,false},["WeaponsMeeleTwoHand"] = {false,false,false},["WeaponsRanged"] = {true,false,false,false,false},["Relics"] = {false,false,false,false},["Other"] = {true,true,true,true}},
["WARRIOR"] = {["Armor"] = {true,true,true,true},["WeaponsMeele"] = {true,true,true,true,true,true,true,true,true},["WeaponsMeeleTwoHand"] = {true,true,true},["WeaponsRanged"] = {false,true,true,true,true},["Relics"] = {false,false,false,false},["Other"] = {true,true,true,true}},
["DEATHKNIGHT"] = {["Armor"] = {true,true,true,true},["WeaponsMeele"] = {true,false,true,false,true,true,false,true,false},["WeaponsMeeleTwoHand"] = {true,false,true},["WeaponsRanged"] = {false,false,false,false,false},["Relics"] = {false,false,false,true},["Other"] = {true,true,true,true}}
}
-- **********************************************************************
-- ItemFilter:
-- AtlasLoot:HideNoUsableItems()
-- AtlasLoot_FilterEnableButton()
-- **********************************************************************
AtlasLoot_Data["FilterList"] = { [1] = {}; };
function AtlasLoot_Testabc()
print(BabbleInventory["Two-Hand"])
end
function AtlasLoot:HideNoUsableItems()
local dataID, dataSource, tablenum = AtlasLootItemsFrame.refreshFilter[1], _G[AtlasLootItemsFrame.refreshFilter[2]], AtlasLootItemsFrame.refreshFilter[3];
local tablebase = dataSource[dataID][tablenum]
if not tablebase or dataID == "WishList" or dataID == "SearchResult" then return end
local itemCount = 0
local countAll = 1
local count = 0
local leatherworking = GetSpellInfo(2108)
AtlasLoot_Data["FilterList"] = { Type = dataSource[dataID].Type; Name = dataSource[dataID].Name; Back = dataSource[dataID].Back; Map = dataSource[dataID].Map; [tablenum] = {Name = dataSource[dataID][tablenum].Name}; };
for i=1,30 do
local info = _G["AtlasLootItem_"..i.."_Extra"]:GetText()
if _G["AtlasLootItem_"..i]:IsShown() then
local xgo = true
local countOld = count
itemCount = itemCount + 1
countAll = countAll + count
count = 0
local xitemID = _G["AtlasLootItem_"..i].itemID
local xspellitemID = _G["AtlasLootItem_"..i].spellitemID
local xitemTexture = tablebase[itemCount][3]
local xitemExtraText = AtlasLoot_FixText(tablebase[itemCount][5])
local xitemExtraTextSave = xitemExtraText
-- remove the "-"
xitemExtraText = gsub(xitemExtraText, "-", "")
local xitemNameText = _G["AtlasLootItem_"..i.."_Name"]:GetText()
if xitemExtraText and xitemExtraText ~= "" then
for k = 1,#FilterSort do
k = FilterSort[k]
if type(FilterTable[k]) == "table" then
for i,j in pairs(FilterTable[k]) do
local Slotname = ""
-- Bugfix with Sigils
if j == "Sigils" then
Slotname = AL["Sigil"]
else
Slotname = BabbleInventory[j]
end
if (k ~= "WeaponsMeeleTwoHand" and not strfind(xitemExtraText, BabbleInventory["Two-Hand"]) and strfind(xitemExtraText, Slotname) and AtlasLootFilterDB[k][j] == false) then
xgo = false
-- German fix
if j == "Shield" and not strfind(xitemExtraText, BabbleInventory["Held in Off-Hand"]) and not strfind(xitemExtraText, BabbleInventory["Off Hand"]) then
xgo = false
elseif j == "Shield" and strfind(xitemExtraText, BabbleInventory["Held in Off-Hand"]) and AtlasLootFilterDB["WeaponsMeele"]["Held in Off-Hand"] == true then
xgo = true
end
elseif k == "WeaponsMeeleTwoHand" and strfind(xitemExtraText, BabbleInventory["Two-Hand"]) and strfind(xitemExtraText, Slotname) and AtlasLootFilterDB[k][j] == false then
xgo = false
-- Fix bug with Leatherworking Patterns
elseif strfind(xitemExtraText, leatherworking) then
xgo = true
end
end
end
end
end
-- Sort the items
if xgo == true then
if i==16 and countOld > 0 then
AtlasLoot_Data["FilterList"][tablenum][16] = { 16, xitemID, xitemTexture, xitemNameText, xitemExtraTextSave}
countAll = 16
elseif i==16 and xitemExtraText and strfind(xitemExtraText, AL["Token"]) then
AtlasLoot_Data["FilterList"][tablenum][16] = { 16, xitemID, xitemTexture, xitemNameText, xitemExtraTextSave}
countAll = 16
elseif countAll < 16 and xitemNameText and strfind(xitemNameText, AL["Hard Mode"]) then
AtlasLoot_Data["FilterList"][tablenum][16] = { 16, xitemID, xitemTexture, xitemNameText, xitemExtraTextSave}
countAll = 16
elseif i==16 and xitemTexture == "INV_Box_01" then
AtlasLoot_Data["FilterList"][tablenum][16] = { 16, xitemID, xitemTexture, xitemNameText, xitemExtraTextSave}
countAll = 16
else
AtlasLoot_Data["FilterList"][tablenum][countAll] = { countAll, xitemID, xitemTexture, xitemNameText, xitemExtraTextSave}
end
if tablebase[itemCount][6] and countAll==16 then
AtlasLoot_Data["FilterList"][tablenum][16][6] = tablebase[itemCount][6]
elseif tablebase[itemCount][6] and countAll~=16 then
AtlasLoot_Data["FilterList"][tablenum][countAll][6] = tablebase[itemCount][6]
end
if tablebase[itemCount][7] and countAll==16 then
AtlasLoot_Data["FilterList"][tablenum][16][7] = tablebase[itemCount][7]
elseif tablebase[itemCount][7] and countAll~=16 then
AtlasLoot_Data["FilterList"][tablenum][countAll][7] = tablebase[itemCount][7]
end
if tablebase[itemCount][8] and countAll==16 then
AtlasLoot_Data["FilterList"][tablenum][16][8] = tablebase[itemCount][8]
elseif tablebase[itemCount][8] and countAll~=16 then
AtlasLoot_Data["FilterList"][tablenum][countAll][8] = tablebase[itemCount][8]
end
countAll = countAll + 1
count = 0
end
else
count = count + 1
end
end
AtlasLoot:ShowItemsFrame("FilterList", "AtlasLoot_Data", AtlasLootItemsFrame.refresh[3])
end
function AtlasLoot_FilterEnableButton()
if ATLASLOOT_FILTER_ENABLE == true then
ATLASLOOT_FILTER_ENABLE = false;
AtlasLoot:ShowItemsFrame(AtlasLootItemsFrame.refreshFilter[1], AtlasLootItemsFrame.refreshFilter[2], AtlasLootItemsFrame.refreshFilter[3]);
else
ATLASLOOT_FILTER_ENABLE = true
AtlasLoot:HideNoUsableItems();
end
end
-- **********************************************************************
-- Options:
-- AtlasLoot:HideNoUsableItems()
-- <local> CreateCheckButton(parrent, text, num)
-- AtlasLoote_CreateFilterOptions()
-- **********************************************************************
local ypos = -40
local xpos = 0
local linecount = 1
local lastframewidht,lastframeheight = 0,0
local function CreateCheckButton(parrent, text, num)
local framewidht = InterfaceOptionsFramePanelContainer:GetWidth()
local Check = CreateFrame("CheckButton", "AtlasLootOptionsCheck"..text..num, parrent, "OptionsCheckButtonTemplate")
Check:SetPoint("LEFT", parrent, "TOPLEFT", xpos, ypos)
Check:SetWidth(25)
Check:SetHeight(25)
Check:SetScript("OnShow", function()
_G[this:GetName().."Text"]:SetText(BabbleInventory[text]);
if AtlasLootFilterDB[num][text] then
this:SetChecked(1);
else
this:SetChecked(nil);
end
end)
Check:SetScript("OnClick", function()
if AtlasLootFilterDB[num][text] then
AtlasLootFilterDB[num][text] = false;
else
AtlasLootFilterDB[num][text] = true;
end
end)
if xpos == framewidht/2 then
xpos = 0
ypos = ypos - 20
linecount = 1
elseif xpos == 0 then
xpos = framewidht/2
linecount = 2
end
end
local function CreateCat(parrent, text)
if not AtlasLootFilterDB[text] then AtlasLootFilterDB[text] = {} end
if linecount == 2 then
ypos = ypos - 10
else
ypos = ypos + 10
end
local Text = parrent:CreateFontString("AtlasLoot"..text,"OVERLAY","GameFontNormal")
Text:SetPoint("TOPLEFT", parrent, "TOPLEFT", xpos, ypos)
Text:SetText(FilterTableNames[text]);
Text:SetHeight(20)
Text:SetTextColor(1.0, 1.0, 1.0, 1.0);
ypos = ypos - 30
for i,j in pairs(FilterTable[text]) do
if AtlasLootFilterDB[text][j] ~= true and AtlasLootFilterDB[text][j] ~= false then AtlasLootFilterDB[text][j] = true end
CreateCheckButton(parrent, j, text)
end
xpos = 0
ypos = ypos - 10
end
function AtlasLoot_CreateFilterOptions()
if OptionsLoadet then return end
local FilterOptionsFrame = CreateFrame("FRAME", nil)
FilterOptionsFrame.name = AL["Filter"];
FilterOptionsFrame.parent = AL["AtlasLoot"];
local framewidht = InterfaceOptionsFramePanelContainer:GetWidth()
local panel3 = CreateFrame("ScrollFrame", "AtlasLootFilterOptionsScrollFrame", FilterOptionsFrame, "UIPanelScrollFrameTemplate")
local scc = CreateFrame("Frame", "AtlasLootFilterOptionsScrollInhalt", panel3)
panel3:SetScrollChild(scc)
panel3:SetPoint("TOPLEFT", FilterOptionsFrame, "TOPLEFT", 10, -10)
scc:SetPoint("TOPLEFT", panel3, "TOPLEFT", 0, 0)
panel3:SetWidth(framewidht-45)
panel3:SetHeight(410)
scc:SetWidth(framewidht-45)
scc:SetHeight(410)
panel3:SetHorizontalScroll(-50)
panel3:SetVerticalScroll(50)
panel3:SetBackdrop({bgFile="Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile="", tile = false, tileSize = 0, edgeSize = 0, insets = { left = 0, right = 0, top = 0, bottom = 0 }})
panel3:SetScript("OnVerticalScroll", function() end)
panel3:EnableMouse(true)
panel3:SetVerticalScroll(0)
panel3:SetHorizontalScroll(0)
panel3:SetScript("OnUpdate", function()
local xframewidht = InterfaceOptionsFramePanelContainer:GetWidth()
local xframeheight = InterfaceOptionsFramePanelContainer:GetHeight()
if xframewidht ~= lastframewidht or xframeheight ~= lastframeheight then
panel3:SetWidth(xframewidht-45)
scc:SetWidth(xframewidht-45)
panel3:SetHeight(xframeheight-20)
scc:SetHeight(xframeheight-20)
end
end)
local FilterDisableButton = CreateFrame("BUTTON", nil, scc, "UIPanelButtonTemplate")
FilterDisableButton:SetHeight(20)
FilterDisableButton:SetWidth(150)
FilterDisableButton:SetPoint("TOPLEFT", scc, "TOPLEFT",0,-5)
FilterDisableButton:SetText(AL["Select All Loot"])
FilterDisableButton:SetWidth(FilterDisableButton:GetTextWidth()+20)
FilterDisableButton:SetScript("OnClick", function()
for k,v in pairs(FilterTable) do
if type(v) == "table" then
for i,j in pairs(FilterTable[k]) do
AtlasLootFilterDB[k][j] = true
end
end
end
scc:Hide()
scc:Show()
end)
local locClass,playerClass = UnitClass("player");
local ClassFilterLoadButton = CreateFrame("BUTTON", nil, scc, "UIPanelButtonTemplate")
ClassFilterLoadButton:SetHeight(20)
ClassFilterLoadButton:SetWidth(150)
ClassFilterLoadButton:SetPoint("TOPRIGHT", scc, "TOPRIGHT",0,-5)
ClassFilterLoadButton:SetText(AL["Apply Filter:"].." "..locClass)
ClassFilterLoadButton:SetWidth(ClassFilterLoadButton:GetTextWidth()+20)
ClassFilterLoadButton:SetScript("OnClick", function()
for k,v in pairs(FilterTable) do
if type(v) == "table" then
for i,j in pairs(FilterTable[k]) do
if ClassHides[playerClass][k][i] == false then
AtlasLootFilterDB[k][j] = false
else
AtlasLootFilterDB[k][j] = true
end
end
end
end
scc:Hide()
scc:Show()
end)
CreateCat(scc, "Armor")
CreateCat(scc, "WeaponsMeele")
CreateCat(scc, "WeaponsMeeleTwoHand")
CreateCat(scc, "WeaponsRanged")
CreateCat(scc, "Relics")
CreateCat(scc, "Other")
InterfaceOptions_AddCategory(FilterOptionsFrame)
OptionsLoadet = true
end
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+583
View File
@@ -0,0 +1,583 @@
ItemIDsDatabase[41520] = {350300, 41520, 350299, 350301, 350302, 350303, 350304, 350305, 350306, 350307, 350308, 350309, 350310, 350311, 579183, 579184, 579185, 579186, 579187, 579188, 579189, 579190, 579191, 579192, 987860, 987861, 987862, 987863, 987864, 987865, 987866, 987867, 987868, 987869, 987870, 987871, 987872, 987873, 987874, 987875, 987876, 987877, 987878, 987879};
ItemIDsDatabase[41521] = {350313, 41521, 350312, 350314, 350315, 350316, 350317, 350318, 350319, 350320, 350321, 350322, 350323, 350324, 579193, 579194, 579195, 579196, 579197, 579198, 579199, 579200, 579201, 579202, 987880, 987881, 987882, 987883, 987884, 987885, 987886, 987887, 987888, 987889, 987890, 987891, 987892, 987893, 987894, 987895, 987896, 987897, 987898, 987899};
ItemIDsDatabase[41522] = {350326, 41522, 350325, 350327, 350328, 350329, 350330, 350331, 350332, 350333, 350334, 350335, 350336, 350337, 579203, 579204, 579205, 579206, 579207, 579208, 579209, 579210, 579211, 579212, 987900, 987901, 987902, 987903, 987904, 987905, 987906, 987907, 987908, 987909, 987910, 987911, 987912, 987913, 987914, 987915, 987916, 987917, 987918, 987919};
ItemIDsDatabase[41523] = {6041523, 41523, 350338, 350339, 350340, 350341, 350342, 350343, 350344, 350345, 350346, 350347, 350348, 350349, 579213, 579214, 579215, 579216, 579217, 579218, 579219, 579220, 579221, 579222, 987920, 987921, 987922, 987923, 987924, 987925, 987926, 987927, 987928, 987929, 987930, 987931, 987932, 987933, 987934, 987935, 987936, 987937, 987938, 987939};
ItemIDsDatabase[41525] = {6041525, 41525, 350350, 350352, 350355, 350356, 350357, 350358, 350359, 350360, 350361, 350362, 350363, 350364, 579223, 579224, 579225, 579226, 579227, 579228, 579229, 579230, 579231, 579232, 987940, 987941, 987942, 987943, 987944, 987945, 987946, 987947, 987948, 987949, 987950, 987951, 987952, 987953, 987954, 987955, 987956, 987957, 987958, 987959};
ItemIDsDatabase[41528] = {6041528, 41528, 350365, 350366, 350367, 350368, 350369, 350370, 350371, 350372, 350373, 350374, 350375, 350376, 579233, 579234, 579235, 579236, 579237, 579238, 579239, 579240, 579241, 579242, 987960, 987961, 987962, 987963, 987964, 987965, 987966, 987967, 987968, 987969, 987970, 987971, 987972, 987973, 987974, 987975, 987976, 987977, 987978, 987979};
ItemIDsDatabase[41543] = {350378, 41543, 350377, 350379, 350380, 350381, 350382, 350383, 350384, 350385, 350386, 350387, 350388, 350389, 579243, 579244, 579245, 579246, 579247, 579248, 579249, 579250, 579251, 579252, 987980, 987981, 987982, 987983, 987984, 987985, 987986, 987987, 987988, 987989, 987990, 987991, 987992, 987993, 987994, 987995, 987996, 987997, 987998, 987999};
ItemIDsDatabase[41544] = {350391, 41544, 350390, 350392, 350393, 350394, 350395, 350396, 350397, 350398, 350399, 350400, 350401, 350402, 579253, 579254, 579255, 579256, 579257, 579258, 579259, 579260, 579261, 579262, 988000, 988001, 988002, 988003, 988004, 988005, 988006, 988007, 988008, 988009, 988010, 988011, 988012, 988013, 988014, 988015, 988016, 988017, 988018, 988019};
ItemIDsDatabase[41545] = {350404, 41545, 350403, 350405, 350406, 350407, 350408, 350409, 350410, 350411, 350412, 350416, 350417, 350418, 579263, 579264, 579265, 579266, 579267, 579268, 579269, 579270, 579271, 579272, 988024, 988025, 988026, 988027, 988028, 988029, 988030, 988031, 988032, 988033, 988034, 988035, 988036, 988037, 988038, 988039, 988040, 988041, 988042, 988043};
ItemIDsDatabase[41546] = {350420, 41546, 350419, 350421, 350422, 350423, 350424, 350430, 350431, 350432, 350433, 350434, 350435, 350436, 579273, 579274, 579275, 579276, 579277, 579278, 579279, 579280, 579281, 579282, 988044, 988045, 988046, 988047, 988048, 988049, 988050, 988051, 988052, 988053, 988054, 988055, 988056, 988057, 988058, 988059, 988060, 988061, 988062, 988063};
ItemIDsDatabase[41548] = {350438, 41548, 350437, 350439, 350440, 350441, 350442, 350443, 350444, 350445, 350446, 350447, 350448, 350449, 579283, 579284, 579285, 579286, 579287, 579288, 579289, 579290, 579291, 579292, 988064, 988065, 988066, 988067, 988068, 988069, 988070, 988071, 988072, 988073, 988074, 988075, 988076, 988077, 988078, 988079, 988080, 988081, 988082, 988083};
ItemIDsDatabase[41549] = {350451, 41549, 350450, 350452, 350453, 350454, 350455, 350456, 350457, 350458, 350459, 350460, 350461, 350462, 579293, 579294, 579295, 579296, 579297, 579298, 579299, 579300, 579301, 579302, 988084, 988085, 988086, 988087, 988088, 988089, 988090, 988091, 988092, 988093, 988094, 988095, 988096, 988097, 988098, 988099, 988100, 988101, 988102, 988103};
ItemIDsDatabase[41550] = {350464, 41550, 350463, 350465, 350466, 350467, 350468, 350469, 350470, 350471, 350472, 350473, 350474, 350475, 579303, 579304, 579305, 579306, 579307, 579308, 579309, 579310, 579311, 579312, 988104, 988105, 988106, 988107, 988108, 988109, 988110, 988111, 988112, 988113, 988114, 988115, 988116, 988117, 988118, 988119, 988120, 988121, 988122, 988123};
ItemIDsDatabase[41551] = {350477, 41551, 350476, 350478, 350479, 350480, 350481, 350482, 350483, 350484, 350485, 350486, 350487, 350488, 579313, 579314, 579315, 579316, 579317, 579318, 579319, 579320, 579321, 579322, 988124, 988125, 988126, 988127, 988128, 988129, 988130, 988131, 988132, 988133, 988134, 988135, 988136, 988137, 988138, 988139, 988140, 988141, 988142, 988143};
ItemIDsDatabase[41553] = {6041553, 41553, 350489, 350490, 350491, 350492, 350493, 350494, 350495, 350496, 350497, 350498, 350499, 350500, 579323, 579324, 579325, 579326, 579327, 579328, 579329, 579330, 579331, 579332, 988144, 988145, 988146, 988147, 988148, 988149, 988150, 988151, 988152, 988153, 988154, 988155, 988156, 988157, 988158, 988159, 988160, 988161, 988162, 988163};
ItemIDsDatabase[41554] = {6041554, 41554, 350501, 350502, 350503, 350504, 350505, 350506, 350507, 350508, 350509, 350510, 350511, 350512, 579333, 579334, 579335, 579336, 579337, 579338, 579339, 579340, 579341, 579342, 988164, 988165, 988166, 988167, 988168, 988169, 988170, 988171, 988172, 988173, 988174, 988175, 988176, 988177, 988178, 988179, 988180, 988181, 988182, 988183};
ItemIDsDatabase[41555] = {6041555, 41555, 350513, 350514, 350515, 350516, 350517, 350518, 350519, 350520, 350521, 350522, 350523, 350524, 579343, 579344, 579345, 579346, 579347, 579348, 579349, 579350, 579351, 579352, 988184, 988185, 988186, 988187, 988188, 988189, 988190, 988191, 988192, 988193, 988194, 988195, 988196, 988197, 988198, 988199, 988200, 988201, 988202, 988203};
ItemIDsDatabase[41587] = {6041587, 41587, 350525, 350526, 350527, 350528, 350529, 350530, 350531, 350532, 350533, 350534, 350535, 350536, 579353, 579354, 579355, 579356, 579357, 579358, 579359, 579360, 579361, 579362, 988204, 988205, 988206, 988207, 988208, 988209, 988210, 988211, 988212, 988213, 988214, 988215, 988216, 988217, 988218, 988219, 988220, 988221, 988222, 988223};
ItemIDsDatabase[41588] = {6041588, 41588, 350537, 350538, 350539, 350540, 350541, 350542, 350543, 350544, 350545, 350546, 350547, 350548, 579363, 579364, 579365, 579366, 579367, 579368, 579369, 579370, 579371, 579372, 988224, 988225, 988226, 988227, 988228, 988229, 988230, 988231, 988232, 988233, 988234, 988235, 988236, 988237, 988238, 988239, 988240, 988241, 988242, 988243};
ItemIDsDatabase[41589] = {6041589, 41589, 350549, 350550, 350551, 350552, 350553, 350554, 350555, 350556, 350557, 350558, 350559, 350560, 579373, 579374, 579375, 579376, 579377, 579378, 579379, 579380, 579381, 579382, 988244, 988245, 988246, 988247, 988248, 988249, 988250, 988251, 988252, 988253, 988254, 988255, 988256, 988257, 988258, 988259, 988260, 988261, 988262, 988263};
ItemIDsDatabase[41590] = {6041590, 41590, 350561, 350562, 350563, 350564, 350565, 350566, 350567, 350568, 350569, 350570, 350571, 350572, 579383, 579384, 579385, 579386, 579387, 579388, 579389, 579390, 579391, 579392, 988264, 988265, 988266, 988267, 988268, 988269, 988270, 988271, 988272, 988273, 988274, 988275, 988276, 988277, 988278, 988279, 988280, 988281, 988282, 988283};
ItemIDsDatabase[41607] = {6041607, 41607, 350597, 350598, 350599, 350600, 350601, 350602, 350603, 350604, 350605, 350606, 350607, 350608, 579413, 579414, 579415, 579416, 579417, 579418, 579419, 579420, 579421, 579422, 988324, 988325, 988326, 988327, 988328, 988329, 988330, 988331, 988332, 988333, 988334, 988335, 988336, 988337, 988338, 988339, 988340, 988341, 988342, 988343};
ItemIDsDatabase[41608] = {6041608, 41608, 350609, 350610, 350611, 350612, 350613, 350614, 350615, 350616, 350617, 350618, 350619, 350620, 579423, 579424, 579425, 579426, 579427, 579428, 579429, 579430, 579431, 579432, 988344, 988345, 988346, 988347, 988348, 988349, 988350, 988351, 988352, 988353, 988354, 988355, 988356, 988357, 988358, 988359, 988360, 988361, 988362, 988363};
ItemIDsDatabase[41755] = {6041755, 41755, 351465, 351467, 351468, 351470, 351472, 351473, 351474, 351476, 351478, 351479, 351480, 351481, 580073, 580074, 580075, 580076, 580077, 580078, 580079, 580080, 580081, 580082, 989647, 989648, 989649, 989650, 989651, 989652, 989653, 989654, 989655, 989656, 989657, 989658, 989659, 989660, 989661, 989662, 989663, 989664, 989665, 989666};
ItemIDsDatabase[41756] = {351484, 41756, 351482, 351486, 351487, 351489, 351491, 351492, 351494, 351496, 351497, 351499, 351501, 351502, 580083, 580084, 580085, 580086, 580087, 580088, 580089, 580090, 580091, 580092, 989667, 989668, 989669, 989670, 989671, 989672, 989673, 989674, 989675, 989676, 989677, 989678, 989679, 989680, 989681, 989682, 989683, 989684, 989685, 989686};
ItemIDsDatabase[41757] = {351505, 41757, 351503, 351507, 351508, 351509, 351511, 351513, 351514, 351515, 351516, 351517, 351518, 351519, 580093, 580094, 580095, 580096, 580097, 580098, 580099, 580100, 580101, 580102, 989687, 989688, 989689, 989690, 989691, 989692, 989693, 989694, 989695, 989696, 989697, 989698, 989699, 989700, 989701, 989702, 989703, 989704, 989705, 989706};
ItemIDsDatabase[41758] = {351521, 41758, 351520, 351522, 351523, 351524, 351525, 351526, 351527, 351528, 351529, 351530, 351531, 351532, 580103, 580104, 580105, 580106, 580107, 580108, 580109, 580110, 580111, 580112, 989707, 989708, 989709, 989710, 989711, 989712, 989713, 989714, 989715, 989716, 989717, 989718, 989719, 989720, 989721, 989722, 989723, 989724, 989725, 989726};
ItemIDsDatabase[41759] = {351534, 41759, 351533, 351535, 351536, 351538, 351540, 351541, 351543, 351545, 351546, 351547, 351548, 351549, 580113, 580114, 580115, 580116, 580117, 580118, 580119, 580120, 580121, 580122, 989727, 989728, 989729, 989730, 989731, 989732, 989733, 989734, 989735, 989736, 989737, 989738, 989739, 989740, 989741, 989742, 989743, 989744, 989745, 989746};
ItemIDsDatabase[41760] = {351551, 41760, 351550, 351552, 351553, 351554, 351555, 351556, 351557, 351558, 351559, 351560, 351561, 351562, 580123, 580124, 580125, 580126, 580127, 580128, 580129, 580130, 580131, 580132, 989747, 989748, 989749, 989750, 989751, 989752, 989753, 989754, 989755, 989756, 989757, 989758, 989759, 989760, 989761, 989762, 989763, 989764, 989765, 989766};
ItemIDsDatabase[41761] = {351564, 41761, 351563, 351565, 351566, 351567, 351568, 351569, 351570, 351571, 351572, 351573, 351574, 351575, 580133, 580134, 580135, 580136, 580137, 580138, 580139, 580140, 580141, 580142, 989767, 989768, 989769, 989770, 989771, 989772, 989773, 989774, 989775, 989776, 989777, 989778, 989779, 989780, 989781, 989782, 989783, 989784, 989785, 989786};
ItemIDsDatabase[41762] = {351577, 41762, 351576, 351578, 351579, 351580, 351581, 351582, 351583, 351584, 351585, 351586, 351587, 351588, 580143, 580144, 580145, 580146, 580147, 580148, 580149, 580150, 580151, 580152, 989787, 989788, 989789, 989790, 989791, 989792, 989793, 989794, 989795, 989796, 989797, 989798, 989799, 989800, 989801, 989802, 989803, 989804, 989805, 989806};
ItemIDsDatabase[41763] = {351590, 41763, 351589, 351591, 351592, 351593, 351594, 351595, 351596, 351597, 351598, 351599, 351600, 351601, 580153, 580154, 580155, 580156, 580157, 580158, 580159, 580160, 580161, 580162, 989807, 989808, 989809, 989810, 989811, 989812, 989813, 989814, 989815, 989816, 989817, 989818, 989819, 989820, 989821, 989822, 989823, 989824, 989825, 989826};
ItemIDsDatabase[41815] = {6041815, 41815, 351704, 351705, 351706, 351707, 351708, 351709, 351710, 351711, 351712, 351713, 351714, 351715, 580253, 580254, 580255, 580256, 580257, 580258, 580259, 580260, 580261, 580262, 990007, 990008, 990009, 990010, 990011, 990012, 990013, 990014, 990015, 990016, 990017, 990018, 990019, 990020, 990021, 990022, 990024, 990025, 990026, 990027};
ItemIDsDatabase[41816] = {6041816, 41816, 351716, 351717, 351718, 351719, 351720, 351721, 351722, 351723, 351724, 351725, 351726, 351727, 580263, 580264, 580265, 580266, 580267, 580268, 580269, 580270, 580271, 580272, 990028, 990029, 990030, 990031, 990032, 990033, 990034, 990035, 990036, 990037, 990038, 990039, 990040, 990041, 990042, 990043, 990044, 990045, 990046, 990047};
ItemIDsDatabase[41821] = {6041821, 41821, 351728, 351729, 351730, 351731, 351732, 351733, 351734, 351735, 351736, 351737, 351738, 351739, 580273, 580274, 580275, 580276, 580277, 580278, 580279, 580280, 580281, 580282, 990048, 990049, 990050, 990051, 990052, 990053, 990054, 990055, 990056, 990057, 990058, 990059, 990060, 990061, 990062, 990063, 990064, 990065, 990066, 990067};
ItemIDsDatabase[41822] = {6041822, 41822, 351740, 351741, 351742, 351743, 351744, 351745, 351746, 351747, 351748, 351749, 351750, 351751, 580283, 580284, 580285, 580286, 580287, 580288, 580289, 580290, 580291, 580292, 990068, 990069, 990070, 990071, 990072, 990073, 990074, 990075, 990076, 990077, 990078, 990079, 990080, 990081, 990082, 990083, 990084, 990085, 990086, 990087};
ItemIDsDatabase[41824] = {6041824, 41824, 351752, 351753, 351754, 351755, 351756, 351757, 351758, 351759, 351760, 351761, 351762, 351763, 580293, 580294, 580295, 580296, 580297, 580298, 580299, 580300, 580301, 580302, 990088, 990089, 990090, 990091, 990092, 990093, 990094, 990095, 990096, 990097, 990098, 990099, 990109, 990110, 990111, 990122, 990123, 990124, 990125, 990126};
ItemIDsDatabase[41825] = {6041825, 41825, 351764, 351765, 351766, 351767, 351768, 351769, 351770, 351771, 351772, 351773, 351774, 351775, 580303, 580304, 580305, 580306, 580307, 580308, 580309, 580310, 580311, 580312, 990127, 990128, 990129, 990130, 990131, 990132, 990133, 990134, 990135, 990136, 990137, 990138, 990139, 990140, 990141, 990142, 990143, 990144, 990145, 990146};
ItemIDsDatabase[41826] = {6041826, 41826, 351776, 351777, 351778, 351779, 351780, 351781, 351782, 351783, 351784, 351785, 351786, 351787, 580313, 580314, 580315, 580316, 580317, 580318, 580319, 580320, 580321, 580322, 990147, 990148, 990149, 990150, 990151, 990152, 990153, 990154, 990155, 990156, 990157, 990158, 990159, 990160, 990161, 990162, 990163, 990164, 990165, 990166};
ItemIDsDatabase[41829] = {6041829, 41829, 351812, 351813, 351814, 351815, 351816, 351817, 351818, 351819, 351820, 351821, 351822, 351823, 580343, 580344, 580345, 580346, 580347, 580348, 580349, 580350, 580351, 580352, 990207, 990208, 990209, 990210, 990211, 990212, 990213, 990214, 990215, 990216, 990217, 990218, 990219, 990220, 990221, 990222, 990223, 990224, 990225, 990226};
ItemIDsDatabase[41844] = {6041844, 41844, 351938, 351939, 351940, 351941, 351942, 351943, 351944, 351945, 351946, 351947, 351948, 351949, 580453, 580454, 580455, 580456, 580457, 580458, 580459, 580460, 580461, 580462, 990427, 990428, 990429, 990430, 990431, 990432, 990433, 990434, 990435, 990436, 990437, 990438, 990439, 990440, 990441, 990442, 990443, 990444, 990445, 990446};
ItemIDsDatabase[41845] = {6041845, 41845, 351950, 351951, 351952, 351953, 351954, 351955, 351956, 351957, 351958, 351959, 351960, 351961, 580463, 580464, 580465, 580466, 580467, 580468, 580469, 580470, 580471, 580472, 990447, 990448, 990449, 990450, 990451, 990452, 990453, 990454, 990455, 990456, 990457, 990458, 990459, 990460, 990461, 990462, 990463, 990464, 990465, 990466};
ItemIDsDatabase[41846] = {6041846, 41846, 351962, 351963, 351964, 351965, 351966, 351967, 351968, 351969, 351970, 351971, 351972, 351973, 580473, 580474, 580475, 580476, 580477, 580478, 580479, 580480, 580481, 580482, 990467, 990468, 990469, 990470, 990471, 990472, 990473, 990474, 990475, 990476, 990477, 990478, 990479, 990480, 990481, 990482, 990483, 990484, 990485, 990486};
ItemIDsDatabase[41890] = {6041890, 41890, 352371, 352372, 352373, 352374, 352375, 352376, 352377, 352378, 352379, 352380, 352381, 352382, 580823, 580824, 580825, 580826, 580827, 580828, 580829, 580830, 580831, 580832, 991177, 991178, 991179, 991180, 991181, 991182, 991183, 991184, 991185, 991186, 991187, 991188, 991189, 991190, 991191, 991192, 991193, 991194, 991195, 991196};
ItemIDsDatabase[41891] = {6041891, 41891, 352383, 352384, 352385, 352386, 352387, 352388, 352389, 352390, 352391, 352392, 352393, 352394, 580833, 580834, 580835, 580836, 580837, 580838, 580839, 580840, 580841, 580842, 991197, 991198, 991199, 991200, 991201, 991202, 991203, 991204, 991205, 991206, 991207, 991208, 991209, 991210, 991211, 991212, 991213, 991214, 991215, 991216};
ItemIDsDatabase[41905] = {6041905, 41905, 352533, 352534, 352535, 352536, 352537, 352538, 352539, 352540, 352541, 352542, 352543, 352544, 580963, 580964, 580965, 580966, 580967, 580968, 580969, 580970, 580971, 580972, 991457, 991458, 991459, 991460, 991461, 991462, 991463, 991464, 991465, 991466, 991467, 991468, 991469, 991470, 991471, 991472, 991473, 991474, 991475, 991476};
ItemIDsDatabase[41932] = {6041932, 41932, 352803, 352804, 352805, 352806, 352807, 352808, 352809, 352810, 352811, 352812, 352813, 352814, 581193, 581194, 581195, 581196, 581197, 581198, 581199, 581200, 581201, 581202, 991917, 991918, 991919, 991920, 991921, 991922, 991923, 991924, 991925, 991926, 991927, 991928, 991929, 991930, 991931, 991932, 991933, 991934, 991935, 991936};
ItemIDsDatabase[41974] = {353202, 41974, 353201, 353203, 353204, 353205, 353206, 353207, 353208, 353209, 353210, 353211, 353212, 353213, 581533, 581534, 581535, 581536, 581537, 581538, 581539, 581540, 581541, 581542, 992597, 992598, 992599, 992600, 992601, 992602, 992603, 992604, 992605, 992606, 992607, 992608, 992609, 992610, 992611, 992612, 992613, 992614, 992615, 992616};
ItemIDsDatabase[41975] = {353215, 41975, 353214, 353216, 353217, 353218, 353219, 353220, 353221, 353222, 353223, 353224, 353225, 353226, 581543, 581544, 581545, 581546, 581547, 581548, 581549, 581550, 581551, 581552, 992617, 992618, 992619, 992620, 992621, 992622, 992623, 992624, 992625, 992626, 992627, 992628, 992629, 992630, 992631, 992632, 992633, 992634, 992635, 992636};
ItemIDsDatabase[41984] = {6041984, 41984, 353227, 353228, 353229, 353230, 353231, 353232, 353233, 353234, 353235, 353236, 353237, 353238, 581553, 581554, 581555, 581556, 581557, 581558, 581559, 581560, 581561, 581562, 992637, 992638, 992639, 992640, 992641, 992642, 992643, 992644, 992645, 992646, 992647, 992648, 992649, 992650, 992651, 992652, 992653, 992654, 992655, 992656};
ItemIDsDatabase[41985] = {6041985, 41985, 353239, 353240, 353241, 353242, 353243, 353244, 353245, 353246, 353247, 353248, 353249, 353250, 581563, 581564, 581565, 581566, 581567, 581568, 581569, 581570, 581571, 581572, 992657, 992658, 992659, 992660, 992661, 992662, 992663, 992664, 992665, 992666, 992667, 992668, 992669, 992670, 992671, 992672, 992673, 992674, 992675, 992676};
ItemIDsDatabase[41986] = {6041986, 41986, 353251, 353252, 353253, 353254, 353255, 353256, 353257, 353258, 353259, 353260, 353261, 353262, 581573, 581574, 581575, 581576, 581577, 581578, 581579, 581580, 581581, 581582, 992677, 992678, 992679, 992680, 992681, 992682, 992683, 992684, 992685, 992686, 992687, 992688, 992689, 992690, 992691, 992692, 992693, 992694, 992695, 992696};
ItemIDsDatabase[41987] = {6041987, 41987, 353263, 353264, 353265, 353266, 353267, 353268, 353269, 353270, 353271, 353272, 353273, 353274, 581583, 581584, 581585, 581586, 581587, 581588, 581589, 581590, 581591, 581592, 992697, 992698, 992699, 992700, 992701, 992702, 992703, 992704, 992705, 992706, 992707, 992708, 992709, 992710, 992711, 992712, 992713, 992714, 992715, 992716};
ItemIDsDatabase[42093] = {6042093, 42093, 354284, 354285, 354286, 354287, 354288, 354289, 354290, 354291, 354292, 354293, 354294, 354295, 582463, 582464, 582465, 582466, 582467, 582468, 582469, 582470, 582471, 582472, 994463, 994464, 994465, 994466, 994467, 994468, 994469, 994470, 994471, 994472, 994473, 994474, 994475, 994476, 994477, 994478, 994479, 994480, 994481, 994482};
ItemIDsDatabase[42095] = {6042095, 42095, 354296, 354297, 354298, 354299, 354300, 354301, 354302, 354303, 354304, 354305, 354306, 354307, 582473, 582474, 582475, 582476, 582477, 582478, 582479, 582480, 582481, 582482, 994483, 994484, 994485, 994486, 994487, 994488, 994489, 994490, 994491, 994492, 994493, 994494, 994495, 994496, 994497, 994498, 994499, 994500, 994501, 994502};
ItemIDsDatabase[42096] = {6042096, 42096, 354308, 354309, 354310, 354311, 354312, 354313, 354314, 354315, 354316, 354317, 354318, 354319, 582483, 582484, 582485, 582486, 582487, 582488, 582489, 582490, 582491, 582492, 994503, 994504, 994505, 994506, 994507, 994508, 994509, 994510, 994511, 994512, 994513, 994514, 994515, 994516, 994517, 994518, 994519, 994520, 994521, 994522};
ItemIDsDatabase[42336] = {355722, 42336, 355721, 355723, 355724, 355725, 355726, 355727, 355728, 355729, 355730, 355731, 355732, 355733, 583663, 583664, 583665, 583666, 583667, 583668, 583669, 583670, 583671, 583672, 996864, 996865, 996866, 996867, 996868, 996869, 996870, 996871, 996872, 996873, 996874, 996875, 996876, 996877, 996878, 996879, 996880, 996881, 996882, 996883};
ItemIDsDatabase[42337] = {355735, 42337, 355734, 355736, 355737, 355738, 355739, 355740, 355741, 355742, 355743, 355744, 355745, 355746, 583673, 583674, 583675, 583676, 583677, 583678, 583679, 583680, 583681, 583682, 996884, 996885, 996886, 996887, 996888, 996889, 996890, 996891, 996892, 996893, 996894, 996895, 996896, 996897, 996898, 996899, 996900, 996901, 996902, 996903};
ItemIDsDatabase[42338] = {6042338, 42338, 355747, 355748, 355749, 355750, 355751, 355752, 355753, 355754, 355755, 355756, 355757, 355758, 583683, 583684, 583685, 583686, 583687, 583688, 583689, 583690, 583691, 583692, 996904, 996905, 996906, 996907, 996908, 996909, 996910, 996911, 996912, 996913, 996914, 996915, 996916, 996917, 996918, 996919, 996920, 996921, 996922, 996923};
ItemIDsDatabase[42339] = {6042339, 42339, 355759, 355760, 355761, 355762, 355763, 355764, 355765, 355766, 355767, 355768, 355769, 355770, 583693, 583694, 583695, 583696, 583697, 583698, 583699, 583700, 583701, 583702, 996924, 996925, 996926, 996927, 996928, 996929, 996930, 996931, 996932, 996933, 996934, 996935, 996936, 996937, 996938, 996939, 996940, 996941, 996942, 996943};
ItemIDsDatabase[42340] = {6042340, 42340, 355771, 355772, 355773, 355774, 355775, 355776, 355777, 355778, 355779, 355780, 355781, 355782, 583703, 583704, 583705, 583706, 583707, 583708, 583709, 583710, 583711, 583712, 996944, 996945, 996946, 996947, 996948, 996949, 996950, 996951, 996952, 996953, 996954, 996955, 996956, 996957, 996958, 996959, 996960, 996961, 996962, 996963};
ItemIDsDatabase[42443] = {6042443, 42443, 356143, 356144, 356145, 356146, 356147, 356148, 356149, 356150, 356151, 356152, 356153, 356154, 584013, 584014, 584015, 584016, 584017, 584018, 584019, 584020, 584021, 584022, 997564, 997565, 997566, 997567, 997568, 997569, 997570, 997571, 997572, 997573, 997574, 997575, 997576, 997577, 997578, 997579, 997580, 997581, 997582, 997583};
ItemIDsDatabase[42731] = {6042731, 42731, 358581, 358582, 358583, 358584, 358585, 358586, 358587, 358588, 358589, 358590, 358591, 358592, 586103, 586104, 586105, 586106, 586107, 586108, 586109, 586110, 586111, 586112, 1068707, 1068708, 1068709, 1068710, 1068711, 1068712, 1068713, 1068714, 1068715, 1068716, 1068717, 1068718, 1068719, 1068720, 1068721, 1068722, 1068723, 1068724, 1068725, 1068726};
ItemIDsDatabase[42755] = {6042755, 42755, 358593, 358594, 358595, 358596, 358597, 358598, 358599, 358600, 358601, 358602, 358603, 358604, 586113, 586114, 586115, 586116, 586117, 586118, 586119, 586120, 586121, 586122, 1068727, 1068728, 1068729, 1068730, 1068731, 1068732, 1068733, 1068734, 1068735, 1068736, 1068737, 1068738, 1068739, 1068740, 1068741, 1068742, 1068743, 1068744, 1068745, 1068746};
ItemIDsDatabase[42758] = {6042758, 42758, 358605, 358606, 358607, 358608, 358609, 358610, 358611, 358612, 358613, 358614, 358615, 358616, 586123, 586124, 586125, 586126, 586127, 586128, 586129, 586130, 586131, 586132, 1068747, 1068748, 1068749, 1068750, 1068751, 1068752, 1068753, 1068754, 1068755, 1068756, 1068757, 1068758, 1068759, 1068760, 1068761, 1068762, 1068763, 1068764, 1068765, 1068766};
ItemIDsDatabase[42760] = {6042760, 42760, 358617, 358618, 358619, 358620, 358621, 358622, 358623, 358624, 358625, 358626, 358627, 358628, 586133, 586134, 586135, 586136, 586137, 586138, 586139, 586140, 586141, 586142, 1068767, 1068768, 1068769, 1068770, 1068771, 1068772, 1068773, 1068774, 1068775, 1068776, 1068777, 1068778, 1068779, 1068780, 1068781, 1068782, 1068783, 1068784, 1068785, 1068786};
ItemIDsDatabase[42761] = {6042761, 42761, 358629, 358630, 358631, 358632, 358633, 358634, 358635, 358636, 358637, 358638, 358639, 358640, 586143, 586144, 586145, 586146, 586147, 586148, 586149, 586150, 586151, 586152, 1068787, 1068788, 1068789, 1068790, 1068791, 1068792, 1068793, 1068794, 1068795, 1068796, 1068797, 1068798, 1068799, 1068800, 1068801, 1068802, 1068803, 1068804, 1068805, 1068806};
ItemIDsDatabase[42762] = {6042762, 42762, 358641, 358642, 358643, 358644, 358645, 358646, 358647, 358648, 358649, 358650, 358651, 358652, 586153, 586154, 586155, 586156, 586157, 586158, 586159, 586160, 586161, 586162, 1068807, 1068808, 1068809, 1068810, 1068811, 1068812, 1068813, 1068814, 1068815, 1068816, 1068817, 1068818, 1068819, 1068820, 1068821, 1068822, 1068823, 1068824, 1068825, 1068826};
ItemIDsDatabase[42763] = {6042763, 42763, 358653, 358654, 358655, 358656, 358657, 358658, 358659, 358660, 358661, 358662, 358663, 358664, 586163, 586164, 586165, 586166, 586167, 586168, 586169, 586170, 586171, 586172, 1068827, 1068828, 1068829, 1068830, 1068831, 1068832, 1068833, 1068834, 1068835, 1068836, 1068837, 1068838, 1068839, 1068840, 1068841, 1068842, 1068843, 1068844, 1068845, 1068846};
ItemIDsDatabase[42765] = {6042765, 42765, 358665, 358666, 358667, 358668, 358669, 358670, 358671, 358672, 358673, 358674, 358675, 358676, 586173, 586174, 586175, 586176, 586177, 586178, 586179, 586180, 586181, 586182, 1068847, 1068848, 1068849, 1068850, 1068851, 1068852, 1068853, 1068854, 1068855, 1068856, 1068857, 1068858, 1068859, 1068860, 1068861, 1068862, 1068863, 1068864, 1068865, 1068866};
ItemIDsDatabase[42766] = {6042766, 42766, 358677, 358678, 358679, 358680, 358681, 358682, 358683, 358684, 358685, 358686, 358687, 358688, 586183, 586184, 586185, 586186, 586187, 586188, 586189, 586190, 586191, 586192, 1068867, 1068868, 1068869, 1068870, 1068871, 1068872, 1068873, 1068874, 1068875, 1068876, 1068877, 1068878, 1068879, 1068880, 1068881, 1068882, 1068883, 1068884, 1068885, 1068886};
ItemIDsDatabase[42767] = {6042767, 42767, 358689, 358690, 358691, 358692, 358693, 358694, 358695, 358696, 358697, 358698, 358699, 358700, 586193, 586194, 586195, 586196, 586197, 586198, 586199, 586200, 586201, 586202, 1068887, 1068888, 1068889, 1068890, 1068891, 1068892, 1068893, 1068894, 1068895, 1068896, 1068897, 1068898, 1068899, 1068900, 1068901, 1068902, 1068903, 1068904, 1068905, 1068906};
ItemIDsDatabase[42768] = {6042768, 42768, 358701, 358702, 358703, 358704, 358705, 358706, 358707, 358708, 358709, 358710, 358711, 358712, 586203, 586204, 586205, 586206, 586207, 586208, 586209, 586210, 586211, 586212, 1068907, 1068908, 1068909, 1068910, 1068911, 1068912, 1068913, 1068914, 1068915, 1068916, 1068917, 1068918, 1068919, 1068920, 1068921, 1068922, 1068923, 1068924, 1068925, 1068926};
ItemIDsDatabase[42785] = {358714, 42785, 358713, 358715, 358716, 358717, 358718, 358719, 358720, 358721, 358722, 358723, 358724, 358725, 586213, 586214, 586215, 586216, 586217, 586218, 586219, 586220, 586221, 586222, 1068927, 1068928, 1068929, 1068930, 1068931, 1068932, 1068933, 1068934, 1068935, 1068936, 1068937, 1068938, 1068939, 1068940, 1068941, 1068942, 1068943, 1068944, 1068945, 1068946};
ItemIDsDatabase[42786] = {358727, 42786, 358726, 358728, 358729, 358730, 358731, 358732, 358733, 358734, 358735, 358736, 358737, 358738, 586223, 586224, 586225, 586226, 586227, 586228, 586229, 586230, 586231, 586232, 1068947, 1068948, 1068949, 1068950, 1068951, 1068952, 1068953, 1068954, 1068955, 1068956, 1068957, 1068958, 1068959, 1068960, 1068961, 1068962, 1068963, 1068964, 1068965, 1068966};
ItemIDsDatabase[42787] = {358740, 42787, 358739, 358741, 358742, 358743, 358744, 358745, 358746, 358747, 358748, 358749, 358750, 358751, 586233, 586234, 586235, 586236, 586237, 586238, 586239, 586240, 586241, 586242, 1068967, 1068968, 1068969, 1068970, 1068971, 1068972, 1068973, 1068974, 1068975, 1068976, 1068977, 1068978, 1068979, 1068980, 1068981, 1068982, 1068983, 1068984, 1068985, 1068986};
ItemIDsDatabase[42788] = {358753, 42788, 358752, 358754, 358755, 358756, 358757, 358758, 358759, 358760, 358761, 358762, 358763, 358764, 586243, 586244, 586245, 586246, 586247, 586248, 586249, 586250, 586251, 586252, 1068987, 1068988, 1068989, 1068990, 1068991, 1068992, 1068993, 1068994, 1068995, 1068996, 1068997, 1068998, 1068999, 1069000, 1069001, 1069002, 1069003, 1069004, 1069005, 1069006};
ItemIDsDatabase[42789] = {358766, 42789, 358765, 358767, 358768, 358769, 358770, 358771, 358772, 358773, 358774, 358775, 358776, 358777, 586253, 586254, 586255, 586256, 586257, 586258, 586259, 586260, 586261, 586262, 1069007, 1069008, 1069009, 1069010, 1069011, 1069012, 1069013, 1069014, 1069015, 1069016, 1069017, 1069018, 1069019, 1069020, 1069021, 1069022, 1069023, 1069024, 1069025, 1069026};
ItemIDsDatabase[42790] = {358779, 42790, 358778, 358780, 358781, 358782, 358783, 358784, 358785, 358786, 358787, 358788, 358789, 358790, 586263, 586264, 586265, 586266, 586267, 586268, 586269, 586270, 586271, 586272, 1069027, 1069028, 1069029, 1069030, 1069031, 1069032, 1069033, 1069034, 1069035, 1069036, 1069037, 1069038, 1069039, 1069040, 1069041, 1069042, 1069043, 1069044, 1069045, 1069046};
ItemIDsDatabase[42791] = {358792, 42791, 358791, 358793, 358794, 358795, 358796, 358797, 358798, 358799, 358800, 358801, 358802, 358803, 586273, 586274, 586275, 586276, 586277, 586278, 586279, 586280, 586281, 586282, 1069047, 1069048, 1069049, 1069050, 1069051, 1069052, 1069053, 1069054, 1069055, 1069056, 1069057, 1069058, 1069059, 1069060, 1069061, 1069062, 1069063, 1069064, 1069065, 1069066};
ItemIDsDatabase[42792] = {358805, 42792, 358804, 358806, 358807, 358808, 358809, 358810, 358811, 358812, 358813, 358814, 358815, 358816, 586283, 586284, 586285, 586286, 586287, 586288, 586289, 586290, 586291, 586292, 1069067, 1069068, 1069069, 1069070, 1069071, 1069072, 1069073, 1069074, 1069075, 1069076, 1069077, 1069078, 1069079, 1069080, 1069081, 1069082, 1069083, 1069084, 1069085, 1069086};
ItemIDsDatabase[42793] = {358818, 42793, 358817, 358819, 358820, 358821, 358822, 358823, 358824, 358825, 358826, 358827, 358828, 358829, 586293, 586294, 586295, 586296, 586297, 586298, 586299, 586300, 586301, 586302, 1069087, 1069088, 1069089, 1069090, 1069091, 1069092, 1069093, 1069094, 1069095, 1069096, 1069097, 1069098, 1069099, 1069100, 1069101, 1069102, 1069103, 1069104, 1069105, 1069106};
ItemIDsDatabase[42794] = {358831, 42794, 358830, 358832, 358833, 358834, 358835, 358836, 358837, 358838, 358839, 358840, 358841, 358842, 586303, 586304, 586305, 586306, 586307, 586308, 586309, 586310, 586311, 586312, 1069107, 1069108, 1069109, 1069110, 1069111, 1069112, 1069113, 1069114, 1069115, 1069116, 1069117, 1069118, 1069119, 1069120, 1069121, 1069122, 1069123, 1069124, 1069125, 1069126};
ItemIDsDatabase[42795] = {358844, 42795, 358843, 358845, 358846, 358847, 358848, 358849, 358850, 358851, 358852, 358853, 358854, 358855, 586313, 586314, 586315, 586316, 586317, 586318, 586319, 586320, 586321, 586322, 1069127, 1069128, 1069129, 1069130, 1069131, 1069132, 1069133, 1069134, 1069135, 1069136, 1069137, 1069138, 1069139, 1069140, 1069141, 1069142, 1069143, 1069144, 1069145, 1069146};
ItemIDsDatabase[42796] = {358857, 42796, 358856, 358858, 358859, 358860, 358861, 358862, 358863, 358864, 358865, 358866, 358867, 358868, 586323, 586324, 586325, 586326, 586327, 586328, 586329, 586330, 586331, 586332, 1069147, 1069148, 1069149, 1069150, 1069151, 1069152, 1069153, 1069154, 1069155, 1069156, 1069157, 1069158, 1069159, 1069160, 1069161, 1069162, 1069163, 1069164, 1069165, 1069166};
ItemIDsDatabase[42798] = {358870, 42798, 358869, 358871, 358872, 358873, 358874, 358875, 358876, 358877, 358878, 358879, 358880, 358881, 586333, 586334, 586335, 586336, 586337, 586338, 586339, 586340, 586341, 586342, 1069167, 1069168, 1069169, 1069170, 1069171, 1069172, 1069173, 1069174, 1069175, 1069176, 1069177, 1069178, 1069179, 1069180, 1069181, 1069182, 1069183, 1069184, 1069185, 1069186};
ItemIDsDatabase[42799] = {358883, 42799, 358882, 358884, 358885, 358886, 358887, 358888, 358889, 358890, 358891, 358892, 358893, 358894, 586343, 586344, 586345, 586346, 586347, 586348, 586349, 586350, 586351, 586352, 1069187, 1069188, 1069189, 1069190, 1069191, 1069192, 1069193, 1069194, 1069195, 1069196, 1069197, 1069198, 1069199, 1069200, 1069201, 1069202, 1069203, 1069204, 1069205, 1069206};
ItemIDsDatabase[42800] = {358896, 42800, 358895, 358897, 358898, 358899, 358900, 358901, 358902, 358903, 358904, 358905, 358906, 358907, 586353, 586354, 586355, 586356, 586357, 586358, 586359, 586360, 586361, 586362, 1069207, 1069208, 1069209, 1069210, 1069211, 1069212, 1069213, 1069214, 1069215, 1069216, 1069217, 1069218, 1069219, 1069220, 1069221, 1069222, 1069223, 1069224, 1069225, 1069226};
ItemIDsDatabase[42801] = {358909, 42801, 358908, 358910, 358911, 358912, 358913, 358914, 358915, 358916, 358917, 358918, 358919, 358920, 586363, 586364, 586365, 586366, 586367, 586368, 586369, 586370, 586371, 586372, 1069227, 1069228, 1069229, 1069230, 1069231, 1069232, 1069233, 1069234, 1069235, 1069236, 1069237, 1069238, 1069239, 1069240, 1069241, 1069242, 1069243, 1069244, 1069245, 1069246};
ItemIDsDatabase[42802] = {358922, 42802, 358921, 358923, 358924, 358925, 358926, 358927, 358928, 358929, 358930, 358931, 358932, 358933, 586373, 586374, 586375, 586376, 586377, 586378, 586379, 586380, 586381, 586382, 1069247, 1069248, 1069249, 1069250, 1069251, 1069252, 1069253, 1069254, 1069255, 1069256, 1069257, 1069258, 1069259, 1069260, 1069261, 1069262, 1069263, 1069264, 1069265, 1069266};
ItemIDsDatabase[42803] = {358935, 42803, 358934, 358936, 358937, 358938, 358939, 358940, 358941, 358942, 358943, 358944, 358945, 358946, 586383, 586384, 586385, 586386, 586387, 586388, 586389, 586390, 586391, 586392, 1069267, 1069268, 1069269, 1069270, 1069271, 1069272, 1069273, 1069274, 1069275, 1069276, 1069277, 1069278, 1069279, 1069280, 1069281, 1069282, 1069283, 1069284, 1069285, 1069286};
ItemIDsDatabase[42804] = {358948, 42804, 358947, 358949, 358950, 358951, 358952, 358953, 358954, 358955, 358956, 358957, 358958, 358959, 586393, 586394, 586395, 586396, 586397, 586398, 586399, 586400, 586401, 586402, 1069287, 1069288, 1069289, 1069290, 1069291, 1069292, 1069293, 1069294, 1069295, 1069296, 1069297, 1069298, 1069299, 1069300, 1069301, 1069302, 1069303, 1069304, 1069305, 1069306};
ItemIDsDatabase[42805] = {358961, 42805, 358960, 358962, 358963, 358964, 358965, 358966, 358967, 358968, 358969, 358970, 358971, 358972, 586403, 586404, 586405, 586406, 586407, 586408, 586409, 586410, 586411, 586412, 1069307, 1069308, 1069309, 1069310, 1069311, 1069312, 1069313, 1069314, 1069315, 1069316, 1069317, 1069318, 1069319, 1069320, 1069321, 1069322, 1069323, 1069324, 1069325, 1069326};
ItemIDsDatabase[42806] = {358974, 42806, 358973, 358975, 358976, 358977, 358978, 358979, 358980, 358981, 358982, 358983, 358984, 358985, 586413, 586414, 586415, 586416, 586417, 586418, 586419, 586420, 586421, 586422, 1069327, 1069328, 1069329, 1069330, 1069331, 1069332, 1069333, 1069334, 1069335, 1069336, 1069337, 1069338, 1069339, 1069340, 1069341, 1069342, 1069343, 1069344, 1069345, 1069346};
ItemIDsDatabase[42807] = {358987, 42807, 358986, 358988, 358989, 358990, 358991, 358992, 358993, 358994, 358995, 358996, 358997, 358998, 586423, 586424, 586425, 586426, 586427, 586428, 586429, 586430, 586431, 586432, 1069347, 1069348, 1069349, 1069350, 1069351, 1069352, 1069353, 1069354, 1069355, 1069356, 1069357, 1069358, 1069359, 1069360, 1069361, 1069362, 1069363, 1069364, 1069365, 1069366};
ItemIDsDatabase[42808] = {359000, 42808, 358999, 359001, 359002, 359003, 359004, 359005, 359006, 359007, 359008, 359009, 359010, 359011, 586433, 586434, 586435, 586436, 586437, 586438, 586439, 586440, 586441, 586442, 1069367, 1069368, 1069369, 1069370, 1069371, 1069372, 1069373, 1069374, 1069375, 1069376, 1069377, 1069378, 1069379, 1069380, 1069381, 1069382, 1069383, 1069384, 1069385, 1069386};
ItemIDsDatabase[42809] = {359013, 42809, 359012, 359014, 359015, 359016, 359017, 359018, 359019, 359020, 359021, 359022, 359023, 359024, 586443, 586444, 586445, 586446, 586447, 586448, 586449, 586450, 586451, 586452, 1069387, 1069388, 1069389, 1069390, 1069391, 1069392, 1069393, 1069394, 1069395, 1069396, 1069397, 1069398, 1069399, 1069400, 1069401, 1069402, 1069403, 1069404, 1069405, 1069406};
ItemIDsDatabase[42810] = {359026, 42810, 359025, 359027, 359028, 359029, 359030, 359031, 359032, 359033, 359034, 359035, 359036, 359037, 586453, 586454, 586455, 586456, 586457, 586458, 586459, 586460, 586461, 586462, 1069407, 1069408, 1069409, 1069410, 1069411, 1069412, 1069413, 1069414, 1069415, 1069416, 1069417, 1069418, 1069419, 1069420, 1069421, 1069422, 1069423, 1069424, 1069425, 1069426};
ItemIDsDatabase[42811] = {359039, 42811, 359038, 359040, 359041, 359042, 359043, 359044, 359045, 359046, 359047, 359048, 359049, 359050, 586463, 586464, 586465, 586466, 586467, 586468, 586469, 586470, 586471, 586472, 1069427, 1069428, 1069429, 1069430, 1069431, 1069432, 1069433, 1069434, 1069435, 1069436, 1069437, 1069438, 1069439, 1069440, 1069441, 1069442, 1069443, 1069444, 1069445, 1069446};
ItemIDsDatabase[42812] = {359052, 42812, 359051, 359053, 359054, 359055, 359056, 359057, 359058, 359059, 359060, 359061, 359062, 359063, 586473, 586474, 586475, 586476, 586477, 586478, 586479, 586480, 586481, 586482, 1069447, 1069448, 1069449, 1069450, 1069451, 1069452, 1069453, 1069454, 1069455, 1069456, 1069457, 1069458, 1069459, 1069460, 1069461, 1069462, 1069463, 1069464, 1069465, 1069466};
ItemIDsDatabase[42813] = {359065, 42813, 359064, 359066, 359067, 359068, 359069, 359070, 359071, 359072, 359073, 359074, 359075, 359076, 586483, 586484, 586485, 586486, 586487, 586488, 586489, 586490, 586491, 586492, 1069467, 1069468, 1069469, 1069470, 1069471, 1069472, 1069473, 1069474, 1069475, 1069476, 1069477, 1069478, 1069479, 1069480, 1069481, 1069482, 1069483, 1069484, 1069485, 1069486};
ItemIDsDatabase[42814] = {359078, 42814, 359077, 359079, 359080, 359081, 359082, 359083, 359084, 359085, 359086, 359087, 359088, 359089, 586493, 586494, 586495, 586496, 586497, 586498, 586499, 586500, 586501, 586502, 1069487, 1069488, 1069489, 1069490, 1069491, 1069492, 1069493, 1069494, 1069495, 1069496, 1069497, 1069498, 1069499, 1069500, 1069501, 1069502, 1069503, 1069504, 1069505, 1069506};
ItemIDsDatabase[42815] = {359091, 42815, 359090, 359092, 359093, 359094, 359095, 359096, 359097, 359098, 359099, 359100, 359101, 359102, 586503, 586504, 586505, 586506, 586507, 586508, 586509, 586510, 586511, 586512, 1069507, 1069508, 1069509, 1069510, 1069511, 1069512, 1069513, 1069514, 1069515, 1069516, 1069517, 1069518, 1069519, 1069520, 1069521, 1069522, 1069523, 1069524, 1069525, 1069526};
ItemIDsDatabase[42816] = {359104, 42816, 359103, 359105, 359106, 359107, 359108, 359109, 359110, 359111, 359112, 359113, 359114, 359115, 586513, 586514, 586515, 586516, 586517, 586518, 586519, 586520, 586521, 586522, 1069527, 1069528, 1069529, 1069530, 1069531, 1069532, 1069533, 1069534, 1069535, 1069536, 1069537, 1069538, 1069539, 1069540, 1069541, 1069542, 1069543, 1069544, 1069545, 1069546};
ItemIDsDatabase[42817] = {359117, 42817, 359116, 359118, 359119, 359120, 359121, 359122, 359123, 359124, 359125, 359126, 359127, 359128, 586523, 586524, 586525, 586526, 586527, 586528, 586529, 586530, 586531, 586532, 1069547, 1069548, 1069549, 1069550, 1069551, 1069552, 1069553, 1069554, 1069555, 1069556, 1069557, 1069558, 1069559, 1069560, 1069561, 1069562, 1069563, 1069564, 1069565, 1069566};
ItemIDsDatabase[42818] = {359130, 42818, 359129, 359131, 359132, 359133, 359134, 359135, 359136, 359137, 359138, 359139, 359140, 359141, 586533, 586534, 586535, 586536, 586537, 586538, 586539, 586540, 586541, 586542, 1069567, 1069568, 1069569, 1069570, 1069571, 1069572, 1069573, 1069574, 1069575, 1069576, 1069577, 1069578, 1069579, 1069580, 1069581, 1069582, 1069583, 1069584, 1069585, 1069586};
ItemIDsDatabase[42819] = {359143, 42819, 359142, 359144, 359145, 359146, 359147, 359148, 359149, 359150, 359151, 359152, 359153, 359154, 586543, 586544, 586545, 586546, 586547, 586548, 586549, 586550, 586551, 586552, 1069587, 1069588, 1069589, 1069590, 1069591, 1069592, 1069593, 1069594, 1069595, 1069596, 1069597, 1069598, 1069599, 1069600, 1069601, 1069602, 1069603, 1069604, 1069605, 1069606};
ItemIDsDatabase[42820] = {359156, 42820, 359155, 359157, 359158, 359159, 359160, 359161, 359162, 359163, 359164, 359165, 359166, 359167, 586553, 586554, 586555, 586556, 586557, 586558, 586559, 586560, 586561, 586562, 1069607, 1069608, 1069609, 1069610, 1069611, 1069612, 1069613, 1069614, 1069615, 1069616, 1069617, 1069618, 1069619, 1069620, 1069621, 1069622, 1069623, 1069624, 1069625, 1069626};
ItemIDsDatabase[42821] = {359169, 42821, 359168, 359170, 359171, 359172, 359173, 359174, 359175, 359176, 359177, 359178, 359179, 359180, 586563, 586564, 586565, 586566, 586567, 586568, 586569, 586570, 586571, 586572, 1069627, 1069628, 1069629, 1069630, 1069631, 1069632, 1069633, 1069634, 1069635, 1069636, 1069637, 1069638, 1069639, 1069640, 1069641, 1069642, 1069643, 1069644, 1069645, 1069646};
ItemIDsDatabase[42822] = {359182, 42822, 359181, 359183, 359184, 359185, 359186, 359187, 359188, 359189, 359190, 359191, 359192, 359193, 586573, 586574, 586575, 586576, 586577, 586578, 586579, 586580, 586581, 586582, 1069647, 1069648, 1069649, 1069650, 1069651, 1069652, 1069653, 1069654, 1069655, 1069656, 1069657, 1069658, 1069659, 1069660, 1069661, 1069662, 1069663, 1069664, 1069665, 1069666};
ItemIDsDatabase[42823] = {359195, 42823, 359194, 359196, 359197, 359198, 359199, 359200, 359201, 359202, 359203, 359204, 359205, 359206, 586583, 586584, 586585, 586586, 586587, 586588, 586589, 586590, 586591, 586592, 1069667, 1069668, 1069669, 1069670, 1069671, 1069672, 1069673, 1069674, 1069675, 1069676, 1069677, 1069678, 1069679, 1069680, 1069681, 1069682, 1069683, 1069684, 1069685, 1069686};
ItemIDsDatabase[42824] = {359208, 42824, 359207, 359209, 359210, 359211, 359212, 359213, 359214, 359215, 359216, 359217, 359218, 359219, 586593, 586594, 586595, 586596, 586597, 586598, 586599, 586600, 586601, 586602, 1069687, 1069688, 1069689, 1069690, 1069691, 1069692, 1069693, 1069694, 1069695, 1069696, 1069697, 1069698, 1069699, 1069700, 1069701, 1069702, 1069703, 1069704, 1069705, 1069706};
ItemIDsDatabase[42825] = {359221, 42825, 359220, 359222, 359223, 359224, 359225, 359226, 359227, 359228, 359229, 359230, 359231, 359232, 586603, 586604, 586605, 586606, 586607, 586608, 586609, 586610, 586611, 586612, 1069707, 1069708, 1069709, 1069710, 1069711, 1069712, 1069713, 1069714, 1069715, 1069716, 1069717, 1069718, 1069719, 1069720, 1069721, 1069722, 1069723, 1069724, 1069725, 1069726};
ItemIDsDatabase[42826] = {359234, 42826, 359233, 359235, 359236, 359237, 359238, 359239, 359240, 359241, 359242, 359243, 359244, 359245, 586613, 586614, 586615, 586616, 586617, 586618, 586619, 586620, 586621, 586622, 1069727, 1069728, 1069729, 1069730, 1069731, 1069732, 1069733, 1069734, 1069735, 1069736, 1069737, 1069738, 1069739, 1069740, 1069741, 1069742, 1069743, 1069744, 1069745, 1069746};
ItemIDsDatabase[42827] = {359247, 42827, 359246, 359248, 359249, 359250, 359251, 359252, 359253, 359254, 359255, 359256, 359257, 359258, 586623, 586624, 586625, 586626, 586627, 586628, 586629, 586630, 586631, 586632, 1069747, 1069748, 1069749, 1069750, 1069751, 1069752, 1069753, 1069754, 1069755, 1069756, 1069757, 1069758, 1069759, 1069760, 1069761, 1069762, 1069763, 1069764, 1069765, 1069766};
ItemIDsDatabase[42828] = {359260, 42828, 359259, 359261, 359262, 359263, 359264, 359265, 359266, 359267, 359268, 359269, 359270, 359271, 586633, 586634, 586635, 586636, 586637, 586638, 586639, 586640, 586641, 586642, 1069767, 1069768, 1069769, 1069770, 1069771, 1069772, 1069773, 1069774, 1069775, 1069776, 1069777, 1069778, 1069779, 1069780, 1069781, 1069782, 1069783, 1069784, 1069785, 1069786};
ItemIDsDatabase[42829] = {359273, 42829, 359272, 359274, 359275, 359276, 359277, 359278, 359279, 359280, 359281, 359282, 359283, 359284, 586643, 586644, 586645, 586646, 586647, 586648, 586649, 586650, 586651, 586652, 1069787, 1069788, 1069789, 1069790, 1069791, 1069792, 1069793, 1069794, 1069795, 1069796, 1069797, 1069798, 1069799, 1069800, 1069801, 1069802, 1069803, 1069804, 1069805, 1069806};
ItemIDsDatabase[42830] = {359286, 42830, 359285, 359287, 359288, 359289, 359290, 359291, 359292, 359293, 359294, 359295, 359296, 359297, 586653, 586654, 586655, 586656, 586657, 586658, 586659, 586660, 586661, 586662, 1069807, 1069808, 1069809, 1069810, 1069811, 1069812, 1069813, 1069814, 1069815, 1069816, 1069817, 1069818, 1069819, 1069820, 1069821, 1069822, 1069823, 1069824, 1069825, 1069826};
ItemIDsDatabase[42831] = {359299, 42831, 359298, 359300, 359301, 359302, 359303, 359304, 359305, 359306, 359307, 359308, 359309, 359310, 586663, 586664, 586665, 586666, 586667, 586668, 586669, 586670, 586671, 586672, 1069827, 1069828, 1069829, 1069830, 1069831, 1069832, 1069833, 1069834, 1069835, 1069836, 1069837, 1069838, 1069839, 1069840, 1069841, 1069842, 1069843, 1069844, 1069845, 1069846};
ItemIDsDatabase[42832] = {359312, 42832, 359311, 359313, 359314, 359315, 359316, 359317, 359318, 359319, 359320, 359321, 359322, 359323, 586673, 586674, 586675, 586676, 586677, 586678, 586679, 586680, 586681, 586682, 1069847, 1069848, 1069849, 1069850, 1069851, 1069852, 1069853, 1069854, 1069855, 1069856, 1069857, 1069858, 1069859, 1069860, 1069861, 1069862, 1069863, 1069864, 1069865, 1069866};
ItemIDsDatabase[42833] = {359325, 42833, 359324, 359326, 359327, 359328, 359329, 359330, 359331, 359332, 359333, 359334, 359335, 359336, 586683, 586684, 586685, 586686, 586687, 586688, 586689, 586690, 586691, 586692, 1069867, 1069868, 1069869, 1069870, 1069871, 1069872, 1069873, 1069874, 1069875, 1069876, 1069877, 1069878, 1069879, 1069880, 1069881, 1069882, 1069883, 1069884, 1069885, 1069886};
ItemIDsDatabase[42834] = {359338, 42834, 359337, 359339, 359340, 359341, 359342, 359343, 359344, 359345, 359346, 359347, 359348, 359349, 586693, 586694, 586695, 586696, 586697, 586698, 586699, 586700, 586701, 586702, 1069887, 1069888, 1069889, 1069890, 1069891, 1069892, 1069893, 1069894, 1069895, 1069896, 1069897, 1069898, 1069899, 1069900, 1069901, 1069902, 1069903, 1069904, 1069905, 1069906};
ItemIDsDatabase[42835] = {359351, 42835, 359350, 359352, 359353, 359354, 359355, 359356, 359357, 359358, 359359, 359360, 359361, 359362, 586703, 586704, 586705, 586706, 586707, 586708, 586709, 586710, 586711, 586712, 1069907, 1069908, 1069909, 1069910, 1069911, 1069912, 1069913, 1069914, 1069915, 1069916, 1069917, 1069918, 1069919, 1069920, 1069921, 1069922, 1069923, 1069924, 1069925, 1069926};
ItemIDsDatabase[42836] = {359364, 42836, 359363, 359365, 359366, 359367, 359368, 359369, 359370, 359371, 359372, 359373, 359374, 359375, 586713, 586714, 586715, 586716, 586717, 586718, 586719, 586720, 586721, 586722, 1069927, 1069928, 1069929, 1069930, 1069931, 1069932, 1069933, 1069934, 1069935, 1069936, 1069937, 1069938, 1069939, 1069940, 1069941, 1069942, 1069943, 1069944, 1069945, 1069946};
ItemIDsDatabase[42841] = {359377, 42841, 359376, 359378, 359379, 359380, 359381, 359382, 359383, 359384, 359385, 359386, 359387, 359388, 586723, 586724, 586725, 586726, 586727, 586728, 586729, 586730, 586731, 586732, 1069947, 1069948, 1069949, 1069950, 1069951, 1069952, 1069953, 1069954, 1069955, 1069956, 1069957, 1069958, 1069959, 1069960, 1069961, 1069962, 1069963, 1069964, 1069965, 1069966};
ItemIDsDatabase[42842] = {359390, 42842, 359389, 359391, 359392, 359393, 359394, 359395, 359396, 359397, 359398, 359399, 359400, 359401, 586733, 586734, 586735, 586736, 586737, 586738, 586739, 586740, 586741, 586742, 1069967, 1069968, 1069969, 1069970, 1069971, 1069972, 1069973, 1069974, 1069975, 1069976, 1069977, 1069978, 1069979, 1069980, 1069981, 1069982, 1069983, 1069984, 1069985, 1069986};
ItemIDsDatabase[42843] = {359403, 42843, 359402, 359404, 359405, 359406, 359407, 359408, 359409, 359410, 359411, 359412, 359413, 359414, 586743, 586744, 586745, 586746, 586747, 586748, 586749, 586750, 586751, 586752, 1069987, 1069988, 1069989, 1069990, 1069991, 1069992, 1069993, 1069994, 1069995, 1069996, 1069997, 1069998, 1069999, 1070000, 1070001, 1070002, 1070003, 1070004, 1070005, 1070006};
ItemIDsDatabase[42844] = {6042844, 42844, 359415, 359416, 359417, 359418, 359419, 359420, 359421, 359422, 359423, 359424, 359425, 359426, 586753, 586754, 586755, 586756, 586757, 586758, 586759, 586760, 586761, 586762, 1070007, 1070008, 1070009, 1070010, 1070011, 1070012, 1070013, 1070014, 1070015, 1070016, 1070017, 1070018, 1070019, 1070020, 1070021, 1070022, 1070023, 1070024, 1070025, 1070026};
ItemIDsDatabase[42845] = {359428, 42845, 359427, 359429, 359430, 359431, 359432, 359433, 359434, 359435, 359436, 359437, 359438, 359439, 586763, 586764, 586765, 586766, 586767, 586768, 586769, 586770, 586771, 586772, 1070027, 1070028, 1070029, 1070030, 1070031, 1070032, 1070033, 1070034, 1070035, 1070036, 1070037, 1070038, 1070039, 1070040, 1070041, 1070042, 1070043, 1070044, 1070045, 1070046};
ItemIDsDatabase[42846] = {359441, 42846, 359440, 359442, 359443, 359444, 359445, 359446, 359447, 359448, 359449, 359450, 359451, 359452, 586773, 586774, 586775, 586776, 586777, 586778, 586779, 586780, 586781, 586782, 1070047, 1070048, 1070049, 1070050, 1070051, 1070052, 1070053, 1070054, 1070055, 1070056, 1070057, 1070058, 1070059, 1070060, 1070061, 1070062, 1070063, 1070064, 1070065, 1070066};
ItemIDsDatabase[42847] = {359454, 42847, 359453, 359455, 359456, 359457, 359458, 359459, 359460, 359461, 359462, 359463, 359464, 359465, 586783, 586784, 586785, 586786, 586787, 586788, 586789, 586790, 586791, 586792, 1070067, 1070068, 1070069, 1070070, 1070071, 1070072, 1070073, 1070074, 1070075, 1070076, 1070077, 1070078, 1070079, 1070080, 1070081, 1070082, 1070083, 1070084, 1070085, 1070086};
ItemIDsDatabase[42848] = {359467, 42848, 359466, 359468, 359469, 359470, 359471, 359472, 359473, 359474, 359475, 359476, 359477, 359478, 586793, 586794, 586795, 586796, 586797, 586798, 586799, 586800, 586801, 586802, 1070087, 1070088, 1070089, 1070090, 1070091, 1070092, 1070093, 1070094, 1070095, 1070096, 1070097, 1070098, 1070099, 1070100, 1070101, 1070102, 1070103, 1070104, 1070105, 1070106};
ItemIDsDatabase[42849] = {359480, 42849, 359479, 359481, 359482, 359483, 359484, 359485, 359486, 359487, 359488, 359489, 359490, 359491, 586803, 586804, 586805, 586806, 586807, 586808, 586809, 586810, 586811, 586812, 1070107, 1070108, 1070109, 1070110, 1070111, 1070112, 1070113, 1070114, 1070115, 1070116, 1070117, 1070118, 1070119, 1070120, 1070121, 1070122, 1070123, 1070124, 1070125, 1070126};
ItemIDsDatabase[42850] = {359493, 42850, 359492, 359494, 359495, 359496, 359497, 359498, 359499, 359500, 359501, 359502, 359503, 359504, 586813, 586814, 586815, 586816, 586817, 586818, 586819, 586820, 586821, 586822, 1070127, 1070128, 1070129, 1070130, 1070131, 1070132, 1070133, 1070134, 1070135, 1070136, 1070137, 1070138, 1070139, 1070140, 1070141, 1070142, 1070143, 1070144, 1070145, 1070146};
ItemIDsDatabase[42857] = {359554, 42857, 359553, 359555, 359556, 359557, 359558, 359559, 359560, 359561, 359562, 359563, 359564, 359565, 586863, 586864, 586865, 586866, 586867, 586868, 586869, 586870, 586871, 586872, 1070227, 1070228, 1070229, 1070230, 1070231, 1070232, 1070233, 1070234, 1070235, 1070236, 1070237, 1070238, 1070239, 1070240, 1070241, 1070242, 1070243, 1070244, 1070245, 1070246};
ItemIDsDatabase[42858] = {359567, 42858, 359566, 359568, 359569, 359570, 359571, 359572, 359573, 359574, 359575, 359576, 359577, 359578, 586873, 586874, 586875, 586876, 586877, 586878, 586879, 586880, 586881, 586882, 1070247, 1070248, 1070249, 1070250, 1070251, 1070252, 1070253, 1070254, 1070255, 1070256, 1070257, 1070258, 1070259, 1070260, 1070261, 1070262, 1070263, 1070264, 1070265, 1070266};
ItemIDsDatabase[42859] = {359580, 42859, 359579, 359581, 359582, 359583, 359584, 359585, 359586, 359587, 359588, 359589, 359590, 359591, 586883, 586884, 586885, 586886, 586887, 586888, 586889, 586890, 586891, 586892, 1070267, 1070268, 1070269, 1070270, 1070271, 1070272, 1070273, 1070274, 1070275, 1070276, 1070277, 1070278, 1070279, 1070280, 1070281, 1070282, 1070283, 1070284, 1070285, 1070286};
ItemIDsDatabase[42860] = {359593, 42860, 359592, 359594, 359595, 359596, 359597, 359598, 359599, 359600, 359601, 359602, 359603, 359604, 586893, 586894, 586895, 586896, 586897, 586898, 586899, 586900, 586901, 586902, 1070287, 1070288, 1070289, 1070290, 1070291, 1070292, 1070293, 1070294, 1070295, 1070296, 1070297, 1070298, 1070299, 1070300, 1070301, 1070302, 1070303, 1070304, 1070305, 1070306};
ItemIDsDatabase[42861] = {359606, 42861, 359605, 359607, 359608, 359609, 359610, 359611, 359612, 359613, 359614, 359615, 359616, 359617, 586903, 586904, 586905, 586906, 586907, 586908, 586909, 586910, 586911, 586912, 1070307, 1070308, 1070309, 1070310, 1070311, 1070312, 1070313, 1070314, 1070315, 1070316, 1070317, 1070318, 1070319, 1070320, 1070321, 1070322, 1070323, 1070324, 1070325, 1070326};
ItemIDsDatabase[42862] = {359619, 42862, 359618, 359620, 359621, 359622, 359623, 359624, 359625, 359626, 359627, 359628, 359629, 359630, 586913, 586914, 586915, 586916, 586917, 586918, 586919, 586920, 586921, 586922, 1070327, 1070328, 1070329, 1070330, 1070331, 1070332, 1070333, 1070334, 1070335, 1070336, 1070337, 1070338, 1070339, 1070340, 1070341, 1070342, 1070343, 1070344, 1070345, 1070346};
ItemIDsDatabase[42863] = {359632, 42863, 359631, 359633, 359634, 359635, 359636, 359637, 359638, 359639, 359640, 359641, 359642, 359643, 586923, 586924, 586925, 586926, 586927, 586928, 586929, 586930, 586931, 586932, 1070347, 1070348, 1070349, 1070350, 1070351, 1070352, 1070353, 1070354, 1070355, 1070356, 1070357, 1070358, 1070359, 1070360, 1070361, 1070362, 1070363, 1070364, 1070365, 1070366};
ItemIDsDatabase[42864] = {359645, 42864, 359644, 359646, 359647, 359648, 359649, 359650, 359651, 359652, 359653, 359654, 359655, 359656, 586933, 586934, 586935, 586936, 586937, 586938, 586939, 586940, 586941, 586942, 1070367, 1070368, 1070369, 1070370, 1070371, 1070372, 1070373, 1070374, 1070375, 1070376, 1070377, 1070378, 1070379, 1070380, 1070381, 1070382, 1070383, 1070384, 1070385, 1070386};
ItemIDsDatabase[42865] = {359658, 42865, 359657, 359659, 359660, 359661, 359662, 359663, 359664, 359665, 359666, 359667, 359668, 359669, 586943, 586944, 586945, 586946, 586947, 586948, 586949, 586950, 586951, 586952, 1070387, 1070388, 1070389, 1070390, 1070391, 1070392, 1070393, 1070394, 1070395, 1070396, 1070397, 1070398, 1070399, 1070400, 1070401, 1070402, 1070403, 1070404, 1070405, 1070406};
ItemIDsDatabase[42866] = {359671, 42866, 359670, 359672, 359673, 359674, 359675, 359676, 359677, 359678, 359679, 359680, 359681, 359682, 586953, 586954, 586955, 586956, 586957, 586958, 586959, 586960, 586961, 586962, 1070407, 1070408, 1070409, 1070410, 1070411, 1070412, 1070413, 1070414, 1070415, 1070416, 1070417, 1070418, 1070419, 1070420, 1070421, 1070422, 1070423, 1070424, 1070425, 1070426};
ItemIDsDatabase[42867] = {359684, 42867, 359683, 359685, 359686, 359687, 359688, 359689, 359690, 359691, 359692, 359693, 359694, 359695, 586963, 586964, 586965, 586966, 586967, 586968, 586969, 586970, 586971, 586972, 1070427, 1070428, 1070429, 1070430, 1070431, 1070432, 1070433, 1070434, 1070435, 1070436, 1070437, 1070438, 1070439, 1070440, 1070441, 1070442, 1070443, 1070444, 1070445, 1070446};
ItemIDsDatabase[42868] = {359697, 42868, 359696, 359698, 359699, 359700, 359701, 359702, 359703, 359704, 359705, 359706, 359707, 359708, 586973, 586974, 586975, 586976, 586977, 586978, 586979, 586980, 586981, 586982, 1070447, 1070448, 1070449, 1070450, 1070451, 1070452, 1070453, 1070454, 1070455, 1070456, 1070457, 1070458, 1070459, 1070460, 1070461, 1070462, 1070463, 1070464, 1070465, 1070466};
ItemIDsDatabase[42869] = {359710, 42869, 359709, 359711, 359712, 359713, 359714, 359715, 359716, 359717, 359718, 359719, 359720, 359721, 586983, 586984, 586985, 586986, 586987, 586988, 586989, 586990, 586991, 586992, 1070467, 1070468, 1070469, 1070470, 1070471, 1070472, 1070473, 1070474, 1070475, 1070476, 1070477, 1070478, 1070479, 1070480, 1070481, 1070482, 1070483, 1070484, 1070485, 1070486};
ItemIDsDatabase[42870] = {359723, 42870, 359722, 359724, 359725, 359726, 359727, 359728, 359729, 359730, 359731, 359732, 359733, 359734, 586993, 586994, 586995, 586996, 586997, 586998, 586999, 587000, 587001, 587002, 1070487, 1070488, 1070489, 1070490, 1070491, 1070492, 1070493, 1070494, 1070495, 1070496, 1070497, 1070498, 1070499, 1070500, 1070501, 1070502, 1070503, 1070504, 1070505, 1070506};
ItemIDsDatabase[42871] = {359736, 42871, 359735, 359737, 359738, 359739, 359740, 359741, 359742, 359743, 359744, 359745, 359746, 359747, 587003, 587004, 587005, 587006, 587007, 587008, 587009, 587010, 587011, 587012, 1070507, 1070508, 1070509, 1070510, 1070511, 1070512, 1070513, 1070514, 1070515, 1070516, 1070517, 1070518, 1070519, 1070520, 1070521, 1070522, 1070523, 1070524, 1070525, 1070526};
ItemIDsDatabase[42872] = {359749, 42872, 359748, 359750, 359751, 359752, 359753, 359754, 359755, 359756, 359757, 359758, 359759, 359760, 587013, 587014, 587015, 587016, 587017, 587018, 587019, 587020, 587021, 587022, 1070527, 1070528, 1070529, 1070530, 1070531, 1070532, 1070533, 1070534, 1070535, 1070536, 1070537, 1070538, 1070539, 1070540, 1070541, 1070542, 1070543, 1070544, 1070545, 1070546};
ItemIDsDatabase[42874] = {359762, 42874, 359761, 359763, 359764, 359765, 359766, 359767, 359768, 359769, 359770, 359771, 359772, 359773, 587023, 587024, 587025, 587026, 587027, 587028, 587029, 587030, 587031, 587032, 1070547, 1070548, 1070549, 1070550, 1070551, 1070552, 1070553, 1070554, 1070555, 1070556, 1070557, 1070558, 1070559, 1070560, 1070561, 1070562, 1070563, 1070564, 1070565, 1070566};
ItemIDsDatabase[42876] = {359788, 42876, 359787, 359789, 359790, 359791, 359792, 359793, 359794, 359795, 359796, 359797, 359798, 359799, 587043, 587044, 587045, 587046, 587047, 587048, 587049, 587050, 587051, 587052, 1070587, 1070588, 1070589, 1070590, 1070591, 1070592, 1070593, 1070594, 1070595, 1070596, 1070597, 1070598, 1070599, 1070600, 1070601, 1070602, 1070603, 1070604, 1070605, 1070606};
ItemIDsDatabase[42877] = {359801, 42877, 359800, 359802, 359803, 359804, 359805, 359806, 359807, 359808, 359809, 359810, 359811, 359812, 587053, 587054, 587055, 587056, 587057, 587058, 587059, 587060, 587061, 587062, 1070607, 1070608, 1070609, 1070610, 1070611, 1070612, 1070613, 1070614, 1070615, 1070616, 1070617, 1070618, 1070619, 1070620, 1070621, 1070622, 1070623, 1070624, 1070625, 1070626};
ItemIDsDatabase[42878] = {359814, 42878, 359813, 359815, 359816, 359817, 359818, 359819, 359820, 359821, 359822, 359823, 359824, 359825, 587063, 587064, 587065, 587066, 587067, 587068, 587069, 587070, 587071, 587072, 1070627, 1070628, 1070629, 1070630, 1070631, 1070632, 1070633, 1070634, 1070635, 1070636, 1070637, 1070638, 1070639, 1070640, 1070641, 1070642, 1070643, 1070644, 1070645, 1070646};
ItemIDsDatabase[42879] = {359827, 42879, 359826, 359828, 359829, 359830, 359831, 359832, 359833, 359834, 359835, 359836, 359837, 359838, 587073, 587074, 587075, 587076, 587077, 587078, 587079, 587080, 587081, 587082, 1070647, 1070648, 1070649, 1070650, 1070651, 1070652, 1070653, 1070654, 1070655, 1070656, 1070657, 1070658, 1070659, 1070660, 1070661, 1070662, 1070663, 1070664, 1070665, 1070666};
ItemIDsDatabase[42880] = {359840, 42880, 359839, 359841, 359842, 359843, 359844, 359845, 359846, 359847, 359848, 359849, 359850, 359851, 587083, 587084, 587085, 587086, 587087, 587088, 587089, 587090, 587091, 587092, 1070667, 1070668, 1070669, 1070670, 1070671, 1070672, 1070673, 1070674, 1070675, 1070676, 1070677, 1070678, 1070679, 1070680, 1070681, 1070682, 1070683, 1070684, 1070685, 1070686};
ItemIDsDatabase[42881] = {359853, 42881, 359852, 359854, 359855, 359856, 359857, 359858, 359859, 359860, 359861, 359862, 359863, 359864, 587093, 587094, 587095, 587096, 587097, 587098, 587099, 587100, 587101, 587102, 1070687, 1070688, 1070689, 1070690, 1070691, 1070692, 1070693, 1070694, 1070695, 1070696, 1070697, 1070698, 1070699, 1070700, 1070701, 1070702, 1070703, 1070704, 1070705, 1070706};
ItemIDsDatabase[42882] = {359866, 42882, 359865, 359867, 359868, 359869, 359870, 359871, 359872, 359874, 359875, 359876, 359877, 359878, 587103, 587104, 587105, 587106, 587107, 587108, 587109, 587110, 587111, 587112, 1070707, 1070708, 1070709, 1070710, 1070711, 1070712, 1070713, 1070714, 1070715, 1070716, 1070717, 1070718, 1070719, 1070720, 1070721, 1070722, 1070723, 1070724, 1070725, 1070726};
ItemIDsDatabase[42883] = {359880, 42883, 359879, 359881, 359882, 359884, 359885, 359886, 359887, 359888, 359889, 359890, 359891, 359892, 587113, 587114, 587115, 587116, 587117, 587118, 587119, 587120, 587121, 587122, 1070727, 1070728, 1070729, 1070730, 1070731, 1070732, 1070733, 1070734, 1070735, 1070736, 1070737, 1070738, 1070739, 1070740, 1070741, 1070742, 1070743, 1070744, 1070745, 1070746};
ItemIDsDatabase[42884] = {359894, 42884, 359893, 359895, 359896, 359897, 359898, 359899, 359900, 359901, 359902, 359903, 359904, 359905, 587123, 587124, 587125, 587126, 587127, 587128, 587129, 587130, 587131, 587132, 1070747, 1070748, 1070749, 1070750, 1070751, 1070752, 1070753, 1070754, 1070755, 1070756, 1070757, 1070758, 1070759, 1070760, 1070761, 1070762, 1070763, 1070764, 1070765, 1070766};
ItemIDsDatabase[42887] = {359933, 42887, 359932, 359934, 359935, 359936, 359937, 359938, 359939, 359940, 359941, 359942, 359943, 359944, 587153, 587154, 587155, 587156, 587157, 587158, 587159, 587160, 587161, 587162, 1070807, 1070808, 1070809, 1070810, 1070811, 1070812, 1070813, 1070814, 1070815, 1070816, 1070817, 1070818, 1070819, 1070820, 1070821, 1070822, 1070823, 1070824, 1070825, 1070826};
ItemIDsDatabase[42888] = {359946, 42888, 359945, 359947, 359948, 359949, 359950, 359951, 359952, 359953, 359954, 359955, 359956, 359957, 587163, 587164, 587165, 587166, 587167, 587168, 587169, 587170, 587171, 587172, 1070827, 1070828, 1070829, 1070830, 1070831, 1070832, 1070833, 1070834, 1070835, 1070836, 1070837, 1070838, 1070839, 1070840, 1070841, 1070842, 1070843, 1070844, 1070845, 1070846};
ItemIDsDatabase[42889] = {359959, 42889, 359958, 359960, 359961, 359962, 359963, 359964, 359965, 359966, 359967, 359968, 359969, 359970, 587173, 587174, 587175, 587176, 587177, 587178, 587179, 587180, 587181, 587182, 1070847, 1070848, 1070849, 1070850, 1070851, 1070852, 1070853, 1070854, 1070855, 1070856, 1070857, 1070858, 1070859, 1070860, 1070861, 1070862, 1070863, 1070864, 1070865, 1070866};
ItemIDsDatabase[42890] = {359972, 42890, 359971, 359973, 359974, 359975, 359976, 359977, 359978, 359979, 359980, 359981, 359982, 359983, 587183, 587184, 587185, 587186, 587187, 587188, 587189, 587190, 587191, 587192, 1070867, 1070868, 1070869, 1070870, 1070871, 1070872, 1070873, 1070874, 1070875, 1070876, 1070877, 1070878, 1070879, 1070880, 1070881, 1070882, 1070883, 1070884, 1070885, 1070886};
ItemIDsDatabase[42891] = {359985, 42891, 359984, 359986, 359987, 359988, 359989, 359990, 359991, 359992, 359993, 359994, 359995, 359996, 587193, 587194, 587195, 587196, 587197, 587198, 587199, 587200, 587201, 587202, 1070887, 1070888, 1070889, 1070890, 1070891, 1070892, 1070893, 1070894, 1070895, 1070896, 1070897, 1070898, 1070899, 1070900, 1070901, 1070902, 1070903, 1070904, 1070905, 1070906};
ItemIDsDatabase[42892] = {359998, 42892, 359997, 359999, 360000, 360001, 360002, 360003, 360004, 360005, 360006, 360007, 360008, 360009, 587203, 587204, 587205, 587206, 587207, 587208, 587209, 587210, 587211, 587212, 1070907, 1070908, 1070909, 1070910, 1070911, 1070912, 1070913, 1070914, 1070915, 1070916, 1070917, 1070918, 1070919, 1070920, 1070921, 1070922, 1070923, 1070924, 1070925, 1070926};
ItemIDsDatabase[42893] = {360011, 42893, 360010, 360012, 360013, 360014, 360015, 360016, 360017, 360018, 360019, 360020, 360021, 360022, 587213, 587214, 587215, 587216, 587217, 587218, 587219, 587220, 587221, 587222, 1070927, 1070928, 1070929, 1070930, 1070931, 1070932, 1070933, 1070934, 1070935, 1070936, 1070937, 1070938, 1070939, 1070940, 1070941, 1070942, 1070943, 1070944, 1070945, 1070946};
ItemIDsDatabase[42895] = {360024, 42895, 360023, 360025, 360026, 360027, 360028, 360029, 360030, 360031, 360032, 360033, 360034, 360035, 587223, 587224, 587225, 587226, 587227, 587228, 587229, 587230, 587231, 587232, 1070947, 1070948, 1070949, 1070950, 1070951, 1070952, 1070953, 1070954, 1070955, 1070956, 1070957, 1070958, 1070959, 1070960, 1070961, 1070962, 1070963, 1070964, 1070965, 1070966};
ItemIDsDatabase[42896] = {360037, 42896, 360036, 360038, 360039, 360040, 360041, 360042, 360043, 360044, 360045, 360046, 360047, 360048, 587233, 587234, 587235, 587236, 587237, 587238, 587239, 587240, 587241, 587242, 1070967, 1070968, 1070969, 1070970, 1070971, 1070972, 1070973, 1070974, 1070975, 1070976, 1070977, 1070978, 1070979, 1070980, 1070981, 1070982, 1070983, 1070984, 1070985, 1070986};
ItemIDsDatabase[43129] = {6043129, 43129, 360483, 360484, 360485, 360486, 360487, 360488, 360489, 360490, 360491, 360492, 360493, 360494, 587593, 587594, 587595, 587596, 587597, 587598, 587599, 587600, 587601, 587602, 1071687, 1071688, 1071689, 1071690, 1071691, 1071692, 1071693, 1071694, 1071695, 1071696, 1071697, 1071698, 1071699, 1071700, 1071701, 1071702, 1071703, 1071704, 1071705, 1071706};
ItemIDsDatabase[43130] = {6043130, 43130, 360495, 360496, 360497, 360498, 360499, 360500, 360501, 360502, 360503, 360504, 360505, 360506, 587603, 587604, 587605, 587606, 587607, 587608, 587609, 587610, 587611, 587612, 1071707, 1071708, 1071709, 1071710, 1071711, 1071712, 1071713, 1071714, 1071715, 1071716, 1071717, 1071718, 1071719, 1071720, 1071721, 1071722, 1071723, 1071724, 1071725, 1071726};
ItemIDsDatabase[43131] = {6043131, 43131, 360507, 360508, 360509, 360510, 360511, 360512, 360513, 360514, 360515, 360516, 360517, 360518, 587613, 587614, 587615, 587616, 587617, 587618, 587619, 587620, 587621, 587622, 1071727, 1071728, 1071729, 1071730, 1071731, 1071732, 1071733, 1071734, 1071735, 1071736, 1071737, 1071738, 1071739, 1071740, 1071741, 1071742, 1071743, 1071744, 1071745, 1071746};
ItemIDsDatabase[43132] = {6043132, 43132, 360519, 360520, 360521, 360522, 360523, 360524, 360525, 360526, 360527, 360528, 360529, 360530, 587623, 587624, 587625, 587626, 587627, 587628, 587629, 587630, 587631, 587632, 1071747, 1071748, 1071749, 1071750, 1071751, 1071752, 1071753, 1071754, 1071755, 1071756, 1071757, 1071758, 1071759, 1071760, 1071761, 1071762, 1071763, 1071764, 1071765, 1071766};
ItemIDsDatabase[43133] = {6043133, 43133, 360531, 360532, 360533, 360534, 360535, 360536, 360537, 360538, 360539, 360540, 360541, 360542, 587633, 587634, 587635, 587636, 587637, 587638, 587639, 587640, 587641, 587642, 1071767, 1071768, 1071769, 1071770, 1071771, 1071772, 1071773, 1071774, 1071775, 1071776, 1071777, 1071778, 1071779, 1071780, 1071781, 1071782, 1071783, 1071784, 1071785, 1071786};
ItemIDsDatabase[43160] = {6043160, 43160, 360543, 360544, 360545, 360546, 360547, 360548, 360549, 360550, 360551, 360552, 360553, 360554, 587643, 587644, 587645, 587646, 587647, 587648, 587649, 587650, 587651, 587652, 1071787, 1071788, 1071789, 1071790, 1071791, 1071792, 1071793, 1071794, 1071795, 1071796, 1071797, 1071798, 1071799, 1071800, 1071801, 1071802, 1071803, 1071804, 1071805, 1071806};
ItemIDsDatabase[43161] = {6043161, 43161, 360555, 360556, 360557, 360558, 360559, 360560, 360561, 360562, 360563, 360564, 360565, 360566, 587653, 587654, 587655, 587656, 587657, 587658, 587659, 587660, 587661, 587662, 1071807, 1071808, 1071809, 1071810, 1071811, 1071812, 1071813, 1071814, 1071815, 1071816, 1071817, 1071818, 1071819, 1071820, 1071821, 1071822, 1071823, 1071824, 1071825, 1071826};
ItemIDsDatabase[43162] = {6043162, 43162, 360567, 360568, 360569, 360570, 360571, 360572, 360573, 360574, 360575, 360576, 360577, 360578, 587663, 587664, 587665, 587666, 587667, 587668, 587669, 587670, 587671, 587672, 1071827, 1071828, 1071829, 1071830, 1071831, 1071832, 1071833, 1071834, 1071835, 1071836, 1071837, 1071838, 1071839, 1071840, 1071841, 1071842, 1071843, 1071844, 1071845, 1071846};
ItemIDsDatabase[43163] = {6043163, 43163, 360579, 360580, 360581, 360582, 360583, 360584, 360585, 360586, 360587, 360588, 360589, 360590, 587673, 587674, 587675, 587676, 587677, 587678, 587679, 587680, 587681, 587682, 1071847, 1071848, 1071849, 1071850, 1071851, 1071852, 1071853, 1071854, 1071855, 1071856, 1071857, 1071858, 1071859, 1071860, 1071861, 1071862, 1071863, 1071864, 1071865, 1071866};
ItemIDsDatabase[43164] = {6043164, 43164, 360591, 360592, 360593, 360594, 360595, 360596, 360597, 360598, 360599, 360600, 360601, 360602, 587683, 587684, 587685, 587686, 587687, 587688, 587689, 587690, 587691, 587692, 1071867, 1071868, 1071869, 1071870, 1071871, 1071872, 1071873, 1071874, 1071875, 1071876, 1071877, 1071878, 1071879, 1071880, 1071881, 1071882, 1071883, 1071884, 1071885, 1071886};
ItemIDsDatabase[43165] = {6043165, 43165, 360603, 360604, 360605, 360606, 360607, 360608, 360609, 360610, 360611, 360612, 360613, 360614, 587693, 587694, 587695, 587696, 587697, 587698, 587699, 587700, 587701, 587702, 1071887, 1071888, 1071889, 1071890, 1071891, 1071892, 1071893, 1071894, 1071895, 1071896, 1071897, 1071898, 1071899, 1071900, 1071901, 1071902, 1071903, 1071904, 1071905, 1071906};
ItemIDsDatabase[43167] = {6043167, 43167, 360615, 360616, 360617, 360618, 360619, 360620, 360621, 360622, 360623, 360624, 360625, 360626, 587703, 587704, 587705, 587706, 587707, 587708, 587709, 587710, 587711, 587712, 1071907, 1071908, 1071909, 1071910, 1071911, 1071912, 1071913, 1071914, 1071915, 1071916, 1071917, 1071918, 1071919, 1071920, 1071921, 1071922, 1071923, 1071924, 1071925, 1071926};
ItemIDsDatabase[43168] = {6043168, 43168, 360627, 360628, 360629, 360630, 360631, 360632, 360633, 360634, 360635, 360636, 360637, 360638, 587713, 587714, 587715, 587716, 587717, 587718, 587719, 587720, 587721, 587722, 1071927, 1071928, 1071929, 1071930, 1071931, 1071932, 1071933, 1071934, 1071935, 1071936, 1071937, 1071938, 1071939, 1071940, 1071941, 1071942, 1071943, 1071944, 1071945, 1071946};
ItemIDsDatabase[43171] = {6043171, 43171, 360639, 360640, 360641, 360642, 360643, 360644, 360645, 360646, 360647, 360648, 360649, 360650, 587723, 587724, 587725, 587726, 587727, 587728, 587729, 587730, 587731, 587732, 1071947, 1071948, 1071949, 1071950, 1071951, 1071952, 1071953, 1071954, 1071955, 1071956, 1071957, 1071958, 1071959, 1071960, 1071961, 1071962, 1071963, 1071964, 1071965, 1071966};
ItemIDsDatabase[43172] = {6043172, 43172, 360651, 360652, 360653, 360654, 360655, 360656, 360657, 360658, 360659, 360660, 360661, 360662, 587733, 587734, 587735, 587736, 587737, 587738, 587739, 587740, 587741, 587742, 1071967, 1071968, 1071969, 1071970, 1071971, 1071972, 1071973, 1071974, 1071975, 1071976, 1071977, 1071978, 1071979, 1071980, 1071981, 1071982, 1071983, 1071984, 1071985, 1071986};
ItemIDsDatabase[43173] = {6043173, 43173, 360663, 360664, 360665, 360666, 360667, 360668, 360669, 360670, 360671, 360672, 360673, 360674, 587743, 587744, 587745, 587746, 587747, 587748, 587749, 587750, 587751, 587752, 1071987, 1071988, 1071989, 1071990, 1071991, 1071992, 1071993, 1071994, 1071995, 1071996, 1071997, 1071998, 1071999, 1072000, 1072001, 1072002, 1072003, 1072004, 1072005, 1072006};
ItemIDsDatabase[43174] = {6043174, 43174, 360675, 360676, 360677, 360678, 360679, 360680, 360681, 360682, 360683, 360684, 360685, 360686, 587753, 587754, 587755, 587756, 587757, 587758, 587759, 587760, 587761, 587762, 1072007, 1072008, 1072009, 1072010, 1072011, 1072012, 1072013, 1072014, 1072015, 1072016, 1072017, 1072018, 1072019, 1072020, 1072021, 1072022, 1072023, 1072024, 1072025, 1072026};
ItemIDsDatabase[43176] = {6043176, 43176, 360687, 360688, 360689, 360690, 360691, 360692, 360693, 360694, 360695, 360696, 360697, 360698, 587763, 587764, 587765, 587766, 587767, 587768, 587769, 587770, 587771, 587772, 1072027, 1072028, 1072029, 1072030, 1072031, 1072032, 1072033, 1072034, 1072035, 1072036, 1072037, 1072038, 1072039, 1072040, 1072041, 1072042, 1072043, 1072044, 1072045, 1072046};
ItemIDsDatabase[43177] = {6043177, 43177, 360699, 360700, 360701, 360702, 360703, 360704, 360705, 360706, 360707, 360708, 360709, 360710, 587773, 587774, 587775, 587776, 587777, 587778, 587779, 587780, 587781, 587782, 1072047, 1072048, 1072049, 1072050, 1072051, 1072052, 1072053, 1072054, 1072055, 1072056, 1072057, 1072058, 1072059, 1072060, 1072061, 1072062, 1072063, 1072064, 1072065, 1072066};
ItemIDsDatabase[43178] = {6043178, 43178, 360711, 360712, 360713, 360714, 360715, 360716, 360717, 360718, 360719, 360720, 360721, 360722, 587783, 587784, 587785, 587786, 587787, 587788, 587789, 587790, 587791, 587792, 1072067, 1072068, 1072069, 1072070, 1072071, 1072072, 1072073, 1072074, 1072075, 1072076, 1072077, 1072078, 1072079, 1072080, 1072081, 1072082, 1072083, 1072084, 1072085, 1072086};
ItemIDsDatabase[43179] = {6043179, 43179, 360723, 360724, 360725, 360726, 360727, 360728, 360729, 360730, 360731, 360732, 360733, 360734, 587793, 587794, 587795, 587796, 587797, 587798, 587799, 587800, 587801, 587802, 1072087, 1072088, 1072089, 1072090, 1072091, 1072092, 1072093, 1072094, 1072095, 1072096, 1072097, 1072098, 1072099, 1072100, 1072101, 1072102, 1072103, 1072104, 1072105, 1072106};
ItemIDsDatabase[43180] = {6043180, 43180, 360735, 360736, 360737, 360738, 360739, 360740, 360741, 360742, 360743, 360744, 360745, 360746, 587803, 587804, 587805, 587806, 587807, 587808, 587809, 587810, 587811, 587812, 1072107, 1072108, 1072109, 1072110, 1072111, 1072112, 1072113, 1072114, 1072115, 1072116, 1072117, 1072118, 1072119, 1072120, 1072121, 1072122, 1072123, 1072124, 1072125, 1072126};
ItemIDsDatabase[43181] = {6043181, 43181, 360747, 360748, 360749, 360750, 360751, 360752, 360753, 360754, 360755, 360756, 360757, 360758, 587813, 587814, 587815, 587816, 587817, 587818, 587819, 587820, 587821, 587822, 1072127, 1072128, 1072129, 1072130, 1072131, 1072132, 1072133, 1072134, 1072135, 1072136, 1072137, 1072138, 1072139, 1072140, 1072141, 1072142, 1072143, 1072144, 1072145, 1072146};
ItemIDsDatabase[43182] = {6043182, 43182, 360759, 360760, 360761, 360762, 360763, 360764, 360765, 360766, 360767, 360768, 360769, 360770, 587823, 587824, 587825, 587826, 587827, 587828, 587829, 587830, 587831, 587832, 1072147, 1072148, 1072149, 1072150, 1072151, 1072152, 1072153, 1072154, 1072155, 1072156, 1072157, 1072158, 1072159, 1072160, 1072161, 1072162, 1072163, 1072164, 1072165, 1072166};
ItemIDsDatabase[43183] = {6043183, 43183, 360771, 360772, 360773, 360774, 360775, 360776, 360777, 360778, 360779, 360780, 360781, 360782, 587833, 587834, 587835, 587836, 587837, 587838, 587839, 587840, 587841, 587842, 1072167, 1072168, 1072169, 1072170, 1072171, 1072172, 1072173, 1072174, 1072175, 1072176, 1072177, 1072178, 1072179, 1072180, 1072181, 1072182, 1072183, 1072184, 1072185, 1072186};
ItemIDsDatabase[43184] = {6043184, 43184, 360783, 360784, 360785, 360786, 360787, 360788, 360789, 360790, 360791, 360792, 360793, 360794, 587843, 587844, 587845, 587846, 587847, 587848, 587849, 587850, 587851, 587852, 1072187, 1072188, 1072189, 1072190, 1072191, 1072192, 1072193, 1072194, 1072195, 1072196, 1072197, 1072198, 1072199, 1072200, 1072201, 1072202, 1072203, 1072204, 1072205, 1072206};
ItemIDsDatabase[43185] = {6043185, 43185, 360795, 360796, 360797, 360798, 360799, 360800, 360801, 360802, 360803, 360804, 360805, 360806, 587853, 587854, 587855, 587856, 587857, 587858, 587859, 587860, 587861, 587862, 1072207, 1072208, 1072209, 1072210, 1072211, 1072212, 1072213, 1072214, 1072215, 1072216, 1072217, 1072218, 1072219, 1072220, 1072221, 1072222, 1072223, 1072224, 1072225, 1072226};
ItemIDsDatabase[43186] = {6043186, 43186, 360807, 360808, 360809, 360810, 360811, 360812, 360813, 360814, 360815, 360816, 360817, 360818, 587863, 587864, 587865, 587866, 587867, 587868, 587869, 587870, 587871, 587872, 1072227, 1072228, 1072229, 1072230, 1072231, 1072232, 1072233, 1072234, 1072235, 1072236, 1072237, 1072238, 1072239, 1072240, 1072241, 1072242, 1072243, 1072244, 1072245, 1072246};
ItemIDsDatabase[43187] = {6043187, 43187, 360819, 360820, 360821, 360822, 360823, 360824, 360825, 360826, 360827, 360828, 360829, 360830, 587873, 587874, 587875, 587876, 587877, 587878, 587879, 587880, 587881, 587882, 1072247, 1072248, 1072249, 1072250, 1072251, 1072252, 1072253, 1072254, 1072255, 1072256, 1072257, 1072258, 1072259, 1072260, 1072261, 1072262, 1072263, 1072264, 1072265, 1072266};
ItemIDsDatabase[43188] = {6043188, 43188, 360831, 360832, 360833, 360834, 360835, 360836, 360837, 360838, 360839, 360840, 360841, 360842, 587883, 587884, 587885, 587886, 587887, 587888, 587889, 587890, 587891, 587892, 1072267, 1072268, 1072269, 1072270, 1072271, 1072272, 1072273, 1072274, 1072275, 1072276, 1072277, 1072278, 1072279, 1072280, 1072281, 1072282, 1072283, 1072284, 1072285, 1072286};
ItemIDsDatabase[43189] = {6043189, 43189, 360843, 360844, 360845, 360846, 360847, 360848, 360849, 360850, 360851, 360852, 360853, 360854, 587893, 587894, 587895, 587896, 587897, 587898, 587899, 587900, 587901, 587902, 1072287, 1072288, 1072289, 1072290, 1072291, 1072292, 1072293, 1072294, 1072295, 1072296, 1072297, 1072298, 1072299, 1072300, 1072301, 1072302, 1072303, 1072304, 1072305, 1072306};
ItemIDsDatabase[43190] = {6043190, 43190, 360855, 360856, 360857, 360858, 360859, 360860, 360861, 360862, 360863, 360864, 360865, 360866, 587903, 587904, 587905, 587906, 587907, 587908, 587909, 587910, 587911, 587912, 1072307, 1072308, 1072309, 1072310, 1072311, 1072312, 1072313, 1072314, 1072315, 1072316, 1072317, 1072318, 1072319, 1072320, 1072321, 1072322, 1072323, 1072324, 1072325, 1072326};
ItemIDsDatabase[43191] = {6043191, 43191, 360867, 360868, 360869, 360870, 360871, 360872, 360873, 360874, 360875, 360876, 360877, 360878, 587913, 587914, 587915, 587916, 587917, 587918, 587919, 587920, 587921, 587922, 1072327, 1072328, 1072329, 1072330, 1072331, 1072332, 1072333, 1072334, 1072335, 1072336, 1072337, 1072338, 1072339, 1072340, 1072341, 1072342, 1072343, 1072344, 1072345, 1072346};
ItemIDsDatabase[43192] = {6043192, 43192, 360879, 360880, 360881, 360882, 360883, 360884, 360885, 360886, 360887, 360888, 360889, 360890, 587923, 587924, 587925, 587926, 587927, 587928, 587929, 587930, 587931, 587932, 1072347, 1072348, 1072349, 1072350, 1072351, 1072352, 1072353, 1072354, 1072355, 1072356, 1072357, 1072358, 1072359, 1072360, 1072361, 1072362, 1072363, 1072364, 1072365, 1072366};
ItemIDsDatabase[43193] = {6043193, 43193, 360891, 360892, 360893, 360894, 360895, 360896, 360897, 360898, 360899, 360900, 360901, 360902, 587933, 587934, 587935, 587936, 587937, 587938, 587939, 587940, 587941, 587942, 1072367, 1072368, 1072369, 1072370, 1072371, 1072372, 1072373, 1072374, 1072375, 1072376, 1072377, 1072378, 1072379, 1072380, 1072381, 1072382, 1072383, 1072384, 1072385, 1072386};
ItemIDsDatabase[43194] = {6043194, 43194, 360903, 360904, 360905, 360906, 360907, 360908, 360909, 360910, 360911, 360912, 360913, 360914, 587943, 587944, 587945, 587946, 587947, 587948, 587949, 587950, 587951, 587952, 1072387, 1072388, 1072389, 1072390, 1072391, 1072392, 1072393, 1072394, 1072395, 1072396, 1072397, 1072398, 1072399, 1072400, 1072401, 1072402, 1072403, 1072404, 1072405, 1072406};
ItemIDsDatabase[43195] = {6043195, 43195, 360915, 360916, 360917, 360918, 360919, 360920, 360921, 360922, 360923, 360924, 360925, 360926, 587953, 587954, 587955, 587956, 587957, 587958, 587959, 587960, 587961, 587962, 1072407, 1072408, 1072409, 1072410, 1072411, 1072412, 1072413, 1072414, 1072415, 1072416, 1072417, 1072418, 1072419, 1072420, 1072421, 1072422, 1072423, 1072424, 1072425, 1072426};
ItemIDsDatabase[43197] = {6043197, 43197, 360927, 360928, 360929, 360930, 360931, 360932, 360933, 360934, 360935, 360936, 360937, 360938, 587963, 587964, 587965, 587966, 587967, 587968, 587969, 587970, 587971, 587972, 1072427, 1072428, 1072429, 1072430, 1072431, 1072432, 1072433, 1072434, 1072435, 1072436, 1072437, 1072438, 1072439, 1072440, 1072441, 1072442, 1072443, 1072444, 1072445, 1072446};
ItemIDsDatabase[43198] = {6043198, 43198, 360939, 360940, 360941, 360942, 360943, 360944, 360945, 360946, 360947, 360948, 360949, 360950, 587973, 587974, 587975, 587976, 587977, 587978, 587979, 587980, 587981, 587982, 1072447, 1072448, 1072449, 1072450, 1072451, 1072452, 1072453, 1072454, 1072455, 1072456, 1072457, 1072458, 1072459, 1072460, 1072461, 1072462, 1072463, 1072464, 1072465, 1072466};
ItemIDsDatabase[43200] = {6043200, 43200, 360951, 360952, 360953, 360954, 360955, 360956, 360957, 360958, 360959, 360960, 360961, 360962, 587983, 587984, 587985, 587986, 587987, 587988, 587989, 587990, 587991, 587992, 1072467, 1072468, 1072469, 1072470, 1072471, 1072472, 1072473, 1072474, 1072475, 1072476, 1072477, 1072478, 1072479, 1072480, 1072481, 1072482, 1072483, 1072484, 1072485, 1072486};
ItemIDsDatabase[43201] = {6043201, 43201, 360963, 360964, 360965, 360966, 360967, 360968, 360969, 360970, 360971, 360972, 360973, 360974, 587993, 587994, 587995, 587996, 587997, 587998, 587999, 588000, 588001, 588002, 1072487, 1072488, 1072489, 1072490, 1072491, 1072492, 1072493, 1072494, 1072495, 1072496, 1072497, 1072498, 1072499, 1072500, 1072501, 1072502, 1072503, 1072504, 1072505, 1072506};
ItemIDsDatabase[43202] = {6043202, 43202, 360975, 360976, 360977, 360978, 360979, 360980, 360981, 360982, 360983, 360984, 360985, 360986, 588003, 588004, 588005, 588006, 588007, 588008, 588009, 588010, 588011, 588012, 1072507, 1072508, 1072509, 1072510, 1072511, 1072512, 1072513, 1072514, 1072515, 1072516, 1072517, 1072518, 1072519, 1072520, 1072521, 1072522, 1072523, 1072524, 1072525, 1072526};
ItemIDsDatabase[43203] = {6043203, 43203, 360987, 360988, 360989, 360990, 360991, 360992, 360993, 360994, 360995, 360996, 360997, 360998, 588013, 588014, 588015, 588016, 588017, 588018, 588019, 588020, 588021, 588022, 1072527, 1072528, 1072529, 1072530, 1072531, 1072532, 1072533, 1072534, 1072535, 1072536, 1072537, 1072538, 1072539, 1072540, 1072541, 1072542, 1072543, 1072544, 1072545, 1072546};
ItemIDsDatabase[43204] = {361000, 43204, 360999, 361001, 361002, 361003, 361004, 361005, 361006, 361007, 361008, 361009, 361010, 361011, 588023, 588024, 588025, 588026, 588027, 588028, 588029, 588030, 588031, 588032, 1072547, 1072548, 1072549, 1072550, 1072551, 1072552, 1072553, 1072554, 1072555, 1072556, 1072557, 1072558, 1072559, 1072560, 1072561, 1072562, 1072563, 1072564, 1072565, 1072566};
ItemIDsDatabase[43207] = {6043207, 43207, 361012, 361013, 361014, 361015, 361016, 361017, 361018, 361019, 361020, 361021, 361022, 361023, 588033, 588034, 588035, 588036, 588037, 588038, 588039, 588040, 588041, 588042, 1072567, 1072568, 1072569, 1072570, 1072571, 1072572, 1072573, 1072574, 1072575, 1072576, 1072577, 1072578, 1072579, 1072580, 1072581, 1072582, 1072583, 1072584, 1072585, 1072586};
ItemIDsDatabase[43208] = {6043208, 43208, 361024, 361025, 361026, 361027, 361028, 361029, 361030, 361031, 361032, 361033, 361034, 361035, 588043, 588044, 588045, 588046, 588047, 588048, 588049, 588050, 588051, 588052, 1072587, 1072588, 1072589, 1072590, 1072591, 1072592, 1072593, 1072594, 1072595, 1072596, 1072597, 1072598, 1072599, 1072600, 1072601, 1072602, 1072603, 1072604, 1072605, 1072606};
ItemIDsDatabase[43209] = {6043209, 43209, 361036, 361037, 361038, 361039, 361040, 361041, 361042, 361043, 361044, 361045, 361046, 361047, 588053, 588054, 588055, 588056, 588057, 588058, 588059, 588060, 588061, 588062, 1072607, 1072608, 1072609, 1072610, 1072611, 1072612, 1072613, 1072614, 1072615, 1072616, 1072617, 1072618, 1072619, 1072620, 1072621, 1072622, 1072623, 1072624, 1072625, 1072626};
ItemIDsDatabase[43210] = {6043210, 43210, 361048, 361049, 361050, 361051, 361052, 361053, 361054, 361055, 361056, 361057, 361058, 361059, 588063, 588064, 588065, 588066, 588067, 588068, 588069, 588070, 588071, 588072, 1072627, 1072628, 1072629, 1072630, 1072631, 1072632, 1072633, 1072634, 1072635, 1072636, 1072637, 1072638, 1072639, 1072640, 1072641, 1072642, 1072643, 1072644, 1072645, 1072646};
ItemIDsDatabase[43211] = {6043211, 43211, 361060, 361061, 361062, 361063, 361064, 361065, 361066, 361067, 361068, 361069, 361070, 361071, 588073, 588074, 588075, 588076, 588077, 588078, 588079, 588080, 588081, 588082, 1072647, 1072648, 1072649, 1072650, 1072651, 1072652, 1072653, 1072654, 1072655, 1072656, 1072657, 1072658, 1072659, 1072660, 1072661, 1072662, 1072663, 1072664, 1072665, 1072666};
ItemIDsDatabase[43212] = {6043212, 43212, 361072, 361073, 361074, 361075, 361076, 361077, 361078, 361079, 361080, 361081, 361082, 361083, 588083, 588084, 588085, 588086, 588087, 588088, 588089, 588090, 588091, 588092, 1072667, 1072668, 1072669, 1072670, 1072671, 1072672, 1072673, 1072674, 1072675, 1072676, 1072677, 1072678, 1072679, 1072680, 1072681, 1072682, 1072683, 1072684, 1072685, 1072686};
ItemIDsDatabase[43213] = {6043213, 43213, 361084, 361085, 361086, 361087, 361088, 361089, 361090, 361091, 361092, 361093, 361094, 361095, 588093, 588094, 588095, 588096, 588097, 588098, 588099, 588100, 588101, 588102, 1072687, 1072688, 1072689, 1072690, 1072691, 1072692, 1072693, 1072694, 1072695, 1072696, 1072697, 1072698, 1072699, 1072700, 1072701, 1072702, 1072703, 1072704, 1072705, 1072706};
ItemIDsDatabase[43244] = {361097, 43244, 361096, 361098, 361099, 361100, 361101, 361102, 361103, 361104, 361105, 361106, 361107, 361108, 588103, 588104, 588105, 588106, 588107, 588108, 588109, 588110, 588111, 588112, 1072707, 1072708, 1072709, 1072710, 1072711, 1072712, 1072713, 1072714, 1072715, 1072716, 1072717, 1072718, 1072719, 1072720, 1072721, 1072722, 1072723, 1072724, 1072725, 1072726};
ItemIDsDatabase[43245] = {361110, 43245, 361109, 361111, 361112, 361113, 361114, 361115, 361116, 361117, 361118, 361119, 361120, 361121, 588113, 588114, 588115, 588116, 588117, 588118, 588119, 588120, 588121, 588122, 1072727, 1072728, 1072729, 1072730, 1072731, 1072732, 1072733, 1072734, 1072735, 1072736, 1072737, 1072738, 1072739, 1072740, 1072741, 1072742, 1072743, 1072744, 1072745, 1072746};
ItemIDsDatabase[43246] = {6043246, 43246, 361122, 361123, 361124, 361125, 361126, 361127, 361128, 361129, 361130, 361131, 361132, 361133, 588123, 588124, 588125, 588126, 588127, 588128, 588129, 588130, 588131, 588132, 1072747, 1072748, 1072749, 1072750, 1072751, 1072752, 1072753, 1072754, 1072755, 1072756, 1072757, 1072758, 1072759, 1072760, 1072761, 1072762, 1072763, 1072764, 1072765, 1072766};
ItemIDsDatabase[43247] = {6043247, 43247, 361134, 361135, 361136, 361137, 361138, 361139, 361140, 361141, 361142, 361143, 361144, 361145, 588133, 588134, 588135, 588136, 588137, 588138, 588139, 588140, 588141, 588142, 1072767, 1072768, 1072769, 1072770, 1072771, 1072772, 1072773, 1072774, 1072775, 1072776, 1072777, 1072778, 1072779, 1072780, 1072781, 1072782, 1072783, 1072784, 1072785, 1072786};
ItemIDsDatabase[43248] = {361147, 43248, 361146, 361148, 361149, 361150, 361151, 361152, 361153, 361154, 361155, 361156, 361157, 361158, 588143, 588144, 588145, 588146, 588147, 588148, 588149, 588150, 588151, 588152, 1072787, 1072788, 1072789, 1072790, 1072791, 1072792, 1072793, 1072794, 1072795, 1072796, 1072797, 1072798, 1072799, 1072800, 1072801, 1072802, 1072803, 1072804, 1072805, 1072806};
ItemIDsDatabase[43249] = {361160, 43249, 361159, 361161, 361162, 361163, 361164, 361165, 361166, 361167, 361168, 361169, 361170, 361171, 588153, 588154, 588155, 588156, 588157, 588158, 588159, 588160, 588161, 588162, 1072807, 1072808, 1072809, 1072810, 1072811, 1072812, 1072813, 1072814, 1072815, 1072816, 1072817, 1072818, 1072819, 1072820, 1072821, 1072822, 1072823, 1072824, 1072825, 1072826};
ItemIDsDatabase[43250] = {6043250, 43250, 361172, 361173, 361174, 361175, 361176, 361177, 361178, 361179, 361180, 361181, 361182, 361183, 588163, 588164, 588165, 588166, 588167, 588168, 588169, 588170, 588171, 588172, 1072827, 1072828, 1072829, 1072830, 1072831, 1072832, 1072833, 1072834, 1072835, 1072836, 1072837, 1072838, 1072839, 1072840, 1072841, 1072842, 1072843, 1072844, 1072845, 1072846};
ItemIDsDatabase[43251] = {6043251, 43251, 361184, 361185, 361186, 361187, 361188, 361189, 361190, 361191, 361192, 361193, 361194, 361195, 588173, 588174, 588175, 588176, 588177, 588178, 588179, 588180, 588181, 588182, 1072847, 1072848, 1072849, 1072850, 1072851, 1072852, 1072853, 1072854, 1072855, 1072856, 1072857, 1072858, 1072859, 1072860, 1072861, 1072862, 1072863, 1072864, 1072865, 1072866};
ItemIDsDatabase[43252] = {6043252, 43252, 361196, 361197, 361198, 361199, 361200, 361201, 361202, 361203, 361204, 361205, 361206, 361207, 588183, 588184, 588185, 588186, 588187, 588188, 588189, 588190, 588191, 588192, 1072867, 1072868, 1072869, 1072870, 1072871, 1072872, 1072873, 1072874, 1072875, 1072876, 1072877, 1072878, 1072879, 1072880, 1072881, 1072882, 1072883, 1072884, 1072885, 1072886};
ItemIDsDatabase[43253] = {6043253, 43253, 361208, 361209, 361210, 361211, 361212, 361213, 361214, 361215, 361216, 361217, 361218, 361219, 588193, 588194, 588195, 588196, 588197, 588198, 588199, 588200, 588201, 588202, 1072887, 1072888, 1072889, 1072890, 1072891, 1072892, 1072893, 1072894, 1072895, 1072896, 1072897, 1072898, 1072899, 1072900, 1072901, 1072902, 1072903, 1072904, 1072905, 1072906};
ItemIDsDatabase[43255] = {6043255, 43255, 361220, 361221, 361222, 361223, 361224, 361225, 361226, 361227, 361228, 361229, 361230, 361231, 588203, 588204, 588205, 588206, 588207, 588208, 588209, 588210, 588211, 588212, 1072907, 1072908, 1072909, 1072910, 1072911, 1072912, 1072913, 1072914, 1072915, 1072916, 1072917, 1072918, 1072919, 1072920, 1072921, 1072922, 1072923, 1072924, 1072925, 1072926};
ItemIDsDatabase[43256] = {6043256, 43256, 361232, 361233, 361234, 361235, 361236, 361237, 361238, 361239, 361240, 361241, 361242, 361243, 588213, 588214, 588215, 588216, 588217, 588218, 588219, 588220, 588221, 588222, 1072927, 1072928, 1072929, 1072930, 1072931, 1072932, 1072933, 1072934, 1072935, 1072936, 1072937, 1072938, 1072939, 1072940, 1072941, 1072942, 1072943, 1072944, 1072945, 1072946};
ItemIDsDatabase[43257] = {6043257, 43257, 361244, 361245, 361246, 361247, 361248, 361249, 361250, 361251, 361252, 361253, 361254, 361255, 588223, 588224, 588225, 588226, 588227, 588228, 588229, 588230, 588231, 588232, 1072947, 1072948, 1072949, 1072950, 1072951, 1072952, 1072953, 1072954, 1072955, 1072956, 1072957, 1072958, 1072959, 1072960, 1072961, 1072962, 1072963, 1072964, 1072965, 1072966};
ItemIDsDatabase[43258] = {6043258, 43258, 361256, 361257, 361258, 361259, 361260, 361261, 361262, 361263, 361264, 361265, 361266, 361267, 588233, 588234, 588235, 588236, 588237, 588238, 588239, 588240, 588241, 588242, 1072967, 1072968, 1072969, 1072970, 1072971, 1072972, 1072973, 1072974, 1072975, 1072976, 1072977, 1072978, 1072979, 1072980, 1072981, 1072982, 1072983, 1072984, 1072985, 1072986};
ItemIDsDatabase[43277] = {6043277, 43277, 361389, 361390, 361391, 361392, 361393, 361394, 361395, 361396, 361397, 361398, 361399, 361400, 588343, 588344, 588345, 588346, 588347, 588348, 588349, 588350, 588351, 588352, 1073187, 1073188, 1073189, 1073190, 1073191, 1073192, 1073193, 1073194, 1073195, 1073196, 1073197, 1073198, 1073199, 1073200, 1073201, 1073202, 1073203, 1073204, 1073205, 1073206};
ItemIDsDatabase[43278] = {6043278, 43278, 361401, 361402, 361403, 361404, 361405, 361406, 361407, 361408, 361409, 361410, 361411, 361412, 588353, 588354, 588355, 588356, 588357, 588358, 588359, 588360, 588361, 588362, 1073207, 1073208, 1073209, 1073210, 1073211, 1073212, 1073213, 1073214, 1073215, 1073216, 1073217, 1073218, 1073219, 1073220, 1073221, 1073222, 1073223, 1073224, 1073225, 1073226};
ItemIDsDatabase[43279] = {6043279, 43279, 361413, 361414, 361415, 361416, 361417, 361418, 361419, 361420, 361421, 361422, 361423, 361424, 588363, 588364, 588365, 588366, 588367, 588368, 588369, 588370, 588371, 588372, 1073227, 1073228, 1073229, 1073230, 1073231, 1073232, 1073233, 1073234, 1073235, 1073236, 1073237, 1073238, 1073239, 1073240, 1073241, 1073242, 1073243, 1073244, 1073245, 1073246};
ItemIDsDatabase[43305] = {6043305, 43305, 361521, 361522, 361523, 361524, 361525, 361526, 361527, 361528, 361529, 361530, 361531, 361532, 588453, 588454, 588455, 588456, 588457, 588458, 588459, 588460, 588461, 588462, 1073407, 1073408, 1073409, 1073410, 1073411, 1073412, 1073413, 1073414, 1073415, 1073416, 1073417, 1073418, 1073419, 1073420, 1073421, 1073422, 1073423, 1073424, 1073425, 1073426};
ItemIDsDatabase[43306] = {6043306, 43306, 361533, 361534, 361535, 361536, 361537, 361538, 361539, 361540, 361541, 361542, 361543, 361544, 588463, 588464, 588465, 588466, 588467, 588468, 588469, 588470, 588471, 588472, 1073427, 1073428, 1073429, 1073430, 1073431, 1073432, 1073433, 1073434, 1073435, 1073436, 1073437, 1073438, 1073439, 1073440, 1073441, 1073442, 1073443, 1073444, 1073445, 1073446};
ItemIDsDatabase[43309] = {6043309, 43309, 361545, 361546, 361547, 361548, 361549, 361550, 361551, 361552, 361553, 361554, 361555, 361556, 588473, 588474, 588475, 588476, 588477, 588478, 588479, 588480, 588481, 588482, 1073447, 1073448, 1073449, 1073450, 1073451, 1073452, 1073453, 1073454, 1073455, 1073456, 1073457, 1073458, 1073459, 1073460, 1073461, 1073462, 1073463, 1073464, 1073465, 1073466};
ItemIDsDatabase[43353] = {6043353, 43353, 361605, 361606, 361607, 361608, 361609, 361610, 361611, 361612, 361613, 361614, 361615, 361616, 588523, 588524, 588525, 588526, 588527, 588528, 588529, 588530, 588531, 588532, 1073547, 1073548, 1073549, 1073550, 1073551, 1073552, 1073553, 1073554, 1073555, 1073556, 1073557, 1073558, 1073559, 1073560, 1073561, 1073562, 1073563, 1073564, 1073565, 1073566};
ItemIDsDatabase[43358] = {6043358, 43358, 361617, 361618, 361619, 361620, 361621, 361622, 361623, 361624, 361625, 361626, 361627, 361628, 588533, 588534, 588535, 588536, 588537, 588538, 588539, 588540, 588541, 588542, 1073567, 1073568, 1073569, 1073570, 1073571, 1073572, 1073573, 1073574, 1073575, 1073576, 1073577, 1073578, 1073579, 1073580, 1073581, 1073582, 1073583, 1073584, 1073585, 1073586};
ItemIDsDatabase[43363] = {6043363, 43363, 361629, 361630, 361631, 361632, 361633, 361634, 361635, 361636, 361637, 361638, 361639, 361640, 588543, 588544, 588545, 588546, 588547, 588548, 588549, 588550, 588551, 588552, 1073587, 1073588, 1073589, 1073590, 1073591, 1073592, 1073593, 1073594, 1073595, 1073596, 1073597, 1073598, 1073599, 1073600, 1073601, 1073602, 1073603, 1073604, 1073605, 1073606};
ItemIDsDatabase[43375] = {6043375, 43375, 361641, 361642, 361643, 361644, 361645, 361646, 361647, 361648, 361649, 361650, 361651, 361652, 588553, 588554, 588555, 588556, 588557, 588558, 588559, 588560, 588561, 588562, 1073607, 1073608, 1073609, 1073610, 1073611, 1073612, 1073613, 1073614, 1073615, 1073616, 1073617, 1073618, 1073619, 1073620, 1073621, 1073622, 1073623, 1073624, 1073625, 1073626};
ItemIDsDatabase[43382] = {6043382, 43382, 361653, 361654, 361655, 361656, 361657, 361658, 361659, 361660, 361661, 361662, 361663, 361664, 588563, 588564, 588565, 588566, 588567, 588568, 588569, 588570, 588571, 588572, 1073627, 1073628, 1073629, 1073630, 1073631, 1073632, 1073633, 1073634, 1073635, 1073636, 1073637, 1073638, 1073639, 1073640, 1073641, 1073642, 1073643, 1073644, 1073645, 1073646};
ItemIDsDatabase[43387] = {6043387, 43387, 361665, 361666, 361667, 361668, 361669, 361670, 361671, 361672, 361673, 361674, 361675, 361676, 588573, 588574, 588575, 588576, 588577, 588578, 588579, 588580, 588581, 588582, 1073647, 1073648, 1073649, 1073650, 1073651, 1073652, 1073653, 1073654, 1073655, 1073656, 1073657, 1073658, 1073659, 1073660, 1073661, 1073662, 1073663, 1073664, 1073665, 1073666};
ItemIDsDatabase[43828] = {363771, 43828, 363770, 363772, 363773, 363774, 363775, 363776, 363777, 363778, 363779, 363780, 363781, 363782, 590333, 590334, 590335, 590336, 590337, 590338, 590339, 590340, 590341, 590342, 1077167, 1077168, 1077169, 1077170, 1077171, 1077172, 1077173, 1077174, 1077175, 1077176, 1077177, 1077178, 1077179, 1077180, 1077181, 1077182, 1077183, 1077184, 1077185, 1077186};
ItemIDsDatabase[43829] = {363784, 43829, 363783, 363785, 363786, 363787, 363788, 363789, 363790, 363791, 363792, 363793, 363794, 363795, 590343, 590344, 590345, 590346, 590347, 590348, 590349, 590350, 590351, 590352, 1077187, 1077188, 1077189, 1077190, 1077191, 1077192, 1077193, 1077194, 1077195, 1077196, 1077197, 1077198, 1077199, 1077200, 1077201, 1077202, 1077203, 1077204, 1077205, 1077206};
ItemIDsDatabase[43830] = {363797, 43830, 363796, 363798, 363799, 363800, 363801, 363802, 363803, 363804, 363805, 363806, 363807, 363808, 590353, 590354, 590355, 590356, 590357, 590358, 590359, 590360, 590361, 590362, 1077207, 1077208, 1077209, 1077210, 1077211, 1077212, 1077213, 1077214, 1077215, 1077216, 1077217, 1077218, 1077219, 1077220, 1077221, 1077222, 1077223, 1077224, 1077225, 1077226};
ItemIDsDatabase[43831] = {363810, 43831, 363809, 363811, 363812, 363813, 363814, 363815, 363816, 363817, 363818, 363819, 363820, 363821, 590363, 590364, 590365, 590366, 590367, 590368, 590369, 590370, 590371, 590372, 1077227, 1077228, 1077229, 1077230, 1077231, 1077232, 1077233, 1077234, 1077235, 1077236, 1077237, 1077238, 1077239, 1077240, 1077241, 1077242, 1077243, 1077244, 1077245, 1077246};
ItemIDsDatabase[43832] = {363823, 43832, 363822, 363824, 363825, 363826, 363827, 363828, 363829, 363830, 363831, 363832, 363833, 363834, 590373, 590374, 590375, 590376, 590377, 590378, 590379, 590380, 590381, 590382, 1077247, 1077248, 1077249, 1077250, 1077251, 1077252, 1077253, 1077254, 1077255, 1077256, 1077257, 1077258, 1077259, 1077260, 1077261, 1077262, 1077263, 1077264, 1077265, 1077266};
ItemIDsDatabase[43833] = {363836, 43833, 363835, 363837, 363838, 363839, 363840, 363841, 363842, 363843, 363844, 363845, 363846, 363847, 590383, 590384, 590385, 590386, 590387, 590388, 590389, 590390, 590391, 590392, 1077267, 1077268, 1077269, 1077270, 1077271, 1077272, 1077273, 1077274, 1077275, 1077276, 1077277, 1077278, 1077279, 1077280, 1077281, 1077282, 1077283, 1077284, 1077285, 1077286};
ItemIDsDatabase[43834] = {363849, 43834, 363848, 363850, 363851, 363852, 363853, 363854, 363855, 363856, 363857, 363858, 363859, 363860, 590393, 590394, 590395, 590396, 590397, 590398, 590399, 590400, 590401, 590402, 1077287, 1077288, 1077289, 1077290, 1077291, 1077292, 1077293, 1077294, 1077295, 1077296, 1077297, 1077298, 1077299, 1077300, 1077301, 1077302, 1077303, 1077304, 1077305, 1077306};
ItemIDsDatabase[43835] = {363862, 43835, 363861, 363863, 363864, 363865, 363866, 363867, 363868, 363869, 363870, 363871, 363872, 363873, 590403, 590404, 590405, 590406, 590407, 590408, 590409, 590410, 590411, 590412, 1077307, 1077308, 1077309, 1077310, 1077311, 1077312, 1077313, 1077314, 1077315, 1077316, 1077317, 1077318, 1077319, 1077320, 1077321, 1077322, 1077323, 1077324, 1077325, 1077326};
ItemIDsDatabase[43836] = {363875, 43836, 363874, 363876, 363877, 363878, 363879, 363880, 363881, 363882, 363883, 363884, 363885, 363886, 590413, 590414, 590415, 590416, 590417, 590418, 590419, 590420, 590421, 590422, 1077327, 1077328, 1077329, 1077330, 1077331, 1077332, 1077333, 1077334, 1077335, 1077336, 1077337, 1077338, 1077339, 1077340, 1077341, 1077342, 1077343, 1077344, 1077345, 1077346};
ItemIDsDatabase[43837] = {363888, 43837, 363887, 363889, 363890, 363891, 363892, 363893, 363894, 363895, 363896, 363897, 363898, 363899, 590423, 590424, 590425, 590426, 590427, 590428, 590429, 590430, 590431, 590432, 1077347, 1077348, 1077349, 1077350, 1077351, 1077352, 1077353, 1077354, 1077355, 1077356, 1077357, 1077358, 1077359, 1077360, 1077361, 1077362, 1077363, 1077364, 1077365, 1077366};
ItemIDsDatabase[43838] = {363901, 43838, 363900, 363902, 363903, 363904, 363905, 363906, 363907, 363908, 363909, 363910, 363911, 363912, 590433, 590434, 590435, 590436, 590437, 590438, 590439, 590440, 590441, 590442, 1077367, 1077368, 1077369, 1077370, 1077371, 1077372, 1077373, 1077374, 1077375, 1077376, 1077377, 1077378, 1077379, 1077380, 1077381, 1077382, 1077383, 1077384, 1077385, 1077386};
ItemIDsDatabase[43839] = {363914, 43839, 363913, 363915, 363916, 363917, 363918, 363919, 363920, 363921, 363922, 363923, 363924, 363925, 590443, 590444, 590445, 590446, 590447, 590448, 590449, 590450, 590451, 590452, 1077387, 1077388, 1077389, 1077390, 1077391, 1077392, 1077393, 1077394, 1077395, 1077396, 1077397, 1077398, 1077399, 1077400, 1077401, 1077402, 1077403, 1077404, 1077405, 1077406};
ItemIDsDatabase[43840] = {363927, 43840, 363926, 363928, 363929, 363930, 363931, 363932, 363933, 363934, 363935, 363936, 363937, 363938, 590453, 590454, 590455, 590456, 590457, 590458, 590459, 590460, 590461, 590462, 1077407, 1077408, 1077409, 1077410, 1077411, 1077412, 1077413, 1077414, 1077415, 1077416, 1077417, 1077418, 1077419, 1077420, 1077421, 1077422, 1077423, 1077424, 1077425, 1077426};
ItemIDsDatabase[43841] = {363940, 43841, 363939, 363941, 363942, 363943, 363944, 363945, 363946, 363947, 363948, 363949, 363950, 363951, 590463, 590464, 590465, 590466, 590467, 590468, 590469, 590470, 590471, 590472, 1077427, 1077428, 1077429, 1077430, 1077431, 1077432, 1077433, 1077434, 1077435, 1077436, 1077437, 1077438, 1077439, 1077440, 1077441, 1077442, 1077443, 1077444, 1077445, 1077446};
ItemIDsDatabase[43842] = {363953, 43842, 363952, 363954, 363955, 363956, 363957, 363958, 363959, 363960, 363961, 363962, 363963, 363964, 590473, 590474, 590475, 590476, 590477, 590478, 590479, 590480, 590481, 590482, 1077447, 1077448, 1077449, 1077450, 1077451, 1077452, 1077453, 1077454, 1077455, 1077456, 1077457, 1077458, 1077459, 1077460, 1077461, 1077462, 1077463, 1077464, 1077465, 1077466};
ItemIDsDatabase[43843] = {363966, 43843, 363965, 363967, 363968, 363969, 363970, 363971, 363972, 363973, 363974, 363975, 363976, 363977, 590483, 590484, 590485, 590486, 590487, 590488, 590489, 590490, 590491, 590492, 1077467, 1077468, 1077469, 1077470, 1077471, 1077472, 1077473, 1077474, 1077475, 1077476, 1077477, 1077478, 1077479, 1077480, 1077481, 1077482, 1077483, 1077484, 1077485, 1077486};
ItemIDsDatabase[43844] = {363979, 43844, 363978, 363980, 363981, 363982, 363983, 363984, 363985, 363986, 363987, 363988, 363989, 363990, 590493, 590494, 590495, 590496, 590497, 590498, 590499, 590500, 590501, 590502, 1077487, 1077488, 1077489, 1077490, 1077491, 1077492, 1077493, 1077494, 1077495, 1077496, 1077497, 1077498, 1077499, 1077500, 1077501, 1077502, 1077503, 1077504, 1077505, 1077506};
ItemIDsDatabase[43845] = {363992, 43845, 363991, 363993, 363994, 363995, 363996, 363997, 363998, 363999, 364000, 364001, 364002, 364003, 590503, 590504, 590505, 590506, 590507, 590508, 590509, 590510, 590511, 590512, 1077507, 1077508, 1077509, 1077510, 1077511, 1077512, 1077513, 1077514, 1077515, 1077516, 1077517, 1077518, 1077519, 1077520, 1077521, 1077522, 1077523, 1077524, 1077525, 1077526};
ItemIDsDatabase[43846] = {364005, 43846, 364004, 364006, 364007, 364008, 364009, 364010, 364011, 364012, 364013, 364014, 364015, 364016, 590513, 590514, 590515, 590516, 590517, 590518, 590519, 590520, 590521, 590522, 1077527, 1077528, 1077529, 1077530, 1077531, 1077532, 1077533, 1077534, 1077535, 1077536, 1077537, 1077538, 1077539, 1077540, 1077541, 1077542, 1077543, 1077544, 1077545, 1077546};
ItemIDsDatabase[43847] = {364018, 43847, 364017, 364019, 364020, 364021, 364022, 364023, 364024, 364025, 364026, 364027, 364028, 364029, 590523, 590524, 590525, 590526, 590527, 590528, 590529, 590530, 590531, 590532, 1077547, 1077548, 1077549, 1077550, 1077551, 1077552, 1077553, 1077554, 1077555, 1077556, 1077557, 1077558, 1077559, 1077560, 1077561, 1077562, 1077563, 1077564, 1077565, 1077566};
ItemIDsDatabase[43849] = {364044, 43849, 364043, 364045, 364046, 364047, 364048, 364049, 364050, 364051, 364052, 364053, 364054, 364055, 590543, 590544, 590545, 590546, 590547, 590548, 590549, 590550, 590551, 590552, 1077587, 1077588, 1077589, 1077590, 1077591, 1077592, 1077593, 1077594, 1077595, 1077596, 1077597, 1077598, 1077599, 1077600, 1077601, 1077602, 1077603, 1077604, 1077605, 1077606};
ItemIDsDatabase[43855] = {364057, 43855, 364056, 364058, 364059, 364060, 364061, 364062, 364063, 364064, 364065, 364066, 364067, 364068, 590553, 590554, 590555, 590556, 590557, 590558, 590559, 590560, 590561, 590562, 1077607, 1077608, 1077609, 1077610, 1077611, 1077612, 1077613, 1077614, 1077615, 1077616, 1077617, 1077618, 1077619, 1077620, 1077621, 1077622, 1077623, 1077624, 1077625, 1077626};
ItemIDsDatabase[43856] = {364070, 43856, 364069, 364071, 364072, 364073, 364074, 364075, 364076, 364077, 364078, 364079, 364080, 364081, 590563, 590564, 590565, 590566, 590567, 590568, 590569, 590570, 590571, 590572, 1077627, 1077628, 1077629, 1077630, 1077631, 1077632, 1077633, 1077634, 1077635, 1077636, 1077637, 1077638, 1077639, 1077640, 1077641, 1077642, 1077643, 1077644, 1077645, 1077646};
ItemIDsDatabase[43857] = {364083, 43857, 364082, 364084, 364085, 364086, 364087, 364088, 364089, 364090, 364091, 364092, 364093, 364094, 590573, 590574, 590575, 590576, 590577, 590578, 590579, 590580, 590581, 590582, 1077647, 1077648, 1077649, 1077650, 1077651, 1077652, 1077653, 1077654, 1077655, 1077656, 1077657, 1077658, 1077659, 1077660, 1077661, 1077662, 1077663, 1077664, 1077665, 1077666};
ItemIDsDatabase[43858] = {364096, 43858, 364095, 364097, 364098, 364099, 364100, 364101, 364102, 364103, 364104, 364105, 364106, 364107, 590583, 590584, 590585, 590586, 590587, 590588, 590589, 590590, 590591, 590592, 1077667, 1077668, 1077669, 1077670, 1077671, 1077672, 1077673, 1077674, 1077675, 1077676, 1077677, 1077678, 1077679, 1077680, 1077681, 1077682, 1077683, 1077684, 1077685, 1077686};
ItemIDsDatabase[43859] = {364109, 43859, 364108, 364110, 364111, 364112, 364113, 364114, 364115, 364116, 364117, 364118, 364119, 364120, 590593, 590594, 590595, 590596, 590597, 590598, 590599, 590600, 590601, 590602, 1077687, 1077688, 1077689, 1077690, 1077691, 1077692, 1077693, 1077694, 1077695, 1077696, 1077697, 1077698, 1077699, 1077700, 1077701, 1077702, 1077703, 1077704, 1077705, 1077706};
ItemIDsDatabase[43860] = {6043860, 43860, 364121, 364122, 364123, 364124, 364125, 364126, 364127, 364128, 364129, 364130, 364131, 364132, 590603, 590604, 590605, 590606, 590607, 590608, 590609, 590610, 590611, 590612, 1077707, 1077708, 1077709, 1077710, 1077711, 1077712, 1077713, 1077714, 1077715, 1077716, 1077717, 1077718, 1077719, 1077720, 1077721, 1077722, 1077723, 1077724, 1077725, 1077726};
ItemIDsDatabase[43861] = {364134, 43861, 364133, 364135, 364136, 364137, 364138, 364139, 364140, 364141, 364142, 364143, 364144, 364145, 590613, 590614, 590615, 590616, 590617, 590618, 590619, 590620, 590621, 590622, 1077727, 1077728, 1077729, 1077730, 1077731, 1077732, 1077733, 1077734, 1077735, 1077736, 1077737, 1077738, 1077739, 1077740, 1077741, 1077742, 1077743, 1077744, 1077745, 1077746};
ItemIDsDatabase[43862] = {364147, 43862, 364146, 364148, 364149, 364150, 364151, 364152, 364153, 364154, 364155, 364156, 364157, 364158, 590623, 590624, 590625, 590626, 590627, 590628, 590629, 590630, 590631, 590632, 1077747, 1077748, 1077749, 1077750, 1077751, 1077752, 1077753, 1077754, 1077755, 1077756, 1077757, 1077758, 1077759, 1077760, 1077761, 1077762, 1077763, 1077764, 1077765, 1077766};
ItemIDsDatabase[43863] = {364160, 43863, 364159, 364161, 364162, 364163, 364164, 364165, 364166, 364167, 364168, 364169, 364170, 364171, 590633, 590634, 590635, 590636, 590637, 590638, 590639, 590640, 590641, 590642, 1077767, 1077768, 1077769, 1077770, 1077771, 1077772, 1077773, 1077774, 1077775, 1077776, 1077777, 1077778, 1077779, 1077780, 1077781, 1077782, 1077783, 1077784, 1077785, 1077786};
ItemIDsDatabase[43864] = {6043864, 43864, 364172, 364173, 364174, 364175, 364176, 364177, 364178, 364179, 364180, 364181, 364182, 364183, 590643, 590644, 590645, 590646, 590647, 590648, 590649, 590650, 590651, 590652, 1077787, 1077788, 1077789, 1077790, 1077791, 1077792, 1077793, 1077794, 1077795, 1077796, 1077797, 1077798, 1077799, 1077800, 1077801, 1077802, 1077803, 1077804, 1077805, 1077806};
ItemIDsDatabase[43865] = {6043865, 43865, 364184, 364185, 364186, 364187, 364188, 364189, 364190, 364191, 364192, 364193, 364194, 364195, 590653, 590654, 590655, 590656, 590657, 590658, 590659, 590660, 590661, 590662, 1077807, 1077808, 1077809, 1077810, 1077811, 1077812, 1077813, 1077814, 1077815, 1077816, 1077817, 1077818, 1077819, 1077820, 1077821, 1077822, 1077823, 1077824, 1077825, 1077826};
ItemIDsDatabase[43866] = {364197, 43866, 364196, 364198, 364199, 364200, 364201, 364202, 364203, 364204, 364205, 364206, 364207, 364208, 590663, 590664, 590665, 590666, 590667, 590668, 590669, 590670, 590671, 590672, 1077827, 1077828, 1077829, 1077830, 1077831, 1077832, 1077833, 1077834, 1077835, 1077836, 1077837, 1077838, 1077839, 1077840, 1077841, 1077842, 1077843, 1077844, 1077845, 1077846};
ItemIDsDatabase[43870] = {6043870, 43870, 364209, 364210, 364211, 364212, 364213, 364214, 364215, 364216, 364217, 364218, 364219, 364220, 590673, 590674, 590675, 590676, 590677, 590678, 590679, 590680, 590681, 590682, 1077847, 1077848, 1077849, 1077850, 1077851, 1077852, 1077853, 1077854, 1077855, 1077856, 1077857, 1077858, 1077859, 1077860, 1077861, 1077862, 1077863, 1077864, 1077865, 1077866};
ItemIDsDatabase[43871] = {6043871, 43871, 364221, 364222, 364223, 364224, 364225, 364226, 364227, 364228, 364229, 364230, 364231, 364232, 590683, 590684, 590685, 590686, 590687, 590688, 590689, 590690, 590691, 590692, 1077867, 1077868, 1077869, 1077870, 1077871, 1077872, 1077873, 1077874, 1077875, 1077876, 1077877, 1077878, 1077879, 1077880, 1077881, 1077882, 1077883, 1077884, 1077885, 1077886};
ItemIDsDatabase[43872] = {364234, 43872, 364233, 364235, 364236, 364237, 364238, 364239, 364240, 364241, 364242, 364243, 364244, 364245, 590693, 590694, 590695, 590696, 590697, 590698, 590699, 590700, 590701, 590702, 1077887, 1077888, 1077889, 1077890, 1077891, 1077892, 1077893, 1077894, 1077895, 1077896, 1077897, 1077898, 1077899, 1077900, 1077901, 1077902, 1077903, 1077904, 1077905, 1077906};
ItemIDsDatabase[43873] = {364247, 43873, 364246, 364248, 364249, 364250, 364251, 364252, 364253, 364254, 364255, 364256, 364257, 364258, 590703, 590704, 590705, 590706, 590707, 590708, 590709, 590710, 590711, 590712, 1077907, 1077908, 1077909, 1077910, 1077911, 1077912, 1077913, 1077914, 1077915, 1077916, 1077917, 1077918, 1077919, 1077920, 1077921, 1077922, 1077923, 1077924, 1077925, 1077926};
ItemIDsDatabase[43874] = {364260, 43874, 364259, 364261, 364262, 364263, 364264, 364265, 364266, 364267, 364268, 364269, 364270, 364271, 590713, 590714, 590715, 590716, 590717, 590718, 590719, 590720, 590721, 590722, 1077927, 1077928, 1077929, 1077930, 1077931, 1077932, 1077933, 1077934, 1077935, 1077936, 1077937, 1077938, 1077939, 1077940, 1077941, 1077942, 1077943, 1077944, 1077945, 1077946};
ItemIDsDatabase[43875] = {364273, 43875, 364272, 364274, 364275, 364276, 364277, 364278, 364279, 364280, 364281, 364282, 364283, 364284, 590723, 590724, 590725, 590726, 590727, 590728, 590729, 590730, 590731, 590732, 1077947, 1077948, 1077949, 1077950, 1077951, 1077952, 1077953, 1077954, 1077955, 1077956, 1077957, 1077958, 1077959, 1077960, 1077961, 1077962, 1077963, 1077964, 1077965, 1077966};
ItemIDsDatabase[43877] = {364286, 43877, 364285, 364287, 364288, 364289, 364290, 364291, 364292, 364293, 364294, 364295, 364296, 364297, 590733, 590734, 590735, 590736, 590737, 590738, 590739, 590740, 590741, 590742, 1077967, 1077968, 1077969, 1077970, 1077971, 1077972, 1077973, 1077974, 1077975, 1077976, 1077977, 1077978, 1077979, 1077980, 1077981, 1077982, 1077983, 1077984, 1077985, 1077986};
ItemIDsDatabase[43879] = {364312, 43879, 364311, 364313, 364314, 364315, 364316, 364317, 364318, 364319, 364320, 364321, 364322, 364323, 590753, 590754, 590755, 590756, 590757, 590758, 590759, 590760, 590761, 590762, 1078007, 1078008, 1078009, 1078010, 1078011, 1078012, 1078013, 1078014, 1078015, 1078016, 1078017, 1078018, 1078019, 1078020, 1078021, 1078022, 1078023, 1078024, 1078025, 1078026};
ItemIDsDatabase[43880] = {364325, 43880, 364324, 364326, 364327, 364328, 364329, 364330, 364331, 364332, 364333, 364334, 364335, 364336, 590763, 590764, 590765, 590766, 590767, 590768, 590769, 590770, 590771, 590772, 1078027, 1078028, 1078029, 1078030, 1078031, 1078032, 1078033, 1078034, 1078035, 1078036, 1078037, 1078038, 1078039, 1078040, 1078041, 1078042, 1078043, 1078044, 1078045, 1078046};
ItemIDsDatabase[43881] = {364338, 43881, 364337, 364339, 364340, 364341, 364342, 364343, 364344, 364345, 364346, 364347, 364348, 364349, 590773, 590774, 590775, 590776, 590777, 590778, 590779, 590780, 590781, 590782, 1078047, 1078048, 1078049, 1078050, 1078051, 1078052, 1078053, 1078054, 1078055, 1078056, 1078057, 1078058, 1078059, 1078060, 1078061, 1078062, 1078063, 1078064, 1078065, 1078066};
ItemIDsDatabase[43882] = {364351, 43882, 364350, 364352, 364353, 364354, 364355, 364356, 364357, 364358, 364359, 364360, 364361, 364362, 590783, 590784, 590785, 590786, 590787, 590788, 590789, 590790, 590791, 590792, 1078067, 1078068, 1078069, 1078070, 1078071, 1078072, 1078073, 1078074, 1078075, 1078076, 1078077, 1078078, 1078079, 1078080, 1078081, 1078082, 1078083, 1078084, 1078085, 1078086};
ItemIDsDatabase[43883] = {364364, 43883, 364363, 364365, 364366, 364367, 364368, 364369, 364370, 364371, 364372, 364373, 364374, 364375, 590793, 590794, 590795, 590796, 590797, 590798, 590799, 590800, 590801, 590802, 1078087, 1078088, 1078089, 1078090, 1078091, 1078092, 1078093, 1078094, 1078095, 1078096, 1078097, 1078098, 1078099, 1078100, 1078101, 1078102, 1078103, 1078104, 1078105, 1078106};
ItemIDsDatabase[43884] = {364377, 43884, 364376, 364378, 364379, 364380, 364381, 364382, 364383, 364384, 364385, 364386, 364387, 364388, 590803, 590804, 590805, 590806, 590807, 590808, 590809, 590810, 590811, 590812, 1078107, 1078108, 1078109, 1078110, 1078111, 1078112, 1078113, 1078114, 1078115, 1078116, 1078117, 1078118, 1078119, 1078120, 1078121, 1078122, 1078123, 1078124, 1078125, 1078126};
ItemIDsDatabase[43885] = {364390, 43885, 364389, 364391, 364392, 364393, 364394, 364395, 364396, 364397, 364398, 364399, 364400, 364401, 590813, 590814, 590815, 590816, 590817, 590818, 590819, 590820, 590821, 590822, 1078127, 1078128, 1078129, 1078130, 1078131, 1078132, 1078133, 1078134, 1078135, 1078136, 1078137, 1078138, 1078139, 1078140, 1078141, 1078142, 1078143, 1078144, 1078145, 1078146};
ItemIDsDatabase[43888] = {364403, 43888, 364402, 364404, 364405, 364406, 364407, 364408, 364409, 364410, 364411, 364412, 364413, 364414, 590823, 590824, 590825, 590826, 590827, 590828, 590829, 590830, 590831, 590832, 1078147, 1078148, 1078149, 1078150, 1078151, 1078152, 1078153, 1078154, 1078155, 1078156, 1078157, 1078158, 1078159, 1078160, 1078161, 1078162, 1078163, 1078164, 1078165, 1078166};
ItemIDsDatabase[43889] = {364416, 43889, 364415, 364417, 364418, 364419, 364420, 364421, 364422, 364423, 364424, 364425, 364426, 364427, 590833, 590834, 590835, 590836, 590837, 590838, 590839, 590840, 590841, 590842, 1078167, 1078168, 1078169, 1078170, 1078171, 1078172, 1078173, 1078174, 1078175, 1078176, 1078177, 1078178, 1078179, 1078180, 1078181, 1078182, 1078183, 1078184, 1078185, 1078186};
ItemIDsDatabase[43890] = {364429, 43890, 364428, 364430, 364431, 364432, 364433, 364434, 364435, 364436, 364437, 364438, 364439, 364440, 590843, 590844, 590845, 590846, 590847, 590848, 590849, 590850, 590851, 590852, 1078187, 1078188, 1078189, 1078190, 1078191, 1078192, 1078193, 1078194, 1078195, 1078196, 1078197, 1078198, 1078199, 1078200, 1078201, 1078202, 1078203, 1078204, 1078205, 1078206};
ItemIDsDatabase[43891] = {364442, 43891, 364441, 364443, 364444, 364445, 364446, 364447, 364448, 364449, 364450, 364451, 364452, 364453, 590853, 590854, 590855, 590856, 590857, 590858, 590859, 590860, 590861, 590862, 1078207, 1078208, 1078209, 1078210, 1078211, 1078212, 1078213, 1078214, 1078215, 1078216, 1078217, 1078218, 1078219, 1078220, 1078221, 1078222, 1078223, 1078224, 1078225, 1078226};
ItemIDsDatabase[43892] = {364455, 43892, 364454, 364456, 364457, 364458, 364459, 364460, 364461, 364462, 364463, 364464, 364465, 364466, 590863, 590864, 590865, 590866, 590867, 590868, 590869, 590870, 590871, 590872, 1078227, 1078228, 1078229, 1078230, 1078231, 1078232, 1078233, 1078234, 1078235, 1078236, 1078237, 1078238, 1078239, 1078240, 1078241, 1078242, 1078243, 1078244, 1078245, 1078246};
ItemIDsDatabase[43893] = {364468, 43893, 364467, 364469, 364470, 364471, 364472, 364473, 364474, 364475, 364476, 364477, 364478, 364479, 590873, 590874, 590875, 590876, 590877, 590878, 590879, 590880, 590881, 590882, 1078247, 1078248, 1078249, 1078250, 1078251, 1078252, 1078253, 1078254, 1078255, 1078256, 1078257, 1078258, 1078259, 1078260, 1078261, 1078262, 1078263, 1078264, 1078265, 1078266};
ItemIDsDatabase[43894] = {364481, 43894, 364480, 364482, 364483, 364484, 364485, 364486, 364487, 364488, 364489, 364490, 364491, 364492, 590883, 590884, 590885, 590886, 590887, 590888, 590889, 590890, 590891, 590892, 1078267, 1078268, 1078269, 1078270, 1078271, 1078272, 1078273, 1078274, 1078275, 1078276, 1078277, 1078278, 1078279, 1078280, 1078281, 1078282, 1078283, 1078284, 1078285, 1078286};
ItemIDsDatabase[43896] = {364507, 43896, 364506, 364508, 364509, 364510, 364511, 364512, 364513, 364514, 364515, 364516, 364517, 364518, 590903, 590904, 590905, 590906, 590907, 590908, 590909, 590910, 590911, 590912, 1078307, 1078308, 1078309, 1078310, 1078311, 1078312, 1078313, 1078314, 1078315, 1078316, 1078317, 1078318, 1078319, 1078320, 1078321, 1078322, 1078323, 1078324, 1078325, 1078326};
ItemIDsDatabase[43897] = {364520, 43897, 364519, 364521, 364522, 364523, 364524, 364525, 364526, 364527, 364528, 364529, 364530, 364531, 590913, 590914, 590915, 590916, 590917, 590918, 590919, 590920, 590921, 590922, 1078327, 1078328, 1078329, 1078330, 1078331, 1078332, 1078333, 1078334, 1078335, 1078336, 1078337, 1078338, 1078339, 1078340, 1078341, 1078342, 1078343, 1078344, 1078345, 1078346};
ItemIDsDatabase[43898] = {364533, 43898, 364532, 364534, 364535, 364536, 364537, 364538, 364539, 364540, 364541, 364542, 364543, 364544, 590923, 590924, 590925, 590926, 590927, 590928, 590929, 590930, 590931, 590932, 1078347, 1078348, 1078349, 1078350, 1078351, 1078352, 1078353, 1078354, 1078355, 1078356, 1078357, 1078358, 1078359, 1078360, 1078361, 1078362, 1078363, 1078364, 1078365, 1078366};
ItemIDsDatabase[43899] = {364546, 43899, 364545, 364547, 364548, 364549, 364550, 364551, 364552, 364553, 364554, 364555, 364556, 364557, 590933, 590934, 590935, 590936, 590937, 590938, 590939, 590940, 590941, 590942, 1078367, 1078368, 1078369, 1078370, 1078371, 1078372, 1078373, 1078374, 1078375, 1078376, 1078377, 1078378, 1078379, 1078380, 1078381, 1078382, 1078383, 1078384, 1078385, 1078386};
ItemIDsDatabase[43900] = {364559, 43900, 364558, 364560, 364561, 364562, 364563, 364564, 364565, 364566, 364567, 364568, 364569, 364570, 590943, 590944, 590945, 590946, 590947, 590948, 590949, 590950, 590951, 590952, 1078387, 1078388, 1078389, 1078390, 1078391, 1078392, 1078393, 1078394, 1078395, 1078396, 1078397, 1078398, 1078399, 1078400, 1078401, 1078402, 1078403, 1078404, 1078405, 1078406};
ItemIDsDatabase[43903] = {364572, 43903, 364571, 364573, 364574, 364575, 364576, 364577, 364578, 364579, 364580, 364581, 364582, 364583, 590953, 590954, 590955, 590956, 590957, 590958, 590959, 590960, 590961, 590962, 1078407, 1078408, 1078409, 1078410, 1078411, 1078412, 1078413, 1078414, 1078415, 1078416, 1078417, 1078418, 1078419, 1078420, 1078421, 1078422, 1078423, 1078424, 1078425, 1078426};
ItemIDsDatabase[43904] = {364585, 43904, 364584, 364586, 364587, 364588, 364589, 364590, 364591, 364592, 364593, 364594, 364595, 364596, 590963, 590964, 590965, 590966, 590967, 590968, 590969, 590970, 590971, 590972, 1078427, 1078428, 1078429, 1078430, 1078431, 1078432, 1078433, 1078434, 1078435, 1078436, 1078437, 1078438, 1078439, 1078440, 1078441, 1078442, 1078443, 1078444, 1078445, 1078446};
ItemIDsDatabase[43905] = {364598, 43905, 364597, 364599, 364600, 364601, 364602, 364603, 364604, 364605, 364606, 364607, 364608, 364609, 590973, 590974, 590975, 590976, 590977, 590978, 590979, 590980, 590981, 590982, 1078447, 1078448, 1078449, 1078450, 1078451, 1078452, 1078453, 1078454, 1078455, 1078456, 1078457, 1078458, 1078459, 1078460, 1078461, 1078462, 1078463, 1078464, 1078465, 1078466};
ItemIDsDatabase[43906] = {364611, 43906, 364610, 364612, 364613, 364614, 364615, 364616, 364617, 364618, 364619, 364620, 364621, 364622, 590983, 590984, 590985, 590986, 590987, 590988, 590989, 590990, 590991, 590992, 1078467, 1078468, 1078469, 1078470, 1078471, 1078472, 1078473, 1078474, 1078475, 1078476, 1078477, 1078478, 1078479, 1078480, 1078481, 1078482, 1078483, 1078484, 1078485, 1078486};
ItemIDsDatabase[43907] = {364624, 43907, 364623, 364625, 364626, 364627, 364628, 364629, 364630, 364631, 364632, 364633, 364634, 364635, 590993, 590994, 590995, 590996, 590997, 590998, 590999, 591000, 591001, 591002, 1078487, 1078488, 1078489, 1078490, 1078491, 1078492, 1078493, 1078494, 1078495, 1078496, 1078497, 1078498, 1078499, 1078500, 1078501, 1078502, 1078503, 1078504, 1078505, 1078506};
ItemIDsDatabase[43908] = {364637, 43908, 364636, 364638, 364639, 364640, 364641, 364642, 364643, 364644, 364645, 364646, 364647, 364648, 591003, 591004, 591005, 591006, 591007, 591008, 591009, 591010, 591011, 591012, 1078507, 1078508, 1078509, 1078510, 1078511, 1078512, 1078513, 1078514, 1078515, 1078516, 1078517, 1078518, 1078519, 1078520, 1078521, 1078522, 1078523, 1078524, 1078525, 1078526};
ItemIDsDatabase[43909] = {364650, 43909, 364649, 364651, 364652, 364653, 364654, 364655, 364656, 364657, 364658, 364659, 364660, 364661, 591013, 591014, 591015, 591016, 591017, 591018, 591019, 591020, 591021, 591022, 1078527, 1078528, 1078529, 1078530, 1078531, 1078532, 1078533, 1078534, 1078535, 1078536, 1078537, 1078538, 1078539, 1078540, 1078541, 1078542, 1078543, 1078544, 1078545, 1078546};
ItemIDsDatabase[43910] = {364663, 43910, 364662, 364664, 364665, 364666, 364667, 364668, 364669, 364670, 364671, 364672, 364673, 364674, 591023, 591024, 591025, 591026, 591027, 591028, 591029, 591030, 591031, 591032, 1078547, 1078548, 1078549, 1078550, 1078551, 1078552, 1078553, 1078554, 1078555, 1078556, 1078557, 1078558, 1078559, 1078560, 1078561, 1078562, 1078563, 1078564, 1078565, 1078566};
ItemIDsDatabase[43911] = {364676, 43911, 364675, 364677, 364678, 364679, 364680, 364681, 364682, 364683, 364684, 364685, 364686, 364687, 591033, 591034, 591035, 591036, 591037, 591038, 591039, 591040, 591041, 591042, 1078567, 1078568, 1078569, 1078570, 1078571, 1078572, 1078573, 1078574, 1078575, 1078576, 1078577, 1078578, 1078579, 1078580, 1078581, 1078582, 1078583, 1078584, 1078585, 1078586};
ItemIDsDatabase[43912] = {364689, 43912, 364688, 364690, 364691, 364692, 364693, 364694, 364695, 364696, 364697, 364698, 364699, 364700, 591043, 591044, 591045, 591046, 591047, 591048, 591049, 591050, 591051, 591052, 1078587, 1078588, 1078589, 1078590, 1078591, 1078592, 1078593, 1078594, 1078595, 1078596, 1078597, 1078598, 1078599, 1078600, 1078601, 1078602, 1078603, 1078604, 1078605, 1078606};
ItemIDsDatabase[43913] = {364702, 43913, 364701, 364703, 364704, 364705, 364706, 364707, 364708, 364709, 364710, 364711, 364712, 364713, 591053, 591054, 591055, 591056, 591057, 591058, 591059, 591060, 591061, 591062, 1078607, 1078608, 1078609, 1078610, 1078611, 1078612, 1078613, 1078614, 1078615, 1078616, 1078617, 1078618, 1078619, 1078620, 1078621, 1078622, 1078623, 1078624, 1078625, 1078626};
ItemIDsDatabase[43914] = {364715, 43914, 364714, 364716, 364717, 364718, 364719, 364720, 364721, 364722, 364723, 364724, 364725, 364726, 591063, 591064, 591065, 591066, 591067, 591068, 591069, 591070, 591071, 591072, 1078627, 1078628, 1078629, 1078630, 1078631, 1078632, 1078633, 1078634, 1078635, 1078636, 1078637, 1078638, 1078639, 1078640, 1078641, 1078642, 1078643, 1078644, 1078645, 1078646};
ItemIDsDatabase[43915] = {364728, 43915, 364727, 364729, 364730, 364731, 364732, 364733, 364734, 364735, 364736, 364737, 364738, 364739, 591073, 591074, 591075, 591076, 591077, 591078, 591079, 591080, 591081, 591082, 1078647, 1078648, 1078649, 1078650, 1078651, 1078652, 1078653, 1078654, 1078655, 1078656, 1078657, 1078658, 1078659, 1078660, 1078661, 1078662, 1078663, 1078664, 1078665, 1078666};
ItemIDsDatabase[43916] = {364741, 43916, 364740, 364742, 364743, 364744, 364745, 364746, 364747, 364748, 364749, 364750, 364751, 364752, 591083, 591084, 591085, 591086, 591087, 591088, 591089, 591090, 591091, 591092, 1078667, 1078668, 1078669, 1078670, 1078671, 1078672, 1078673, 1078674, 1078675, 1078676, 1078677, 1078678, 1078679, 1078680, 1078681, 1078682, 1078683, 1078684, 1078685, 1078686};
ItemIDsDatabase[43917] = {364754, 43917, 364753, 364755, 364756, 364757, 364758, 364759, 364760, 364761, 364762, 364763, 364764, 364765, 591093, 591094, 591095, 591096, 591097, 591098, 591099, 591100, 591101, 591102, 1078687, 1078688, 1078689, 1078690, 1078691, 1078692, 1078693, 1078694, 1078695, 1078696, 1078697, 1078698, 1078699, 1078700, 1078701, 1078702, 1078703, 1078704, 1078705, 1078706};
ItemIDsDatabase[43918] = {364767, 43918, 364766, 364768, 364769, 364770, 364771, 364772, 364773, 364774, 364775, 364776, 364777, 364778, 591103, 591104, 591105, 591106, 591107, 591108, 591109, 591110, 591111, 591112, 1078707, 1078708, 1078709, 1078710, 1078711, 1078712, 1078713, 1078714, 1078715, 1078716, 1078717, 1078718, 1078719, 1078720, 1078721, 1078722, 1078723, 1078724, 1078725, 1078726};
ItemIDsDatabase[43919] = {364780, 43919, 364779, 364781, 364782, 364783, 364784, 364785, 364786, 364787, 364788, 364789, 364790, 364791, 591113, 591114, 591115, 591116, 591117, 591118, 591119, 591120, 591121, 591122, 1078727, 1078728, 1078729, 1078730, 1078731, 1078732, 1078733, 1078734, 1078735, 1078736, 1078737, 1078738, 1078739, 1078740, 1078741, 1078742, 1078743, 1078744, 1078745, 1078746};
ItemIDsDatabase[43920] = {364793, 43920, 364792, 364794, 364795, 364796, 364797, 364798, 364799, 364800, 364801, 364802, 364803, 364804, 591123, 591124, 591125, 591126, 591127, 591128, 591129, 591130, 591131, 591132, 1078747, 1078748, 1078749, 1078750, 1078751, 1078752, 1078753, 1078754, 1078755, 1078756, 1078757, 1078758, 1078759, 1078760, 1078761, 1078762, 1078763, 1078764, 1078765, 1078766};
ItemIDsDatabase[43921] = {364806, 43921, 364805, 364807, 364808, 364809, 364810, 364811, 364812, 364813, 364814, 364815, 364816, 364817, 591133, 591134, 591135, 591136, 591137, 591138, 591139, 591140, 591141, 591142, 1078767, 1078768, 1078769, 1078770, 1078771, 1078772, 1078773, 1078774, 1078775, 1078776, 1078777, 1078778, 1078779, 1078780, 1078781, 1078782, 1078783, 1078784, 1078785, 1078786};
ItemIDsDatabase[43923] = {364832, 43923, 364831, 364833, 364834, 364835, 364836, 364837, 364838, 364839, 364840, 364841, 364842, 364843, 591153, 591154, 591155, 591156, 591157, 591158, 591159, 591160, 591161, 591162, 1078807, 1078808, 1078809, 1078810, 1078811, 1078812, 1078813, 1078814, 1078815, 1078816, 1078817, 1078818, 1078819, 1078820, 1078821, 1078822, 1078823, 1078824, 1078825, 1078826};
ItemIDsDatabase[43924] = {364845, 43924, 364844, 364846, 364847, 364848, 364849, 364850, 364851, 364852, 364853, 364854, 364855, 364856, 591163, 591164, 591165, 591166, 591167, 591168, 591169, 591170, 591171, 591172, 1078827, 1078828, 1078829, 1078830, 1078831, 1078832, 1078833, 1078834, 1078835, 1078836, 1078837, 1078838, 1078839, 1078840, 1078841, 1078842, 1078843, 1078844, 1078845, 1078846};
ItemIDsDatabase[43925] = {364858, 43925, 364857, 364859, 364860, 364861, 364862, 364863, 364864, 364865, 364866, 364867, 364868, 364869, 591173, 591174, 591175, 591176, 591177, 591178, 591179, 591180, 591181, 591182, 1078847, 1078848, 1078849, 1078850, 1078851, 1078852, 1078853, 1078854, 1078855, 1078856, 1078857, 1078858, 1078859, 1078860, 1078861, 1078862, 1078863, 1078864, 1078865, 1078866};
ItemIDsDatabase[43926] = {364871, 43926, 364870, 364872, 364873, 364874, 364875, 364876, 364877, 364878, 364879, 364880, 364881, 364882, 591183, 591184, 591185, 591186, 591187, 591188, 591189, 591190, 591191, 591192, 1078867, 1078868, 1078869, 1078870, 1078871, 1078872, 1078873, 1078874, 1078875, 1078876, 1078877, 1078878, 1078879, 1078880, 1078881, 1078882, 1078883, 1078884, 1078885, 1078886};
ItemIDsDatabase[43927] = {364884, 43927, 364883, 364885, 364886, 364887, 364888, 364889, 364890, 364891, 364892, 364893, 364894, 364895, 591193, 591194, 591195, 591196, 591197, 591198, 591199, 591200, 591201, 591202, 1078887, 1078888, 1078889, 1078890, 1078891, 1078892, 1078893, 1078894, 1078895, 1078896, 1078897, 1078898, 1078899, 1078900, 1078901, 1078902, 1078903, 1078904, 1078905, 1078906};
ItemIDsDatabase[43928] = {364897, 43928, 364896, 364898, 364899, 364900, 364901, 364902, 364903, 364904, 364905, 364906, 364907, 364908, 591203, 591204, 591205, 591206, 591207, 591208, 591209, 591210, 591211, 591212, 1078907, 1078908, 1078909, 1078910, 1078911, 1078912, 1078913, 1078914, 1078915, 1078916, 1078917, 1078918, 1078919, 1078920, 1078921, 1078922, 1078923, 1078924, 1078925, 1078926};
ItemIDsDatabase[43929] = {364910, 43929, 364909, 364911, 364912, 364913, 364914, 364915, 364916, 364917, 364918, 364919, 364920, 364921, 591213, 591214, 591215, 591216, 591217, 591218, 591219, 591220, 591221, 591222, 1078927, 1078928, 1078929, 1078930, 1078931, 1078932, 1078933, 1078934, 1078935, 1078936, 1078937, 1078938, 1078939, 1078940, 1078941, 1078942, 1078943, 1078944, 1078945, 1078946};
ItemIDsDatabase[43930] = {364923, 43930, 364922, 364924, 364925, 364926, 364927, 364928, 364929, 364930, 364931, 364932, 364933, 364934, 591223, 591224, 591225, 591226, 591227, 591228, 591229, 591230, 591231, 591232, 1078947, 1078948, 1078949, 1078950, 1078951, 1078952, 1078953, 1078954, 1078955, 1078956, 1078957, 1078958, 1078959, 1078960, 1078961, 1078962, 1078963, 1078964, 1078965, 1078966};
ItemIDsDatabase[43931] = {364936, 43931, 364935, 364937, 364938, 364939, 364940, 364941, 364942, 364943, 364944, 364945, 364946, 364947, 591233, 591234, 591235, 591236, 591237, 591238, 591239, 591240, 591241, 591242, 1078967, 1078968, 1078969, 1078970, 1078971, 1078972, 1078973, 1078974, 1078975, 1078976, 1078977, 1078978, 1078979, 1078980, 1078981, 1078982, 1078983, 1078984, 1078985, 1078986};
ItemIDsDatabase[43932] = {364949, 43932, 364948, 364950, 364951, 364952, 364953, 364954, 364955, 364956, 364957, 364958, 364959, 364960, 591243, 591244, 591245, 591246, 591247, 591248, 591249, 591250, 591251, 591252, 1078987, 1078988, 1078989, 1078990, 1078991, 1078992, 1078993, 1078994, 1078995, 1078996, 1078997, 1078998, 1078999, 1079000, 1079001, 1079002, 1079003, 1079004, 1079005, 1079006};
ItemIDsDatabase[43933] = {364962, 43933, 364961, 364963, 364964, 364965, 364966, 364967, 364968, 364969, 364970, 364971, 364972, 364973, 591253, 591254, 591255, 591256, 591257, 591258, 591259, 591260, 591261, 591262, 1079007, 1079008, 1079009, 1079010, 1079011, 1079012, 1079013, 1079014, 1079015, 1079016, 1079017, 1079018, 1079019, 1079020, 1079021, 1079022, 1079023, 1079024, 1079025, 1079026};
ItemIDsDatabase[43934] = {364975, 43934, 364974, 364976, 364977, 364978, 364979, 364980, 364981, 364982, 364983, 364984, 364985, 364986, 591263, 591264, 591265, 591266, 591267, 591268, 591269, 591270, 591271, 591272, 1079027, 1079028, 1079029, 1079030, 1079031, 1079032, 1079033, 1079034, 1079035, 1079036, 1079037, 1079038, 1079039, 1079040, 1079041, 1079042, 1079043, 1079044, 1079045, 1079046};
ItemIDsDatabase[43935] = {364988, 43935, 364987, 364989, 364990, 364991, 364992, 364993, 364994, 364995, 364996, 364997, 364998, 364999, 591273, 591274, 591275, 591276, 591277, 591278, 591279, 591280, 591281, 591282, 1079047, 1079048, 1079049, 1079050, 1079051, 1079052, 1079053, 1079054, 1079055, 1079056, 1079057, 1079058, 1079059, 1079060, 1079061, 1079062, 1079063, 1079064, 1079065, 1079066};
ItemIDsDatabase[43937] = {365014, 43937, 365013, 365015, 365016, 365017, 365018, 365019, 365020, 365021, 365022, 365023, 365024, 365025, 591293, 591294, 591295, 591296, 591297, 591298, 591299, 591300, 591301, 591302, 1079087, 1079088, 1079089, 1079090, 1079091, 1079092, 1079093, 1079094, 1079095, 1079096, 1079097, 1079098, 1079099, 1079100, 1079101, 1079102, 1079103, 1079104, 1079105, 1079106};
ItemIDsDatabase[43939] = {365040, 43939, 365039, 365041, 365042, 365043, 365044, 365045, 365046, 365047, 365048, 365049, 365050, 365051, 591313, 591314, 591315, 591316, 591317, 591318, 591319, 591320, 591321, 591322, 1079127, 1079128, 1079129, 1079130, 1079131, 1079132, 1079133, 1079134, 1079135, 1079136, 1079137, 1079138, 1079139, 1079140, 1079141, 1079142, 1079143, 1079144, 1079145, 1079146};
ItemIDsDatabase[43940] = {365053, 43940, 365052, 365054, 365055, 365056, 365057, 365058, 365059, 365060, 365061, 365062, 365063, 365064, 591323, 591324, 591325, 591326, 591327, 591328, 591329, 591330, 591331, 591332, 1079147, 1079148, 1079149, 1079150, 1079151, 1079152, 1079153, 1079154, 1079155, 1079156, 1079157, 1079158, 1079159, 1079160, 1079161, 1079162, 1079163, 1079164, 1079165, 1079166};
ItemIDsDatabase[43941] = {365066, 43941, 365065, 365067, 365068, 365069, 365070, 365071, 365072, 365073, 365074, 365075, 365076, 365077, 591333, 591334, 591335, 591336, 591337, 591338, 591339, 591340, 591341, 591342, 1079167, 1079168, 1079169, 1079170, 1079171, 1079172, 1079173, 1079174, 1079175, 1079176, 1079177, 1079178, 1079179, 1079180, 1079181, 1079182, 1079183, 1079184, 1079185, 1079186};
ItemIDsDatabase[43942] = {365079, 43942, 365078, 365080, 365081, 365082, 365083, 365084, 365085, 365086, 365087, 365088, 365089, 365090, 591343, 591344, 591345, 591346, 591347, 591348, 591349, 591350, 591351, 591352, 1079187, 1079188, 1079189, 1079190, 1079191, 1079192, 1079193, 1079194, 1079195, 1079196, 1079197, 1079198, 1079199, 1079200, 1079201, 1079202, 1079203, 1079204, 1079205, 1079206};
ItemIDsDatabase[43943] = {365092, 43943, 365091, 365093, 365094, 365095, 365096, 365097, 365098, 365099, 365100, 365101, 365102, 365103, 591353, 591354, 591355, 591356, 591357, 591358, 591359, 591360, 591361, 591362, 1079207, 1079208, 1079209, 1079210, 1079211, 1079212, 1079213, 1079214, 1079215, 1079216, 1079217, 1079218, 1079219, 1079220, 1079221, 1079222, 1079223, 1079224, 1079225, 1079226};
ItemIDsDatabase[43944] = {365105, 43944, 365104, 365106, 365107, 365108, 365109, 365110, 365111, 365112, 365113, 365114, 365115, 365116, 591363, 591364, 591365, 591366, 591367, 591368, 591369, 591370, 591371, 591372, 1079227, 1079228, 1079229, 1079230, 1079231, 1079232, 1079233, 1079234, 1079235, 1079236, 1079237, 1079238, 1079239, 1079240, 1079241, 1079242, 1079243, 1079244, 1079245, 1079246};
ItemIDsDatabase[43945] = {365118, 43945, 365117, 365119, 365120, 365121, 365122, 365123, 365124, 365125, 365126, 365127, 365128, 365129, 591373, 591374, 591375, 591376, 591377, 591378, 591379, 591380, 591381, 591382, 1079247, 1079248, 1079249, 1079250, 1079251, 1079252, 1079253, 1079254, 1079255, 1079256, 1079257, 1079258, 1079259, 1079260, 1079261, 1079262, 1079263, 1079264, 1079265, 1079266};
ItemIDsDatabase[43946] = {365131, 43946, 365130, 365132, 365133, 365134, 365135, 365136, 365137, 365138, 365139, 365140, 365141, 365142, 591383, 591384, 591385, 591386, 591387, 591388, 591389, 591390, 591391, 591392, 1079267, 1079268, 1079269, 1079270, 1079271, 1079272, 1079273, 1079274, 1079275, 1079276, 1079277, 1079278, 1079279, 1079280, 1079281, 1079282, 1079283, 1079284, 1079285, 1079286};
ItemIDsDatabase[43947] = {365144, 43947, 365143, 365145, 365146, 365147, 365148, 365149, 365150, 365151, 365152, 365153, 365154, 365155, 591393, 591394, 591395, 591396, 591397, 591398, 591399, 591400, 591401, 591402, 1079287, 1079288, 1079289, 1079290, 1079291, 1079292, 1079293, 1079294, 1079295, 1079296, 1079297, 1079298, 1079299, 1079300, 1079301, 1079302, 1079303, 1079304, 1079305, 1079306};
ItemIDsDatabase[43948] = {365157, 43948, 365156, 365158, 365159, 365160, 365161, 365162, 365163, 365164, 365165, 365166, 365167, 365168, 591403, 591404, 591405, 591406, 591407, 591408, 591409, 591410, 591411, 591412, 1079307, 1079308, 1079309, 1079310, 1079311, 1079312, 1079313, 1079314, 1079315, 1079316, 1079317, 1079318, 1079319, 1079320, 1079321, 1079322, 1079323, 1079324, 1079325, 1079326};
ItemIDsDatabase[43976] = {365254, 43976, 365253, 365255, 365256, 365257, 365258, 365259, 365260, 365261, 365262, 365263, 365264, 365265, 591483, 591484, 591485, 591486, 591487, 591488, 591489, 591490, 591491, 591492, 1079467, 1079468, 1079469, 1079470, 1079471, 1079472, 1079473, 1079474, 1079475, 1079476, 1079477, 1079478, 1079479, 1079480, 1079481, 1079482, 1079483, 1079484, 1079485, 1079486};
ItemIDsDatabase[43977] = {365267, 43977, 365266, 365268, 365269, 365270, 365271, 365272, 365273, 365274, 365275, 365276, 365277, 365278, 591493, 591494, 591495, 591496, 591497, 591498, 591499, 591500, 591501, 591502, 1079487, 1079488, 1079489, 1079490, 1079491, 1079492, 1079493, 1079494, 1079495, 1079496, 1079497, 1079498, 1079499, 1079500, 1079501, 1079502, 1079503, 1079504, 1079505, 1079506};
ItemIDsDatabase[43978] = {365280, 43978, 365279, 365281, 365282, 365283, 365284, 365285, 365286, 365287, 365288, 365289, 365290, 365291, 591503, 591504, 591505, 591506, 591507, 591508, 591509, 591510, 591511, 591512, 1079507, 1079508, 1079509, 1079510, 1079511, 1079512, 1079513, 1079514, 1079515, 1079516, 1079517, 1079518, 1079519, 1079520, 1079521, 1079522, 1079523, 1079524, 1079525, 1079526};
ItemIDsDatabase[43979] = {365293, 43979, 365292, 365294, 365295, 365296, 365297, 365298, 365299, 365300, 365301, 365302, 365303, 365304, 591513, 591514, 591515, 591516, 591517, 591518, 591519, 591520, 591521, 591522, 1079527, 1079528, 1079529, 1079530, 1079531, 1079532, 1079533, 1079534, 1079535, 1079536, 1079537, 1079538, 1079539, 1079540, 1079541, 1079542, 1079543, 1079544, 1079545, 1079546};
ItemIDsDatabase[43980] = {365306, 43980, 365305, 365307, 365308, 365309, 365310, 365311, 365312, 365313, 365314, 365315, 365316, 365317, 591523, 591524, 591525, 591526, 591527, 591528, 591529, 591530, 591531, 591532, 1079547, 1079548, 1079549, 1079550, 1079551, 1079552, 1079553, 1079554, 1079555, 1079556, 1079557, 1079558, 1079559, 1079560, 1079561, 1079562, 1079563, 1079564, 1079565, 1079566};
ItemIDsDatabase[43981] = {365319, 43981, 365318, 365320, 365321, 365322, 365323, 365324, 365325, 365326, 365327, 365328, 365329, 365330, 591533, 591534, 591535, 591536, 591537, 591538, 591539, 591540, 591541, 591542, 1079567, 1079568, 1079569, 1079570, 1079571, 1079572, 1079573, 1079574, 1079575, 1079576, 1079577, 1079578, 1079579, 1079580, 1079581, 1079582, 1079583, 1079584, 1079585, 1079586};
ItemIDsDatabase[43982] = {365332, 43982, 365331, 365333, 365334, 365335, 365336, 365337, 365338, 365339, 365340, 365341, 365342, 365343, 591543, 591544, 591545, 591546, 591547, 591548, 591549, 591550, 591551, 591552, 1079587, 1079588, 1079589, 1079590, 1079591, 1079592, 1079593, 1079594, 1079595, 1079596, 1079597, 1079598, 1079599, 1079600, 1079601, 1079602, 1079603, 1079604, 1079605, 1079606};
ItemIDsDatabase[44013] = {6044013, 44013, 365563, 365564, 365565, 365566, 365567, 365568, 365569, 365570, 365571, 365572, 365573, 365574, 591743, 591744, 591745, 591746, 591747, 591748, 591749, 591750, 591751, 591752, 1079987, 1079988, 1079989, 1079990, 1079991, 1079992, 1079993, 1079994, 1079995, 1079996, 1079997, 1079998, 1079999, 1080000, 1080001, 1080002, 1080003, 1080004, 1080005, 1080006};
ItemIDsDatabase[44014] = {6044014, 44014, 365575, 365576, 365577, 365578, 365579, 365580, 365581, 365582, 365583, 365584, 365585, 365586, 591753, 591754, 591755, 591756, 591757, 591758, 591759, 591760, 591761, 591762, 1080007, 1080008, 1080009, 1080010, 1080011, 1080012, 1080013, 1080014, 1080015, 1080016, 1080017, 1080018, 1080019, 1080020, 1080021, 1080022, 1080023, 1080024, 1080025, 1080026};
ItemIDsDatabase[44015] = {6044015, 44015, 365587, 365588, 365589, 365590, 365591, 365592, 365593, 365594, 365595, 365596, 365597, 365598, 591763, 591764, 591765, 591766, 591767, 591768, 591769, 591770, 591771, 591772, 1080027, 1080028, 1080029, 1080030, 1080031, 1080032, 1080033, 1080034, 1080035, 1080036, 1080037, 1080038, 1080039, 1080040, 1080041, 1080042, 1080043, 1080044, 1080045, 1080046};
ItemIDsDatabase[44016] = {6044016, 44016, 365599, 365600, 365601, 365602, 365603, 365604, 365605, 365606, 365607, 365608, 365609, 365610, 591773, 591774, 591775, 591776, 591777, 591778, 591779, 591780, 591781, 591782, 1080047, 1080048, 1080049, 1080050, 1080051, 1080052, 1080053, 1080054, 1080055, 1080056, 1080057, 1080058, 1080059, 1080060, 1080061, 1080062, 1080063, 1080064, 1080065, 1080066};
ItemIDsDatabase[44017] = {6044017, 44017, 365611, 365612, 365613, 365614, 365615, 365616, 365617, 365618, 365619, 365620, 365621, 365622, 591783, 591784, 591785, 591786, 591787, 591788, 591789, 591790, 591791, 591792, 1080067, 1080068, 1080069, 1080070, 1080071, 1080072, 1080073, 1080074, 1080075, 1080076, 1080077, 1080078, 1080079, 1080080, 1080081, 1080082, 1080083, 1080084, 1080085, 1080086};
ItemIDsDatabase[44018] = {6044018, 44018, 365623, 365624, 365625, 365626, 365627, 365628, 365629, 365630, 365631, 365632, 365633, 365634, 591793, 591794, 591795, 591796, 591797, 591798, 591799, 591800, 591801, 591802, 1080087, 1080088, 1080089, 1080090, 1080091, 1080092, 1080093, 1080094, 1080095, 1080096, 1080097, 1080098, 1080099, 1080100, 1080101, 1080102, 1080103, 1080104, 1080105, 1080106};
ItemIDsDatabase[44019] = {6044019, 44019, 365635, 365636, 365637, 365638, 365639, 365640, 365641, 365642, 365643, 365644, 365645, 365646, 591803, 591804, 591805, 591806, 591807, 591808, 591809, 591810, 591811, 591812, 1080107, 1080108, 1080109, 1080110, 1080111, 1080112, 1080113, 1080114, 1080115, 1080116, 1080117, 1080118, 1080119, 1080120, 1080121, 1080122, 1080123, 1080124, 1080125, 1080126};
ItemIDsDatabase[44020] = {6044020, 44020, 365647, 365648, 365649, 365650, 365651, 365652, 365653, 365654, 365655, 365656, 365657, 365658, 591813, 591814, 591815, 591816, 591817, 591818, 591819, 591820, 591821, 591822, 1080127, 1080128, 1080129, 1080130, 1080131, 1080132, 1080133, 1080134, 1080135, 1080136, 1080137, 1080138, 1080139, 1080140, 1080141, 1080142, 1080143, 1080144, 1080145, 1080146};
ItemIDsDatabase[44021] = {6044021, 44021, 365659, 365660, 365661, 365662, 365663, 365664, 365665, 365666, 365667, 365668, 365669, 365670, 591823, 591824, 591825, 591826, 591827, 591828, 591829, 591830, 591831, 591832, 1080147, 1080148, 1080149, 1080150, 1080151, 1080152, 1080153, 1080154, 1080155, 1080156, 1080157, 1080158, 1080159, 1080160, 1080161, 1080162, 1080163, 1080164, 1080165, 1080166};
ItemIDsDatabase[44022] = {6044022, 44022, 365671, 365672, 365673, 365674, 365675, 365676, 365677, 365678, 365679, 365680, 365681, 365682, 591833, 591834, 591835, 591836, 591837, 591838, 591839, 591840, 591841, 591842, 1080167, 1080168, 1080169, 1080170, 1080171, 1080172, 1080173, 1080174, 1080175, 1080176, 1080177, 1080178, 1080179, 1080180, 1080181, 1080182, 1080183, 1080184, 1080185, 1080186};
ItemIDsDatabase[44023] = {6044023, 44023, 365683, 365684, 365685, 365686, 365687, 365688, 365689, 365690, 365691, 365692, 365693, 365694, 591843, 591844, 591845, 591846, 591847, 591848, 591849, 591850, 591851, 591852, 1080187, 1080188, 1080189, 1080190, 1080191, 1080192, 1080193, 1080194, 1080195, 1080196, 1080197, 1080198, 1080199, 1080200, 1080201, 1080202, 1080203, 1080204, 1080205, 1080206};
ItemIDsDatabase[44024] = {6044024, 44024, 365695, 365696, 365697, 365698, 365699, 365700, 365701, 365702, 365703, 365704, 365705, 365706, 591853, 591854, 591855, 591856, 591857, 591858, 591859, 591860, 591861, 591862, 1080207, 1080208, 1080209, 1080210, 1080211, 1080212, 1080213, 1080214, 1080215, 1080216, 1080217, 1080218, 1080219, 1080220, 1080221, 1080222, 1080223, 1080224, 1080225, 1080226};
ItemIDsDatabase[44025] = {6044025, 44025, 365707, 365708, 365709, 365710, 365711, 365712, 365713, 365714, 365715, 365716, 365717, 365718, 591863, 591864, 591865, 591866, 591867, 591868, 591869, 591870, 591871, 591872, 1080227, 1080228, 1080229, 1080230, 1080231, 1080232, 1080233, 1080234, 1080235, 1080236, 1080237, 1080238, 1080239, 1080240, 1080241, 1080242, 1080243, 1080244, 1080245, 1080246};
ItemIDsDatabase[44026] = {6044026, 44026, 365719, 365720, 365721, 365722, 365723, 365724, 365725, 365726, 365727, 365728, 365729, 365730, 591873, 591874, 591875, 591876, 591877, 591878, 591879, 591880, 591881, 591882, 1080247, 1080248, 1080249, 1080250, 1080251, 1080252, 1080253, 1080254, 1080255, 1080256, 1080257, 1080258, 1080259, 1080260, 1080261, 1080262, 1080263, 1080264, 1080265, 1080266};
ItemIDsDatabase[44027] = {6044027, 44027, 365731, 365732, 365733, 365734, 365735, 365736, 365737, 365738, 365739, 365740, 365741, 365742, 591883, 591884, 591885, 591886, 591887, 591888, 591889, 591890, 591891, 591892, 1080267, 1080268, 1080269, 1080270, 1080271, 1080272, 1080273, 1080274, 1080275, 1080276, 1080277, 1080278, 1080279, 1080280, 1080281, 1080282, 1080283, 1080284, 1080285, 1080286};
ItemIDsDatabase[44028] = {6044028, 44028, 365743, 365744, 365745, 365746, 365747, 365748, 365749, 365750, 365751, 365752, 365753, 365754, 591893, 591894, 591895, 591896, 591897, 591898, 591899, 591900, 591901, 591902, 1080287, 1080288, 1080289, 1080290, 1080291, 1080292, 1080293, 1080294, 1080295, 1080296, 1080297, 1080298, 1080299, 1080300, 1080301, 1080302, 1080303, 1080304, 1080305, 1080306};
ItemIDsDatabase[44029] = {6044029, 44029, 365755, 365756, 365757, 365758, 365759, 365760, 365761, 365762, 365763, 365764, 365765, 365766, 591903, 591904, 591905, 591906, 591907, 591908, 591909, 591910, 591911, 591912, 1080307, 1080308, 1080309, 1080310, 1080311, 1080312, 1080313, 1080314, 1080315, 1080316, 1080317, 1080318, 1080319, 1080320, 1080321, 1080322, 1080323, 1080324, 1080325, 1080326};
ItemIDsDatabase[44030] = {6044030, 44030, 365767, 365768, 365769, 365770, 365771, 365772, 365773, 365774, 365775, 365776, 365777, 365778, 591913, 591914, 591915, 591916, 591917, 591918, 591919, 591920, 591921, 591922, 1080327, 1080328, 1080329, 1080330, 1080331, 1080332, 1080333, 1080334, 1080335, 1080336, 1080337, 1080338, 1080339, 1080340, 1080341, 1080342, 1080343, 1080344, 1080345, 1080346};
ItemIDsDatabase[44031] = {6044031, 44031, 365779, 365780, 365781, 365782, 365783, 365784, 365785, 365786, 365787, 365788, 365789, 365790, 591923, 591924, 591925, 591926, 591927, 591928, 591929, 591930, 591931, 591932, 1080347, 1080348, 1080349, 1080350, 1080351, 1080352, 1080353, 1080354, 1080355, 1080356, 1080357, 1080358, 1080359, 1080360, 1080361, 1080362, 1080363, 1080364, 1080365, 1080366};
ItemIDsDatabase[44032] = {6044032, 44032, 365791, 365792, 365793, 365794, 365795, 365796, 365797, 365798, 365799, 365800, 365801, 365802, 591933, 591934, 591935, 591936, 591937, 591938, 591939, 591940, 591941, 591942, 1080367, 1080368, 1080369, 1080370, 1080371, 1080372, 1080373, 1080374, 1080375, 1080376, 1080377, 1080378, 1080379, 1080380, 1080381, 1080382, 1080383, 1080384, 1080385, 1080386};
ItemIDsDatabase[44033] = {6044033, 44033, 365803, 365804, 365805, 365806, 365807, 365808, 365809, 365810, 365811, 365812, 365813, 365814, 591943, 591944, 591945, 591946, 591947, 591948, 591949, 591950, 591951, 591952, 1080387, 1080388, 1080389, 1080390, 1080391, 1080392, 1080393, 1080394, 1080395, 1080396, 1080397, 1080398, 1080399, 1080400, 1080401, 1080402, 1080403, 1080404, 1080405, 1080406};
ItemIDsDatabase[44034] = {6044034, 44034, 365815, 365816, 365817, 365818, 365819, 365820, 365821, 365822, 365823, 365824, 365825, 365826, 591953, 591954, 591955, 591956, 591957, 591958, 591959, 591960, 591961, 591962, 1080407, 1080408, 1080409, 1080410, 1080411, 1080412, 1080413, 1080414, 1080415, 1080416, 1080417, 1080418, 1080419, 1080420, 1080421, 1080422, 1080423, 1080424, 1080425, 1080426};
ItemIDsDatabase[44035] = {6044035, 44035, 365827, 365828, 365829, 365830, 365831, 365832, 365833, 365834, 365835, 365836, 365837, 365838, 591963, 591964, 591965, 591966, 591967, 591968, 591969, 591970, 591971, 591972, 1080427, 1080428, 1080429, 1080430, 1080431, 1080432, 1080433, 1080434, 1080435, 1080436, 1080437, 1080438, 1080439, 1080440, 1080441, 1080442, 1080443, 1080444, 1080445, 1080446};
ItemIDsDatabase[44036] = {6044036, 44036, 365839, 365840, 365841, 365842, 365843, 365844, 365845, 365846, 365847, 365848, 365849, 365850, 591973, 591974, 591975, 591976, 591977, 591978, 591979, 591980, 591981, 591982, 1080447, 1080448, 1080449, 1080450, 1080451, 1080452, 1080453, 1080454, 1080455, 1080456, 1080457, 1080458, 1080459, 1080460, 1080461, 1080462, 1080463, 1080464, 1080465, 1080466};
ItemIDsDatabase[44037] = {6044037, 44037, 365851, 365852, 365853, 365854, 365855, 365856, 365857, 365858, 365859, 365860, 365861, 365862, 591983, 591984, 591985, 591986, 591987, 591988, 591989, 591990, 591991, 591992, 1080467, 1080468, 1080469, 1080470, 1080471, 1080472, 1080473, 1080474, 1080475, 1080476, 1080477, 1080478, 1080479, 1080480, 1080481, 1080482, 1080483, 1080484, 1080485, 1080486};
ItemIDsDatabase[44038] = {6044038, 44038, 365863, 365864, 365865, 365866, 365867, 365868, 365869, 365870, 365871, 365872, 365873, 365874, 591993, 591994, 591995, 591996, 591997, 591998, 591999, 592000, 592001, 592002, 1080487, 1080488, 1080489, 1080490, 1080491, 1080492, 1080493, 1080494, 1080495, 1080496, 1080497, 1080498, 1080499, 1080500, 1080501, 1080502, 1080503, 1080504, 1080505, 1080506};
ItemIDsDatabase[44039] = {6044039, 44039, 365875, 365876, 365877, 365878, 365879, 365880, 365881, 365882, 365883, 365884, 365885, 365886, 592003, 592004, 592005, 592006, 592007, 592008, 592009, 592010, 592011, 592012, 1080507, 1080508, 1080509, 1080510, 1080511, 1080512, 1080513, 1080514, 1080515, 1080516, 1080517, 1080518, 1080519, 1080520, 1080521, 1080522, 1080523, 1080524, 1080525, 1080526};
ItemIDsDatabase[44040] = {6044040, 44040, 365887, 365888, 365889, 365890, 365891, 365892, 365893, 365894, 365895, 365896, 365897, 365898, 592013, 592014, 592015, 592016, 592017, 592018, 592019, 592020, 592021, 592022, 1080527, 1080528, 1080529, 1080530, 1080531, 1080532, 1080533, 1080534, 1080535, 1080536, 1080537, 1080538, 1080539, 1080540, 1080541, 1080542, 1080543, 1080544, 1080545, 1080546};
ItemIDsDatabase[44041] = {6044041, 44041, 365899, 365900, 365901, 365902, 365903, 365904, 365905, 365906, 365907, 365908, 365909, 365910, 592023, 592024, 592025, 592026, 592027, 592028, 592029, 592030, 592031, 592032, 1080547, 1080548, 1080549, 1080550, 1080551, 1080552, 1080553, 1080554, 1080555, 1080556, 1080557, 1080558, 1080559, 1080560, 1080561, 1080562, 1080563, 1080564, 1080565, 1080566};
ItemIDsDatabase[44042] = {6044042, 44042, 365911, 365912, 365913, 365914, 365915, 365916, 365917, 365918, 365919, 365920, 365921, 365922, 592033, 592034, 592035, 592036, 592037, 592038, 592039, 592040, 592041, 592042, 1080567, 1080568, 1080569, 1080570, 1080571, 1080572, 1080573, 1080574, 1080575, 1080576, 1080577, 1080578, 1080579, 1080580, 1080581, 1080582, 1080583, 1080584, 1080585, 1080586};
ItemIDsDatabase[44043] = {6044043, 44043, 365923, 365924, 365925, 365926, 365927, 365928, 365929, 365930, 365931, 365932, 365933, 365934, 592043, 592044, 592045, 592046, 592047, 592048, 592049, 592050, 592051, 592052, 1080587, 1080588, 1080589, 1080590, 1080591, 1080592, 1080593, 1080594, 1080595, 1080596, 1080597, 1080598, 1080599, 1080600, 1080601, 1080602, 1080603, 1080604, 1080605, 1080606};
ItemIDsDatabase[44044] = {6044044, 44044, 365935, 365936, 365937, 365938, 365939, 365940, 365941, 365942, 365943, 365944, 365945, 365946, 592053, 592054, 592055, 592056, 592057, 592058, 592059, 592060, 592061, 592062, 1080607, 1080608, 1080609, 1080610, 1080611, 1080612, 1080613, 1080614, 1080615, 1080616, 1080617, 1080618, 1080619, 1080620, 1080621, 1080622, 1080623, 1080624, 1080625, 1080626};
ItemIDsDatabase[44045] = {6044045, 44045, 365947, 365948, 365949, 365950, 365951, 365952, 365953, 365954, 365955, 365956, 365957, 365958, 592063, 592064, 592065, 592066, 592067, 592068, 592069, 592070, 592071, 592072, 1080627, 1080628, 1080629, 1080630, 1080631, 1080632, 1080633, 1080634, 1080635, 1080636, 1080637, 1080638, 1080639, 1080640, 1080641, 1080642, 1080643, 1080644, 1080645, 1080646};
ItemIDsDatabase[44046] = {6044046, 44046, 365959, 365960, 365961, 365962, 365963, 365964, 365965, 365966, 365967, 365968, 365969, 365970, 592073, 592074, 592075, 592076, 592077, 592078, 592079, 592080, 592081, 592082, 1080647, 1080648, 1080649, 1080650, 1080651, 1080652, 1080653, 1080654, 1080655, 1080656, 1080657, 1080658, 1080659, 1080660, 1080661, 1080662, 1080663, 1080664, 1080665, 1080666};
ItemIDsDatabase[44051] = {6044051, 44051, 365983, 365984, 365985, 365986, 365987, 365988, 365989, 365990, 365991, 365992, 365993, 365994, 592093, 592094, 592095, 592096, 592097, 592098, 592099, 592100, 592101, 592102, 1080687, 1080688, 1080689, 1080690, 1080691, 1080692, 1080693, 1080694, 1080695, 1080696, 1080697, 1080698, 1080699, 1080700, 1080701, 1080702, 1080703, 1080704, 1080705, 1080706};
ItemIDsDatabase[44052] = {6044052, 44052, 365995, 365996, 365997, 365998, 365999, 366000, 366001, 366002, 366003, 366004, 366005, 366006, 592103, 592104, 592105, 592106, 592107, 592108, 592109, 592110, 592111, 592112, 1080707, 1080708, 1080709, 1080710, 1080711, 1080712, 1080713, 1080714, 1080715, 1080716, 1080717, 1080718, 1080719, 1080720, 1080721, 1080722, 1080723, 1080724, 1080725, 1080726};
ItemIDsDatabase[44053] = {6044053, 44053, 366007, 366008, 366009, 366010, 366011, 366012, 366013, 366014, 366015, 366016, 366017, 366018, 592113, 592114, 592115, 592116, 592117, 592118, 592119, 592120, 592121, 592122, 1080727, 1080728, 1080729, 1080730, 1080731, 1080732, 1080733, 1080734, 1080735, 1080736, 1080737, 1080738, 1080739, 1080740, 1080741, 1080742, 1080743, 1080744, 1080745, 1080746};
ItemIDsDatabase[44054] = {6044054, 44054, 366019, 366020, 366021, 366022, 366023, 366024, 366025, 366026, 366027, 366028, 366029, 366030, 592123, 592124, 592125, 592126, 592127, 592128, 592129, 592130, 592131, 592132, 1080747, 1080748, 1080749, 1080750, 1080751, 1080752, 1080753, 1080754, 1080755, 1080756, 1080757, 1080758, 1080759, 1080760, 1080761, 1080762, 1080763, 1080764, 1080765, 1080766};
ItemIDsDatabase[44055] = {6044055, 44055, 366031, 366032, 366033, 366034, 366035, 366036, 366037, 366038, 366039, 366040, 366041, 366042, 592133, 592134, 592135, 592136, 592137, 592138, 592139, 592140, 592141, 592142, 1080767, 1080768, 1080769, 1080770, 1080771, 1080772, 1080773, 1080774, 1080775, 1080776, 1080777, 1080778, 1080779, 1080780, 1080781, 1080782, 1080783, 1080784, 1080785, 1080786};
ItemIDsDatabase[44057] = {6044057, 44057, 366043, 366044, 366045, 366046, 366047, 366048, 366049, 366050, 366051, 366052, 366053, 366054, 592143, 592144, 592145, 592146, 592147, 592148, 592149, 592150, 592151, 592152, 1080787, 1080788, 1080789, 1080790, 1080791, 1080792, 1080793, 1080794, 1080795, 1080796, 1080797, 1080798, 1080799, 1080800, 1080801, 1080802, 1080803, 1080804, 1080805, 1080806};
ItemIDsDatabase[44058] = {6044058, 44058, 366055, 366056, 366057, 366058, 366059, 366060, 366061, 366062, 366063, 366064, 366065, 366066, 592153, 592154, 592155, 592156, 592157, 592158, 592159, 592160, 592161, 592162, 1080807, 1080808, 1080809, 1080810, 1080811, 1080812, 1080813, 1080814, 1080815, 1080816, 1080817, 1080818, 1080819, 1080820, 1080821, 1080822, 1080823, 1080824, 1080825, 1080826};
ItemIDsDatabase[44059] = {6044059, 44059, 366067, 366068, 366069, 366070, 366071, 366072, 366073, 366074, 366075, 366076, 366077, 366078, 592163, 592164, 592165, 592166, 592167, 592168, 592169, 592170, 592171, 592172, 1080827, 1080828, 1080829, 1080830, 1080831, 1080832, 1080833, 1080834, 1080835, 1080836, 1080837, 1080838, 1080839, 1080840, 1080841, 1080842, 1080843, 1080844, 1080845, 1080846};
ItemIDsDatabase[44060] = {6044060, 44060, 366079, 366080, 366081, 366082, 366083, 366084, 366085, 366086, 366087, 366088, 366089, 366090, 592173, 592174, 592175, 592176, 592177, 592178, 592179, 592180, 592181, 592182, 1080847, 1080848, 1080849, 1080850, 1080851, 1080852, 1080853, 1080854, 1080855, 1080856, 1080857, 1080858, 1080859, 1080860, 1080861, 1080862, 1080863, 1080864, 1080865, 1080866};
ItemIDsDatabase[44061] = {6044061, 44061, 366091, 366092, 366093, 366094, 366095, 366096, 366097, 366098, 366099, 366100, 366101, 366102, 592183, 592184, 592185, 592186, 592187, 592188, 592189, 592190, 592191, 592192, 1080867, 1080868, 1080869, 1080870, 1080871, 1080872, 1080873, 1080874, 1080875, 1080876, 1080877, 1080878, 1080879, 1080880, 1080881, 1080882, 1080883, 1080884, 1080885, 1080886};
ItemIDsDatabase[44062] = {6044062, 44062, 366103, 366104, 366105, 366106, 366107, 366108, 366109, 366110, 366111, 366112, 366113, 366114, 592193, 592194, 592195, 592196, 592197, 592198, 592199, 592200, 592201, 592202, 1080887, 1080888, 1080889, 1080890, 1080891, 1080892, 1080893, 1080894, 1080895, 1080896, 1080897, 1080898, 1080899, 1080900, 1080901, 1080902, 1080903, 1080904, 1080905, 1080906};
ItemIDsDatabase[44104] = {6044104, 44104, 366333, 366334, 366335, 366336, 366337, 366338, 366339, 366340, 366341, 366342, 366343, 366344, 592373, 592374, 592375, 592376, 592377, 592378, 592379, 592380, 592381, 592382, 1081247, 1081248, 1081249, 1081250, 1081251, 1081252, 1081253, 1081254, 1081255, 1081256, 1081257, 1081258, 1081259, 1081260, 1081261, 1081262, 1081263, 1081264, 1081265, 1081266};
ItemIDsDatabase[44106] = {6044106, 44106, 366358, 366359, 366360, 366361, 366362, 366363, 366364, 366365, 366366, 366367, 366368, 366369, 592393, 592394, 592395, 592396, 592397, 592398, 592399, 592400, 592401, 592402, 1081287, 1081288, 1081289, 1081290, 1081291, 1081292, 1081293, 1081294, 1081295, 1081296, 1081297, 1081298, 1081299, 1081300, 1081301, 1081302, 1081303, 1081304, 1081305, 1081306};
ItemIDsDatabase[44108] = {6044108, 44108, 366383, 366384, 366385, 366386, 366387, 366388, 366389, 366390, 366391, 366392, 366393, 366394, 592413, 592414, 592415, 592416, 592417, 592418, 592419, 592420, 592421, 592422, 1081327, 1081328, 1081329, 1081330, 1081331, 1081332, 1081333, 1081334, 1081335, 1081336, 1081337, 1081338, 1081339, 1081340, 1081341, 1081342, 1081343, 1081344, 1081345, 1081346};
ItemIDsDatabase[44109] = {6044109, 44109, 366395, 366396, 366397, 366398, 366399, 366400, 366401, 366402, 366403, 366404, 366405, 366406, 592423, 592424, 592425, 592426, 592427, 592428, 592429, 592430, 592431, 592432, 1081347, 1081348, 1081349, 1081350, 1081351, 1081352, 1081353, 1081354, 1081355, 1081356, 1081357, 1081358, 1081359, 1081360, 1081361, 1081362, 1081363, 1081364, 1081365, 1081366};
ItemIDsDatabase[44110] = {6044110, 44110, 366407, 366408, 366409, 366410, 366411, 366412, 366413, 366414, 366415, 366416, 366417, 366418, 592433, 592434, 592435, 592436, 592437, 592438, 592439, 592440, 592441, 592442, 1081367, 1081368, 1081369, 1081370, 1081371, 1081372, 1081373, 1081374, 1081375, 1081376, 1081377, 1081378, 1081379, 1081380, 1081381, 1081382, 1081383, 1081384, 1081385, 1081386};
ItemIDsDatabase[44111] = {6044111, 44111, 366419, 366420, 366421, 366422, 366423, 366424, 366425, 366426, 366427, 366428, 366429, 366430, 592443, 592444, 592445, 592446, 592447, 592448, 592449, 592450, 592451, 592452, 1081387, 1081388, 1081389, 1081390, 1081391, 1081392, 1081393, 1081394, 1081395, 1081396, 1081397, 1081398, 1081399, 1081400, 1081401, 1081402, 1081403, 1081404, 1081405, 1081406};
ItemIDsDatabase[44112] = {6044112, 44112, 366431, 366432, 366433, 366434, 366435, 366436, 366437, 366438, 366439, 366440, 366441, 366442, 592453, 592454, 592455, 592456, 592457, 592458, 592459, 592460, 592461, 592462, 1081407, 1081408, 1081409, 1081410, 1081411, 1081412, 1081413, 1081414, 1081415, 1081416, 1081417, 1081418, 1081419, 1081420, 1081421, 1081422, 1081423, 1081424, 1081425, 1081426};
ItemIDsDatabase[44116] = {6044116, 44116, 366443, 366444, 366445, 366446, 366447, 366448, 366449, 366450, 366451, 366452, 366453, 366454, 592463, 592464, 592465, 592466, 592467, 592468, 592469, 592470, 592471, 592472, 1081427, 1081428, 1081429, 1081430, 1081431, 1081432, 1081433, 1081434, 1081435, 1081436, 1081437, 1081438, 1081439, 1081440, 1081441, 1081442, 1081443, 1081444, 1081445, 1081446};
ItemIDsDatabase[44117] = {6044117, 44117, 366455, 366456, 366457, 366458, 366459, 366460, 366461, 366462, 366463, 366464, 366465, 366466, 592473, 592474, 592475, 592476, 592477, 592478, 592479, 592480, 592481, 592482, 1081447, 1081448, 1081449, 1081450, 1081451, 1081452, 1081453, 1081454, 1081455, 1081456, 1081457, 1081458, 1081459, 1081460, 1081461, 1081462, 1081463, 1081464, 1081465, 1081466};
ItemIDsDatabase[44118] = {6044118, 44118, 366467, 366468, 366469, 366470, 366471, 366472, 366473, 366474, 366475, 366476, 366477, 366478, 592483, 592484, 592485, 592486, 592487, 592488, 592489, 592490, 592491, 592492, 1081467, 1081468, 1081469, 1081470, 1081471, 1081472, 1081473, 1081474, 1081475, 1081476, 1081477, 1081478, 1081479, 1081480, 1081481, 1081482, 1081483, 1081484, 1081485, 1081486};
ItemIDsDatabase[44120] = {6044120, 44120, 366479, 366480, 366481, 366482, 366483, 366484, 366485, 366486, 366487, 366488, 366489, 366490, 592493, 592494, 592495, 592496, 592497, 592498, 592499, 592500, 592501, 592502, 1081487, 1081488, 1081489, 1081490, 1081491, 1081492, 1081493, 1081494, 1081495, 1081496, 1081497, 1081498, 1081499, 1081500, 1081501, 1081502, 1081503, 1081504, 1081505, 1081506};
ItemIDsDatabase[44121] = {6044121, 44121, 366491, 366492, 366493, 366494, 366495, 366496, 366497, 366498, 366499, 366500, 366501, 366502, 592503, 592504, 592505, 592506, 592507, 592508, 592509, 592510, 592511, 592512, 1081507, 1081508, 1081509, 1081510, 1081511, 1081512, 1081513, 1081514, 1081515, 1081516, 1081517, 1081518, 1081519, 1081520, 1081521, 1081522, 1081523, 1081524, 1081525, 1081526};
ItemIDsDatabase[44122] = {6044122, 44122, 366503, 366504, 366505, 366506, 366507, 366508, 366509, 366510, 366511, 366512, 366513, 366514, 592513, 592514, 592515, 592516, 592517, 592518, 592519, 592520, 592521, 592522, 1081527, 1081528, 1081529, 1081530, 1081531, 1081532, 1081533, 1081534, 1081535, 1081536, 1081537, 1081538, 1081539, 1081540, 1081541, 1081542, 1081543, 1081544, 1081545, 1081546};
ItemIDsDatabase[44123] = {6044123, 44123, 366515, 366516, 366517, 366518, 366519, 366520, 366521, 366522, 366523, 366524, 366525, 366526, 592523, 592524, 592525, 592526, 592527, 592528, 592529, 592530, 592531, 592532, 1081547, 1081548, 1081549, 1081550, 1081551, 1081552, 1081553, 1081554, 1081555, 1081556, 1081557, 1081558, 1081559, 1081560, 1081561, 1081562, 1081563, 1081564, 1081565, 1081566};
ItemIDsDatabase[44166] = {6044166, 44166, 366527, 366528, 366529, 366530, 366531, 366532, 366533, 366534, 366535, 366536, 366537, 366538, 592533, 592534, 592535, 592536, 592537, 592538, 592539, 592540, 592541, 592542, 1081567, 1081568, 1081569, 1081570, 1081571, 1081572, 1081573, 1081574, 1081575, 1081576, 1081577, 1081578, 1081579, 1081580, 1081581, 1081582, 1081583, 1081584, 1081585, 1081586};
ItemIDsDatabase[44167] = {6044167, 44167, 366539, 366540, 366541, 366542, 366543, 366544, 366545, 366546, 366547, 366548, 366549, 366550, 592543, 592544, 592545, 592546, 592547, 592548, 592549, 592550, 592551, 592552, 1081587, 1081588, 1081589, 1081590, 1081591, 1081592, 1081593, 1081594, 1081595, 1081596, 1081597, 1081598, 1081599, 1081600, 1081601, 1081602, 1081603, 1081604, 1081605, 1081606};
ItemIDsDatabase[44170] = {6044170, 44170, 366551, 366552, 366553, 366554, 366555, 366556, 366557, 366558, 366559, 366560, 366561, 366562, 592553, 592554, 592555, 592556, 592557, 592558, 592559, 592560, 592561, 592562, 1081607, 1081608, 1081609, 1081610, 1081611, 1081612, 1081613, 1081614, 1081615, 1081616, 1081617, 1081618, 1081619, 1081620, 1081621, 1081622, 1081623, 1081624, 1081625, 1081626};
ItemIDsDatabase[44187] = {6044187, 44187, 366671, 366672, 366673, 366674, 366675, 366676, 366677, 366678, 366679, 366680, 366681, 366682, 592653, 592654, 592655, 592656, 592657, 592658, 592659, 592660, 592661, 592662, 1081807, 1081808, 1081809, 1081810, 1081811, 1081812, 1081813, 1081814, 1081815, 1081816, 1081817, 1081818, 1081819, 1081820, 1081821, 1081822, 1081823, 1081824, 1081825, 1081826};
ItemIDsDatabase[44188] = {6044188, 44188, 366683, 366684, 366685, 366686, 366687, 366688, 366689, 366690, 366691, 366692, 366693, 366694, 592663, 592664, 592665, 592666, 592667, 592668, 592669, 592670, 592671, 592672, 1081827, 1081828, 1081829, 1081830, 1081831, 1081832, 1081833, 1081834, 1081835, 1081836, 1081837, 1081838, 1081839, 1081840, 1081841, 1081842, 1081843, 1081844, 1081845, 1081846};
ItemIDsDatabase[44189] = {6044189, 44189, 366695, 366696, 366697, 366698, 366699, 366700, 366701, 366702, 366703, 366704, 366705, 366706, 592673, 592674, 592675, 592676, 592677, 592678, 592679, 592680, 592681, 592682, 1081847, 1081848, 1081849, 1081850, 1081851, 1081852, 1081853, 1081854, 1081855, 1081856, 1081857, 1081858, 1081859, 1081860, 1081861, 1081862, 1081863, 1081864, 1081865, 1081866};
ItemIDsDatabase[44190] = {6044190, 44190, 366707, 366708, 366709, 366710, 366711, 366712, 366713, 366714, 366715, 366716, 366717, 366718, 592683, 592684, 592685, 592686, 592687, 592688, 592689, 592690, 592691, 592692, 1081867, 1081868, 1081869, 1081870, 1081871, 1081872, 1081873, 1081874, 1081875, 1081876, 1081877, 1081878, 1081879, 1081880, 1081881, 1081882, 1081883, 1081884, 1081885, 1081886};
ItemIDsDatabase[44196] = {6044196, 44196, 366779, 366780, 366781, 366782, 366783, 366784, 366785, 366786, 366787, 366788, 366789, 366790, 592743, 592744, 592745, 592746, 592747, 592748, 592749, 592750, 592751, 592752, 1081987, 1081988, 1081989, 1081990, 1081991, 1081992, 1081993, 1081994, 1081995, 1081996, 1081997, 1081998, 1081999, 1082000, 1082001, 1082002, 1082003, 1082004, 1082005, 1082006};
ItemIDsDatabase[44197] = {6044197, 44197, 366791, 366792, 366793, 366794, 366795, 366796, 366797, 366798, 366799, 366800, 366801, 366802, 592753, 592754, 592755, 592756, 592757, 592758, 592759, 592760, 592761, 592762, 1082007, 1082008, 1082009, 1082010, 1082011, 1082012, 1082013, 1082014, 1082015, 1082016, 1082017, 1082018, 1082019, 1082020, 1082021, 1082022, 1082023, 1082024, 1082025, 1082026};
ItemIDsDatabase[44211] = {366912, 44211, 366911, 366913, 366914, 366915, 366916, 366917, 366918, 366919, 366920, 366921, 366922, 366923, 592853, 592854, 592855, 592856, 592857, 592858, 592859, 592860, 592861, 592862, 1082207, 1082208, 1082209, 1082210, 1082211, 1082212, 1082213, 1082214, 1082215, 1082216, 1082217, 1082218, 1082219, 1082220, 1082221, 1082222, 1082223, 1082224, 1082225, 1082226};
ItemIDsDatabase[44214] = {6044214, 44214, 366937, 366938, 366939, 366940, 366941, 366942, 366943, 366944, 366945, 366946, 366947, 366948, 592873, 592874, 592875, 592876, 592877, 592878, 592879, 592880, 592881, 592882, 1082247, 1082248, 1082249, 1082250, 1082251, 1082252, 1082253, 1082254, 1082255, 1082256, 1082257, 1082258, 1082259, 1082260, 1082261, 1082262, 1082263, 1082264, 1082265, 1082266};
ItemIDsDatabase[44216] = {6044216, 44216, 366962, 366963, 366964, 366965, 366966, 366967, 366968, 366969, 366970, 366971, 366972, 366973, 592893, 592894, 592895, 592896, 592897, 592898, 592899, 592900, 592901, 592902, 1082287, 1082288, 1082289, 1082290, 1082291, 1082292, 1082293, 1082294, 1082295, 1082296, 1082297, 1082298, 1082299, 1082300, 1082301, 1082302, 1082303, 1082304, 1082305, 1082306};
ItemIDsDatabase[44239] = {6044239, 44239, 367010, 367011, 367012, 367013, 367014, 367015, 367016, 367017, 367018, 367019, 367020, 367021, 592933, 592934, 592935, 592936, 592937, 592938, 592939, 592940, 592941, 592942, 1082367, 1082368, 1082369, 1082370, 1082371, 1082372, 1082373, 1082374, 1082375, 1082376, 1082377, 1082378, 1082379, 1082380, 1082381, 1082382, 1082383, 1082384, 1082385, 1082386};
ItemIDsDatabase[44240] = {6044240, 44240, 367022, 367023, 367024, 367025, 367026, 367027, 367028, 367029, 367030, 367031, 367032, 367033, 592943, 592944, 592945, 592946, 592947, 592948, 592949, 592950, 592951, 592952, 1082387, 1082388, 1082389, 1082390, 1082391, 1082392, 1082393, 1082394, 1082395, 1082396, 1082397, 1082398, 1082399, 1082400, 1082401, 1082402, 1082403, 1082404, 1082405, 1082406};
ItemIDsDatabase[44241] = {6044241, 44241, 367034, 367035, 367036, 367037, 367038, 367039, 367040, 367041, 367042, 367043, 367044, 367045, 592953, 592954, 592955, 592956, 592957, 592958, 592959, 592960, 592961, 592962, 1082407, 1082408, 1082409, 1082410, 1082411, 1082412, 1082413, 1082414, 1082415, 1082416, 1082417, 1082418, 1082419, 1082420, 1082421, 1082422, 1082423, 1082424, 1082425, 1082426};
ItemIDsDatabase[44242] = {6044242, 44242, 367046, 367047, 367048, 367049, 367050, 367051, 367052, 367053, 367054, 367055, 367056, 367057, 592963, 592964, 592965, 592966, 592967, 592968, 592969, 592970, 592971, 592972, 1082427, 1082428, 1082429, 1082430, 1082431, 1082432, 1082433, 1082434, 1082435, 1082436, 1082437, 1082438, 1082439, 1082440, 1082441, 1082442, 1082443, 1082444, 1082445, 1082446};
ItemIDsDatabase[44243] = {6044243, 44243, 367058, 367059, 367060, 367061, 367062, 367063, 367064, 367065, 367066, 367067, 367068, 367069, 592973, 592974, 592975, 592976, 592977, 592978, 592979, 592980, 592981, 592982, 1082447, 1082448, 1082449, 1082450, 1082451, 1082452, 1082453, 1082454, 1082455, 1082456, 1082457, 1082458, 1082459, 1082460, 1082461, 1082462, 1082463, 1082464, 1082465, 1082466};
ItemIDsDatabase[44334] = {6044334, 44334, 367433, 367434, 367435, 367436, 367437, 367438, 367439, 367440, 367441, 367442, 367443, 367444, 593283, 593284, 593285, 593286, 593287, 593288, 593289, 593290, 593291, 593292, 1083067, 1083068, 1083069, 1083070, 1083071, 1083072, 1083073, 1083074, 1083075, 1083076, 1083077, 1083078, 1083079, 1083080, 1083081, 1083082, 1083083, 1083084, 1083085, 1083086};
ItemIDsDatabase[44335] = {6044335, 44335, 367445, 367446, 367447, 367448, 367449, 367450, 367451, 367452, 367453, 367454, 367455, 367456, 593293, 593294, 593295, 593296, 593297, 593298, 593299, 593300, 593301, 593302, 1083087, 1083088, 1083089, 1083090, 1083091, 1083092, 1083093, 1083094, 1083095, 1083096, 1083097, 1083098, 1083099, 1083100, 1083101, 1083102, 1083103, 1083104, 1083105, 1083106};
ItemIDsDatabase[44336] = {6044336, 44336, 367457, 367458, 367459, 367460, 367461, 367462, 367463, 367464, 367465, 367466, 367467, 367468, 593303, 593304, 593305, 593306, 593307, 593308, 593309, 593310, 593311, 593312, 1083107, 1083108, 1083109, 1083110, 1083111, 1083112, 1083113, 1083114, 1083115, 1083116, 1083117, 1083118, 1083119, 1083120, 1083121, 1083122, 1083123, 1083124, 1083125, 1083126};
ItemIDsDatabase[44337] = {6044337, 44337, 367469, 367470, 367471, 367472, 367473, 367474, 367475, 367476, 367477, 367478, 367479, 367480, 593313, 593314, 593315, 593316, 593317, 593318, 593319, 593320, 593321, 593322, 1083127, 1083128, 1083129, 1083130, 1083131, 1083132, 1083133, 1083134, 1083135, 1083136, 1083137, 1083138, 1083139, 1083140, 1083141, 1083142, 1083143, 1083144, 1083145, 1083146};
ItemIDsDatabase[44338] = {6044338, 44338, 367481, 367482, 367483, 367484, 367485, 367486, 367487, 367488, 367489, 367490, 367491, 367492, 593323, 593324, 593325, 593326, 593327, 593328, 593329, 593330, 593331, 593332, 1083147, 1083148, 1083149, 1083150, 1083151, 1083152, 1083153, 1083154, 1083155, 1083156, 1083157, 1083158, 1083159, 1083160, 1083161, 1083162, 1083163, 1083164, 1083165, 1083166};
ItemIDsDatabase[44339] = {6044339, 44339, 367493, 367494, 367495, 367496, 367497, 367498, 367499, 367500, 367501, 367502, 367503, 367504, 593333, 593334, 593335, 593336, 593337, 593338, 593339, 593340, 593341, 593342, 1083167, 1083168, 1083169, 1083170, 1083171, 1083172, 1083173, 1083174, 1083175, 1083176, 1083177, 1083178, 1083179, 1083180, 1083181, 1083182, 1083183, 1083184, 1083185, 1083186};
ItemIDsDatabase[44340] = {6044340, 44340, 367505, 367506, 367507, 367508, 367509, 367510, 367511, 367512, 367513, 367514, 367515, 367516, 593343, 593344, 593345, 593346, 593347, 593348, 593349, 593350, 593351, 593352, 1083187, 1083188, 1083189, 1083190, 1083191, 1083192, 1083193, 1083194, 1083195, 1083196, 1083197, 1083198, 1083199, 1083200, 1083201, 1083202, 1083203, 1083204, 1083205, 1083206};
ItemIDsDatabase[44341] = {6044341, 44341, 367517, 367518, 367519, 367520, 367521, 367522, 367523, 367524, 367525, 367526, 367527, 367528, 593353, 593354, 593355, 593356, 593357, 593358, 593359, 593360, 593361, 593362, 1083207, 1083208, 1083209, 1083210, 1083211, 1083212, 1083213, 1083214, 1083215, 1083216, 1083217, 1083218, 1083219, 1083220, 1083221, 1083222, 1083223, 1083224, 1083225, 1083226};
ItemIDsDatabase[44342] = {6044342, 44342, 367529, 367530, 367531, 367532, 367533, 367534, 367535, 367536, 367537, 367538, 367539, 367540, 593363, 593364, 593365, 593366, 593367, 593368, 593369, 593370, 593371, 593372, 1083227, 1083228, 1083229, 1083230, 1083231, 1083232, 1083233, 1083234, 1083235, 1083236, 1083237, 1083238, 1083239, 1083240, 1083241, 1083242, 1083243, 1083244, 1083245, 1083246};
ItemIDsDatabase[44343] = {6044343, 44343, 367541, 367542, 367543, 367544, 367545, 367546, 367547, 367548, 367549, 367550, 367551, 367552, 593373, 593374, 593375, 593376, 593377, 593378, 593379, 593380, 593381, 593382, 1083247, 1083248, 1083249, 1083250, 1083251, 1083252, 1083253, 1083254, 1083255, 1083256, 1083257, 1083258, 1083259, 1083260, 1083261, 1083262, 1083263, 1083264, 1083265, 1083266};
ItemIDsDatabase[44344] = {6044344, 44344, 367553, 367554, 367555, 367556, 367557, 367558, 367559, 367560, 367561, 367562, 367563, 367564, 593383, 593384, 593385, 593386, 593387, 593388, 593389, 593390, 593391, 593392, 1083267, 1083268, 1083269, 1083270, 1083271, 1083272, 1083273, 1083274, 1083275, 1083276, 1083277, 1083278, 1083279, 1083280, 1083281, 1083282, 1083283, 1083284, 1083285, 1083286};
ItemIDsDatabase[44345] = {6044345, 44345, 367565, 367566, 367567, 367568, 367569, 367570, 367571, 367572, 367573, 367574, 367575, 367576, 593393, 593394, 593395, 593396, 593397, 593398, 593399, 593400, 593401, 593402, 1083287, 1083288, 1083289, 1083290, 1083291, 1083292, 1083293, 1083294, 1083295, 1083296, 1083297, 1083298, 1083299, 1083300, 1083301, 1083302, 1083303, 1083304, 1083305, 1083306};
ItemIDsDatabase[44346] = {6044346, 44346, 367577, 367578, 367579, 367580, 367581, 367582, 367583, 367584, 367585, 367586, 367587, 367588, 593403, 593404, 593405, 593406, 593407, 593408, 593409, 593410, 593411, 593412, 1083307, 1083308, 1083309, 1083310, 1083311, 1083312, 1083313, 1083314, 1083315, 1083316, 1083317, 1083318, 1083319, 1083320, 1083321, 1083322, 1083323, 1083324, 1083325, 1083326};
ItemIDsDatabase[44347] = {6044347, 44347, 367589, 367590, 367591, 367592, 367593, 367594, 367595, 367596, 367597, 367598, 367599, 367600, 593413, 593414, 593415, 593416, 593417, 593418, 593419, 593420, 593421, 593422, 1083327, 1083328, 1083329, 1083330, 1083331, 1083332, 1083333, 1083334, 1083335, 1083336, 1083337, 1083338, 1083339, 1083340, 1083341, 1083342, 1083343, 1083344, 1083345, 1083346};
ItemIDsDatabase[44348] = {6044348, 44348, 367601, 367602, 367603, 367604, 367605, 367606, 367607, 367608, 367609, 367610, 367611, 367612, 593423, 593424, 593425, 593426, 593427, 593428, 593429, 593430, 593431, 593432, 1083347, 1083348, 1083349, 1083350, 1083351, 1083352, 1083353, 1083354, 1083355, 1083356, 1083357, 1083358, 1083359, 1083360, 1083361, 1083362, 1083363, 1083364, 1083365, 1083366};
ItemIDsDatabase[44349] = {6044349, 44349, 367613, 367614, 367615, 367616, 367617, 367618, 367619, 367620, 367621, 367622, 367623, 367624, 593433, 593434, 593435, 593436, 593437, 593438, 593439, 593440, 593441, 593442, 1083367, 1083368, 1083369, 1083370, 1083371, 1083372, 1083373, 1083374, 1083375, 1083376, 1083377, 1083378, 1083379, 1083380, 1083381, 1083382, 1083383, 1083384, 1083385, 1083386};
ItemIDsDatabase[44350] = {6044350, 44350, 367625, 367626, 367627, 367628, 367629, 367630, 367631, 367632, 367633, 367634, 367635, 367636, 593443, 593444, 593445, 593446, 593447, 593448, 593449, 593450, 593451, 593452, 1083387, 1083388, 1083389, 1083390, 1083391, 1083392, 1083393, 1083394, 1083395, 1083396, 1083397, 1083398, 1083399, 1083400, 1083401, 1083402, 1083403, 1083404, 1083405, 1083406};
ItemIDsDatabase[44351] = {6044351, 44351, 367637, 367638, 367639, 367640, 367641, 367642, 367643, 367644, 367645, 367646, 367647, 367648, 593453, 593454, 593455, 593456, 593457, 593458, 593459, 593460, 593461, 593462, 1083407, 1083408, 1083409, 1083410, 1083411, 1083412, 1083413, 1083414, 1083415, 1083416, 1083417, 1083418, 1083419, 1083420, 1083421, 1083422, 1083423, 1083424, 1083425, 1083426};
ItemIDsDatabase[44352] = {6044352, 44352, 367649, 367650, 367651, 367652, 367653, 367654, 367655, 367656, 367657, 367658, 367659, 367660, 593463, 593464, 593465, 593466, 593467, 593468, 593469, 593470, 593471, 593472, 1083427, 1083428, 1083429, 1083430, 1083431, 1083432, 1083433, 1083434, 1083435, 1083436, 1083437, 1083438, 1083439, 1083440, 1083441, 1083442, 1083443, 1083444, 1083445, 1083446};
ItemIDsDatabase[44353] = {6044353, 44353, 367661, 367662, 367663, 367664, 367665, 367666, 367667, 367668, 367669, 367670, 367671, 367672, 593473, 593474, 593475, 593476, 593477, 593478, 593479, 593480, 593481, 593482, 1083447, 1083448, 1083449, 1083450, 1083451, 1083452, 1083453, 1083454, 1083455, 1083456, 1083457, 1083458, 1083459, 1083460, 1083461, 1083462, 1083463, 1083464, 1083465, 1083466};
ItemIDsDatabase[44354] = {6044354, 44354, 367673, 367674, 367675, 367676, 367677, 367678, 367679, 367680, 367681, 367682, 367683, 367684, 593483, 593484, 593485, 593486, 593487, 593488, 593489, 593490, 593491, 593492, 1083467, 1083468, 1083469, 1083470, 1083471, 1083472, 1083473, 1083474, 1083475, 1083476, 1083477, 1083478, 1083479, 1083480, 1083481, 1083482, 1083483, 1083484, 1083485, 1083486};
ItemIDsDatabase[44355] = {6044355, 44355, 367685, 367686, 367687, 367688, 367689, 367690, 367691, 367692, 367693, 367694, 367695, 367696, 593493, 593494, 593495, 593496, 593497, 593498, 593499, 593500, 593501, 593502, 1083487, 1083488, 1083489, 1083490, 1083491, 1083492, 1083493, 1083494, 1083495, 1083496, 1083497, 1083498, 1083499, 1083500, 1083501, 1083502, 1083503, 1083504, 1083505, 1083506};
ItemIDsDatabase[44356] = {6044356, 44356, 367697, 367698, 367699, 367700, 367701, 367702, 367703, 367704, 367705, 367706, 367707, 367708, 593503, 593504, 593505, 593506, 593507, 593508, 593509, 593510, 593511, 593512, 1083507, 1083508, 1083509, 1083510, 1083511, 1083512, 1083513, 1083514, 1083515, 1083516, 1083517, 1083518, 1083519, 1083520, 1083521, 1083522, 1083523, 1083524, 1083525, 1083526};
ItemIDsDatabase[44357] = {6044357, 44357, 367709, 367710, 367711, 367712, 367713, 367714, 367715, 367716, 367717, 367718, 367719, 367720, 593513, 593514, 593515, 593516, 593517, 593518, 593519, 593520, 593521, 593522, 1083527, 1083528, 1083529, 1083530, 1083531, 1083532, 1083533, 1083534, 1083535, 1083536, 1083537, 1083538, 1083539, 1083540, 1083541, 1083542, 1083543, 1083544, 1083545, 1083546};
ItemIDsDatabase[44358] = {6044358, 44358, 367721, 367722, 367723, 367724, 367725, 367726, 367727, 367728, 367729, 367730, 367731, 367732, 593523, 593524, 593525, 593526, 593527, 593528, 593529, 593530, 593531, 593532, 1083547, 1083548, 1083549, 1083550, 1083551, 1083552, 1083553, 1083554, 1083555, 1083556, 1083557, 1083558, 1083559, 1083560, 1083561, 1083562, 1083563, 1083564, 1083565, 1083566};
ItemIDsDatabase[44359] = {6044359, 44359, 367733, 367734, 367735, 367736, 367737, 367738, 367739, 367740, 367741, 367742, 367743, 367744, 593533, 593534, 593535, 593536, 593537, 593538, 593539, 593540, 593541, 593542, 1083567, 1083568, 1083569, 1083570, 1083571, 1083572, 1083573, 1083574, 1083575, 1083576, 1083577, 1083578, 1083579, 1083580, 1083581, 1083582, 1083583, 1083584, 1083585, 1083586};
ItemIDsDatabase[44360] = {6044360, 44360, 367745, 367746, 367747, 367748, 367749, 367750, 367751, 367752, 367753, 367754, 367755, 367756, 593543, 593544, 593545, 593546, 593547, 593548, 593549, 593550, 593551, 593552, 1083587, 1083588, 1083589, 1083590, 1083591, 1083592, 1083593, 1083594, 1083595, 1083596, 1083597, 1083598, 1083599, 1083600, 1083601, 1083602, 1083603, 1083604, 1083605, 1083606};
ItemIDsDatabase[44361] = {6044361, 44361, 367757, 367758, 367759, 367760, 367761, 367762, 367763, 367764, 367765, 367766, 367767, 367768, 593553, 593554, 593555, 593556, 593557, 593558, 593559, 593560, 593561, 593562, 1083607, 1083608, 1083609, 1083610, 1083611, 1083612, 1083613, 1083614, 1083615, 1083616, 1083617, 1083618, 1083619, 1083620, 1083621, 1083622, 1083623, 1083624, 1083625, 1083626};
ItemIDsDatabase[44362] = {6044362, 44362, 367769, 367770, 367771, 367772, 367773, 367774, 367775, 367776, 367777, 367778, 367779, 367780, 593563, 593564, 593565, 593566, 593567, 593568, 593569, 593570, 593571, 593572, 1083627, 1083628, 1083629, 1083630, 1083631, 1083632, 1083633, 1083634, 1083635, 1083636, 1083637, 1083638, 1083639, 1083640, 1083641, 1083642, 1083643, 1083644, 1083645, 1083646};
ItemIDsDatabase[44363] = {6044363, 44363, 367781, 367782, 367783, 367784, 367785, 367786, 367787, 367788, 367789, 367790, 367791, 367792, 593573, 593574, 593575, 593576, 593577, 593578, 593579, 593580, 593581, 593582, 1083647, 1083648, 1083649, 1083650, 1083651, 1083652, 1083653, 1083654, 1083655, 1083656, 1083657, 1083658, 1083659, 1083660, 1083661, 1083662, 1083663, 1083664, 1083665, 1083666};
ItemIDsDatabase[44364] = {6044364, 44364, 367793, 367794, 367795, 367796, 367797, 367798, 367799, 367800, 367801, 367802, 367803, 367804, 593583, 593584, 593585, 593586, 593587, 593588, 593589, 593590, 593591, 593592, 1083667, 1083668, 1083669, 1083670, 1083671, 1083672, 1083673, 1083674, 1083675, 1083676, 1083677, 1083678, 1083679, 1083680, 1083681, 1083682, 1083683, 1083684, 1083685, 1083686};
ItemIDsDatabase[44365] = {6044365, 44365, 367805, 367806, 367807, 367808, 367809, 367810, 367811, 367812, 367813, 367814, 367815, 367816, 593593, 593594, 593595, 593596, 593597, 593598, 593599, 593600, 593601, 593602, 1083687, 1083688, 1083689, 1083690, 1083691, 1083692, 1083693, 1083694, 1083695, 1083696, 1083697, 1083698, 1083699, 1083700, 1083701, 1083702, 1083703, 1083704, 1083705, 1083706};
ItemIDsDatabase[44366] = {6044366, 44366, 367817, 367818, 367819, 367820, 367821, 367822, 367823, 367824, 367825, 367826, 367827, 367828, 593603, 593604, 593605, 593606, 593607, 593608, 593609, 593610, 593611, 593612, 1083707, 1083708, 1083709, 1083710, 1083711, 1083712, 1083713, 1083714, 1083715, 1083716, 1083717, 1083718, 1083719, 1083720, 1083721, 1083722, 1083723, 1083724, 1083725, 1083726};
ItemIDsDatabase[44367] = {6044367, 44367, 367829, 367830, 367831, 367832, 367833, 367834, 367835, 367836, 367837, 367838, 367839, 367840, 593613, 593614, 593615, 593616, 593617, 593618, 593619, 593620, 593621, 593622, 1083727, 1083728, 1083729, 1083730, 1083731, 1083732, 1083733, 1083734, 1083735, 1083736, 1083737, 1083738, 1083739, 1083740, 1083741, 1083742, 1083743, 1083744, 1083745, 1083746};
ItemIDsDatabase[44368] = {6044368, 44368, 367841, 367842, 367843, 367844, 367845, 367846, 367847, 367848, 367849, 367850, 367851, 367852, 593623, 593624, 593625, 593626, 593627, 593628, 593629, 593630, 593631, 593632, 1083747, 1083748, 1083749, 1083750, 1083751, 1083752, 1083753, 1083754, 1083755, 1083756, 1083757, 1083758, 1083759, 1083760, 1083761, 1083762, 1083763, 1083764, 1083765, 1083766};
ItemIDsDatabase[44369] = {6044369, 44369, 367853, 367854, 367855, 367856, 367857, 367858, 367859, 367860, 367861, 367862, 367863, 367864, 593633, 593634, 593635, 593636, 593637, 593638, 593639, 593640, 593641, 593642, 1083767, 1083768, 1083769, 1083770, 1083771, 1083772, 1083773, 1083774, 1083775, 1083776, 1083777, 1083778, 1083779, 1083780, 1083781, 1083782, 1083783, 1083784, 1083785, 1083786};
ItemIDsDatabase[44370] = {6044370, 44370, 367865, 367866, 367867, 367868, 367869, 367870, 367871, 367872, 367873, 367874, 367875, 367876, 593643, 593644, 593645, 593646, 593647, 593648, 593649, 593650, 593651, 593652, 1083787, 1083788, 1083789, 1083790, 1083791, 1083792, 1083793, 1083794, 1083795, 1083796, 1083797, 1083798, 1083799, 1083800, 1083801, 1083802, 1083803, 1083804, 1083805, 1083806};
ItemIDsDatabase[44371] = {6044371, 44371, 367877, 367878, 367879, 367880, 367881, 367882, 367883, 367884, 367885, 367886, 367887, 367888, 593653, 593654, 593655, 593656, 593657, 593658, 593659, 593660, 593661, 593662, 1083807, 1083808, 1083809, 1083810, 1083811, 1083812, 1083813, 1083814, 1083815, 1083816, 1083817, 1083818, 1083819, 1083820, 1083821, 1083822, 1083823, 1083824, 1083825, 1083826};
ItemIDsDatabase[44372] = {6044372, 44372, 367889, 367890, 367891, 367892, 367893, 367894, 367895, 367896, 367897, 367898, 367899, 367900, 593663, 593664, 593665, 593666, 593667, 593668, 593669, 593670, 593671, 593672, 1083827, 1083828, 1083829, 1083830, 1083831, 1083832, 1083833, 1083834, 1083835, 1083836, 1083837, 1083838, 1083839, 1083840, 1083841, 1083842, 1083843, 1083844, 1083845, 1083846};
ItemIDsDatabase[44373] = {6044373, 44373, 367901, 367902, 367903, 367904, 367905, 367906, 367907, 367908, 367909, 367910, 367911, 367912, 593673, 593674, 593675, 593676, 593677, 593678, 593679, 593680, 593681, 593682, 1083847, 1083848, 1083849, 1083850, 1083851, 1083852, 1083853, 1083854, 1083855, 1083856, 1083857, 1083858, 1083859, 1083860, 1083861, 1083862, 1083863, 1083864, 1083865, 1083866};
ItemIDsDatabase[44374] = {6044374, 44374, 367913, 367914, 367915, 367916, 367917, 367918, 367919, 367920, 367921, 367922, 367923, 367924, 593683, 593684, 593685, 593686, 593687, 593688, 593689, 593690, 593691, 593692, 1083867, 1083868, 1083869, 1083870, 1083871, 1083872, 1083873, 1083874, 1083875, 1083876, 1083877, 1083878, 1083879, 1083880, 1083881, 1083882, 1083883, 1083884, 1083885, 1083886};
ItemIDsDatabase[44375] = {6044375, 44375, 367925, 367926, 367927, 367928, 367929, 367930, 367931, 367932, 367933, 367934, 367935, 367936, 593693, 593694, 593695, 593696, 593697, 593698, 593699, 593700, 593701, 593702, 1083887, 1083888, 1083889, 1083890, 1083891, 1083892, 1083893, 1083894, 1083895, 1083896, 1083897, 1083898, 1083899, 1083900, 1083901, 1083902, 1083903, 1083904, 1083905, 1083906};
ItemIDsDatabase[44376] = {6044376, 44376, 367937, 367938, 367939, 367940, 367941, 367942, 367943, 367944, 367945, 367946, 367947, 367948, 593703, 593704, 593705, 593706, 593707, 593708, 593709, 593710, 593711, 593712, 1083907, 1083908, 1083909, 1083910, 1083911, 1083912, 1083913, 1083914, 1083915, 1083916, 1083917, 1083918, 1083919, 1083920, 1083921, 1083922, 1083923, 1083924, 1083925, 1083926};
ItemIDsDatabase[44377] = {6044377, 44377, 367949, 367950, 367951, 367952, 367953, 367954, 367955, 367956, 367957, 367958, 367959, 367960, 593713, 593714, 593715, 593716, 593717, 593718, 593719, 593720, 593721, 593722, 1083927, 1083928, 1083929, 1083930, 1083931, 1083932, 1083933, 1083934, 1083935, 1083936, 1083937, 1083938, 1083939, 1083940, 1083941, 1083942, 1083943, 1083944, 1083945, 1083946};
ItemIDsDatabase[44378] = {6044378, 44378, 367961, 367962, 367963, 367964, 367965, 367966, 367967, 367968, 367969, 367970, 367971, 367972, 593723, 593724, 593725, 593726, 593727, 593728, 593729, 593730, 593731, 593732, 1083947, 1083948, 1083949, 1083950, 1083951, 1083952, 1083953, 1083954, 1083955, 1083956, 1083957, 1083958, 1083959, 1083960, 1083961, 1083962, 1083963, 1083964, 1083965, 1083966};
ItemIDsDatabase[44379] = {6044379, 44379, 367973, 367974, 367975, 367976, 367977, 367978, 367979, 367980, 367981, 367982, 367983, 367984, 593733, 593734, 593735, 593736, 593737, 593738, 593739, 593740, 593741, 593742, 1083967, 1083968, 1083969, 1083970, 1083971, 1083972, 1083973, 1083974, 1083975, 1083976, 1083977, 1083978, 1083979, 1083980, 1083981, 1083982, 1083983, 1083984, 1083985, 1083986};
ItemIDsDatabase[44380] = {6044380, 44380, 367985, 367986, 367987, 367988, 367989, 367990, 367991, 367992, 367993, 367994, 367995, 367996, 593743, 593744, 593745, 593746, 593747, 593748, 593749, 593750, 593751, 593752, 1083987, 1083988, 1083989, 1083990, 1083991, 1083992, 1083993, 1083994, 1083995, 1083996, 1083997, 1083998, 1083999, 1084000, 1084001, 1084002, 1084003, 1084004, 1084005, 1084006};
ItemIDsDatabase[44381] = {6044381, 44381, 367997, 367998, 367999, 368000, 368001, 368002, 368003, 368004, 368005, 368006, 368007, 368008, 593753, 593754, 593755, 593756, 593757, 593758, 593759, 593760, 593761, 593762, 1084007, 1084008, 1084009, 1084010, 1084011, 1084012, 1084013, 1084014, 1084015, 1084016, 1084017, 1084018, 1084019, 1084020, 1084021, 1084022, 1084023, 1084024, 1084025, 1084026};
ItemIDsDatabase[44382] = {6044382, 44382, 368009, 368010, 368011, 368012, 368013, 368014, 368015, 368016, 368017, 368018, 368019, 368020, 593763, 593764, 593765, 593766, 593767, 593768, 593769, 593770, 593771, 593772, 1084027, 1084028, 1084029, 1084030, 1084031, 1084032, 1084033, 1084034, 1084035, 1084036, 1084037, 1084038, 1084039, 1084040, 1084041, 1084042, 1084043, 1084044, 1084045, 1084046};
ItemIDsDatabase[44383] = {6044383, 44383, 368021, 368022, 368023, 368024, 368025, 368026, 368027, 368028, 368029, 368030, 368031, 368032, 593773, 593774, 593775, 593776, 593777, 593778, 593779, 593780, 593781, 593782, 1084047, 1084048, 1084049, 1084050, 1084051, 1084052, 1084053, 1084054, 1084055, 1084056, 1084057, 1084058, 1084059, 1084060, 1084061, 1084062, 1084063, 1084064, 1084065, 1084066};
ItemIDsDatabase[44384] = {6044384, 44384, 368033, 368034, 368035, 368036, 368037, 368038, 368039, 368040, 368041, 368042, 368043, 368044, 593783, 593784, 593785, 593786, 593787, 593788, 593789, 593790, 593791, 593792, 1084067, 1084068, 1084069, 1084070, 1084071, 1084072, 1084073, 1084074, 1084075, 1084076, 1084077, 1084078, 1084079, 1084080, 1084081, 1084082, 1084083, 1084084, 1084085, 1084086};
ItemIDsDatabase[44385] = {6044385, 44385, 368045, 368046, 368047, 368048, 368049, 368050, 368051, 368052, 368053, 368054, 368055, 368056, 593793, 593794, 593795, 593796, 593797, 593798, 593799, 593800, 593801, 593802, 1084087, 1084088, 1084089, 1084090, 1084091, 1084092, 1084093, 1084094, 1084095, 1084096, 1084097, 1084098, 1084099, 1084100, 1084101, 1084102, 1084103, 1084104, 1084105, 1084106};
ItemIDsDatabase[44386] = {6044386, 44386, 368057, 368058, 368059, 368060, 368061, 368062, 368063, 368064, 368065, 368066, 368067, 368068, 593803, 593804, 593805, 593806, 593807, 593808, 593809, 593810, 593811, 593812, 1084107, 1084108, 1084109, 1084110, 1084111, 1084112, 1084113, 1084114, 1084115, 1084116, 1084117, 1084118, 1084119, 1084120, 1084121, 1084122, 1084123, 1084124, 1084125, 1084126};
ItemIDsDatabase[44387] = {6044387, 44387, 368069, 368070, 368071, 368072, 368073, 368074, 368075, 368076, 368077, 368078, 368079, 368080, 593813, 593814, 593815, 593816, 593817, 593818, 593819, 593820, 593821, 593822, 1084127, 1084128, 1084129, 1084130, 1084131, 1084132, 1084133, 1084134, 1084135, 1084136, 1084137, 1084138, 1084139, 1084140, 1084141, 1084142, 1084143, 1084144, 1084145, 1084146};
ItemIDsDatabase[44388] = {6044388, 44388, 368081, 368082, 368083, 368084, 368085, 368086, 368087, 368088, 368089, 368090, 368091, 368092, 593823, 593824, 593825, 593826, 593827, 593828, 593829, 593830, 593831, 593832, 1084147, 1084148, 1084149, 1084150, 1084151, 1084152, 1084153, 1084154, 1084155, 1084156, 1084157, 1084158, 1084159, 1084160, 1084161, 1084162, 1084163, 1084164, 1084165, 1084166};
ItemIDsDatabase[44391] = {6044391, 44391, 368093, 368094, 368095, 368096, 368097, 368098, 368099, 368100, 368101, 368102, 368103, 368104, 593833, 593834, 593835, 593836, 593837, 593838, 593839, 593840, 593841, 593842, 1084167, 1084168, 1084169, 1084170, 1084171, 1084172, 1084173, 1084174, 1084175, 1084176, 1084177, 1084178, 1084179, 1084180, 1084181, 1084182, 1084183, 1084184, 1084185, 1084186};
ItemIDsDatabase[44392] = {6044392, 44392, 368105, 368106, 368107, 368108, 368109, 368110, 368111, 368112, 368113, 368114, 368115, 368116, 593843, 593844, 593845, 593846, 593847, 593848, 593849, 593850, 593851, 593852, 1084187, 1084188, 1084189, 1084190, 1084191, 1084192, 1084193, 1084194, 1084195, 1084196, 1084197, 1084198, 1084199, 1084200, 1084201, 1084202, 1084203, 1084204, 1084205, 1084206};
ItemIDsDatabase[44393] = {6044393, 44393, 368117, 368118, 368119, 368120, 368121, 368122, 368123, 368124, 368125, 368126, 368127, 368128, 593853, 593854, 593855, 593856, 593857, 593858, 593859, 593860, 593861, 593862, 1084207, 1084208, 1084209, 1084210, 1084211, 1084212, 1084213, 1084214, 1084215, 1084216, 1084217, 1084218, 1084219, 1084220, 1084221, 1084222, 1084223, 1084224, 1084225, 1084226};
ItemIDsDatabase[44394] = {6044394, 44394, 368129, 368130, 368131, 368132, 368133, 368134, 368135, 368136, 368137, 368138, 368139, 368140, 593863, 593864, 593865, 593866, 593867, 593868, 593869, 593870, 593871, 593872, 1084227, 1084228, 1084229, 1084230, 1084231, 1084232, 1084233, 1084234, 1084235, 1084236, 1084237, 1084238, 1084239, 1084240, 1084241, 1084242, 1084243, 1084244, 1084245, 1084246};
ItemIDsDatabase[44395] = {6044395, 44395, 368141, 368142, 368143, 368144, 368145, 368146, 368147, 368148, 368149, 368150, 368151, 368152, 593873, 593874, 593875, 593876, 593877, 593878, 593879, 593880, 593881, 593882, 1084247, 1084248, 1084249, 1084250, 1084251, 1084252, 1084253, 1084254, 1084255, 1084256, 1084257, 1084258, 1084259, 1084260, 1084261, 1084262, 1084263, 1084264, 1084265, 1084266};
ItemIDsDatabase[44396] = {6044396, 44396, 368153, 368154, 368155, 368156, 368157, 368158, 368159, 368160, 368161, 368162, 368163, 368164, 593883, 593884, 593885, 593886, 593887, 593888, 593889, 593890, 593891, 593892, 1084267, 1084268, 1084269, 1084270, 1084271, 1084272, 1084273, 1084274, 1084275, 1084276, 1084277, 1084278, 1084279, 1084280, 1084281, 1084282, 1084283, 1084284, 1084285, 1084286};
ItemIDsDatabase[44397] = {6044397, 44397, 368165, 368166, 368167, 368168, 368169, 368170, 368171, 368172, 368173, 368174, 368175, 368176, 593893, 593894, 593895, 593896, 593897, 593898, 593899, 593900, 593901, 593902, 1084287, 1084288, 1084289, 1084290, 1084291, 1084292, 1084293, 1084294, 1084295, 1084296, 1084297, 1084298, 1084299, 1084300, 1084301, 1084302, 1084303, 1084304, 1084305, 1084306};
ItemIDsDatabase[44398] = {6044398, 44398, 368177, 368178, 368179, 368180, 368181, 368182, 368183, 368184, 368185, 368186, 368187, 368188, 593903, 593904, 593905, 593906, 593907, 593908, 593909, 593910, 593911, 593912, 1084307, 1084308, 1084309, 1084310, 1084311, 1084312, 1084313, 1084314, 1084315, 1084316, 1084317, 1084318, 1084319, 1084320, 1084321, 1084322, 1084323, 1084324, 1084325, 1084326};
ItemIDsDatabase[44399] = {6044399, 44399, 368189, 368190, 368191, 368192, 368193, 368194, 368195, 368196, 368197, 368198, 368199, 368200, 593913, 593914, 593915, 593916, 593917, 593918, 593919, 593920, 593921, 593922, 1084327, 1084328, 1084329, 1084330, 1084331, 1084332, 1084333, 1084334, 1084335, 1084336, 1084337, 1084338, 1084339, 1084340, 1084341, 1084342, 1084343, 1084344, 1084345, 1084346};
ItemIDsDatabase[44400] = {6044400, 44400, 368201, 368202, 368203, 368204, 368205, 368206, 368207, 368208, 368209, 368210, 368211, 368212, 593923, 593924, 593925, 593926, 593927, 593928, 593929, 593930, 593931, 593932, 1084347, 1084348, 1084349, 1084350, 1084351, 1084352, 1084353, 1084354, 1084355, 1084356, 1084357, 1084358, 1084359, 1084360, 1084361, 1084362, 1084363, 1084364, 1084365, 1084366};
ItemIDsDatabase[44401] = {6044401, 44401, 368213, 368214, 368215, 368216, 368217, 368218, 368219, 368220, 368221, 368222, 368223, 368224, 593933, 593934, 593935, 593936, 593937, 593938, 593939, 593940, 593941, 593942, 1084367, 1084368, 1084369, 1084370, 1084371, 1084372, 1084373, 1084374, 1084375, 1084376, 1084377, 1084378, 1084379, 1084380, 1084381, 1084382, 1084383, 1084384, 1084385, 1084386};
ItemIDsDatabase[44402] = {6044402, 44402, 368225, 368226, 368227, 368228, 368229, 368230, 368231, 368232, 368233, 368234, 368235, 368236, 593943, 593944, 593945, 593946, 593947, 593948, 593949, 593950, 593951, 593952, 1084387, 1084388, 1084389, 1084390, 1084391, 1084392, 1084393, 1084394, 1084395, 1084396, 1084397, 1084398, 1084399, 1084400, 1084401, 1084402, 1084403, 1084404, 1084405, 1084406};
ItemIDsDatabase[44403] = {6044403, 44403, 368237, 368238, 368239, 368240, 368241, 368242, 368243, 368244, 368245, 368246, 368247, 368248, 593953, 593954, 593955, 593956, 593957, 593958, 593959, 593960, 593961, 593962, 1084407, 1084408, 1084409, 1084410, 1084411, 1084412, 1084413, 1084414, 1084415, 1084416, 1084417, 1084418, 1084419, 1084420, 1084421, 1084422, 1084423, 1084424, 1084425, 1084426};
ItemIDsDatabase[44404] = {6044404, 44404, 368249, 368250, 368251, 368252, 368253, 368254, 368255, 368256, 368257, 368258, 368259, 368260, 593963, 593964, 593965, 593966, 593967, 593968, 593969, 593970, 593971, 593972, 1084427, 1084428, 1084429, 1084430, 1084431, 1084432, 1084433, 1084434, 1084435, 1084436, 1084437, 1084438, 1084439, 1084440, 1084441, 1084442, 1084443, 1084444, 1084445, 1084446};
ItemIDsDatabase[44405] = {6044405, 44405, 368261, 368262, 368263, 368264, 368265, 368266, 368267, 368268, 368269, 368270, 368271, 368272, 593973, 593974, 593975, 593976, 593977, 593978, 593979, 593980, 593981, 593982, 1084447, 1084448, 1084449, 1084450, 1084451, 1084452, 1084453, 1084454, 1084455, 1084456, 1084457, 1084458, 1084459, 1084460, 1084461, 1084462, 1084463, 1084464, 1084465, 1084466};
ItemIDsDatabase[44406] = {6044406, 44406, 368273, 368274, 368275, 368276, 368277, 368278, 368279, 368280, 368281, 368282, 368283, 368284, 593983, 593984, 593985, 593986, 593987, 593988, 593989, 593990, 593991, 593992, 1084467, 1084468, 1084469, 1084470, 1084471, 1084472, 1084473, 1084474, 1084475, 1084476, 1084477, 1084478, 1084479, 1084480, 1084481, 1084482, 1084483, 1084484, 1084485, 1084486};
ItemIDsDatabase[44407] = {6044407, 44407, 368285, 368286, 368287, 368288, 368289, 368290, 368291, 368292, 368293, 368294, 368295, 368296, 593993, 593994, 593995, 593996, 593997, 593998, 593999, 594000, 594001, 594002, 1084487, 1084488, 1084489, 1084490, 1084491, 1084492, 1084493, 1084494, 1084495, 1084496, 1084497, 1084498, 1084499, 1084500, 1084501, 1084502, 1084503, 1084504, 1084505, 1084506};
ItemIDsDatabase[44408] = {6044408, 44408, 368297, 368298, 368299, 368300, 368301, 368302, 368303, 368304, 368305, 368306, 368307, 368308, 594003, 594004, 594005, 594006, 594007, 594008, 594009, 594010, 594011, 594012, 1084507, 1084508, 1084509, 1084510, 1084511, 1084512, 1084513, 1084514, 1084515, 1084516, 1084517, 1084518, 1084519, 1084520, 1084521, 1084522, 1084523, 1084524, 1084525, 1084526};
ItemIDsDatabase[44409] = {6044409, 44409, 368309, 368310, 368311, 368312, 368313, 368314, 368315, 368316, 368317, 368318, 368319, 368320, 594013, 594014, 594015, 594016, 594017, 594018, 594019, 594020, 594021, 594022, 1084527, 1084528, 1084529, 1084530, 1084531, 1084532, 1084533, 1084534, 1084535, 1084536, 1084537, 1084538, 1084539, 1084540, 1084541, 1084542, 1084543, 1084544, 1084545, 1084546};
ItemIDsDatabase[44410] = {6044410, 44410, 368321, 368322, 368323, 368324, 368325, 368326, 368327, 368328, 368329, 368330, 368331, 368332, 594023, 594024, 594025, 594026, 594027, 594028, 594029, 594030, 594031, 594032, 1084547, 1084548, 1084549, 1084550, 1084551, 1084552, 1084553, 1084554, 1084555, 1084556, 1084557, 1084558, 1084559, 1084560, 1084561, 1084562, 1084563, 1084564, 1084565, 1084566};
ItemIDsDatabase[44411] = {6044411, 44411, 368333, 368334, 368335, 368336, 368337, 368338, 368339, 368340, 368341, 368342, 368343, 368344, 594033, 594034, 594035, 594036, 594037, 594038, 594039, 594040, 594041, 594042, 1084567, 1084568, 1084569, 1084570, 1084571, 1084572, 1084573, 1084574, 1084575, 1084576, 1084577, 1084578, 1084579, 1084580, 1084581, 1084582, 1084583, 1084584, 1084585, 1084586};
ItemIDsDatabase[44412] = {6044412, 44412, 368345, 368346, 368347, 368348, 368349, 368350, 368351, 368352, 368353, 368354, 368355, 368356, 594043, 594044, 594045, 594046, 594047, 594048, 594049, 594050, 594051, 594052, 1084587, 1084588, 1084589, 1084590, 1084591, 1084592, 1084593, 1084594, 1084595, 1084596, 1084597, 1084598, 1084599, 1084600, 1084601, 1084602, 1084603, 1084604, 1084605, 1084606};
ItemIDsDatabase[44436] = {6044436, 44436, 368514, 368515, 368516, 368517, 368518, 368519, 368520, 368521, 368522, 368523, 368524, 368525, 594183, 594184, 594185, 594186, 594187, 594188, 594189, 594190, 594191, 594192, 1084867, 1084868, 1084869, 1084870, 1084871, 1084872, 1084873, 1084874, 1084875, 1084876, 1084877, 1084878, 1084879, 1084880, 1084881, 1084882, 1084883, 1084884, 1084885, 1084886};
ItemIDsDatabase[44437] = {6044437, 44437, 368526, 368527, 368528, 368529, 368530, 368531, 368532, 368533, 368534, 368535, 368536, 368537, 594193, 594194, 594195, 594196, 594197, 594198, 594199, 594200, 594201, 594202, 1084887, 1084888, 1084889, 1084890, 1084891, 1084892, 1084893, 1084894, 1084895, 1084896, 1084897, 1084898, 1084899, 1084900, 1084901, 1084902, 1084903, 1084904, 1084905, 1084906};
ItemIDsDatabase[44438] = {6044438, 44438, 368538, 368539, 368540, 368541, 368542, 368543, 368544, 368545, 368546, 368547, 368548, 368549, 594203, 594204, 594205, 594206, 594207, 594208, 594209, 594210, 594211, 594212, 1084907, 1084908, 1084909, 1084910, 1084911, 1084912, 1084913, 1084914, 1084915, 1084916, 1084917, 1084918, 1084919, 1084920, 1084921, 1084922, 1084923, 1084924, 1084925, 1084926};
ItemIDsDatabase[44440] = {6044440, 44440, 368550, 368551, 368552, 368553, 368554, 368555, 368556, 368557, 368558, 368559, 368560, 368561, 594213, 594214, 594215, 594216, 594217, 594218, 594219, 594220, 594221, 594222, 1084927, 1084928, 1084929, 1084930, 1084931, 1084932, 1084933, 1084934, 1084935, 1084936, 1084937, 1084938, 1084939, 1084940, 1084941, 1084942, 1084943, 1084944, 1084945, 1084946};
ItemIDsDatabase[44441] = {6044441, 44441, 368562, 368563, 368564, 368565, 368566, 368567, 368568, 368569, 368570, 368571, 368572, 368573, 594223, 594224, 594225, 594226, 594227, 594228, 594229, 594230, 594231, 594232, 1084947, 1084948, 1084949, 1084950, 1084951, 1084952, 1084953, 1084954, 1084955, 1084956, 1084957, 1084958, 1084959, 1084960, 1084961, 1084962, 1084963, 1084964, 1084965, 1084966};
ItemIDsDatabase[44442] = {6044442, 44442, 368574, 368575, 368576, 368577, 368578, 368579, 368580, 368581, 368582, 368583, 368584, 368585, 594233, 594234, 594235, 594236, 594237, 594238, 594239, 594240, 594241, 594242, 1084967, 1084968, 1084969, 1084970, 1084971, 1084972, 1084973, 1084974, 1084975, 1084976, 1084977, 1084978, 1084979, 1084980, 1084981, 1084982, 1084983, 1084984, 1084985, 1084986};
ItemIDsDatabase[44443] = {6044443, 44443, 368586, 368587, 368588, 368589, 368590, 368591, 368592, 368593, 368594, 368595, 368596, 368597, 594243, 594244, 594245, 594246, 594247, 594248, 594249, 594250, 594251, 594252, 1084987, 1084988, 1084989, 1084990, 1084991, 1084992, 1084993, 1084994, 1084995, 1084996, 1084997, 1084998, 1084999, 1085000, 1085001, 1085002, 1085003, 1085004, 1085005, 1085006};
ItemIDsDatabase[44444] = {6044444, 44444, 368598, 368599, 368600, 368601, 368602, 368603, 368604, 368605, 368606, 368607, 368608, 368609, 594253, 594254, 594255, 594256, 594257, 594258, 594259, 594260, 594261, 594262, 1085007, 1085008, 1085009, 1085010, 1085011, 1085012, 1085013, 1085014, 1085015, 1085016, 1085017, 1085018, 1085019, 1085020, 1085021, 1085022, 1085023, 1085024, 1085025, 1085026};
ItemIDsDatabase[44445] = {6044445, 44445, 368610, 368611, 368612, 368613, 368614, 368615, 368616, 368617, 368618, 368619, 368620, 368621, 594263, 594264, 594265, 594266, 594267, 594268, 594269, 594270, 594271, 594272, 1085027, 1085028, 1085029, 1085030, 1085031, 1085032, 1085033, 1085034, 1085035, 1085036, 1085037, 1085038, 1085039, 1085040, 1085041, 1085042, 1085043, 1085044, 1085045, 1085046};
ItemIDsDatabase[44505] = {6044505, 44505, 368634, 368635, 368636, 368637, 368638, 368639, 368640, 368641, 368642, 368643, 368644, 368645, 594283, 594284, 594285, 594286, 594287, 594288, 594289, 594290, 594291, 594292, 1085067, 1085068, 1085069, 1085070, 1085071, 1085072, 1085073, 1085074, 1085075, 1085076, 1085077, 1085078, 1085079, 1085080, 1085081, 1085082, 1085083, 1085084, 1085085, 1085086};
ItemIDsDatabase[44579] = {6044579, 44579, 368646, 368647, 368648, 368649, 368650, 368651, 368652, 368653, 368654, 368655, 368656, 368657, 594293, 594294, 594295, 594296, 594297, 594298, 594299, 594300, 594301, 594302, 1085087, 1085088, 1085089, 1085090, 1085091, 1085092, 1085093, 1085094, 1085095, 1085096, 1085097, 1085098, 1085099, 1085100, 1085101, 1085102, 1085103, 1085104, 1085105, 1085106};
ItemIDsDatabase[44583] = {6044583, 44583, 368658, 368659, 368660, 368661, 368662, 368663, 368664, 368665, 368666, 368667, 368668, 368669, 594303, 594304, 594305, 594306, 594307, 594308, 594309, 594310, 594311, 594312, 1085107, 1085108, 1085109, 1085110, 1085111, 1085112, 1085113, 1085114, 1085115, 1085116, 1085117, 1085118, 1085119, 1085120, 1085121, 1085122, 1085123, 1085124, 1085125, 1085126};
ItemIDsDatabase[44590] = {6044590, 44590, 368670, 368671, 368672, 368673, 368674, 368675, 368676, 368677, 368678, 368679, 368680, 368681, 594313, 594314, 594315, 594316, 594317, 594318, 594319, 594320, 594321, 594322, 1085127, 1085128, 1085129, 1085130, 1085131, 1085132, 1085133, 1085134, 1085135, 1085136, 1085137, 1085138, 1085139, 1085140, 1085141, 1085142, 1085143, 1085144, 1085145, 1085146};
ItemIDsDatabase[44591] = {6044591, 44591, 368682, 368683, 368684, 368685, 368686, 368687, 368688, 368689, 368690, 368691, 368692, 368693, 594323, 594324, 594325, 594326, 594327, 594328, 594329, 594330, 594331, 594332, 1085147, 1085148, 1085149, 1085150, 1085151, 1085152, 1085153, 1085154, 1085155, 1085156, 1085157, 1085158, 1085159, 1085160, 1085161, 1085162, 1085163, 1085164, 1085165, 1085166};
ItemIDsDatabase[44592] = {6044592, 44592, 368694, 368695, 368696, 368697, 368698, 368699, 368700, 368701, 368702, 368703, 368704, 368705, 594333, 594334, 594335, 594336, 594337, 594338, 594339, 594340, 594341, 594342, 1085167, 1085168, 1085169, 1085170, 1085171, 1085172, 1085173, 1085174, 1085175, 1085176, 1085177, 1085178, 1085179, 1085180, 1085181, 1085182, 1085183, 1085184, 1085185, 1085186};
ItemIDsDatabase[44593] = {6044593, 44593, 368706, 368707, 368708, 368709, 368710, 368711, 368712, 368713, 368714, 368715, 368716, 368717, 594343, 594344, 594345, 594346, 594347, 594348, 594349, 594350, 594351, 594352, 1085187, 1085188, 1085189, 1085190, 1085191, 1085192, 1085193, 1085194, 1085195, 1085196, 1085197, 1085198, 1085199, 1085200, 1085201, 1085202, 1085203, 1085204, 1085205, 1085206};
ItemIDsDatabase[44594] = {6044594, 44594, 368718, 368719, 368720, 368721, 368722, 368723, 368724, 368725, 368726, 368727, 368728, 368729, 594353, 594354, 594355, 594356, 594357, 594358, 594359, 594360, 594361, 594362, 1085207, 1085208, 1085209, 1085210, 1085211, 1085212, 1085213, 1085214, 1085215, 1085216, 1085217, 1085218, 1085219, 1085220, 1085221, 1085222, 1085223, 1085224, 1085225, 1085226};
ItemIDsDatabase[44595] = {6044595, 44595, 368730, 368731, 368732, 368733, 368734, 368735, 368736, 368737, 368738, 368739, 368740, 368741, 594363, 594364, 594365, 594366, 594367, 594368, 594369, 594370, 594371, 594372, 1085227, 1085228, 1085229, 1085230, 1085231, 1085232, 1085233, 1085234, 1085235, 1085236, 1085237, 1085238, 1085239, 1085240, 1085241, 1085242, 1085243, 1085244, 1085245, 1085246};
ItemIDsDatabase[44596] = {6044596, 44596, 368742, 368743, 368744, 368745, 368746, 368747, 368748, 368749, 368750, 368751, 368752, 368753, 594373, 594374, 594375, 594376, 594377, 594378, 594379, 594380, 594381, 594382, 1085247, 1085248, 1085249, 1085250, 1085251, 1085252, 1085253, 1085254, 1085255, 1085256, 1085257, 1085258, 1085259, 1085260, 1085261, 1085262, 1085263, 1085264, 1085265, 1085266};
ItemIDsDatabase[44597] = {6044597, 44597, 368754, 368755, 368756, 368757, 368758, 368759, 368760, 368761, 368762, 368763, 368764, 368765, 594383, 594384, 594385, 594386, 594387, 594388, 594389, 594390, 594391, 594392, 1085267, 1085268, 1085269, 1085270, 1085271, 1085272, 1085273, 1085274, 1085275, 1085276, 1085277, 1085278, 1085279, 1085280, 1085281, 1085282, 1085283, 1085284, 1085285, 1085286};
ItemIDsDatabase[44649] = {6044649, 44649, 368766, 368767, 368768, 368769, 368770, 368771, 368772, 368773, 368774, 368775, 368776, 368777, 594393, 594394, 594395, 594396, 594397, 594398, 594399, 594400, 594401, 594402, 1085287, 1085288, 1085289, 1085290, 1085291, 1085292, 1085293, 1085294, 1085295, 1085296, 1085297, 1085298, 1085299, 1085300, 1085301, 1085302, 1085303, 1085304, 1085305, 1085306};
ItemIDsDatabase[44666] = {6044666, 44666, 368874, 368875, 368876, 368877, 368878, 368879, 368880, 368881, 368882, 368883, 368884, 368885, 594483, 594484, 594485, 594486, 594487, 594488, 594489, 594490, 594491, 594492, 1085467, 1085468, 1085469, 1085470, 1085471, 1085472, 1085473, 1085474, 1085475, 1085476, 1085477, 1085478, 1085479, 1085480, 1085481, 1085482, 1085483, 1085484, 1085485, 1085486};
ItemIDsDatabase[44667] = {6044667, 44667, 368886, 368887, 368888, 368889, 368890, 368891, 368892, 368893, 368894, 368895, 368896, 368897, 594493, 594494, 594495, 594496, 594497, 594498, 594499, 594500, 594501, 594502, 1085487, 1085488, 1085489, 1085490, 1085491, 1085492, 1085493, 1085494, 1085495, 1085496, 1085497, 1085498, 1085499, 1085500, 1085501, 1085502, 1085503, 1085504, 1085505, 1085506};
ItemIDsDatabase[44668] = {6044668, 44668, 368898, 368899, 368900, 368901, 368902, 368903, 368904, 368905, 368906, 368907, 368908, 368909, 594503, 594504, 594505, 594506, 594507, 594508, 594509, 594510, 594511, 594512, 1085507, 1085508, 1085509, 1085510, 1085511, 1085512, 1085513, 1085514, 1085515, 1085516, 1085517, 1085518, 1085519, 1085520, 1085521, 1085522, 1085523, 1085524, 1085525, 1085526};
ItemIDsDatabase[44669] = {6044669, 44669, 368910, 368911, 368912, 368913, 368914, 368915, 368916, 368917, 368918, 368919, 368920, 368921, 594513, 594514, 594515, 594516, 594517, 594518, 594519, 594520, 594521, 594522, 1085527, 1085528, 1085529, 1085530, 1085531, 1085532, 1085533, 1085534, 1085535, 1085536, 1085537, 1085538, 1085539, 1085540, 1085541, 1085542, 1085543, 1085544, 1085545, 1085546};
ItemIDsDatabase[44670] = {6044670, 44670, 368922, 368923, 368924, 368925, 368926, 368927, 368928, 368929, 368930, 368931, 368932, 368933, 594523, 594524, 594525, 594526, 594527, 594528, 594529, 594530, 594531, 594532, 1085547, 1085548, 1085549, 1085550, 1085551, 1085552, 1085553, 1085554, 1085555, 1085556, 1085557, 1085558, 1085559, 1085560, 1085561, 1085562, 1085563, 1085564, 1085565, 1085566};
ItemIDsDatabase[44671] = {6044671, 44671, 368934, 368935, 368936, 368937, 368938, 368939, 368940, 368941, 368942, 368943, 368944, 368945, 594533, 594534, 594535, 594536, 594537, 594538, 594539, 594540, 594541, 594542, 1085567, 1085568, 1085569, 1085570, 1085571, 1085572, 1085573, 1085574, 1085575, 1085576, 1085577, 1085578, 1085579, 1085580, 1085581, 1085582, 1085583, 1085584, 1085585, 1085586};
ItemIDsDatabase[44672] = {6044672, 44672, 368946, 368947, 368948, 368949, 368950, 368951, 368952, 368953, 368954, 368955, 368956, 368957, 594543, 594544, 594545, 594546, 594547, 594548, 594549, 594550, 594551, 594552, 1085587, 1085588, 1085589, 1085590, 1085591, 1085592, 1085593, 1085594, 1085595, 1085596, 1085597, 1085598, 1085599, 1085600, 1085601, 1085602, 1085603, 1085604, 1085605, 1085606};
ItemIDsDatabase[44673] = {6044673, 44673, 368958, 368959, 368960, 368961, 368962, 368963, 368964, 368965, 368966, 368967, 368968, 368969, 594553, 594554, 594555, 594556, 594557, 594558, 594559, 594560, 594561, 594562, 1085607, 1085608, 1085609, 1085610, 1085611, 1085612, 1085613, 1085614, 1085615, 1085616, 1085617, 1085618, 1085619, 1085620, 1085621, 1085622, 1085623, 1085624, 1085625, 1085626};
ItemIDsDatabase[44674] = {6044674, 44674, 368970, 368971, 368972, 368973, 368974, 368975, 368976, 368977, 368978, 368979, 368980, 368981, 594563, 594564, 594565, 594566, 594567, 594568, 594569, 594570, 594571, 594572, 1085627, 1085628, 1085629, 1085630, 1085631, 1085632, 1085633, 1085634, 1085635, 1085636, 1085637, 1085638, 1085639, 1085640, 1085641, 1085642, 1085643, 1085644, 1085645, 1085646};
ItemIDsDatabase[44675] = {6044675, 44675, 368982, 368983, 368984, 368985, 368986, 368987, 368988, 368989, 368990, 368991, 368992, 368993, 594573, 594574, 594575, 594576, 594577, 594578, 594579, 594580, 594581, 594582, 1085647, 1085648, 1085649, 1085650, 1085651, 1085652, 1085653, 1085654, 1085655, 1085656, 1085657, 1085658, 1085659, 1085660, 1085661, 1085662, 1085663, 1085664, 1085665, 1085666};
ItemIDsDatabase[44676] = {6044676, 44676, 368994, 368995, 368996, 368997, 368998, 368999, 369000, 369001, 369002, 369003, 369004, 369005, 594583, 594584, 594585, 594586, 594587, 594588, 594589, 594590, 594591, 594592, 1085667, 1085668, 1085669, 1085670, 1085671, 1085672, 1085673, 1085674, 1085675, 1085676, 1085677, 1085678, 1085679, 1085680, 1085681, 1085682, 1085683, 1085684, 1085685, 1085686};
ItemIDsDatabase[44677] = {6044677, 44677, 369006, 369007, 369008, 369009, 369010, 369011, 369012, 369013, 369014, 369015, 369016, 369017, 594593, 594594, 594595, 594596, 594597, 594598, 594599, 594600, 594601, 594602, 1085687, 1085688, 1085689, 1085690, 1085691, 1085692, 1085693, 1085694, 1085695, 1085696, 1085697, 1085698, 1085699, 1085700, 1085701, 1085702, 1085703, 1085704, 1085705, 1085706};
ItemIDsDatabase[44681] = {6044681, 44681, 369018, 369019, 369020, 369021, 369022, 369023, 369024, 369025, 369026, 369027, 369028, 369029, 594603, 594604, 594605, 594606, 594607, 594608, 594609, 594610, 594611, 594612, 1085707, 1085708, 1085709, 1085710, 1085711, 1085712, 1085713, 1085714, 1085715, 1085716, 1085717, 1085718, 1085719, 1085720, 1085721, 1085722, 1085723, 1085724, 1085725, 1085726};
ItemIDsDatabase[44682] = {6044682, 44682, 369030, 369031, 369032, 369033, 369034, 369035, 369036, 369037, 369038, 369039, 369040, 369041, 594613, 594614, 594615, 594616, 594617, 594618, 594619, 594620, 594621, 594622, 1085727, 1085728, 1085729, 1085730, 1085731, 1085732, 1085733, 1085734, 1085735, 1085736, 1085737, 1085738, 1085739, 1085740, 1085741, 1085742, 1085743, 1085744, 1085745, 1085746};
ItemIDsDatabase[44683] = {6044683, 44683, 369042, 369043, 369044, 369045, 369046, 369047, 369048, 369049, 369050, 369051, 369052, 369053, 594623, 594624, 594625, 594626, 594627, 594628, 594629, 594630, 594631, 594632, 1085747, 1085748, 1085749, 1085750, 1085751, 1085752, 1085753, 1085754, 1085755, 1085756, 1085757, 1085758, 1085759, 1085760, 1085761, 1085762, 1085763, 1085764, 1085765, 1085766};
ItemIDsDatabase[44685] = {6044685, 44685, 369054, 369055, 369056, 369057, 369058, 369059, 369060, 369061, 369062, 369063, 369064, 369065, 594633, 594634, 594635, 594636, 594637, 594638, 594639, 594640, 594641, 594642, 1085767, 1085768, 1085769, 1085770, 1085771, 1085772, 1085773, 1085774, 1085775, 1085776, 1085777, 1085778, 1085779, 1085780, 1085781, 1085782, 1085783, 1085784, 1085785, 1085786};
ItemIDsDatabase[44686] = {6044686, 44686, 369066, 369067, 369068, 369069, 369070, 369071, 369072, 369073, 369074, 369075, 369076, 369077, 594643, 594644, 594645, 594646, 594647, 594648, 594649, 594650, 594651, 594652, 1085787, 1085788, 1085789, 1085790, 1085791, 1085792, 1085793, 1085794, 1085795, 1085796, 1085797, 1085798, 1085799, 1085800, 1085801, 1085802, 1085803, 1085804, 1085805, 1085806};
ItemIDsDatabase[44687] = {6044687, 44687, 369078, 369079, 369080, 369081, 369082, 369083, 369084, 369085, 369086, 369087, 369088, 369089, 594653, 594654, 594655, 594656, 594657, 594658, 594659, 594660, 594661, 594662, 1085807, 1085808, 1085809, 1085810, 1085811, 1085812, 1085813, 1085814, 1085815, 1085816, 1085817, 1085818, 1085819, 1085820, 1085821, 1085822, 1085823, 1085824, 1085825, 1085826};
ItemIDsDatabase[44688] = {6044688, 44688, 369090, 369091, 369092, 369093, 369094, 369095, 369096, 369097, 369098, 369099, 369100, 369101, 594663, 594664, 594665, 594666, 594667, 594668, 594669, 594670, 594671, 594672, 1085827, 1085828, 1085829, 1085830, 1085831, 1085832, 1085833, 1085834, 1085835, 1085836, 1085837, 1085838, 1085839, 1085840, 1085841, 1085842, 1085843, 1085844, 1085845, 1085846};
ItemIDsDatabase[44691] = {6044691, 44691, 369102, 369103, 369104, 369105, 369106, 369107, 369108, 369109, 369110, 369111, 369112, 369113, 594673, 594674, 594675, 594676, 594677, 594678, 594679, 594680, 594681, 594682, 1085847, 1085848, 1085849, 1085850, 1085851, 1085852, 1085853, 1085854, 1085855, 1085856, 1085857, 1085858, 1085859, 1085860, 1085861, 1085862, 1085863, 1085864, 1085865, 1085866};
ItemIDsDatabase[44695] = {6044695, 44695, 369114, 369115, 369116, 369117, 369118, 369119, 369120, 369121, 369122, 369123, 369124, 369125, 594683, 594684, 594685, 594686, 594687, 594688, 594689, 594690, 594691, 594692, 1085867, 1085868, 1085869, 1085870, 1085871, 1085872, 1085873, 1085874, 1085875, 1085876, 1085877, 1085878, 1085879, 1085880, 1085881, 1085882, 1085883, 1085884, 1085885, 1085886};
ItemIDsDatabase[44696] = {6044696, 44696, 369126, 369127, 369128, 369129, 369130, 369131, 369132, 369133, 369134, 369135, 369136, 369137, 594693, 594694, 594695, 594696, 594697, 594698, 594699, 594700, 594701, 594702, 1085887, 1085888, 1085889, 1085890, 1085891, 1085892, 1085893, 1085894, 1085895, 1085896, 1085897, 1085898, 1085899, 1085900, 1085901, 1085902, 1085903, 1085904, 1085905, 1085906};
ItemIDsDatabase[44697] = {6044697, 44697, 369138, 369139, 369140, 369141, 369142, 369143, 369144, 369145, 369146, 369147, 369148, 369149, 594703, 594704, 594705, 594706, 594707, 594708, 594709, 594710, 594711, 594712, 1085907, 1085908, 1085909, 1085910, 1085911, 1085912, 1085913, 1085914, 1085915, 1085916, 1085917, 1085918, 1085919, 1085920, 1085921, 1085922, 1085923, 1085924, 1085925, 1085926};
ItemIDsDatabase[44703] = {369151, 44703, 369150, 369152, 369153, 369154, 369155, 369156, 369157, 369158, 369159, 369160, 369161, 369162, 594713, 594714, 594715, 594716, 594717, 594718, 594719, 594720, 594721, 594722, 1085927, 1085928, 1085929, 1085930, 1085931, 1085932, 1085933, 1085934, 1085935, 1085936, 1085937, 1085938, 1085939, 1085940, 1085941, 1085942, 1085943, 1085944, 1085945, 1085946};
ItemIDsDatabase[44708] = {6044708, 44708, 369163, 369164, 369165, 369166, 369167, 369168, 369169, 369170, 369171, 369172, 369173, 369174, 594723, 594724, 594725, 594726, 594727, 594728, 594729, 594730, 594731, 594732, 1085947, 1085948, 1085949, 1085950, 1085951, 1085952, 1085953, 1085954, 1085955, 1085956, 1085957, 1085958, 1085959, 1085960, 1085961, 1085962, 1085963, 1085964, 1085965, 1085966};
ItemIDsDatabase[44732] = {6044732, 44732, 369188, 369189, 369190, 369191, 369192, 369193, 369194, 369195, 369196, 369197, 369198, 369199, 594743, 594744, 594745, 594746, 594747, 594748, 594749, 594750, 594751, 594752, 1085987, 1085988, 1085989, 1085990, 1085991, 1085992, 1085993, 1085994, 1085995, 1085996, 1085997, 1085998, 1085999, 1086000, 1086001, 1086002, 1086003, 1086004, 1086005, 1086006};
ItemIDsDatabase[44734] = {6044734, 44734, 369200, 369201, 369202, 369203, 369204, 369205, 369206, 369207, 369208, 369209, 369210, 369211, 594753, 594754, 594755, 594756, 594757, 594758, 594759, 594760, 594761, 594762, 1086007, 1086008, 1086009, 1086010, 1086011, 1086012, 1086013, 1086014, 1086015, 1086016, 1086017, 1086018, 1086019, 1086020, 1086021, 1086022, 1086023, 1086024, 1086025, 1086026};
ItemIDsDatabase[44735] = {6044735, 44735, 369212, 369213, 369214, 369215, 369216, 369217, 369218, 369219, 369220, 369221, 369222, 369223, 594763, 594764, 594765, 594766, 594767, 594768, 594769, 594770, 594771, 594772, 1086027, 1086028, 1086029, 1086030, 1086031, 1086032, 1086033, 1086034, 1086035, 1086036, 1086037, 1086038, 1086039, 1086040, 1086041, 1086042, 1086043, 1086044, 1086045, 1086046};
ItemIDsDatabase[44736] = {6044736, 44736, 369224, 369225, 369226, 369227, 369228, 369229, 369230, 369231, 369232, 369233, 369234, 369235, 594773, 594774, 594775, 594776, 594777, 594778, 594779, 594780, 594781, 594782, 1086047, 1086048, 1086049, 1086050, 1086051, 1086052, 1086053, 1086054, 1086055, 1086056, 1086057, 1086058, 1086059, 1086060, 1086061, 1086062, 1086063, 1086064, 1086065, 1086066};
ItemIDsDatabase[44740] = {6044740, 44740, 369236, 369237, 369238, 369239, 369240, 369241, 369242, 369243, 369244, 369245, 369246, 369247, 594783, 594784, 594785, 594786, 594787, 594788, 594789, 594790, 594791, 594792, 1086067, 1086068, 1086069, 1086070, 1086071, 1086072, 1086073, 1086074, 1086075, 1086076, 1086077, 1086078, 1086079, 1086080, 1086081, 1086082, 1086083, 1086084, 1086085, 1086086};
ItemIDsDatabase[44741] = {6044741, 44741, 369248, 369249, 369250, 369251, 369252, 369253, 369254, 369255, 369256, 369257, 369258, 369259, 594793, 594794, 594795, 594796, 594797, 594798, 594799, 594800, 594801, 594802, 1086087, 1086088, 1086089, 1086090, 1086091, 1086092, 1086093, 1086094, 1086095, 1086096, 1086097, 1086098, 1086099, 1086100, 1086101, 1086102, 1086103, 1086104, 1086105, 1086106};
ItemIDsDatabase[44742] = {6044742, 44742, 369260, 369261, 369262, 369263, 369264, 369265, 369266, 369267, 369268, 369269, 369270, 369271, 594803, 594804, 594805, 594806, 594807, 594808, 594809, 594810, 594811, 594812, 1086107, 1086108, 1086109, 1086110, 1086111, 1086112, 1086113, 1086114, 1086115, 1086116, 1086117, 1086118, 1086119, 1086120, 1086121, 1086122, 1086123, 1086124, 1086125, 1086126};
ItemIDsDatabase[44745] = {6044745, 44745, 369272, 369273, 369274, 369275, 369276, 369277, 369278, 369279, 369280, 369281, 369282, 369283, 594813, 594814, 594815, 594816, 594817, 594818, 594819, 594820, 594821, 594822, 1086127, 1086128, 1086129, 1086130, 1086131, 1086132, 1086133, 1086134, 1086135, 1086136, 1086137, 1086138, 1086139, 1086140, 1086141, 1086142, 1086143, 1086144, 1086145, 1086146};
ItemIDsDatabase[44746] = {6044746, 44746, 369284, 369285, 369286, 369287, 369288, 369289, 369290, 369291, 369292, 369293, 369294, 369295, 594823, 594824, 594825, 594826, 594827, 594828, 594829, 594830, 594831, 594832, 1086147, 1086148, 1086149, 1086150, 1086151, 1086152, 1086153, 1086154, 1086155, 1086156, 1086157, 1086158, 1086159, 1086160, 1086161, 1086162, 1086163, 1086164, 1086165, 1086166};
ItemIDsDatabase[44747] = {6044747, 44747, 369296, 369297, 369298, 369299, 369300, 369301, 369302, 369303, 369304, 369305, 369306, 369307, 594833, 594834, 594835, 594836, 594837, 594838, 594839, 594840, 594841, 594842, 1086167, 1086168, 1086169, 1086170, 1086171, 1086172, 1086173, 1086174, 1086175, 1086176, 1086177, 1086178, 1086179, 1086180, 1086181, 1086182, 1086183, 1086184, 1086185, 1086186};
ItemIDsDatabase[44748] = {6044748, 44748, 369308, 369309, 369310, 369311, 369312, 369313, 369314, 369315, 369316, 369317, 369318, 369319, 594843, 594844, 594845, 594846, 594847, 594848, 594849, 594850, 594851, 594852, 1086187, 1086188, 1086189, 1086190, 1086191, 1086192, 1086193, 1086194, 1086195, 1086196, 1086197, 1086198, 1086199, 1086200, 1086201, 1086202, 1086203, 1086204, 1086205, 1086206};
ItemIDsDatabase[44924] = {6044924, 44924, 369608, 369609, 369610, 369611, 369612, 369613, 369614, 369615, 369616, 369617, 369618, 369619, 595093, 595094, 595095, 595096, 595097, 595098, 595099, 595100, 595101, 595102, 1086687, 1086688, 1086689, 1086690, 1086691, 1086692, 1086693, 1086694, 1086695, 1086696, 1086697, 1086698, 1086699, 1086700, 1086701, 1086702, 1086703, 1086704, 1086705, 1086706};
ItemIDsDatabase[45849] = {6045849, 45849, 375717, 375718, 375719, 375720, 375721, 375722, 375723, 375724, 375725, 375726, 375727, 375728, 600366, 600367, 600368, 600369, 600370, 600371, 600372, 600373, 600374, 600375, 1097067, 1097068, 1097069, 1097070, 1097071, 1097072, 1097073, 1097074, 1097075, 1097076, 1097077, 1097078, 1097079, 1097080, 1097081, 1097082, 1097083, 1097084, 1097085, 1097086};
ItemIDsDatabase[45850] = {6045850, 45850, 375729, 375730, 375731, 375732, 375733, 375734, 375735, 375736, 375737, 375738, 375739, 375740, 600376, 600377, 600378, 600379, 600380, 600381, 600382, 600383, 600384, 600385, 1097087, 1097088, 1097089, 1097090, 1097091, 1097092, 1097093, 1097094, 1097095, 1097096, 1097097, 1097098, 1097099, 1097100, 1097101, 1097102, 1097103, 1097104, 1097105, 1097106};
ItemIDsDatabase[45851] = {6045851, 45851, 375741, 375742, 375743, 375744, 375745, 375746, 375747, 375748, 375749, 375750, 375751, 375752, 600386, 600387, 600388, 600389, 600390, 600391, 600392, 600393, 600394, 600395, 1097107, 1097108, 1097109, 1097110, 1097111, 1097112, 1097113, 1097114, 1097115, 1097116, 1097117, 1097118, 1097119, 1097120, 1097121, 1097122, 1097123, 1097124, 1097125, 1097126};
ItemIDsDatabase[45852] = {6045852, 45852, 375753, 375754, 375755, 375756, 375757, 375758, 375759, 375760, 375761, 375762, 375763, 375764, 600396, 600397, 600398, 600399, 600400, 600407, 600408, 600409, 600410, 600411, 1097127, 1097128, 1097129, 1097130, 1097131, 1097132, 1097133, 1097134, 1097135, 1097136, 1097137, 1097138, 1097139, 1097140, 1097141, 1097142, 1097143, 1097144, 1097145, 1097146};
ItemIDsDatabase[45853] = {6045853, 45853, 375765, 375766, 375767, 375768, 375769, 375770, 375771, 375772, 375773, 375774, 375775, 375776, 600412, 600413, 600414, 600415, 600416, 600417, 600418, 600419, 600420, 600421, 1097147, 1097148, 1097149, 1097150, 1097151, 1097152, 1097153, 1097154, 1097155, 1097156, 1097157, 1097158, 1097159, 1097160, 1097161, 1097162, 1097163, 1097164, 1097165, 1097166};
ItemIDsDatabase[45854] = {6045854, 45854, 375777, 375778, 375779, 375780, 375781, 375782, 375783, 375784, 375785, 375786, 375787, 375788, 600422, 600423, 600424, 600425, 600426, 600427, 600428, 600429, 600430, 600431, 1097167, 1097168, 1097169, 1097170, 1097171, 1097172, 1097173, 1097174, 1097175, 1097176, 1097177, 1097178, 1097179, 1097180, 1097181, 1097182, 1097183, 1097184, 1097185, 1097186};
ItemIDsDatabase[46324] = {6046324, 46324, 380131, 380132, 380133, 380134, 380135, 380136, 380137, 380138, 380139, 380140, 380141, 380142, 603976, 603977, 603978, 603979, 603980, 603981, 603982, 603983, 603984, 603985, 1104205, 1104206, 1104207, 1104208, 1104209, 1104210, 1104211, 1104212, 1104213, 1104214, 1104215, 1104216, 1104217, 1104218, 1104219, 1104220, 1104221, 1104222, 1104223, 1104224};
ItemIDsDatabase[49227] = {6049227, 49227, 388355, 388356, 388357, 388358, 388359, 388360, 388361, 388362, 388363, 388364, 388365, 388366, 615278, 615279, 615280, 615281, 615282, 615283, 615284, 615285, 615286, 615287, 1126679, 1126680, 1126681, 1126682, 1126683, 1126684, 1126685, 1126686, 1126687, 1126688, 1126689, 1126690, 1126691, 1126692, 1126693, 1126694, 1126695, 1126696, 1126697, 1126698};
ItemIDsDatabase[51958] = {6051958, 51958, 397193, 397194, 397195, 397196, 397197, 397198, 397199, 397200, 397201, 397202, 397203, 397204, 626479, 626480, 626481, 626482, 626483, 626484, 626485, 626486, 626487, 626488, 1149041, 1149042, 1149043, 1149044, 1149045, 1149046, 1149047, 1149048, 1149049, 1149050, 1149051, 1149052, 1149053, 1149054, 1149055, 1149056, 1149057, 1149058, 1149059, 1149060};
ItemIDsDatabase[53889] = {6053889, 53889, 397981, 397982, 397983, 397984, 397985, 397986, 397987, 397988, 397989, 397990, 397991, 397992, 627379, 627380, 627381, 627382, 627383, 627384, 627385, 627386, 627387, 627388, 1150841, 1150842, 1150843, 1150844, 1150845, 1150846, 1150847, 1150848, 1150849, 1150850, 1150851, 1150852, 1150853, 1150854, 1150855, 1150856, 1150857, 1150858, 1150859, 1150860};
ItemIDsDatabase[53890] = {6053890, 53890, 397993, 397994, 397995, 397996, 397997, 397998, 397999, 398000, 398001, 398002, 398003, 398004, 627389, 627390, 627391, 627392, 627393, 627394, 627395, 627396, 627397, 627398, 1150861, 1150862, 1150863, 1150864, 1150865, 1150866, 1150867, 1150868, 1150869, 1150870, 1150871, 1150872, 1150873, 1150874, 1150875, 1150876, 1150877, 1150878, 1150879, 1150880};
--Items not added from generated file
ItemIDsDatabase[53890] = {6053891, 53890, 2232902, 2332902};
ItemIDsDatabase[53890] = {6044831, 53890, 344831, 244831};
ItemIDsDatabase[27896] = {53890, 27896, 27896, 427896};
+119
View File
@@ -0,0 +1,119 @@
--Items not added from generated file
ItemIDsDatabase[18563] = {18563, 18563, 318563, 218563};
ItemIDsDatabase[18564] = {18564, 18564, 318564, 218564};
ItemIDsDatabase[17204] = {17204, 17204, 317204, 217204};
ItemIDsDatabase[19017] = {19017, 19017, 319017, 219017};
ItemIDsDatabase[11879] = {11879, 11879, 311879, 211879};
ItemIDsDatabase[22589] = {6022589, 22589, 322589, 222589};
ItemIDsDatabase[22632] = {6022632, 22632, 322632, 222632};
ItemIDsDatabase[22631] = {6022631, 22631, 322631, 222631};
ItemIDsDatabase[22630] = {6022630, 22630, 322630, 222630};
ItemIDsDatabase[2032902] = {6053891, 2032902, 2232902, 2332902};
ItemIDsDatabase[44831] = {6044831, 44831, 344831, 244831};
ItemIDsDatabase[27896] = {6027896, 27896, 27896, 427896};
ItemIDsDatabase[30007] = {6030007, 30007, 330007, 230007};
ItemIDsDatabase[30015] = {6030015, 30015, 330015, 230015};
ItemIDsDatabase[30017] = {6030017, 30017, 330017, 230017};
ItemIDsDatabase[30018] = {6030018, 30018, 330018, 230018};
ItemIDsDatabase[32837] = {6032837, 32837, 332837, 232837};
ItemIDsDatabase[32838] = {6032838, 32838, 332838, 232838};
ItemIDsDatabase[30104] = {6033482, 30104, 330104, 230104};
--Tier 1 Tokens
ItemIDsDatabase[2522360] = {2522360, 2522360, 2622360, 2722360};
ItemIDsDatabase[2522361] = {2522361, 2522361, 2622361, 2722361};
ItemIDsDatabase[2522350] = {2522350, 2522350, 2622350, 2722350};
ItemIDsDatabase[2522362] = {2522362, 2522362, 2622362, 2722362};
ItemIDsDatabase[2522363] = {2522363, 2522363, 2622363, 2722363};
ItemIDsDatabase[2522364] = {2522364, 2522364, 2622364, 2722364};
ItemIDsDatabase[2522359] = {2522359, 2522359, 2622359, 2722359};
ItemIDsDatabase[2522365] = {2522365, 2522365, 2622365, 2722365};
--Tier 2 Tokens
ItemIDsDatabase[2522460] = {2522460, 2522460, 2622460, 2722460};
ItemIDsDatabase[2522461] = {2522461, 2522461, 2622461, 2722461};
ItemIDsDatabase[2522450] = {2522450, 2522450, 2622450, 2722450};
ItemIDsDatabase[2522462] = {2522462, 2522462, 2622462, 2722462};
ItemIDsDatabase[2522464] = {2522464, 2522464, 2622464, 2722464};
ItemIDsDatabase[2522463] = {2522463, 2522463, 2622463, 2722463};
ItemIDsDatabase[2522459] = {2522459, 2522459, 2622459, 2722459};
ItemIDsDatabase[2522465] = {2522465, 2522465, 2622465, 2722465};
--Tier 3 Tokens
ItemIDsDatabase[22353] = {22353, 22353, 102278, 222353};
ItemIDsDatabase[22354] = {22354, 22354, 102286, 222354};
ItemIDsDatabase[22349] = {22349, 22349, 102264, 222349};
ItemIDsDatabase[22355] = {22355, 22355, 102262, 222355};
ItemIDsDatabase[22357] = {22357, 22357, 102268, 222357};
ItemIDsDatabase[22356] = {22356, 22356, 102300, 222356};
ItemIDsDatabase[22352] = {22352, 22352, 102284, 222352};
ItemIDsDatabase[22358] = {22358, 22358, 102290, 222358};
--Tier 4 Tokens
ItemIDsDatabase[29761] = {29761, 29761, 329761, 229761};
ItemIDsDatabase[29764] = {29764, 29764, 329764, 229764};
ItemIDsDatabase[29753] = {29753, 29753, 329753, 229753};
ItemIDsDatabase[29758] = {29758, 29758, 329758, 229758};
ItemIDsDatabase[29767] = {29767, 29767, 329767, 229767};
--Tier 5 Tokens
ItemIDsDatabase[30243] = {30243, 30243, 330243, 230243};
ItemIDsDatabase[30249] = {30249, 30249, 330249, 230249};
ItemIDsDatabase[30237] = {30237, 30237, 330237, 230237};
ItemIDsDatabase[30240] = {30240, 30240, 330240, 230240};
ItemIDsDatabase[30246] = {30246, 30246, 30246, 230246};
--Druid
ItemIDsDatabase[29098] = {6029098, 29098, 314712, 214712};
ItemIDsDatabase[29100] = {6029100, 29100, 314714, 214714};
ItemIDsDatabase[29096] = {6029096, 29096, 314710, 214710};
ItemIDsDatabase[29097] = {6029097, 29097, 314711, 214711};
ItemIDsDatabase[29099] = {6029099, 29099, 314713, 214713};
--ZA New Items
ItemIDsDatabase[21824] = {6021824, 21824, 321824, 221824};
ItemIDsDatabase[24574] = {6024574, 24574, 324574, 224574};
ItemIDsDatabase[28354] = {6028354, 28354, 328354, 228354};
ItemIDsDatabase[33059] = {6033059, 33059, 333059, 233059};
ItemIDsDatabase[33983] = {6033983, 33983, 333983, 233983};
ItemIDsDatabase[39755] = {6039755, 39755, 339755, 239755};
ItemIDsDatabase[33533] = {6033533, 33533, 333533, 233533};
ItemIDsDatabase[33979] = {6033979, 33979, 333979, 233979};
ItemIDsDatabase[34071] = {6034071, 34071, 334071, 234071};
ItemIDsDatabase[38634] = {6038634, 38634, 338634, 238634};
ItemIDsDatabase[33500] = {6033500, 33500, 333500, 233500};
ItemIDsDatabase[33496] = {6033496, 33496, 333496, 233496};
ItemIDsDatabase[33498] = {6033498, 33498, 333498, 233498};
ItemIDsDatabase[33971] = {6033971, 33971, 333971, 233971};
ItemIDsDatabase[33495] = {6033495, 33495, 333495, 233495};
ItemIDsDatabase[33480] = {6033480, 33480, 333480, 233480};
ItemIDsDatabase[33591] = {6033591, 33591, 333591, 233591};
ItemIDsDatabase[33590] = {6033590, 33590, 333590, 233590};
ItemIDsDatabase[33481] = {6033481, 33481, 333481, 233481};
ItemIDsDatabase[33492] = {6033492, 33492, 333492, 233492};
ItemIDsDatabase[33499] = {6033499, 33499, 333499, 233499};
ItemIDsDatabase[33805] = {6033805, 33805, 333805, 233805};
ItemIDsDatabase[33491] = {6033491, 33491, 333491, 233491};
ItemIDsDatabase[33490] = {6033490, 33490, 333490, 233490};
ItemIDsDatabase[33489] = {6033489, 33489, 333489, 233489};
ItemIDsDatabase[33483] = {6033483, 33483, 333483, 233483};
ItemIDsDatabase[33493] = {6033493, 33493, 333493, 233493};
ItemIDsDatabase[33497] = {6033497, 33497, 333497, 233497};
ItemIDsDatabase[33494] = {6033494, 33494, 333494, 233494};
ItemIDsDatabase[24537] = {6024537, 24537, 324537, 224537};
--ZA Bears
ItemIDsDatabase[1333809] = {1333809, 1333809, 1433809, 1233809};
--intact vial of kael'thas sunstrider
ItemIDsDatabase[450001] = {450001, 450001, 450003, 450005};
ItemIDsDatabase[450000] = {450000, 450000, 450002, 450004};
+147
View File
@@ -0,0 +1,147 @@
--[[
Name : AtlasLootFu
Version : 2.0
Author : Daviesh (oma_daviesh@hotmail.com)
Website : https://discord.gg/uYCE2X2FgA
Description : Adds AtlasLoot to FuBar.
]]
--Invoke libraries
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
--Make an LDB object
LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject("AtlasLoot", {
type = "launcher",
icon = "Interface\\Icons\\INV_Box_01",
OnClick = function()
if IsShiftKeyDown() then
AtlasLootOptions_Toggle();
else
if AtlasLootDefaultFrame:IsVisible() then
AtlasLootDefaultFrame:Hide();
else
AtlasLootDefaultFrame:Show();
end
end
end,
})
function AtlasLoot_OnBarButtonClick(button)
if IsShiftKeyDown() then
AtlasLootOptions_Toggle();
else
if AtlasLootDefaultFrame:IsVisible() then
AtlasLootDefaultFrame:Hide();
else
AtlasLootDefaultFrame:Show();
end
end
end
--[[function AtlasLoot_MinimapButtonInit()
if AtlasLootMinimapButtonFrame then
if IsAddOnLoaded("FuBar") then
AtlasLootMinimapButtonFrame:SetPoint("CENTER", "UIParent", "CENTER");
AtlasLootMinimapButtonFrame:Hide();
elseif(AtlasLoot.db.profile.MinimapButton == true) then
AtlasLootMinimapButtonFrame:SetPoint("TOPLEFT","Minimap","TOPLEFT",54 - (78 * cos(AtlasLoot.db.profile.MinimapButtonAngle)),(78 * sin(AtlasLoot.db.profile.MinimapButtonAngle)) - 55);
AtlasLootMinimapButtonFrame:Show();
else
AtlasLootMinimapButtonFrame:SetPoint("CENTER", "UIParent", "CENTER");
AtlasLootMinimapButtonFrame:Hide();
end
end
end
function AtlasLoot_MinimapButtonOnEnter()
GameTooltip:SetOwner(this, "ANCHOR_LEFT");
GameTooltip:SetText(string.sub(ATLASLOOT_VERSION, 11, 28));
GameTooltip:AddLine(AL["|cff1eff00Left-Click|r Browse Loot Tables"]);
GameTooltip:AddLine(AL["|cffff0000Shift-Click|r View Options"]);
GameTooltip:AddLine(AL["|cffccccccRight-Click + Drag|r Move Minimap Button"]);
GameTooltip:Show();
end
-- Thanks to Yatlas and Atlas for this code
function AtlasLoot_MinimapButtonBeingDragged()
-- Thanks to Gello and Dan Gilbert for this code
local xpos,ypos = GetCursorPosition()
local xmin,ymin = Minimap:GetLeft(), Minimap:GetBottom()
xpos = xmin-xpos/UIParent:GetScale()+70
ypos = ypos/UIParent:GetScale()-ymin-70
AtlasLoot_MinimapButtonSetPosition(math.deg(math.atan2(ypos,xpos)));
end
function AtlasLoot_MinimapButtonSetPosition(v)
if(v < 0) then
v = v + 360;
end
AtlasLoot.db.profile.MinimapButtonAngle = v;
AtlasLoot_MinimapButtonUpdatePosition();
end
function AtlasLoot_MinimapButtonUpdatePosition()
local radius = AtlasLoot.db.profile.MinimapButtonRadius;
AtlasLootMinimapButtonFrame:SetPoint(
"TOPLEFT",
"Minimap",
"TOPLEFT",
54 - (radius * cos(AtlasLoot.db.profile.MinimapButtonAngle)),
(radius * sin(AtlasLoot.db.profile.MinimapButtonAngle)) - 55
);
if(AtlasLoot.db.profile.MinimapButton == true) then
AtlasLootMinimapButtonFrame:Show();
else
AtlasLootMinimapButtonFrame:Hide();
end
end]]
--[[if IsAddOnLoaded("FuBar") then
if AtlasLootMinimapButtonFrame then
AtlasLootMinimapButtonFrame:SetPoint("CENTER", "UIParent", "CENTER");
AtlasLootMinimapButtonFrame:Hide();
end
AtlasLootFu = LibStub("AceAddon-3.0"):NewAddon("AtlasLootFu");
AceDB = LibStub("AceDB-3.0");
AtlasLootFu.db = AceDB:New("AtlasLootFuDB");
LibStub("AceAddon-3.0"):EmbedLibrary(AtlasLootFu, "LibFuBarPlugin-Mod-3.0", true);
AtlasLootFu:SetFuBarOption("tooltipType", "GameTooltip");
--AtlasLootFu:SetFuBarOption("configType", "Dewdrop-2.0");
AtlasLootFu:SetFuBarOption("iconPath", "Interface\\Icons\\INV_Box_01");
--AtlasLootFu:SetFuBarOption("defaultMinimapPosition", 220);
AtlasLootFu:SetFuBarOption("cannotDetachTooltip", true);
AtlasLootFu:SetFuBarOption("hasNoColor", true);
--Make sure the plugin is the rightt format when activated
function AtlasLootFu:OnEnable()
self:UpdateFuBarPlugin();
end
--Define text to display when the cursor mouses over the plugin
function AtlasLootFu:OnUpdateFuBarTooltip()
GameTooltip:AddLine(AL["|cff1eff00Left-Click|r Browse Loot Tables"]);
GameTooltip:AddLine(AL["|cffff0000Shift-Click|r View Options"]);
GameTooltip:AddLine(AL["|cffccccccLeft-Click + Drag|r Move Minimap Button"]);
end
--Define what to do when the plugin is clicked
function AtlasLootFu:OnFuBarClick(button)
--Left click -> open loot browser
--Shift Left Click -> show options menu
--Right click -> standard FuBar options
AtlasLoot_OnBarButtonClick(button);
end
function AtlasLootFu:OpenMenu()
AtlasLootOptions_Toggle();
end
end]]
+381
View File
@@ -0,0 +1,381 @@
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
local GREY = "|cff999999";
local RED = "|cffff0000";
local WHITE = "|cffFFFFFF";
local GREEN = "|cff1eff00";
local PURPLE = "|cff9F3FFF";
local BLUE = "|cff0070dd";
local ORANGE = "|cffFF8400";
local DEFAULT = "|cffFFd200";
local ParseTooltip_Enabled = false;
local AtlasLootScanTooltip = CreateFrame("GAMETOOLTIP","AtlasLootScanTooltip",nil,"GameTooltipTemplate");
AtlasLootScanTooltip:SetOwner(UIParent, "ANCHOR_NONE");
function AtlasLoot_GetEnchantLink(enchantID)
if not enchantID then return end
local EnchantLink = nil
AtlasLootScanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
AtlasLootScanTooltip:ClearLines();
AtlasLootScanTooltip:SetHyperlink("enchant:"..enchantID);
AtlasLootScanTooltip:Show()
local tooltipline = _G["AtlasLootScanTooltipTextLeft1"]
local text = tooltipline:GetText()
if text and string.find(text, ":") then
EnchantLink = "|cffffd000|Henchant:"..enchantID.."|h["..text.."]|h|r"
else
EnchantLink = GetSpellLink(enchantID)
end
AtlasLootScanTooltip:Hide()
return EnchantLink
end
--------------------------------------------------------------------------------
-- Item OnEnter
-- Called when a loot item is moused over
--------------------------------------------------------------------------------
function AtlasLootItem_OnEnter(self)
local isItem;
AtlasLootTooltip:ClearLines();
for i=1, 30, 1 do
if (_G["AtlasLootTooltipTextRight"..i] ~= nil) then
_G["AtlasLootTooltipTextRight"..i]:SetText("");
end
end
if self.itemID and (self.itemID ~= 0) then
if string.sub(self.itemID, 1, 1) == "s" then
isItem = false;
else
isItem = true;
end
if isItem then
local color = strsub(_G["AtlasLootItem_"..self:GetID().."_Name"]:GetText(), 3, 10);
local name = strsub(_G["AtlasLootItem_"..self:GetID().."_Name"]:GetText(), 11);
if(self.itemID ~= 0 and self.itemID ~= "" and self.itemID ~= nil and AtlasLootDKPValues and AtlasLootClassPriority) then
Identifier = "Item"..self.itemID;
DKP = AtlasLootDKPValues[Identifier];
priority = AtlasLootClassPriority[Identifier];
else
DKP = nil;
priority = nil;
end
--Lootlink tooltips
if( AtlasLoot.db.profile.LootlinkTT ) then
--If we have seen the item, use the game tooltip to minimise same name item problems
if(GetItemInfo(self.itemID) ~= nil) then
_G[self:GetName().."_Unsafe"]:Hide();
AtlasLootTooltip:SetOwner(self, "ANCHOR_RIGHT", -(self:GetWidth() / 2), 24);
AtlasLootTooltip:SetHyperlink("item:"..self.itemID..":0:0:0");
if ( AtlasLoot.db.profile.ItemIDs ) then
AtlasLootTooltip:AddLine(BLUE..AL["ItemID:"].." "..self.itemID, nil, nil, nil, 1);
end
if( self.droprate ~= nil) then
AtlasLootTooltip:AddLine(AL["Drop Rate: "]..self.droprate, 1, 1, 0);
end
if( DKP ~= nil and DKP ~= "" ) then
AtlasLootTooltip:AddLine(RED..DKP.." "..AL["DKP"], 1, 1, 0, 1);
end
if( priority ~= nil and priority ~= "" ) then
AtlasLootTooltip:AddLine(GREEN..AL["Priority:"].." "..priority, 1, 1, 0, 1);
end
AtlasLootTooltip:Show();
if((AtlasLoot.db.profile.EquipCompare and ((not EquipCompare_RegisterTooltip) or (not EquipCompare_Enabled)))) or IsShiftKeyDown() then
AtlasLootItem_ShowCompareItem(self); --- CALL MISSING METHOD TO SHOW 2 TOOLTIPS (Item Compare)
end
if (LootLink_AddItem) then
LootLink_AddItem(name, self.itemID..":0:0:0", color);
end
else
_G[self:GetName().."_Unsafe"]:Show();
AtlasLootTooltip:SetOwner(self, "ANCHOR_RIGHT", -(self:GetWidth() / 2), 24);
if (LootLink_Database and LootLink_Database[self.itemID]) then
LootLink_SetTooltip(AtlasLootTooltip, LootLink_Database[self.itemID][1], 1);
else
LootLink_SetTooltip(AtlasLootTooltip,strsub(_G["AtlasLootItem_"..self:GetID().."_Name"]:GetText(), 11), 1);
end
if ( AtlasLoot.db.profile.ItemIDs ) then
AtlasLootTooltip:AddLine(BLUE..AL["ItemID:"].." "..self.itemID, nil, nil, nil, 1);
end
if( self.droprate ~= nil) then
AtlasLootTooltip:AddLine(AL["Drop Rate: "]..self.droprate, 1, 1, 0, 1);
end
if( DKP ~= nil and DKP ~= "" ) then
AtlasLootTooltip:AddLine(RED..DKP.." "..AL["DKP"], 1, 1, 0);
end
if( priority ~= nil and priority ~= "" ) then
AtlasLootTooltip:AddLine(GREEN..AL["Priority:"].." "..priority, 1, 1, 0);
end
AtlasLootTooltip:AddLine(" ");
AtlasLootTooltip:AddLine(AL["You can right-click to attempt to query the server. You may be disconnected."], nil, nil, nil, 1);
AtlasLootTooltip:Show();
end
--Item Sync tooltips
elseif( AtlasLoot.db.profile.ItemSyncTT ) then
if(GetItemInfo(self.itemID) ~= nil) then
_G[self:GetName().."_Unsafe"]:Hide();
end
ItemSync:ButtonEnter();
if ( AtlasLoot.db.profile.ItemIDs ) then
GameTooltip:AddLine(BLUE..AL["ItemID:"].." "..self.itemID, nil, nil, nil, 1);
end
if( self.droprate ~= nil) then
GameTooltip:AddLine(AL["Drop Rate: "]..self.droprate, 1, 1, 0);
end
if( DKP ~= nil and DKP ~= "" ) then
GameTooltip:AddLine(RED..DKP.." "..AL["DKP"], 1, 1, 0);
end
if( priority ~= nil and priority ~= "" ) then
GameTooltip:AddLine(GREEN..AL["Priority:"].." "..priority, 1, 1, 0);
end
GameTooltip:Show();
if((AtlasLoot.db.profile.EquipCompare and ((not EquipCompare_RegisterTooltip) or (not EquipCompare_Enabled)))) or IsShiftKeyDown() then
GameTooltip_ShowCompareItem(); --- CALL MISSING METHOD TO SHOW 2 TOOLTIPS (Item Compare)
end
--Default game tooltips
else
if(self.itemID ~= nil) then
if(GetItemInfo(self.itemID) ~= nil) then
_G[self:GetName().."_Unsafe"]:Hide();
AtlasLootTooltip:SetOwner(self, "ANCHOR_RIGHT", -(self:GetWidth() / 2), 24);
AtlasLootTooltip:SetHyperlink("item:"..self.itemID..":0:0:0");
if ( AtlasLoot.db.profile.ItemIDs ) then
AtlasLootTooltip:AddLine(BLUE..AL["ItemID:"].." "..self.itemID, nil, nil, nil, 1);
end
if( self.droprate ~= nil) then
AtlasLootTooltip:AddLine(AL["Drop Rate: "]..self.droprate, 1, 1, 0);
end
if( DKP ~= nil and DKP ~= "" ) then
AtlasLootTooltip:AddLine(RED..DKP.." "..AL["DKP"], 1, 1, 0);
end
if( priority ~= nil and priority ~= "" ) then
AtlasLootTooltip:AddLine(GREEN..AL["Priority:"].." "..priority, 1, 1, 0);
end
AtlasLootTooltip:Show();
if((AtlasLoot.db.profile.EquipCompare and ((not EquipCompare_RegisterTooltip) or (not EquipCompare_Enabled)))) or IsShiftKeyDown() then
AtlasLootItem_ShowCompareItem(self); --- CALL MISSING METHOD TO SHOW 2 TOOLTIPS (Item Compare)
end
else
AtlasLootTooltip:SetOwner(self, "ANCHOR_RIGHT", -(self:GetWidth() / 2), 24);
AtlasLootTooltip:ClearLines();
AtlasLootTooltip:AddLine(RED..AL["Item Unavailable"], nil, nil, nil, 1);
AtlasLootTooltip:AddLine(BLUE..AL["ItemID:"].." "..self.itemID, nil, nil, nil, 1);
AtlasLootTooltip:AddLine(AL["self item is unsafe. To view self item without the risk of disconnection, you need to have first seen it in the game world. This is a restriction enforced by Blizzard since Patch 1.10."], nil, nil, nil, 1);
AtlasLootTooltip:AddLine(" ");
AtlasLootTooltip:AddLine(AL["You can right-click to attempt to query the server. You may be disconnected."], nil, nil, nil, 1);
AtlasLootTooltip:Show();
end
end
end
else
spellID = string.sub(self.itemID, 2);
AtlasLootTooltip:SetOwner(self, "ANCHOR_RIGHT", -(self:GetWidth() / 2), 24);
AtlasLootTooltip:ClearLines();
AtlasLootTooltip:SetHyperlink(AtlasLoot_GetEnchantLink(spellID));
AtlasLootTooltip:Show();
if(self.spellitemID and ((AtlasLoot.db.profile.EquipCompare and ((not EquipCompare_RegisterTooltip) or (not EquipCompare_Enabled))) or IsShiftKeyDown())) then
AtlasLootItem_ShowCompareItem(self); --- CALL MISSING METHOD TO SHOW 2 TOOLTIPS (Item Compare)
end
end
end
end
--------------------------------------------------------------------------------
-- Item OnLeave
-- Called when the mouse cursor leaves a loot item
--------------------------------------------------------------------------------
function AtlasLootItem_OnLeave(self)
--Hide the necessary tooltips
if( AtlasLoot.db.profile.LootlinkTT ) then
AtlasLootTooltip:Hide();
elseif( AtlasLoot.db.profile.ItemSyncTT ) then
if(GameTooltip:IsVisible()) then
GameTooltip:Hide();
end
else
if(self.itemID ~= nil) then
AtlasLootTooltip:Hide();
GameTooltip:Hide();
end
end
if ( ShoppingTooltip2:IsVisible() or ShoppingTooltip1.IsVisible) then
ShoppingTooltip2:Hide();
ShoppingTooltip1:Hide();
end
end
--------------------------------------------------------------------------------
-- Item OnClick
-- Called when a loot item is clicked on
--------------------------------------------------------------------------------
function AtlasLootItem_OnClick(self ,arg1)
local isItem;
local color = strsub(_G["AtlasLootItem_"..self:GetID().."_Name"]:GetText(), 1, 10);
local id = self:GetID();
local name = strsub(_G["AtlasLootItem_"..self:GetID().."_Name"]:GetText(), 11);
if string.sub(self.itemID, 1, 1) == "s" then
isItem = false;
else
isItem = true;
end
if isItem then
local iteminfo = GetItemInfo(self.itemID);
local itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType, itemCount, itemEquipLoc, itemTexture = GetItemInfo(self.itemID);
--If shift-clicked, link in the chat window
if arg1=="RightButton" and ATLASLOOT_ITEM_UNLOCK then
AtlasLoot:MoveWishlistItem("Down",self.number);
elseif IsAltKeyDown() and arg1=="LeftButton" and ATLASLOOT_ITEM_UNLOCK then
StaticPopup_Show ("ATLASLOOT_ADD_CUSTOMHEADER");
StaticPopupDialogs.ATLASLOOT_ADD_CUSTOMHEADER.num = self.number;
elseif (arg1=="LeftButton") and ATLASLOOT_ITEM_UNLOCK then
AtlasLoot:MoveWishlistItem("Up",self.number);
elseif(arg1=="RightButton" and not iteminfo and self.itemID ~= 0) then
AtlasLootTooltip:SetHyperlink("item:"..self.itemID..":0:0:0:0:0:0:0");
if not AtlasLoot.db.profile.ItemSpam then
DEFAULT_CHAT_FRAME:AddMessage(AL["Server queried for "]..color.."["..name.."]".."|r"..AL[". Right click on any other item to refresh the loot page."]);
end
elseif(arg1=="RightButton" and iteminfo) then
if not AtlasLoot.db.profile.ItemSpam then
DEFAULT_CHAT_FRAME:AddMessage(itemLink..AL[" is safe."]);
end
elseif(IsShiftKeyDown() and iteminfo and (AtlasLoot.db.profile.SafeLinks or AtlasLoot.db.profile.AllLinks)) then
ChatEdit_InsertLink(itemLink);
elseif(IsShiftKeyDown() and AtlasLoot.db.profile.AllLinks) then
ChatEdit_InsertLink(color.."|Hitem:"..self.itemID..":0:0:0:0:0:0:0|h["..name.."]|h|r");
elseif(ChatFrameEditBox and ChatFrameEditBox:IsVisible() and IsShiftKeyDown()) then
ChatFrameEditBox:Insert(name); -- <-- this line just inserts plain text, does not need any adjustment
--If control-clicked, use the dressing room
elseif(IsControlKeyDown() and iteminfo) then
DressUpItemLink(itemLink);
elseif IsAltKeyDown() then
if AtlasLootItemsFrame.refresh[2] == "AtlasLoot_CurrentWishList" then
AtlasLoot_DeleteFromWishList(self.itemID,self.number);
else
if(AtlasLootItemsFrame.refresh[1] == "SearchResult") then
local datID, _, datPage = strsplit("|", self.sourcePage);
AtlasLoot_ShowWishListDropDown(self.itemID, self.itemTexture, _G["AtlasLootItem_"..self:GetID().."_Name"]:GetText(),
AtlasLoot_Data[datID][tonumber(datPage)].Name, self.sourcePage, self);
else
AtlasLoot_ShowWishListDropDown(self.itemID, self.itemTexture, _G["AtlasLootItem_"..self:GetID().."_Name"]:GetText(),
AtlasLoot_BossName:GetText(), self.dataID .. "|" .. "AtlasLoot_Data" .. "|" .. tostring(self.tablenum), self);
end
end
elseif((AtlasLootItemsFrame.refresh[1] == "SearchResult" or AtlasLootItemsFrame.refresh[2] == "AtlasLoot_CurrentWishList") and self.sourcePage) then
local dataID, dataSource, dataPage = strsplit("|", self.sourcePage);
if(dataID and dataSource) then
AtlasLoot:ShowItemsFrame(dataID, "AtlasLoot_Data", tonumber(dataPage));
end
elseif (arg1=="LeftButton") and self.sourcePage then
--Create token table if there isnt one
if AtlasLoot_TokenData[self.sourcePage] == nil then
AtlasLoot:CreateToken(self.sourcePage)
end
--Show token table
AtlasLoot:ShowItemsFrame(self.sourcePage, "AtlasLoot_TokenData", 1);
end
else
if IsShiftKeyDown() then
spellID = string.sub(self.itemID, 2);
ChatEdit_InsertLink(AtlasLoot_GetEnchantLink(spellID));
elseif IsAltKeyDown() then
if AtlasLootItemsFrame.refresh[2] == "AtlasLoot_CurrentWishList" then
AtlasLoot_DeleteFromWishList(self.itemID, self.number);
else
spellName, _, _, _, _, _, _, _, _ = GetSpellInfo(string.sub(self.itemID, 2));
--spellIcon = GetItemIcon(self.dressingroomID);
if(AtlasLootItemsFrame.refresh[1] == "SearchResult") then
local datID, _, datPage = strsplit("|", self.sourcePage);
AtlasLoot_ShowWishListDropDown(self.itemID, self.dressingroomID, "=ds="..spellName,
AtlasLoot_Data[datID][tonumber(datPage)].Name, self.sourcePage, self);
else
AtlasLoot_ShowWishListDropDown(self.itemID, self.dressingroomID, "=ds="..spellName, AtlasLoot_BossName:GetText(), self.dataID .. "|" .. "AtlasLoot_Data" .. "|" .. tostring(self.tablenum), self);
end
end
elseif(IsControlKeyDown()) then
DressUpItemLink("item:"..self.dressingroomID..":0:0:0:0:0:0:0");
elseif((AtlasLootItemsFrame.refresh[1] == "SearchResult" or AtlasLootItemsFrame.refresh[1] == "WishList") and self.sourcePage) then
local dataID, dataSource, dataPage = strsplit("|", self.sourcePage);
if(dataID and dataSource) then
AtlasLoot:ShowItemsFrame(dataID, "AtlasLoot_Data", tonumber(dataPage));
end
end
end
end
-------
-- Missing GameToolTip method
-- Enables item comparing. I've ripped self method directly from GameTooltip.lua and modified to work with AtlasLootTooltip /siena
-------
function AtlasLootItem_ShowCompareItem(self)
local shift = 1;
local item,link = nil,nil
if self.spellitemID and self.spellitemID ~= "" and self.spellitemID ~= 0 then
item = AtlasLootTooltip:GetSpell()
_,link = GetItemInfo(self.spellitemID)
else
item,link = AtlasLootTooltip:GetItem();
end
if ( not link ) then
return
end
ShoppingTooltip1:SetOwner(AtlasLootTooltip, "ANCHOR_NONE");
ShoppingTooltip2:SetOwner(AtlasLootTooltip, "ANCHOR_NONE");
ShoppingTooltip3:SetOwner(AtlasLootTooltip, "ANCHOR_NONE");
local item1 = nil;
local item2 = nil;
local item3 = nil;
local side = "left";
if ( ShoppingTooltip1:SetHyperlinkCompareItem(link, 1, 1, AtlasLootTooltip) ) then
item1 = true;
end
if ( ShoppingTooltip2:SetHyperlinkCompareItem(link, 2, 1, AtlasLootTooltip) ) then
item2 = true;
end
if ( ShoppingTooltip3:SetHyperlinkCompareItem(link, 3, 1, AtlasLootTooltip) ) then
item3 = true;
end
if not item1 and not item2 and not item3 then
return
end
if item3 then
if not item1 then
item1, item3 = true, nil;
ShoppingTooltip1:SetHyperlinkCompareItem(link, 3, 1, AtlasLootTooltip);
elseif not item2 then
item2, item3 = true, nil;
ShoppingTooltip2:SetHyperlinkCompareItem(link, 3, 1, AtlasLootTooltip);
end
end
if item2 and not item1 then
item1, item2 = true, nil;
ShoppingTooltip1:SetHyperlinkCompareItem(link, 2, 1, AtlasLootTooltip);
end
local left, right, anchor1, anchor2 = AtlasLootTooltip:GetLeft(), AtlasLootTooltip:GetRight(), "TOPLEFT", "TOPRIGHT";
if not left or not right then return end
if (GetScreenWidth() - right) < left then anchor1, anchor2 = anchor2, anchor1 end
if item1 then
ShoppingTooltip1:ClearAllPoints();
ShoppingTooltip1:SetPoint(anchor1, AtlasLootTooltip, anchor2, 0, -10);
ShoppingTooltip1:Show();
if item2 then
ShoppingTooltip2:ClearAllPoints();
ShoppingTooltip2:SetPoint(anchor1, ShoppingTooltip1, anchor2);
ShoppingTooltip2:Show();
end
if item3 then
ShoppingTooltip3:ClearAllPoints();
ShoppingTooltip3:SetPoint(anchor1, ShoppingTooltip2, anchor2);
ShoppingTooltip3:Show();
end
end
end
+414
View File
@@ -0,0 +1,414 @@
--[[
Options.lua
Functions:
AtlasLoot_OptionsPanelOnLoad(panel)
AtlasLootOptions_Init()
AtlasLootOptions_OnLoad()
AtlasLootOptions_SafeLinksToggle()
AtlasLootOptions_AllLinksToggle()
AtlasLootOptions_DefaultTTToggle()
AtlasLootOptions_LootlinkTTToggle()
AtlasLootOptions_ItemSyncTTToggle()
AtlasLootOptions_EquipCompareToggle()
AtlasLootOptions_OpaqueToggle()
AtlasLootOptions_ItemIDToggle()
AtlasLootOptions_MinimapToggle()
AtlasLootOptions_LoDSpam()
AtlasLootOptions_LoDStartup()
AtlasLoot_SetupLootBrowserSlider(frame, mymin, mymax, step)
AtlasLoot_UpdateLootBrowserSlider(frame)
AtlasLoot_DisplayHelp();
AtlasLoot_CreateOptionsInfoTooltips()
]]
local GREY = "|cff999999";
local RED = "|cffff0000";
local WHITE = "|cffFFFFFF";
local GREEN = "|cff1eff00";
local PURPLE = "|cff9F3FFF";
local BLUE = "|cff0070dd";
local ORANGE = "|cffFF8400";
--Invoke libraries
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
function AtlasLoot_OptionsPanelOnLoad(panel)
panel.name=AL["AtlasLoot"];
InterfaceOptions_AddCategory(panel);
end
function AtlasLootOptions_Init()
--Initialise all the check boxes on the options frame
AtlasLootOptionsFrameSafeLinks:SetChecked(AtlasLoot.db.profile.SafeLinks);
AtlasLootOptionsFrameDefaultTT:SetChecked(AtlasLoot.db.profile.DefaultTT);
AtlasLootOptionsFrameLootlinkTT:SetChecked(AtlasLoot.db.profile.LootlinkTT);
AtlasLootOptionsFrameItemSyncTT:SetChecked(AtlasLoot.db.profile.ItemSyncTT);
AtlasLootOptionsFrameEquipCompare:SetChecked(AtlasLoot.db.profile.EquipCompare);
AtlasLootOptionsFrameOpaque:SetChecked(AtlasLoot.db.profile.Opaque);
AtlasLootOptionsFrameAutoInstance:SetChecked(AtlasLoot.db.profile.AutoCurrentInstance);
AtlasLootOptionsFrameItemID:SetChecked(AtlasLoot.db.profile.ItemIDs);
AtlasLootOptionsFrameLoDStartup:SetChecked(AtlasLoot.db.profile.LoadAllLoDStartup);
AtlasLootOptionsFrameLootBrowserScale:SetValue(AtlasLoot.db.profile.LootBrowserScale);
end
function AtlasLootOptions_OnLoad()
--Disable checkboxes of missing addons
if( not LootLink_SetTooltip ) then
AtlasLootOptionsFrameLootlinkTT:Disable();
AtlasLootOptionsFrameLootlinkTTText:SetText(AL["|cff9d9d9dLootlink Tooltips|r"]);
end
if( not ItemSync ) then
AtlasLootOptionsFrameItemSyncTT:Disable();
AtlasLootOptionsFrameItemSyncTTText:SetText(AL["|cff9d9d9dItemSync Tooltips|r"]);
end
AtlasLootOptions_Init();
temp=AtlasLoot.db.profile.SafeLinks;
end
function AtlasLootOptions_SafeLinksToggle()
if(AtlasLoot.db.profile.SafeLinks) then
AtlasLoot.db.profile.SafeLinks = false;
AtlasLoot.db.profile.AllLinks = true;
else
AtlasLoot.db.profile.SafeLinks = true;
AtlasLoot.db.profile.AllLinks = false;
end
AtlasLootOptions_Init();
end
function AtlasLootOptions_DefaultTTToggle()
AtlasLoot.db.profile.DefaultTT = true;
AtlasLoot.db.profile.LootlinkTT = false;
AtlasLoot.db.profile.ItemSyncTT = false;
AtlasLootOptions_Init();
end
function AtlasLootOptions_LootlinkTTToggle()
AtlasLoot.db.profile.DefaultTT = false;
AtlasLoot.db.profile.LootlinkTT = true;
AtlasLoot.db.profile.ItemSyncTT = false;
AtlasLootOptions_Init();
end
function AtlasLootOptions_ItemSyncTTToggle()
AtlasLoot.db.profile.DefaultTT = false;
AtlasLoot.db.profile.LootlinkTT = false;
AtlasLoot.db.profile.ItemSyncTT = true;
AtlasLootOptions_Init();
end
function AtlasLootOptions_OpaqueToggle()
AtlasLoot.db.profile.Opaque=AtlasLootOptionsFrameOpaque:GetChecked();
if (AtlasLoot.db.profile.Opaque) then
AtlasLootItemsFrame_Back:SetTexture(0, 0, 0, 1);
else
AtlasLootItemsFrame_Back:SetTexture(0, 0, 0, 0.65);
end
AtlasLootOptions_Init();
end
function AtlasLoot:Options_AutoInstanceToggle()
AtlasLoot.db.profile.AutoCurrentInstance = AtlasLootOptionsFrameAutoInstance:GetChecked();
end
function AtlasLootOptions_LoDStartup()
if (AtlasLoot.db.profile.LoadAllLoDStartup) then
AtlasLoot.db.profile.LoadAllLoDStartup = false;
else
AtlasLoot.db.profile.LoadAllLoDStartup = true;
end
AtlasLootOptions_Init();
end
function AtlasLootOptions_ItemIDToggle()
AtlasLoot.db.profile.ItemIDs=AtlasLootOptionsFrameItemID:GetChecked();
AtlasLootOptions_Init();
end
function AtlasLoot_SetupLootBrowserSlider(frame, mymin, mymax, step)
_G[frame:GetName().."Text"]:SetText(AL["Loot Browser Scale: "].." ("..frame:GetValue()..")");
frame:SetMinMaxValues(mymin, mymax);
_G[frame:GetName().."Low"]:SetText(mymin);
_G[frame:GetName().."High"]:SetText(mymax);
frame:SetValueStep(step);
end
--Borrowed from Atlas, thanks Dan!
local function round(num, idp)
local mult = 10 ^ (idp or 0);
return math.floor(num * mult + 0.5) / mult;
end
function AtlasLoot_UpdateLootBrowserSlider(frame)
_G[frame:GetName().."Text"]:SetText(AL["Loot Browser Scale: "].." ("..round(frame:GetValue(),2)..")");
end
function AtlasLoot_UpdateLootBrowserScale()
AtlasLootDefaultFrame:SetScale(AtlasLoot.db.profile.LootBrowserScale);
end
function AtlasLoot_DisplayHelp()
if not _G["AtlasLootHelpFrame_HelpText"] then
local framewidht = InterfaceOptionsFramePanelContainer:GetWidth()
local panel3 = CreateFrame("ScrollFrame", "AtlasLootHelpFrame_HelpTextFrameScroll", AtlasLootHelpFrame, "UIPanelScrollFrameTemplate")
local scc = CreateFrame("Frame", "AtlasLootHelpFrame_HelpTextFrame", panel3)
panel3:SetScrollChild(scc)
panel3:SetPoint("TOPLEFT", AtlasLootHelpFrame, "TOPLEFT", 10, -25)
scc:SetPoint("TOPLEFT", panel3, "TOPLEFT", 0, 0)
panel3:SetWidth(framewidht-45)
panel3:SetHeight(400)
scc:SetWidth(framewidht-45)
scc:SetHeight(400)
panel3:SetHorizontalScroll(-50)
panel3:SetVerticalScroll(50)
panel3:SetBackdrop({bgFile="Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile="", tile = false, tileSize = 0, edgeSize = 0, insets = { left = 0, right = 0, top = 0, bottom = 0 }})
panel3:SetScript("OnVerticalScroll", function() end)
panel3:EnableMouse(true)
panel3:SetVerticalScroll(0)
panel3:SetHorizontalScroll(0)
local Text = scc:CreateFontString("AtlasLootHelpFrame_HelpText","OVERLAY","GameFontNormal")
Text:SetPoint("TOPLEFT", scc, "TOPLEFT", 0, 0)
Text:SetText(
ORANGE..AL["How to open the standalone Loot Browser:"].."\n"..
WHITE..AL["If you have AtlasLootFu enabled, click the minimap button, or alternatively a button generated by a mod like Titan or FuBar. Finally, you can type '/al' in the chat window."].."\n\n"..
ORANGE..AL["How to link an item to someone else:"].."\n"..
WHITE..AL["Shift+Left Click the item like you would for any other in-game item"].."\n\n"..
ORANGE..AL["How to view an item in the Dressing Room:"].."\n"..
WHITE..AL["Simply Ctrl+Left Click on the item. Sometimes the dressing room window is hidden behind the Atlas or AtlasLoot windows, so if nothing seems to happen move your Atlas or AtlasLoot windows and see if anything is hidden."].."\n\n"..
ORANGE..AL["How to add an item to the wishlist:"].."\n"..
WHITE..AL["Alt+Left Click any item to add it to the wishlist."].."\n\n"..
ORANGE..AL["How to delete an item from the wishlist:"].."\n"..
WHITE..AL["While on the wishlist screen, just Alt+Left Click on an item to delete it."].."\n\n"..
ORANGE..AL["What else does the wishlist do?"].."\n"..
WHITE..AL["If you Left Click any item on the wishlist, you can jump to the loot page the item comes from. Also, on a loot page any item already in your wishlist is marked with a yellow star."].."\n\n"..
ORANGE..AL["HELP!! I have broken the mod somehow!"].."\n"..
WHITE..AL["Use the reset buttons available in the options menu, or type '/al reset' in your chat window."].."\n\n"..
GREY..AL["For further help, see our website and forums: "]..GREEN.."https://discord.gg/uYCE2X2FgA"
);
Text:SetWidth(framewidht-80)
Text:SetJustifyH("LEFT")
Text:SetJustifyV("TOP")
end
end
--[[
AtlasLoot_CreateOptionsInfoTooltips()
Adds explanatory tooltips to Atlasloot options
]]
function AtlasLoot_CreateOptionsInfoTooltips()
AtlasLoot:AddTooltip("AtlasLootOptionsFrameDefaultTT", nil) -- AL["Default Tooltips"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrameLootlinkTT", nil) -- AL["Lootlink Tooltips"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrameItemSyncTT", nil) -- AL["ItemSync Tooltips"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrameOpaque", nil) -- AL["Make Loot Table Opaque"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrameItemID", nil) -- AL["Show itemIDs at all times"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrameSafeLinks", nil) -- AL["Safe Chat Links |cff1eff00(recommended)|r"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrameEquipCompare", nil) -- AL["Show Comparison Tooltips"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrameLoDSpam", nil) -- AL["Notify on LoD Module Load"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrameLootBrowserScale", nil) -- Scale SLIDER
AtlasLoot:AddTooltip("AtlasLootOptionsFrame_ResetAtlasLoot", nil) -- AL["Reset Frames"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrame_ResetWishlist", nil) -- AL["Reset Wishlist"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrame_ResetQuicklooks", nil) -- AL["Reset Quicklooks"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrame_FuBarShow", nil) -- AL["Show FuBar Plugin"]
AtlasLoot:AddTooltip("AtlasLootOptionsFrame_FuBarHide", nil) -- AL["Hide FuBar Plugin"]
AtlasLoot:AddTooltip("AtlasLoot_SelectLootBrowserStyle", nil)
end
local function AtlasLoot_SelectLootBrowserStyle_Initialize()
local info;
info = {
text = AL["New Style"];
func = AtlasLoot_SelectLootBrowserStyle_OnClick;
};
UIDropDownMenu_AddButton(info);
info = {
text = AL["Classic Style"];
func = AtlasLoot_SelectLootBrowserStyle_OnClick;
};
UIDropDownMenu_AddButton(info);
end
function AtlasLoot_OptionsOnShow()
AtlasLoot_SelectLootBrowserStyle_Label:SetText(AL["Loot Browser Style:"]);
UIDropDownMenu_Initialize(AtlasLoot_SelectLootBrowserStyle, AtlasLoot_SelectLootBrowserStyle_Initialize);
UIDropDownMenu_SetSelectedID(AtlasLoot_SelectLootBrowserStyle, AtlasLoot.db.profile.LootBrowserStyle);
UIDropDownMenu_SetWidth(AtlasLoot_SelectLootBrowserStyle, 150);
end
function AtlasLoot_SelectLootBrowserStyle_OnClick()
local thisID = this:GetID();
UIDropDownMenu_SetSelectedID(AtlasLoot_SelectLootBrowserStyle, thisID);
AtlasLoot.db.profile.LootBrowserStyle = thisID;
if( AtlasLoot.db.profile.LootBrowserStyle == 1 ) then
AtlasLoot:SetNewStyle("new");
else
AtlasLoot:SetNewStyle("old");
end
AtlasLoot_OptionsOnShow();
end
local Authors = {
["Calî"] = "Arthas",
["Lâg"] = "Arthas",
--["Daviesh"] = "Thaurissan",
["Hegarol"] = "Dun Morogh",
}
function AtlasLoot_UnitTarget()
local name = GameTooltip:GetUnit()
if UnitName("mouseover") == name then
local _, realm = UnitName("mouseover")
if not realm then
realm = GetRealmName()
end;
if name and Authors[name] then
if Authors[name] == realm then
GameTooltip:AddLine("AtlasLoot Author |TInterface\\AddOns\\AtlasLoot\\Images\\gold:0|t", 0, 1, 0 )
end
end
end
end
GameTooltip:HookScript("OnTooltipSetUnit", AtlasLoot_UnitTarget)
local helpframe = CreateFrame("Frame", "AtlasLootHelpFrame")
helpframe:SetSize(425,450);
helpframe:Hide();
helpframe:SetPoint("CENTER");
helpframe.title = helpframe:CreateFontString("AtlasLootHelpFrame_Title", "OVERLAY", "GameFontHighlightLarge");
helpframe.title:SetJustifyH("CENTER");
helpframe.title:SetSize(400,30);
helpframe.title:SetPoint("TOP", "AtlasLootHelpFrame","TOP");
helpframe.title:SetText(AL["AtlasLoot Help"]);
helpframe:SetScript("OnShow", function() AtlasLoot_DisplayHelp() end);
local optframe = CreateFrame("Frame", "AtlasLootOptionsFrame");
optframe:Hide();
optframe:SetSize(425,405);
optframe:SetPoint("CENTER");
optframe.title = optframe:CreateFontString("AtlasLoot_OptionsTitle", "OVERLAY", "GameFontHighlightLarge");
optframe.title:SetJustifyH("CENTER");
optframe.title:SetSize(400,30);
optframe.title:SetPoint("TOP", "AtlasLootOptionsFrame","TOP");
optframe.title:SetText(ATLASLOOT_VERSION);
optframe.foobar = optframe:CreateFontString("AtlasLootOptionsFrame_FuBarNotice", "OVERLAY", "GameFontNormal");
optframe.foobar:SetPoint("BOTTOM",0,45);
optframe.foobar:SetText(AL["The Minimap Button is generated by the FuBar Plugin."].."\n"..AL["This is automatic, you do not need FuBar installed."]);
optframe:SetScript("OnShow", function() AtlasLoot_OptionsOnShow() end);
local deftt = CreateFrame("CheckButton", "AtlasLootOptionsFrameDefaultTT", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
deftt:SetPoint("TOPLEFT",5,-40);
AtlasLootOptionsFrameDefaultTTText:SetText(AL["Default Tooltips"]);
deftt:SetScript("OnClick", function() AtlasLootOptions_DefaultTTToggle() end);
local lootlnk = CreateFrame("CheckButton", "AtlasLootOptionsFrameLootlinkTT", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
lootlnk:SetPoint("TOPLEFT",5,-70);
AtlasLootOptionsFrameLootlinkTTText:SetText(AL["Lootlink Tooltips"]);
lootlnk:SetScript("OnClick", function() AtlasLootOptions_LootlinkTTToggle() end);
local itemsync = CreateFrame("CheckButton", "AtlasLootOptionsFrameItemSyncTT", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
itemsync:SetPoint("TOPLEFT",5,-100);
AtlasLootOptionsFrameItemSyncTTText:SetText(AL["ItemSync Tooltips"]);
itemsync:SetScript("OnClick", function() AtlasLootOptions_ItemSyncTTToggle() end);
local opaque = CreateFrame("CheckButton", "AtlasLootOptionsFrameOpaque", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
opaque:SetPoint("TOPLEFT",5,-130);
AtlasLootOptionsFrameOpaqueText:SetText(AL["Make Loot Table Opaque"]);
opaque:SetScript("OnClick", function() AtlasLootOptions_OpaqueToggle() end);
local autoInstance = CreateFrame("CheckButton", "AtlasLootOptionsFrameAutoInstance", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
autoInstance:SetPoint("TOPLEFT",5,-160);
AtlasLootOptionsFrameAutoInstanceText:SetText(AL["Auto Load Instance Loot Pages"]);
autoInstance:SetScript("OnClick", function() AtlasLoot:Options_AutoInstanceToggle() end);
local itemid = CreateFrame("CheckButton", "AtlasLootOptionsFrameItemID", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
itemid:SetPoint("TOP",5,-130);
AtlasLootOptionsFrameItemIDText:SetText(AL["Show itemIDs at all times"]);
itemid:SetScript("OnClick", function() AtlasLootOptions_ItemIDToggle() end);
local lod = CreateFrame("CheckButton", "AtlasLootOptionsFrameLoDStartup", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
lod:SetPoint("TOP",5,-40);
AtlasLootOptionsFrameLoDStartupText:SetText(AL["Load Loot Modules at Startup"]);
lod:SetScript("OnClick", function() AtlasLootOptions_LoDStartup() end);
local safe = CreateFrame("CheckButton", "AtlasLootOptionsFrameSafeLinks", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
safe:SetPoint("TOP",5,-70);
AtlasLootOptionsFrameSafeLinksText:SetText(AL["Safe Chat Links"]);
safe:SetScript("OnClick", function() AtlasLootOptions_SafeLinksToggle() end);
local equip = CreateFrame("CheckButton", "AtlasLootOptionsFrameEquipCompare", AtlasLootOptionsFrame, "OptionsCheckButtonTemplate");
equip:SetPoint("TOP",5,-100);
AtlasLootOptionsFrameEquipCompareText:SetText(AL["Show Comparison Tooltips"]);
equip:SetScript("OnClick", function()
if(AtlasLoot.db.profile.EquipCompare) then
AtlasLoot.db.profile.EquipCompare = false;
if (EquipCompare_UnregisterTooltip) then
EquipCompare_UnregisterTooltip(AtlasLootTooltip);
end
else
AtlasLoot.db.profile.EquipCompare = true;
if (EquipCompare_RegisterTooltip) then
EquipCompare_RegisterTooltip(AtlasLootTooltip);
end
end
end);
local sStyle = CreateFrame("Button", "AtlasLoot_SelectLootBrowserStyle", AtlasLootOptionsFrame, "UIDropDownMenuTemplate");
sStyle.lable = sStyle:CreateFontString("AtlasLoot_SelectLootBrowserStyle_Label", "BACKGROUND", "GameFontNormalSmall");
sStyle.lable:SetPoint("RIGHT", "AtlasLoot_SelectLootBrowserStyle", "LEFT",15,2);
sStyle:SetPoint("TOP",30,-220);
local bscale = CreateFrame("Slider", "AtlasLootOptionsFrameLootBrowserScale", AtlasLootOptionsFrame,"OptionsSliderTemplate");
bscale:SetSize(240,16);
bscale:SetPoint("TOP", 0,-300);
bscale:SetScript("OnShow", function(self) AtlasLoot_SetupLootBrowserSlider(self, 0.25, 1.5, 0.01) end);
bscale:SetScript("OnValueChanged", function(self)
AtlasLoot_UpdateLootBrowserSlider(self);
AtlasLoot.db.profile.LootBrowserScale = self:GetValue();
AtlasLoot_UpdateLootBrowserScale();
end);
local resetwish = CreateFrame("Button", "AtlasLootOptionsFrame_ResetWishlist", AtlasLootOptionsFrame, "OptionsButtonTemplate");
resetwish:SetSize(130,25);
resetwish:SetPoint("TOP", 0, -325);
resetwish:SetText(AL["Reset Wishlist"]);
resetwish:SetScript("OnClick", function() AtlasLoot_Reset("wishlist") end);
resetwish:SetScript("OnShow", function() resetwish:SetWidth(AtlasLootOptionsFrame_ResetWishlist:GetTextWidth()+20) end);
local resetAtlas = CreateFrame("Button", "AtlasLootOptionsFrame_ResetAtlasLoot", AtlasLootOptionsFrame, "OptionsButtonTemplate");
resetAtlas:SetSize(130,25);
resetAtlas:SetText(AL["Reset Frames"]);
resetAtlas:SetPoint("RIGHT", "AtlasLootOptionsFrame_ResetWishlist", "LEFT", -10, 0);
resetAtlas:SetScript("OnClick", function() AtlasLoot_Reset("frames") end);
resetAtlas:SetScript("OnShow", function() resetAtlas:SetWidth(AtlasLootOptionsFrame_ResetAtlasLoot:GetTextWidth()+20) end)
local resetquick = CreateFrame("Button", "AtlasLootOptionsFrame_ResetQuicklooks", AtlasLootOptionsFrame, "OptionsButtonTemplate");
resetquick:SetSize(130,25);
resetquick:SetText(AL["Reset Quicklooks"]);
resetquick:SetPoint("LEFT", "AtlasLootOptionsFrame_ResetWishlist", "RIGHT", 10, 0);
resetquick:SetScript("OnClick", function() AtlasLoot_Reset("quicklooks") end);
resetquick:SetScript("OnShow", function() resetquick:SetWidth(AtlasLootOptionsFrame_ResetQuicklooks:GetTextWidth()+20) end)
local fooshow = CreateFrame("Button", "AtlasLootOptionsFrame_FuBarShow", AtlasLootOptionsFrame, "OptionsButtonTemplate");
fooshow:SetSize(150,25);
fooshow:SetText(AL["Show FuBar Plugin"]);
fooshow:SetPoint("TOP", "AtlasLootOptionsFrame", "TOP", -85, -390);
fooshow:SetScript("OnClick", function()
if AtlasLootFu then
AtlasLootFu:Show();
end
end);
local foohide = CreateFrame("Button", "AtlasLootOptionsFrame_FuBarShow", AtlasLootOptionsFrame, "OptionsButtonTemplate");
foohide:SetSize(150,25);
foohide:SetText(AL["Hide FuBar Plugin"]);
foohide:SetPoint("TOP", "AtlasLootOptionsFrame", "TOP", 85, -390);
foohide:SetScript("OnClick", function()
if AtlasLootFu then
AtlasLootFu:Hide();
end
end);
+798
View File
@@ -0,0 +1,798 @@
local GREY = "|cff999999";
local RED = "|cffff0000";
local WHITE = "|cffFFFFFF";
local GREEN = "|cff1eff00";
local PURPLE = "|cff9F3FFF";
local BLUE = "|cff0070dd";
local ORANGE = "|cffFF8400";
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
local modules = {"AtlasLoot_BurningCrusade", "AtlasLoot_Crafting", "AtlasLoot_OriginalWoW", "AtlasLoot_WorldEvents", "AtlasLoot_WrathoftheLichKing"};
local currentPage = 1;
local SearchResult = nil;
-- Supported Operators
local OP_AND = "&"
local BINARYOPERATORS = {OP_AND};
-- multi-character patterns must come before single-character patterns
local RELATIONAL_OPERATORS = {">=", "<=", "<>", "<", ">", "="};
-- Supported Stat Filters
local STAT_FILTERS = {
-- Base Stats
["stamina"] = "ITEM_MOD_STAMINA_SHORT",
["stam"] = "ITEM_MOD_STAMINA_SHORT",
["sta"] = "ITEM_MOD_STAMINA_SHORT",
["strength"] = "ITEM_MOD_STRENGTH_SHORT",
["str"] = "ITEM_MOD_STRENGTH_SHORT",
["agility"] = "ITEM_MOD_AGILITY_SHORT",
["agi"] = "ITEM_MOD_AGILITY_SHORT",
["intellect"] = "ITEM_MOD_INTELLECT_SHORT",
["int"] = "ITEM_MOD_INTELLECT_SHORT",
["spirit"] = "ITEM_MOD_SPIRIT_SHORT",
["spir"] = "ITEM_MOD_SPIRIT_SHORT",
["spi"] = "ITEM_MOD_SPIRIT_SHORT",
["health"] = "ITEM_MOD_HEALTH_SHORT",
["mana"] = "ITEM_MOD_MANA_SHORT",
["mp5"] = "ITEM_MOD_POWER_REGEN0_SHORT",
["mpr"] = "ITEM_MOD_POWER_REGEN0_SHORT",
["hp5"] = "ITEM_MOD_HEALTH_REGEN_SHORT",
["hpr"] = "ITEM_MOD_HEALTH_REGEN_SHORT",
-- Sockets
["socketblue"] = "EMPTY_SOCKET_BLUE",
["socketred"] = "EMPTY_SOCKET_RED",
["socketyellow"] = "EMPTY_SOCKET_YELLOW",
["socketnocolor"] = "EMPTY_SOCKET_NO_COLOR",
["socketwhite"] = "EMPTY_SOCKET_NO_COLOR",
["socketmeta"] = "EMPTY_SOCKET_META",
["meta"] = "EMPTY_SOCKET_META",
-- Secondary Stats
["attackpowerferal"] = "ITEM_MOD_FERAL_ATTACK_POWER_SHORT",
["attackpowferal"] = "ITEM_MOD_FERAL_ATTACK_POWER_SHORT",
["apferal"] = "ITEM_MOD_FERAL_ATTACK_POWER_SHORT",
["attackpower"] = "ITEM_MOD_ATTACK_POWER_SHORT",
["attackpow"] = "ITEM_MOD_ATTACK_POWER_SHORT",
["ap"] = "ITEM_MOD_ATTACK_POWER_SHORT",
["spellpower"] = "ITEM_MOD_SPELL_POWER_SHORT",
["spellpow"] = "ITEM_MOD_SPELL_POWER_SHORT",
["sp"] = "ITEM_MOD_SPELL_POWER_SHORT",
["spellpenetration"] = "ITEM_MOD_SPELL_PENETRATION_SHORT",
["spellpen"] = "ITEM_MOD_SPELL_PENETRATION_SHORT",
["spp"] = "ITEM_MOD_SPELL_PENETRATION_SHORT",
["crit"] = "ITEM_MOD_CRIT_RATING_SHORT",
["haste"] = "ITEM_MOD_HASTE_RATING_SHORT",
["hit"] = "ITEM_MOD_HIT_RATING_SHORT",
["armorpenetration"] = "ITEM_MOD_ARMOR_PENETRATION_RATING_SHORT",
["armourpenetration"] = "ITEM_MOD_ARMOR_PENETRATION_RATING_SHORT",
["armorpen"] = "ITEM_MOD_ARMOR_PENETRATION_RATING_SHORT",
["armourpen"] = "ITEM_MOD_ARMOR_PENETRATION_RATING_SHORT",
["arp"] = "ITEM_MOD_ARMOR_PENETRATION_RATING_SHORT",
["expertise"] = "ITEM_MOD_EXPERTISE_RATING_SHORT",
["exp"] = "ITEM_MOD_EXPERTISE_RATING_SHORT",
["dps"] = "ITEM_MOD_DAMAGE_PER_SECOND_SHORT",
["resilience"] = "ITEM_MOD_RESILIENCE_RATING",
["resil"] = "ITEM_MOD_RESILIENCE_RATING",
["res"] = "ITEM_MOD_RESILIENCE_RATING",
["defense"] = "ITEM_MOD_DEFENSE_SKILL_RATING_SHORT",
["def"] = "ITEM_MOD_DEFENSE_SKILL_RATING_SHORT",
["dodge"] = "ITEM_MOD_DODGE_RATING_SHORT",
["dod"] = "ITEM_MOD_DODGE_RATING_SHORT",
["block"] = "ITEM_MOD_BLOCK_RATING_SHORT",
["blockvalue"] = "ITEM_MOD_BLOCK_VALUE_SHORT",
["blockval"] = "ITEM_MOD_BLOCK_VALUE_SHORT",
["bv"] = "ITEM_MOD_BLOCK_VALUE_SHORT",
["parry"] = "ITEM_MOD_PARRY_RATING_SHORT",
-- Resistances
["armor"] = "RESISTANCE0_NAME",
["armour"] = "RESISTANCE0_NAME",
["arm"] = "RESISTANCE0_NAME",
["resistancephysical"] = "RESISTANCE0_NAME",
["resistancephys"] = "RESISTANCE0_NAME",
["resphys"] = "RESISTANCE0_NAME",
["resistanceholy"] = "RESISTANCE1_NAME",
["resholy"] = "RESISTANCE1_NAME",
["resistancefire"] = "RESISTANCE2_NAME",
["resfire"] = "RESISTANCE2_NAME",
["resistancenature"] = "RESISTANCE3_NAME",
["resnature"] = "RESISTANCE3_NAME",
["resnat"] = "RESISTANCE3_NAME",
["resistanceforst"] = "RESISTANCE4_NAME",
["resfrost"] = "RESISTANCE4_NAME",
["resistanceshadow"] = "RESISTANCE5_NAME",
["resshadow"] = "RESISTANCE5_NAME",
["resshad"] = "RESISTANCE5_NAME",
["resistancearcane"] = "RESISTANCE6_NAME",
["resarcane"] = "RESISTANCE6_NAME",
["resarc"] = "RESISTANCE6_NAME"
};
local SOCKET_FILTERS = {
["socket"] = true,
["sockets"] = true,
["gem"] = true,
["gems"] = true
};
local SOCKET_TYPES = {"EMPTY_SOCKET_BLUE", "EMPTY_SOCKET_RED", "EMPTY_SOCKET_YELLOW", "EMPTY_SOCKET_META", "EMPTY_SOCKET_NO_COLOR"};
local INFO_FILTERS = {
["ilvl"] = true,
["minlvl"] = true
-- ["type"] = true,
-- ["subtype"] = true,
};
local QUALITY_FILTERS = {
["poor"] = 0,
["common"] = 1,
["uncommon"] = 2,
["rare"] = 3,
["epic"] = 4,
["legendary"] = 5,
["artifact"] = 6,
["heirloom"] = 7
};
local SLOT_FILTERS = {
["none"] = "INVTYPE_NON_EQUIP",
["head"] = "INVTYPE_HEAD",
["neck"] = "INVTYPE_NECK",
["shoulder"] = "INVTYPE_SHOULDER",
["body"] = "INVTYPE_BODY",
["chest"] = "INVTYPE_CHEST",
["waist"] = "INVTYPE_WAIST",
["legs"] = "INVTYPE_LEGS",
["feet"] = "INVTYPE_FEET",
["wrist"] = "INVTYPE_WRIST",
["hand"] = "INVTYPE_HAND",
["finger"] = "INVTYPE_FINGER",
["trinket"] = "INVTYPE_TRINKET",
["weapon"] = "INVTYPE_WEAPON",
["shield"] = "INVTYPE_SHIELD",
["ranged"] = "INVTYPE_RANGED",
["cloak"] = "INVTYPE_CLOAK",
["2hweapon"] = "INVTYPE_2HWEAPON",
["2h"] = "INVTYPE_2HWEAPON",
["bag"] = "INVTYPE_BAG",
["tabard"] = "INVTYPE_TABARD",
["robe"] = "INVTYPE_ROBE",
["weaponmainhand"] = "INVTYPE_WEAPONMAINHAND",
["mainhand"] = "INVTYPE_WEAPONMAINHAND",
["weaponoffhand"] = "INVTYPE_WEAPONOFFHAND",
["offhand"] = "INVTYPE_WEAPONOFFHAND",
["holdable"] = "INVTYPE_HOLDABLE",
["ammo"] = "INVTYPE_AMMO",
["thrown"] = "INVTYPE_THROWN",
["rangedright"] = "INVTYPE_RANGEDRIGHT",
["quiver"] = "INVTYPE_QUIVER",
["relic"] = "INVTYPE_RELIC"
};
local TYPE_FILTERS = {
["cloth"] = "Cloth",
["leather"] = "Leather",
["mail"] = "Mail",
["plate"] = "Plate",
["shield"] = "Shields",
["libram"] = "Librams",
["idol"] = "Idols",
["totem"] = "Totems",
["sigil"] = "Sigils",
["axe1h"] = "One-Handed Axes",
["axe2h"] = "Two-Handed Axes",
["bows"] = "Bows",
["bow"] = "Bows",
["guns"] = "Guns",
["gun"] = "Guns",
["mace1h"] = "One-Handed Maces",
["mace2h"] = "Two-Handed Maces",
["polearm"] = "Polearms",
["sword1h"] = "One-Handed Swords",
["sword2h"] = "Two-Handed Swords",
["staff"] = "Staves",
["fist"] = "Fist Weapons",
["generic"] = "",
["dagger"] = "Daggers",
["thrown"] = "Thrown",
["crossbows"] = "Crossbows",
["crossbow"] = "Crossbows",
["wand"] = "Wands",
["fishingpole"] = "Fishing Poles"
}
local NON_EQUIPABLE_SLOTS = {
["INVTYPE_NON_EQUIP"] = true,
["INVTYPE_BODY"] = true,
["INVTYPE_BAG"] = true,
["INVTYPE_AMMO"] = true,
["INVTYPE_QUIVER"] = true
};
SLASH_ATLASLOOTHELP1 = "/atlasloothelp";
SlashCmdList["ATLASLOOTHELP"] = function(msg, editBox)
local function show(caption, t)
local keys = {}
for key in pairs(t) do
table.insert(keys, key)
end
table.sort(keys, function(a, b)
return a < b
end)
print(caption .. ": " .. table.concat(keys, ", "))
end
show("stat", STAT_FILTERS)
show("socket", SOCKET_FILTERS)
show("slot", SLOT_FILTERS)
show("quality", QUALITY_FILTERS)
show("info", INFO_FILTERS)
print("\nExamples:")
print("gladiator")
print("str>40")
print("gladiator&str>40")
print("str>40&ilvl>=120&ilvl<140&int>0&socket>2");
print("sp>20&quality>=rare&quality<legendary&slot=finger");
print("stam>20&minlvl<=50")
end
SLASH_ATLASLOOTSEARCH1 = "/atlaslootsearch";
SLASH_ATLASLOOTSEARCH2 = "/als";
SlashCmdList["ATLASLOOTSEARCH"] = function(search, editBox)
AtlasLootDefaultFrame:Show()
if search and search ~= '' then
AtlasLootDefaultFrameSearchBox:SetText(search)
AtlasLootDefaultFrameSearchButton:Click()
end
end
-- split one string on another (delimiter can be more than one character)
local function SplitString(str, delimiter)
local result = {}
local start = 1
local len = #str
while start <= len do
local delimPos = str:find(delimiter, start, true)
if delimPos then
result[#result + 1] = str:sub(start, delimPos - 1) -- grab up to the delimeter
start = delimPos + #delimiter -- advance past the delimiter
else
result[#result + 1] = str:sub(start) -- grab the rest of the string
break
end
end
return result
end
local function CompareNumbersByOperator(operator, left, right)
return left and right and
((operator == "<>" and left ~= right) or (operator == "<=" and left <= right) or (operator == ">=" and left >= right) or (operator == "=" and left == right) or
(operator == "<" and left < right) or (operator == ">" and left > right))
end
local function ThrowQueryError(...)
error("Error: " .. string.format(...))
end
local function IsItemStatMatch(term, stats)
local filterKey = STAT_FILTERS[term.left]
if not filterKey then
return
end
local statValue = tonumber(stats[filterKey])
if not statValue then
return
end
local searchedValue = tonumber(term.right)
if not searchedValue then
ThrowQueryError("'%s' requires a numeric argument", term.left)
end
return CompareNumbersByOperator(term.relational, statValue, searchedValue)
end
local function IsItemLevelFilterMatch(term, itemLvl)
if term.left ~= "ilvl" then
return
end
local searchedValue = tonumber(term.right);
if not searchedValue then
ThrowQueryError("ilvl search requires a numeric argument")
end
return itemLvl ~= nil and itemLvl > 0 and CompareNumbersByOperator(term.relational, itemLvl, searchedValue)
end
local function IsItemQualityMatch(term, itemQuality)
if term.left ~= "quality" then
return
end
local searchedValue = QUALITY_FILTERS[term.right]
if not searchedValue then
ThrowQueryError("unrecognized quality value \"%s\"", term.right)
end
return CompareNumbersByOperator(term.relational, itemQuality, searchedValue)
end
local function IsItemSocketMatch(term, stats)
if not SOCKET_FILTERS[term.left] then
return
end
local searchedValue = tonumber(term.right)
if not searchedValue then
ThrowQueryError("'%s' requires a numeric argument", term.left)
end
local socketCount = 0;
for _, socketType in pairs(SOCKET_TYPES) do
local statValue = tonumber(stats[socketType]);
if statValue then
socketCount = socketCount + statValue;
end
end
return CompareNumbersByOperator(term.relational, socketCount, searchedValue)
end
local function IsMinLevelFilterMatch(term, minLvl)
if term.left ~= "minlvl" then
return
end
local searchedValue = tonumber(term.right);
if not searchedValue then
ThrowQueryError("minlvl search requires a numeric argument")
end
return minLvl ~= nil and minLvl > 0 and CompareNumbersByOperator(term.relational, minLvl, searchedValue)
end
local function IsItemSlotMatch(term, itemEquipLoc)
if term.left ~= "slot" then
return
end
if term.relational ~= "=" then
ThrowQueryError("slot searches should be in the form \"slot=[slotname]\"")
end
local slot = SLOT_FILTERS[term.right]
if not slot then
ThrowQueryError("unrecognized slot name: \"%s\"", term.right)
end
return slot == itemEquipLoc
end
local function IsItemTypeMatch(term, itemEquipType)
if term.left ~= "type" then
return
end
if term.relational ~= "=" then
ThrowQueryError("type searches should be in the form \"type=[typename]\"")
end
local type = TYPE_FILTERS[term.right]
if not type then
ThrowQueryError("unrecognized type name: \"%s\"", term.right)
end
return type == itemEquipType;
end
local function nameMatches(name, searchText)
if AtlasLoot.db.profile.PartialMatching then
return string.find(string.lower(name), string.lower(searchText));
else
return string.lower(name) == string.lower(searchText);
end
end
local RelationalFunctions = {
["ilvl"] = {IsItemLevelFilterMatch, 3},
["minlvl"] = {IsMinLevelFilterMatch, 4},
["type"] = {IsItemTypeMatch, 6},
["slot"] = {IsItemSlotMatch, 5},
["quality"] = {IsItemQualityMatch, 2},
["gem"] = {IsItemSocketMatch, 7},
["gems"] = {IsItemSocketMatch, 7},
["socket"] = {IsItemSocketMatch, 7},
["sockets"] = {IsItemSocketMatch, 7},
-- Base Stats
["stamina"] = {IsItemStatMatch, 7},
["stam"] = {IsItemStatMatch, 7},
["sta"] = {IsItemStatMatch, 7},
["strength"] = {IsItemStatMatch, 7},
["str"] = {IsItemStatMatch, 7},
["agility"] = {IsItemStatMatch, 7},
["agi"] = {IsItemStatMatch, 7},
["intellect"] = {IsItemStatMatch, 7},
["int"] = {IsItemStatMatch, 7},
["spirit"] = {IsItemStatMatch, 7},
["spir"] = {IsItemStatMatch, 7},
["spi"] = {IsItemStatMatch, 7},
["health"] = {IsItemStatMatch, 7},
["mana"] = {IsItemStatMatch, 7},
["mp5"] = {IsItemStatMatch, 7},
["mpr"] = {IsItemStatMatch, 7},
["hp5"] = {IsItemStatMatch, 7},
["hpr"] = {IsItemStatMatch, 7},
-- Sockets
["socketblue"] = {IsItemStatMatch, 7},
["socketred"] = {IsItemStatMatch, 7},
["socketyellow"] = {IsItemStatMatch, 7},
["socketnocolor"] = {IsItemStatMatch, 7},
["socketwhite"] = {IsItemStatMatch, 7},
["socketmeta"] = {IsItemStatMatch, 7},
["meta"] = {IsItemStatMatch, 7},
-- Secondary Stats
["attackpowerferal"] = {IsItemStatMatch, 7},
["attackpowferal"] = {IsItemStatMatch, 7},
["apferal"] = {IsItemStatMatch, 7},
["attackpower"] = {IsItemStatMatch, 7},
["attackpow"] = {IsItemStatMatch, 7},
["ap"] = {IsItemStatMatch, 7},
["spellpower"] = {IsItemStatMatch, 7},
["spellpow"] = {IsItemStatMatch, 7},
["sp"] = {IsItemStatMatch, 7},
["spellpenetration"] = {IsItemStatMatch, 7},
["spellpen"] = {IsItemStatMatch, 7},
["spp"] = {IsItemStatMatch, 7},
["crit"] = {IsItemStatMatch, 7},
["haste"] = {IsItemStatMatch, 7},
["hit"] = {IsItemStatMatch, 7},
["armorpenetration"] = {IsItemStatMatch, 7},
["armourpenetration"] = {IsItemStatMatch, 7},
["armorpen"] = {IsItemStatMatch, 7},
["armourpen"] = {IsItemStatMatch, 7},
["arp"] = {IsItemStatMatch, 7},
["expertise"] = {IsItemStatMatch, 7},
["exp"] = {IsItemStatMatch, 7},
["dps"] = {IsItemStatMatch, 7},
["resilience"] = {IsItemStatMatch, 7},
["resil"] = {IsItemStatMatch, 7},
["res"] = {IsItemStatMatch, 7},
["defense"] = {IsItemStatMatch, 7},
["def"] = {IsItemStatMatch, 7},
["dodge"] = {IsItemStatMatch, 7},
["dod"] = {IsItemStatMatch, 7},
["block"] = {IsItemStatMatch, 7},
["blockvalue"] = {IsItemStatMatch, 7},
["blockval"] = {IsItemStatMatch, 7},
["bv"] = {IsItemStatMatch, 7},
["parry"] = {IsItemStatMatch, 7},
-- Resistances
["armor"] = {IsItemStatMatch, 7},
["armour"] = {IsItemStatMatch, 7},
["arm"] = {IsItemStatMatch, 7},
["resistancephysical"] = {IsItemStatMatch, 7},
["resistancephys"] = {IsItemStatMatch, 7},
["resphys"] = {IsItemStatMatch, 7},
["resistanceholy"] = {IsItemStatMatch, 7},
["resholy"] = {IsItemStatMatch, 7},
["resistancefire"] = {IsItemStatMatch, 7},
["resfire"] = {IsItemStatMatch, 7},
["resistancenature"] = {IsItemStatMatch, 7},
["resnature"] = {IsItemStatMatch, 7},
["resnat"] = {IsItemStatMatch, 7},
["resistanceforst"] = {IsItemStatMatch, 7},
["resfrost"] = {IsItemStatMatch, 7},
["resistanceshadow"] = {IsItemStatMatch, 7},
["resshadow"] = {IsItemStatMatch, 7},
["resshad"] = {IsItemStatMatch, 7},
["resistancearcane"] = {IsItemStatMatch, 7},
["resarcane"] = {IsItemStatMatch, 7},
["resarc"] = {IsItemStatMatch, 7},
}
local function ItemMatchesTerm(term, itemDetails)
if term.relational then
local func, arg = unpack(RelationalFunctions[term.left]);
if func then
return func(term, itemDetails[arg]);
end
return false;
else
return nameMatches(itemDetails[1], term.name);
end
end
local function ItemMatchesAllTerms(searchTerms, itemDetails)
local function IsItemEquipableMatch(itemEquipLoc)
return not AtlasLoot.db.profile.EquipableFilter or ((itemEquipLoc and itemEquipLoc ~= '' and not NON_EQUIPABLE_SLOTS[itemEquipLoc]))
end
for _, term in ipairs(searchTerms) do
if not ItemMatchesTerm(term, itemDetails) then
return false
end
end
return true and IsItemEquipableMatch(itemDetails[5])
end
local function ParseTerm(termText)
for _, relational in ipairs(RELATIONAL_OPERATORS) do
local operands = SplitString(termText, relational)
if #operands == 2 then
return {
left = operands[1],
right = operands[2],
relational = relational
}
end
end
return {
name = termText
}
end
-- Parse search text into '&'-delimited search terms,
-- then parse each term on its relational operator, if present.
local function ParseQuery(searchText)
local terms = {}
for _, term in pairs(SplitString(searchText, OP_AND)) do
table.insert(terms, ParseTerm(term));
end
return terms
end
local function GetSpellName(itemId, atlasName)
local spellName = GetSpellInfo(string.sub(itemId, 2));
if spellName then
return spellName
elseif (string.sub(atlasName, 1, 2) == "=d") then
return gsub(atlasName, "=ds=", "");
else
return gsub(atlasName, "=q%d=", "");
end
end
local function DoSearch(searchText)
AtlasLootCharDB["SearchResult"] = {Name = "Search Result" , Type = "Search", Back = true};
AtlasLootCharDB.LastSearchedText = searchText;
local count = 0;
local tablenum = 1;
local searchTerms = ParseQuery(searchText);
local equipableFilterOn = AtlasLoot.db.profile.EquipableFilter;
local function GetItemDetails(itemId, atlasName)
-- Name, Link, Quality(num), iLvl(num), minLvl(num), itemType(localized string), itemSubType(localized string), stackCount(num), itemEquipLoc(enum), texture(link to a local file), displayId(num)
local itemName, _, itemQuality, itemLvl, minLvl, _, itemSubType, _, itemEquipLoc = GetItemInfo(itemId);
if not itemName then
itemName = gsub(atlasName, "=q%d=", "")
end
return itemName, itemQuality, itemLvl, minLvl, itemEquipLoc, itemSubType, GetItemStats("item:" .. itemId)
end
local function AddItemToSearchResult(itemId, itemType, itemName, dataID, itemIdBackup, difCap, dataPage)
local lootPage = AtlasLoot_Data[dataID].Name or "Argh!";
if AtlasLootCharDB["SearchResult"][tablenum] == nil then
AtlasLootCharDB["SearchResult"][tablenum] = {Name = "Page "..tablenum};
end
table.insert(AtlasLootCharDB["SearchResult"][tablenum], {(count % 30) + 1, itemId, itemType, itemName, lootPage, "", "", dataID .. "|" .. "AtlasLoot_Data" .. "|" .. tostring(dataPage), itemIdBackup, [AtlasLoot_Difficulty.MAX_DIF] = difCap});
count = count + 1;
if (count) % 30 == 0 then
tablenum = tablenum + 1;
end
end
for dataID, data in pairs(AtlasLoot_Data) do
for dataPage, t in ipairs(data) do
for _, v in ipairs(t) do
if type(v) == "table" then
local _, itemId, itemType, atlasName = unpack(v)
if type(itemId) == "number" and itemId > 0 then
local itemIdBackup = itemId;
if #searchTerms == 1 and searchTerms[1].name then
if nameMatches(atlasName, searchTerms[1].name) then
AddItemToSearchResult(itemId, itemType, atlasName, dataID, itemIdBackup, AtlasLoot_Difficulty:getMaxDifficulty(data.Type), dataPage);
end
else
local difficultyCap = min(AtlasLoot_Difficulty:getMaxDifficulty(data.Type), ItemindexID);
itemId = AtlasLoot:FindId(itemId, difficultyCap) or 2;
local item = Item:CreateFromID(itemId);
item:ContinueOnLoad(function()
local itemDetails = {GetItemDetails(item.itemID, atlasName)};
if ItemMatchesAllTerms(searchTerms, itemDetails) then
AddItemToSearchResult(itemId, itemType, atlasName, dataID, itemIdBackup, AtlasLoot_Difficulty:getMaxDifficulty(data.Type), dataPage);
end
end)
end
elseif not equipableFilterOn and itemId and itemId ~= "" and string.sub(itemId, 1, 1) == "s" then
local spellName = GetSpellName(itemId, atlasName)
if nameMatches(spellName, searchText) then
spellName = string.sub(atlasName, 1, 4) .. spellName;
AddItemToSearchResult(itemId, itemType, spellName, dataID, itemIdBackup, AtlasLoot_Difficulty:getMaxDifficulty(data.Type), dataPage);
end
end
end
end
end
end
end
function AtlasLoot:ShowSearchResult()
AtlasLoot:ShowItemsFrame("SearchResult", "AtlasLootCharDB", 1);
end
function AtlasLoot:Search(Text)
if not Text then
return
end
Text = strtrim(Text);
if Text == "" then
return
end
-- Decide if we need load all modules or just specified ones
local allDisabled = not self.db.profile.SearchOn.All;
if allDisabled then
for _, module in ipairs(modules) do
if self.db.profile.SearchOn[module] == true then
allDisabled = false;
break
end
end
end
if allDisabled then
DEFAULT_CHAT_FRAME:AddMessage(RED .. AL["AtlasLoot"] .. ": " .. WHITE .. AL["You don't have any module selected to search on."]);
return;
end
if self.db.profile.SearchOn.All then
AtlasLoot:LoadAllModules();
else
for k, v in pairs(self.db.profile.SearchOn) do
if k ~= "All" and v == true and not IsAddOnLoaded(k) and LoadAddOn(k) and self.db.profile.LoDNotify then
DEFAULT_CHAT_FRAME:AddMessage(GREEN .. AL["AtlasLoot"] .. ": " .. ORANGE .. k .. WHITE .. " " .. AL["sucessfully loaded."]);
end
end
end
local success, message = pcall(DoSearch, Text)
if not success then
message = message:match("[^:]+: (.*)") or message -- strip stack location
DEFAULT_CHAT_FRAME:AddMessage(RED .. AL["AtlasLoot"] .. ": " .. WHITE .. message);
elseif #AtlasLootCharDB["SearchResult"] == 0 then
local itemFilterErrorMessage = "";
if operator then
itemFilterErrorMessage = [[
Please check if you have a typo in the filter.
For help, type "/atlasloothelp".
You might also have to query the server for item informations to load them into your client's Cache.]];
end
DEFAULT_CHAT_FRAME:AddMessage(RED .. AL["AtlasLoot"] .. ": " .. WHITE .. AL["No match found for"] .. " \"" .. Text .. "\"." .. itemFilterErrorMessage);
else
AtlasLoot:ShowItemsFrame("SearchResult", "AtlasLootCharDB", 1);
end
end
function AtlasLoot:ShowSearchOptions(button)
local dewdrop = AceLibrary("Dewdrop-2.0");
if dewdrop:IsOpen(button) then
dewdrop:Close(1);
else
local setOptions = function()
dewdrop:AddLine("text", AL["Search on"], "isTitle", true, "notCheckable", true);
dewdrop:AddLine("text", AL["All modules"], "checked", self.db.profile.SearchOn.All, "tooltipTitle", AL["All modules"], "tooltipText",
AL["If checked, AtlasLoot will load and search across all the modules."], "func", function()
self.db.profile.SearchOn.All = not self.db.profile.SearchOn.All;
end);
for _, module in ipairs(modules) do
if IsAddOnLoadOnDemand(module) then
local title = GetAddOnMetadata(module, "title");
local notes = GetAddOnMetadata(module, "notes");
dewdrop:AddLine("text", title, "checked", self.db.profile.SearchOn.All or self.db.profile.SearchOn[module], "disabled", self.db.profile.SearchOn.All, "tooltipTitle", title,
"tooltipText", notes, "func", function()
if self.db.profile.SearchOn[module] == nil then
self.db.profile.SearchOn[module] = true;
else
self.db.profile.SearchOn[module] = nil;
end
end);
end
end
dewdrop:AddLine("text", AL["Search options"], "isTitle", true, "notCheckable", true);
dewdrop:AddLine("text", AL["Partial matching"], "checked", self.db.profile.PartialMatching, "tooltipTitle", AL["Partial matching"], "tooltipText",
AL["If checked, AtlasLoot search item names for a partial match."], "func", function()
self.db.profile.PartialMatching = not self.db.profile.PartialMatching
end);
dewdrop:AddLine("text", "Only search equipable", -- TODO: put in AL
"checked", self.db.profile.EquipableFilter, "tooltipTitle", "Equipable filter", -- TODO: put in AL
"tooltipText", "If checked, AtlasLoot only includes items that are euipable.", -- TODO: put in AL
"func", function()
self.db.profile.EquipableFilter = not self.db.profile.EquipableFilter
end);
end;
dewdrop:Open(button, 'point', function(parent)
return "BOTTOMLEFT", "BOTTOMRIGHT";
end, "children", setOptions);
end
end
function AtlasLoot:GetOriginalDataFromSearchResult(itemID)
for i, v in ipairs(AtlasLootCharDB["SearchResult"]) do
if v[2] == itemID then
AtlasLoot_ShowWishListDropDown(v[2], v[3], v[4], v[5], v[8], this, nil);
end
end
end
+595
View File
@@ -0,0 +1,595 @@
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
local modules = {"AtlasLoot_BurningCrusade", "AtlasLoot_Crafting", "AtlasLoot_OriginalWoW", "AtlasLoot_WorldEvents", "AtlasLoot_WrathoftheLichKing"};
AtlasLoot_QualityMenu = AceLibrary("Dewdrop-2.0");
AtlasLoot_DifficultyMenu = AceLibrary("Dewdrop-2.0");
AtlasLoot_EquipMenu = AceLibrary("Dewdrop-2.0");
AtlasLoot_EquipSubMenu = AceLibrary("Dewdrop-2.0");
local MAX_ARGUMENTS = 6;
local ACTIVE_ARGUMENT = 0;
AtlasLoot_ArgumentMenus = {};
AtlasLoot_ArgumentSubMenus = {};
local GREY = "|cff999999";
local RED = "|cffff0000";
local WHITE = "|cffFFFFFF";
local GREEN = "|cff1eff00";
local PURPLE = "|cff9F3FFF";
local BLUE = "|cff0070dd";
local ORANGE = "|cffFF8400";
local DEFAULT = "|cffFFd200";
AtlasLoot_FrameMenuList = {
["EquipSubMenu"] = {AtlasLoot_EquipSubMenu, "AtlasLootDefaultFrame_AdvancedSearchPanel_EquipSubButton", "Select Option", "type", ""}
}
AtlasLoot_AdvancedSearchMenus = {
["Difficulty"] = {
[1] = {{"Normal", "difficulty", AtlasLoot_Difficulty.Normal}},
[2] = {{"Heroic", "difficulty", AtlasLoot_Difficulty.Heroic}},
[3] = {{"Mythic/Ascended", "difficulty", AtlasLoot_Difficulty.Mythic}},
[4] = {
["Mythic+ 1-10"] = {{"Mythic 1", "difficulty", AtlasLoot_Difficulty.MythicPlus[1]}, {"Mythic 2", "difficulty", AtlasLoot_Difficulty.MythicPlus[2]},
{"Mythic 3", "difficulty", AtlasLoot_Difficulty.MythicPlus[3]}, {"Mythic 4", "difficulty", AtlasLoot_Difficulty.MythicPlus[4]},
{"Mythic 5", "difficulty", AtlasLoot_Difficulty.MythicPlus[5]}, {"Mythic 6", "difficulty", AtlasLoot_Difficulty.MythicPlus[6]},
{"Mythic 7", "difficulty", AtlasLoot_Difficulty.MythicPlus[7]}, {"Mythic 8", "difficulty", AtlasLoot_Difficulty.MythicPlus[8]},
{"Mythic 9", "difficulty", AtlasLoot_Difficulty.MythicPlus[9]}, {"Mythic 10", "difficulty", AtlasLoot_Difficulty.MythicPlus[10]}}
},
[5] = {
["Mythic+ 11-20"] = {{"Mythic 11", "difficulty", AtlasLoot_Difficulty.MythicPlus[11]}, {"Mythic 12", "difficulty", AtlasLoot_Difficulty.MythicPlus[12]},
{"Mythic 13", "difficulty", AtlasLoot_Difficulty.MythicPlus[13]}, {"Mythic 14", "difficulty", AtlasLoot_Difficulty.MythicPlus[14]},
{"Mythic 15", "difficulty", AtlasLoot_Difficulty.MythicPlus[15]}, {"Mythic 16", "difficulty", AtlasLoot_Difficulty.MythicPlus[16]},
{"Mythic 17", "difficulty", AtlasLoot_Difficulty.MythicPlus[17]}, {"Mythic 18", "difficulty", AtlasLoot_Difficulty.MythicPlus[18]},
{"Mythic 19", "difficulty", AtlasLoot_Difficulty.MythicPlus[19]}, {"Mythic 20", "difficulty", AtlasLoot_Difficulty.MythicPlus[20]}}
},
[6] = {
["Mythic+ 21-30"] = {{"Mythic 21", "difficulty", AtlasLoot_Difficulty.MythicPlus[21]}, {"Mythic 22", "difficulty", AtlasLoot_Difficulty.MythicPlus[22]},
{"Mythic 23", "difficulty", AtlasLoot_Difficulty.MythicPlus[23]}, {"Mythic 24", "difficulty", AtlasLoot_Difficulty.MythicPlus[24]},
{"Mythic 25", "difficulty", AtlasLoot_Difficulty.MythicPlus[25]}, {"Mythic 26", "difficulty", AtlasLoot_Difficulty.MythicPlus[26]},
{"Mythic 27", "difficulty", AtlasLoot_Difficulty.MythicPlus[27]}, {"Mythic 28", "difficulty", AtlasLoot_Difficulty.MythicPlus[28]},
{"Mythic 29", "difficulty", AtlasLoot_Difficulty.MythicPlus[29]}, {"Mythic 30", "difficulty", AtlasLoot_Difficulty.MythicPlus[30]}}
},
[7] = {{"Bloodforged", "difficulty", AtlasLoot_Difficulty.Bloodforged}},
[8] = {{RED .. "Reset", "difficulty", "reset"}}
},
["Quality"] = {
-- [1] = {
-- {AtlasLoot_FixText("=q0=").."Poor", "quality", "poor"},
-- },
-- [2] = {
-- {AtlasLoot_FixText("=q1=").."Common", "quality", "common"},
-- },
[1] = {{AtlasLoot_FixText("=q2=") .. "Uncommon", "quality", "uncommon"}},
[2] = {{AtlasLoot_FixText("=q3=") .. "Rare", "quality", "rare"}},
[3] = {{AtlasLoot_FixText("=q4=") .. "Epic", "quality", "epic"}},
[4] = {{AtlasLoot_FixText("=q5=") .. "Legendary", "quality", "legendary"}},
[5] = {{RED .. "Reset", "quality", "reset"}}
},
["Equip"] = {
[1] = {{"Head", "equip", "head", "EquipSubMenu", "ArmorType"}},
[2] = {{"Shoulder", "equip", "shoulder", "EquipSubMenu", "ArmorType"}},
[3] = {{"Chest", "equip", "chest", "EquipSubMenu", "ArmorType"}},
[4] = {{"Wrist", "equip", "wrist", "EquipSubMenu", "ArmorType"}},
[5] = {{"Hands", "equip", "hand", "EquipSubMenu", "ArmorType"}},
[6] = {{"Waist", "equip", "waist", "EquipSubMenu", "ArmorType"}},
[7] = {{"Legs", "equip", "legs", "EquipSubMenu", "ArmorType"}},
[8] = {{"Feet", "equip", "feet", "EquipSubMenu", "ArmorType"}},
[9] = {
["Accessories"] = {{"Necklace", "equip", "neck", "EquipSubMenu", "Disable"}, {"Back", "equip", "cloak", "EquipSubMenu", "Disable"}, {"Ring", "equip", "finger", "EquipSubMenu", "Disable"},
{"Trinket", "equip", "trinket", "EquipSubMenu", "Disable"}}
},
[10] = {
["Weapons"] = {{"One-Hand", "equip", "weapon", "EquipSubMenu", "WeaponType1H"}, {"Two-Hand", "equip", "2h", "EquipSubMenu", "WeaponType2H"},
{"Main Hand", "equip", "mainhand", "EquipSubMenu", "WeaponType1H"}, {"Off Hand", "equip", "offhand", "EquipSubMenu", "WeaponType1H"},
{"Ranged", "equip", "ranged", "EquipSubMenu", "WeaponTypeRanged"}, {"Relic", "equip", "relic", "EquipSubMenu", "RelicType"}}
},
[11] = {
["Off-Hand"] = {{"Shield", "equip", "shield", "EquipSubMenu", "Disable"}, {"Held in Off-Hand", "equip", "holdable", "EquipSubMenu", "Disable"}}
},
[12] = {{RED .. "Reset", "equip", "reset", "EquipSubMenu", "Disable"}}
},
["ArmorType"] = {
[1] = {{"Cloth", "type", "Cloth"}},
[2] = {{"Leather", "type", "Leather"}},
[3] = {{"Mail", "type", "Mail"}},
[4] = {{"Plate", "type", "Plate"}},
[5] = {{RED .. "Reset", "type", "reset"}}
},
["RelicType"] = {
[1] = {{"Idols", "type", "idol"}},
[2] = {{"Libram", "type", "libram"}},
[3] = {{"Totem", "type", "totem"}},
[4] = {{"Sigil", "type", "sigil"}},
[5] = {{RED .. "Reset", "type", "reset"}}
},
["WeaponType1H"] = {
[1] = {{"Axe", "type", "axe1h"}},
[2] = {{"Mace", "type", "mace1h"}},
[3] = {{"Sword", "type", "sword1h"}},
[4] = {{"Dagger", "type", "dagger"}},
[5] = {{"Fist Weapon", "type", "fist"}},
[6] = {{RED .. "Reset", "type", "reset"}}
},
["WeaponType2H"] = {
[1] = {{"Axe", "type", "axe2h"}},
[2] = {{"Mace", "type", "mace2h"}},
[3] = {{"Sword", "type", "sword2h"}},
[4] = {{"Polearm", "type", "polearm"}},
[5] = {{"Staff", "type", "staff"}},
[6] = {{RED .. "Reset", "type", "reset"}}
},
["WeaponTypeRanged"] = {
[1] = {{"Bow", "type", "bows"}},
[2] = {{"Gun", "type", "guns"}},
[3] = {{"Crossbow", "type", "crossbows"}},
[4] = {{"Wand", "type", "wand"}},
[5] = {{"Thrown", "type", "thrown"}},
[6] = {{RED .. "Reset", "type", "reset"}}
}
}
AtlasLoot_AdvancedSearchArguments = {
["Arguments"] = {
[1] = {
["Primary Stats"] = {{"Stamina", "sta"}, {"Strength", "str"}, {"Agility", "agi"}, {"Intellect", "int"}, {"Spirit", "spi"}}
},
[2] = {
["Secondary Stats"] = {{"Attack Power", "ap"}, {"Spell Power", "sp"}, {"Crit", "crit"}, {"Hit", "hit"}, {"Haste", "haste"}, {"Expertise", "exp"}, {"Armor Pen", "arp"}, {"Spell Pen", "spp"}}
},
[3] = {
["Defensive Stats"] = {{"Defense", "def"}, {"Dodge", "dodge"}, {"Parry", "parry"}, {"Block", "block"}, {"Block Value", "bv"}, {"Resilience", "res"}}
},
[4] = {
["Resistances"] = {{"Armor", "armor"}, {"Holy Resist", "resholy"}, {"Fire Resist", "resfire"}, {"Nature Resist", "resnat"}, {"Frost Resist", "resfrost"}, {"Shadow Resist", "resshad"},
{"Arcane Resist", "resarc"}}
},
[5] = {
["Sockets"] = {{"Any", "socket"}, {"Red Socket", "socketred"}, {"Blue Socket", "socketblue"}, {"Yellow Socket", "socketyellow"}, {"Meta Socket", "socketmeta"}}
},
[6] = {
["Other"] = {{"Required Level", "minlvl"}, {"Item Level", "ilvl"}}
},
[7] = {{RED .. "Reset", "reset"}}
},
["Operators"] = {
[1] = {{"Equals", "=", true}},
[2] = {{"Greater Than", ">", true}},
[3] = {{"Greater Than Or Equal", ">=", true}},
[4] = {{"Less Than", "<", true}},
[5] = {{"Less Than Or Equal", "<=", true}},
[6] = {{"Not Equal", "<>", true}},
[7] = {{RED .. "Reset", "reset", true}}
}
}
AtlasLoot_AdvSearchOptions = {
["quality"] = "",
["equip"] = "",
["type"] = "",
["difficulty"] = ""
}
function AtlasLoot_AdvancedSearchSetup()
AtlasLoot_AdvancedSearchRegister(AtlasLoot_QualityMenu, AtlasLootDefaultFrame_AdvancedSearchPanel_QualityButton, AtlasLoot_AdvancedSearchMenus["Quality"]);
AtlasLoot_AdvancedSearchRegister(AtlasLoot_EquipMenu, AtlasLootDefaultFrame_AdvancedSearchPanel_EquipButton, AtlasLoot_AdvancedSearchMenus["Equip"]);
--AtlasLoot_AdvancedSearchRegister(AtlasLoot_DifficultyMenu, AtlasLootDefaultFrame_AdvancedSearchPanel_Difficulty, AtlasLoot_AdvancedSearchMenus["Difficulty"]);
for n = 1, MAX_ARGUMENTS do
AtlasLoot_ArgumentMenus[n] = AceLibrary("Dewdrop-2.0");
AtlasLoot_ArgumentSubMenus[n] = AceLibrary("Dewdrop-2.0");
AtlasLoot_AdvancedSearchArgumentRegister(AtlasLoot_ArgumentMenus[n], _G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(n)], tostring(n), AtlasLoot_AdvancedSearchArguments["Arguments"]);
AtlasLoot_AdvancedSearchArgumentRegister(AtlasLoot_ArgumentSubMenus[n], _G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(n) .. "Sub"], tostring(n),
AtlasLoot_AdvancedSearchArguments["Operators"]);
end
-- Reset Search options to defualt
AtlasLoot_AdvancedSearchReset();
end
function AtlasLoot_AdvancedSearchShow()
if (AtlasLootDefaultFrame_AdvancedSearchPanel:IsVisible()) then
AtlasLoot_AdvancedSearchClose();
return;
end
-- Hide all elements that could be in the AtlasTable
_G["AtlasLootItemsFrame_NEXT"]:Hide();
_G["AtlasLootItemsFrame_PREV"]:Hide();
_G["AtlasLootItemsFrame_BACK"]:Hide();
-- Ditch the Quicklook selector
AtlasLootQuickLooksButton:Hide();
-- Hide the Filter Check-Box
AtlasLootFilterCheck:Hide();
for i = 1, 30, 1 do
_G["AtlasLootItem_" .. i .. "_Unsafe"]:Hide();
_G["AtlasLootItem_" .. i]:Hide();
_G["AtlasLootItem_" .. i].itemID = 0;
_G["AtlasLootItem_" .. i].spellitemID = 0;
end
AtlasLoot_BossName:SetText("Advanced Search");
AtlasLootDefaultFrame_AdvancedSearchPanel:Show();
ATLASLOOT_CURRENTTYPE = "Search";
AtlasLoot:ScrollFrameUpdate();
AtlasLoot:SubTableScrollFrameUpdate("EmptyTable","AtlasLoot_Data");
end
function AtlasLoot_AdvancedSearchClose()
AtlasLootDefaultFrame_AdvancedSearchPanel:Hide();
if (SearchPrevData[1] ~= "") then
AtlasLoot:ShowItemsFrame(SearchPrevData[1], SearchPrevData[2], SearchPrevData[3]);
end
end
function AtlasLoot_AdvancedSearchReset()
AtlasLoot_AdvSearchOptions = {
["quality"] = "",
["equip"] = "",
["type"] = "",
["difficulty"] = ""
}
for i = 1, MAX_ARGUMENTS do
AtlasLoot_AdvSearchOptions["arg" .. tostring(i)] = "";
AtlasLoot_AdvSearchOptions["arg" .. tostring(i) .. "op"] = "";
AtlasLoot_RemoveArgumentContainer();
end
local expansionLevels = {60, 70, 80}
AtlasLootDefaultFrame_AdvancedSearchPanel_LevelMin:SetText(expansionLevels[GetAccountExpansionLevel() + 1]);
AtlasLootDefaultFrame_AdvancedSearchPanel_LevelMax:SetText(expansionLevels[GetAccountExpansionLevel() + 1]);
AtlasLootDefaultFrame_AdvancedSearchPanel_iLevelMin:SetText("");
AtlasLootDefaultFrame_AdvancedSearchPanel_iLevelMax:SetText("");
AtlasLootDefaultFrame_AdvancedSearchPanel_QualityButton:SetText("Select Quality");
AtlasLootDefaultFrame_AdvancedSearchPanel_EquipButton:SetText("Select Item Type");
AtlasLootDefaultFrame_AdvancedSearchPanel_EquipSubButton:Disable();
AtlasLootDefaultFrame_AdvancedSearchPanel_EquipSubButton:SetText("Select Option");
end
function AtlasLoot_AddArgumentContainer()
if ACTIVE_ARGUMENT == MAX_ARGUMENTS then
AtlasLoot_AdvSearchArgButtonToggle()
return
end
ACTIVE_ARGUMENT = ACTIVE_ARGUMENT + 1;
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(ACTIVE_ARGUMENT)]:Show();
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(ACTIVE_ARGUMENT)]:SetText("Select Option");
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(ACTIVE_ARGUMENT) .. "Sub"]:Show();
AtlasLoot_AdvSearchArgButtonToggle()
end
function AtlasLoot_RemoveArgumentContainer()
if ACTIVE_ARGUMENT == 0 then
AtlasLoot_AdvSearchArgButtonToggle()
return
end
AtlasLoot_AdvSearchOptions["arg" .. tostring(ACTIVE_ARGUMENT)] = "";
AtlasLoot_AdvSearchOptions["arg" .. tostring(ACTIVE_ARGUMENT) .. "op"] = "";
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(ACTIVE_ARGUMENT)]:Hide();
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(ACTIVE_ARGUMENT) .. "Sub"]:Disable();
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(ACTIVE_ARGUMENT) .. "Sub"]:Hide();
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(ACTIVE_ARGUMENT) .. "Value"]:Hide();
ACTIVE_ARGUMENT = ACTIVE_ARGUMENT - 1;
AtlasLoot_AdvSearchArgButtonToggle()
end
function AtlasLoot_AdvSearchArgButtonToggle()
if ACTIVE_ARGUMENT == MAX_ARGUMENTS then
AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainerAddArgBtn:Disable()
else
AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainerAddArgBtn:Enable()
end
if ACTIVE_ARGUMENT == 0 then
AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainerRemArgBtn:Disable()
else
AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainerRemArgBtn:Enable()
end
end
AtlasLoot_AdvSearchDefaultText = {
["quality"] = "Select Quality",
["equip"] = "Select Item Type",
["type"] = "Select Option",
["difficulty"] = "Select Difficulty"
}
function AtlasLoot_AdvancedSearchMenuClick(Object, VariableToSet, VariableValue, ChildMenu, ChildMenuRegister)
-- Setups child menus and sets search options to default
if (ChildMenu ~= nil) then
if (ChildMenuRegister == "Disable") then
AtlasLoot_AdvSearchOptions[AtlasLoot_FrameMenuList[ChildMenu][4]] = AtlasLoot_FrameMenuList[ChildMenu][5];
_G[AtlasLoot_FrameMenuList[ChildMenu][2]]:Disable();
-- Disable assigned children menus as well
if (AtlasLoot_FrameMenuList[ChildMenu][6]) then
_G[AtlasLoot_FrameMenuList[ChildMenu][6]]:Disable();
end
if VariableValue == "reset" then
AtlasLoot_AdvSearchOptions[VariableToSet] = "";
Object[1]:SetText(AtlasLoot_AdvSearchDefaultText[VariableToSet]);
Object[2]:Close();
_G[AtlasLoot_FrameMenuList[ChildMenu][2]]:SetText(AtlasLoot_FrameMenuList[ChildMenu][3])
return
end
else
AtlasLoot_AdvancedSearchRegister(AtlasLoot_FrameMenuList[ChildMenu][1], _G[AtlasLoot_FrameMenuList[ChildMenu][2]], AtlasLoot_AdvancedSearchMenus[ChildMenuRegister]);
AtlasLoot_AdvSearchOptions[AtlasLoot_FrameMenuList[ChildMenu][4]] = AtlasLoot_FrameMenuList[ChildMenu][5];
_G[AtlasLoot_FrameMenuList[ChildMenu][2]]:Enable();
_G[AtlasLoot_FrameMenuList[ChildMenu][2]]:SetText(AtlasLoot_FrameMenuList[ChildMenu][3]);
-- Disable assigned children menus as well
if (AtlasLoot_FrameMenuList[ChildMenu][6]) then
_G[AtlasLoot_FrameMenuList[ChildMenu][6]]:Disable();
end
end
end
if VariableValue == "reset" then
AtlasLoot_AdvSearchOptions[VariableToSet] = "";
Object[1]:SetText(AtlasLoot_AdvSearchDefaultText[VariableToSet]);
Object[2]:Close();
return
end
AtlasLoot_AdvSearchOptions[VariableToSet] = VariableValue;
Object[1]:SetText(Object[3]);
Object[2]:Close();
end
function AtlasLoot_AdvancedSearchRegister(DropDown, DropDownObject, MenuOption)
DropDown:Register(DropDownObject, 'point', function(parent)
return "TOP", "BOTTOM"
end, 'children', function(level, value)
if level == 1 then
if AtlasLoot_AdvancedSearchMenus then
for k, v in ipairs(MenuOption) do
-- If a link to show a submenu
if (type(v[1]) == "table") and (type(v[1][1]) == "string") then
if v[1][1] ~= "" then
DropDown:AddLine('text', v[1][1], 'textR', 1, 'textG', 0.82, 'textB', 0, 'func', AtlasLoot_AdvancedSearchMenuClick, 'arg1', {DropDownObject, DropDown, v[1][1]}, 'arg2',
v[1][2], 'arg3', v[1][3], 'arg4', v[1][4], 'arg5', v[1][5], 'notCheckable', true)
end
else
local lock = 0;
-- If an entry linked to a subtable
for i, j in pairs(v) do
if lock == 0 then
DropDown:AddLine('text', i, 'textR', 1, 'textG', 0.82, 'textB', 0, 'hasArrow', true, 'value', j, 'notCheckable', true)
lock = 1;
end
end
end
end
end
-- Close button
DropDown:AddLine('text', AL["Close Menu"], 'textR', 0, 'textG', 1, 'textB', 1, 'func', function()
DropDown:Close()
end, 'notCheckable', true)
elseif level == 2 then
if value then
for k, v in ipairs(value) do
DropDown:AddLine('text', v[1], 'textR', 1, 'textG', 0.82, 'textB', 0, 'func', AtlasLoot_AdvancedSearchMenuClick, 'arg1', {DropDownObject, DropDown, v[1]}, 'arg2', v[2], 'arg3',
v[3], 'arg4', v[4], 'arg5', v[5], 'notCheckable', true)
end
end
end
end, 'dontHook', true)
end
function AtlasLoot_AdvancedSearchArgumentClick(Object, VariableToSet, VariableValue, IsOperator)
if IsOperator and VariableValue == "reset" then
AtlasLoot_AdvSearchOptions["arg" .. VariableToSet .. "op"] = "";
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Value"]:SetText("");
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Value"]:Hide();
Object[1]:SetText("Select Option");
Object[2]:Close();
elseif IsOperator then
AtlasLoot_AdvSearchOptions["arg" .. VariableToSet .. "op"] = VariableValue;
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Value"]:Show();
Object[1]:SetText(Object[3]);
Object[2]:Close();
elseif VariableValue == "reset" then
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Sub"]:SetText("Select Option");
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Sub"]:Disable();
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Value"]:SetText("");
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Value"]:Hide();
AtlasLoot_AdvSearchOptions["arg" .. VariableToSet] = "";
AtlasLoot_AdvSearchOptions["arg" .. VariableToSet .. "op"] = "";
Object[1]:SetText("Select Option");
Object[2]:Close();
else
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Sub"]:SetText("Select Option");
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Sub"]:Enable();
AtlasLoot_AdvSearchOptions["arg" .. VariableToSet .. "op"] = "";
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Value"]:SetText("");
_G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. VariableToSet .. "Value"]:Hide();
AtlasLoot_AdvSearchOptions["arg" .. VariableToSet] = VariableValue;
Object[1]:SetText(Object[3]);
Object[2]:Close();
end
end
function AtlasLoot_AdvancedSearchArgumentRegister(DropDown, DropDownObject, ArgumentCount, ArgumentMenu)
DropDown:Register(DropDownObject, 'point', function(parent)
return "TOP", "BOTTOM"
end, 'children', function(level, value)
if level == 1 then
if AtlasLoot_AdvancedSearchArguments then
for k, v in ipairs(ArgumentMenu) do
-- If a link to show a submenu
if (type(v[1]) == "table") and (type(v[1][1]) == "string") then
local checked = false;
if v[1][3] == "Submenu" then
DropDown:AddLine('text', v[1][1], 'textR', 1, 'textG', 0.82, 'textB', 0, 'func', AtlasLoot_AdvancedSearchArgumentClick, 'arg1', {DropDownObject, DropDown, v[1][1]}, 'arg2',
ArgumentCount, 'arg3', v[1][2], 'arg4', v[1][3], 'notCheckable', true)
elseif v[1][1] ~= "" then
DropDown:AddLine('text', v[1][1], 'textR', 1, 'textG', 0.82, 'textB', 0, 'func', AtlasLoot_AdvancedSearchArgumentClick, 'arg1', {DropDownObject, DropDown, v[1][1]}, 'arg2',
ArgumentCount, 'arg3', v[1][2], 'arg4', v[1][3], 'notCheckable', true)
end
else
local lock = 0;
-- If an entry linked to a subtable
for i, j in pairs(v) do
if lock == 0 then
DropDown:AddLine('text', i, 'textR', 1, 'textG', 0.82, 'textB', 0, 'hasArrow', true, 'value', j, 'notCheckable', true)
lock = 1;
end
end
end
end
end
-- Close button
DropDown:AddLine('text', AL["Close Menu"], 'textR', 0, 'textG', 1, 'textB', 1, 'func', function()
DropDown:Close()
end, 'notCheckable', true)
elseif level == 2 then
if value then
for k, v in ipairs(value) do
if type(v) == "table" then
if (type(v[1]) == "string") then
local checked = false;
-- If an entry to show a submenu
if v[4] == "Header" then
DropDown:AddLine('text', v[1], 'textR', 0.2, 'textG', 0.82, 'textB', 0.5, 'func', AtlasLoot_AdvancedSearchArgumentClick, 'arg1', {DropDownObject, DropDown, v[1]},
'arg2', ArgumentCount, 'arg3', v[2], 'arg4', v[3], 'notCheckable', true)
elseif v[3] == "Submenu" then
DropDown:AddLine('text', v[1], 'textR', 1, 'textG', 0.82, 'textB', 0, 'func', AtlasLoot_AdvancedSearchArgumentClick, 'arg1', {DropDownObject, DropDown, v[1]}, 'arg2',
ArgumentCount, 'arg3', v[2], 'arg4', v[3], 'notCheckable', true)
else
DropDown:AddLine('text', v[1], 'textR', 1, 'textG', 0.82, 'textB', 0, 'func', AtlasLoot_AdvancedSearchArgumentClick, 'arg1', {DropDownObject, DropDown, v[1]}, 'arg2',
ArgumentCount, 'arg3', v[2], 'arg4', v[3], 'notCheckable', true)
end
end
end
end
end
DropDown:AddLine('text', AL["Close Menu"], 'textR', 0, 'textG', 1, 'textB', 1, 'func', function()
DropDown:Close()
end, 'notCheckable', true)
end
end, 'dontHook', true)
end
function AtlasLoot:AdvancedSearch(Text)
if not Text then
return
end
Text = strtrim(Text);
local advSearchString = Text or "";
local function AppendSearchString(toAppend, str)
if toAppend ~= "" then
toAppend = toAppend .. "&" .. str;
return toAppend;
end
return str;
end
local function GetTextByName(name)
if (_G["AtlasLootDefaultFrame_AdvancedSearchPanel_" .. name]) then
return _G["AtlasLootDefaultFrame_AdvancedSearchPanel_" .. name]:GetText()
end
return nil;
end
local function FixRangedSlot(subType)
if (subType == "wand" or subType == "gun" or subType == "crossbow") then
return "rangedright";
elseif subType == "thrown" then
return "thrown";
end
return "ranged";
end
if AtlasLoot_AdvSearchOptions["quality"] ~= "" then
advSearchString = AppendSearchString(advSearchString, "quality=" .. AtlasLoot_AdvSearchOptions["quality"]);
end
if AtlasLoot_AdvSearchOptions["equip"] ~= "" then
if AtlasLoot_AdvSearchOptions["equip"] == "ranged" and AtlasLoot_AdvSearchOptions["type"] ~= "" then
AtlasLoot_AdvSearchOptions["equip"] = FixRangedSlot(AtlasLoot_AdvSearchOptions["type"]);
end
advSearchString = AppendSearchString(advSearchString, "slot=" .. AtlasLoot_AdvSearchOptions["equip"]);
end
if AtlasLoot_AdvSearchOptions["type"] ~= "" and AtlasLoot_AdvSearchOptions["type"] then
advSearchString = AppendSearchString(advSearchString, "type=" .. AtlasLoot_AdvSearchOptions["type"]);
end
if AtlasLoot_AdvSearchOptions["difficulty"] ~= "" and AtlasLoot_AdvSearchOptions["difficulty"] ~= 2 then
advSearchString = AppendSearchString(advSearchString, "dif=" .. AtlasLoot_AdvSearchOptions["difficulty"]);
end
if(not AtlasLootDefaultFrame_AdvancedSearchPanel_LevelToggle:GetChecked()) then
if (GetTextByName("LevelMin") and GetTextByName("LevelMin") ~= "") then
advSearchString = AppendSearchString(advSearchString, "minlvl>=" .. GetTextByName("LevelMin"));
end
if (GetTextByName("LevelMax") and GetTextByName("LevelMax") ~= "") then
advSearchString = AppendSearchString(advSearchString, "minlvl<=" .. GetTextByName("LevelMax"));
end
else
advSearchString = AppendSearchString(advSearchString, "minlvl>=" .. UnitLevel("player"));
advSearchString = AppendSearchString(advSearchString, "minlvl<=" .. UnitLevel("player"));
end
if (GetTextByName("iLevelMin") and GetTextByName("iLevelMin") ~= "") then
advSearchString = AppendSearchString(advSearchString, "ilvl>=" .. GetTextByName("iLevelMin"));
end
if (GetTextByName("iLevelMax") and GetTextByName("iLevelMax") ~= "") then
advSearchString = AppendSearchString(advSearchString, "ilvl<=" .. GetTextByName("iLevelMax"));
end
for i = 1, ACTIVE_ARGUMENT, 1 do
if AtlasLoot_AdvSearchOptions["arg" .. i] ~= "" then
local arg = _G["AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(i) .. "Value"]:GetText();
if AtlasLoot_AdvSearchOptions["arg" .. i .. "op"] == "" then
AtlasLoot_AdvSearchOptions["arg" .. i .. "op"] = ">"
arg = "0";
end
advSearchString = AppendSearchString(advSearchString, AtlasLoot_AdvSearchOptions["arg" .. i] .. AtlasLoot_AdvSearchOptions["arg" .. i .. "op"] .. arg);
end
end
AtlasLootDefaultFrame_AdvancedSearchPanel:Hide();
AtlasLoot:Search(string.lower(advSearchString));
end
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,282 @@
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
local MAX_ARGUMENTS = 6;
local framename = "AtlasLootDefaultFrame_AdvancedSearchPanel";
--Create Main Search Panel
local searchpanel = CreateFrame("FRAME", framename, AtlasLootDefaultFrame, nil);
searchpanel:SetPoint("TOPLEFT", AtlasLootDefaultFrame_LootBackground, "TOPLEFT", 2, -2);
searchpanel:SetSize(510, 510);
searchpanel.closebtn = CreateFrame("Button", framename.."_CloseButton", searchpanel, "UIPanelCloseButton");
searchpanel.closebtn:SetPoint("TOPRIGHT", searchpanel, "TOPRIGHT", -10, -10);
searchpanel:Hide();
searchpanel.closebtn:SetScript("OnClick", function() AtlasLoot_AdvancedSearchClose(); end);
searchpanel.closebtn:SetScript("OnShow", function(self) self:SetFrameLevel( (self:GetParent()):GetFrameLevel() + 1 ) end);
--Create search/name box
local searchbox = CreateFrame("EditBox", framename.."_SearchBox", searchpanel, "InputBoxTemplate");
searchbox:SetSize(265, 35);
searchbox:SetPoint("TOPLEFT", searchpanel, "TOPLEFT", 30, -55);
searchbox:SetMaxLetters(100);
searchbox:SetAutoFocus(false);
searchbox:SetTextInsets(0, 8, 0, 0);
searchbox.title = searchbox:CreateFontString(nil, "ARTWORK", "GameFontNormal");
searchbox.title:SetText("Name: ");
searchbox.title:SetPoint("TOPLEFT", searchbox, "TOPLEFT", -3, 8);
searchbox:SetScript("OnEnterPressed", function(self)
AtlasLoot:AdvancedSearch(AtlasLootDefaultFrame_AdvancedSearchPanel_SearchBox:GetText());
self:ClearFocus();
end);
searchbox:SetScript("OnShow", function(self) self:SetFrameLevel( (self:GetParent()):GetFrameLevel() + 1 ) end);
local searchbox_string = searchbox:CreateFontString(framename.."_SearchBoxString", "ARTWORK", "GameFontNormal");
--Create quality button
local qualitybtn = CreateFrame("Button", framename.."_QualityButton", searchpanel, "OptionsButtonTemplate");
qualitybtn:SetSize(130, 20);
qualitybtn:SetPoint("LEFT", searchbox, "RIGHT", 15, 0);
qualitybtn.title = qualitybtn:CreateFontString(nil, "ARTWORK", "GameFontNormal");
qualitybtn.title:SetText("Quality: ");
qualitybtn.title:SetPoint("TOPLEFT", qualitybtn, "TOPLEFT", 3, 15);
qualitybtn:SetScript("OnClick", function(self)
if AtlasLoot_QualityMenu:IsOpen() then
AtlasLoot_QualityMenu:Close();
else
AtlasLoot_QualityMenu:Open(self);
end
end);
qualitybtn:SetScript("OnShow", function(self) self:SetFrameLevel( (self:GetParent()):GetFrameLevel() + 1 ) end);
--Create equip type button
local equipbtn = CreateFrame("Button", framename.."_EquipButton", searchpanel, "OptionsButtonTemplate");
equipbtn:SetSize(130, 20);
equipbtn:SetPoint("TOPLEFT", searchbox, "BOTTOMLEFT", -8, -25);
equipbtn.title = equipbtn:CreateFontString(nil, "ARTWORK", "GameFontNormal");
equipbtn.title:SetText("Item Type: ");
equipbtn.title:SetPoint("TOPLEFT", equipbtn, "TOPLEFT", 3, 15);
--Create equip sub type button
equipbtn.subbtn = CreateFrame("Button", framename.."_EquipSubButton", equipbtn, "OptionsButtonTemplate");
equipbtn.subbtn:SetSize(130, 20);
equipbtn.subbtn:SetPoint("LEFT", equipbtn, "RIGHT", 15, 0);
equipbtn.subbtn.title = equipbtn.subbtn:CreateFontString(nil, "ARTWORK", "GameFontNormal");
equipbtn.subbtn.title:SetText("Item Subtype: ");
equipbtn.subbtn.title:SetPoint("TOPLEFT", equipbtn.subbtn, "TOPLEFT", 3, 15);
equipbtn:SetScript("OnClick", function(self)
if AtlasLoot_EquipMenu:IsOpen() then
AtlasLoot_EquipMenu:Close();
else
AtlasLoot_EquipMenu:Open(self);
end
end);
equipbtn:SetScript("OnShow", function(self) self:SetFrameLevel( (self:GetParent()):GetFrameLevel() + 1 ) end);
equipbtn.subbtn:SetScript("OnClick", function(self)
if AtlasLoot_EquipSubMenu:IsOpen() then
AtlasLoot_EquipSubMenu:Close();
else
AtlasLoot_EquipSubMenu:Open(self);
end
end);
equipbtn.subbtn:SetScript("OnShow", function(self) self:SetFrameLevel( (self:GetParent()):GetFrameLevel() + 1 ) end);
local levelminbox = CreateFrame("EditBox", framename.."_LevelMin", searchpanel, "InputBoxTemplate");
levelminbox:SetSize(47, 35);
levelminbox:SetPoint("TOPLEFT", searchbox, "BOTTOMLEFT", 0, -70);
local lmnb = levelminbox:CreateFontString(nil, "ARTWORK", "GameFontNormal");
levelminbox:SetMaxLetters(3);
levelminbox:SetAutoFocus(false);
levelminbox:SetTextInsets(0, 8, 0, 0);
levelminbox.title = levelminbox:CreateFontString(nil, "ARTWORK", "GameFontNormal");
levelminbox.title:SetText("Required Level: ");
levelminbox.title:SetPoint("TOPLEFT", levelminbox, "TOPLEFT", -3, 8);
local levelmaxbox = CreateFrame("EditBox", framename.."_LevelMax", searchpanel, "InputBoxTemplate");
levelmaxbox:SetSize(47, 35);
levelmaxbox:SetPoint("LEFT", levelminbox, "RIGHT", 25, 0);
local lmxb = levelmaxbox:CreateFontString(nil, "ARTWORK", "GameFontNormal");
levelmaxbox:SetMaxLetters(3);
levelmaxbox:SetAutoFocus(false);
levelmaxbox:SetTextInsets(0, 8, 0, 0);
local ilevelminbox = CreateFrame("EditBox", framename.."_iLevelMin", searchpanel, "InputBoxTemplate");
ilevelminbox:SetSize(47, 35);
ilevelminbox:SetPoint("LEFT", levelmaxbox, "RIGHT", 25, 0);
local ilmnb = ilevelminbox:CreateFontString(nil, "ARTWORK", "GameFontNormal");
ilevelminbox:SetMaxLetters(3);
ilevelminbox:SetAutoFocus(false);
ilevelminbox:SetTextInsets(0, 8, 0, 0);
ilevelminbox.title = ilevelminbox:CreateFontString(nil, "ARTWORK", "GameFontNormal");
ilevelminbox.title:SetText("Item Level: ");
ilevelminbox.title:SetPoint("TOPLEFT", ilevelminbox, "TOPLEFT", -3, 8);
local ilevelmaxbox = CreateFrame("EditBox", framename.."_iLevelMax", searchpanel, "InputBoxTemplate");
ilevelmaxbox:SetSize(47, 35);
ilevelmaxbox:SetPoint("LEFT", ilevelminbox, "RIGHT", 25, 0);
local ilmxb = ilevelmaxbox:CreateFontString(nil, "ARTWORK", "GameFontNormal");
ilevelmaxbox:SetMaxLetters(3);
ilevelmaxbox:SetAutoFocus(false);
ilevelmaxbox:SetTextInsets(0, 8, 0, 0);
local useleveltick = CreateFrame("CheckButton", framename.."_LevelToggle", searchpanel, "ChatConfigCheckButtonTemplate");
useleveltick:SetSize(20, 20);
useleveltick:SetPoint("TOPRIGHT", levelmaxbox, "BOTTOMRIGHT", 0, 5);
useleveltick.title = useleveltick:CreateFontString(nil, "ARTWORK", "GameFontNormal");
useleveltick.title:SetText("Use Current Lv: ");
useleveltick.title:SetPoint("TOPLEFT", levelminbox, "BOTTOMLEFT", 0, 5);
useleveltick:SetScript("OnClick", function(self, button)
if(self:GetChecked()) then levelmaxbox:Hide(); levelminbox:Hide();
else levelmaxbox:Show(); levelminbox:Show();
end
end)
local argpanel = CreateFrame("Frame", framename.."_ArgumentContainer", searchpanel);
argpanel:SetSize(450, 340);
argpanel:SetPoint("TOPLEFT", levelminbox, "BOTTOMLEFT", 0, -40);
argpanel.title = argpanel:CreateFontString(nil, "ARTWORK", "GameFontNormal");
argpanel.title:SetText("Additional Filters: ");
argpanel.title:SetPoint("TOPLEFT", argpanel, "TOPLEFT", 0, 0);
local addArg = CreateFrame("Button", "AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainerAddArgBtn", AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer, "OptionsButtonTemplate");
addArg:SetPoint("TOP", useleveltick, "BOTTOM", 5, -20);
addArg:SetSize(20, 20);
addArg:SetText("+");
addArg:SetScript("OnClick", function(self, button)
AtlasLoot_AddArgumentContainer();
end)
local remArg = CreateFrame("Button", "AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainerRemArgBtn", AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer, "OptionsButtonTemplate")
remArg:SetPoint("LEFT", AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainerAddArgBtn, "RIGHT", 10, 0);
remArg:SetSize(20, 20);
remArg:SetText("-");
remArg:SetScript("OnClick", function(self, button)
AtlasLoot_RemoveArgumentContainer();
end)
remArg:Disable();
for n = 1, MAX_ARGUMENTS do
local btn = CreateFrame("Button", "AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(n), AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer, "OptionsButtonTemplate");
btn:SetPoint("TOPLEFT", AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer, "TOPLEFT", 0, -((n - 1) * 35)-20);
btn:SetSize(130, 20);
btn:SetScript("OnClick", function(self, button)
if AtlasLoot_ArgumentMenus[n]:IsOpen() then
AtlasLoot_ArgumentMenus[n]:Close();
else
AtlasLoot_ArgumentMenus[n]:Open(self);
end
end)
btn:Hide();
btn:SetText("Select Option");
local sub = CreateFrame("Button", "AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(n) .. "Sub", AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer, "OptionsButtonTemplate");
sub:SetPoint("LEFT", btn, "RIGHT", 15, 0);
sub:SetSize(130, 20);
sub:SetScript("OnClick", function(self, button)
if AtlasLoot_ArgumentSubMenus[n]:IsOpen() then
AtlasLoot_ArgumentSubMenus[n]:Close();
else
AtlasLoot_ArgumentSubMenus[n]:Open(self);
end
end)
sub:Hide();
sub:Disable();
local txt = CreateFrame("EditBox", "AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer" .. tostring(n) .. "Value", AtlasLootDefaultFrame_AdvancedSearchPanel_ArgumentContainer, "InputBoxTemplate")
txt:SetPoint("LEFT", sub, "RIGHT", 15, 0);
txt:SetSize(65, 35);
txt:SetAutoFocus(false);
txt:SetTextInsets(0, 8, 0, 0);
txt:SetScript("OnEnterPressed", function(self)
self:ClearFocus();
end)
txt:Hide();
end
--Search Button
local searchbtn = CreateFrame("Button", framename.."_SearchButton", searchpanel, "UIPanelButtonTemplate2");
searchbtn:SetSize(70,32);
searchbtn:SetPoint("BOTTOMLEFT", searchpanel, "BOTTOMLEFT", 20, 20);
searchbtn:SetScript("OnShow", function(self)
self:SetText(AL["Search"]);
self:SetFrameLevel( (self:GetParent()):GetFrameLevel() + 1 );
end);
searchbtn:SetScript("OnClick", function()
AtlasLoot:AdvancedSearch(AtlasLootDefaultFrame_AdvancedSearchPanel_SearchBox:GetText());
AtlasLootDefaultFrame_AdvancedSearchPanel_SearchBox:ClearFocus();
end);
local clearbtn = CreateFrame("Button", framename.."_ClearButton", searchpanel, "UIPanelButtonTemplate2");
clearbtn:SetSize(70,32);
clearbtn:SetPoint("LEFT", searchbtn, "RIGHT", 20, 0);
clearbtn:SetScript("OnShow", function(self)
self:SetText(AL["Clear"]);
self:SetFrameLevel( (self:GetParent()):GetFrameLevel() + 1 );
end);
clearbtn:SetScript("OnClick", function()
AtlasLoot_AdvancedSearchReset();
AtlasLootDefaultFrame_AdvancedSearchPanel_SearchBox:SetText("");
AtlasLootDefaultFrame_AdvancedSearchPanel_SearchBox:ClearFocus();
end);
AtlasLoot_AdvancedSearchSetup();
--[[
function StreamingIcon_UpdateIcon(status, tooltip)
if(status > 0) then
AtlasLoot_SearchProgressSpinner:SetVertexColor(0,1,0);
AtlasLoot_SearchProgressFrameBackground:SetVertexColor(0,1,0);
AtlasLoot_SearchProgress.tooltip = tooltip;
AtlasLoot_SearchProgress.Loop:Play();
AtlasLoot_SearchProgress:Show();
else
AtlasLoot_SearchProgress.Loop:Stop();
AtlasLoot_SearchProgress:Hide();
end
end
local streamIcon = CreateFrame("Frame", "AtlasLoot_SearchProgress", AtlasLootDefaultFrame_LootBackground);
streamIcon:SetPoint("TOPRIGHT", AtlasLootDefaultFrame_LootBackground, "TOPRIGHT");
streamIcon:SetSize(48, 48);
streamIcon.tooltip = "Searching...";
streamIcon:EnableMouse(true);
streamIcon.icon = streamIcon:CreateTexture("$parentSpinner", "BACKGROUND");
streamIcon.icon:SetTexture("Interface\\Addons\\AtlasLoot\\Images\\streamcircle");
streamIcon.icon:SetVertexColor(0,1,0);
streamIcon.icon:SetAllPoints();
streamIcon.spark = streamIcon:CreateTexture("OVERLAY");
streamIcon.spark:SetTexture("Interface\\Addons\\AtlasLoot\\Images\\streamspark");
streamIcon.spark:SetAllPoints();
streamIcon.frame = CreateFrame("Frame", "$parentFrame", AtlasLoot_SearchProgress);
streamIcon.frame:SetAllPoints();
streamIcon.frame.bg = streamIcon.frame:CreateTexture("$parentBackground", "BACKGROUND");
streamIcon.frame.bg:SetTexture("Interface\\Addons\\AtlasLoot\\Images\\streambackground");
streamIcon.frame.bg:SetVertexColor(0,1,0);
streamIcon.frame.bg:SetAllPoints();
streamIcon.frame.alpha = streamIcon.frame:CreateTexture("$parentAlpha", "ARTWORK");
streamIcon.frame.alpha:SetTexture("Interface\\Addons\\AtlasLoot\\Images\\streamframe");
streamIcon.frame.alpha:SetAllPoints();
streamIcon.Loop = streamIcon:CreateAnimationGroup("$parentLoopAnim");
streamIcon.Loop:SetLooping("REPEAT");
local rotAnim = streamIcon.Loop:CreateAnimation("ROTATION");
rotAnim:SetOrder(1);
rotAnim:SetDuration(8);
rotAnim:SetDegrees(-360);
streamIcon:SetScript("OnEnter",
function(self)
if(self.tooltip ~= nil) then
GameTooltip:SetOwner(self, "ANCHOR_LEFT");
GameTooltip:SetText(self.tooltip, nil, nil, nil, nil, true);
end
end);
streamIcon:SetScript("OnLeave", GameTooltip_Hide);
streamIcon:SetScript("OnShow", function(self) self:SetFrameLevel( (self:GetParent()):GetFrameLevel() + 1 ) end);
streamIcon:SetPoint("TOPRIGHT", AtlasLootDefaultFrame_LootBackground, "TOPRIGHT");
streamIcon:Hide();]]
@@ -0,0 +1,394 @@
--[[
Functions:
AtlasLoot:DewDropClick(tablename, text, tabletype, tabletype2)
AtlasLoot:DewDropSubMenuClick(tablename)
AtlasLoot:DewdropExpansionMenuClick(tablename, text)
AtlasLoot_DefaultFrame_OnShow()
AtlasLootDefaultFrame_OnHide()
AtlasLoot:DewdropExpansionMenuRegister(loottable)
AtlasLoot:DewdropSubMenuRegister(loottable)
AtlasLoot:DewdropRegister()
AtlasLoot:SetNewStyle(style)
]]
--Include all needed libraries
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
local BabbleBoss = AtlasLoot_GetLocaleLibBabble("LibBabble-Boss-3.0")
local BabbleFaction = AtlasLoot_GetLocaleLibBabble("LibBabble-Faction-3.0")
local BabbleZone = AtlasLoot_GetLocaleLibBabble("LibBabble-Zone-3.0")
--Load the 2 dewdrop menus
AtlasLoot_Dewdrop = AceLibrary("Dewdrop-2.0");
AtlasLoot_DewdropSubMenu = AceLibrary("Dewdrop-2.0");
AtlasLoot_DewdropExpansionMenu = AceLibrary("Dewdrop-2.0");
ItemindexID = 2;
AtlasLoot_Data["AtlasLootFallback"] = {
EmptyInstance = {};
};
--[[
AtlasLootDefaultFrame_OnShow:
Called whenever the loot browser is shown and sets up buttons and loot tables
]]
function AtlasLootDefaultFrame_OnShow()
--Definition of where I want the loot table to be shown
--Remove the selection of a loot table in Atlas
AtlasLootItemsFrame.activeBoss = nil;
--Set the item table to the loot table
--Show the last displayed loot table
local lastboss = AtlasLoot.db.profile.LastBoss;
if AtlasLoot.db.profile.AutoCurrentInstance and AtlasLoot:ShowInstance() then elseif lastboss and lastboss[4] then
ATLASLOOT_CURRENTTABLE = lastboss[5];
ATLASLOOT_LASTMODULE = lastboss[4];
AtlasLoot:IsLootTableAvailable(lastboss[4]);
AtlasLoot:ShowItemsFrame(lastboss[1], "AtlasLoot_Data", lastboss[3]);
AtlasLoot_DewdropSubMenu:Unregister(AtlasLootDefaultFrame_SubMenu);
AtlasLoot:DewdropSubMenuRegister(AtlasLoot_SubMenus[lastboss[5]]);
AtlasLoot:WishListOptionsRegister();
else
AtlasLoot:ShowItemsFrame("EmptyTable", "AtlasLoot_Data", 1);
end
end
-- Show the Instance you are in
function AtlasLoot:ShowInstance()
for i,v in pairs(AtlasLoot_SubMenus) do
for n,t in ipairs(v) do
if t[4] == BabbleZone[GetRealZoneText()] then
ATLASLOOT_CURRENTTABLE = v.SubMenu;
ATLASLOOT_LASTMODULE = v.Module;
AtlasLoot:IsLootTableAvailable(ATLASLOOT_LASTMODULE);
AtlasLoot:ShowItemsFrame(t[2], "AtlasLoot_Data", 1);
AtlasLoot_DewdropSubMenu:Unregister(AtlasLootDefaultFrame_SubMenu);
AtlasLoot:DewdropSubMenuRegister(AtlasLoot_SubMenus[ATLASLOOT_CURRENTTABLE]);
AtlasLoot:WishListOptionsRegister();
return true;
end
end
end
end
--[[
AtlasLootDefaultFrame_OnHide:
When we close the loot browser, re-bind the item table to Atlas
and close all Dewdrop menus
]]
function AtlasLootDefaultFrame_OnHide()
AtlasLoot_Dewdrop:Close(1);
AtlasLoot_DewdropSubMenu:Close(1);
AtlasLoot_DewdropExpansionMenu:Close(1);
end
--[[
AtlasLoot:DewDropClick(tablename, text, tabletype):
tablename - Name of the loot table in the database
text - Heading for the loot table
Called when a button in AtlasLoot_Dewdrop is clicked
]]
function AtlasLoot:DewDropClick(tablename, text, tablenum)
ATLASLOOT_FILTER_ENABLE = false;
AtlasLootFilterCheck:SetChecked(false);
tablename = tablename .. AtlasLoot_Expac;
ATLASLOOT_CURRENTTABLE = tablename;
tablenum = tablenum or 1;
ATLASLOOT_LASTMODULE = AtlasLoot_SubMenus[tablename].Module;
AtlasLootDefaultFrame_Menu:SetText(text);
AtlasLoot:IsLootTableAvailable(AtlasLoot_SubMenus[tablename].Module);
AtlasLoot_DewdropSubMenu:Unregister(AtlasLootDefaultFrame_SubMenu);
AtlasLoot:DewdropSubMenuRegister(AtlasLoot_SubMenus[tablename]);
local lasttable = AtlasLoot.db.profile[ATLASLOOT_CURRENTTABLE];
if lasttable then
AtlasLoot:ShowItemsFrame(lasttable[1], lasttable[2], lasttable[3]);
else
AtlasLoot:ShowItemsFrame(AtlasLoot_SubMenus[tablename][tablenum][2], "AtlasLoot_Data", tablenum);
end
AtlasLoot_Dewdrop:Close(1);
end
--[[
AtlasLoot:DewDropSubMenuClick(tablename):
tablename - Name of the loot table in the database
text - Heading for the loot table
Called when a button in AtlasLoot_DewdropSubMenu is clicked
]]
function AtlasLoot:DewDropSubMenuClick(tablename)
--Show the select loot table
local tablenum = AtlasLoot_Data[tablename].Loadfirst or 1;
--Show the table that has been selected
AtlasLoot:ShowItemsFrame(tablename, "AtlasLoot_Data", tablenum);
AtlasLoot_DewdropSubMenu:Close(1);
end
--[[
AtlasLoot:DewdropExpansionMenuClick(expansion, name):
tablename - Name of the loot table in the database
text - Heading for the loot table
Called when a button in AtlasLoot_DewdropSubMenu is clicked
]]
function AtlasLoot:DewdropExpansionMenuClick(expansion, name)
AtlasLootDefaultFrame_ExpansionMenu:SetText(name);
AtlasLoot_DewdropExpansionMenu:Close(1);
AtlasLoot_Expac = expansion;
if ATLASLOOT_CURRENTTABLE then
ATLASLOOT_CURRENTTABLE = AtlasLoot:CleandataID(ATLASLOOT_CURRENTTABLE, 1) .. AtlasLoot_Expac;
AtlasLoot:IsLootTableAvailable(AtlasLoot_SubMenus[ATLASLOOT_CURRENTTABLE].Module);
local tablename = AtlasLoot_SubMenus[ATLASLOOT_CURRENTTABLE][1][2];
local lasttable = AtlasLoot.db.profile[ATLASLOOT_CURRENTTABLE];
AtlasLoot_DewdropSubMenu:Unregister(AtlasLootDefaultFrame_SubMenu);
AtlasLoot:DewdropSubMenuRegister(AtlasLoot_SubMenus[ATLASLOOT_CURRENTTABLE]);
if lasttable then
AtlasLoot:ShowItemsFrame(lasttable[1], lasttable[2], lasttable[3]);
else
local tablenum = AtlasLoot_Data[tablename].Loadfirst or 1;
AtlasLoot:ShowItemsFrame(tablename, "AtlasLoot_Data", tablenum);
end
end
end
--[[
AtlasLoot:DewdropExpansionMenuRegister():
Adds expansion menu from expansion table in mainmenus.lua
]]
function AtlasLoot:DewdropExpansionMenuRegister()
AtlasLoot_DewdropExpansionMenu:Register(AtlasLootDefaultFrame_ExpansionMenu,
'point', function(parent)
return "TOP", "BOTTOM"
end,
'children', function(level, value)
if AtlasLoot_ExpansionMenu then
for k,v in ipairs(AtlasLoot_ExpansionMenu) do
if type(v) == "table" then
--If a link to show a expansion menu
AtlasLoot_Dewdrop:AddLine(
'text', v[1],
'textR', 1,
'textG', 0.82,
'textB', 0,
'func', function(arg1,arg2,arg3) AtlasLoot:DewdropExpansionMenuClick(arg1,arg2,arg3) end,
'arg1', v[2],
'arg2', v[1],
'arg3', k,
'notCheckable', true
)
end
end
end
--Close button
AtlasLoot_Dewdrop:AddLine(
'text', AL["Close Menu"],
'textR', 0,
'textG', 1,
'textB', 1,
'func', function() AtlasLoot_Dewdrop:Close() end,
'notCheckable', true
)
end,
'dontHook', true
)
end
--[[
AtlasLoot:DewdropSubMenuRegister(loottable):
loottable - Table defining the sub menu
Generates the sub menu needed by passing a table of loot tables and titles
]]
function AtlasLoot:DewdropSubMenuRegister(loottable)
AtlasLoot_DewdropSubMenu:Register(AtlasLootDefaultFrame_SubMenu,
'point', function(parent)
return "TOP", "BOTTOM"
end,
'children', function(level, value)
for k,v in pairs(loottable) do
if type(v) == "table" then
if v[3] == "Header" then
AtlasLoot_DewdropSubMenu:AddLine(
'text', v[1],
'textR', 0.2,
'textG', 0.82,
'textB', 0.5,
'func', function(arg1) AtlasLoot:DewDropSubMenuClick(arg1) end,
'arg1', v[2],
'notCheckable', true
)
else
AtlasLoot_DewdropSubMenu:AddLine(
'text', AtlasLoot_Data[v[2]].Name,
'func', function(arg1,arg2) AtlasLoot:DewDropSubMenuClick(arg1) end,
'arg1', v[2],
'notCheckable', true
)
end
end
end
--Close button
AtlasLoot_DewdropSubMenu:AddLine(
'text', AL["Close Menu"],
'textR', 0,
'textG', 1,
'textB', 1,
'func', function() AtlasLoot_DewdropSubMenu:Close() end,
'notCheckable', true
)
end,
'dontHook', true
)
end
--[[
AtlasLoot:DewdropRegister:
Constructs the main category menu from a tiered table
]]
function AtlasLoot:DewdropRegister()
AtlasLoot_Dewdrop:Register(AtlasLootDefaultFrame_Menu,
'point', function(parent)
return "TOP", "BOTTOM"
end,
'children', function(level, value)
if AtlasLoot_Modules then
for k,v in ipairs(AtlasLoot_Modules) do
--If a link to show a submenu
AtlasLoot_Dewdrop:AddLine(
'text', v[1],
'textR', 1,
'textG', 0.82,
'textB', 0,
'func', function(arg1,arg2,arg3) AtlasLoot:DewDropClick(arg1,arg2,arg3) end,
'arg1', v[2],
'arg2', v[1],
'arg3', v[3],
'notCheckable', true
)
end
end
--Close button
AtlasLoot_Dewdrop:AddLine(
'text', AL["Close Menu"],
'textR', 0,
'textG', 1,
'textB', 1,
'func', function() AtlasLoot_Dewdrop:Close() end,
'notCheckable', true
)
end,
'dontHook', true
)
end
--[[
AtlasLoot:SetNewStyle:
Create the new Default Frame style
style = "new"
style = "old"
]]
function AtlasLoot:SetNewStyle(style)
local buttons = {
"AtlasLootDefaultFrame_Options",
"AtlasLootDefaultFrame_LoadModules",
"AtlasLootDefaultFrame_Menu",
"AtlasLootDefaultFrame_SubMenu",
"AtlasLootDefaultFrame_ExpansionMenu",
"AtlasLootDefaultFrame_Preset1",
"AtlasLootDefaultFrame_Preset2",
"AtlasLootDefaultFrame_Preset3",
"AtlasLootDefaultFrame_Preset4",
"AtlasLootDefaultFrameSearchButton",
"AtlasLootDefaultFrameSearchClearButton",
"AtlasLootDefaultFrameLastResultButton",
"AtlasLootDefaultFrameWishListButton",
"AtlasLootDefaultFrameAdvancedSearchButton",
"AtlasLootDefaultFrame_AdvancedSearchPanel_EquipButton",
"AtlasLootDefaultFrame_AdvancedSearchPanel_EquipSubButton",
"AtlasLootDefaultFrame_AdvancedSearchPanel_QualityButton",
"AtlasLootDefaultFrame_AdvancedSearchPanel_SearchButton",
"AtlasLootDefaultFrame_AdvancedSearchPanel_ClearButton",
"AtlasLootDefaultFrame_MapButton",
"AtlasLootDefaultFrame_MapSelectButton",
"AtlasLootDefaultFrame_LoadInstanceButton",
}
if style == "new" then
AtlasLootDefaultFrame_LootBackground:SetBackdrop({bgFile = "Interface/AchievementFrame/UI-Achievement-StatsBackground"});
AtlasLootDefaultFrame_LootBackground:SetBackdropColor(1,1,1,0.5);
AtlasLootDefaultFrame:SetBackdrop({bgFile = "Interface/AchievementFrame/UI-Achievement-AchievementBackground",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
edgeSize = 16,
insets = { left = 4, right = 4, top = 4, bottom = 4 }});
AtlasLootDefaultFrame:SetBackdropColor(1,1,1,0.5)
AtlasLootDefaultFrame:SetBackdropBorderColor(1,0.675,0.125,1)
AtlasLootDefaultFrameHeader:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Alert-Background.blp")
AtlasLootDefaultFrameHeader:SetTexCoord(0,0.605,0,0.703)
AtlasLootDefaultFrameHeader:SetWidth(299)
AtlasLootDefaultFrameHeader:SetHeight(60)
AtlasLootDefaultFrameHeader:SetPoint("TOP",AtlasLootDefaultFrame,"TOP",-3,22)
AtlasLootDefaultFrame_Options:SetNormalTexture("Interface/AchievementFrame/UI-Achievement-Category-Background")
AtlasLootDefaultFrame_Options:SetHeight(24)
AtlasLootDefaultFrame_Options:SetPushedTexture("Interface/AchievementFrame/UI-Achievement-Category-Background")
AtlasLootDefaultFrame_Options:SetHeight(24)
local function SetButtons(path)
_G[path]:SetNormalTexture("Interface/AchievementFrame/UI-Achievement-Category-Background")
_G[path]:SetHeight(24)
_G[path]:SetPushedTexture("Interface/AchievementFrame/UI-Achievement-Category-Background")
_G[path]:SetHeight(24)
local tex = _G[path]:GetNormalTexture();
tex:SetTexCoord(0, 0.6640625, 0, 0.8);
tex:SetHeight(32)
local tex2 = _G[path]:GetPushedTexture();
tex2:SetTexCoord(0, 0.6640625, 0, 0.8);
tex2:SetHeight(32)
end
for k,v in pairs(buttons) do
SetButtons(v)
end
elseif style == "old" then
AtlasLootDefaultFrame_LootBackground:SetBackdrop({bgFile = ""});
AtlasLootDefaultFrame_LootBackground:SetBackdropColor(0,0,0.5,0.5);
AtlasLootDefaultFrame:SetBackdrop({bgFile = "Interface/DialogFrame/UI-DialogBox-Background",
edgeFile = "Interface/DialogFrame/UI-DialogBox-Border",
edgeSize = 32,
insets = { left = 11, right = 12, top = 12, bottom = 11 }});
AtlasLootDefaultFrame:SetBackdropColor(1,1,1,1)
AtlasLootDefaultFrame:SetBackdropBorderColor(1,1,1,1)
AtlasLootDefaultFrameHeader:SetTexture("Interface/DialogFrame/UI-DialogBox-Header")
AtlasLootDefaultFrameHeader:SetTexCoord(0,1,0,1)
AtlasLootDefaultFrameHeader:SetWidth(425)
AtlasLootDefaultFrameHeader:SetHeight(64)
AtlasLootDefaultFrameHeader:SetPoint("TOP",AtlasLootDefaultFrame,"TOP",0,12)
AtlasLootDefaultFrame_Options:SetNormalTexture("Interface/Buttons/UI-Panel-Button-Up")
AtlasLootDefaultFrame_Options:SetHeight(20)
AtlasLootDefaultFrame_Options:SetPushedTexture("Interface/Buttons/UI-Panel-Button-Down")
AtlasLootDefaultFrame_Options:SetHeight(20)
local function SetButtons(path)
_G[path]:SetNormalTexture("Interface/Buttons/UI-Panel-Button-Up")
_G[path]:SetHeight(20)
_G[path]:SetPushedTexture("Interface/Buttons/UI-Panel-Button-Down")
_G[path]:SetHeight(20)
local tex = _G[path]:GetNormalTexture();
tex:SetTexCoord(0, 0.625, 0, 0.6875);
tex:SetHeight(20)
local tex2 = _G[path]:GetPushedTexture();
tex2:SetTexCoord(0, 0.625, 0, 0.6875);
tex2:SetHeight(20)
end
for k,v in pairs(buttons) do
SetButtons(v)
end
end
end
@@ -0,0 +1,726 @@
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
--Main AtlasLoot Frame
local mainframe = CreateFrame("FRAME", "AtlasLootDefaultFrame", UIParent);
mainframe:SetPoint("CENTER",0,0);
mainframe:SetSize(880,690);
mainframe:EnableMouse(true);
mainframe:SetMovable(1);
mainframe:SetFrameStrata("HIGH");
mainframe:RegisterForDrag("LeftButton");
mainframe:SetMovable(true);
mainframe:EnableKeyboard(true)
mainframe:Hide()
mainframe:SetBackdrop({
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
tile = "true",
insets = {left = "11", right = "12", top = "12", bottom = "11"},
edgeSize = 32,
titleSize = 32,
});
mainframe:SetScript("OnShow", function()
AtlasLootDefaultFrame_OnShow();
end);
mainframe:SetScript("OnHide", function() AtlasLootDefaultFrame_OnHide() end)
mainframe:SetScript("OnDragStart", function(self)
self:StartMoving();
self.isMoving = true;
end);
mainframe:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing();
self.isMoving = false;
end);
mainframe.header = mainframe:CreateTexture("AtlasLootDefaultFrameHeader","ARTWORK");
mainframe.header:SetSize(425,64);
mainframe.header:SetPoint("TOP",0,12);
mainframe.header:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header");
mainframe.header.txt = mainframe:CreateFontString(nil,"ARTWORK","GameFontNormal");
mainframe.header.txt:SetPoint("TOP",0,-1);
mainframe.header.txt:SetText(ATLASLOOT_VERSION);
mainframe.header.notice = mainframe:CreateFontString("AtlasLootDefaultFrame_Notice","ARTWORK","GameFontNormal");
mainframe.header.notice:SetPoint("BOTTOM",0,17);
--Loot Background
local lootbground = CreateFrame("Frame", "AtlasLootDefaultFrame_LootBackground",AtlasLootDefaultFrame);
lootbground:SetSize(540,515);
lootbground:SetPoint("BOTTOMLEFT", AtlasLootDefaultFrame, "BOTTOMLEFT",40,90);
lootbground.Back = lootbground:CreateTexture("AtlasLootDefaultFrame_LootBackground_Back", "BACKGROUND");
lootbground.Back:SetAllPoints();
lootbground.Back:SetPoint("TOPLEFT","AtlasLootDefaultFrame_LootBackground","TOPLEFT");
lootbground.Back:SetPoint("BOTTOMRIGHT","AtlasLootDefaultFrame_LootBackground","BOTTOMRIGHT");
lootbground:SetBackdropColor(0,0,0.5,0.5);
lootbground:EnableMouse();
lootbground:SetScript("OnMouseDown",function(self, button)
if _G[AtlasLootItemsFrame.refresh[2]][AtlasLootItemsFrame.refresh[1]].Back and button == "RightButton" then
AtlasLoot:BackButton_OnClick();
elseif AtlasLootDefaultFrame_AdvancedSearchPanel:IsVisible() and button == "RightButton" then
AtlasLoot_AdvancedSearchClose();
end
AtlasLoot_Dewdrop:Close();
AtlasLoot_DewdropSubMenu:Close();
AtlasLoot_DewdropExpansionMenu:Close();
AtlasLoot_WishListDrop:Close();
AtlasLoot_WishListOptions:Close();
end);
----------------------------------- Item Loot Panel -------------------------------------------
local itemframe = CreateFrame("Frame", "AtlasLootItemsFrame", AtlasLootDefaultFrame_LootBackground);
itemframe:SetSize(535,510);
itemframe:Hide();
itemframe:SetPoint("TOPLEFT", AtlasLootDefaultFrame_LootBackground, "TOPLEFT", 2, -2);
itemframe.Label = itemframe:CreateFontString("AtlasLoot_BossName","OVERLAY","GameFontHighlightLarge");
itemframe.Label:SetPoint("TOP", "AtlasLootItemsFrame", "TOP");
itemframe.Label:SetSize(512,30);
itemframe.Label:SetJustifyH("CENTER");
itemframe.Back = itemframe:CreateTexture("AtlasLootItemsFrame_Back", "BACKGROUND");
itemframe.Back:SetAllPoints();
itemframe.Back:SetPoint("TOPLEFT","AtlasLootDefaultFrame_LootBackground","TOPLEFT");
itemframe.Back:SetPoint("BOTTOMRIGHT","AtlasLootDefaultFrame_LootBackground","BOTTOMRIGHT");
itemframe:SetBackdropColor(0,0,0,0.7);
itemframe:EnableMouseWheel(true);
itemframe:SetScript("OnMouseWheel", function(self,delta)
if AtlasLootItemsFrame_NEXT:IsVisible() and delta == -1 then
AtlasLootItemsFrame_NEXT:Click();
end
if AtlasLootItemsFrame_PREV:IsVisible() and delta == 1 then
AtlasLootItemsFrame_PREV:Click();
end
end);
local function createLootItemButtons(num)
local button = CreateFrame("Button","AtlasLootItem_"..num, AtlasLootItemsFrame);
button:SetID(num);
button:SetSize(236,28);
button:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight", "ADD");
button.icon = button:CreateTexture("AtlasLootItem_"..num.."_Icon","ARTWORK");
button.icon:SetSize(25,25);
button.icon:SetPoint("TOPLEFT", "AtlasLootItem_"..num,"TOPLEFT",1,-1);
button.name = button:CreateFontString("AtlasLootItem_"..num.."_Name","ARTWORK","GameFontNormal");
button.name:SetSize(205,12);
button.name:SetPoint("TOPLEFT","AtlasLootItem_"..num.."_Icon","TOPRIGHT",3,0);
button.name:SetJustifyH("LEFT");
button.extra = button:CreateFontString("AtlasLootItem_"..num.."_Extra","ARTWORK","GameFontNormal");
button.extra:SetSize(205,10);
button.extra:SetPoint("TOPLEFT","AtlasLootItem_"..num.."_Name","BOTTOMLEFT",0,-1);
button.extra:SetJustifyH("LEFT");
button:RegisterForClicks("AnyDown");
button.number = num;
button:SetScript("OnEnter", function(self) AtlasLootItem_OnEnter(self) end);
button:SetScript("OnLeave", function(self) AtlasLootItem_OnLeave(self) end);
button:SetScript("OnClick", function(self, arg1) AtlasLootItem_OnClick(self, arg1) end);
button.unsafe = button:CreateTexture("AtlasLootItem_"..num.."_Unsafe","BACKGROUND");
button.unsafe:Hide();
button.unsafe:SetSize(27,27);
button.unsafe:SetPoint("TOPLEFT","AtlasLootItem_"..num,"TOPLEFT");
button.unsafe:SetVertexColor(1,0,0,1);
if num == 1 then
button:SetPoint("TOPLEFT", "AtlasLootItemsFrame", "TOPLEFT",25,-35);
elseif num == 16 then
button:SetPoint("TOPLEFT", "AtlasLootItem_1", "TOPRIGHT",0,0);
else
button:SetPoint("TOPLEFT", "AtlasLootItem_"..(num - 1), "BOTTOMLEFT");
end
end
for i = 1, 30 do
createLootItemButtons(i);
end
-- LootInfo
local lootinfo = CreateFrame("Frame", "AtlasLootInfo")
lootinfo:SetSize(128,75);
lootinfo.text1 = lootinfo:CreateFontString("AtlasLootInfo_Text1", "OVERLAY", "GameFontNormal");
lootinfo.text1:SetSize(180,10);
lootinfo.text1:SetText("ATLASLOOT_VERSION");
lootinfo.text1:SetJustifyH("LEFT");
lootinfo.text1:SetPoint("TOPLEFT", "AtlasLootInfo", "TOPLEFT",0,25);
lootinfo.text2 = lootinfo:CreateFontString("AtlasLootInfo_Text2", "OVERLAY", "GameFontNormal");
lootinfo.text2:SetSize(180,10);
lootinfo.text2:SetJustifyH("LEFT");
lootinfo.text2:SetText(AL["Click boss name to view loot."]);
lootinfo.text2:SetPoint("TOPLEFT", "AtlasLootInfo", "TOPLEFT",0,-2);
-- Next Button
local nextbtn = CreateFrame("Button", "AtlasLootItemsFrame_NEXT", AtlasLootItemsFrame);
nextbtn:SetPoint("BOTTOMRIGHT", "AtlasLootItemsFrame", "BOTTOMRIGHT",-5,5);
nextbtn:SetSize(32,32);
nextbtn.texture = nextbtn:CreateTexture(nil, "BACKGROUND");
nextbtn.texture:SetTexture("Interface\\Buttons\\UI-PageButton-Background");
nextbtn.texture:SetSize(32,32);
nextbtn.texture:SetPoint("CENTER",0,0);
nextbtn:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up");
nextbtn:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down");
nextbtn:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled");
nextbtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD");
nextbtn:SetScript("OnClick", function(self) AtlasLoot:NavButton_OnClick(self) end)
nextbtn:Hide();
-- Previous button
local prevbtn = CreateFrame("Button", "AtlasLootItemsFrame_PREV", AtlasLootItemsFrame);
prevbtn:SetPoint("BOTTOMLEFT", "AtlasLootItemsFrame", "BOTTOMLEFT",5,5);
prevbtn:SetSize(32,32);
prevbtn.texture = prevbtn:CreateTexture(nil, "BACKGROUND");
prevbtn.texture:SetTexture("Interface\\Buttons\\UI-PageButton-Background");
prevbtn.texture:SetSize(32,32);
prevbtn.texture:SetPoint("CENTER",0,0);
prevbtn:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up");
prevbtn:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Down");
prevbtn:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Disabled");
prevbtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD");
prevbtn:SetScript("OnClick", function(self) AtlasLoot:NavButton_OnClick(self) end)
prevbtn:Hide();
-- Back button
local backbtn = CreateFrame("Button", "AtlasLootItemsFrame_BACK", AtlasLootItemsFrame, "OptionsButtonTemplate");
backbtn:SetPoint("BOTTOM", "AtlasLootItemsFrame", "BOTTOM",0,4);
backbtn:SetText(AL["Back"]);
backbtn:SetScript("OnClick", function(self) AtlasLoot:BackButton_OnClick() end)
backbtn:Hide();
-- Wishlist Own/Swap button
local swapbtn = CreateFrame("Button", "AtlasLootItemsFrame_Wishlist_Swap", AtlasLootItemsFrame, "OptionsButtonTemplate");
swapbtn:SetPoint("BOTTOM", "AtlasLootItemsFrame", "BOTTOM",50,4);
swapbtn:SetScript("OnClick", function(self) AtlasLoot:WishListSwapButton("","","","","",self,true) end)
swapbtn:Hide();
-- Wishlist Options button
local optionsbtn = CreateFrame("Button", "AtlasLootItemsFrame_Wishlist_Options", AtlasLootItemsFrame, "OptionsButtonTemplate");
optionsbtn:SetPoint("BOTTOM", "AtlasLootItemsFrame_Wishlist_Swap", "BOTTOM",-100,0);
optionsbtn:SetText(AL["Options"]);
optionsbtn:SetScript("OnClick", function(self)
if AtlasLoot_WishListOptions:IsOpen() then
AtlasLoot_WishListOptions:Close();
else
AtlasLoot_WishListOptions:Open(self);
end
end);
optionsbtn:Hide();
-- Wishlist Item Lock button
ATLASLOOT_ITEM_UNLOCK = false;
local lockbtn = CreateFrame("Button", "AtlasLootItemsFrame_Wishlist_UnLock", AtlasLootItemsFrame, "OptionsButtonTemplate");
lockbtn:SetPoint("BOTTOM", "AtlasLootItemsFrame_Wishlist_Options", "BOTTOM",-100,0);
lockbtn:SetScript("OnClick", function(self)
if ATLASLOOT_ITEM_UNLOCK then
ATLASLOOT_ITEM_UNLOCK = false;
lockbtn:SetText("Locked");
else
ATLASLOOT_ITEM_UNLOCK = true;
lockbtn:SetText("UnLocked");
end
end)
lockbtn:SetScript("OnEnter", function(self)
GameTooltip:ClearLines();
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", -(self:GetWidth() / 2), 5);
GameTooltip:AddLine("Toggle Item Moving");
GameTooltip:AddLine("Left Click to move item up");
GameTooltip:AddLine("Right Click to move item down");
GameTooltip:AddLine("Alt + Left Click to add a Custom Header");
GameTooltip:Show();
end);
lockbtn:SetScript("OnLeave", function()
if(GameTooltip:IsVisible()) then
GameTooltip:Hide();
end
end);
lockbtn:SetText("Locked");
lockbtn:Hide();
-- Wishlist Share button
local sharebtn = CreateFrame("Button", "AtlasLootItemsFrame_Wishlist_Share", AtlasLootItemsFrame, "OptionsButtonTemplate");
sharebtn:SetPoint("BOTTOM", "AtlasLootItemsFrame_Wishlist_Swap", "BOTTOM",100,0);
sharebtn:SetText(AL["Share"]);
sharebtn:SetScript("OnClick", function() AtlasLoot:ShareWishList() end)
sharebtn:Hide();
-- Filter Button
local filterbtn = CreateFrame("CheckButton","AtlasLootFilterCheck",AtlasLootItemsFrame,"OptionsCheckButtonTemplate");
filterbtn:SetPoint("BOTTOM", "AtlasLootItemsFrame", "BOTTOM",85 ,27);
filterbtn.Label = filterbtn:CreateFontString("AtlasLootFilterCheckText","OVERLAY","GameFontNormal");
filterbtn.Label:SetText(AL["Filter"]);
filterbtn.Label:SetPoint("RIGHT", AtlasLootFilterCheck, 30, 2);
filterbtn:SetScript("OnClick", function() AtlasLoot_FilterEnableButton() end);
-- Quick Looks Button
local looksbtn = CreateFrame("Button", "AtlasLootQuickLooksButton", AtlasLootItemsFrame);
looksbtn:SetPoint("BOTTOM", "AtlasLootItemsFrame", "BOTTOM",58,28);
looksbtn:SetSize(25,25);
looksbtn.Label = looksbtn:CreateFontString("AtlasLoot_QuickLooks","OVERLAY","GameFontNormal");
looksbtn.Label:SetSize(200,25);
looksbtn.Label:SetText(AL["Add to QuickLooks:"]);
looksbtn.Label:SetPoint("LEFT", "AtlasLootQuickLooksButton", -125, 0);
looksbtn.Label:SetJustifyH("LEFT");
looksbtn:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up");
looksbtn:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down");
looksbtn:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled");
looksbtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD");
looksbtn:SetScript("OnClick", function(self) AtlasLoot:ShowQuickLooks(self) end)
looksbtn:SetScript("OnShow", function(self)
if (AtlasLootItemsFrame.refresh) and ((AtlasLootItemsFrame.refresh[1] == "SearchResult") or (AtlasLootItemsFrame.refresh[1] == "WishList")) then
self:Disable();
else
self:Enable();
end
end)
looksbtn:Hide();
------------------------------------ Buttons at the top of the frame ---------------------------------------
--Close Button
local closebtn = CreateFrame("Button", "AtlasLootDefaultFrame_CloseButton", AtlasLootDefaultFrame, "UIPanelCloseButton");
closebtn:SetPoint("TOPRIGHT", AtlasLootDefaultFrame, "TOPRIGHT",-10,-10);
closebtn:SetScript("OnClick", function() AtlasLootDefaultFrame:Hide() end);
--Load All Addon Moduels Button
local loadModulebtn = CreateFrame("Button", "AtlasLootDefaultFrame_LoadModules", AtlasLootDefaultFrame, "OptionsButtonTemplate");
loadModulebtn:SetSize(105,20);
loadModulebtn:SetPoint("TOPRIGHT", AtlasLootDefaultFrame, "TOPRIGHT",-38,-15);
loadModulebtn:SetText(AL["Load Modules"]);
loadModulebtn:SetScript("OnClick", function() AtlasLoot:LoadAllModules() end);
--Options Button
local optionsbtn = CreateFrame("Button", "AtlasLootDefaultFrame_Options", AtlasLootDefaultFrame, "OptionsButtonTemplate");
optionsbtn:SetSize(105,20);
optionsbtn:SetPoint("TOPLEFT", AtlasLootDefaultFrame, "TOPLEFT",40,-15);
optionsbtn:SetText(AL["Options"]);
optionsbtn:SetScript("OnClick", function() AtlasLootOptions_Toggle() end);
--Moduel Menu Button
local menubtn = CreateFrame("Button", "AtlasLootDefaultFrame_Menu", AtlasLootDefaultFrame, "OptionsButtonTemplate");
menubtn:SetSize(174,25);
menubtn:SetPoint("TOPLEFT", AtlasLootDefaultFrame, "TOPLEFT",38,-55);
menubtn.Lable = menubtn:CreateFontString("AtlasLootDefaultFrame_SelectedCategory", "OVERLAY","GameFontNormal")
menubtn.Lable:SetPoint("TOP",menubtn,"BOTTOM",0,37);
menubtn.Lable:SetText("Select Module");
menubtn.Lable:Show();
menubtn:SetText(AL["Select Loot Table"]);
menubtn:SetScript("OnClick", function(self)
if AtlasLoot_Dewdrop:IsOpen() then
AtlasLoot_Dewdrop:Close();
else
AtlasLoot_Dewdrop:Open(self);
end
end);
--SubMenu Button
local submenubtn = CreateFrame("Button", "AtlasLootDefaultFrame_SubMenu", AtlasLootDefaultFrame, "OptionsButtonTemplate");
submenubtn:SetSize(200,25);
submenubtn:SetPoint("LEFT", "AtlasLootDefaultFrame_Menu", "RIGHT",0,0);
submenubtn.Lable = submenubtn:CreateFontString("AtlasLootDefaultFrame_SelectedTable", "OVERLAY","GameFontNormal")
submenubtn.Lable:SetPoint("TOP","AtlasLootDefaultFrame_SubMenu","BOTTOM",0,37);
submenubtn.Lable:SetText("Select Subcategory");
submenubtn.Lable:Show();
submenubtn.Text = submenubtn:CreateFontString("AtlasLootDefaultFrame_SubMenuText", "OVERLAY","GameFontNormal")
submenubtn.Text:SetPoint("LEFT","AtlasLootDefaultFrame_SubMenu","RIGHT",0,0);
submenubtn.Text:SetJustifyH("CENTER");
submenubtn.Text:SetSize(190,25);
submenubtn.Text:Show();
submenubtn:SetScript("OnClick", function(self)
if AtlasLoot_DewdropSubMenu:IsOpen() then
AtlasLoot_DewdropSubMenu:Close();
else
AtlasLoot_DewdropSubMenu:Open(self);
end
end);
--Expansion Menu Button
local expansionmenubtn = CreateFrame("Button", "AtlasLootDefaultFrame_ExpansionMenu", AtlasLootDefaultFrame, "OptionsButtonTemplate");
expansionmenubtn:SetSize(174,25);
expansionmenubtn:SetPoint("LEFT", "AtlasLootDefaultFrame_SubMenu", "RIGHT",0,0);
expansionmenubtn:SetText(AtlasLoot_ExpansionMenu[GetAccountExpansionLevel()+1][1]);
expansionmenubtn.Lable = expansionmenubtn:CreateFontString("AtlasLootDefaultFrame_SelectedTable2", "OVERLAY","GameFontNormal")
expansionmenubtn.Lable:SetPoint("TOP",expansionmenubtn,"BOTTOM",0,37);
expansionmenubtn.Lable:SetText("Select Expansion");
expansionmenubtn.Lable:Show();
expansionmenubtn:SetScript("OnClick", function(self)
if AtlasLoot_DewdropExpansionMenu:IsOpen() then
AtlasLoot_DewdropExpansionMenu:Close();
else
AtlasLoot_DewdropExpansionMenu:Open(self);
end
end);
---------------------------------------- Buttons Under the loot and subtable frames -------------------------------------------
--Wish List Button
local wishbtn = CreateFrame("Button", "AtlasLootDefaultFrameWishListButton", AtlasLootDefaultFrame, "OptionsButtonTemplate");
wishbtn:SetPoint("BOTTOMLEFT", "AtlasLootDefaultFrame", "BOTTOMLEFT", 40, 63);
wishbtn:SetSize(105,20);
wishbtn:RegisterForClicks("LeftButtonDown","RightButtonDown");
wishbtn:SetScript("OnClick", function(self, btnclick)AtlasLoot:WishListButton("","","","","",self,true,btnclick) end);
wishbtn:SetText(AL["Wishlist"]);
wishbtn:SetScript("OnEnter", function(self)
GameTooltip:ClearLines();
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", -(self:GetWidth() / 2), 5);
GameTooltip:AddLine("Right Click For Menu");
GameTooltip:Show();
end);
wishbtn:SetScript("OnLeave", function()
if(GameTooltip:IsVisible()) then
GameTooltip:Hide();
end
end);
--Quick Look Buttons
local function presetcreate(preset,num)
preset:SetSize(105,20);
preset:SetScript("OnEnter", function(self)
if self:IsEnabled() then
GameTooltip:ClearLines();
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", -(self:GetWidth() / 2), 5);
GameTooltip:AddLine(AtlasLootCharDB["QuickLooks"][num][6]);
GameTooltip:Show();
end
end);
preset:SetScript("OnLeave", function()
if(GameTooltip:IsVisible()) then
GameTooltip:Hide();
end
end);
preset:SetScript("OnClick", function()
if AtlasLoot:IsLootTableAvailable(AtlasLootCharDB["QuickLooks"][num][4]) then
ATLASLOOT_LASTMODULE = AtlasLootCharDB["QuickLooks"][num][4];
ATLASLOOT_CURRENTTABLE = AtlasLootCharDB["QuickLooks"][num][5];
if AtlasLootCharDB["QuickLooks"][num][2] == "AtlasLootWishList" then
AtlasLoot:ShowWishList(AtlasLootCharDB["QuickLooks"][num][1], AtlasLootCharDB["QuickLooks"][num][3]);
else
AtlasLoot:ShowItemsFrame(AtlasLootCharDB["QuickLooks"][num][1], AtlasLootCharDB["QuickLooks"][num][2], AtlasLootCharDB["QuickLooks"][num][3]);
end
end
end);
preset:SetScript("OnShow", function(self)
self:SetText(AL["QuickLook"].." "..num);
if ((not AtlasLootCharDB["QuickLooks"][num]) or (not AtlasLootCharDB["QuickLooks"][num][1])) or (AtlasLootCharDB["QuickLooks"][num][1]==nil) then
self:Disable();
end
end);
end
--QuickLook Button 1
local presetsize = 3.75;
local preset1 = CreateFrame("Button", "AtlasLootDefaultFrame_Preset1", AtlasLootDefaultFrame, "OptionsButtonTemplate");
presetcreate(preset1,1);
preset1:SetPoint("LEFT", AtlasLootDefaultFrameWishListButton, "RIGHT", presetsize, 0);
--QuickLook Button 2
local preset2 = CreateFrame("Button", "AtlasLootDefaultFrame_Preset2", AtlasLootDefaultFrame, "OptionsButtonTemplate");
presetcreate(preset2,2);
preset2:SetPoint("LEFT", "AtlasLootDefaultFrame_Preset1", "RIGHT", presetsize, 0);
--QuickLook Button 3
local preset3 = CreateFrame("Button", "AtlasLootDefaultFrame_Preset3", AtlasLootDefaultFrame, "OptionsButtonTemplate");
presetcreate(preset3,3);
preset3:SetPoint("LEFT", "AtlasLootDefaultFrame_Preset2", "RIGHT", presetsize, 0);
--QuickLook Button 4
local preset4 = CreateFrame("Button", "AtlasLootDefaultFrame_Preset4", AtlasLootDefaultFrame, "OptionsButtonTemplate");
presetcreate(preset4,4);
preset4:SetPoint("LEFT", "AtlasLootDefaultFrame_Preset3", "RIGHT", presetsize, 0);
--Search Edit Box
local searchbox = CreateFrame("EditBox","AtlasLootDefaultFrameSearchBox",AtlasLootDefaultFrame,"InputBoxTemplate");
searchbox:SetSize(190,32);
searchbox:SetMaxLetters(100);
searchbox:SetAutoFocus(false);
searchbox:SetPoint("TOPLEFT",AtlasLootDefaultFrameWishListButton,"BOTTOMLEFT",7,-3)
searchbox:SetTextInsets(0, 8, 0, 0);
searchbox:SetScript("OnEnterPressed", function(self)
AtlasLoot:Search(self:GetText());
self:ClearFocus();
end)
local fstring = searchbox:CreateFontString("AtlasLootDefaultFrameSearchString", "ARTWORK", "GameFontNormal");
--Search Button
local searchbtn = CreateFrame("Button","AtlasLootDefaultFrameSearchButton",AtlasLootDefaultFrame,"UIPanelButtonTemplate2");
searchbtn:SetSize(69,32);
searchbtn:SetPoint("LEFT","AtlasLootDefaultFrameSearchBox","RIGHT",2,0);
searchbtn:SetText(AL["Search"]);
searchbtn:SetScript("OnClick", function()
AtlasLoot:Search(AtlasLootDefaultFrameSearchBox:GetText());
AtlasLootDefaultFrameSearchBox:ClearFocus();
end);
--Search Options Button
local searchopt = CreateFrame("Button", "AtlasLootDefaultFrameSearchOptionsButton", AtlasLootDefaultFrameSearchButton);
searchopt:SetSize(28,28);
searchopt:SetPoint("LEFT","AtlasLootDefaultFrameSearchButton","RIGHT",-5,0);
searchopt:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up");
searchopt:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down");
searchopt:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled");
searchopt:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD");
searchopt:SetScript("OnClick", function(self) AtlasLoot:ShowSearchOptions(self) end)
--Clear Search Button
local searchclear = CreateFrame("Button","AtlasLootDefaultFrameSearchClearButton",AtlasLootDefaultFrameSearchBox,"UIPanelButtonTemplate2");
searchclear:SetSize(58,32);
searchclear:SetPoint("LEFT",AtlasLootDefaultFrameSearchOptionsButton,"RIGHT",-2,0);
searchclear:SetText(AL["Clear"]);
searchclear:SetScript("OnClick", function()
AtlasLootDefaultFrameSearchBox:SetText("");
AtlasLootDefaultFrameSearchBox:ClearFocus();
end);
--Last Result Button
local lastresult = CreateFrame("Button","AtlasLootDefaultFrameLastResultButton",AtlasLootDefaultFrameSearchBox,"UIPanelButtonTemplate2");
lastresult:SetSize(100,32);
lastresult:SetPoint("LEFT",AtlasLootDefaultFrameSearchClearButton,"RIGHT",1,0);
lastresult:SetText(AL["Last Result"]);
lastresult:SetScript("OnClick", function() AtlasLoot:ShowSearchResult() end);
-- Advanced Search Button
local advSearch = CreateFrame("Button","AtlasLootDefaultFrameAdvancedSearchButton", AtlasLootDefaultFrame,"UIPanelButtonTemplate2");
advSearch:SetSize(95,32);
advSearch:SetPoint("LEFT",AtlasLootDefaultFrameLastResultButton,"RIGHT",2);
advSearch:SetText("Advanced");
advSearch:SetScript("OnClick", function()
AtlasLoot_AdvancedSearchShow();
AtlasLootDefaultFrameSearchBox:ClearFocus();
end)
--------------------- Diffcuility ScrollFrame ----------------------------------
local ROW_HEIGHT = 16; -- How tall is each row?
local MAX_ROWS = 5; -- How many rows can be shown at once?
local scrollFrame = CreateFrame("Frame", "Atlasloot_Difficulty_ScrollFrame", AtlasLootDefaultFrame);
scrollFrame:EnableMouse(true);
scrollFrame:SetSize(265, ROW_HEIGHT * MAX_ROWS + 16);
scrollFrame:SetPoint("LEFT","AtlasLootDefaultFrame_ExpansionMenu","RIGHT",0,-39);
scrollFrame:SetBackdrop({
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", tile = true, tileSize = 16,
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", edgeSize = 16,
insets = { left = 4, right = 4, top = 4, bottom = 4 },
});
scrollFrame.Lable = scrollFrame:CreateFontString("Atlasloot_HeaderLabel", "OVERLAY","GameFontNormal")
scrollFrame.Lable:SetPoint("TOPLEFT",Atlasloot_Difficulty_ScrollFrame,10,-10);
scrollFrame.Lable:SetJustifyH("LEFT");
scrollFrame.Lable:SetFont("GameFontNormal", 24);
function AtlasLoot:ScrollFrameUpdate(hide,wishlist)
local maxValue,offset,row,value;
scrollFrame.wishList = nil;
if wishlist then
scrollFrame.wishList = wishlist;
maxValue = #AtlasLootWishList[wishlist];
FauxScrollFrame_Update(scrollFrame.scrollBar, maxValue, MAX_ROWS, ROW_HEIGHT);
offset = FauxScrollFrame_GetOffset(scrollFrame.scrollBar);
for i = 1, MAX_ROWS do
value = i + offset
scrollFrame.rows[i]:SetChecked(false);
scrollFrame.rows[i]:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight", "ADD");
if value <= maxValue and AtlasLootWishList[wishlist][value] then
row = scrollFrame.rows[i]
row:SetText("|cffFFd200"..AtlasLootWishList[wishlist][value].Name);
row.itemIndex = value;
if row.itemIndex == ATLASLOOT_CURRENT_WISHLIST_NUM then
row:SetChecked(true);
end
row:Show()
else
scrollFrame.rows[i]:Hide()
end
end
elseif AtlasLoot_Difficulty then
maxValue = #AtlasLoot_Difficulty[ATLASLOOT_CURRENTTYPE];
FauxScrollFrame_Update(scrollFrame.scrollBar, maxValue, MAX_ROWS, ROW_HEIGHT);
offset = FauxScrollFrame_GetOffset(scrollFrame.scrollBar);
for i = 1, MAX_ROWS do
value = i + offset
scrollFrame.rows[i]:SetChecked(false);
scrollFrame.rows[i]:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight", "ADD");
if value <= maxValue and AtlasLoot_Difficulty[ATLASLOOT_CURRENTTYPE][value] and hide == nil then
row = scrollFrame.rows[i]
row:SetText("|cffFFd200"..AtlasLoot_Difficulty[ATLASLOOT_CURRENTTYPE][value][1]);
row.itemIndex = AtlasLoot_Difficulty[ATLASLOOT_CURRENTTYPE][value][2];
if row.itemIndex == ItemindexID then
row:SetChecked(true);
end
row:Show()
else
scrollFrame.rows[i]:Hide()
end
end
end
end
local scrollSlider = CreateFrame("ScrollFrame","AtlasLootDefaultFrameScroll", Atlasloot_Difficulty_ScrollFrame, "FauxScrollFrameTemplate");
scrollSlider:SetPoint("TOPLEFT", 0, -8);
scrollSlider:SetPoint("BOTTOMRIGHT", -30, 8);
scrollSlider:SetScript("OnVerticalScroll", function(self, offset)
self.offset = math.floor(offset / ROW_HEIGHT + 0.5);
if scrollFrame.wishList then
AtlasLoot:ScrollFrameUpdate(nil,scrollFrame.wishList);
else
AtlasLoot:ScrollFrameUpdate();
end
end)
scrollSlider:SetScript("OnShow", function()
if scrollFrame.wishList then
AtlasLoot:ScrollFrameUpdate(nil,scrollFrame.wishList);
else
AtlasLoot:ScrollFrameUpdate();
end
end)
scrollFrame.scrollBar = scrollSlider
local rows = setmetatable({}, { __index = function(t, i)
local row = CreateFrame("CheckButton", "$parentRow"..i, scrollFrame)
row:SetSize(230, ROW_HEIGHT);
row:SetFrameStrata("Dialog");
row:SetNormalFontObject(GameFontHighlightLeft);
row:SetCheckedTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight", "ADD");
row:SetScript("OnClick", function()
if scrollFrame.wishList then
AtlasLoot:ShowWishList(scrollFrame.wishList,row.itemIndex);
AtlasLoot_CurrentWishList["Show"].ListNum = row.itemIndex;
AtlasLoot:ScrollFrameUpdate(nil,scrollFrame.wishList);
else
ItemindexID = row.itemIndex;
if not AtlasLootDefaultFrame_AdvancedSearchPanel:IsVisible() then
AtlasLoot:ShowItemsFrame(AtlasLootItemsFrame.refresh[1], AtlasLootItemsFrame.refresh[2], AtlasLootItemsFrame.refresh[3]);
end
AtlasLoot:ScrollFrameUpdate();
end
end)
if i == 1 then
row:SetPoint("TOPLEFT", scrollFrame, 8, -8)
else
row:SetPoint("TOPLEFT", scrollFrame.rows[i-1], "BOTTOMLEFT")
end
rawset(t, i, row)
return row
end })
scrollFrame.rows = rows
local MAX_ROWS2 = 26; -- How many rows can be shown at once?
--------------------Subtable Frame--------------------
local subtableFrame = CreateFrame("Frame", "Atlasloot_SubTableFrame", AtlasLootDefaultFrame);
subtableFrame:EnableMouse(true);
subtableFrame:SetSize(265, ROW_HEIGHT * MAX_ROWS2 + 23);
subtableFrame:SetPoint("BOTTOMLEFT","Atlasloot_Difficulty_ScrollFrame",0,-446);
subtableFrame:SetBackdrop({
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", tile = true, tileSize = 16,
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", edgeSize = 16,
insets = { left = 4, right = 4, top = 4, bottom = 4 },
});
function AtlasLoot:SubTableScrollFrameUpdate(tablename, dataSource, tablenum)
local maxValue = #_G[dataSource][tablename];
subtableFrame.tablename = tablename;
subtableFrame.dataSource = dataSource;
subtableFrame.tablenum = tablenum;
FauxScrollFrame_Update(subtableFrame.scrollBar, maxValue, MAX_ROWS2, ROW_HEIGHT);
local offset = FauxScrollFrame_GetOffset(subtableFrame.scrollBar);
for i = 1, MAX_ROWS2 do
local value = i + offset
subtableFrame.rows[i]:SetChecked(false);
subtableFrame.rows[i]:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight", "ADD");
if value <= maxValue and _G[dataSource][tablename][value] and tablename ~= "SearchMENU" then
local row = subtableFrame.rows[i]
row.dataSource = dataSource;
row.tablename = tablename;
row.tablenum = value;
if dataSource == "AtlasLoot_MapData" then
row.Text:SetText(_G[dataSource][tablename][value][1]);
row:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_TOP");
GameTooltip:SetText(_G[dataSource][tablename][value][1]);
GameTooltip:Show();
end)
row:SetScript("OnLeave", function() GameTooltip:Hide() end)
else
row.Text:SetText("|cffFFd200".._G[dataSource][tablename][value].Name);
row:SetScript("OnEnter", function(self)
GameTooltip:Hide();
end)
if tablenum == value and dataSource ~= "AtlasLoot_MapData" then
row:SetChecked(true);
end
end
row:Show();
else
subtableFrame.rows[i]:Hide();
end
end
end
local scrollSlider2 = CreateFrame("ScrollFrame","AtlasLootDefaultFrameSubTableScroll",Atlasloot_SubTableFrame,"FauxScrollFrameTemplate");
scrollSlider2:SetPoint("TOPLEFT", 0, -8)
scrollSlider2:SetPoint("BOTTOMRIGHT", -30, 8)
scrollSlider2:SetScript("OnVerticalScroll", function(self, offset)
self.offset = math.floor(offset / ROW_HEIGHT + 0.5)
AtlasLoot:SubTableScrollFrameUpdate(subtableFrame.tablename, subtableFrame.dataSource, subtableFrame.tablenum);
end)
subtableFrame.scrollBar = scrollSlider2
local rows2 = setmetatable({}, { __index = function(t, i)
local row = CreateFrame("CheckButton", "$parentRow"..i, subtableFrame)
row:SetSize(230, ROW_HEIGHT);
row:SetFrameStrata("Dialog");
row:SetNormalFontObject(GameFontHighlightLeft);
row:SetCheckedTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight", "ADD");
row.Text = row:CreateFontString("$parentRow"..i.."Text","OVERLAY","GameFontNormal");
row.Text:SetSize(230, ROW_HEIGHT);
row.Text:SetPoint("LEFT",row);
row.Text:SetJustifyH("LEFT");
row:SetScript("OnClick", function()
if row.dataSource ~= "AtlasLoot_MapData" then
AtlasLoot:ShowItemsFrame(row.tablename, row.dataSource, row.tablenum);
else
row:SetChecked(false);
end
end)
if i == 1 then
row:SetPoint("TOPLEFT", subtableFrame, 8, -8)
else
row:SetPoint("TOPLEFT", subtableFrame.rows[i-1], "BOTTOMLEFT")
end
rawset(t, i, row)
return row
end })
subtableFrame.rows = rows2
--------------------------------- Atlas Map and map buttons -----------------------------------------------
--Atlas Map
local map = CreateFrame("Frame", "AtlasLootDefaultFrame_Map", AtlasLootDefaultFrame);
map:SetSize(540,515);
map:SetPoint("BOTTOMLEFT", AtlasLootDefaultFrame, "BOTTOMLEFT",40,90);
map:SetFrameStrata("HIGH");
map:Hide();
map:EnableMouse();
map:SetScript("OnMouseDown", function(self, button)
if button == "RightButton" then
AtlasLoot:MapOnShow();
end
end);
-- Map Button
local mapbtn = CreateFrame("Button","AtlasLootDefaultFrame_MapButton", AtlasLootDefaultFrame,"OptionsButtonTemplate");
mapbtn:SetSize(90,24);
mapbtn:SetPoint("BOTTOMLEFT",Atlasloot_SubTableFrame,0,-27.5);
mapbtn:SetText("Map");
mapbtn:SetScript("OnClick", function() AtlasLoot:MapOnShow(); end)
-- Map Select Button
local mapSelbtn = CreateFrame("Button","AtlasLootDefaultFrame_MapSelectButton", AtlasLootDefaultFrame,"OptionsButtonTemplate");
mapSelbtn:SetSize(180,24);
mapSelbtn:SetPoint("BOTTOMRIGHT",Atlasloot_SubTableFrame,5,-27.5);
mapSelbtn:SetScript("OnClick", function(self)
if AtlasLoot_MapMenu:IsOpen() then
AtlasLoot_MapMenu:Close();
else
AtlasLoot_MapMenu:Open(self);
end
end);
mapSelbtn:SetText("No Map");
-- Load Current Instance Button
local currentInstance = CreateFrame("Button","AtlasLootDefaultFrame_LoadInstanceButton", AtlasLootDefaultFrame,"OptionsButtonTemplate");
currentInstance:SetSize(283,24);
currentInstance:SetPoint("BOTTOMRIGHT",Atlasloot_SubTableFrame,10,-58);
currentInstance:SetScript("OnClick", function() AtlasLoot:ShowInstance(); end)
currentInstance:SetText("Load Current Instance");
+6
View File
@@ -0,0 +1,6 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AtlaslootDefaultFrameCreate.lua"/>
<Script file="AtlaslootDefaultFrame.lua"/>
<Script file="AtlasLootAdvancedSearchCreate.lua"/>
</Ui>
+336
View File
@@ -0,0 +1,336 @@
The GNU General Public License (GPL)
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your freedom to
share and change it. By contrast, the GNU General Public License is
intended to guarantee your freedom to share and change free software--to
make sure the software is free for all its users. This General Public
License applies to most of the Free Software Foundation's software and
to any other program whose authors commit to using it. (Some other Free
Software Foundation software is covered by the GNU Library General
Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price.
Our General Public Licenses are designed to make sure that you have the
freedom to distribute copies of free software (and charge for this
service if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone
to deny you these rights or to ask you to surrender the rights. These
restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis
or for a fee, you must give the recipients all the rights that you have.
You must make sure that they, too, receive or can get the source code.
And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software patents.
We wish to avoid the danger that redistributors of a free program will
individually obtain patent licenses, in effect making the program
proprietary. To prevent this, we have made it clear that any patent must
be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains a
notice placed by the copyright holder saying it may be distributed under
the terms of this General Public License. The "Program", below, refers
to any such program or work, and a "work based on the Program" means
either the Program or any derivative work under copyright law: that is
to say, a work containing the Program or a portion of it, either
verbatim or with modifications and/or translated into another language.
(Hereinafter, translation is included without limitation in the term
"modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of running
the Program is not restricted, and the output from the Program is
covered only if its contents constitute a work based on the Program
(independent of having been made by running the Program). Whether that
is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you conspicuously
and appropriately publish on each copy an appropriate copyright notice
and disclaimer of warranty; keep intact all the notices that refer to
this License and to the absence of any warranty; and give any other
recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of
it, thus forming a work based on the Program, and copy and distribute
such modifications or work under the terms of Section 1 above, provided
that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices stating
that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in whole
or in part contains or is derived from the Program or any part thereof,
to be licensed as a whole at no charge to all third parties under the
terms of this License.
c) If the modified program normally reads commands interactively when
run, you must cause it, when started running for such interactive use in
the most ordinary way, to print or display an announcement including an
appropriate copyright notice and a notice that there is no warranty (or
else, saying that you provide a warranty) and that users may
redistribute the program under these conditions, and telling the user
how to view a copy of this License. (Exception: if the Program itself is
interactive but does not normally print such an announcement, your work
based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program, and
can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based on
the Program, the distribution of the whole must be on the terms of this
License, whose permissions for other licensees extend to the entire
whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of a
storage or distribution medium does not bring the other work under the
scope of this License.
3. You may copy and distribute the Program (or a work based on it, under
Section 2) in object code or executable form under the terms of Sections
1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable source
code, which must be distributed under the terms of Sections 1 and 2
above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three years, to
give any third party, for a charge no more than your cost of physically
performing source distribution, a complete machine-readable copy of the
corresponding source code, to be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer to
distribute corresponding source code. (This alternative is allowed only
for noncommercial distribution and only if you received the program in
object code or executable form with such an offer, in accord with
Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source code
means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to control
compilation and installation of the executable. However, as a special
exception, the source code distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies the
executable.
If distribution of executable or object code is made by offering access
to copy from a designated place, then offering equivalent access to copy
the source code from the same place counts as distribution of the source
code, even though third parties are not compelled to copy the source
along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt otherwise
to copy, modify, sublicense or distribute the Program is void, and will
automatically terminate your rights under this License. However, parties
who have received copies, or rights, from you under this License will
not have their licenses terminated so long as such parties remain in
full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and all
its terms and conditions for copying, distributing or modifying the
Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further restrictions
on the recipients' exercise of the rights granted herein. You are not
responsible for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot distribute
so as to satisfy simultaneously your obligations under this License and
any other pertinent obligations, then as a consequence you may not
distribute the Program at all. For example, if a patent license would
not permit royalty-free redistribution of the Program by all those who
receive copies directly or indirectly through you, then the only way you
could satisfy both it and this License would be to refrain entirely from
distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is implemented
by public license practices. Many people have made generous
contributions to the wide range of software distributed through that
system in reliance on consistent application of that system; it is up to
the author/donor to decide if he or she is willing to distribute
software through any other system and a licensee cannot impose that
choice.
This section is intended to make thoroughly clear what is believed to be
a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License may
add an explicit geographical distribution limitation excluding those
countries, so that distribution is permitted only in or among countries
not thus excluded. In such case, this License incorporates the
limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Program does not specify a version
number of this License, you may choose any version ever published by the
Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the
author to ask for permission. For software which is copyrighted by the
Free Software Foundation, write to the Free Software Foundation; we
sometimes make exceptions for this. Our decision will be guided by the
two goals of preserving the free status of all derivatives of our free
software and of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
NECESSARY SERVICING, REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
One line to give the program's name and a brief idea of what it does.
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author Gnomovision
comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is
free software, and you are welcome to redistribute it under certain
conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License. Of course, the commands
you use may be called something other than `show w' and `show c'; they
could even be mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
signature of Ty Coon, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications
with the library. If this is what you want to do, use the GNU Library
General Public License instead of this License.
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,642 @@
--- **AceAddon-3.0** provides a template for creating addon objects.
-- It'll provide you with a set of callback functions that allow you to simplify the loading
-- process of your addon.\\
-- Callbacks provided are:\\
-- * **OnInitialize**, which is called directly after the addon is fully loaded.
-- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
-- * **OnDisable**, which is only called when your addon is manually being disabled.
-- @usage
-- -- A small (but complete) addon, that doesn't do anything,
-- -- but shows usage of the callbacks.
-- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
--
-- function MyAddon:OnInitialize()
-- -- do init tasks here, like loading the Saved Variables,
-- -- or setting up slash commands.
-- end
--
-- function MyAddon:OnEnable()
-- -- Do more initialization here, that really enables the use of your addon.
-- -- Register Events, Hook functions, Create Frames, Get information from
-- -- the game that wasn't available in OnInitialize
-- end
--
-- function MyAddon:OnDisable()
-- -- Unhook, Unregister Events, Hide frames that you created.
-- -- You would probably only use an OnDisable if you want to
-- -- build a "standby" mode, or be able to toggle modules on/off.
-- end
-- @class file
-- @name AceAddon-3.0.lua
-- @release $Id: AceAddon-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
local MAJOR, MINOR = "AceAddon-3.0", 5
local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceAddon then return end -- No Upgrade needed.
AceAddon.frame = AceAddon.frame or CreateFrame("Frame", "AceAddon30Frame") -- Our very own frame
AceAddon.addons = AceAddon.addons or {} -- addons in general
AceAddon.statuses = AceAddon.statuses or {} -- statuses of addon.
AceAddon.initializequeue = AceAddon.initializequeue or {} -- addons that are new and not initialized
AceAddon.enablequeue = AceAddon.enablequeue or {} -- addons that are initialized and waiting to be enabled
AceAddon.embeds = AceAddon.embeds or setmetatable({}, {__index = function(tbl, key) tbl[key] = {} return tbl[key] end }) -- contains a list of libraries embedded in an addon
-- Lua APIs
local tinsert, tconcat, tremove = table.insert, table.concat, table.remove
local fmt, tostring = string.format, tostring
local select, pairs, next, type, unpack = select, pairs, next, type, unpack
local loadstring, assert, error = loadstring, assert, error
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub, IsLoggedIn, geterrorhandler
--[[
xpcall safecall implementation
]]
local xpcall = xpcall
local function errorhandler(err)
return geterrorhandler()(err)
end
local function CreateDispatcher(argCount)
local code = [[
local xpcall, eh = ...
local method, ARGS
local function call() return method(ARGS) end
local function dispatch(func, ...)
method = func
if not method then return end
ARGS = ...
return xpcall(call, eh)
end
return dispatch
]]
local ARGS = {}
for i = 1, argCount do ARGS[i] = "arg"..i end
code = code:gsub("ARGS", tconcat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
end
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
Dispatchers[0] = function(func)
return xpcall(func, errorhandler)
end
local function safecall(func, ...)
-- we check to see if the func is passed is actually a function here and don't error when it isn't
-- this safecall is used for optional functions like OnInitialize OnEnable etc. When they are not
-- present execution should continue without hinderance
if type(func) == "function" then
return Dispatchers[select('#', ...)](func, ...)
end
end
-- local functions that will be implemented further down
local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype
-- used in the addon metatable
local function addontostring( self ) return self.name end
--- Create a new AceAddon-3.0 addon.
-- Any libraries you specified will be embeded, and the addon will be scheduled for
-- its OnInitialize and OnEnable callbacks.
-- The final addon object, with all libraries embeded, will be returned.
-- @paramsig [object ,]name[, lib, ...]
-- @param object Table to use as a base for the addon (optional)
-- @param name Name of the addon object to create
-- @param lib List of libraries to embed into the addon
-- @usage
-- -- Create a simple addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
--
-- -- Create a Addon object based on the table of a frame
-- local MyFrame = CreateFrame("Frame")
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon(MyFrame, "MyAddon", "AceEvent-3.0")
function AceAddon:NewAddon(objectorname, ...)
local object,name
local i=1
if type(objectorname)=="table" then
object=objectorname
name=...
i=2
else
name=objectorname
end
if type(name)~="string" then
error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
end
if self.addons[name] then
error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
end
object = object or {}
object.name = name
local addonmeta = {}
local oldmeta = getmetatable(object)
if oldmeta then
for k, v in pairs(oldmeta) do addonmeta[k] = v end
end
addonmeta.__tostring = addontostring
setmetatable( object, addonmeta )
self.addons[name] = object
object.modules = {}
object.defaultModuleLibraries = {}
Embed( object ) -- embed NewModule, GetModule methods
self:EmbedLibraries(object, select(i,...))
-- add to queue of addons to be initialized upon ADDON_LOADED
tinsert(self.initializequeue, object)
return object
end
--- Get the addon object by its name from the internal AceAddon registry.
-- Throws an error if the addon object cannot be found (except if silent is set).
-- @param name unique name of the addon object
-- @param silent if true, the addon is optional, silently return nil if its not found
-- @usage
-- -- Get the Addon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
function AceAddon:GetAddon(name, silent)
if not silent and not self.addons[name] then
error(("Usage: GetAddon(name): 'name' - Cannot find an AceAddon '%s'."):format(tostring(name)), 2)
end
return self.addons[name]
end
-- - Embed a list of libraries into the specified addon.
-- This function will try to embed all of the listed libraries into the addon
-- and error if a single one fails.
--
-- **Note:** This function is for internal use by :NewAddon/:NewModule
-- @paramsig addon, [lib, ...]
-- @param addon addon object to embed the libs in
-- @param lib List of libraries to embed into the addon
function AceAddon:EmbedLibraries(addon, ...)
for i=1,select("#", ... ) do
local libname = select(i, ...)
self:EmbedLibrary(addon, libname, false, 4)
end
end
-- - Embed a library into the addon object.
-- This function will check if the specified library is registered with LibStub
-- and if it has a :Embed function to call. It'll error if any of those conditions
-- fails.
--
-- **Note:** This function is for internal use by :EmbedLibraries
-- @paramsig addon, libname[, silent[, offset]]
-- @param addon addon object to embed the library in
-- @param libname name of the library to embed
-- @param silent marks an embed to fail silently if the library doesn't exist (optional)
-- @param offset will push the error messages back to said offset, defaults to 2 (optional)
function AceAddon:EmbedLibrary(addon, libname, silent, offset)
local lib = LibStub:GetLibrary(libname, true)
if not lib and not silent then
error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Cannot find a library instance of %q."):format(tostring(libname)), offset or 2)
elseif lib and type(lib.Embed) == "function" then
lib:Embed(addon)
tinsert(self.embeds[addon], libname)
return true
elseif lib then
error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Library '%s' is not Embed capable"):format(libname), offset or 2)
end
end
--- Return the specified module from an addon object.
-- Throws an error if the addon object cannot be found (except if silent is set)
-- @name //addon//:GetModule
-- @paramsig name[, silent]
-- @param name unique name of the module
-- @param silent if true, the module is optional, silently return nil if its not found (optional)
-- @usage
-- -- Get the Addon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- -- Get the Module
-- MyModule = MyAddon:GetModule("MyModule")
function GetModule(self, name, silent)
if not self.modules[name] and not silent then
error(("Usage: GetModule(name, silent): 'name' - Cannot find module '%s'."):format(tostring(name)), 2)
end
return self.modules[name]
end
local function IsModuleTrue(self) return true end
--- Create a new module for the addon.
-- The new module can have its own embeded libraries and/or use a module prototype to be mixed into the module.\\
-- A module has the same functionality as a real addon, it can have modules of its own, and has the same API as
-- an addon object.
-- @name //addon//:NewModule
-- @paramsig name[, prototype|lib[, lib, ...]]
-- @param name unique name of the module
-- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
-- @param lib List of libraries to embed into the addon
-- @usage
-- -- Create a module with some embeded libraries
-- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
--
-- -- Create a module with a prototype
-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
-- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
function NewModule(self, name, prototype, ...)
if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
-- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
-- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
module.IsModule = IsModuleTrue
module:SetEnabledState(self.defaultModuleState)
module.moduleName = name
if type(prototype) == "string" then
AceAddon:EmbedLibraries(module, prototype, ...)
else
AceAddon:EmbedLibraries(module, ...)
end
AceAddon:EmbedLibraries(module, unpack(self.defaultModuleLibraries))
if not prototype or type(prototype) == "string" then
prototype = self.defaultModulePrototype or nil
end
if type(prototype) == "table" then
local mt = getmetatable(module)
mt.__index = prototype
setmetatable(module, mt) -- More of a Base class type feel.
end
safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
self.modules[name] = module
return module
end
--- Returns the real name of the addon or module, without any prefix.
-- @name //addon//:GetName
-- @paramsig
-- @usage
-- print(MyAddon:GetName())
-- -- prints "MyAddon"
function GetName(self)
return self.moduleName or self.name
end
--- Enables the Addon, if possible, return true or false depending on success.
-- This internally calls AceAddon:EnableAddon(), thus dispatching a OnEnable callback
-- and enabling all modules of the addon (unless explicitly disabled).\\
-- :Enable() also sets the internal `enableState` variable to true
-- @name //addon//:Enable
-- @paramsig
-- @usage
-- -- Enable MyModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
-- MyModule:Enable()
function Enable(self)
self:SetEnabledState(true)
return AceAddon:EnableAddon(self)
end
--- Disables the Addon, if possible, return true or false depending on success.
-- This internally calls AceAddon:DisableAddon(), thus dispatching a OnDisable callback
-- and disabling all modules of the addon.\\
-- :Disable() also sets the internal `enableState` variable to false
-- @name //addon//:Disable
-- @paramsig
-- @usage
-- -- Disable MyAddon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyAddon:Disable()
function Disable(self)
self:SetEnabledState(false)
return AceAddon:DisableAddon(self)
end
--- Enables the Module, if possible, return true or false depending on success.
-- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
-- @name //addon//:EnableModule
-- @paramsig name
-- @usage
-- -- Enable MyModule using :GetModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
-- MyModule:Enable()
--
-- -- Enable MyModule using the short-hand
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyAddon:EnableModule("MyModule")
function EnableModule(self, name)
local module = self:GetModule( name )
return module:Enable()
end
--- Disables the Module, if possible, return true or false depending on success.
-- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
-- @name //addon//:DisableModule
-- @paramsig name
-- @usage
-- -- Disable MyModule using :GetModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
-- MyModule:Disable()
--
-- -- Disable MyModule using the short-hand
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyAddon:DisableModule("MyModule")
function DisableModule(self, name)
local module = self:GetModule( name )
return module:Disable()
end
--- Set the default libraries to be mixed into all modules created by this object.
-- Note that you can only change the default module libraries before any module is created.
-- @name //addon//:SetDefaultModuleLibraries
-- @paramsig lib[, lib, ...]
-- @param lib List of libraries to embed into the addon
-- @usage
-- -- Create the addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
-- -- Configure default libraries for modules (all modules need AceEvent-3.0)
-- MyAddon:SetDefaultModuleLibraries("AceEvent-3.0")
-- -- Create a module
-- MyModule = MyAddon:NewModule("MyModule")
function SetDefaultModuleLibraries(self, ...)
if next(self.modules) then
error("Usage: SetDefaultModuleLibraries(...): cannot change the module defaults after a module has been registered.", 2)
end
self.defaultModuleLibraries = {...}
end
--- Set the default state in which new modules are being created.
-- Note that you can only change the default state before any module is created.
-- @name //addon//:SetDefaultModuleState
-- @paramsig state
-- @param state Default state for new modules, true for enabled, false for disabled
-- @usage
-- -- Create the addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
-- -- Set the default state to "disabled"
-- MyAddon:SetDefaultModuleState(false)
-- -- Create a module and explicilty enable it
-- MyModule = MyAddon:NewModule("MyModule")
-- MyModule:Enable()
function SetDefaultModuleState(self, state)
if next(self.modules) then
error("Usage: SetDefaultModuleState(state): cannot change the module defaults after a module has been registered.", 2)
end
self.defaultModuleState = state
end
--- Set the default prototype to use for new modules on creation.
-- Note that you can only change the default prototype before any module is created.
-- @name //addon//:SetDefaultModulePrototype
-- @paramsig prototype
-- @param prototype Default prototype for the new modules (table)
-- @usage
-- -- Define a prototype
-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
-- -- Set the default prototype
-- MyAddon:SetDefaultModulePrototype(prototype)
-- -- Create a module and explicitly Enable it
-- MyModule = MyAddon:NewModule("MyModule")
-- MyModule:Enable()
-- -- should print "OnEnable called!" now
-- @see NewModule
function SetDefaultModulePrototype(self, prototype)
if next(self.modules) then
error("Usage: SetDefaultModulePrototype(prototype): cannot change the module defaults after a module has been registered.", 2)
end
if type(prototype) ~= "table" then
error(("Usage: SetDefaultModulePrototype(prototype): 'prototype' - table expected got '%s'."):format(type(prototype)), 2)
end
self.defaultModulePrototype = prototype
end
--- Set the state of an addon or module
-- This should only be called before any enabling actually happend, e.g. in/before OnInitialize.
-- @name //addon//:SetEnabledState
-- @paramsig state
-- @param state the state of an addon or module (enabled=true, disabled=false)
function SetEnabledState(self, state)
self.enabledState = state
end
--- Return an iterator of all modules associated to the addon.
-- @name //addon//:IterateModules
-- @paramsig
-- @usage
-- -- Enable all modules
-- for name, module in MyAddon:IterateModules() do
-- module:Enable()
-- end
local function IterateModules(self) return pairs(self.modules) end
-- Returns an iterator of all embeds in the addon
-- @name //addon//:IterateEmbeds
-- @paramsig
local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end
--- Query the enabledState of an addon.
-- @name //addon//:IsEnabled
-- @paramsig
-- @usage
-- if MyAddon:IsEnabled() then
-- MyAddon:Disable()
-- end
local function IsEnabled(self) return self.enabledState end
local mixins = {
NewModule = NewModule,
GetModule = GetModule,
Enable = Enable,
Disable = Disable,
EnableModule = EnableModule,
DisableModule = DisableModule,
IsEnabled = IsEnabled,
SetDefaultModuleLibraries = SetDefaultModuleLibraries,
SetDefaultModuleState = SetDefaultModuleState,
SetDefaultModulePrototype = SetDefaultModulePrototype,
SetEnabledState = SetEnabledState,
IterateModules = IterateModules,
IterateEmbeds = IterateEmbeds,
GetName = GetName,
}
local function IsModule(self) return false end
local pmixins = {
defaultModuleState = true,
enabledState = true,
IsModule = IsModule,
}
-- Embed( target )
-- target (object) - target object to embed aceaddon in
--
-- this is a local function specifically since it's meant to be only called internally
function Embed(target)
for k, v in pairs(mixins) do
target[k] = v
end
for k, v in pairs(pmixins) do
target[k] = target[k] or v
end
end
-- - Initialize the addon after creation.
-- This function is only used internally during the ADDON_LOADED event
-- It will call the **OnInitialize** function on the addon object (if present),
-- and the **OnEmbedInitialize** function on all embeded libraries.
--
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- @param addon addon object to intialize
function AceAddon:InitializeAddon(addon)
safecall(addon.OnInitialize, addon)
local embeds = self.embeds[addon]
for i = 1, #embeds do
local lib = LibStub:GetLibrary(embeds[i], true)
if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
end
-- we don't call InitializeAddon on modules specifically, this is handled
-- from the event handler and only done _once_
end
-- - Enable the addon after creation.
-- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
-- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
-- It will call the **OnEnable** function on the addon object (if present),
-- and the **OnEmbedEnable** function on all embeded libraries.\\
-- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
--
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- Use :Enable on the addon itself instead.
-- @param addon addon object to enable
function AceAddon:EnableAddon(addon)
if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
if self.statuses[addon.name] or not addon.enabledState then return false end
-- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
self.statuses[addon.name] = true
safecall(addon.OnEnable, addon)
-- make sure we're still enabled before continueing
if self.statuses[addon.name] then
local embeds = self.embeds[addon]
for i = 1, #embeds do
local lib = LibStub:GetLibrary(embeds[i], true)
if lib then safecall(lib.OnEmbedEnable, lib, addon) end
end
-- enable possible modules.
for name, module in pairs(addon.modules) do
self:EnableAddon(module)
end
end
return self.statuses[addon.name] -- return true if we're disabled
end
-- - Disable the addon
-- Note: This function is only used internally.
-- It will call the **OnDisable** function on the addon object (if present),
-- and the **OnEmbedDisable** function on all embeded libraries.\\
-- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
--
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- Use :Disable on the addon itself instead.
-- @param addon addon object to enable
function AceAddon:DisableAddon(addon)
if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
if not self.statuses[addon.name] then return false end
-- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
self.statuses[addon.name] = false
safecall( addon.OnDisable, addon )
-- make sure we're still disabling...
if not self.statuses[addon.name] then
local embeds = self.embeds[addon]
for i = 1, #embeds do
local lib = LibStub:GetLibrary(embeds[i], true)
if lib then safecall(lib.OnEmbedDisable, lib, addon) end
end
-- disable possible modules.
for name, module in pairs(addon.modules) do
self:DisableAddon(module)
end
end
return not self.statuses[addon.name] -- return true if we're disabled
end
--- Get an iterator over all registered addons.
-- @usage
-- -- Print a list of all installed AceAddon's
-- for name, addon in AceAddon:IterateAddons() do
-- print("Addon: " .. name)
-- end
function AceAddon:IterateAddons() return pairs(self.addons) end
--- Get an iterator over the internal status registry.
-- @usage
-- -- Print a list of all enabled addons
-- for name, status in AceAddon:IterateAddonStatus() do
-- if status then
-- print("EnabledAddon: " .. name)
-- end
-- end
function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
-- Following Iterators are deprecated, and their addon specific versions should be used
-- e.g. addon:IterateEmbeds() instead of :IterateEmbedsOnAddon(addon)
function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end
-- Event Handling
local function onEvent(this, event, arg1)
if event == "ADDON_LOADED" or event == "PLAYER_LOGIN" then
-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
while(#AceAddon.initializequeue > 0) do
local addon = tremove(AceAddon.initializequeue, 1)
-- this might be an issue with recursion - TODO: validate
if event == "ADDON_LOADED" then addon.baseName = arg1 end
AceAddon:InitializeAddon(addon)
tinsert(AceAddon.enablequeue, addon)
end
if IsLoggedIn() then
while(#AceAddon.enablequeue > 0) do
local addon = tremove(AceAddon.enablequeue, 1)
AceAddon:EnableAddon(addon)
end
end
end
end
AceAddon.frame:RegisterEvent("ADDON_LOADED")
AceAddon.frame:RegisterEvent("PLAYER_LOGIN")
AceAddon.frame:SetScript("OnEvent", onEvent)
-- upgrade embeded
for name, addon in pairs(AceAddon.addons) do
Embed(addon)
end
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceAddon-3.0.lua"/>
</Ui>
+309
View File
@@ -0,0 +1,309 @@
--- **AceComm-3.0** allows you to send messages of unlimited length over the addon comm channels.
-- It'll automatically split the messages into multiple parts and rebuild them on the receiving end.\\
-- **ChatThrottleLib** is of course being used to avoid being disconnected by the server.
--
-- **AceComm-3.0** can be embeded into your addon, either explicitly by calling AceComm:Embed(MyAddon) or by
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
-- and can be accessed directly, without having to explicitly call AceComm itself.\\
-- It is recommended to embed AceComm, otherwise you'll have to specify a custom `self` on all calls you
-- make into AceComm.
-- @class file
-- @name AceComm-3.0
-- @release $Id: AceComm-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
--[[ AceComm-3.0
TODO: Time out old data rotting around from dead senders? Not a HUGE deal since the number of possible sender names is somewhat limited.
]]
local MAJOR, MINOR = "AceComm-3.0", 6
local AceComm,oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceComm then return end
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
local CTL = assert(ChatThrottleLib, "AceComm-3.0 requires ChatThrottleLib")
-- Lua APIs
local type, next, pairs, tostring = type, next, pairs, tostring
local strsub, strfind = string.sub, string.find
local tinsert, tconcat = table.insert, table.concat
local error, assert = error, assert
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub, DEFAULT_CHAT_FRAME, geterrorhandler
AceComm.embeds = AceComm.embeds or {}
-- for my sanity and yours, let's give the message type bytes some names
local MSG_MULTI_FIRST = "\001"
local MSG_MULTI_NEXT = "\002"
local MSG_MULTI_LAST = "\003"
AceComm.multipart_origprefixes = AceComm.multipart_origprefixes or {} -- e.g. "Prefix\001"="Prefix", "Prefix\002"="Prefix"
AceComm.multipart_reassemblers = AceComm.multipart_reassemblers or {} -- e.g. "Prefix\001"="OnReceiveMultipartFirst"
-- the multipart message spool: indexed by a combination of sender+distribution+
AceComm.multipart_spool = AceComm.multipart_spool or {}
--- Register for Addon Traffic on a specified prefix
-- @param prefix A printable character (\032-\255) classification of the message (typically AddonName or AddonNameEvent)
-- @param method Callback to call on message reception: Function reference, or method name (string) to call on self. Defaults to "OnCommReceived"
function AceComm:RegisterComm(prefix, method)
if method == nil then
method = "OnCommReceived"
end
return AceComm._RegisterComm(self, prefix, method) -- created by CallbackHandler
end
local warnedPrefix=false
--- Send a message over the Addon Channel
-- @param prefix A printable character (\032-\255) classification of the message (typically AddonName or AddonNameEvent)
-- @param text Data to send, nils (\000) not allowed. Any length.
-- @param distribution Addon channel, e.g. "RAID", "GUILD", etc; see SendAddonMessage API
-- @param target Destination for some distributions; see SendAddonMessage API
-- @param prio OPTIONAL: ChatThrottleLib priority, "BULK", "NORMAL" or "ALERT". Defaults to "NORMAL".
-- @param callbackFn OPTIONAL: callback function to be called as each chunk is sent. receives 3 args: the user supplied arg (see next), the number of bytes sent so far, and the number of bytes total to send.
-- @param callbackArg: OPTIONAL: first arg to the callback function. nil will be passed if not specified.
function AceComm:SendCommMessage(prefix, text, distribution, target, prio, callbackFn, callbackArg)
prio = prio or "NORMAL" -- pasta's reference implementation had different prio for singlepart and multipart, but that's a very bad idea since that can easily lead to out-of-sequence delivery!
if not( type(prefix)=="string" and
type(text)=="string" and
type(distribution)=="string" and
(target==nil or type(target)=="string") and
(prio=="BULK" or prio=="NORMAL" or prio=="ALERT")
) then
error('Usage: SendCommMessage(addon, "prefix", "text", "distribution"[, "target"[, "prio"[, callbackFn, callbackarg]]])', 2)
end
if strfind(prefix, "[\001-\009]") then
if strfind(prefix, "[\001-\003]") then
error("SendCommMessage: Characters \\001--\\003 in prefix are reserved for AceComm metadata", 2)
elseif not warnedPrefix then
-- I have some ideas about future extensions that require more control characters /mikk, 20090808
geterrorhandler()("SendCommMessage: Heads-up developers: Characters \\004--\\009 in prefix are reserved for AceComm future extension")
warnedPrefix = true
end
end
local textlen = #text
local maxtextlen = 254 - #prefix -- 254 is the max length of prefix + text that can be sent in one message
local queueName = prefix..distribution..(target or "")
local ctlCallback = nil
if callbackFn then
ctlCallback = function(sent)
return callbackFn(callbackArg, sent, textlen)
end
end
if textlen <= maxtextlen then
-- fits all in one message
CTL:SendAddonMessage(prio, prefix, text, distribution, target, queueName, ctlCallback, textlen)
else
maxtextlen = maxtextlen - 1 -- 1 extra byte for part indicator in prefix
-- first part
local chunk = strsub(text, 1, maxtextlen)
CTL:SendAddonMessage(prio, prefix..MSG_MULTI_FIRST, chunk, distribution, target, queueName, ctlCallback, maxtextlen)
-- continuation
local pos = 1+maxtextlen
local prefix2 = prefix..MSG_MULTI_NEXT
while pos+maxtextlen <= textlen do
chunk = strsub(text, pos, pos+maxtextlen-1)
CTL:SendAddonMessage(prio, prefix2, chunk, distribution, target, queueName, ctlCallback, pos+maxtextlen-1)
pos = pos + maxtextlen
end
-- final part
chunk = strsub(text, pos)
CTL:SendAddonMessage(prio, prefix..MSG_MULTI_LAST, chunk, distribution, target, queueName, ctlCallback, textlen)
end
end
----------------------------------------
-- Message receiving
----------------------------------------
do
local compost = setmetatable({}, {__mode = "k"})
local function new()
local t = next(compost)
if t then
compost[t]=nil
for i=#t,3,-1 do -- faster than pairs loop. don't even nil out 1/2 since they'll be overwritten
t[i]=nil
end
return t
end
return {}
end
local function lostdatawarning(prefix,sender,where)
DEFAULT_CHAT_FRAME:AddMessage(MAJOR..": Warning: lost network data regarding '"..tostring(prefix).."' from '"..tostring(sender).."' (in "..where..")")
end
function AceComm:OnReceiveMultipartFirst(prefix, message, distribution, sender)
local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender
local spool = AceComm.multipart_spool
--[[
if spool[key] then
lostdatawarning(prefix,sender,"First")
-- continue and overwrite
end
--]]
spool[key] = message -- plain string for now
end
function AceComm:OnReceiveMultipartNext(prefix, message, distribution, sender)
local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender
local spool = AceComm.multipart_spool
local olddata = spool[key]
if not olddata then
--lostdatawarning(prefix,sender,"Next")
return
end
if type(olddata)~="table" then
-- ... but what we have is not a table. So make it one. (Pull a composted one if available)
local t = new()
t[1] = olddata -- add old data as first string
t[2] = message -- and new message as second string
spool[key] = t -- and put the table in the spool instead of the old string
else
tinsert(olddata, message)
end
end
function AceComm:OnReceiveMultipartLast(prefix, message, distribution, sender)
local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender
local spool = AceComm.multipart_spool
local olddata = spool[key]
if not olddata then
--lostdatawarning(prefix,sender,"End")
return
end
spool[key] = nil
if type(olddata) == "table" then
-- if we've received a "next", the spooled data will be a table for rapid & garbage-free tconcat
tinsert(olddata, message)
AceComm.callbacks:Fire(prefix, tconcat(olddata, ""), distribution, sender)
compost[olddata] = true
else
-- if we've only received a "first", the spooled data will still only be a string
AceComm.callbacks:Fire(prefix, olddata..message, distribution, sender)
end
end
end
----------------------------------------
-- Embed CallbackHandler
----------------------------------------
if not AceComm.callbacks then
-- ensure that 'prefix to watch' table is consistent with registered
-- callbacks
AceComm.__prefixes = {}
AceComm.callbacks = CallbackHandler:New(AceComm,
"_RegisterComm",
"UnregisterComm",
"UnregisterAllComm")
end
function AceComm.callbacks:OnUsed(target, prefix)
AceComm.multipart_origprefixes[prefix..MSG_MULTI_FIRST] = prefix
AceComm.multipart_reassemblers[prefix..MSG_MULTI_FIRST] = "OnReceiveMultipartFirst"
AceComm.multipart_origprefixes[prefix..MSG_MULTI_NEXT] = prefix
AceComm.multipart_reassemblers[prefix..MSG_MULTI_NEXT] = "OnReceiveMultipartNext"
AceComm.multipart_origprefixes[prefix..MSG_MULTI_LAST] = prefix
AceComm.multipart_reassemblers[prefix..MSG_MULTI_LAST] = "OnReceiveMultipartLast"
end
function AceComm.callbacks:OnUnused(target, prefix)
AceComm.multipart_origprefixes[prefix..MSG_MULTI_FIRST] = nil
AceComm.multipart_reassemblers[prefix..MSG_MULTI_FIRST] = nil
AceComm.multipart_origprefixes[prefix..MSG_MULTI_NEXT] = nil
AceComm.multipart_reassemblers[prefix..MSG_MULTI_NEXT] = nil
AceComm.multipart_origprefixes[prefix..MSG_MULTI_LAST] = nil
AceComm.multipart_reassemblers[prefix..MSG_MULTI_LAST] = nil
end
local function OnEvent(this, event, ...)
if event == "CHAT_MSG_ADDON" then
local prefix,message,distribution,sender = ...
local reassemblername = AceComm.multipart_reassemblers[prefix]
if reassemblername then
-- multipart: reassemble
local aceCommReassemblerFunc = AceComm[reassemblername]
local origprefix = AceComm.multipart_origprefixes[prefix]
aceCommReassemblerFunc(AceComm, origprefix, message, distribution, sender)
else
-- single part: fire it off immediately and let CallbackHandler decide if it's registered or not
AceComm.callbacks:Fire(prefix, message, distribution, sender)
end
else
assert(false, "Received "..tostring(event).." event?!")
end
end
AceComm.frame = AceComm.frame or CreateFrame("Frame", "AceComm30Frame")
AceComm.frame:SetScript("OnEvent", OnEvent)
AceComm.frame:UnregisterAllEvents()
AceComm.frame:RegisterEvent("CHAT_MSG_ADDON")
----------------------------------------
-- Base library stuff
----------------------------------------
local mixins = {
"RegisterComm",
"UnregisterComm",
"UnregisterAllComm",
"SendCommMessage",
}
-- Embeds AceComm-3.0 into the target object making the functions from the mixins list available on target:..
-- @param target target object to embed AceComm-3.0 in
function AceComm:Embed(target)
for k, v in pairs(mixins) do
target[v] = self[v]
end
self.embeds[target] = true
return target
end
function AceComm:OnEmbedDisable(target)
target:UnregisterAllComm()
end
-- Update embeds
for target, v in pairs(AceComm.embeds) do
AceComm:Embed(target)
end
@@ -0,0 +1,5 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="ChatThrottleLib.lua"/>
<Script file="AceComm-3.0.lua"/>
</Ui>
@@ -0,0 +1,503 @@
--
-- ChatThrottleLib by Mikk
--
-- Manages AddOn chat output to keep player from getting kicked off.
--
-- ChatThrottleLib:SendChatMessage/:SendAddonMessage functions that accept
-- a Priority ("BULK", "NORMAL", "ALERT") as well as prefix for SendChatMessage.
--
-- Priorities get an equal share of available bandwidth when fully loaded.
-- Communication channels are separated on extension+chattype+destination and
-- get round-robinned. (Destination only matters for whispers and channels,
-- obviously)
--
-- Will install hooks for SendChatMessage and SendAddonMessage to measure
-- bandwidth bypassing the library and use less bandwidth itself.
--
--
-- Fully embeddable library. Just copy this file into your addon directory,
-- add it to the .toc, and it's done.
--
-- Can run as a standalone addon also, but, really, just embed it! :-)
--
local CTL_VERSION = 21
local _G = _G
if _G.ChatThrottleLib then
if _G.ChatThrottleLib.version >= CTL_VERSION then
-- There's already a newer (or same) version loaded. Buh-bye.
return
elseif not _G.ChatThrottleLib.securelyHooked then
print("ChatThrottleLib: Warning: There's an ANCIENT ChatThrottleLib.lua (pre-wow 2.0, <v16) in an addon somewhere. Get the addon updated or copy in a newer ChatThrottleLib.lua (>=v16) in it!")
-- ATTEMPT to unhook; this'll behave badly if someone else has hooked...
-- ... and if someone has securehooked, they can kiss that goodbye too... >.<
_G.SendChatMessage = _G.ChatThrottleLib.ORIG_SendChatMessage
if _G.ChatThrottleLib.ORIG_SendAddonMessage then
_G.SendAddonMessage = _G.ChatThrottleLib.ORIG_SendAddonMessage
end
end
_G.ChatThrottleLib.ORIG_SendChatMessage = nil
_G.ChatThrottleLib.ORIG_SendAddonMessage = nil
end
if not _G.ChatThrottleLib then
_G.ChatThrottleLib = {}
end
ChatThrottleLib = _G.ChatThrottleLib -- in case some addon does "local ChatThrottleLib" above us and we're copypasted (AceComm-2, sigh)
local ChatThrottleLib = _G.ChatThrottleLib
ChatThrottleLib.version = CTL_VERSION
------------------ TWEAKABLES -----------------
ChatThrottleLib.MAX_CPS = 800 -- 2000 seems to be safe if NOTHING ELSE is happening. let's call it 800.
ChatThrottleLib.MSG_OVERHEAD = 40 -- Guesstimate overhead for sending a message; source+dest+chattype+protocolstuff
ChatThrottleLib.BURST = 4000 -- WoW's server buffer seems to be about 32KB. 8KB should be safe, but seen disconnects on _some_ servers. Using 4KB now.
ChatThrottleLib.MIN_FPS = 20 -- Reduce output CPS to half (and don't burst) if FPS drops below this value
local setmetatable = setmetatable
local table_remove = table.remove
local tostring = tostring
local GetTime = GetTime
local math_min = math.min
local math_max = math.max
local next = next
local strlen = string.len
local GetFrameRate = GetFrameRate
-----------------------------------------------------------------------
-- Double-linked ring implementation
local Ring = {}
local RingMeta = { __index = Ring }
function Ring:New()
local ret = {}
setmetatable(ret, RingMeta)
return ret
end
function Ring:Add(obj) -- Append at the "far end" of the ring (aka just before the current position)
if self.pos then
obj.prev = self.pos.prev
obj.prev.next = obj
obj.next = self.pos
obj.next.prev = obj
else
obj.next = obj
obj.prev = obj
self.pos = obj
end
end
function Ring:Remove(obj)
obj.next.prev = obj.prev
obj.prev.next = obj.next
if self.pos == obj then
self.pos = obj.next
if self.pos == obj then
self.pos = nil
end
end
end
-----------------------------------------------------------------------
-- Recycling bin for pipes
-- A pipe is a plain integer-indexed queue, which also happens to be a ring member
ChatThrottleLib.PipeBin = nil -- pre-v19, drastically different
local PipeBin = setmetatable({}, {__mode="k"})
local function DelPipe(pipe)
for i = #pipe, 1, -1 do
pipe[i] = nil
end
pipe.prev = nil
pipe.next = nil
PipeBin[pipe] = true
end
local function NewPipe()
local pipe = next(PipeBin)
if pipe then
PipeBin[pipe] = nil
return pipe
end
return {}
end
-----------------------------------------------------------------------
-- Recycling bin for messages
ChatThrottleLib.MsgBin = nil -- pre-v19, drastically different
local MsgBin = setmetatable({}, {__mode="k"})
local function DelMsg(msg)
msg[1] = nil
-- there's more parameters, but they're very repetetive so the string pool doesn't suffer really, and it's faster to just not delete them.
MsgBin[msg] = true
end
local function NewMsg()
local msg = next(MsgBin)
if msg then
MsgBin[msg] = nil
return msg
end
return {}
end
-----------------------------------------------------------------------
-- ChatThrottleLib:Init
-- Initialize queues, set up frame for OnUpdate, etc
function ChatThrottleLib:Init()
-- Set up queues
if not self.Prio then
self.Prio = {}
self.Prio["ALERT"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
self.Prio["NORMAL"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
self.Prio["BULK"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
end
-- v4: total send counters per priority
for _, Prio in pairs(self.Prio) do
Prio.nTotalSent = Prio.nTotalSent or 0
end
if not self.avail then
self.avail = 0 -- v5
end
if not self.nTotalSent then
self.nTotalSent = 0 -- v5
end
-- Set up a frame to get OnUpdate events
if not self.Frame then
self.Frame = CreateFrame("Frame")
self.Frame:Hide()
end
self.Frame:SetScript("OnUpdate", self.OnUpdate)
self.Frame:SetScript("OnEvent", self.OnEvent) -- v11: Monitor P_E_W so we can throttle hard for a few seconds
self.Frame:RegisterEvent("PLAYER_ENTERING_WORLD")
self.OnUpdateDelay = 0
self.LastAvailUpdate = GetTime()
self.HardThrottlingBeginTime = GetTime() -- v11: Throttle hard for a few seconds after startup
-- Hook SendChatMessage and SendAddonMessage so we can measure unpiped traffic and avoid overloads (v7)
if not self.securelyHooked then
-- Use secure hooks as of v16. Old regular hook support yanked out in v21.
self.securelyHooked = true
--SendChatMessage
hooksecurefunc("SendChatMessage", function(...)
return ChatThrottleLib.Hook_SendChatMessage(...)
end)
--SendAddonMessage
hooksecurefunc("SendAddonMessage", function(...)
return ChatThrottleLib.Hook_SendAddonMessage(...)
end)
end
self.nBypass = 0
end
-----------------------------------------------------------------------
-- ChatThrottleLib.Hook_SendChatMessage / .Hook_SendAddonMessage
local bMyTraffic = false
function ChatThrottleLib.Hook_SendChatMessage(text, chattype, language, destination, ...)
if bMyTraffic then
return
end
local self = ChatThrottleLib
local size = strlen(tostring(text or "")) + strlen(tostring(destination or "")) + self.MSG_OVERHEAD
self.avail = self.avail - size
self.nBypass = self.nBypass + size -- just a statistic
end
function ChatThrottleLib.Hook_SendAddonMessage(prefix, text, chattype, destination, ...)
if bMyTraffic then
return
end
local self = ChatThrottleLib
local size = tostring(text or ""):len() + tostring(prefix or ""):len();
size = size + tostring(destination or ""):len() + self.MSG_OVERHEAD
self.avail = self.avail - size
self.nBypass = self.nBypass + size -- just a statistic
end
-----------------------------------------------------------------------
-- ChatThrottleLib:UpdateAvail
-- Update self.avail with how much bandwidth is currently available
function ChatThrottleLib:UpdateAvail()
local now = GetTime()
local MAX_CPS = self.MAX_CPS;
local newavail = MAX_CPS * (now - self.LastAvailUpdate)
local avail = self.avail
if now - self.HardThrottlingBeginTime < 5 then
-- First 5 seconds after startup/zoning: VERY hard clamping to avoid irritating the server rate limiter, it seems very cranky then
avail = math_min(avail + (newavail*0.1), MAX_CPS*0.5)
self.bChoking = true
elseif GetFramerate() < self.MIN_FPS then -- GetFrameRate call takes ~0.002 secs
avail = math_min(MAX_CPS, avail + newavail*0.5)
self.bChoking = true -- just a statistic
else
avail = math_min(self.BURST, avail + newavail)
self.bChoking = false
end
avail = math_max(avail, 0-(MAX_CPS*2)) -- Can go negative when someone is eating bandwidth past the lib. but we refuse to stay silent for more than 2 seconds; if they can do it, we can.
self.avail = avail
self.LastAvailUpdate = now
return avail
end
-----------------------------------------------------------------------
-- Despooling logic
function ChatThrottleLib:Despool(Prio)
local ring = Prio.Ring
while ring.pos and Prio.avail > ring.pos[1].nSize do
local msg = table_remove(Prio.Ring.pos, 1)
if not Prio.Ring.pos[1] then
local pipe = Prio.Ring.pos
Prio.Ring:Remove(pipe)
Prio.ByName[pipe.name] = nil
DelPipe(pipe)
else
Prio.Ring.pos = Prio.Ring.pos.next
end
Prio.avail = Prio.avail - msg.nSize
bMyTraffic = true
msg.f(unpack(msg, 1, msg.n))
bMyTraffic = false
Prio.nTotalSent = Prio.nTotalSent + msg.nSize
DelMsg(msg)
if msg.callbackFn then
msg.callbackFn (msg.callbackArg)
end
end
end
function ChatThrottleLib.OnEvent(this,event)
-- v11: We know that the rate limiter is touchy after login. Assume that it's touchy after zoning, too.
local self = ChatThrottleLib
if event == "PLAYER_ENTERING_WORLD" then
self.HardThrottlingBeginTime = GetTime() -- Throttle hard for a few seconds after zoning
self.avail = 0
end
end
function ChatThrottleLib.OnUpdate(this,delay)
local self = ChatThrottleLib
self.OnUpdateDelay = self.OnUpdateDelay + delay
if self.OnUpdateDelay < 0.08 then
return
end
self.OnUpdateDelay = 0
self:UpdateAvail()
if self.avail < 0 then
return -- argh. some bastard is spewing stuff past the lib. just bail early to save cpu.
end
-- See how many of our priorities have queued messages (we only have 3, don't worry about the loop)
local n = 0
for prioname,Prio in pairs(self.Prio) do
if Prio.Ring.pos or Prio.avail < 0 then
n = n + 1
end
end
-- Anything queued still?
if n<1 then
-- Nope. Move spillover bandwidth to global availability gauge and clear self.bQueueing
for prioname, Prio in pairs(self.Prio) do
self.avail = self.avail + Prio.avail
Prio.avail = 0
end
self.bQueueing = false
self.Frame:Hide()
return
end
-- There's stuff queued. Hand out available bandwidth to priorities as needed and despool their queues
local avail = self.avail/n
self.avail = 0
for prioname, Prio in pairs(self.Prio) do
if Prio.Ring.pos or Prio.avail < 0 then
Prio.avail = Prio.avail + avail
if Prio.Ring.pos and Prio.avail > Prio.Ring.pos[1].nSize then
self:Despool(Prio)
-- Note: We might not get here if the user-supplied callback function errors out! Take care!
end
end
end
end
-----------------------------------------------------------------------
-- Spooling logic
function ChatThrottleLib:Enqueue(prioname, pipename, msg)
local Prio = self.Prio[prioname]
local pipe = Prio.ByName[pipename]
if not pipe then
self.Frame:Show()
pipe = NewPipe()
pipe.name = pipename
Prio.ByName[pipename] = pipe
Prio.Ring:Add(pipe)
end
pipe[#pipe + 1] = msg
self.bQueueing = true
end
function ChatThrottleLib:SendChatMessage(prio, prefix, text, chattype, language, destination, queueName, callbackFn, callbackArg)
if not self or not prio or not prefix or not text or not self.Prio[prio] then
error('Usage: ChatThrottleLib:SendChatMessage("{BULK||NORMAL||ALERT}", "prefix", "text"[, "chattype"[, "language"[, "destination"]]]', 2)
end
if callbackFn and type(callbackFn)~="function" then
error('ChatThrottleLib:ChatMessage(): callbackFn: expected function, got '..type(callbackFn), 2)
end
local nSize = text:len()
if nSize>255 then
error("ChatThrottleLib:SendChatMessage(): message length cannot exceed 255 bytes", 2)
end
nSize = nSize + self.MSG_OVERHEAD
-- Check if there's room in the global available bandwidth gauge to send directly
if not self.bQueueing and nSize < self:UpdateAvail() then
self.avail = self.avail - nSize
bMyTraffic = true
_G.SendChatMessage(text, chattype, language, destination)
bMyTraffic = false
self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize
if callbackFn then
callbackFn (callbackArg)
end
return
end
-- Message needs to be queued
local msg = NewMsg()
msg.f = _G.SendChatMessage
msg[1] = text
msg[2] = chattype or "SAY"
msg[3] = language
msg[4] = destination
msg.n = 4
msg.nSize = nSize
msg.callbackFn = callbackFn
msg.callbackArg = callbackArg
self:Enqueue(prio, queueName or (prefix..(chattype or "SAY")..(destination or "")), msg)
end
function ChatThrottleLib:SendAddonMessage(prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg)
if not self or not prio or not prefix or not text or not chattype or not self.Prio[prio] then
error('Usage: ChatThrottleLib:SendAddonMessage("{BULK||NORMAL||ALERT}", "prefix", "text", "chattype"[, "target"])', 2)
end
if callbackFn and type(callbackFn)~="function" then
error('ChatThrottleLib:SendAddonMessage(): callbackFn: expected function, got '..type(callbackFn), 2)
end
local nSize = prefix:len() + 1 + text:len();
if nSize>255 then
error("ChatThrottleLib:SendAddonMessage(): prefix + message length cannot exceed 254 bytes", 2)
end
nSize = nSize + self.MSG_OVERHEAD;
-- Check if there's room in the global available bandwidth gauge to send directly
if not self.bQueueing and nSize < self:UpdateAvail() then
self.avail = self.avail - nSize
bMyTraffic = true
_G.SendAddonMessage(prefix, text, chattype, target)
bMyTraffic = false
self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize
if callbackFn then
callbackFn (callbackArg)
end
return
end
-- Message needs to be queued
local msg = NewMsg()
msg.f = _G.SendAddonMessage
msg[1] = prefix
msg[2] = text
msg[3] = chattype
msg[4] = target
msg.n = (target~=nil) and 4 or 3;
msg.nSize = nSize
msg.callbackFn = callbackFn
msg.callbackArg = callbackArg
self:Enqueue(prio, queueName or (prefix..chattype..(target or "")), msg)
end
-----------------------------------------------------------------------
-- Get the ball rolling!
ChatThrottleLib:Init()
--[[ WoWBench debugging snippet
if(WOWB_VER) then
local function SayTimer()
print("SAY: "..GetTime().." "..arg1)
end
ChatThrottleLib.Frame:SetScript("OnEvent", SayTimer)
ChatThrottleLib.Frame:RegisterEvent("CHAT_MSG_SAY")
end
]]
+728
View File
@@ -0,0 +1,728 @@
--- **AceDB-3.0** manages the SavedVariables of your addon.
-- It offers profile management, smart defaults and namespaces for modules.\\
-- Data can be saved in different data-types, depending on its intended usage.
-- The most common data-type is the `profile` type, which allows the user to choose
-- the active profile, and manage the profiles of all of his characters.\\
-- The following data types are available:
-- * **char** Character-specific data. Every character has its own database.
-- * **realm** Realm-specific data. All of the players characters on the same realm share this database.
-- * **class** Class-specific data. All of the players characters of the same class share this database.
-- * **race** Race-specific data. All of the players characters of the same race share this database.
-- * **faction** Faction-specific data. All of the players characters of the same faction share this database.
-- * **factionrealm** Faction and realm specific data. All of the players characters on the same realm and of the same faction share this database.
-- * **global** Global Data. All characters on the same account share this database.
-- * **profile** Profile-specific data. All characters using the same profile share this database. The user can control which profile should be used.
--
-- Creating a new Database using the `:New` function will return a new DBObject. A database will inherit all functions
-- of the DBObjectLib listed here. \\
-- If you create a new namespaced child-database (`:RegisterNamespace`), you'll get a DBObject as well, but note
-- that the child-databases cannot individually change their profile, and are linked to their parents profile - and because of that,
-- the profile related APIs are not available. Only `:RegisterDefaults` and `:ResetProfile` are available on child-databases.
--
-- For more details on how to use AceDB-3.0, see the [[AceDB-3.0 Tutorial]].
--
-- You may also be interested in [[libdualspec-1-0|LibDualSpec-1.0]] to do profile switching automatically when switching specs.
--
-- @usage
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("DBExample")
--
-- -- declare defaults to be used in the DB
-- local defaults = {
-- profile = {
-- setting = true,
-- }
-- }
--
-- function MyAddon:OnInitialize()
-- -- Assuming the .toc says ## SavedVariables: MyAddonDB
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
-- end
-- @class file
-- @name AceDB-3.0.lua
-- @release $Id: AceDB-3.0.lua 940 2010-06-19 08:01:47Z nevcairiel $
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 21
local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
if not AceDB then return end -- No upgrade needed
-- Lua APIs
local type, pairs, next, error = type, pairs, next, error
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
-- WoW APIs
local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub
AceDB.db_registry = AceDB.db_registry or {}
AceDB.frame = AceDB.frame or CreateFrame("Frame")
local CallbackHandler
local CallbackDummy = { Fire = function() end }
local DBObjectLib = {}
--[[-------------------------------------------------------------------------
AceDB Utility Functions
---------------------------------------------------------------------------]]
-- Simple shallow copy for copying defaults
local function copyTable(src, dest)
if type(dest) ~= "table" then dest = {} end
if type(src) == "table" then
for k,v in pairs(src) do
if type(v) == "table" then
-- try to index the key first so that the metatable creates the defaults, if set, and use that table
v = copyTable(v, dest[k])
end
dest[k] = v
end
end
return dest
end
-- Called to add defaults to a section of the database
--
-- When a ["*"] default section is indexed with a new key, a table is returned
-- and set in the host table. These tables must be cleaned up by removeDefaults
-- in order to ensure we don't write empty default tables.
local function copyDefaults(dest, src)
-- this happens if some value in the SV overwrites our default value with a non-table
--if type(dest) ~= "table" then return end
for k, v in pairs(src) do
if k == "*" or k == "**" then
if type(v) == "table" then
-- This is a metatable used for table defaults
local mt = {
-- This handles the lookup and creation of new subtables
__index = function(t,k)
if k == nil then return nil end
local tbl = {}
copyDefaults(tbl, v)
rawset(t, k, tbl)
return tbl
end,
}
setmetatable(dest, mt)
-- handle already existing tables in the SV
for dk, dv in pairs(dest) do
if not rawget(src, dk) and type(dv) == "table" then
copyDefaults(dv, v)
end
end
else
-- Values are not tables, so this is just a simple return
local mt = {__index = function(t,k) return k~=nil and v or nil end}
setmetatable(dest, mt)
end
elseif type(v) == "table" then
if not rawget(dest, k) then rawset(dest, k, {}) end
if type(dest[k]) == "table" then
copyDefaults(dest[k], v)
if src['**'] then
copyDefaults(dest[k], src['**'])
end
end
else
if rawget(dest, k) == nil then
rawset(dest, k, v)
end
end
end
end
-- Called to remove all defaults in the default table from the database
local function removeDefaults(db, defaults, blocker)
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
setmetatable(db, nil)
-- loop through the defaults and remove their content
for k,v in pairs(defaults) do
if k == "*" or k == "**" then
if type(v) == "table" then
-- Loop through all the actual k,v pairs and remove
for key, value in pairs(db) do
if type(value) == "table" then
-- if the key was not explicitly specified in the defaults table, just strip everything from * and ** tables
if defaults[key] == nil and (not blocker or blocker[key] == nil) then
removeDefaults(value, v)
-- if the table is empty afterwards, remove it
if next(value) == nil then
db[key] = nil
end
-- if it was specified, only strip ** content, but block values which were set in the key table
elseif k == "**" then
removeDefaults(value, v, defaults[key])
end
end
end
elseif k == "*" then
-- check for non-table default
for key, value in pairs(db) do
if defaults[key] == nil and v == value then
db[key] = nil
end
end
end
elseif type(v) == "table" and type(db[k]) == "table" then
-- if a blocker was set, dive into it, to allow multi-level defaults
removeDefaults(db[k], v, blocker and blocker[k])
if next(db[k]) == nil then
db[k] = nil
end
else
-- check if the current value matches the default, and that its not blocked by another defaults table
if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
db[k] = nil
end
end
end
end
-- This is called when a table section is first accessed, to set up the defaults
local function initSection(db, section, svstore, key, defaults)
local sv = rawget(db, "sv")
local tableCreated
if not sv[svstore] then sv[svstore] = {} end
if not sv[svstore][key] then
sv[svstore][key] = {}
tableCreated = true
end
local tbl = sv[svstore][key]
if defaults then
copyDefaults(tbl, defaults)
end
rawset(db, section, tbl)
return tableCreated, tbl
end
-- Metatable to handle the dynamic creation of sections and copying of sections.
local dbmt = {
__index = function(t, section)
local keys = rawget(t, "keys")
local key = keys[section]
if key then
local defaultTbl = rawget(t, "defaults")
local defaults = defaultTbl and defaultTbl[section]
if section == "profile" then
local new = initSection(t, section, "profiles", key, defaults)
if new then
-- Callback: OnNewProfile, database, newProfileKey
t.callbacks:Fire("OnNewProfile", t, key)
end
elseif section == "profiles" then
local sv = rawget(t, "sv")
if not sv.profiles then sv.profiles = {} end
rawset(t, "profiles", sv.profiles)
elseif section == "global" then
local sv = rawget(t, "sv")
if not sv.global then sv.global = {} end
if defaults then
copyDefaults(sv.global, defaults)
end
rawset(t, section, sv.global)
else
initSection(t, section, section, key, defaults)
end
end
return rawget(t, section)
end
}
local function validateDefaults(defaults, keyTbl, offset)
if not defaults then return end
offset = offset or 0
for k in pairs(defaults) do
if not keyTbl[k] or k == "profiles" then
error(("Usage: AceDBObject:RegisterDefaults(defaults): '%s' is not a valid datatype."):format(k), 3 + offset)
end
end
end
local preserve_keys = {
["callbacks"] = true,
["RegisterCallback"] = true,
["UnregisterCallback"] = true,
["UnregisterAllCallbacks"] = true,
["children"] = true,
}
local realmKey = GetRealmName()
local charKey = UnitName("player") .. " - " .. realmKey
local _, classKey = UnitClass("player")
local _, raceKey = UnitRace("player")
local factionKey = UnitFactionGroup("player")
local factionrealmKey = factionKey .. " - " .. realmKey
-- Actual database initialization function
local function initdb(sv, defaults, defaultProfile, olddb, parent)
-- Generate the database keys for each section
-- map "true" to our "Default" profile
if defaultProfile == true then defaultProfile = "Default" end
local profileKey
if not parent then
-- Make a container for profile keys
if not sv.profileKeys then sv.profileKeys = {} end
-- Try to get the profile selected from the char db
profileKey = sv.profileKeys[charKey] or defaultProfile or charKey
-- save the selected profile for later
sv.profileKeys[charKey] = profileKey
else
-- Use the profile of the parents DB
profileKey = parent.keys.profile or defaultProfile or charKey
-- clear the profileKeys in the DB, namespaces don't need to store them
sv.profileKeys = nil
end
-- This table contains keys that enable the dynamic creation
-- of each section of the table. The 'global' and 'profiles'
-- have a key of true, since they are handled in a special case
local keyTbl= {
["char"] = charKey,
["realm"] = realmKey,
["class"] = classKey,
["race"] = raceKey,
["faction"] = factionKey,
["factionrealm"] = factionrealmKey,
["profile"] = profileKey,
["global"] = true,
["profiles"] = true,
}
validateDefaults(defaults, keyTbl, 1)
-- This allows us to use this function to reset an entire database
-- Clear out the old database
if olddb then
for k,v in pairs(olddb) do if not preserve_keys[k] then olddb[k] = nil end end
end
-- Give this database the metatable so it initializes dynamically
local db = setmetatable(olddb or {}, dbmt)
if not rawget(db, "callbacks") then
-- try to load CallbackHandler-1.0 if it loaded after our library
if not CallbackHandler then CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0", true) end
db.callbacks = CallbackHandler and CallbackHandler:New(db) or CallbackDummy
end
-- Copy methods locally into the database object, to avoid hitting
-- the metatable when calling methods
if not parent then
for name, func in pairs(DBObjectLib) do
db[name] = func
end
else
-- hack this one in
db.RegisterDefaults = DBObjectLib.RegisterDefaults
db.ResetProfile = DBObjectLib.ResetProfile
end
-- Set some properties in the database object
db.profiles = sv.profiles
db.keys = keyTbl
db.sv = sv
--db.sv_name = name
db.defaults = defaults
db.parent = parent
-- store the DB in the registry
AceDB.db_registry[db] = true
return db
end
-- handle PLAYER_LOGOUT
-- strip all defaults from all databases
-- and cleans up empty sections
local function logoutHandler(frame, event)
if event == "PLAYER_LOGOUT" then
for db in pairs(AceDB.db_registry) do
db.callbacks:Fire("OnDatabaseShutdown", db)
db:RegisterDefaults(nil)
-- cleanup sections that are empty without defaults
local sv = rawget(db, "sv")
for section in pairs(db.keys) do
if rawget(sv, section) then
-- global is special, all other sections have sub-entrys
-- also don't delete empty profiles on main dbs, only on namespaces
if section ~= "global" and (section ~= "profiles" or rawget(db, "parent")) then
for key in pairs(sv[section]) do
if not next(sv[section][key]) then
sv[section][key] = nil
end
end
end
if not next(sv[section]) then
sv[section] = nil
end
end
end
end
end
end
AceDB.frame:RegisterEvent("PLAYER_LOGOUT")
AceDB.frame:SetScript("OnEvent", logoutHandler)
--[[-------------------------------------------------------------------------
AceDB Object Method Definitions
---------------------------------------------------------------------------]]
--- Sets the defaults table for the given database object by clearing any
-- that are currently set, and then setting the new defaults.
-- @param defaults A table of defaults for this database
function DBObjectLib:RegisterDefaults(defaults)
if defaults and type(defaults) ~= "table" then
error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2)
end
validateDefaults(defaults, self.keys)
-- Remove any currently set defaults
if self.defaults then
for section,key in pairs(self.keys) do
if self.defaults[section] and rawget(self, section) then
removeDefaults(self[section], self.defaults[section])
end
end
end
-- Set the DBObject.defaults table
self.defaults = defaults
-- Copy in any defaults, only touching those sections already created
if defaults then
for section,key in pairs(self.keys) do
if defaults[section] and rawget(self, section) then
copyDefaults(self[section], defaults[section])
end
end
end
end
--- Changes the profile of the database and all of it's namespaces to the
-- supplied named profile
-- @param name The name of the profile to set as the current profile
function DBObjectLib:SetProfile(name)
if type(name) ~= "string" then
error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2)
end
-- changing to the same profile, dont do anything
if name == self.keys.profile then return end
local oldProfile = self.profile
local defaults = self.defaults and self.defaults.profile
-- Callback: OnProfileShutdown, database
self.callbacks:Fire("OnProfileShutdown", self)
if oldProfile and defaults then
-- Remove the defaults from the old profile
removeDefaults(oldProfile, defaults)
end
self.profile = nil
self.keys["profile"] = name
-- if the storage exists, save the new profile
-- this won't exist on namespaces.
if self.sv.profileKeys then
self.sv.profileKeys[charKey] = name
end
-- populate to child namespaces
if self.children then
for _, db in pairs(self.children) do
DBObjectLib.SetProfile(db, name)
end
end
-- Callback: OnProfileChanged, database, newProfileKey
self.callbacks:Fire("OnProfileChanged", self, name)
end
--- Returns a table with the names of the existing profiles in the database.
-- You can optionally supply a table to re-use for this purpose.
-- @param tbl A table to store the profile names in (optional)
function DBObjectLib:GetProfiles(tbl)
if tbl and type(tbl) ~= "table" then
error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2)
end
-- Clear the container table
if tbl then
for k,v in pairs(tbl) do tbl[k] = nil end
else
tbl = {}
end
local curProfile = self.keys.profile
local i = 0
for profileKey in pairs(self.profiles) do
i = i + 1
tbl[i] = profileKey
if curProfile and profileKey == curProfile then curProfile = nil end
end
-- Add the current profile, if it hasn't been created yet
if curProfile then
i = i + 1
tbl[i] = curProfile
end
return tbl, i
end
--- Returns the current profile name used by the database
function DBObjectLib:GetCurrentProfile()
return self.keys.profile
end
--- Deletes a named profile. This profile must not be the active profile.
-- @param name The name of the profile to be deleted
-- @param silent If true, do not raise an error when the profile does not exist
function DBObjectLib:DeleteProfile(name, silent)
if type(name) ~= "string" then
error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2)
end
if self.keys.profile == name then
error("Cannot delete the active profile in an AceDBObject.", 2)
end
if not rawget(self.profiles, name) and not silent then
error("Cannot delete profile '" .. name .. "'. It does not exist.", 2)
end
self.profiles[name] = nil
-- populate to child namespaces
if self.children then
for _, db in pairs(self.children) do
DBObjectLib.DeleteProfile(db, name, true)
end
end
-- Callback: OnProfileDeleted, database, profileKey
self.callbacks:Fire("OnProfileDeleted", self, name)
end
--- Copies a named profile into the current profile, overwriting any conflicting
-- settings.
-- @param name The name of the profile to be copied into the current profile
-- @param silent If true, do not raise an error when the profile does not exist
function DBObjectLib:CopyProfile(name, silent)
if type(name) ~= "string" then
error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2)
end
if name == self.keys.profile then
error("Cannot have the same source and destination profiles.", 2)
end
if not rawget(self.profiles, name) and not silent then
error("Cannot copy profile '" .. name .. "'. It does not exist.", 2)
end
-- Reset the profile before copying
DBObjectLib.ResetProfile(self, nil, true)
local profile = self.profile
local source = self.profiles[name]
copyTable(source, profile)
-- populate to child namespaces
if self.children then
for _, db in pairs(self.children) do
DBObjectLib.CopyProfile(db, name, true)
end
end
-- Callback: OnProfileCopied, database, sourceProfileKey
self.callbacks:Fire("OnProfileCopied", self, name)
end
--- Resets the current profile to the default values (if specified).
-- @param noChildren if set to true, the reset will not be populated to the child namespaces of this DB object
-- @param noCallbacks if set to true, won't fire the OnProfileReset callback
function DBObjectLib:ResetProfile(noChildren, noCallbacks)
local profile = self.profile
for k,v in pairs(profile) do
profile[k] = nil
end
local defaults = self.defaults and self.defaults.profile
if defaults then
copyDefaults(profile, defaults)
end
-- populate to child namespaces
if self.children and not noChildren then
for _, db in pairs(self.children) do
DBObjectLib.ResetProfile(db, nil, noCallbacks)
end
end
-- Callback: OnProfileReset, database
if not noCallbacks then
self.callbacks:Fire("OnProfileReset", self)
end
end
--- Resets the entire database, using the string defaultProfile as the new default
-- profile.
-- @param defaultProfile The profile name to use as the default
function DBObjectLib:ResetDB(defaultProfile)
if defaultProfile and type(defaultProfile) ~= "string" then
error("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected.", 2)
end
local sv = self.sv
for k,v in pairs(sv) do
sv[k] = nil
end
local parent = self.parent
initdb(sv, self.defaults, defaultProfile, self)
-- fix the child namespaces
if self.children then
if not sv.namespaces then sv.namespaces = {} end
for name, db in pairs(self.children) do
if not sv.namespaces[name] then sv.namespaces[name] = {} end
initdb(sv.namespaces[name], db.defaults, self.keys.profile, db, self)
end
end
-- Callback: OnDatabaseReset, database
self.callbacks:Fire("OnDatabaseReset", self)
-- Callback: OnProfileChanged, database, profileKey
self.callbacks:Fire("OnProfileChanged", self, self.keys["profile"])
return self
end
--- Creates a new database namespace, directly tied to the database. This
-- is a full scale database in it's own rights other than the fact that
-- it cannot control its profile individually
-- @param name The name of the new namespace
-- @param defaults A table of values to use as defaults
function DBObjectLib:RegisterNamespace(name, defaults)
if type(name) ~= "string" then
error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2)
end
if defaults and type(defaults) ~= "table" then
error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2)
end
if self.children and self.children[name] then
error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2)
end
local sv = self.sv
if not sv.namespaces then sv.namespaces = {} end
if not sv.namespaces[name] then
sv.namespaces[name] = {}
end
local newDB = initdb(sv.namespaces[name], defaults, self.keys.profile, nil, self)
if not self.children then self.children = {} end
self.children[name] = newDB
return newDB
end
--- Returns an already existing namespace from the database object.
-- @param name The name of the new namespace
-- @param silent if true, the addon is optional, silently return nil if its not found
-- @usage
-- local namespace = self.db:GetNamespace('namespace')
-- @return the namespace object if found
function DBObjectLib:GetNamespace(name, silent)
if type(name) ~= "string" then
error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2)
end
if not silent and not (self.children and self.children[name]) then
error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2)
end
if not self.children then self.children = {} end
return self.children[name]
end
--[[-------------------------------------------------------------------------
AceDB Exposed Methods
---------------------------------------------------------------------------]]
--- Creates a new database object that can be used to handle database settings and profiles.
-- By default, an empty DB is created, using a character specific profile.
--
-- You can override the default profile used by passing any profile name as the third argument,
-- or by passing //true// as the third argument to use a globally shared profile called "Default".
--
-- Note that there is no token replacement in the default profile name, passing a defaultProfile as "char"
-- will use a profile named "char", and not a character-specific profile.
-- @param tbl The name of variable, or table to use for the database
-- @param defaults A table of database defaults
-- @param defaultProfile The name of the default profile. If not set, a character specific profile will be used as the default.
-- You can also pass //true// to use a shared global profile called "Default".
-- @usage
-- -- Create an empty DB using a character-specific default profile.
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB")
-- @usage
-- -- Create a DB using defaults and using a shared default profile
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
function AceDB:New(tbl, defaults, defaultProfile)
if type(tbl) == "string" then
local name = tbl
tbl = _G[name]
if not tbl then
tbl = {}
_G[name] = tbl
end
end
if type(tbl) ~= "table" then
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2)
end
if defaults and type(defaults) ~= "table" then
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2)
end
if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2)
end
return initdb(tbl, defaults, defaultProfile)
end
-- upgrade existing databases
for db in pairs(AceDB.db_registry) do
if not db.parent then
for name,func in pairs(DBObjectLib) do
db[name] = func
end
else
db.RegisterDefaults = DBObjectLib.RegisterDefaults
db.ResetProfile = DBObjectLib.ResetProfile
end
end
+4
View File
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceDB-3.0.lua"/>
</Ui>
@@ -0,0 +1,126 @@
--- AceEvent-3.0 provides event registration and secure dispatching.
-- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around
-- CallbackHandler, and dispatches all game events or addon message to the registrees.
--
-- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
-- and can be accessed directly, without having to explicitly call AceEvent itself.\\
-- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you
-- make into AceEvent.
-- @class file
-- @name AceEvent-3.0
-- @release $Id: AceEvent-3.0.lua 877 2009-11-02 15:56:50Z nevcairiel $
local MAJOR, MINOR = "AceEvent-3.0", 3
local AceEvent = LibStub:NewLibrary(MAJOR, MINOR)
if not AceEvent then return end
-- Lua APIs
local pairs = pairs
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
AceEvent.frame = AceEvent.frame or CreateFrame("Frame", "AceEvent30Frame") -- our event frame
AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib
-- APIs and registry for blizzard events, using CallbackHandler lib
if not AceEvent.events then
AceEvent.events = CallbackHandler:New(AceEvent,
"RegisterEvent", "UnregisterEvent", "UnregisterAllEvents")
end
function AceEvent.events:OnUsed(target, eventname)
AceEvent.frame:RegisterEvent(eventname)
end
function AceEvent.events:OnUnused(target, eventname)
AceEvent.frame:UnregisterEvent(eventname)
end
-- APIs and registry for IPC messages, using CallbackHandler lib
if not AceEvent.messages then
AceEvent.messages = CallbackHandler:New(AceEvent,
"RegisterMessage", "UnregisterMessage", "UnregisterAllMessages"
)
AceEvent.SendMessage = AceEvent.messages.Fire
end
--- embedding and embed handling
local mixins = {
"RegisterEvent", "UnregisterEvent",
"RegisterMessage", "UnregisterMessage",
"SendMessage",
"UnregisterAllEvents", "UnregisterAllMessages",
}
--- Register for a Blizzard Event.
-- The callback will always be called with the event as the first argument, and if supplied, the `arg` as second argument.
-- Any arguments to the event will be passed on after that.
-- @name AceEvent:RegisterEvent
-- @class function
-- @paramsig event[, callback [, arg]]
-- @param event The event to register for
-- @param callback The callback function to call when the event is triggered (funcref or method, defaults to a method with the event name)
-- @param arg An optional argument to pass to the callback function
--- Unregister an event.
-- @name AceEvent:UnregisterEvent
-- @class function
-- @paramsig event
-- @param event The event to unregister
--- Register for a custom AceEvent-internal message.
-- The callback will always be called with the event as the first argument, and if supplied, the `arg` as second argument.
-- Any arguments to the event will be passed on after that.
-- @name AceEvent:RegisterMessage
-- @class function
-- @paramsig message[, callback [, arg]]
-- @param message The message to register for
-- @param callback The callback function to call when the message is triggered (funcref or method, defaults to a method with the event name)
-- @param arg An optional argument to pass to the callback function
--- Unregister a message
-- @name AceEvent:UnregisterMessage
-- @class function
-- @paramsig message
-- @param message The message to unregister
--- Send a message over the AceEvent-3.0 internal message system to other addons registered for this message.
-- @name AceEvent:SendMessage
-- @class function
-- @paramsig message, ...
-- @param message The message to send
-- @param ... Any arguments to the message
-- Embeds AceEvent into the target object making the functions from the mixins list available on target:..
-- @param target target object to embed AceEvent in
function AceEvent:Embed(target)
for k, v in pairs(mixins) do
target[v] = self[v]
end
self.embeds[target] = true
return target
end
-- AceEvent:OnEmbedDisable( target )
-- target (object) - target object that is being disabled
--
-- Unregister all events messages etc when the target disables.
-- this method should be called by the target manually or by an addon framework
function AceEvent:OnEmbedDisable(target)
target:UnregisterAllEvents()
target:UnregisterAllMessages()
end
-- Script to fire blizzard events into the event listeners
local events = AceEvent.events
AceEvent.frame:SetScript("OnEvent", function(this, event, ...)
events:Fire(event, ...)
end)
--- Finally: upgrade our old embeds
for target, v in pairs(AceEvent.embeds) do
AceEvent:Embed(target)
end
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceEvent-3.0.lua"/>
</Ui>
+799
View File
@@ -0,0 +1,799 @@
--[[
Name: AceLibrary
Revision: $Rev: 1091 $
Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
Inspired By: Iriel (iriel@vigilance-committee.org)
Tekkub (tekkub@gmail.com)
Revision: $Rev: 1091 $
Website: http://www.wowace.com/
Documentation: http://www.wowace.com/index.php/AceLibrary
SVN: http://svn.wowace.com/wowace/trunk/Ace2/AceLibrary
Description: Versioning library to handle other library instances, upgrading,
and proper access.
It also provides a base for libraries to work off of, providing
proper error tools. It is handy because all the errors occur in the
file that called it, not in the library file itself.
Dependencies: None
License: LGPL v2.1
]]
local ACELIBRARY_MAJOR = "AceLibrary"
local ACELIBRARY_MINOR = 90000 + tonumber(("$Revision: 1091 $"):match("(%d+)"))
local _G = getfenv(0)
local previous = _G[ACELIBRARY_MAJOR]
if previous and not previous:IsNewVersion(ACELIBRARY_MAJOR, ACELIBRARY_MINOR) then return end
do
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain -- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
end
local LibStub = _G.LibStub
-- If you don't want AceLibrary to enable libraries that are LoadOnDemand but
-- disabled in the addon screen, set this to true.
local DONT_ENABLE_LIBRARIES = nil
local function safecall(func,...)
local success, err = pcall(func,...)
if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("\n(.-: )in.-\n") or "") .. err) end
end
-- @table AceLibrary
-- @brief System to handle all versioning of libraries.
local AceLibrary = {}
local AceLibrary_mt = {}
setmetatable(AceLibrary, AceLibrary_mt)
local function error(self, message, ...)
if type(self) ~= "table" then
return _G.error(("Bad argument #1 to `error' (table expected, got %s)"):format(type(self)), 2)
end
local stack = debugstack()
if not message then
local second = stack:match("\n(.-)\n")
message = "error raised! " .. second
else
local arg = { ... } -- not worried about table creation, as errors don't happen often
for i = 1, #arg do
arg[i] = tostring(arg[i])
end
for i = 1, 10 do
table.insert(arg, "nil")
end
message = message:format(unpack(arg))
end
if getmetatable(self) and getmetatable(self).__tostring then
message = ("%s: %s"):format(tostring(self), message)
elseif type(rawget(self, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self:GetLibraryVersion()) then
message = ("%s: %s"):format(self:GetLibraryVersion(), message)
elseif type(rawget(self, 'class')) == "table" and type(rawget(self.class, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self.class:GetLibraryVersion()) then
message = ("%s: %s"):format(self.class:GetLibraryVersion(), message)
end
local first = stack:gsub("\n.*", "")
local file = first:gsub(".*\\(.*).lua:%d+: .*", "%1")
file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
local i = 0
for s in stack:gmatch("\n([^\n]*)") do
i = i + 1
if not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then
file = s:gsub("^.*\\(.*).lua:%d+: .*", "%1")
file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
break
end
end
local j = 0
for s in stack:gmatch("\n([^\n]*)") do
j = j + 1
if j > i and not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then
return _G.error(message, j+1)
end
end
return _G.error(message, 2)
end
local type = type
local function argCheck(self, arg, num, kind, kind2, kind3, kind4, kind5)
if type(num) ~= "number" then
return error(self, "Bad argument #3 to `argCheck' (number expected, got %s)", type(num))
elseif type(kind) ~= "string" then
return error(self, "Bad argument #4 to `argCheck' (string expected, got %s)", type(kind))
end
arg = type(arg)
if arg ~= kind and arg ~= kind2 and arg ~= kind3 and arg ~= kind4 and arg ~= kind5 then
local stack = debugstack()
local func = stack:match("`argCheck'.-([`<].-['>])")
if not func then
func = stack:match("([`<].-['>])")
end
if kind5 then
return error(self, "Bad argument #%s to %s (%s, %s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, kind5, arg)
elseif kind4 then
return error(self, "Bad argument #%s to %s (%s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, arg)
elseif kind3 then
return error(self, "Bad argument #%s to %s (%s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, arg)
elseif kind2 then
return error(self, "Bad argument #%s to %s (%s or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, arg)
else
return error(self, "Bad argument #%s to %s (%s expected, got %s)", tonumber(num) or 0/0, func, kind, arg)
end
end
end
local pcall
do
local function check(self, ret, ...)
if not ret then
local s = ...
return error(self, (s:gsub(".-%.lua:%d-: ", "")))
else
return ...
end
end
function pcall(self, func, ...)
return check(self, _G.pcall(func, ...))
end
end
local recurse = {}
local function addToPositions(t, major)
if not AceLibrary.positions[t] or AceLibrary.positions[t] == major then
rawset(t, recurse, true)
AceLibrary.positions[t] = major
for k,v in pairs(t) do
if type(v) == "table" and not rawget(v, recurse) then
addToPositions(v, major)
end
if type(k) == "table" and not rawget(k, recurse) then
addToPositions(k, major)
end
end
local mt = getmetatable(t)
if mt and not rawget(mt, recurse) then
addToPositions(mt, major)
end
rawset(t, recurse, nil)
end
end
local function svnRevisionToNumber(text)
local kind = type(text)
if kind == "number" or tonumber(text) then
return tonumber(text)
elseif kind == "string" then
if text:find("^%$Revision: (%d+) %$$") then
return tonumber((text:match("^%$Revision: (%d+) %$$")))
elseif text:find("^%$Rev: (%d+) %$$") then
return tonumber((text:match("^%$Rev: (%d+) %$$")))
elseif text:find("^%$LastChangedRevision: (%d+) %$$") then
return tonumber((text:match("^%$LastChangedRevision: (%d+) %$$")))
end
end
return nil
end
local crawlReplace
do
local recurse = {}
local function func(t, to, from)
if recurse[t] then
return
end
recurse[t] = true
local mt = getmetatable(t)
setmetatable(t, nil)
rawset(t, to, rawget(t, from))
rawset(t, from, nil)
for k,v in pairs(t) do
if v == from then
t[k] = to
elseif type(v) == "table" then
if not recurse[v] then
func(v, to, from)
end
end
if type(k) == "table" then
if not recurse[k] then
func(k, to, from)
end
end
end
setmetatable(t, mt)
if mt then
if mt == from then
setmetatable(t, to)
elseif not recurse[mt] then
func(mt, to, from)
end
end
end
function crawlReplace(t, to, from)
func(t, to, from)
for k in pairs(recurse) do
recurse[k] = nil
end
end
end
-- @function destroyTable
-- @brief remove all the contents of a table
-- @param t table to destroy
local function destroyTable(t)
setmetatable(t, nil)
for k,v in pairs(t) do
t[k] = nil
end
end
local function isFrame(frame)
return type(frame) == "table" and type(rawget(frame, 0)) == "userdata" and type(rawget(frame, 'IsFrameType')) == "function" and getmetatable(frame) and type(rawget(getmetatable(frame), '__index')) == "function"
end
-- @function copyTable
-- @brief Create a shallow copy of a table and return it.
-- @param from The table to copy from
-- @return A shallow copy of the table
local function copyTable(from, to)
if not to then
to = {}
end
for k,v in pairs(from) do
to[k] = v
end
setmetatable(to, getmetatable(from))
return to
end
-- @function deepTransfer
-- @brief Fully transfer all data, keeping proper previous table
-- backreferences stable.
-- @param to The table with which data is to be injected into
-- @param from The table whose data will be injected into the first
-- @param saveFields If available, a shallow copy of the basic data is saved
-- in here.
-- @param list The account of table references
-- @param list2 The current status on which tables have been traversed.
local deepTransfer
do
-- @function examine
-- @brief Take account of all the table references to be shared
-- between the to and from tables.
-- @param to The table with which data is to be injected into
-- @param from The table whose data will be injected into the first
-- @param list An account of the table references
local function examine(to, from, list, major)
list[from] = to
for k,v in pairs(from) do
if rawget(to, k) and type(from[k]) == "table" and type(to[k]) == "table" and not list[from[k]] then
if from[k] == to[k] then
list[from[k]] = to[k]
elseif AceLibrary.positions[from[v]] ~= major and AceLibrary.positions[from[v]] then
list[from[k]] = from[k]
elseif not list[from[k]] then
examine(to[k], from[k], list, major)
end
end
end
return list
end
function deepTransfer(to, from, saveFields, major, list, list2)
setmetatable(to, nil)
if not list then
list = {}
list2 = {}
examine(to, from, list, major)
end
list2[to] = to
for k,v in pairs(to) do
if type(rawget(from, k)) ~= "table" or type(v) ~= "table" or isFrame(v) then
if saveFields then
saveFields[k] = v
end
to[k] = nil
elseif v ~= _G then
if saveFields then
saveFields[k] = copyTable(v)
end
end
end
for k in pairs(from) do
if rawget(to, k) and to[k] ~= from[k] and AceLibrary.positions[to[k]] == major and from[k] ~= _G then
if not list2[to[k]] then
deepTransfer(to[k], from[k], nil, major, list, list2)
end
to[k] = list[to[k]] or list2[to[k]]
else
rawset(to, k, from[k])
end
end
setmetatable(to, getmetatable(from))
local mt = getmetatable(to)
if mt then
if list[mt] then
setmetatable(to, list[mt])
elseif mt.__index and list[mt.__index] then
mt.__index = list[mt.__index]
end
end
destroyTable(from)
end
end
local function TryToEnable(addon)
if DONT_ENABLE_LIBRARIES then return end
local isondemand = IsAddOnLoadOnDemand(addon)
if isondemand then
local _, _, _, enabled = GetAddOnInfo(addon)
EnableAddOn(addon)
local _, _, _, _, loadable = GetAddOnInfo(addon)
if not loadable and not enabled then
DisableAddOn(addon)
end
return loadable
end
end
-- @method TryToLoadStandalone
-- @brief Attempt to find and load a standalone version of the requested library
-- @param major A string representing the major version
-- @return If library is found and loaded, true is return. If not loadable, false is returned.
-- If the library has been requested previously, nil is returned.
local function TryToLoadStandalone(major)
if not AceLibrary.scannedlibs then AceLibrary.scannedlibs = {} end
if AceLibrary.scannedlibs[major] then return end
AceLibrary.scannedlibs[major] = true
local name, _, _, enabled, loadable = GetAddOnInfo(major)
loadable = (enabled and loadable) or TryToEnable(name)
local loaded = false
if loadable then
loaded = true
LoadAddOn(name)
end
local field = "X-AceLibrary-" .. major
for i = 1, GetNumAddOns() do
if GetAddOnMetadata(i, field) then
name, _, _, enabled, loadable = GetAddOnInfo(i)
loadable = (enabled and loadable) or TryToEnable(name)
if loadable then
loaded = true
LoadAddOn(name)
end
end
end
return loaded
end
-- @method IsNewVersion
-- @brief Obtain whether the supplied version would be an upgrade to the
-- current version. This allows for bypass code in library
-- declaration.
-- @param major A string representing the major version
-- @param minor An integer or an svn revision string representing the minor version
-- @return whether the supplied version would be newer than what is
-- currently available.
function AceLibrary:IsNewVersion(major, minor)
argCheck(self, major, 2, "string")
TryToLoadStandalone(major)
if type(minor) == "string" then
local m = svnRevisionToNumber(minor)
if m then
minor = m
else
_G.error(("Bad argument #3 to `IsNewVersion'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
end
end
argCheck(self, minor, 3, "number")
local lib, oldMinor = LibStub:GetLibrary(major, true)
if lib then
return oldMinor < minor
end
local data = self.libs[major]
if not data then
return true
end
return data.minor < minor
end
-- @method HasInstance
-- @brief Returns whether an instance exists. This allows for optional support of a library.
-- @param major A string representing the major version.
-- @param minor (optional) An integer or an svn revision string representing the minor version.
-- @return Whether an instance exists.
function AceLibrary:HasInstance(major, minor)
argCheck(self, major, 2, "string")
if minor ~= false then
TryToLoadStandalone(major)
end
local lib, ver = LibStub:GetLibrary(major, true)
if not lib and self.libs[major] then
lib, ver = self.libs[major].instance, self.libs[major].minor
end
if minor then
if type(minor) == "string" then
local m = svnRevisionToNumber(minor)
if m then
minor = m
else
_G.error(("Bad argument #3 to `HasInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
end
end
argCheck(self, minor, 3, "number")
if not lib then
return false
end
return ver == minor
end
return not not lib
end
-- @method GetInstance
-- @brief Returns the library with the given major/minor version.
-- @param major A string representing the major version.
-- @param minor (optional) An integer or an svn revision string representing the minor version.
-- @return The library with the given major/minor version.
function AceLibrary:GetInstance(major, minor)
argCheck(self, major, 2, "string")
if minor ~= false then
TryToLoadStandalone(major)
end
local data, ver = LibStub:GetLibrary(major, true)
if not data then
if self.libs[major] then
data, ver = self.libs[major].instance, self.libs[major].minor
else
_G.error(("Cannot find a library instance of %s."):format(major), 2)
return
end
end
if minor then
if type(minor) == "string" then
local m = svnRevisionToNumber(minor)
if m then
minor = m
else
_G.error(("Bad argument #3 to `GetInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
end
end
argCheck(self, minor, 2, "number")
if ver ~= minor then
_G.error(("Cannot find a library instance of %s, minor version %d."):format(major, minor), 2)
end
end
return data
end
-- Syntax sugar. AceLibrary("FooBar-1.0")
AceLibrary_mt.__call = AceLibrary.GetInstance
local donothing = function() end
local AceEvent
local tmp = {}
-- @method Register
-- @brief Registers a new version of a given library.
-- @param newInstance the library to register
-- @param major the major version of the library
-- @param minor the minor version of the library
-- @param activateFunc (optional) A function to be called when the library is
-- fully activated. Takes the arguments
-- (newInstance [, oldInstance, oldDeactivateFunc]). If
-- oldInstance is given, you should probably call
-- oldDeactivateFunc(oldInstance).
-- @param deactivateFunc (optional) A function to be called by a newer library's
-- activateFunc.
-- @param externalFunc (optional) A function to be called whenever a new
-- library is registered.
function AceLibrary:Register(newInstance, major, minor, activateFunc, deactivateFunc, externalFunc)
argCheck(self, newInstance, 2, "table")
argCheck(self, major, 3, "string")
if major ~= ACELIBRARY_MAJOR then
for k,v in pairs(_G) do
if v == newInstance then
geterrorhandler()((debugstack():match("(.-: )in.-\n") or "") .. ("Cannot register library %q. It is part of the global table in _G[%q]."):format(major, k))
end
end
end
if major ~= ACELIBRARY_MAJOR and not major:find("^[%a%-][%a%d%-]*%-%d+%.%d+$") then
_G.error(string.format("Bad argument #3 to `Register'. Must be in the form of \"Name-1.0\". %q is not appropriate", major), 2)
end
if type(minor) == "string" then
local m = svnRevisionToNumber(minor)
if m then
minor = m
else
_G.error(("Bad argument #4 to `Register'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
end
end
argCheck(self, minor, 4, "number")
if math.floor(minor) ~= minor or minor < 0 then
error(self, "Bad argument #4 to `Register' (integer >= 0 expected, got %s)", minor)
end
argCheck(self, activateFunc, 5, "function", "nil")
argCheck(self, deactivateFunc, 6, "function", "nil")
argCheck(self, externalFunc, 7, "function", "nil")
if not deactivateFunc then
deactivateFunc = donothing
end
local data = self.libs[major]
if not data then
-- This is new
if LibStub:GetLibrary(major, true) then
error(self, "Cannot register library %q. It is already registered with LibStub.", major)
end
local instance = LibStub:NewLibrary(major, minor)
copyTable(newInstance, instance)
crawlReplace(instance, instance, newInstance)
destroyTable(newInstance)
if AceLibrary == newInstance then
self = instance
AceLibrary = instance
end
self.libs[major] = {
instance = instance,
minor = minor,
deactivateFunc = deactivateFunc,
externalFunc = externalFunc,
}
rawset(instance, 'GetLibraryVersion', function(self)
return major, minor
end)
if not rawget(instance, 'error') then
rawset(instance, 'error', error)
end
if not rawget(instance, 'argCheck') then
rawset(instance, 'argCheck', argCheck)
end
if not rawget(instance, 'pcall') then
rawset(instance, 'pcall', pcall)
end
addToPositions(instance, major)
if activateFunc then
safecall(activateFunc, instance, nil, nil) -- no old version, so explicit nil
end
if externalFunc then
for k, data_instance in LibStub:IterateLibraries() do -- all libraries
tmp[k] = data_instance
end
for k, data in pairs(self.libs) do -- Ace libraries which may not have been registered with LibStub
tmp[k] = data.instance
end
for k, data_instance in pairs(tmp) do
if k ~= major then
safecall(externalFunc, instance, k, data_instance)
end
tmp[k] = nil
end
end
for k,data in pairs(self.libs) do -- only Ace libraries
if k ~= major and data.externalFunc then
safecall(data.externalFunc, data.instance, major, instance)
end
end
if major == "AceEvent-2.0" then
AceEvent = instance
end
if AceEvent then
AceEvent.TriggerEvent(self, "AceLibrary_Register", major, instance)
end
return instance
end
if minor <= data.minor then
-- This one is already obsolete, raise an error.
_G.error(("Obsolete library registered. %s is already registered at version %d. You are trying to register version %d. Hint: if not AceLibrary:IsNewVersion(%q, %d) then return end"):format(major, data.minor, minor, major, minor), 2)
return
end
local instance = data.instance
-- This is an update
local oldInstance = {}
local libStubInstance = LibStub:GetLibrary(major, true)
if not libStubInstance then -- non-LibStub AceLibrary registered the library
-- pass
elseif libStubInstance ~= instance then
error(self, "Cannot register library %q. It is already registered with LibStub.", major)
else
LibStub:NewLibrary(major, minor) -- upgrade the minor version
end
addToPositions(newInstance, major)
local isAceLibrary = (AceLibrary == newInstance)
local old_error, old_argCheck, old_pcall
if isAceLibrary then
self = instance
AceLibrary = instance
old_error = instance.error
old_argCheck = instance.argCheck
old_pcall = instance.pcall
self.error = error
self.argCheck = argCheck
self.pcall = pcall
end
deepTransfer(instance, newInstance, oldInstance, major)
crawlReplace(instance, instance, newInstance)
local oldDeactivateFunc = data.deactivateFunc
data.minor = minor
data.deactivateFunc = deactivateFunc
data.externalFunc = externalFunc
rawset(instance, 'GetLibraryVersion', function()
return major, minor
end)
if not rawget(instance, 'error') then
rawset(instance, 'error', error)
end
if not rawget(instance, 'argCheck') then
rawset(instance, 'argCheck', argCheck)
end
if not rawget(instance, 'pcall') then
rawset(instance, 'pcall', pcall)
end
if isAceLibrary then
for _,v in pairs(self.libs) do
local i = type(v) == "table" and v.instance
if type(i) == "table" then
if not rawget(i, 'error') or i.error == old_error then
rawset(i, 'error', error)
end
if not rawget(i, 'argCheck') or i.argCheck == old_argCheck then
rawset(i, 'argCheck', argCheck)
end
if not rawget(i, 'pcall') or i.pcall == old_pcall then
rawset(i, 'pcall', pcall)
end
end
end
end
if activateFunc then
safecall(activateFunc, instance, oldInstance, oldDeactivateFunc)
else
safecall(oldDeactivateFunc, oldInstance)
end
oldInstance = nil
if externalFunc then
for k, data_instance in LibStub:IterateLibraries() do -- all libraries
tmp[k] = data_instance
end
for k, data in pairs(self.libs) do -- Ace libraries which may not have been registered with LibStub
tmp[k] = data.instance
end
for k, data_instance in pairs(tmp) do
if k ~= major then
safecall(externalFunc, instance, k, data_instance)
end
tmp[k] = nil
end
end
return instance
end
function AceLibrary:IterateLibraries()
local t = {}
for major, instance in LibStub:IterateLibraries() do
t[major] = instance
end
for major, data in pairs(self.libs) do
t[major] = data.instance
end
return pairs(t)
end
local function manuallyFinalize(major, instance)
if AceLibrary.libs[major] then
-- don't work on Ace libraries
return
end
local finalizedExternalLibs = AceLibrary.finalizedExternalLibs
if finalizedExternalLibs[major] then
return
end
finalizedExternalLibs[major] = true
for k,data in pairs(AceLibrary.libs) do -- only Ace libraries
if k ~= major and data.externalFunc then
safecall(data.externalFunc, data.instance, major, instance)
end
end
end
-- @function Activate
-- @brief The activateFunc for AceLibrary itself. Called when
-- AceLibrary properly registers.
-- @param self Reference to AceLibrary
-- @param oldLib (optional) Reference to an old version of AceLibrary
-- @param oldDeactivate (optional) Function to deactivate the old lib
local function activate(self, oldLib, oldDeactivate)
AceLibrary = self
if not self.libs then
self.libs = oldLib and oldLib.libs or {}
self.scannedlibs = oldLib and oldLib.scannedlibs or {}
end
if not self.positions then
self.positions = oldLib and oldLib.positions or setmetatable({}, { __mode = "k" })
end
self.finalizedExternalLibs = oldLib and oldLib.finalizedExternalLibs or {}
self.frame = oldLib and oldLib.frame or CreateFrame("Frame")
self.frame:UnregisterAllEvents()
self.frame:RegisterEvent("ADDON_LOADED")
self.frame:SetScript("OnEvent", function()
for major, instance in LibStub:IterateLibraries() do
manuallyFinalize(major, instance)
end
end)
for major, instance in LibStub:IterateLibraries() do
manuallyFinalize(major, instance)
end
-- Expose the library in the global environment
_G[ACELIBRARY_MAJOR] = self
if oldDeactivate then
oldDeactivate(oldLib)
end
end
if not previous then
previous = AceLibrary
end
if not previous.libs then
previous.libs = {}
end
AceLibrary.libs = previous.libs
if not previous.positions then
previous.positions = setmetatable({}, { __mode = "k" })
end
AceLibrary.positions = previous.positions
AceLibrary:Register(AceLibrary, ACELIBRARY_MAJOR, ACELIBRARY_MINOR, activate, nil)
+15
View File
@@ -0,0 +1,15 @@
## Interface: 30300
## X-Curse-Packaged-Version: r1101
## X-Curse-Project-Name: Ace2
## X-Curse-Project-ID: ace2
## X-Curse-Repository-ID: wow/ace2/mainline
## Title: Lib: AceLibrary
## Notes: AddOn development framework
## Author: Ace Development Team
## X-Website: http://www.wowace.com
## X-Category: Library
## X-License: LGPL v2.1 + MIT for AceOO-2.0
AceLibrary.lua
@@ -0,0 +1,136 @@
--- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings.
-- @class file
-- @name AceLocale-3.0
-- @release $Id: AceLocale-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
local MAJOR,MINOR = "AceLocale-3.0", 2
local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceLocale then return end -- no upgrade needed
-- Lua APIs
local assert, tostring, error = assert, tostring, error
local setmetatable, rawset, rawget = setmetatable, rawset, rawget
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GAME_LOCALE, geterrorhandler
local gameLocale = GetLocale()
if gameLocale == "enGB" then
gameLocale = "enUS"
end
AceLocale.apps = AceLocale.apps or {} -- array of ["AppName"]=localetableref
AceLocale.appnames = AceLocale.appnames or {} -- array of [localetableref]="AppName"
-- This metatable is used on all tables returned from GetLocale
local readmeta = {
__index = function(self, key) -- requesting totally unknown entries: fire off a nonbreaking error and return key
rawset(self, key, key) -- only need to see the warning once, really
geterrorhandler()(MAJOR..": "..tostring(AceLocale.appnames[self])..": Missing entry for '"..tostring(key).."'")
return key
end
}
-- This metatable is used on all tables returned from GetLocale if the silent flag is true, it does not issue a warning on unknown keys
local readmetasilent = {
__index = function(self, key) -- requesting totally unknown entries: return key
rawset(self, key, key) -- only need to invoke this function once
return key
end
}
-- Remember the locale table being registered right now (it gets set by :NewLocale())
-- NOTE: Do never try to register 2 locale tables at once and mix their definition.
local registering
-- local assert false function
local assertfalse = function() assert(false) end
-- This metatable proxy is used when registering nondefault locales
local writeproxy = setmetatable({}, {
__newindex = function(self, key, value)
rawset(registering, key, value == true and key or value) -- assigning values: replace 'true' with key string
end,
__index = assertfalse
})
-- This metatable proxy is used when registering the default locale.
-- It refuses to overwrite existing values
-- Reason 1: Allows loading locales in any order
-- Reason 2: If 2 modules have the same string, but only the first one to be
-- loaded has a translation for the current locale, the translation
-- doesn't get overwritten.
--
local writedefaultproxy = setmetatable({}, {
__newindex = function(self, key, value)
if not rawget(registering, key) then
rawset(registering, key, value == true and key or value)
end
end,
__index = assertfalse
})
--- Register a new locale (or extend an existing one) for the specified application.
-- :NewLocale will return a table you can fill your locale into, or nil if the locale isn't needed for the players
-- game locale.
-- @paramsig application, locale[, isDefault[, silent]]
-- @param application Unique name of addon / module
-- @param locale Name of the locale to register, e.g. "enUS", "deDE", etc.
-- @param isDefault If this is the default locale being registered (your addon is written in this language, generally enUS)
-- @param silent If true, the locale will not issue warnings for missing keys. Can only be set on the default locale.
-- @usage
-- -- enUS.lua
-- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "enUS", true)
-- L["string1"] = true
--
-- -- deDE.lua
-- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "deDE")
-- if not L then return end
-- L["string1"] = "Zeichenkette1"
-- @return Locale Table to add localizations to, or nil if the current locale is not required.
function AceLocale:NewLocale(application, locale, isDefault, silent)
if silent and not isDefault then
error("Usage: NewLocale(application, locale[, isDefault[, silent]]): 'silent' can only be specified for the default locale", 2)
end
-- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
-- Ammo: I still think this is a bad idea, for instance an addon that checks for some ingame string will fail, just because some other addon
-- gives the user the illusion that they can run in a different locale? Ditch this whole thing or allow a setting per 'application'. I'm of the
-- opinion to remove this.
local gameLocale = GAME_LOCALE or gameLocale
if locale ~= gameLocale and not isDefault then
return -- nop, we don't need these translations
end
local app = AceLocale.apps[application]
if not app then
app = setmetatable({}, silent and readmetasilent or readmeta)
AceLocale.apps[application] = app
AceLocale.appnames[app] = application
end
registering = app -- remember globally for writeproxy and writedefaultproxy
if isDefault then
return writedefaultproxy
end
return writeproxy
end
--- Returns localizations for the current locale (or default locale if translations are missing).
-- Errors if nothing is registered (spank developer, not just a missing translation)
-- @param application Unique name of addon / module
-- @param silent If true, the locale is optional, silently return nil if it's not found (defaults to false, optional)
-- @return The locale table for the current language.
function AceLocale:GetLocale(application, silent)
if not silent and not AceLocale.apps[application] then
error("Usage: GetLocale(application[, silent]): 'application' - No locales registered for '"..tostring(application).."'", 2)
end
return AceLocale.apps[application]
end
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceLocale-3.0.lua"/>
</Ui>
@@ -0,0 +1,281 @@
--- **AceSerializer-3.0** can serialize any variable (except functions or userdata) into a string format,
-- that can be send over the addon comm channel. AceSerializer was designed to keep all data intact, especially
-- very large numbers or floating point numbers, and table structures. The only caveat currently is, that multiple
-- references to the same table will be send individually.
--
-- **AceSerializer-3.0** can be embeded into your addon, either explicitly by calling AceSerializer:Embed(MyAddon) or by
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
-- and can be accessed directly, without having to explicitly call AceSerializer itself.\\
-- It is recommended to embed AceSerializer, otherwise you'll have to specify a custom `self` on all calls you
-- make into AceSerializer.
-- @class file
-- @name AceSerializer-3.0
-- @release $Id: AceSerializer-3.0.lua 910 2010-02-11 21:54:24Z mikk $
local MAJOR,MINOR = "AceSerializer-3.0", 3
local AceSerializer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceSerializer then return end
-- Lua APIs
local strbyte, strchar, gsub, gmatch, format = string.byte, string.char, string.gsub, string.gmatch, string.format
local assert, error, pcall = assert, error, pcall
local type, tostring, tonumber = type, tostring, tonumber
local pairs, select, frexp = pairs, select, math.frexp
local tconcat = table.concat
-- quick copies of string representations of wonky numbers
local serNaN = tostring(0/0)
local serInf = tostring(1/0)
local serNegInf = tostring(-1/0)
-- Serialization functions
local function SerializeStringHelper(ch) -- Used by SerializeValue for strings
-- We use \126 ("~") as an escape character for all nonprints plus a few more
local n = strbyte(ch)
if n==30 then -- v3 / ticket 115: catch a nonprint that ends up being "~^" when encoded... DOH
return "\126\122"
elseif n<=32 then -- nonprint + space
return "\126"..strchar(n+64)
elseif n==94 then -- value separator
return "\126\125"
elseif n==126 then -- our own escape character
return "\126\124"
elseif n==127 then -- nonprint (DEL)
return "\126\123"
else
assert(false) -- can't be reached if caller uses a sane regex
end
end
local function SerializeValue(v, res, nres)
-- We use "^" as a value separator, followed by one byte for type indicator
local t=type(v)
if t=="string" then -- ^S = string (escaped to remove nonprints, "^"s, etc)
res[nres+1] = "^S"
res[nres+2] = gsub(v,"[%c \94\126\127]", SerializeStringHelper)
nres=nres+2
elseif t=="number" then -- ^N = number (just tostring()ed) or ^F (float components)
local str = tostring(v)
if tonumber(str)==v or str==serNaN or str==serInf or str==serNegInf then
-- translates just fine, transmit as-is
res[nres+1] = "^N"
res[nres+2] = str
nres=nres+2
else
local m,e = frexp(v)
res[nres+1] = "^F"
res[nres+2] = format("%.0f",m*2^53) -- force mantissa to become integer (it's originally 0.5--0.9999)
res[nres+3] = "^f"
res[nres+4] = tostring(e-53) -- adjust exponent to counteract mantissa manipulation
nres=nres+4
end
elseif t=="table" then -- ^T...^t = table (list of key,value pairs)
nres=nres+1
res[nres] = "^T"
for k,v in pairs(v) do
nres = SerializeValue(k, res, nres)
nres = SerializeValue(v, res, nres)
end
nres=nres+1
res[nres] = "^t"
elseif t=="boolean" then -- ^B = true, ^b = false
nres=nres+1
if v then
res[nres] = "^B" -- true
else
res[nres] = "^b" -- false
end
elseif t=="nil" then -- ^Z = nil (zero, "N" was taken :P)
nres=nres+1
res[nres] = "^Z"
else
error(MAJOR..": Cannot serialize a value of type '"..t.."'") -- can't produce error on right level, this is wildly recursive
end
return nres
end
local serializeTbl = { "^1" } -- "^1" = Hi, I'm data serialized by AceSerializer protocol rev 1
--- Serialize the data passed into the function.
-- Takes a list of values (strings, numbers, booleans, nils, tables)
-- and returns it in serialized form (a string).\\
-- May throw errors on invalid data types.
-- @param ... List of values to serialize
-- @return The data in its serialized form (string)
function AceSerializer:Serialize(...)
local nres = 1
for i=1,select("#", ...) do
local v = select(i, ...)
nres = SerializeValue(v, serializeTbl, nres)
end
serializeTbl[nres+1] = "^^" -- "^^" = End of serialized data
return tconcat(serializeTbl, "", 1, nres+1)
end
-- Deserialization functions
local function DeserializeStringHelper(escape)
if escape<"~\122" then
return strchar(strbyte(escape,2,2)-64)
elseif escape=="~\122" then -- v3 / ticket 115: special case encode since 30+64=94 ("^") - OOPS.
return "\030"
elseif escape=="~\123" then
return "\127"
elseif escape=="~\124" then
return "\126"
elseif escape=="~\125" then
return "\94"
end
error("DeserializeStringHelper got called for '"..escape.."'?!?") -- can't be reached unless regex is screwed up
end
local function DeserializeNumberHelper(number)
if number == serNaN then
return 0/0
elseif number == serNegInf then
return -1/0
elseif number == serInf then
return 1/0
else
return tonumber(number)
end
end
-- DeserializeValue: worker function for :Deserialize()
-- It works in two modes:
-- Main (top-level) mode: Deserialize a list of values and return them all
-- Recursive (table) mode: Deserialize only a single value (_may_ of course be another table with lots of subvalues in it)
--
-- The function _always_ works recursively due to having to build a list of values to return
--
-- Callers are expected to pcall(DeserializeValue) to trap errors
local function DeserializeValue(iter,single,ctl,data)
if not single then
ctl,data = iter()
end
if not ctl then
error("Supplied data misses AceSerializer terminator ('^^')")
end
if ctl=="^^" then
-- ignore extraneous data
return
end
local res
if ctl=="^S" then
res = gsub(data, "~.", DeserializeStringHelper)
elseif ctl=="^N" then
res = DeserializeNumberHelper(data)
if not res then
error("Invalid serialized number: '"..tostring(data).."'")
end
elseif ctl=="^F" then -- ^F<mantissa>^f<exponent>
local ctl2,e = iter()
if ctl2~="^f" then
error("Invalid serialized floating-point number, expected '^f', not '"..tostring(ctl2).."'")
end
local m=tonumber(data)
e=tonumber(e)
if not (m and e) then
error("Invalid serialized floating-point number, expected mantissa and exponent, got '"..tostring(m).."' and '"..tostring(e).."'")
end
res = m*(2^e)
elseif ctl=="^B" then -- yeah yeah ignore data portion
res = true
elseif ctl=="^b" then -- yeah yeah ignore data portion
res = false
elseif ctl=="^Z" then -- yeah yeah ignore data portion
res = nil
elseif ctl=="^T" then
-- ignore ^T's data, future extensibility?
res = {}
local k,v
while true do
ctl,data = iter()
if ctl=="^t" then break end -- ignore ^t's data
k = DeserializeValue(iter,true,ctl,data)
if k==nil then
error("Invalid AceSerializer table format (no table end marker)")
end
ctl,data = iter()
v = DeserializeValue(iter,true,ctl,data)
if v==nil then
error("Invalid AceSerializer table format (no table end marker)")
end
res[k]=v
end
else
error("Invalid AceSerializer control code '"..ctl.."'")
end
if not single then
return res,DeserializeValue(iter)
else
return res
end
end
--- Deserializes the data into its original values.
-- Accepts serialized data, ignoring all control characters and whitespace.
-- @param str The serialized data (from :Serialize)
-- @return true followed by a list of values, OR false followed by an error message
function AceSerializer:Deserialize(str)
str = gsub(str, "[%c ]", "") -- ignore all control characters; nice for embedding in email and stuff
local iter = gmatch(str, "(^.)([^^]*)") -- Any ^x followed by string of non-^
local ctl,data = iter()
if not ctl or ctl~="^1" then
-- we purposefully ignore the data portion of the start code, it can be used as an extension mechanism
return false, "Supplied data is not AceSerializer data (rev 1)"
end
return pcall(DeserializeValue, iter)
end
----------------------------------------
-- Base library stuff
----------------------------------------
AceSerializer.internals = { -- for test scripts
SerializeValue = SerializeValue,
SerializeStringHelper = SerializeStringHelper,
}
local mixins = {
"Serialize",
"Deserialize",
}
AceSerializer.embeds = AceSerializer.embeds or {}
function AceSerializer:Embed(target)
for k, v in pairs(mixins) do
target[v] = self[v]
end
self.embeds[target] = true
return target
end
-- Update embeds
for target, v in pairs(AceSerializer.embeds) do
AceSerializer:Embed(target)
end
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceSerializer-3.0.lua"/>
</Ui>
@@ -0,0 +1,473 @@
--- **AceTimer-3.0** provides a central facility for registering timers.
-- AceTimer supports one-shot timers and repeating timers. All timers are stored in an efficient
-- data structure that allows easy dispatching and fast rescheduling. Timers can be registered, rescheduled
-- or canceled at any time, even from within a running timer, without conflict or large overhead.\\
-- AceTimer is currently limited to firing timers at a frequency of 0.1s. This constant may change
-- in the future, but for now it seemed like a good compromise in efficiency and accuracy.
--
-- All `:Schedule` functions will return a handle to the current timer, which you will need to store if you
-- need to cancel or reschedule the timer you just registered.
--
-- **AceTimer-3.0** can be embeded into your addon, either explicitly by calling AceTimer:Embed(MyAddon) or by
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
-- and can be accessed directly, without having to explicitly call AceTimer itself.\\
-- It is recommended to embed AceTimer, otherwise you'll have to specify a custom `self` on all calls you
-- make into AceTimer.
-- @class file
-- @name AceTimer-3.0
-- @release $Id: AceTimer-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
--[[
Basic assumptions:
* In a typical system, we do more re-scheduling per second than there are timer pulses per second
* Regardless of timer implementation, we cannot guarantee timely delivery due to FPS restriction (may be as low as 10)
This implementation:
CON: The smallest timer interval is constrained by HZ (currently 1/10s).
PRO: It will still correctly fire any timer slower than HZ over a length of time, e.g. 0.11s interval -> 90 times over 10 seconds
PRO: In lag bursts, the system simly skips missed timer intervals to decrease load
CON: Algorithms depending on a timer firing "N times per minute" will fail
PRO: (Re-)scheduling is O(1) with a VERY small constant. It's a simple linked list insertion in a hash bucket.
CAUTION: The BUCKETS constant constrains how many timers can be efficiently handled. With too many hash collisions, performance will decrease.
Major assumptions upheld:
- ALLOWS scheduling multiple timers with the same funcref/method
- ALLOWS scheduling more timers during OnUpdate processing
- ALLOWS unscheduling ANY timer (including the current running one) at any time, including during OnUpdate processing
]]
local MAJOR, MINOR = "AceTimer-3.0", 5
local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceTimer then return end -- No upgrade needed
AceTimer.hash = AceTimer.hash or {} -- Array of [0..BUCKET-1] = linked list of timers (using .next member)
-- Linked list gets around ACE-88 and ACE-90.
AceTimer.selfs = AceTimer.selfs or {} -- Array of [self]={[handle]=timerobj, [handle2]=timerobj2, ...}
AceTimer.frame = AceTimer.frame or CreateFrame("Frame", "AceTimer30Frame")
-- Lua APIs
local assert, error, loadstring = assert, error, loadstring
local setmetatable, rawset, rawget = setmetatable, rawset, rawget
local select, pairs, type, next, tostring = select, pairs, type, next, tostring
local floor, max, min = math.floor, math.max, math.min
local tconcat = table.concat
-- WoW APIs
local GetTime = GetTime
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: DEFAULT_CHAT_FRAME, geterrorhandler
-- Simple ONE-SHOT timer cache. Much more efficient than a full compost for our purposes.
local timerCache = nil
--[[
Timers will not be fired more often than HZ-1 times per second.
Keep at intended speed PLUS ONE or we get bitten by floating point rounding errors (n.5 + 0.1 can be n.599999)
If this is ever LOWERED, all existing timers need to be enforced to have a delay >= 1/HZ on lib upgrade.
If this number is ever changed, all entries need to be rehashed on lib upgrade.
]]
local HZ = 11
--[[
Prime for good distribution
If this number is ever changed, all entries need to be rehashed on lib upgrade.
]]
local BUCKETS = 131
local hash = AceTimer.hash
for i=1,BUCKETS do
hash[i] = hash[i] or false -- make it an integer-indexed array; it's faster than hashes
end
--[[
xpcall safecall implementation
]]
local xpcall = xpcall
local function errorhandler(err)
return geterrorhandler()(err)
end
local function CreateDispatcher(argCount)
local code = [[
local xpcall, eh = ... -- our arguments are received as unnamed values in "..." since we don't have a proper function declaration
local method, ARGS
local function call() return method(ARGS) end
local function dispatch(func, ...)
method = func
if not method then return end
ARGS = ...
return xpcall(call, eh)
end
return dispatch
]]
local ARGS = {}
for i = 1, argCount do ARGS[i] = "arg"..i end
code = code:gsub("ARGS", tconcat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
end
local Dispatchers = setmetatable({}, {
__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end
})
Dispatchers[0] = function(func)
return xpcall(func, errorhandler)
end
local function safecall(func, ...)
return Dispatchers[select('#', ...)](func, ...)
end
local lastint = floor(GetTime() * HZ)
-- --------------------------------------------------------------------
-- OnUpdate handler
--
-- traverse buckets, always chasing "now", and fire timers that have expired
local function OnUpdate()
local now = GetTime()
local nowint = floor(now * HZ)
-- Have we passed into a new hash bucket?
if nowint == lastint then return end
local soon = now + 1 -- +1 is safe as long as 1 < HZ < BUCKETS/2
-- Pass through each bucket at most once
-- Happens on e.g. instance loads, but COULD happen on high local load situations also
for curint = (max(lastint, nowint - BUCKETS) + 1), nowint do -- loop until we catch up with "now", usually only 1 iteration
local curbucket = (curint % BUCKETS)+1
-- Yank the list of timers out of the bucket and empty it. This allows reinsertion in the currently-processed bucket from callbacks.
local nexttimer = hash[curbucket]
hash[curbucket] = false -- false rather than nil to prevent the array from becoming a hash
while nexttimer do
local timer = nexttimer
nexttimer = timer.next
local when = timer.when
if when < soon then
-- Call the timer func, either as a method on given object, or a straight function ref
local callback = timer.callback
if type(callback) == "string" then
safecall(timer.object[callback], timer.object, timer.arg)
elseif callback then
safecall(callback, timer.arg)
else
-- probably nilled out by CancelTimer
timer.delay = nil -- don't reschedule it
end
local delay = timer.delay -- NOW make a local copy, can't do it earlier in case the timer cancelled itself in the callback
if not delay then
-- single-shot timer (or cancelled)
AceTimer.selfs[timer.object][tostring(timer)] = nil
timerCache = timer
else
-- repeating timer
local newtime = when + delay
if newtime < now then -- Keep lag from making us firing a timer unnecessarily. (Note that this still won't catch too-short-delay timers though.)
newtime = now + delay
end
timer.when = newtime
-- add next timer execution to the correct bucket
local bucket = (floor(newtime * HZ) % BUCKETS) + 1
timer.next = hash[bucket]
hash[bucket] = timer
end
else -- if when>=soon
-- reinsert (yeah, somewhat expensive, but shouldn't be happening too often either due to hash distribution)
timer.next = hash[curbucket]
hash[curbucket] = timer
end -- if when<soon ... else
end -- while nexttimer do
end -- for curint=lastint,nowint
lastint = nowint
end
-- ---------------------------------------------------------------------
-- Reg( callback, delay, arg, repeating )
--
-- callback( function or string ) - direct function ref or method name in our object for the callback
-- delay(int) - delay for the timer
-- arg(variant) - any argument to be passed to the callback function
-- repeating(boolean) - repeating timer, or oneshot
--
-- returns the handle of the timer for later processing (canceling etc)
local function Reg(self, callback, delay, arg, repeating)
if type(callback) ~= "string" and type(callback) ~= "function" then
local error_origin = repeating and "ScheduleRepeatingTimer" or "ScheduleTimer"
error(MAJOR..": " .. error_origin .. "(callback, delay, arg): 'callback' - function or method name expected.", 3)
end
if type(callback) == "string" then
if type(self)~="table" then
local error_origin = repeating and "ScheduleRepeatingTimer" or "ScheduleTimer"
error(MAJOR..": " .. error_origin .. "(\"methodName\", delay, arg): 'self' - must be a table.", 3)
end
if type(self[callback]) ~= "function" then
local error_origin = repeating and "ScheduleRepeatingTimer" or "ScheduleTimer"
error(MAJOR..": " .. error_origin .. "(\"methodName\", delay, arg): 'methodName' - method not found on target object.", 3)
end
end
if delay < (1 / (HZ - 1)) then
delay = 1 / (HZ - 1)
end
-- Create and stuff timer in the correct hash bucket
local now = GetTime()
local timer = timerCache or {} -- Get new timer object (from cache if available)
timerCache = nil
timer.object = self
timer.callback = callback
timer.delay = (repeating and delay)
timer.arg = arg
timer.when = now + delay
local bucket = (floor((now+delay)*HZ) % BUCKETS) + 1
timer.next = hash[bucket]
hash[bucket] = timer
-- Insert timer in our self->handle->timer registry
local handle = tostring(timer)
local selftimers = AceTimer.selfs[self]
if not selftimers then
selftimers = {}
AceTimer.selfs[self] = selftimers
end
selftimers[handle] = timer
selftimers.__ops = (selftimers.__ops or 0) + 1
return handle
end
--- Schedule a new one-shot timer.
-- The timer will fire once in `delay` seconds, unless canceled before.
-- @param callback Callback function for the timer pulse (funcref or method name).
-- @param delay Delay for the timer, in seconds.
-- @param arg An optional argument to be passed to the callback function.
-- @usage
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("TimerTest", "AceTimer-3.0")
--
-- function MyAddon:OnEnable()
-- self:ScheduleTimer("TimerFeedback", 5)
-- end
--
-- function MyAddon:TimerFeedback()
-- print("5 seconds passed")
-- end
function AceTimer:ScheduleTimer(callback, delay, arg)
return Reg(self, callback, delay, arg)
end
--- Schedule a repeating timer.
-- The timer will fire every `delay` seconds, until canceled.
-- @param callback Callback function for the timer pulse (funcref or method name).
-- @param delay Delay for the timer, in seconds.
-- @param arg An optional argument to be passed to the callback function.
-- @usage
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("TimerTest", "AceTimer-3.0")
--
-- function MyAddon:OnEnable()
-- self.timerCount = 0
-- self.testTimer = self:ScheduleRepeatingTimer("TimerFeedback", 5)
-- end
--
-- function MyAddon:TimerFeedback()
-- self.timerCount = self.timerCount + 1
-- print(("%d seconds passed"):format(5 * self.timerCount))
-- -- run 30 seconds in total
-- if self.timerCount == 6 then
-- self:CancelTimer(self.testTimer)
-- end
-- end
function AceTimer:ScheduleRepeatingTimer(callback, delay, arg)
return Reg(self, callback, delay, arg, true)
end
--- Cancels a timer with the given handle, registered by the same addon object as used for `:ScheduleTimer`
-- Both one-shot and repeating timers can be canceled with this function, as long as the `handle` is valid
-- and the timer has not fired yet or was canceled before.
-- @param handle The handle of the timer, as returned by `:ScheduleTimer` or `:ScheduleRepeatingTimer`
-- @param silent If true, no error is raised if the timer handle is invalid (expired or already canceled)
-- @return True if the timer was successfully cancelled.
function AceTimer:CancelTimer(handle, silent)
if not handle then return end -- nil handle -> bail out without erroring
if type(handle) ~= "string" then
error(MAJOR..": CancelTimer(handle): 'handle' - expected a string", 2) -- for now, anyway
end
local selftimers = AceTimer.selfs[self]
local timer = selftimers and selftimers[handle]
if silent then
if timer then
timer.callback = nil -- don't run it again
timer.delay = nil -- if this is the currently-executing one: don't even reschedule
-- The timer object is removed in the OnUpdate loop
end
return not not timer -- might return "true" even if we double-cancel. we'll live.
else
if not timer then
geterrorhandler()(MAJOR..": CancelTimer(handle[, silent]): '"..tostring(handle).."' - no such timer registered")
return false
end
if not timer.callback then
geterrorhandler()(MAJOR..": CancelTimer(handle[, silent]): '"..tostring(handle).."' - timer already cancelled or expired")
return false
end
timer.callback = nil -- don't run it again
timer.delay = nil -- if this is the currently-executing one: don't even reschedule
return true
end
end
--- Cancels all timers registered to the current addon object ('self')
function AceTimer:CancelAllTimers()
if not(type(self) == "string" or type(self) == "table") then
error(MAJOR..": CancelAllTimers(): 'self' - must be a string or a table",2)
end
if self == AceTimer then
error(MAJOR..": CancelAllTimers(): supply a meaningful 'self'", 2)
end
local selftimers = AceTimer.selfs[self]
if selftimers then
for handle,v in pairs(selftimers) do
if type(v) == "table" then -- avoid __ops, etc
AceTimer.CancelTimer(self, handle, true)
end
end
end
end
--- Returns the time left for a timer with the given handle, registered by the current addon object ('self').
-- This function will raise a warning when the handle is invalid, but not stop execution.
-- @param handle The handle of the timer, as returned by `:ScheduleTimer` or `:ScheduleRepeatingTimer`
-- @return The time left on the timer, or false if the handle is invalid.
function AceTimer:TimeLeft(handle)
if not handle then return end
if type(handle) ~= "string" then
error(MAJOR..": TimeLeft(handle): 'handle' - expected a string", 2) -- for now, anyway
end
local selftimers = AceTimer.selfs[self]
local timer = selftimers and selftimers[handle]
if not timer then
geterrorhandler()(MAJOR..": TimeLeft(handle): '"..tostring(handle).."' - no such timer registered")
return false
end
return timer.when - GetTime()
end
-- ---------------------------------------------------------------------
-- PLAYER_REGEN_ENABLED: Run through our .selfs[] array step by step
-- and clean it out - otherwise the table indices can grow indefinitely
-- if an addon starts and stops a lot of timers. AceBucket does this!
--
-- See ACE-94 and tests/AceTimer-3.0-ACE-94.lua
local lastCleaned = nil
local function OnEvent(this, event)
if event~="PLAYER_REGEN_ENABLED" then
return
end
-- Get the next 'self' to process
local selfs = AceTimer.selfs
local self = next(selfs, lastCleaned)
if not self then
self = next(selfs)
end
lastCleaned = self
if not self then -- should only happen if .selfs[] is empty
return
end
-- Time to clean it out?
local list = selfs[self]
if (list.__ops or 0) < 250 then -- 250 slosh indices = ~10KB wasted (max!). For one 'self'.
return
end
-- Create a new table and copy all members over
local newlist = {}
local n=0
for k,v in pairs(list) do
newlist[k] = v
n=n+1
end
newlist.__ops = 0 -- Reset operation count
-- And since we now have a count of the number of live timers, check that it's reasonable. Emit a warning if not.
if n>BUCKETS then
DEFAULT_CHAT_FRAME:AddMessage(MAJOR..": Warning: The addon/module '"..tostring(self).."' has "..n.." live timers. Surely that's not intended?")
end
selfs[self] = newlist
end
-- ---------------------------------------------------------------------
-- Embed handling
AceTimer.embeds = AceTimer.embeds or {}
local mixins = {
"ScheduleTimer", "ScheduleRepeatingTimer",
"CancelTimer", "CancelAllTimers",
"TimeLeft"
}
function AceTimer:Embed(target)
AceTimer.embeds[target] = true
for _,v in pairs(mixins) do
target[v] = AceTimer[v]
end
return target
end
-- AceTimer:OnEmbedDisable( target )
-- target (object) - target object that AceTimer is embedded in.
--
-- cancel all timers registered for the object
function AceTimer:OnEmbedDisable( target )
target:CancelAllTimers()
end
for addon in pairs(AceTimer.embeds) do
AceTimer:Embed(addon)
end
-- ---------------------------------------------------------------------
-- Debug tools (expose copies of internals to test suites)
AceTimer.debug = AceTimer.debug or {}
AceTimer.debug.HZ = HZ
AceTimer.debug.BUCKETS = BUCKETS
-- ---------------------------------------------------------------------
-- Finishing touchups
AceTimer.frame:SetScript("OnUpdate", OnUpdate)
AceTimer.frame:SetScript("OnEvent", OnEvent)
AceTimer.frame:RegisterEvent("PLAYER_REGEN_ENABLED")
-- In theory, we should hide&show the frame based on there being timers or not.
-- However, this job is fairly expensive, and the chance that there will
-- actually be zero timers running is diminuitive to say the lest.
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceTimer-3.0.lua"/>
</Ui>
@@ -0,0 +1,239 @@
--[[ $Id: CallbackHandler-1.0.lua 3 2008-09-29 16:54:20Z nevcairiel $ ]]
local MAJOR, MINOR = "CallbackHandler-1.0", 3
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
if not CallbackHandler then return end -- No upgrade needed
local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
local type = type
local pcall = pcall
local pairs = pairs
local assert = assert
local concat = table.concat
local loadstring = loadstring
local next = next
local select = select
local type = type
local xpcall = xpcall
local function errorhandler(err)
return geterrorhandler()(err)
end
local function CreateDispatcher(argCount)
local code = [[
local next, xpcall, eh = ...
local method, ARGS
local function call() method(ARGS) end
local function dispatch(handlers, ...)
local index
index, method = next(handlers)
if not method then return end
local OLD_ARGS = ARGS
ARGS = ...
repeat
xpcall(call, eh)
index, method = next(handlers, index)
until not method
ARGS = OLD_ARGS
end
return dispatch
]]
local ARGS, OLD_ARGS = {}, {}
for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
code = code:gsub("OLD_ARGS", concat(OLD_ARGS, ", ")):gsub("ARGS", concat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
end
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
--------------------------------------------------------------------------
-- CallbackHandler:New
--
-- target - target object to embed public APIs in
-- RegisterName - name of the callback registration API, default "RegisterCallback"
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
-- TODO: Remove this after beta has gone out
assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
RegisterName = RegisterName or "RegisterCallback"
UnregisterName = UnregisterName or "UnregisterCallback"
if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
UnregisterAllName = "UnregisterAllCallbacks"
end
-- we declare all objects and exported APIs inside this closure to quickly gain access
-- to e.g. function names, the "target" parameter, etc
-- Create the registry object
local events = setmetatable({}, meta)
local registry = { recurse=0, events=events }
-- registry:Fire() - fires the given event/message into the registry
function registry:Fire(eventname, ...)
if not rawget(events, eventname) or not next(events[eventname]) then return end
local oldrecurse = registry.recurse
registry.recurse = oldrecurse + 1
Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
registry.recurse = oldrecurse
if registry.insertQueue and oldrecurse==0 then
-- Something in one of our callbacks wanted to register more callbacks; they got queued
for eventname,callbacks in pairs(registry.insertQueue) do
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
for self,func in pairs(callbacks) do
events[eventname][self] = func
-- fire OnUsed callback?
if first and registry.OnUsed then
registry.OnUsed(registry, target, eventname)
first = nil
end
end
end
registry.insertQueue = nil
end
end
-- Registration of a callback, handles:
-- self["method"], leads to self["method"](self, ...)
-- self with function ref, leads to functionref(...)
-- "addonId" (instead of self) with function ref, leads to functionref(...)
-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
if type(eventname) ~= "string" then
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
end
method = method or eventname
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
if type(method) ~= "string" and type(method) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
end
local regfunc
if type(method) == "string" then
-- self["method"] calling style
if type(self) ~= "table" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
elseif self==target then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
elseif type(self[method]) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
end
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) self[method](self,arg,...) end
else
regfunc = function(...) self[method](self,...) end
end
else
-- function ref with self=object or self="addonId"
if type(self)~="table" and type(self)~="string" then
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string expected.", 2)
end
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) method(arg,...) end
else
regfunc = method
end
end
if events[eventname][self] or registry.recurse<1 then
-- if registry.recurse<1 then
-- we're overwriting an existing entry, or not currently recursing. just set it.
events[eventname][self] = regfunc
-- fire OnUsed callback?
if registry.OnUsed and first then
registry.OnUsed(registry, target, eventname)
end
else
-- we're currently processing a callback in this registry, so delay the registration of this new entry!
-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
registry.insertQueue = registry.insertQueue or setmetatable({},meta)
registry.insertQueue[eventname][self] = regfunc
end
end
-- Unregister a callback
target[UnregisterName] = function(self, eventname)
if not self or self==target then
error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
end
if type(eventname) ~= "string" then
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
end
if rawget(events, eventname) and events[eventname][self] then
events[eventname][self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(events[eventname]) then
registry.OnUnused(registry, target, eventname)
end
end
if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
registry.insertQueue[eventname][self] = nil
end
end
-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
if UnregisterAllName then
target[UnregisterAllName] = function(...)
if select("#",...)<1 then
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
end
if select("#",...)==1 and ...==target then
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
end
for i=1,select("#",...) do
local self = select(i,...)
if registry.insertQueue then
for eventname, callbacks in pairs(registry.insertQueue) do
if callbacks[self] then
callbacks[self] = nil
end
end
end
for eventname, callbacks in pairs(events) do
if callbacks[self] then
callbacks[self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(callbacks) then
registry.OnUnused(registry, target, eventname)
end
end
end
end
end
end
return registry
end
-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
-- try to upgrade old implicit embeds since the system is selfcontained and
-- relies on closures to work.
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="CallbackHandler-1.0.lua"/>
</Ui>
@@ -0,0 +1,799 @@
--[[
Name: AceLibrary
Revision: $Rev: 1091 $
Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
Inspired By: Iriel (iriel@vigilance-committee.org)
Tekkub (tekkub@gmail.com)
Revision: $Rev: 1091 $
Website: http://www.wowace.com/
Documentation: http://www.wowace.com/index.php/AceLibrary
SVN: http://svn.wowace.com/wowace/trunk/Ace2/AceLibrary
Description: Versioning library to handle other library instances, upgrading,
and proper access.
It also provides a base for libraries to work off of, providing
proper error tools. It is handy because all the errors occur in the
file that called it, not in the library file itself.
Dependencies: None
License: LGPL v2.1
]]
local ACELIBRARY_MAJOR = "AceLibrary"
local ACELIBRARY_MINOR = 90000 + tonumber(("$Revision: 1091 $"):match("(%d+)"))
local _G = getfenv(0)
local previous = _G[ACELIBRARY_MAJOR]
if previous and not previous:IsNewVersion(ACELIBRARY_MAJOR, ACELIBRARY_MINOR) then return end
do
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain -- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
end
local LibStub = _G.LibStub
-- If you don't want AceLibrary to enable libraries that are LoadOnDemand but
-- disabled in the addon screen, set this to true.
local DONT_ENABLE_LIBRARIES = nil
local function safecall(func,...)
local success, err = pcall(func,...)
if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("\n(.-: )in.-\n") or "") .. err) end
end
-- @table AceLibrary
-- @brief System to handle all versioning of libraries.
local AceLibrary = {}
local AceLibrary_mt = {}
setmetatable(AceLibrary, AceLibrary_mt)
local function error(self, message, ...)
if type(self) ~= "table" then
return _G.error(("Bad argument #1 to `error' (table expected, got %s)"):format(type(self)), 2)
end
local stack = debugstack()
if not message then
local second = stack:match("\n(.-)\n")
message = "error raised! " .. second
else
local arg = { ... } -- not worried about table creation, as errors don't happen often
for i = 1, #arg do
arg[i] = tostring(arg[i])
end
for i = 1, 10 do
table.insert(arg, "nil")
end
message = message:format(unpack(arg))
end
if getmetatable(self) and getmetatable(self).__tostring then
message = ("%s: %s"):format(tostring(self), message)
elseif type(rawget(self, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self:GetLibraryVersion()) then
message = ("%s: %s"):format(self:GetLibraryVersion(), message)
elseif type(rawget(self, 'class')) == "table" and type(rawget(self.class, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self.class:GetLibraryVersion()) then
message = ("%s: %s"):format(self.class:GetLibraryVersion(), message)
end
local first = stack:gsub("\n.*", "")
local file = first:gsub(".*\\(.*).lua:%d+: .*", "%1")
file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
local i = 0
for s in stack:gmatch("\n([^\n]*)") do
i = i + 1
if not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then
file = s:gsub("^.*\\(.*).lua:%d+: .*", "%1")
file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
break
end
end
local j = 0
for s in stack:gmatch("\n([^\n]*)") do
j = j + 1
if j > i and not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then
return _G.error(message, j+1)
end
end
return _G.error(message, 2)
end
local type = type
local function argCheck(self, arg, num, kind, kind2, kind3, kind4, kind5)
if type(num) ~= "number" then
return error(self, "Bad argument #3 to `argCheck' (number expected, got %s)", type(num))
elseif type(kind) ~= "string" then
return error(self, "Bad argument #4 to `argCheck' (string expected, got %s)", type(kind))
end
arg = type(arg)
if arg ~= kind and arg ~= kind2 and arg ~= kind3 and arg ~= kind4 and arg ~= kind5 then
local stack = debugstack()
local func = stack:match("`argCheck'.-([`<].-['>])")
if not func then
func = stack:match("([`<].-['>])")
end
if kind5 then
return error(self, "Bad argument #%s to %s (%s, %s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, kind5, arg)
elseif kind4 then
return error(self, "Bad argument #%s to %s (%s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, arg)
elseif kind3 then
return error(self, "Bad argument #%s to %s (%s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, arg)
elseif kind2 then
return error(self, "Bad argument #%s to %s (%s or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, arg)
else
return error(self, "Bad argument #%s to %s (%s expected, got %s)", tonumber(num) or 0/0, func, kind, arg)
end
end
end
local pcall
do
local function check(self, ret, ...)
if not ret then
local s = ...
return error(self, (s:gsub(".-%.lua:%d-: ", "")))
else
return ...
end
end
function pcall(self, func, ...)
return check(self, _G.pcall(func, ...))
end
end
local recurse = {}
local function addToPositions(t, major)
if not AceLibrary.positions[t] or AceLibrary.positions[t] == major then
rawset(t, recurse, true)
AceLibrary.positions[t] = major
for k,v in pairs(t) do
if type(v) == "table" and not rawget(v, recurse) then
addToPositions(v, major)
end
if type(k) == "table" and not rawget(k, recurse) then
addToPositions(k, major)
end
end
local mt = getmetatable(t)
if mt and not rawget(mt, recurse) then
addToPositions(mt, major)
end
rawset(t, recurse, nil)
end
end
local function svnRevisionToNumber(text)
local kind = type(text)
if kind == "number" or tonumber(text) then
return tonumber(text)
elseif kind == "string" then
if text:find("^%$Revision: (%d+) %$$") then
return tonumber((text:match("^%$Revision: (%d+) %$$")))
elseif text:find("^%$Rev: (%d+) %$$") then
return tonumber((text:match("^%$Rev: (%d+) %$$")))
elseif text:find("^%$LastChangedRevision: (%d+) %$$") then
return tonumber((text:match("^%$LastChangedRevision: (%d+) %$$")))
end
end
return nil
end
local crawlReplace
do
local recurse = {}
local function func(t, to, from)
if recurse[t] then
return
end
recurse[t] = true
local mt = getmetatable(t)
setmetatable(t, nil)
rawset(t, to, rawget(t, from))
rawset(t, from, nil)
for k,v in pairs(t) do
if v == from then
t[k] = to
elseif type(v) == "table" then
if not recurse[v] then
func(v, to, from)
end
end
if type(k) == "table" then
if not recurse[k] then
func(k, to, from)
end
end
end
setmetatable(t, mt)
if mt then
if mt == from then
setmetatable(t, to)
elseif not recurse[mt] then
func(mt, to, from)
end
end
end
function crawlReplace(t, to, from)
func(t, to, from)
for k in pairs(recurse) do
recurse[k] = nil
end
end
end
-- @function destroyTable
-- @brief remove all the contents of a table
-- @param t table to destroy
local function destroyTable(t)
setmetatable(t, nil)
for k,v in pairs(t) do
t[k] = nil
end
end
local function isFrame(frame)
return type(frame) == "table" and type(rawget(frame, 0)) == "userdata" and type(rawget(frame, 'IsFrameType')) == "function" and getmetatable(frame) and type(rawget(getmetatable(frame), '__index')) == "function"
end
-- @function copyTable
-- @brief Create a shallow copy of a table and return it.
-- @param from The table to copy from
-- @return A shallow copy of the table
local function copyTable(from, to)
if not to then
to = {}
end
for k,v in pairs(from) do
to[k] = v
end
setmetatable(to, getmetatable(from))
return to
end
-- @function deepTransfer
-- @brief Fully transfer all data, keeping proper previous table
-- backreferences stable.
-- @param to The table with which data is to be injected into
-- @param from The table whose data will be injected into the first
-- @param saveFields If available, a shallow copy of the basic data is saved
-- in here.
-- @param list The account of table references
-- @param list2 The current status on which tables have been traversed.
local deepTransfer
do
-- @function examine
-- @brief Take account of all the table references to be shared
-- between the to and from tables.
-- @param to The table with which data is to be injected into
-- @param from The table whose data will be injected into the first
-- @param list An account of the table references
local function examine(to, from, list, major)
list[from] = to
for k,v in pairs(from) do
if rawget(to, k) and type(from[k]) == "table" and type(to[k]) == "table" and not list[from[k]] then
if from[k] == to[k] then
list[from[k]] = to[k]
elseif AceLibrary.positions[from[v]] ~= major and AceLibrary.positions[from[v]] then
list[from[k]] = from[k]
elseif not list[from[k]] then
examine(to[k], from[k], list, major)
end
end
end
return list
end
function deepTransfer(to, from, saveFields, major, list, list2)
setmetatable(to, nil)
if not list then
list = {}
list2 = {}
examine(to, from, list, major)
end
list2[to] = to
for k,v in pairs(to) do
if type(rawget(from, k)) ~= "table" or type(v) ~= "table" or isFrame(v) then
if saveFields then
saveFields[k] = v
end
to[k] = nil
elseif v ~= _G then
if saveFields then
saveFields[k] = copyTable(v)
end
end
end
for k in pairs(from) do
if rawget(to, k) and to[k] ~= from[k] and AceLibrary.positions[to[k]] == major and from[k] ~= _G then
if not list2[to[k]] then
deepTransfer(to[k], from[k], nil, major, list, list2)
end
to[k] = list[to[k]] or list2[to[k]]
else
rawset(to, k, from[k])
end
end
setmetatable(to, getmetatable(from))
local mt = getmetatable(to)
if mt then
if list[mt] then
setmetatable(to, list[mt])
elseif mt.__index and list[mt.__index] then
mt.__index = list[mt.__index]
end
end
destroyTable(from)
end
end
local function TryToEnable(addon)
if DONT_ENABLE_LIBRARIES then return end
local isondemand = IsAddOnLoadOnDemand(addon)
if isondemand then
local _, _, _, enabled = GetAddOnInfo(addon)
EnableAddOn(addon)
local _, _, _, _, loadable = GetAddOnInfo(addon)
if not loadable and not enabled then
DisableAddOn(addon)
end
return loadable
end
end
-- @method TryToLoadStandalone
-- @brief Attempt to find and load a standalone version of the requested library
-- @param major A string representing the major version
-- @return If library is found and loaded, true is return. If not loadable, false is returned.
-- If the library has been requested previously, nil is returned.
local function TryToLoadStandalone(major)
if not AceLibrary.scannedlibs then AceLibrary.scannedlibs = {} end
if AceLibrary.scannedlibs[major] then return end
AceLibrary.scannedlibs[major] = true
local name, _, _, enabled, loadable = GetAddOnInfo(major)
loadable = (enabled and loadable) or TryToEnable(name)
local loaded = false
if loadable then
loaded = true
LoadAddOn(name)
end
local field = "X-AceLibrary-" .. major
for i = 1, GetNumAddOns() do
if GetAddOnMetadata(i, field) then
name, _, _, enabled, loadable = GetAddOnInfo(i)
loadable = (enabled and loadable) or TryToEnable(name)
if loadable then
loaded = true
LoadAddOn(name)
end
end
end
return loaded
end
-- @method IsNewVersion
-- @brief Obtain whether the supplied version would be an upgrade to the
-- current version. This allows for bypass code in library
-- declaration.
-- @param major A string representing the major version
-- @param minor An integer or an svn revision string representing the minor version
-- @return whether the supplied version would be newer than what is
-- currently available.
function AceLibrary:IsNewVersion(major, minor)
argCheck(self, major, 2, "string")
TryToLoadStandalone(major)
if type(minor) == "string" then
local m = svnRevisionToNumber(minor)
if m then
minor = m
else
_G.error(("Bad argument #3 to `IsNewVersion'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
end
end
argCheck(self, minor, 3, "number")
local lib, oldMinor = LibStub:GetLibrary(major, true)
if lib then
return oldMinor < minor
end
local data = self.libs[major]
if not data then
return true
end
return data.minor < minor
end
-- @method HasInstance
-- @brief Returns whether an instance exists. This allows for optional support of a library.
-- @param major A string representing the major version.
-- @param minor (optional) An integer or an svn revision string representing the minor version.
-- @return Whether an instance exists.
function AceLibrary:HasInstance(major, minor)
argCheck(self, major, 2, "string")
if minor ~= false then
TryToLoadStandalone(major)
end
local lib, ver = LibStub:GetLibrary(major, true)
if not lib and self.libs[major] then
lib, ver = self.libs[major].instance, self.libs[major].minor
end
if minor then
if type(minor) == "string" then
local m = svnRevisionToNumber(minor)
if m then
minor = m
else
_G.error(("Bad argument #3 to `HasInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
end
end
argCheck(self, minor, 3, "number")
if not lib then
return false
end
return ver == minor
end
return not not lib
end
-- @method GetInstance
-- @brief Returns the library with the given major/minor version.
-- @param major A string representing the major version.
-- @param minor (optional) An integer or an svn revision string representing the minor version.
-- @return The library with the given major/minor version.
function AceLibrary:GetInstance(major, minor)
argCheck(self, major, 2, "string")
if minor ~= false then
TryToLoadStandalone(major)
end
local data, ver = LibStub:GetLibrary(major, true)
if not data then
if self.libs[major] then
data, ver = self.libs[major].instance, self.libs[major].minor
else
_G.error(("Cannot find a library instance of %s."):format(major), 2)
return
end
end
if minor then
if type(minor) == "string" then
local m = svnRevisionToNumber(minor)
if m then
minor = m
else
_G.error(("Bad argument #3 to `GetInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
end
end
argCheck(self, minor, 2, "number")
if ver ~= minor then
_G.error(("Cannot find a library instance of %s, minor version %d."):format(major, minor), 2)
end
end
return data
end
-- Syntax sugar. AceLibrary("FooBar-1.0")
AceLibrary_mt.__call = AceLibrary.GetInstance
local donothing = function() end
local AceEvent
local tmp = {}
-- @method Register
-- @brief Registers a new version of a given library.
-- @param newInstance the library to register
-- @param major the major version of the library
-- @param minor the minor version of the library
-- @param activateFunc (optional) A function to be called when the library is
-- fully activated. Takes the arguments
-- (newInstance [, oldInstance, oldDeactivateFunc]). If
-- oldInstance is given, you should probably call
-- oldDeactivateFunc(oldInstance).
-- @param deactivateFunc (optional) A function to be called by a newer library's
-- activateFunc.
-- @param externalFunc (optional) A function to be called whenever a new
-- library is registered.
function AceLibrary:Register(newInstance, major, minor, activateFunc, deactivateFunc, externalFunc)
argCheck(self, newInstance, 2, "table")
argCheck(self, major, 3, "string")
if major ~= ACELIBRARY_MAJOR then
for k,v in pairs(_G) do
if v == newInstance then
geterrorhandler()((debugstack():match("(.-: )in.-\n") or "") .. ("Cannot register library %q. It is part of the global table in _G[%q]."):format(major, k))
end
end
end
if major ~= ACELIBRARY_MAJOR and not major:find("^[%a%-][%a%d%-]*%-%d+%.%d+$") then
_G.error(string.format("Bad argument #3 to `Register'. Must be in the form of \"Name-1.0\". %q is not appropriate", major), 2)
end
if type(minor) == "string" then
local m = svnRevisionToNumber(minor)
if m then
minor = m
else
_G.error(("Bad argument #4 to `Register'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
end
end
argCheck(self, minor, 4, "number")
if math.floor(minor) ~= minor or minor < 0 then
error(self, "Bad argument #4 to `Register' (integer >= 0 expected, got %s)", minor)
end
argCheck(self, activateFunc, 5, "function", "nil")
argCheck(self, deactivateFunc, 6, "function", "nil")
argCheck(self, externalFunc, 7, "function", "nil")
if not deactivateFunc then
deactivateFunc = donothing
end
local data = self.libs[major]
if not data then
-- This is new
if LibStub:GetLibrary(major, true) then
error(self, "Cannot register library %q. It is already registered with LibStub.", major)
end
local instance = LibStub:NewLibrary(major, minor)
copyTable(newInstance, instance)
crawlReplace(instance, instance, newInstance)
destroyTable(newInstance)
if AceLibrary == newInstance then
self = instance
AceLibrary = instance
end
self.libs[major] = {
instance = instance,
minor = minor,
deactivateFunc = deactivateFunc,
externalFunc = externalFunc,
}
rawset(instance, 'GetLibraryVersion', function(self)
return major, minor
end)
if not rawget(instance, 'error') then
rawset(instance, 'error', error)
end
if not rawget(instance, 'argCheck') then
rawset(instance, 'argCheck', argCheck)
end
if not rawget(instance, 'pcall') then
rawset(instance, 'pcall', pcall)
end
addToPositions(instance, major)
if activateFunc then
safecall(activateFunc, instance, nil, nil) -- no old version, so explicit nil
end
if externalFunc then
for k, data_instance in LibStub:IterateLibraries() do -- all libraries
tmp[k] = data_instance
end
for k, data in pairs(self.libs) do -- Ace libraries which may not have been registered with LibStub
tmp[k] = data.instance
end
for k, data_instance in pairs(tmp) do
if k ~= major then
safecall(externalFunc, instance, k, data_instance)
end
tmp[k] = nil
end
end
for k,data in pairs(self.libs) do -- only Ace libraries
if k ~= major and data.externalFunc then
safecall(data.externalFunc, data.instance, major, instance)
end
end
if major == "AceEvent-2.0" then
AceEvent = instance
end
if AceEvent then
AceEvent.TriggerEvent(self, "AceLibrary_Register", major, instance)
end
return instance
end
if minor <= data.minor then
-- This one is already obsolete, raise an error.
_G.error(("Obsolete library registered. %s is already registered at version %d. You are trying to register version %d. Hint: if not AceLibrary:IsNewVersion(%q, %d) then return end"):format(major, data.minor, minor, major, minor), 2)
return
end
local instance = data.instance
-- This is an update
local oldInstance = {}
local libStubInstance = LibStub:GetLibrary(major, true)
if not libStubInstance then -- non-LibStub AceLibrary registered the library
-- pass
elseif libStubInstance ~= instance then
error(self, "Cannot register library %q. It is already registered with LibStub.", major)
else
LibStub:NewLibrary(major, minor) -- upgrade the minor version
end
addToPositions(newInstance, major)
local isAceLibrary = (AceLibrary == newInstance)
local old_error, old_argCheck, old_pcall
if isAceLibrary then
self = instance
AceLibrary = instance
old_error = instance.error
old_argCheck = instance.argCheck
old_pcall = instance.pcall
self.error = error
self.argCheck = argCheck
self.pcall = pcall
end
deepTransfer(instance, newInstance, oldInstance, major)
crawlReplace(instance, instance, newInstance)
local oldDeactivateFunc = data.deactivateFunc
data.minor = minor
data.deactivateFunc = deactivateFunc
data.externalFunc = externalFunc
rawset(instance, 'GetLibraryVersion', function()
return major, minor
end)
if not rawget(instance, 'error') then
rawset(instance, 'error', error)
end
if not rawget(instance, 'argCheck') then
rawset(instance, 'argCheck', argCheck)
end
if not rawget(instance, 'pcall') then
rawset(instance, 'pcall', pcall)
end
if isAceLibrary then
for _,v in pairs(self.libs) do
local i = type(v) == "table" and v.instance
if type(i) == "table" then
if not rawget(i, 'error') or i.error == old_error then
rawset(i, 'error', error)
end
if not rawget(i, 'argCheck') or i.argCheck == old_argCheck then
rawset(i, 'argCheck', argCheck)
end
if not rawget(i, 'pcall') or i.pcall == old_pcall then
rawset(i, 'pcall', pcall)
end
end
end
end
if activateFunc then
safecall(activateFunc, instance, oldInstance, oldDeactivateFunc)
else
safecall(oldDeactivateFunc, oldInstance)
end
oldInstance = nil
if externalFunc then
for k, data_instance in LibStub:IterateLibraries() do -- all libraries
tmp[k] = data_instance
end
for k, data in pairs(self.libs) do -- Ace libraries which may not have been registered with LibStub
tmp[k] = data.instance
end
for k, data_instance in pairs(tmp) do
if k ~= major then
safecall(externalFunc, instance, k, data_instance)
end
tmp[k] = nil
end
end
return instance
end
function AceLibrary:IterateLibraries()
local t = {}
for major, instance in LibStub:IterateLibraries() do
t[major] = instance
end
for major, data in pairs(self.libs) do
t[major] = data.instance
end
return pairs(t)
end
local function manuallyFinalize(major, instance)
if AceLibrary.libs[major] then
-- don't work on Ace libraries
return
end
local finalizedExternalLibs = AceLibrary.finalizedExternalLibs
if finalizedExternalLibs[major] then
return
end
finalizedExternalLibs[major] = true
for k,data in pairs(AceLibrary.libs) do -- only Ace libraries
if k ~= major and data.externalFunc then
safecall(data.externalFunc, data.instance, major, instance)
end
end
end
-- @function Activate
-- @brief The activateFunc for AceLibrary itself. Called when
-- AceLibrary properly registers.
-- @param self Reference to AceLibrary
-- @param oldLib (optional) Reference to an old version of AceLibrary
-- @param oldDeactivate (optional) Function to deactivate the old lib
local function activate(self, oldLib, oldDeactivate)
AceLibrary = self
if not self.libs then
self.libs = oldLib and oldLib.libs or {}
self.scannedlibs = oldLib and oldLib.scannedlibs or {}
end
if not self.positions then
self.positions = oldLib and oldLib.positions or setmetatable({}, { __mode = "k" })
end
self.finalizedExternalLibs = oldLib and oldLib.finalizedExternalLibs or {}
self.frame = oldLib and oldLib.frame or CreateFrame("Frame")
self.frame:UnregisterAllEvents()
self.frame:RegisterEvent("ADDON_LOADED")
self.frame:SetScript("OnEvent", function()
for major, instance in LibStub:IterateLibraries() do
manuallyFinalize(major, instance)
end
end)
for major, instance in LibStub:IterateLibraries() do
manuallyFinalize(major, instance)
end
-- Expose the library in the global environment
_G[ACELIBRARY_MAJOR] = self
if oldDeactivate then
oldDeactivate(oldLib)
end
end
if not previous then
previous = AceLibrary
end
if not previous.libs then
previous.libs = {}
end
AceLibrary.libs = previous.libs
if not previous.positions then
previous.positions = setmetatable({}, { __mode = "k" })
end
AceLibrary.positions = previous.positions
AceLibrary:Register(AceLibrary, ACELIBRARY_MAJOR, ACELIBRARY_MINOR, activate, nil)
@@ -0,0 +1,15 @@
## Interface: 30300
## X-Curse-Packaged-Version: r1101
## X-Curse-Project-Name: Ace2
## X-Curse-Project-ID: ace2
## X-Curse-Repository-ID: wow/ace2/mainline
## Title: Lib: AceLibrary
## Notes: AddOn development framework
## Author: Ace Development Team
## X-Website: http://www.wowace.com
## X-Category: Library
## X-License: LGPL v2.1 + MIT for AceOO-2.0
AceLibrary.lua
File diff suppressed because it is too large Load Diff
+18
View File
@@ -0,0 +1,18 @@
## Interface: 20400
## LoadOnDemand: 1
## Title: Lib: Dewdrop-2.0
## Notes: A library to provide a clean dropdown menu interface.
## Author: ckknight
## eMail: ckknight@gmail.com
## X-Category: Library
## OptionalDeps: Ace2
## X-AceLibrary-Dewdrop-2.0: true
## X-License: LGPL v2.1
## X-Curse-Packaged-Version: r321
## X-Curse-Project-Name: DewdropLib
## X-Curse-Project-ID: dewdroplib
## X-Curse-Repository-ID: wow/dewdroplib/mainline
embeds.xml
Dewdrop-2.0\Dewdrop-2.0.lua
+15
View File
@@ -0,0 +1,15 @@
Copyright (C) 2006-2007 ckknight
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+6
View File
@@ -0,0 +1,6 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceLibrary\AceLibrary.lua"/>
</Ui>
@@ -0,0 +1,201 @@
--[[
****************************************************************************************
LibAboutPanel
File date: 2009-06-23T02:04:30Z
Project version: v1.43
Author: Tekkub, Ackis
****************************************************************************************
]]--
local lib, oldminor = LibStub:NewLibrary("LibAboutPanel", 2)
if not lib then return end
function lib.new(parent, addonname)
local frame = CreateFrame("Frame", nil, UIParent)
frame.name, frame.parent, frame.addonname = not parent and gsub(addonname," ","") or "About", parent, gsub(addonname," ","") -- Remove spaces from addonname because GetMetadata doesn't like that
frame:Hide()
frame:SetScript("OnShow", lib.OnShow)
InterfaceOptions_AddCategory(frame)
return frame
end
local GAME_LOCALE = GetLocale()
local L = {}
-- frFR
if GAME_LOCALE == "frFR" then
L["About"] = "à propos de"
L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
-- deDE
elseif GAME_LOCALE == "deDE" then
L["About"] = "Über"
L["Click and press Ctrl-C to copy"] = "Klicken und Strg-C drücken zum kopieren"
-- esES
elseif GAME_LOCALE == "esES" then
L["About"] = "Acerca de"
L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
-- esMX
elseif GAME_LOCALE == "esMX" then
L["About"] = "Sobre"
L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
-- koKR
elseif GAME_LOCALE == "koKR" then
L["About"] = "대하여"
L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
-- ruRU
elseif GAME_LOCALE == "ruRU" then
L["About"] = "Об аддоне"
L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
-- zhCN
elseif GAME_LOCALE == "zhCN" then
L["About"] = "关于"
L["Click and press Ctrl-C to copy"] = "点击并 Ctrl-C 复制"
-- zhTW
elseif GAME_LOCALE == "zhTW" then
L["About"] = "關於"
L["Click and press Ctrl-C to copy"] = "點擊並 Ctrl-C 復制"
-- enUS and non-localized
else
L["About"] ="About"
L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
end
local editbox = CreateFrame('EditBox', nil, UIParent)
editbox:Hide()
editbox:SetAutoFocus(true)
editbox:SetHeight(32)
editbox:SetFontObject('GameFontHighlightSmall')
lib.editbox = editbox
local left = editbox:CreateTexture(nil, "BACKGROUND")
left:SetWidth(8) left:SetHeight(20)
left:SetPoint("LEFT", -5, 0)
left:SetTexture("Interface\\Common\\Common-Input-Border")
left:SetTexCoord(0, 0.0625, 0, 0.625)
local right = editbox:CreateTexture(nil, "BACKGROUND")
right:SetWidth(8) right:SetHeight(20)
right:SetPoint("RIGHT", 0, 0)
right:SetTexture("Interface\\Common\\Common-Input-Border")
right:SetTexCoord(0.9375, 1, 0, 0.625)
local center = editbox:CreateTexture(nil, "BACKGROUND")
center:SetHeight(20)
center:SetPoint("RIGHT", right, "LEFT", 0, 0)
center:SetPoint("LEFT", left, "RIGHT", 0, 0)
center:SetTexture("Interface\\Common\\Common-Input-Border")
center:SetTexCoord(0.0625, 0.9375, 0, 0.625)
editbox:SetScript("OnEscapePressed", editbox.ClearFocus)
editbox:SetScript("OnEnterPressed", editbox.ClearFocus)
editbox:SetScript("OnEditFocusLost", editbox.Hide)
editbox:SetScript("OnEditFocusGained", editbox.HighlightText)
editbox:SetScript("OnTextChanged", function(self)
self:SetText(self:GetParent().val)
self:HighlightText()
end)
function lib.OpenEditbox(self)
editbox:SetText(self.val)
editbox:SetParent(self)
editbox:SetPoint("LEFT", self)
editbox:SetPoint("RIGHT", self)
editbox:Show()
end
local fields = {"Version", "Author", "X-Category", "X-License", "X-Email", "Email", "eMail", "X-Website", "X-Credits", "X-Localizations", "X-Donate"}
local haseditbox = {["X-Website"] = true, ["X-Email"] = true, ["X-Donate"] = true, ["Email"] = true, ["eMail"] = true}
local function HideTooltip() GameTooltip:Hide() end
local function ShowTooltip(self)
GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT")
GameTooltip:SetText(L["Click and press Ctrl-C to copy"])
--GameTooltip:SetText("Click and press Ctrl-C to copy")
end
function lib.OnShow(frame)
local notefield = "Notes"
if (GAME_LOCALE ~= "enUS") then
notefield = notefield .. "-" .. GAME_LOCALE
end
-- Get the localized version of notes if it exists or fall back to the english one.
local notes = GetAddOnMetadata(frame.addonname, notefield) or GetAddOnMetadata(frame.addonname, "Notes")
local title = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
title:SetPoint("TOPLEFT", 16, -16)
title:SetText(frame.parent and (frame.parent.." - " .. L["About"]) or frame.name)
local subtitle = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
subtitle:SetHeight(32)
subtitle:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -8)
subtitle:SetPoint("RIGHT", frame, -32, 0)
subtitle:SetNonSpaceWrap(true)
subtitle:SetJustifyH("LEFT")
subtitle:SetJustifyV("TOP")
subtitle:SetText(notes)
local anchor
for _,field in pairs(fields) do
local val = GetAddOnMetadata(frame.addonname, field)
if val then
local title = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
title:SetWidth(75)
if not anchor then title:SetPoint("TOPLEFT", subtitle, "BOTTOMLEFT", -2, -12)
else title:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, -10) end
title:SetJustifyH("RIGHT")
title:SetText(field:gsub("X%-", ""))
local detail = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
detail:SetHeight(32)
detail:SetPoint("LEFT", title, "RIGHT", 4, 0)
detail:SetPoint("RIGHT", frame, -16, 0)
detail:SetJustifyH("LEFT")
if (field == "Author") then
local authorservername = GetAddOnMetadata(frame.addonname, "X-Author-Server")
local authorfaction = GetAddOnMetadata(frame.addonname, "X-Author-Faction")
if authorservername and authorfaction then
detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val .. " on " .. authorservername .. " (" .. authorfaction .. ")")
elseif authorservername and not authorfaction then
detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val .. " on " .. authorservername)
elseif not authorservername and authorfaction then
detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val .. " (" .. authorfaction .. ")")
else
detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val)
end
elseif (field == "Version") then
local addonversion = GetAddOnMetadata(frame.addonname, field)
-- Remove @project-revision@ and replace it with Repository
addonversion = string.gsub(addonversion,"@project.revision@","Repository")
detail:SetText((haseditbox[field] and "|cff9999ff" or "").. addonversion)
else
detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val)
end
if haseditbox[field] then
local button = CreateFrame("Button", nil, frame)
button:SetAllPoints(detail)
button.val = val
button:SetScript("OnClick", lib.OpenEditbox)
button:SetScript("OnEnter", ShowTooltip)
button:SetScript("OnLeave", HideTooltip)
end
anchor = title
end
end
end
@@ -0,0 +1,36 @@
## Title: Lib: AboutPanel
## X-Curse-Packaged-Version: v1.43
## X-Curse-Project-Name: LibAboutPanel
## X-Curse-Project-ID: libaboutpanel
## X-Curse-Repository-ID: wow/libaboutpanel/mainline
## Notes: Adds an about panel to interface options.
## Author: Ackis
## eMail: ackis AT shaw DOT ca
##X-Author-Faction = Alliance
##X-Author-Server = Thunderlord US
## X-Donate: http://www.curseforge.com/projects/libaboutpanel/#w_donations
## Interface: 30300
## Version: 1.43
## X-Revision: @project-revision@
## X-Date: 2009-12-18T22:27:31Z
## X-Category: Libraries
## X-Localizations: enUS
## X-Website: http://www.wowwiki.com/LibAboutPanel
## X-Feedback: http://wow.curse.com/downloads/wow-addons/details/libaboutpanel.aspx
## Dependencies:
## X-Embeds: LibStub, CallbackHandler-1.0
## OptionalDeps: LibStub, CallbackHandler-1.0
## DefaultState: Enabled
## LoadOnDemand: 0
#@no-lib-strip@
libs\LibStub\LibStub.lua
libs\CallbackHandler-1.0\CallbackHandler-1.0.xml
#@end-no-lib-strip@
LibAboutPanel.lua
+4
View File
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibAboutPanel.lua" />
</Ui>
@@ -0,0 +1,240 @@
--[[ $Id: CallbackHandler-1.0.lua 14 2010-08-09 00:43:38Z mikk $ ]]
local MAJOR, MINOR = "CallbackHandler-1.0", 6
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
if not CallbackHandler then return end -- No upgrade needed
local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
-- Lua APIs
local tconcat = table.concat
local assert, error, loadstring = assert, error, loadstring
local setmetatable, rawset, rawget = setmetatable, rawset, rawget
local next, select, pairs, type, tostring = next, select, pairs, type, tostring
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: geterrorhandler
local xpcall = xpcall
local function errorhandler(err)
return geterrorhandler()(err)
end
local function CreateDispatcher(argCount)
local code = [[
local next, xpcall, eh = ...
local method, ARGS
local function call() method(ARGS) end
local function dispatch(handlers, ...)
local index
index, method = next(handlers)
if not method then return end
local OLD_ARGS = ARGS
ARGS = ...
repeat
xpcall(call, eh)
index, method = next(handlers, index)
until not method
ARGS = OLD_ARGS
end
return dispatch
]]
local ARGS, OLD_ARGS = {}, {}
for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
end
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
--------------------------------------------------------------------------
-- CallbackHandler:New
--
-- target - target object to embed public APIs in
-- RegisterName - name of the callback registration API, default "RegisterCallback"
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
-- TODO: Remove this after beta has gone out
assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
RegisterName = RegisterName or "RegisterCallback"
UnregisterName = UnregisterName or "UnregisterCallback"
if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
UnregisterAllName = "UnregisterAllCallbacks"
end
-- we declare all objects and exported APIs inside this closure to quickly gain access
-- to e.g. function names, the "target" parameter, etc
-- Create the registry object
local events = setmetatable({}, meta)
local registry = { recurse=0, events=events }
-- registry:Fire() - fires the given event/message into the registry
function registry:Fire(eventname, ...)
if not rawget(events, eventname) or not next(events[eventname]) then return end
local oldrecurse = registry.recurse
registry.recurse = oldrecurse + 1
Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
registry.recurse = oldrecurse
if registry.insertQueue and oldrecurse==0 then
-- Something in one of our callbacks wanted to register more callbacks; they got queued
for eventname,callbacks in pairs(registry.insertQueue) do
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
for self,func in pairs(callbacks) do
events[eventname][self] = func
-- fire OnUsed callback?
if first and registry.OnUsed then
registry.OnUsed(registry, target, eventname)
first = nil
end
end
end
registry.insertQueue = nil
end
end
-- Registration of a callback, handles:
-- self["method"], leads to self["method"](self, ...)
-- self with function ref, leads to functionref(...)
-- "addonId" (instead of self) with function ref, leads to functionref(...)
-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
if type(eventname) ~= "string" then
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
end
method = method or eventname
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
if type(method) ~= "string" and type(method) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
end
local regfunc
if type(method) == "string" then
-- self["method"] calling style
if type(self) ~= "table" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
elseif self==target then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
elseif type(self[method]) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
end
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) self[method](self,arg,...) end
else
regfunc = function(...) self[method](self,...) end
end
else
-- function ref with self=object or self="addonId" or self=thread
if type(self)~="table" and type(self)~="string" and type(self)~="thread" then
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2)
end
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) method(arg,...) end
else
regfunc = method
end
end
if events[eventname][self] or registry.recurse<1 then
-- if registry.recurse<1 then
-- we're overwriting an existing entry, or not currently recursing. just set it.
events[eventname][self] = regfunc
-- fire OnUsed callback?
if registry.OnUsed and first then
registry.OnUsed(registry, target, eventname)
end
else
-- we're currently processing a callback in this registry, so delay the registration of this new entry!
-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
registry.insertQueue = registry.insertQueue or setmetatable({},meta)
registry.insertQueue[eventname][self] = regfunc
end
end
-- Unregister a callback
target[UnregisterName] = function(self, eventname)
if not self or self==target then
error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
end
if type(eventname) ~= "string" then
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
end
if rawget(events, eventname) and events[eventname][self] then
events[eventname][self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(events[eventname]) then
registry.OnUnused(registry, target, eventname)
end
end
if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
registry.insertQueue[eventname][self] = nil
end
end
-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
if UnregisterAllName then
target[UnregisterAllName] = function(...)
if select("#",...)<1 then
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
end
if select("#",...)==1 and ...==target then
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
end
for i=1,select("#",...) do
local self = select(i,...)
if registry.insertQueue then
for eventname, callbacks in pairs(registry.insertQueue) do
if callbacks[self] then
callbacks[self] = nil
end
end
end
for eventname, callbacks in pairs(events) do
if callbacks[self] then
callbacks[self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(callbacks) then
registry.OnUnused(registry, target, eventname)
end
end
end
end
end
end
return registry
end
-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
-- try to upgrade old implicit embeds since the system is selfcontained and
-- relies on closures to work.
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="CallbackHandler-1.0.lua"/>
</Ui>
@@ -0,0 +1,30 @@
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
@@ -0,0 +1,13 @@
## Interface: 20400
## Title: Lib: LibStub
## Notes: Universal Library Stub
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
## X-Website: http://jira.wowace.com/browse/LS
## X-Category: Library
## X-License: Public Domain
## X-Curse-Packaged-Version: 1.0
## X-Curse-Project-Name: LibStub
## X-Curse-Project-ID: libstub
## X-Curse-Repository-ID: wow/libstub/mainline
LibStub.lua
@@ -0,0 +1,292 @@
-- LibBabble-3.0 is hereby placed in the Public Domain
-- Credits: ckknight
local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
if not LibBabble then
return
end
local data = LibBabble.data or {}
for k,v in pairs(LibBabble) do
LibBabble[k] = nil
end
LibBabble.data = data
local tablesToDB = {}
for namespace, db in pairs(data) do
for k,v in pairs(db) do
tablesToDB[v] = db
end
end
local function warn(message)
local _, ret = pcall(error, message, 3)
geterrorhandler()(ret)
end
local lookup_mt = { __index = function(self, key)
local db = tablesToDB[self]
local current_key = db.current[key]
if current_key then
self[key] = current_key
return current_key
end
local base_key = db.base[key]
local real_MAJOR_VERSION
for k,v in pairs(data) do
if v == db then
real_MAJOR_VERSION = k
break
end
end
if not real_MAJOR_VERSION then
real_MAJOR_VERSION = LIBBABBLE_MAJOR
end
if base_key then
warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
rawset(self, key, base_key)
return base_key
end
warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
rawset(self, key, key)
return key
end }
local function initLookup(module, lookup)
local db = tablesToDB[module]
for k in pairs(lookup) do
lookup[k] = nil
end
setmetatable(lookup, lookup_mt)
tablesToDB[lookup] = db
db.lookup = lookup
return lookup
end
local function initReverse(module, reverse)
local db = tablesToDB[module]
for k in pairs(reverse) do
reverse[k] = nil
end
for k,v in pairs(db.current) do
reverse[v] = k
end
tablesToDB[reverse] = db
db.reverse = reverse
db.reverseIterators = nil
return reverse
end
local prototype = {}
local prototype_mt = {__index = prototype}
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will warn but allow the code to pass through.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BL = B:GetLookupTable()
assert(BL["Some english word"] == "Some localized word")
DoSomething(BL["Some english word that doesn't exist"]) -- warning!
-----------------------------------------------------------------------------]]
function prototype:GetLookupTable()
local db = tablesToDB[self]
local lookup = db.lookup
if lookup then
return lookup
end
return initLookup(self, {})
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_has = B:GetUnstrictLookupTable()
assert(B_has["Some english word"] == "Some localized word")
assert(B_has["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetUnstrictLookupTable()
local db = tablesToDB[self]
return db.current
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_hasBase = B:GetBaseLookupTable()
assert(B_hasBase["Some english word"] == "Some english word")
assert(B_hasBase["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetBaseLookupTable()
local db = tablesToDB[self]
return db.base
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
Returns:
A lookup table for localized to english words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BR = B:GetReverseLookupTable()
assert(BR["Some localized word"] == "Some english word")
assert(BR["Some localized word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetReverseLookupTable()
local db = tablesToDB[self]
local reverse = db.reverse
if reverse then
return reverse
end
return initReverse(self, {})
end
local blank = {}
local weakVal = {__mode='v'}
--[[---------------------------------------------------------------------------
Arguments:
string - the localized word to chek for.
Returns:
An iterator to traverse all English words that map to the given key
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for word in B:GetReverseIterator("Some localized word") do
DoSomething(word)
end
-----------------------------------------------------------------------------]]
function prototype:GetReverseIterator(key)
local db = tablesToDB[self]
local reverseIterators = db.reverseIterators
if not reverseIterators then
reverseIterators = setmetatable({}, weakVal)
db.reverseIterators = reverseIterators
elseif reverseIterators[key] then
return pairs(reverseIterators[key])
end
local t
for k,v in pairs(db.current) do
if v == key then
if not t then
t = {}
end
t[k] = true
end
end
reverseIterators[key] = t or blank
return pairs(reverseIterators[key])
end
--[[---------------------------------------------------------------------------
Returns:
An iterator to traverse all translations English to localized.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for english, localized in B:Iterate() do
DoSomething(english, localized)
end
-----------------------------------------------------------------------------]]
function prototype:Iterate()
local db = tablesToDB[self]
return pairs(db.current)
end
-- #NODOC
-- modules need to call this to set the base table
function prototype:SetBaseTranslations(base)
local db = tablesToDB[self]
local oldBase = db.base
if oldBase then
for k in pairs(oldBase) do
oldBase[k] = nil
end
for k, v in pairs(base) do
oldBase[k] = v
end
base = oldBase
else
db.base = base
end
for k,v in pairs(base) do
if v == true then
base[k] = k
end
end
end
local function init(module)
local db = tablesToDB[module]
if db.lookup then
initLookup(module, db.lookup)
end
if db.reverse then
initReverse(module, db.reverse)
end
db.reverseIterators = nil
end
-- #NODOC
-- modules need to call this to set the current table. if current is true, use the base table.
function prototype:SetCurrentTranslations(current)
local db = tablesToDB[self]
if current == true then
db.current = db.base
else
local oldCurrent = db.current
if oldCurrent then
for k in pairs(oldCurrent) do
oldCurrent[k] = nil
end
for k, v in pairs(current) do
oldCurrent[k] = v
end
current = oldCurrent
else
db.current = current
end
end
init(self)
end
for namespace, db in pairs(data) do
setmetatable(db.module, prototype_mt)
init(db.module)
end
-- #NODOC
-- modules need to call this to create a new namespace.
function LibBabble:New(namespace, minor)
local module, oldminor = LibStub:NewLibrary(namespace, minor)
if not module then
return
end
if not oldminor then
local db = {
module = module,
}
data[namespace] = db
tablesToDB[module] = db
else
for k,v in pairs(module) do
module[k] = nil
end
end
setmetatable(module, prototype_mt)
return module
end
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,21 @@
## Interface: 30300
## LoadOnDemand: 1
## Title: Lib: Babble-Boss-3.0
## Notes: A library to help with localization of bosses.
## Notes-zhCN: 为本地化服务的支持库[首领名称]
## Notes-zhTW: 為本地化服務的函式庫[首領名稱]
## Notes-deDE: BabbleLib ist eine Bibliothek, die bei der Lokalisierung helfen soll.
## Notes-frFR: Une bibliothèque d'aide à la localisation.
## Notes-esES: Una biblioteca para ayudar con las localizaciones.
## Author: ckknight
## X-eMail: ckknight@gmail.com
## X-Category: Library
## X-License: MIT
## X-Curse-Packaged-Version: r296
## X-Curse-Project-Name: LibBabble-Boss-3.0
## X-Curse-Project-ID: libbabble-boss-3-0
## X-Curse-Repository-ID: wow/libbabble-boss-3-0/mainline
LibStub\LibStub.lua
lib.xml
@@ -0,0 +1,30 @@
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
@@ -0,0 +1,5 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibBabble-3.0.lua" />
<Script file="LibBabble-Boss-3.0.lua" />
</Ui>
@@ -0,0 +1,292 @@
-- LibBabble-3.0 is hereby placed in the Public Domain
-- Credits: ckknight
local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
if not LibBabble then
return
end
local data = LibBabble.data or {}
for k,v in pairs(LibBabble) do
LibBabble[k] = nil
end
LibBabble.data = data
local tablesToDB = {}
for namespace, db in pairs(data) do
for k,v in pairs(db) do
tablesToDB[v] = db
end
end
local function warn(message)
local _, ret = pcall(error, message, 3)
geterrorhandler()(ret)
end
local lookup_mt = { __index = function(self, key)
local db = tablesToDB[self]
local current_key = db.current[key]
if current_key then
self[key] = current_key
return current_key
end
local base_key = db.base[key]
local real_MAJOR_VERSION
for k,v in pairs(data) do
if v == db then
real_MAJOR_VERSION = k
break
end
end
if not real_MAJOR_VERSION then
real_MAJOR_VERSION = LIBBABBLE_MAJOR
end
if base_key then
warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
rawset(self, key, base_key)
return base_key
end
warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
rawset(self, key, key)
return key
end }
local function initLookup(module, lookup)
local db = tablesToDB[module]
for k in pairs(lookup) do
lookup[k] = nil
end
setmetatable(lookup, lookup_mt)
tablesToDB[lookup] = db
db.lookup = lookup
return lookup
end
local function initReverse(module, reverse)
local db = tablesToDB[module]
for k in pairs(reverse) do
reverse[k] = nil
end
for k,v in pairs(db.current) do
reverse[v] = k
end
tablesToDB[reverse] = db
db.reverse = reverse
db.reverseIterators = nil
return reverse
end
local prototype = {}
local prototype_mt = {__index = prototype}
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will warn but allow the code to pass through.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BL = B:GetLookupTable()
assert(BL["Some english word"] == "Some localized word")
DoSomething(BL["Some english word that doesn't exist"]) -- warning!
-----------------------------------------------------------------------------]]
function prototype:GetLookupTable()
local db = tablesToDB[self]
local lookup = db.lookup
if lookup then
return lookup
end
return initLookup(self, {})
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_has = B:GetUnstrictLookupTable()
assert(B_has["Some english word"] == "Some localized word")
assert(B_has["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetUnstrictLookupTable()
local db = tablesToDB[self]
return db.current
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_hasBase = B:GetBaseLookupTable()
assert(B_hasBase["Some english word"] == "Some english word")
assert(B_hasBase["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetBaseLookupTable()
local db = tablesToDB[self]
return db.base
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
Returns:
A lookup table for localized to english words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BR = B:GetReverseLookupTable()
assert(BR["Some localized word"] == "Some english word")
assert(BR["Some localized word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetReverseLookupTable()
local db = tablesToDB[self]
local reverse = db.reverse
if reverse then
return reverse
end
return initReverse(self, {})
end
local blank = {}
local weakVal = {__mode='v'}
--[[---------------------------------------------------------------------------
Arguments:
string - the localized word to chek for.
Returns:
An iterator to traverse all English words that map to the given key
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for word in B:GetReverseIterator("Some localized word") do
DoSomething(word)
end
-----------------------------------------------------------------------------]]
function prototype:GetReverseIterator(key)
local db = tablesToDB[self]
local reverseIterators = db.reverseIterators
if not reverseIterators then
reverseIterators = setmetatable({}, weakVal)
db.reverseIterators = reverseIterators
elseif reverseIterators[key] then
return pairs(reverseIterators[key])
end
local t
for k,v in pairs(db.current) do
if v == key then
if not t then
t = {}
end
t[k] = true
end
end
reverseIterators[key] = t or blank
return pairs(reverseIterators[key])
end
--[[---------------------------------------------------------------------------
Returns:
An iterator to traverse all translations English to localized.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for english, localized in B:Iterate() do
DoSomething(english, localized)
end
-----------------------------------------------------------------------------]]
function prototype:Iterate()
local db = tablesToDB[self]
return pairs(db.current)
end
-- #NODOC
-- modules need to call this to set the base table
function prototype:SetBaseTranslations(base)
local db = tablesToDB[self]
local oldBase = db.base
if oldBase then
for k in pairs(oldBase) do
oldBase[k] = nil
end
for k, v in pairs(base) do
oldBase[k] = v
end
base = oldBase
else
db.base = base
end
for k,v in pairs(base) do
if v == true then
base[k] = k
end
end
end
local function init(module)
local db = tablesToDB[module]
if db.lookup then
initLookup(module, db.lookup)
end
if db.reverse then
initReverse(module, db.reverse)
end
db.reverseIterators = nil
end
-- #NODOC
-- modules need to call this to set the current table. if current is true, use the base table.
function prototype:SetCurrentTranslations(current)
local db = tablesToDB[self]
if current == true then
db.current = db.base
else
local oldCurrent = db.current
if oldCurrent then
for k in pairs(oldCurrent) do
oldCurrent[k] = nil
end
for k, v in pairs(current) do
oldCurrent[k] = v
end
current = oldCurrent
else
db.current = current
end
end
init(self)
end
for namespace, db in pairs(data) do
setmetatable(db.module, prototype_mt)
init(db.module)
end
-- #NODOC
-- modules need to call this to create a new namespace.
function LibBabble:New(namespace, minor)
local module, oldminor = LibStub:NewLibrary(namespace, minor)
if not module then
return
end
if not oldminor then
local db = {
module = module,
}
data[namespace] = db
tablesToDB[module] = db
else
for k,v in pairs(module) do
module[k] = nil
end
end
setmetatable(module, prototype_mt)
return module
end
@@ -0,0 +1,799 @@
--[[
Name: LibBabble-Faction-3.0
Revision: $Rev: 112 $
Maintainers: ckknight, nevcairiel, Ackis
Website: http://www.wowace.com/projects/libbabble-faction-3-0/
Dependencies: None
License: MIT
]]
local MAJOR_VERSION = "LibBabble-Faction-3.0"
local MINOR_VERSION = 90000 + tonumber(("$Rev: 112 $"):match("%d+"))
if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
local lib = LibStub("LibBabble-3.0"):New(MAJOR_VERSION, MINOR_VERSION)
if not lib then return end
local GAME_LOCALE = GetLocale()
lib:SetBaseTranslations {
Alliance = "Alliance",
["Alliance Vanguard"] = "Alliance Vanguard",
["Argent Crusade"] = "Argent Crusade",
["Argent Dawn"] = "Argent Dawn",
["Ashtongue Deathsworn"] = "Ashtongue Deathsworn",
["Bloodsail Buccaneers"] = "Bloodsail Buccaneers",
["Booty Bay"] = "Booty Bay",
["Brood of Nozdormu"] = "Brood of Nozdormu",
["Cenarion Circle"] = "Cenarion Circle",
["Cenarion Expedition"] = "Cenarion Expedition",
["Darkmoon Faire"] = "Darkmoon Faire",
["Darkspear Trolls"] = "Darkspear Trolls",
Darnassus = "Darnassus",
Everlook = "Everlook",
Exalted = "Exalted",
Exodar = "Exodar",
["Explorers' League"] = "Explorers' League",
["Frenzyheart Tribe"] = "Frenzyheart Tribe",
Friendly = "Friendly",
["Frostwolf Clan"] = "Frostwolf Clan",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Gelkis Clan Centaur",
["Gnomeregan Exiles"] = "Gnomeregan Exiles",
Honored = "Honored",
["Honor Hold"] = "Honor Hold",
Horde = "Horde",
["Horde Expedition"] = "Horde Expedition",
["Hydraxian Waterlords"] = "Hydraxian Waterlords",
Ironforge = "Ironforge",
["Keepers of Time"] = "Keepers of Time",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Knights of the Ebon Blade",
Kurenai = "Kurenai",
["Lower City"] = "Lower City",
["Magram Clan Centaur"] = "Magram Clan Centaur",
Netherwing = "Netherwing",
Neutral = "Neutral",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ratchet = "Ratchet",
Ravenholdt = "Ravenholdt",
Revered = "Revered",
["Sha'tari Skyguard"] = "Sha'tari Skyguard",
["Shattered Sun Offensive"] = "Shattered Sun Offensive",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Silvermoon City",
["Silverwing Sentinels"] = "Silverwing Sentinels",
Sporeggar = "Sporeggar",
["Stormpike Guard"] = "Stormpike Guard",
Stormwind = "Stormwind",
Syndicate = "Syndicate",
["The Aldor"] = "The Aldor",
["The Ashen Verdict"] = "The Ashen Verdict",
["The Consortium"] = "The Consortium",
["The Defilers"] = "The Defilers",
["The Frostborn"] = "The Frostborn",
["The Hand of Vengeance"] = "The Hand of Vengeance",
["The Kalu'ak"] = "The Kalu'ak",
["The League of Arathor"] = "The League of Arathor",
["The Mag'har"] = "The Mag'har",
["The Oracles"] = "The Oracles",
["The Scale of the Sands"] = "The Scale of the Sands",
["The Scryers"] = "The Scryers",
["The Sha'tar"] = "The Sha'tar",
["The Silver Covenant"] = "The Silver Covenant",
["The Sons of Hodir"] = "The Sons of Hodir",
["The Sunreavers"] = "The Sunreavers",
["The Taunka"] = "The Taunka",
["The Violet Eye"] = "The Violet Eye",
["The Wyrmrest Accord"] = "The Wyrmrest Accord",
["Thorium Brotherhood"] = "Thorium Brotherhood",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Thunder Bluff",
["Timbermaw Hold"] = "Timbermaw Hold",
Tranquillien = "Tranquillien",
Undercity = "Undercity",
["Valiance Expedition"] = "Valiance Expedition",
["Warsong Offensive"] = "Warsong Offensive",
["Warsong Outriders"] = "Warsong Outriders",
["Wildhammer Clan"] = "Wildhammer Clan",
["Winterfin Retreat"] = "Winterfin Retreat",
["Wintersaber Trainers"] = "Wintersaber Trainers",
["Zandalar Tribe"] = "Zandalar Tribe",
}
if GAME_LOCALE == "enUS" then
lib:SetCurrentTranslations(true)
elseif GAME_LOCALE == "deDE" then
lib:SetCurrentTranslations {
Alliance = "Allianz",
["Alliance Vanguard"] = "Vorposten der Allianz",
["Argent Crusade"] = "Argentumkreuzzug",
["Argent Dawn"] = "Argentumdämmerung",
["Ashtongue Deathsworn"] = "Die Todeshörigen",
["Bloodsail Buccaneers"] = "Blutsegelbukaniere",
["Booty Bay"] = "Beutebucht",
["Brood of Nozdormu"] = "Brut Nozdormus",
["Cenarion Circle"] = "Zirkel des Cenarius",
["Cenarion Expedition"] = "Expedition des Cenarius",
["Darkmoon Faire"] = "Dunkelmond-Jahrmarkt",
["Darkspear Trolls"] = "Dunkelspeertrolle",
Darnassus = "Darnassus",
Everlook = "Ewige Warte",
Exalted = "Ehrfürchtig",
Exodar = "Die Exodar",
["Explorers' League"] = "Forscherliga",
["Frenzyheart Tribe"] = "Stamm der Wildherzen",
Friendly = "Freundlich",
["Frostwolf Clan"] = "Frostwolfklan",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Gelkisklan",
["Gnomeregan Exiles"] = "Gnomeregangnome",
Honored = "Wohlwollend",
["Honor Hold"] = "Ehrenfeste",
Horde = "Horde",
["Horde Expedition"] = "Expedition der Horde",
["Hydraxian Waterlords"] = "Hydraxianer",
Ironforge = "Eisenschmiede",
["Keepers of Time"] = "Hüter der Zeit",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Ritter der Schwarzen Klinge",
Kurenai = "Kurenai",
["Lower City"] = "Unteres Viertel",
["Magram Clan Centaur"] = "Magramklan",
Netherwing = "Netherschwingen",
Neutral = "Neutral",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ratchet = "Ratschet",
Ravenholdt = "Rabenholdt",
Revered = "Respektvoll",
["Sha'tari Skyguard"] = "Himmelswache der Sha'tari",
["Shattered Sun Offensive"] = "Offensive der Zerschmetterten Sonne",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Silbermond",
["Silverwing Sentinels"] = "Silberschwingen",
Sporeggar = "Sporeggar",
["Stormpike Guard"] = "Sturmlanzengarde",
Stormwind = "Sturmwind",
Syndicate = "Syndikat",
["The Aldor"] = "Die Aldor",
["The Ashen Verdict"] = "Das Äscherne Verdikt",
["The Consortium"] = "Das Konsortium",
["The Defilers"] = "Die Entweihten",
["The Frostborn"] = "Die Frosterben",
["The Hand of Vengeance"] = "Die Hand der Rache",
["The Kalu'ak"] = "Die Kalu'ak",
["The League of Arathor"] = "Der Bund von Arathor",
["The Mag'har"] = "Die Mag'har",
["The Oracles"] = "Die Orakel",
["The Scale of the Sands"] = "Die Wächter der Sande",
["The Scryers"] = "Die Seher",
["The Sha'tar"] = "Die Sha'tar",
["The Silver Covenant"] = "Der Silberbund",
["The Sons of Hodir"] = "Die Söhne Hodirs",
["The Sunreavers"] = "Die Sonnenhäscher",
["The Taunka"] = "Die Taunka",
["The Violet Eye"] = "Das Violette Auge",
["The Wyrmrest Accord"] = "Der Wyrmruhpakt",
["Thorium Brotherhood"] = "Thoriumbruderschaft",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Donnerfels",
["Timbermaw Hold"] = "Holzschlundfeste",
Tranquillien = "Tristessa",
Undercity = "Unterstadt",
["Valiance Expedition"] = "Expedition Valianz",
["Warsong Offensive"] = "Kriegshymnenoffensive",
["Warsong Outriders"] = "Vorhut des Kriegshymnenklan",
["Wildhammer Clan"] = "Wildhammerklan",
["Winterfin Retreat"] = "Zuflucht der Winterflossen",
["Wintersaber Trainers"] = "Wintersäblerausbilder",
["Zandalar Tribe"] = "Stamm der Zandalari",
}
elseif GAME_LOCALE == "frFR" then
lib:SetCurrentTranslations {
Alliance = "Alliance",
["Alliance Vanguard"] = "Avant-garde de l'Alliance",
["Argent Crusade"] = "La Croisade d'argent",
["Argent Dawn"] = "Aube d'argent",
["Ashtongue Deathsworn"] = "Ligemort cendrelangue",
["Bloodsail Buccaneers"] = "La Voile sanglante",
["Booty Bay"] = "Baie-du-Butin",
["Brood of Nozdormu"] = "Progéniture de Nozdormu",
["Cenarion Circle"] = "Cercle cénarien",
["Cenarion Expedition"] = "Expédition cénarienne",
["Darkmoon Faire"] = "Foire de Sombrelune",
["Darkspear Trolls"] = "Trolls Sombrelance",
Darnassus = "Darnassus",
Everlook = "Long-guet",
Exalted = "Exalté",
Exodar = "Exodar",
["Explorers' League"] = "Ligue des explorateurs",
["Frenzyheart Tribe"] = "La tribu Frénécœur",
Friendly = "Amical",
["Frostwolf Clan"] = "Clan Loup-de-givre",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Centaures (Gelkis)",
["Gnomeregan Exiles"] = "Exilés de Gnomeregan",
Honored = "Honoré",
["Honor Hold"] = "Bastion de l'Honneur",
Horde = "Horde",
["Horde Expedition"] = "Expédition de la Horde",
["Hydraxian Waterlords"] = "Les Hydraxiens",
Ironforge = "Forgefer",
["Keepers of Time"] = "Gardiens du Temps",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Chevaliers de la Lame d'ébène",
Kurenai = "Kurenaï",
["Lower City"] = "Ville basse",
["Magram Clan Centaur"] = "Centaures (Magram)",
Netherwing = "Aile-du-Néant",
Neutral = "Neutre",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ratchet = "Cabestan",
Ravenholdt = "Ravenholdt",
Revered = "Révéré",
["Sha'tari Skyguard"] = "Garde-ciel sha'tari",
["Shattered Sun Offensive"] = "Opération Soleil brisé",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Lune-d'argent",
["Silverwing Sentinels"] = "Sentinelles d'Aile-argent",
Sporeggar = "Sporeggar",
["Stormpike Guard"] = "Garde Foudrepique",
Stormwind = "Hurlevent",
Syndicate = "Syndicat",
["The Aldor"] = "L'Aldor",
["The Ashen Verdict"] = "Le Verdict des cendres",
["The Consortium"] = "Le Consortium",
["The Defilers"] = "Les Profanateurs",
["The Frostborn"] = "Les Givre-nés",
["The Hand of Vengeance"] = "La Main de la vengeance",
["The Kalu'ak"] = "Les Kalu'aks",
["The League of Arathor"] = "La Ligue d'Arathor",
["The Mag'har"] = "Les Mag'har",
["The Oracles"] = "Les Oracles",
["The Scale of the Sands"] = "La Balance des sables",
["The Scryers"] = "Les Clairvoyants",
["The Sha'tar"] = "Les Sha'tar",
["The Silver Covenant"] = "Le Concordat argenté",
["The Sons of Hodir"] = "Les Fils de Hodir",
["The Sunreavers"] = "Les Saccage-soleil",
["The Taunka"] = "Les Taunkas",
["The Violet Eye"] = "L'Œil pourpre",
["The Wyrmrest Accord"] = "L'Accord du Repos du ver",
["Thorium Brotherhood"] = "Confrérie du thorium",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Les Pitons du Tonnerre",
["Timbermaw Hold"] = "Les Grumegueules",
Tranquillien = "Tranquillien",
Undercity = "Fossoyeuse",
["Valiance Expedition"] = "Expédition de la Bravoure",
["Warsong Offensive"] = "Offensive chanteguerre",
["Warsong Outriders"] = "Voltigeurs Chanteguerre",
["Wildhammer Clan"] = "Clan Marteau-hardi",
["Winterfin Retreat"] = "Retraite des Ailerons-d'hiver",
["Wintersaber Trainers"] = "Éleveurs de sabres-d'hiver",
["Zandalar Tribe"] = "Tribu Zandalar",
}
elseif GAME_LOCALE == "koKR" then
lib:SetCurrentTranslations {
Alliance = "얼라이언스",
["Alliance Vanguard"] = "얼라이언스 선봉대",
["Argent Crusade"] = "은빛십자군",
["Argent Dawn"] = "은빛 여명회",
["Ashtongue Deathsworn"] = "잿빛혓바닥 결사단",
["Bloodsail Buccaneers"] = "붉은 해적단",
["Booty Bay"] = "무법항",
["Brood of Nozdormu"] = "노즈도르무 혈족",
["Cenarion Circle"] = "세나리온 의회",
["Cenarion Expedition"] = "세나리온 원정대",
["Darkmoon Faire"] = "다크문 유랑단",
["Darkspear Trolls"] = "검은창 트롤",
Darnassus = "다르나서스",
Everlook = "눈망루 마을",
Exalted = "확고한 동맹",
Exodar = "엑소다르",
["Explorers' League"] = "탐험가 연맹",
["Frenzyheart Tribe"] = "광란의심장일족",
Friendly = "약간 우호적",
["Frostwolf Clan"] = "서리늑대 부족",
Gadgetzan = "가젯잔",
["Gelkis Clan Centaur"] = "겔키스 부족 켄타로우스",
["Gnomeregan Exiles"] = "놈리건",
Honored = "우호적",
["Honor Hold"] = "명예의 요새",
Horde = "호드",
["Horde Expedition"] = "호드 원정대",
["Hydraxian Waterlords"] = "히드락시안 물의 군주",
Ironforge = "아이언포지",
["Keepers of Time"] = "시간의 수호자",
["Kirin Tor"] = "키린 토",
["Knights of the Ebon Blade"] = "칠흑의 기사단",
Kurenai = "쿠레나이",
["Lower City"] = "고난의 거리",
["Magram Clan Centaur"] = "마그람 부족 켄타로우스",
Netherwing = "황천의 용군단",
Neutral = "중립적",
["Ogri'la"] = "오그릴라",
Orgrimmar = "오그리마",
Ratchet = "톱니항",
Ravenholdt = "라벤홀트",
Revered = "매우 우호적",
["Sha'tari Skyguard"] = "샤타리 하늘경비대",
["Shattered Sun Offensive"] = "무너진 태양 공격대",
["Shen'dralar"] = "센드렐라",
["Silvermoon City"] = "실버문",
["Silverwing Sentinels"] = "은빛날개 파수대",
Sporeggar = "스포어가르",
["Stormpike Guard"] = "스톰파이크 경비대",
Stormwind = "스톰윈드",
Syndicate = "비밀결사대",
["The Aldor"] = "알도르 사제회",
["The Ashen Verdict"] = "잿빛 선고단",
["The Consortium"] = "무역연합",
["The Defilers"] = "포세이큰 파멸단",
["The Frostborn"] = "서릿결부족 드워프",
["The Hand of Vengeance"] = "복수의 대리인",
["The Kalu'ak"] = "칼루아크",
["The League of Arathor"] = "아라소르 연맹",
["The Mag'har"] = "마그하르",
["The Oracles"] = "점쟁이 조합",
["The Scale of the Sands"] = "시간의 중재자",
["The Scryers"] = "점술가 길드",
["The Sha'tar"] = "샤타르",
["The Silver Covenant"] = "은빛 서약단",
["The Sons of Hodir"] = "호디르의 후예",
["The Sunreavers"] = "선리버",
["The Taunka"] = "타운카",
["The Violet Eye"] = "보랏빛 눈의 감시자",
["The Wyrmrest Accord"] = "고룡쉼터 사원 용군단",
["Thorium Brotherhood"] = "토륨 대장조합 ",
Thrallmar = "스랄마",
["Thunder Bluff"] = "썬더 블러프",
["Timbermaw Hold"] = "나무구렁 요새",
Tranquillien = "트랜퀼리엔",
Undercity = "언더시티",
["Valiance Expedition"] = "용맹의 원정대",
["Warsong Offensive"] = "전쟁노래 공격대",
["Warsong Outriders"] = "전쟁노래 정찰대",
["Wildhammer Clan"] = "와일드해머 부족",
["Winterfin Retreat"] = "겨울지느러미 은신처",
["Wintersaber Trainers"] = "눈호랑이 조련사",
["Zandalar Tribe"] = "잔달라 부족",
}
elseif GAME_LOCALE == "esES" then
lib:SetCurrentTranslations {
Alliance = "Alianza",
["Alliance Vanguard"] = "Vanguardia de la Alianza",
["Argent Crusade"] = "Cruzada Argenta",
["Argent Dawn"] = "El Alba Argenta",
["Ashtongue Deathsworn"] = "Juramorte Lengua de ceniza",
["Bloodsail Buccaneers"] = "Bucaneros Velasangre",
["Booty Bay"] = "Bahía del Botín",
["Brood of Nozdormu"] = "Linaje de Nozdormu",
["Cenarion Circle"] = "Círculo Cenarion",
["Cenarion Expedition"] = "Expedición Cenarion",
["Darkmoon Faire"] = "Feria de la Luna Negra",
["Darkspear Trolls"] = "Trols Lanza Negra",
Darnassus = "Darnassus",
Everlook = "Vista Eterna",
Exalted = "Exaltado",
Exodar = "El Exodar",
["Explorers' League"] = "Liga de Expedicionarios",
["Frenzyheart Tribe"] = "Tribu Corazón Frenético",
Friendly = "Amistoso",
["Frostwolf Clan"] = "Clan Lobo Gélido",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Centauros del clan Gelkis",
["Gnomeregan Exiles"] = "Exiliados de Gnomeregan",
Honored = "Honorable",
["Honor Hold"] = "Bastión del Honor",
Horde = "Horda",
["Horde Expedition"] = "Expedición de la Horda",
["Hydraxian Waterlords"] = "Srs. del Agua de Hydraxis",
Ironforge = "Forjaz",
["Keepers of Time"] = "Vigilantes del Tiempo",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Caballeros de la Espada de Ébano",
Kurenai = "Kurenai",
["Lower City"] = "Bajo Arrabal",
["Magram Clan Centaur"] = "Centauros del clan Magram",
Netherwing = "Ala Abisal",
Neutral = "Neutral",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ratchet = "Trinquete",
Ravenholdt = "Ravenholdt",
Revered = "Reverenciado",
["Sha'tari Skyguard"] = "Guardia del cielo Sha'tari",
["Shattered Sun Offensive"] = "Ofensiva Sol Devastado",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Ciudad de Lunargenta",
["Silverwing Sentinels"] = "Centinelas Ala de Plata",
Sporeggar = "Esporaggar",
["Stormpike Guard"] = "Guardia Pico Tormenta",
Stormwind = "Ventormenta",
Syndicate = "La Hermandad",
["The Aldor"] = "Los Aldor",
["The Ashen Verdict"] = "El Veredicto Cinéreo",
["The Consortium"] = "El Consorcio",
["The Defilers"] = "Los Rapiñadores",
["The Frostborn"] = "Los Natoescarcha",
["The Hand of Vengeance"] = "La Mano de la Venganza",
["The Kalu'ak"] = "Los Kalu'ak",
["The League of Arathor"] = "Liga de Arathor",
["The Mag'har"] = "Los Mag'har",
["The Oracles"] = "Los Oráculos",
["The Scale of the Sands"] = "La Escama de las Arenas",
["The Scryers"] = "Los Arúspices",
["The Sha'tar"] = "Los Sha'tar",
["The Silver Covenant"] = "El Pacto de Plata",
["The Sons of Hodir"] = "Los Hijos de Hodir",
["The Sunreavers"] = "Los Atracasol",
["The Taunka"] = "Los Taunka",
["The Violet Eye"] = "El Ojo Violeta",
["The Wyrmrest Accord"] = "El Acuerdo del Reposo del Dragón",
["Thorium Brotherhood"] = "Hermandad del Torio",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Cima del Trueno",
["Timbermaw Hold"] = "Bastión Fauces de Madera",
Tranquillien = "Tranquillien",
Undercity = "Entrañas",
["Valiance Expedition"] = "Expedición de Denuedo",
["Warsong Offensive"] = "Ofensiva Grito de Guerra",
["Warsong Outriders"] = "Escoltas Grito de Guerra",
["Wildhammer Clan"] = "Clan Martillo Salvaje",
["Winterfin Retreat"] = "Retiro Aleta Invernal",
["Wintersaber Trainers"] = "Instructores de Sableinvernales",
["Zandalar Tribe"] = "Tribu Zandalar",
}
elseif GAME_LOCALE == "esMX" then
lib:SetCurrentTranslations {
Alliance = "Alianza",
["Alliance Vanguard"] = "Vanguardia de la Alianza",
["Argent Crusade"] = "Cruzada Argenta",
["Argent Dawn"] = "Alba Argenta",
["Ashtongue Deathsworn"] = "Juramorte Lengua de ceniza",
["Bloodsail Buccaneers"] = "Bucaneros Velasangre",
["Booty Bay"] = "Bahía del Botín",
["Brood of Nozdormu"] = "Linaje de Nozdormu",
["Cenarion Circle"] = "Círculo Cenarion",
["Cenarion Expedition"] = "Expedición Cenarion",
["Darkmoon Faire"] = "Feria de la Luna Negra",
["Darkspear Trolls"] = "Trols Lanza Negra",
Darnassus = "Darnassus",
Everlook = "Vista Eterna",
Exalted = "Exaltado",
Exodar = "Exodar",
["Explorers' League"] = "Liga de Expedicionarios",
["Frenzyheart Tribe"] = "Tribu Corazón Frenético",
Friendly = "Amistoso",
["Frostwolf Clan"] = "Clan Lobo Gélido",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Centauro del clan Gelkis",
["Gnomeregan Exiles"] = "Exiliados de Gnomeregan",
Honored = "Honorable",
["Honor Hold"] = "Bastión del Honor",
Horde = "Horda",
["Horde Expedition"] = "Expedición de la Horda",
["Hydraxian Waterlords"] = "Srs. del Agua de Hydraxis",
Ironforge = "Forjaz",
["Keepers of Time"] = "Vigilantes del tiempo",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Caballeros de la Espada de Ébano",
Kurenai = "Kurenai",
["Lower City"] = "Bajo Arrabal",
["Magram Clan Centaur"] = "Centauro del clan Magram",
Netherwing = "Ala Abisal",
Neutral = "Neutral",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ratchet = "Trinquete",
Ravenholdt = "Ravenholdt",
Revered = "Reverenciado",
["Sha'tari Skyguard"] = "Guardia del cielo Sha'tari",
["Shattered Sun Offensive"] = "Ofensiva Sol Devastado",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Ciudad de Lunargenta",
["Silverwing Sentinels"] = "Centinelas Ala de Plata",
Sporeggar = "Esporaggar",
["Stormpike Guard"] = "Guardia Pico Tormenta",
Stormwind = "Ventormenta",
Syndicate = "La Hermandad",
["The Aldor"] = "Los Aldor",
-- ["The Ashen Verdict"] = "",
["The Consortium"] = "El Consorcio",
["The Defilers"] = "Los Rapiñadores",
["The Frostborn"] = "Los Natoescarcha",
["The Hand of Vengeance"] = "La Mano de la Venganza",
["The Kalu'ak"] = "Los Kalu'ak",
["The League of Arathor"] = "Liga de Arathor",
["The Mag'har"] = "Los Mag'har",
["The Oracles"] = "Los Oráculos",
["The Scale of the Sands"] = "La Escama de las Arenas",
["The Scryers"] = "Los Arúspices",
["The Sha'tar"] = "Los Sha'tar",
["The Silver Covenant"] = "El Pacto de Plata",
["The Sons of Hodir"] = "Los Hijos de Hodir",
["The Sunreavers"] = "Los Atracasol",
["The Taunka"] = "Los taunka",
["The Violet Eye"] = "El Ojo Violeta",
["The Wyrmrest Accord"] = "El Acuerdo del Reposo del Dragón",
["Thorium Brotherhood"] = "Hermandad del torio",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Cima del Trueno",
["Timbermaw Hold"] = "Bastión Fauces de Madera",
Tranquillien = "Tranquilien",
Undercity = "Entrañas",
["Valiance Expedition"] = "Expedición de Denuedo",
["Warsong Offensive"] = "Ofensiva Grito de Guerra",
["Warsong Outriders"] = "Escoltas Grito de Guerra",
["Wildhammer Clan"] = "Clan Martillo Salvaje",
["Winterfin Retreat"] = "Retiro Aleta Invernal",
["Wintersaber Trainers"] = "Instructores de Sableinvernales",
["Zandalar Tribe"] = "Tribu Zandalar",
}
elseif GAME_LOCALE == "ruRU" then
lib:SetCurrentTranslations {
Alliance = "Альянс",
["Alliance Vanguard"] = "Авангард Альянса",
["Argent Crusade"] = "Серебряный Авангард",
["Argent Dawn"] = "Серебряный Рассвет",
["Ashtongue Deathsworn"] = "Пеплоусты-служители",
["Bloodsail Buccaneers"] = "Пираты Кровавого Паруса",
["Booty Bay"] = "Пиратская бухта",
["Brood of Nozdormu"] = "Род Ноздорму",
["Cenarion Circle"] = "Круг Кенария",
["Cenarion Expedition"] = "Экспедиция Ценариона",
["Darkmoon Faire"] = "Ярмарка Новолуния",
["Darkspear Trolls"] = "Тролли Черного Копья",
Darnassus = "Дарнас",
Everlook = "Круговзор",
Exalted = "Превознесение",
Exodar = "Экзодар",
["Explorers' League"] = "Лига исследователей",
["Frenzyheart Tribe"] = "Племя Мятежного Сердца",
Friendly = "Дружелюбие",
["Frostwolf Clan"] = "Клан Северного Волка",
Gadgetzan = "Прибамбасск",
["Gelkis Clan Centaur"] = "Кентавры из племени Гелкис",
["Gnomeregan Exiles"] = "Изгнанники Гномрегана",
Honored = "Уважение",
["Honor Hold"] = "Оплот Чести",
Horde = "Орда",
["Horde Expedition"] = "Экспедиция Орды",
["Hydraxian Waterlords"] = "Гидраксианские Повелители Вод",
Ironforge = "Стальгорн",
["Keepers of Time"] = "Хранители Времени",
["Kirin Tor"] = "Кирин-Тор",
["Knights of the Ebon Blade"] = "Рыцари Черного Клинка",
Kurenai = "Куренай",
["Lower City"] = "Нижний Город",
["Magram Clan Centaur"] = "Кентавры из племени Маграм",
Netherwing = "Крылья Пустоты",
Neutral = "Равнодушие",
["Ogri'la"] = "Огри'ла",
Orgrimmar = "Оргриммар",
Ratchet = "Кабестан",
Ravenholdt = "Черный Ворон",
Revered = "Почтение",
["Sha'tari Skyguard"] = "Стражи Небес Ша'тар",
["Shattered Sun Offensive"] = "Армия Расколотого Солнца",
["Shen'dralar"] = "Шен'дралар",
["Silvermoon City"] = "Луносвет",
["Silverwing Sentinels"] = "Среброкрылые Часовые",
Sporeggar = "Спореггар",
["Stormpike Guard"] = "Стража Грозовой Вершины",
Stormwind = "Штормград",
Syndicate = "Синдикат",
["The Aldor"] = "Алдоры",
["The Ashen Verdict"] = "Пепельный союз",
["The Consortium"] = "Консорциум",
["The Defilers"] = "Осквернители",
["The Frostborn"] = "Зиморожденные",
["The Hand of Vengeance"] = "Карающая длань",
["The Kalu'ak"] = "Калу'ак",
["The League of Arathor"] = "Лига Аратора",
["The Mag'har"] = "Маг'хары",
["The Oracles"] = "Оракулы",
["The Scale of the Sands"] = "Песчаная Чешуя",
["The Scryers"] = "Провидцы",
["The Sha'tar"] = "Ша'тар",
["The Silver Covenant"] = "Серебряный Союз",
["The Sons of Hodir"] = "Сыновья Ходира",
["The Sunreavers"] = "Похитители солнца",
["The Taunka"] = "Таунка",
["The Violet Eye"] = "Аметистовое Око",
["The Wyrmrest Accord"] = "Драконий союз",
["Thorium Brotherhood"] = "Братство Тория",
Thrallmar = "Траллмар",
["Thunder Bluff"] = "Громовой Утес",
["Timbermaw Hold"] = "Древобрюхи",
Tranquillien = "Транквиллион",
Undercity = "Подгород",
["Valiance Expedition"] = "Экспедиция Отважных",
["Warsong Offensive"] = "Армия Песни Войны",
["Warsong Outriders"] = "Всадники Песни Войны",
["Wildhammer Clan"] = "Неистовый Молот",
["Winterfin Retreat"] = "Холодный Плавник",
["Wintersaber Trainers"] = "Укротители ледопардов",
["Zandalar Tribe"] = "Племя Зандалар",
}
elseif GAME_LOCALE == "zhCN" then
lib:SetCurrentTranslations {
Alliance = "联盟",
["Alliance Vanguard"] = "联盟先遣军",
["Argent Crusade"] = "银色北伐军",
["Argent Dawn"] = "银色黎明",
["Ashtongue Deathsworn"] = "灰舌死誓者",
["Bloodsail Buccaneers"] = "血帆海盗",
["Booty Bay"] = "藏宝海湾",
["Brood of Nozdormu"] = "诺兹多姆的子嗣",
["Cenarion Circle"] = "塞纳里奥议会",
["Cenarion Expedition"] = "塞纳里奥远征队",
["Darkmoon Faire"] = "暗月马戏团",
["Darkspear Trolls"] = "暗矛巨魔",
Darnassus = "达纳苏斯",
Everlook = "永望镇",
Exalted = "崇拜",
Exodar = "埃索达",
["Explorers' League"] = "探险者协会",
["Frenzyheart Tribe"] = "狂心氏族",
Friendly = "友善",
["Frostwolf Clan"] = "霜狼氏族",
Gadgetzan = "加基森",
["Gelkis Clan Centaur"] = "吉尔吉斯半人马",
["Gnomeregan Exiles"] = "诺莫瑞根流亡者",
Honored = "尊敬",
["Honor Hold"] = "荣耀堡",
Horde = "部落",
["Horde Expedition"] = "部落先遣军",
["Hydraxian Waterlords"] = "海达希亚水元素",
Ironforge = "铁炉堡",
["Keepers of Time"] = "时光守护者",
["Kirin Tor"] = "肯瑞托",
["Knights of the Ebon Blade"] = "黑锋骑士团",
Kurenai = "库雷尼",
["Lower City"] = "贫民窟",
["Magram Clan Centaur"] = "玛格拉姆半人马",
Netherwing = "灵翼之龙",
Neutral = "中立",
["Ogri'la"] = "奥格瑞拉",
Orgrimmar = "奥格瑞玛",
Ratchet = "棘齿城",
Ravenholdt = "拉文霍德",
Revered = "崇敬",
["Sha'tari Skyguard"] = "沙塔尔天空卫士",
["Shattered Sun Offensive"] = "破碎残阳",
["Shen'dralar"] = "辛德拉",
["Silvermoon City"] = "银月城",
["Silverwing Sentinels"] = "银翼哨兵",
Sporeggar = "孢子村",
["Stormpike Guard"] = "雷矛卫队",
Stormwind = "暴风城",
Syndicate = "辛迪加",
["The Aldor"] = "奥尔多",
["The Ashen Verdict"] = "灰烬审判军",
["The Consortium"] = "星界财团",
["The Defilers"] = "污染者",
["The Frostborn"] = "霜脉矮人",
["The Hand of Vengeance"] = "复仇之手",
["The Kalu'ak"] = "卡鲁亚克",
["The League of Arathor"] = "阿拉索联军",
["The Mag'har"] = "玛格汉",
["The Oracles"] = "神谕者",
["The Scale of the Sands"] = "流沙之鳞",
["The Scryers"] = "占星者",
["The Sha'tar"] = "沙塔尔",
["The Silver Covenant"] = "银色盟约",
["The Sons of Hodir"] = "霍迪尔之子",
["The Sunreavers"] = "夺日者",
["The Taunka"] = "牦牛人",
["The Violet Eye"] = "紫罗兰之眼",
["The Wyrmrest Accord"] = "龙眠联军",
["Thorium Brotherhood"] = "瑟银兄弟会",
Thrallmar = "萨尔玛",
["Thunder Bluff"] = "雷霆崖",
["Timbermaw Hold"] = "木喉要塞",
Tranquillien = "塔奎林",
Undercity = "幽暗城",
["Valiance Expedition"] = "无畏远征军",
["Warsong Offensive"] = "战歌远征军",
["Warsong Outriders"] = "战歌侦察骑兵",
["Wildhammer Clan"] = "蛮锤部族",
["Winterfin Retreat"] = "冬鳞避难所",
["Wintersaber Trainers"] = "冬刃豹训练师",
["Zandalar Tribe"] = "赞达拉部族",
}
elseif GAME_LOCALE == "zhTW" then
lib:SetCurrentTranslations {
Alliance = "聯盟",
["Alliance Vanguard"] = "聯盟先鋒",
["Argent Crusade"] = "銀白十字軍",
["Argent Dawn"] = "銀色黎明",
["Ashtongue Deathsworn"] = "灰舌死亡誓言者",
["Bloodsail Buccaneers"] = "血帆海盜",
["Booty Bay"] = "藏寶海灣",
["Brood of Nozdormu"] = "諾茲多姆的子嗣",
["Cenarion Circle"] = "塞納里奧議會",
["Cenarion Expedition"] = "塞納里奧遠征隊",
["Darkmoon Faire"] = "暗月馬戲團",
["Darkspear Trolls"] = "暗矛食人妖",
Darnassus = "達納蘇斯",
Everlook = "永望鎮",
Exalted = "崇拜",
Exodar = "艾克索達",
["Explorers' League"] = "探險者協會",
["Frenzyheart Tribe"] = "狂心部族",
Friendly = "友好",
["Frostwolf Clan"] = "霜狼氏族",
Gadgetzan = "加基森",
["Gelkis Clan Centaur"] = "吉爾吉斯半人馬",
["Gnomeregan Exiles"] = "諾姆瑞根流亡者",
Honored = "尊敬",
["Honor Hold"] = "榮譽堡",
Horde = "部落",
["Horde Expedition"] = "部落遠征軍",
["Hydraxian Waterlords"] = "海達希亞水元素",
Ironforge = "鐵爐堡",
["Keepers of Time"] = "時光守望者",
["Kirin Tor"] = "祈倫托",
["Knights of the Ebon Blade"] = "黯刃騎士團",
Kurenai = "卡爾奈",
["Lower City"] = "陰鬱城",
["Magram Clan Centaur"] = "瑪格拉姆半人馬",
Netherwing = "虛空之翼",
Neutral = "中立",
["Ogri'la"] = "歐格利拉",
Orgrimmar = "奧格瑪",
Ratchet = "棘齒城",
Ravenholdt = "拉文霍德",
Revered = "崇敬",
["Sha'tari Skyguard"] = "薩塔禦天者",
["Shattered Sun Offensive"] = "破碎之日進攻部隊",
["Shen'dralar"] = "辛德拉",
["Silvermoon City"] = "銀月城",
["Silverwing Sentinels"] = "銀翼哨兵",
Sporeggar = "斯博格爾",
["Stormpike Guard"] = "雷矛衛隊",
Stormwind = "暴風城",
Syndicate = "辛迪加",
["The Aldor"] = "奧多爾",
["The Ashen Verdict"] = "灰燼裁決軍",
["The Consortium"] = "聯合團",
["The Defilers"] = "污染者",
["The Frostborn"] = "霜誕矮人",
["The Hand of Vengeance"] = "復仇之手",
["The Kalu'ak"] = "卡魯耶克",
["The League of Arathor"] = "阿拉索聯軍",
["The Mag'har"] = "瑪格哈",
["The Oracles"] = "神諭者",
["The Scale of the Sands"] = "流沙之鱗",
["The Scryers"] = "占卜者",
["The Sha'tar"] = "薩塔",
["The Silver Covenant"] = "白銀誓盟",
["The Sons of Hodir"] = "霍迪爾之子",
["The Sunreavers"] = "奪日者",
["The Taunka"] = "坦卡族",
["The Violet Eye"] = "紫羅蘭之眼",
["The Wyrmrest Accord"] = "龍眠協調者",
["Thorium Brotherhood"] = "瑟銀兄弟會",
Thrallmar = "索爾瑪",
["Thunder Bluff"] = "雷霆崖",
["Timbermaw Hold"] = "木喉要塞",
Tranquillien = "安寧地",
Undercity = "幽暗城",
["Valiance Expedition"] = "驍勇遠征隊",
["Warsong Offensive"] = "戰歌進攻部隊",
["Warsong Outriders"] = "戰歌偵察騎兵",
["Wildhammer Clan"] = "蠻錘氏族",
["Winterfin Retreat"] = "冬鰭避居地",
["Wintersaber Trainers"] = "冬刃豹訓練師",
["Zandalar Tribe"] = "贊達拉部族",
}
else
error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
end
@@ -0,0 +1,22 @@
## Interface: 30300
## LoadOnDemand: 1
## Title: Lib: Babble-Faction-3.0
## Notes: A library to help with localization of factions.
## Notes-zhCN: 为本地化服务的支持库[声望阵营]
## Notes-zhTW: 為本地化服務的函式庫[聲望陣營]
## Notes-deDE: BabbleLib ist eine Bibliothek, die bei der Lokalisierung helfen soll.
## Notes-frFR: Une bibliothèque d'aide à la localisation.
## Notes-esES: Una biblioteca para ayudar con las localizaciones.
## Notes-ruRU: Библиотека для локализации аддонов.
## Author: Daviesh
## X-eMail: oma_daviesh@hotmail.com
## X-Category: Library
## X-License: MIT
## X-Curse-Packaged-Version: r112
## X-Curse-Project-Name: LibBabble-Faction-3.0
## X-Curse-Project-ID: libbabble-faction-3-0
## X-Curse-Repository-ID: wow/libbabble-faction-3-0/mainline
LibStub\LibStub.lua
lib.xml
@@ -0,0 +1,30 @@
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
@@ -0,0 +1,5 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibBabble-3.0.lua" />
<Script file="LibBabble-Faction-3.0.lua" />
</Ui>
@@ -0,0 +1,292 @@
-- LibBabble-3.0 is hereby placed in the Public Domain
-- Credits: ckknight
local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
if not LibBabble then
return
end
local data = LibBabble.data or {}
for k,v in pairs(LibBabble) do
LibBabble[k] = nil
end
LibBabble.data = data
local tablesToDB = {}
for namespace, db in pairs(data) do
for k,v in pairs(db) do
tablesToDB[v] = db
end
end
local function warn(message)
local _, ret = pcall(error, message, 3)
geterrorhandler()(ret)
end
local lookup_mt = { __index = function(self, key)
local db = tablesToDB[self]
local current_key = db.current[key]
if current_key then
self[key] = current_key
return current_key
end
local base_key = db.base[key]
local real_MAJOR_VERSION
for k,v in pairs(data) do
if v == db then
real_MAJOR_VERSION = k
break
end
end
if not real_MAJOR_VERSION then
real_MAJOR_VERSION = LIBBABBLE_MAJOR
end
if base_key then
warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
rawset(self, key, base_key)
return base_key
end
warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
rawset(self, key, key)
return key
end }
local function initLookup(module, lookup)
local db = tablesToDB[module]
for k in pairs(lookup) do
lookup[k] = nil
end
setmetatable(lookup, lookup_mt)
tablesToDB[lookup] = db
db.lookup = lookup
return lookup
end
local function initReverse(module, reverse)
local db = tablesToDB[module]
for k in pairs(reverse) do
reverse[k] = nil
end
for k,v in pairs(db.current) do
reverse[v] = k
end
tablesToDB[reverse] = db
db.reverse = reverse
db.reverseIterators = nil
return reverse
end
local prototype = {}
local prototype_mt = {__index = prototype}
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will warn but allow the code to pass through.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BL = B:GetLookupTable()
assert(BL["Some english word"] == "Some localized word")
DoSomething(BL["Some english word that doesn't exist"]) -- warning!
-----------------------------------------------------------------------------]]
function prototype:GetLookupTable()
local db = tablesToDB[self]
local lookup = db.lookup
if lookup then
return lookup
end
return initLookup(self, {})
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_has = B:GetUnstrictLookupTable()
assert(B_has["Some english word"] == "Some localized word")
assert(B_has["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetUnstrictLookupTable()
local db = tablesToDB[self]
return db.current
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_hasBase = B:GetBaseLookupTable()
assert(B_hasBase["Some english word"] == "Some english word")
assert(B_hasBase["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetBaseLookupTable()
local db = tablesToDB[self]
return db.base
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
Returns:
A lookup table for localized to english words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BR = B:GetReverseLookupTable()
assert(BR["Some localized word"] == "Some english word")
assert(BR["Some localized word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetReverseLookupTable()
local db = tablesToDB[self]
local reverse = db.reverse
if reverse then
return reverse
end
return initReverse(self, {})
end
local blank = {}
local weakVal = {__mode='v'}
--[[---------------------------------------------------------------------------
Arguments:
string - the localized word to chek for.
Returns:
An iterator to traverse all English words that map to the given key
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for word in B:GetReverseIterator("Some localized word") do
DoSomething(word)
end
-----------------------------------------------------------------------------]]
function prototype:GetReverseIterator(key)
local db = tablesToDB[self]
local reverseIterators = db.reverseIterators
if not reverseIterators then
reverseIterators = setmetatable({}, weakVal)
db.reverseIterators = reverseIterators
elseif reverseIterators[key] then
return pairs(reverseIterators[key])
end
local t
for k,v in pairs(db.current) do
if v == key then
if not t then
t = {}
end
t[k] = true
end
end
reverseIterators[key] = t or blank
return pairs(reverseIterators[key])
end
--[[---------------------------------------------------------------------------
Returns:
An iterator to traverse all translations English to localized.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for english, localized in B:Iterate() do
DoSomething(english, localized)
end
-----------------------------------------------------------------------------]]
function prototype:Iterate()
local db = tablesToDB[self]
return pairs(db.current)
end
-- #NODOC
-- modules need to call this to set the base table
function prototype:SetBaseTranslations(base)
local db = tablesToDB[self]
local oldBase = db.base
if oldBase then
for k in pairs(oldBase) do
oldBase[k] = nil
end
for k, v in pairs(base) do
oldBase[k] = v
end
base = oldBase
else
db.base = base
end
for k,v in pairs(base) do
if v == true then
base[k] = k
end
end
end
local function init(module)
local db = tablesToDB[module]
if db.lookup then
initLookup(module, db.lookup)
end
if db.reverse then
initReverse(module, db.reverse)
end
db.reverseIterators = nil
end
-- #NODOC
-- modules need to call this to set the current table. if current is true, use the base table.
function prototype:SetCurrentTranslations(current)
local db = tablesToDB[self]
if current == true then
db.current = db.base
else
local oldCurrent = db.current
if oldCurrent then
for k in pairs(oldCurrent) do
oldCurrent[k] = nil
end
for k, v in pairs(current) do
oldCurrent[k] = v
end
current = oldCurrent
else
db.current = current
end
end
init(self)
end
for namespace, db in pairs(data) do
setmetatable(db.module, prototype_mt)
init(db.module)
end
-- #NODOC
-- modules need to call this to create a new namespace.
function LibBabble:New(namespace, minor)
local module, oldminor = LibStub:NewLibrary(namespace, minor)
if not module then
return
end
if not oldminor then
local db = {
module = module,
}
data[namespace] = db
tablesToDB[module] = db
else
for k,v in pairs(module) do
module[k] = nil
end
end
setmetatable(module, prototype_mt)
return module
end
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,16 @@
## Interface: 30300
## LoadOnDemand: 1
## Title: Lib: Babble-Inventory-3.0
## Notes: A library to help with localization of item types and subtypes.
## Notes-esES: Una libreria para ayudar con la traduccion de tipos y subtipos de objetos.
## Author: ckknight
## X-eMail: ckknight@gmail.com
## X-Category: Library
## X-License: MIT
## X-Curse-Packaged-Version: r101
## X-Curse-Project-Name: LibBabble-Inventory-3.0
## X-Curse-Project-ID: libbabble-inventory-3-0
## X-Curse-Repository-ID: wow/libbabble-inventory-3-0/mainline
LibStub\LibStub.lua
lib.xml
@@ -0,0 +1,30 @@
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
@@ -0,0 +1,5 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibBabble-3.0.lua" />
<Script file="LibBabble-Inventory-3.0.lua" />
</Ui>
@@ -0,0 +1 @@
package-as: LibBabble-SubZone-3.0
@@ -0,0 +1,292 @@
-- LibBabble-3.0 is hereby placed in the Public Domain
-- Credits: ckknight
local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
if not LibBabble then
return
end
local data = LibBabble.data or {}
for k,v in pairs(LibBabble) do
LibBabble[k] = nil
end
LibBabble.data = data
local tablesToDB = {}
for namespace, db in pairs(data) do
for k,v in pairs(db) do
tablesToDB[v] = db
end
end
local function warn(message)
local _, ret = pcall(error, message, 3)
geterrorhandler()(ret)
end
local lookup_mt = { __index = function(self, key)
local db = tablesToDB[self]
local current_key = db.current[key]
if current_key then
self[key] = current_key
return current_key
end
local base_key = db.base[key]
local real_MAJOR_VERSION
for k,v in pairs(data) do
if v == db then
real_MAJOR_VERSION = k
break
end
end
if not real_MAJOR_VERSION then
real_MAJOR_VERSION = LIBBABBLE_MAJOR
end
if base_key then
warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
rawset(self, key, base_key)
return base_key
end
warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
rawset(self, key, key)
return key
end }
local function initLookup(module, lookup)
local db = tablesToDB[module]
for k in pairs(lookup) do
lookup[k] = nil
end
setmetatable(lookup, lookup_mt)
tablesToDB[lookup] = db
db.lookup = lookup
return lookup
end
local function initReverse(module, reverse)
local db = tablesToDB[module]
for k in pairs(reverse) do
reverse[k] = nil
end
for k,v in pairs(db.current) do
reverse[v] = k
end
tablesToDB[reverse] = db
db.reverse = reverse
db.reverseIterators = nil
return reverse
end
local prototype = {}
local prototype_mt = {__index = prototype}
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will warn but allow the code to pass through.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BL = B:GetLookupTable()
assert(BL["Some english word"] == "Some localized word")
DoSomething(BL["Some english word that doesn't exist"]) -- warning!
-----------------------------------------------------------------------------]]
function prototype:GetLookupTable()
local db = tablesToDB[self]
local lookup = db.lookup
if lookup then
return lookup
end
return initLookup(self, {})
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_has = B:GetUnstrictLookupTable()
assert(B_has["Some english word"] == "Some localized word")
assert(B_has["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetUnstrictLookupTable()
local db = tablesToDB[self]
return db.current
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_hasBase = B:GetBaseLookupTable()
assert(B_hasBase["Some english word"] == "Some english word")
assert(B_hasBase["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetBaseLookupTable()
local db = tablesToDB[self]
return db.base
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
Returns:
A lookup table for localized to english words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BR = B:GetReverseLookupTable()
assert(BR["Some localized word"] == "Some english word")
assert(BR["Some localized word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetReverseLookupTable()
local db = tablesToDB[self]
local reverse = db.reverse
if reverse then
return reverse
end
return initReverse(self, {})
end
local blank = {}
local weakVal = {__mode='v'}
--[[---------------------------------------------------------------------------
Arguments:
string - the localized word to chek for.
Returns:
An iterator to traverse all English words that map to the given key
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for word in B:GetReverseIterator("Some localized word") do
DoSomething(word)
end
-----------------------------------------------------------------------------]]
function prototype:GetReverseIterator(key)
local db = tablesToDB[self]
local reverseIterators = db.reverseIterators
if not reverseIterators then
reverseIterators = setmetatable({}, weakVal)
db.reverseIterators = reverseIterators
elseif reverseIterators[key] then
return pairs(reverseIterators[key])
end
local t
for k,v in pairs(db.current) do
if v == key then
if not t then
t = {}
end
t[k] = true
end
end
reverseIterators[key] = t or blank
return pairs(reverseIterators[key])
end
--[[---------------------------------------------------------------------------
Returns:
An iterator to traverse all translations English to localized.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for english, localized in B:Iterate() do
DoSomething(english, localized)
end
-----------------------------------------------------------------------------]]
function prototype:Iterate()
local db = tablesToDB[self]
return pairs(db.current)
end
-- #NODOC
-- modules need to call this to set the base table
function prototype:SetBaseTranslations(base)
local db = tablesToDB[self]
local oldBase = db.base
if oldBase then
for k in pairs(oldBase) do
oldBase[k] = nil
end
for k, v in pairs(base) do
oldBase[k] = v
end
base = oldBase
else
db.base = base
end
for k,v in pairs(base) do
if v == true then
base[k] = k
end
end
end
local function init(module)
local db = tablesToDB[module]
if db.lookup then
initLookup(module, db.lookup)
end
if db.reverse then
initReverse(module, db.reverse)
end
db.reverseIterators = nil
end
-- #NODOC
-- modules need to call this to set the current table. if current is true, use the base table.
function prototype:SetCurrentTranslations(current)
local db = tablesToDB[self]
if current == true then
db.current = db.base
else
local oldCurrent = db.current
if oldCurrent then
for k in pairs(oldCurrent) do
oldCurrent[k] = nil
end
for k, v in pairs(current) do
oldCurrent[k] = v
end
current = oldCurrent
else
db.current = current
end
end
init(self)
end
for namespace, db in pairs(data) do
setmetatable(db.module, prototype_mt)
init(db.module)
end
-- #NODOC
-- modules need to call this to create a new namespace.
function LibBabble:New(namespace, minor)
local module, oldminor = LibStub:NewLibrary(namespace, minor)
if not module then
return
end
if not oldminor then
local db = {
module = module,
}
data[namespace] = db
tablesToDB[module] = db
else
for k,v in pairs(module) do
module[k] = nil
end
end
setmetatable(module, prototype_mt)
return module
end
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
## Interface: 30300
## LoadOnDemand: 1
## Title: Lib: Babble-SubZone-3.0
## Notes: A library to help with localization of in-game subzone names.
## Notes-zhTW: 為本地化服務的函式庫 [副區域名稱]
## Author: Arith
## X-eMail: arithmandarjp@yahoo.co.jp
## X-Category: Library
## X-License: MIT
LibStub\LibStub.lua
lib.xml
@@ -0,0 +1,30 @@
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
@@ -0,0 +1,5 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibBabble-3.0.lua" />
<Script file="LibBabble-SubZone-3.0.lua" />
</Ui>
@@ -0,0 +1 @@
package-as: LibBabble-Zone-3.0
@@ -0,0 +1,292 @@
-- LibBabble-3.0 is hereby placed in the Public Domain
-- Credits: ckknight
local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
if not LibBabble then
return
end
local data = LibBabble.data or {}
for k,v in pairs(LibBabble) do
LibBabble[k] = nil
end
LibBabble.data = data
local tablesToDB = {}
for namespace, db in pairs(data) do
for k,v in pairs(db) do
tablesToDB[v] = db
end
end
local function warn(message)
local _, ret = pcall(error, message, 3)
geterrorhandler()(ret)
end
local lookup_mt = { __index = function(self, key)
local db = tablesToDB[self]
local current_key = db.current[key]
if current_key then
self[key] = current_key
return current_key
end
local base_key = db.base[key]
local real_MAJOR_VERSION
for k,v in pairs(data) do
if v == db then
real_MAJOR_VERSION = k
break
end
end
if not real_MAJOR_VERSION then
real_MAJOR_VERSION = LIBBABBLE_MAJOR
end
if base_key then
warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
rawset(self, key, base_key)
return base_key
end
warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
rawset(self, key, key)
return key
end }
local function initLookup(module, lookup)
local db = tablesToDB[module]
for k in pairs(lookup) do
lookup[k] = nil
end
setmetatable(lookup, lookup_mt)
tablesToDB[lookup] = db
db.lookup = lookup
return lookup
end
local function initReverse(module, reverse)
local db = tablesToDB[module]
for k in pairs(reverse) do
reverse[k] = nil
end
for k,v in pairs(db.current) do
reverse[v] = k
end
tablesToDB[reverse] = db
db.reverse = reverse
db.reverseIterators = nil
return reverse
end
local prototype = {}
local prototype_mt = {__index = prototype}
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will warn but allow the code to pass through.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BL = B:GetLookupTable()
assert(BL["Some english word"] == "Some localized word")
DoSomething(BL["Some english word that doesn't exist"]) -- warning!
-----------------------------------------------------------------------------]]
function prototype:GetLookupTable()
local db = tablesToDB[self]
local lookup = db.lookup
if lookup then
return lookup
end
return initLookup(self, {})
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_has = B:GetUnstrictLookupTable()
assert(B_has["Some english word"] == "Some localized word")
assert(B_has["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetUnstrictLookupTable()
local db = tablesToDB[self]
return db.current
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_hasBase = B:GetBaseLookupTable()
assert(B_hasBase["Some english word"] == "Some english word")
assert(B_hasBase["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetBaseLookupTable()
local db = tablesToDB[self]
return db.base
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
Returns:
A lookup table for localized to english words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BR = B:GetReverseLookupTable()
assert(BR["Some localized word"] == "Some english word")
assert(BR["Some localized word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetReverseLookupTable()
local db = tablesToDB[self]
local reverse = db.reverse
if reverse then
return reverse
end
return initReverse(self, {})
end
local blank = {}
local weakVal = {__mode='v'}
--[[---------------------------------------------------------------------------
Arguments:
string - the localized word to chek for.
Returns:
An iterator to traverse all English words that map to the given key
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for word in B:GetReverseIterator("Some localized word") do
DoSomething(word)
end
-----------------------------------------------------------------------------]]
function prototype:GetReverseIterator(key)
local db = tablesToDB[self]
local reverseIterators = db.reverseIterators
if not reverseIterators then
reverseIterators = setmetatable({}, weakVal)
db.reverseIterators = reverseIterators
elseif reverseIterators[key] then
return pairs(reverseIterators[key])
end
local t
for k,v in pairs(db.current) do
if v == key then
if not t then
t = {}
end
t[k] = true
end
end
reverseIterators[key] = t or blank
return pairs(reverseIterators[key])
end
--[[---------------------------------------------------------------------------
Returns:
An iterator to traverse all translations English to localized.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for english, localized in B:Iterate() do
DoSomething(english, localized)
end
-----------------------------------------------------------------------------]]
function prototype:Iterate()
local db = tablesToDB[self]
return pairs(db.current)
end
-- #NODOC
-- modules need to call this to set the base table
function prototype:SetBaseTranslations(base)
local db = tablesToDB[self]
local oldBase = db.base
if oldBase then
for k in pairs(oldBase) do
oldBase[k] = nil
end
for k, v in pairs(base) do
oldBase[k] = v
end
base = oldBase
else
db.base = base
end
for k,v in pairs(base) do
if v == true then
base[k] = k
end
end
end
local function init(module)
local db = tablesToDB[module]
if db.lookup then
initLookup(module, db.lookup)
end
if db.reverse then
initReverse(module, db.reverse)
end
db.reverseIterators = nil
end
-- #NODOC
-- modules need to call this to set the current table. if current is true, use the base table.
function prototype:SetCurrentTranslations(current)
local db = tablesToDB[self]
if current == true then
db.current = db.base
else
local oldCurrent = db.current
if oldCurrent then
for k in pairs(oldCurrent) do
oldCurrent[k] = nil
end
for k, v in pairs(current) do
oldCurrent[k] = v
end
current = oldCurrent
else
db.current = current
end
end
init(self)
end
for namespace, db in pairs(data) do
setmetatable(db.module, prototype_mt)
init(db.module)
end
-- #NODOC
-- modules need to call this to create a new namespace.
function LibBabble:New(namespace, minor)
local module, oldminor = LibStub:NewLibrary(namespace, minor)
if not module then
return
end
if not oldminor then
local db = {
module = module,
}
data[namespace] = db
tablesToDB[module] = db
else
for k,v in pairs(module) do
module[k] = nil
end
end
setmetatable(module, prototype_mt)
return module
end
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,18 @@
## Interface: 30300
## LoadOnDemand: 1
## Title: Lib: Babble-Zone-3.0
## Notes: A library to help with localization of Zones.
## Notes-deDE: BabbleLib ist eine Bibliothek, die bei der Lokalisierung helfen soll.
## Notes-frFR: Une bibliothèque d'aide à la localisation.
## Notes-esES: Una biblioteca para ayudar con las localizaciones.
## Author: ckknight
## X-eMail: ckknight@gmail.com
## X-Category: Library
## X-License: MIT
## X-Curse-Packaged-Version: r277
## X-Curse-Project-Name: LibBabble-Zone-3.0
## X-Curse-Project-ID: libbabble-zone-3-0
## X-Curse-Repository-ID: wow/libbabble-zone-3-0/mainline
LibStub\LibStub.lua
lib.xml
@@ -0,0 +1,30 @@
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
@@ -0,0 +1,5 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibBabble-3.0.lua" />
<Script file="LibBabble-Zone-3.0.lua" />
</Ui>
@@ -0,0 +1,66 @@
assert(LibStub, "LibDataBroker-1.1 requires LibStub")
assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0")
local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 3)
if not lib then return end
oldminor = oldminor or 0
lib.callbacks = lib.callbacks or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib)
lib.attributestorage, lib.namestorage, lib.proxystorage = lib.attributestorage or {}, lib.namestorage or {}, lib.proxystorage or {}
local attributestorage, namestorage, callbacks = lib.attributestorage, lib.namestorage, lib.callbacks
if oldminor < 2 then
lib.domt = {
__metatable = "access denied",
__index = function(self, key) return attributestorage[self] and attributestorage[self][key] end,
}
end
if oldminor < 3 then
lib.domt.__newindex = function(self, key, value)
if not attributestorage[self] then attributestorage[self] = {} end
if attributestorage[self][key] == value then return end
attributestorage[self][key] = value
local name = namestorage[self]
if not name then return end
callbacks:Fire("LibDataBroker_AttributeChanged", name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name.."_"..key, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged__"..key, name, key, value, self)
end
end
if oldminor < 2 then
function lib:NewDataObject(name, dataobj)
if self.proxystorage[name] then return end
if dataobj then
assert(type(dataobj) == "table", "Invalid dataobj, must be nil or a table")
self.attributestorage[dataobj] = {}
for i,v in pairs(dataobj) do
self.attributestorage[dataobj][i] = v
dataobj[i] = nil
end
end
dataobj = setmetatable(dataobj or {}, self.domt)
self.proxystorage[name], self.namestorage[dataobj] = dataobj, name
self.callbacks:Fire("LibDataBroker_DataObjectCreated", name, dataobj)
return dataobj
end
end
if oldminor < 1 then
function lib:DataObjectIterator()
return pairs(self.proxystorage)
end
function lib:GetDataObjectByName(dataobjectname)
return self.proxystorage[dataobjectname]
end
function lib:GetNameByDataObject(dataobject)
return self.namestorage[dataobject]
end
end

Some files were not shown because too many files have changed in this diff Show More