You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
406 lines
14 KiB
406 lines
14 KiB
|
3 years ago
|
|
||
|
|
-- module independent variables --
|
||
|
|
----------------------------------
|
||
|
|
local addon, ns = ...
|
||
|
|
local C, L, I = ns.LC.color, ns.L, ns.I
|
||
|
|
if ns.client_version<4 then return end
|
||
|
|
|
||
|
|
|
||
|
|
-- module own local variables and local cached functions --
|
||
|
|
-----------------------------------------------------------
|
||
|
|
local name = "Archaeology"; -- PROFESSIONS_ARCHAEOLOGY L["ModDesc-Archaeology"]
|
||
|
|
local ttName, ttColumns, tt, skill, module = name.."TT", 5
|
||
|
|
local tradeskill, maxFragments, maxFragments250 = {},200,{[109585]=1,[108439]=1,[109584]=1};
|
||
|
|
local raceIndex,raceCurrencyId,raceKeystone2Fragments,raceName,raceTexture,raceKeystoneItemID = 1,2,3,4,5,6;
|
||
|
|
local raceFragmentsCollected,raceNumFragmentsRequired,raceFragmentsMax,raceArtifactName,raceArtifactIcon,raceKeystoneSlots = 7,8,9,10,11,12;
|
||
|
|
local raceKeystoneIcon,raceKeystoneCount,raceKeystoneFragmentsValue,raceArtifactSolvable,raceFragmentsIcon,raceCurrencyName = 13,14,15,16,17,18;
|
||
|
|
local keystoneItem2race,races,racesOrder = {};
|
||
|
|
local defaultKeystoneToFragment = 12;
|
||
|
|
local solvables,limitWarning,currencyName2race,currencySeen = {},{},{};
|
||
|
|
local iconFormat1 = "|T%s:14:14:0:0:64:64:4:56:4:56|t";
|
||
|
|
local iconFormat2 = "|T%s:14:14:0:0:128:128:3:70:8:75|t";
|
||
|
|
local CHAT_MSG_CURRENCY_PATTERN = "%[(.*)%]";
|
||
|
|
local knownCurrencies = { -- for module currency but managed here
|
||
|
|
[384]=true,[385]=true,[393]=true,[394]=true,
|
||
|
|
[401]=true,[398]=true,[397]=true,[399]=true,
|
||
|
|
[400]=true,[676]=true,[677]=true,[754]=true,
|
||
|
|
[821]=true,[828]=true,[829]=true,[1172]=true,
|
||
|
|
[1173]=true,[1174]=true,[1535]=true,[1534]=true,
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
-- register icon names and default files --
|
||
|
|
-------------------------------------------
|
||
|
|
I[name] = {iconfile="INTERFACE\\ICONS\\trade_archaeology",coords={0.05,0.95,0.05,0.95}}; --IconName::Archaeology--
|
||
|
|
|
||
|
|
|
||
|
|
-- some local functions --
|
||
|
|
--------------------------
|
||
|
|
function ns.isArchaeologyCurrency(id)
|
||
|
|
return knownCurrencies[id];
|
||
|
|
end
|
||
|
|
|
||
|
|
local function limitColors(numFree,default)
|
||
|
|
return (numFree<=10 and "red") or (numFree<=30 and "orange") or (numFree<=50 and "yellow") or default;
|
||
|
|
end
|
||
|
|
|
||
|
|
local function updateBroker()
|
||
|
|
local obj = ns.LDB:GetDataObjectByName(module.ldbName);
|
||
|
|
local text = {};
|
||
|
|
local numWarning = #limitWarning;
|
||
|
|
if currencySeen then
|
||
|
|
local str = currencySeen[raceName].." "..currencySeen[raceFragmentsCollected];
|
||
|
|
if ns.profile[name].infoRequiredFragments then
|
||
|
|
str = str.."/"..currencySeen[raceNumFragmentsRequired];
|
||
|
|
end
|
||
|
|
if ns.profile[name].infoMaxFragments then
|
||
|
|
str = str.." ("..currencySeen[raceFragmentsMax]..")";
|
||
|
|
end
|
||
|
|
local color = limitColors(currencySeen[raceFragmentsMax]-currencySeen[raceFragmentsCollected],"white");
|
||
|
|
tinsert(text,color~="white" and C(color,str) or str);
|
||
|
|
end
|
||
|
|
if #solvables>0 then
|
||
|
|
tinsert(text,C("green",solvables[1] .. (#solvables>1 and " " ..L["and %d more"]:format(#solvables-1) or "")));
|
||
|
|
end
|
||
|
|
obj.text = #text>0 and table.concat(text,", ") or PROFESSIONS_ARCHAEOLOGY;
|
||
|
|
end
|
||
|
|
|
||
|
|
local function updateRaceArtifact(t,...)
|
||
|
|
local ArtifactName,_,_,ArtifactIcon,_,KeystoneSlots = ...;
|
||
|
|
|
||
|
|
if t[raceArtifactName]==nil and ArtifactName~=nil then
|
||
|
|
t[raceArtifactName],t[raceArtifactIcon],t[raceKeystoneSlots] = ArtifactName,ArtifactIcon,KeystoneSlots;
|
||
|
|
t[raceArtifactIcon] = iconFormat1:format(t[raceArtifactIcon]);
|
||
|
|
|
||
|
|
if(type(t[raceKeystoneItemID])=="number" and t[raceKeystoneItemID]>0) then
|
||
|
|
--keystoneItem2race[t[raceKeystoneItemID]] = t;
|
||
|
|
t[raceKeystoneIcon] = iconFormat1:format(GetItemIcon(t[raceKeystoneItemID]) or ns.icon_fallback);
|
||
|
|
t[raceKeystoneCount] = GetItemCount(t[raceKeystoneItemID],true,true);
|
||
|
|
end
|
||
|
|
|
||
|
|
if(t[raceKeystoneSlots]>0)then
|
||
|
|
t[raceKeystoneFragmentsValue] = (t[raceKeystoneCount]<=t[raceKeystoneSlots] and t[raceKeystoneCount] or t[raceKeystoneSlots]) * (t[raceKeystone2Fragments] or defaultKeystoneToFragment);
|
||
|
|
end
|
||
|
|
|
||
|
|
if(t[raceFragmentsCollected]+t[raceKeystoneFragmentsValue]>=t[raceNumFragmentsRequired])then
|
||
|
|
t[raceArtifactSolvable]=true
|
||
|
|
tinsert(solvables,t[raceName]);
|
||
|
|
end
|
||
|
|
elseif ArtifactName~=nil then
|
||
|
|
t[raceKeystoneSlots] = KeystoneSlots;
|
||
|
|
|
||
|
|
t[raceKeystoneCount] = 0;
|
||
|
|
if(type(t[raceKeystoneItemID])=="number" and t[raceKeystoneItemID]>0) then
|
||
|
|
t[raceKeystoneCount] = GetItemCount(t[raceKeystoneItemID],true,true);
|
||
|
|
end
|
||
|
|
|
||
|
|
if(t[raceKeystoneSlots]>0)then
|
||
|
|
t[raceKeystoneFragmentsValue] = (t[raceKeystoneCount]<t[raceKeystoneSlots] and t[raceKeystoneCount] or t[raceKeystoneSlots]) * (t[raceKeystone2Fragments] or defaultKeystoneToFragment);
|
||
|
|
end
|
||
|
|
|
||
|
|
if(t[raceFragmentsCollected]+t[raceKeystoneFragmentsValue]>=t[raceNumFragmentsRequired])then
|
||
|
|
t[raceArtifactSolvable]=true
|
||
|
|
tinsert(solvables,t[raceName]);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function updateRaces(firstUpdate)
|
||
|
|
wipe(solvables);
|
||
|
|
wipe(limitWarning);
|
||
|
|
if firstUpdate then
|
||
|
|
local num = GetNumArchaeologyRaces();
|
||
|
|
local unknownHeader = true;
|
||
|
|
for i=1, num do
|
||
|
|
local info,iconFile,_ = {GetArchaeologyRaceInfo(i)};
|
||
|
|
local t = races[info[2]];
|
||
|
|
if t==nil then
|
||
|
|
if unknownHeader then
|
||
|
|
tinsert(racesOrder,UNKNOWN);
|
||
|
|
races[UNKNOWN] = {nil, true};
|
||
|
|
unknownHeader = false;
|
||
|
|
end
|
||
|
|
tinsert(racesOrder,info[2]);
|
||
|
|
races[info[2]] = {nil, 0, 0};
|
||
|
|
t=races[info[2]];
|
||
|
|
end
|
||
|
|
t[raceIndex],t[raceKeystoneCount],t[raceKeystoneFragmentsValue],t[raceArtifactSolvable] = i,0,0,false;
|
||
|
|
t[raceName],t[raceTexture],t[raceKeystoneItemID],t[raceFragmentsCollected],t[raceNumFragmentsRequired],t[raceFragmentsMax] = unpack(info);
|
||
|
|
t[raceTexture] = iconFormat2:format(t[raceTexture]);
|
||
|
|
|
||
|
|
if t[raceCurrencyId]~=0 then
|
||
|
|
local currencyInfo = C_CurrencyInfo.GetCurrencyInfo(t[raceCurrencyId]);
|
||
|
|
t[raceCurrencyName] = currencyInfo.name;
|
||
|
|
iconFile = currencyInfo.iconFileID
|
||
|
|
end
|
||
|
|
t[raceFragmentsIcon] = iconFormat1:format(iconFile or ns.icon_fallback);
|
||
|
|
|
||
|
|
updateRaceArtifact(t,GetActiveArtifactByRace(i));
|
||
|
|
|
||
|
|
if t[raceCurrencyName] then
|
||
|
|
currencyName2race[t[raceCurrencyName]] = info[2];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
else
|
||
|
|
for k, t in pairs(races)do
|
||
|
|
local _;
|
||
|
|
t[raceKeystoneFragmentsValue] = 0;
|
||
|
|
_, _, _, t[raceFragmentsCollected], t[raceNumFragmentsRequired] = GetArchaeologyRaceInfo(t[raceIndex]);
|
||
|
|
updateRaceArtifact(t,GetActiveArtifactByRace(t[raceIndex]));
|
||
|
|
end
|
||
|
|
end
|
||
|
|
updateBroker();
|
||
|
|
end
|
||
|
|
|
||
|
|
local function ItemTooltipShow(self,itemId)
|
||
|
|
if (self) then
|
||
|
|
GameTooltip:SetOwner(self,"ANCHOR_NONE");
|
||
|
|
if (select(1,self:GetCenter()) > (select(1,UIParent:GetWidth()) / 2)) then
|
||
|
|
GameTooltip:SetPoint("RIGHT",tt,"LEFT",-2,0);
|
||
|
|
else
|
||
|
|
GameTooltip:SetPoint("LEFT",tt,"RIGHT",2,0);
|
||
|
|
end
|
||
|
|
GameTooltip:SetPoint("TOP",self,"TOP", 0, 4);
|
||
|
|
|
||
|
|
GameTooltip:ClearLines();
|
||
|
|
GameTooltip:SetHyperlink("item:"..itemId);
|
||
|
|
|
||
|
|
GameTooltip:SetFrameLevel(self:GetFrameLevel()+1);
|
||
|
|
GameTooltip:Show();
|
||
|
|
else
|
||
|
|
GameTooltip:Hide();
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function toggleArchaeologyFrame(self,raceIndex)
|
||
|
|
if ( not ArchaeologyFrame ) then
|
||
|
|
securecall("ArchaeologyFrame_LoadUI");
|
||
|
|
end
|
||
|
|
if ( ArchaeologyFrame ) then
|
||
|
|
if not ArchaeologyFrame:IsShown() then
|
||
|
|
securecall("ArchaeologyFrame_Show");
|
||
|
|
end
|
||
|
|
securecall("ArchaeologyFrame_OnTabClick",ArchaeologyFrame.tab1);
|
||
|
|
securecall("ArchaeologyFrame_ShowArtifact",raceIndex);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function createTooltip(tt)
|
||
|
|
if not (tt and tt.key and tt.key==ttName) then return end -- don't override other LibQTip tooltips...
|
||
|
|
if tt.lines~=nil then tt:Clear(); end
|
||
|
|
local ts,l = C("gray",L["Not learned"]),tt:AddHeader(C("dkyellow",PROFESSIONS_ARCHAEOLOGY))
|
||
|
|
if tradeskill.maxSkill and tradeskill.maxSkill>0 then
|
||
|
|
ts = tradeskill.skill.." / "..tradeskill.maxSkill;
|
||
|
|
end
|
||
|
|
tt:SetCell(l,ttColumns-2, ts, nil, "RIGHT", 3);
|
||
|
|
|
||
|
|
if not ns.profile[name].continentOrder then
|
||
|
|
tt:AddSeparator(4,0,0,0,0);
|
||
|
|
tt:AddLine(C("ltblue",RACES),C("ltblue",L["Keystones"]),C("ltblue",ARCHAEOLOGY_RUNE_STONES),C("ltblue",L["Artifacts"]));
|
||
|
|
tt:AddSeparator();
|
||
|
|
end
|
||
|
|
|
||
|
|
for i=1, #racesOrder do
|
||
|
|
local raceTextureID = racesOrder[i];
|
||
|
|
if not races[raceTextureID] then
|
||
|
|
if ns.profile[name].continentOrder then
|
||
|
|
local mapID,mapName = tonumber(raceTextureID),raceTextureID;
|
||
|
|
if mapID then
|
||
|
|
local mapInfo = C_Map.GetMapInfo(mapID);
|
||
|
|
if mapInfo then
|
||
|
|
mapName = mapInfo.name;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
tt:AddSeparator(4,0,0,0,0);
|
||
|
|
tt:AddLine(C("ltblue",RACES.." ("..mapName..")"),C("ltblue",L["Keystones"]),C("ltblue",ARCHAEOLOGY_RUNE_STONES),C("ltblue",L["Artifacts"]));
|
||
|
|
tt:AddSeparator();
|
||
|
|
end
|
||
|
|
else
|
||
|
|
local raceData = races[raceTextureID];
|
||
|
|
if raceData[raceName] and raceData[raceArtifactName] then
|
||
|
|
local l=tt:AddLine(
|
||
|
|
raceData[raceTexture].." "..C(raceData[raceArtifactSolvable]==true and "green" or "ltyellow",raceData[raceName]),
|
||
|
|
raceData[raceKeystoneIcon]~=nil and raceData[raceKeystoneCount].." "..raceData[raceKeystoneIcon] or "",
|
||
|
|
C(limitColors(raceData[raceFragmentsMax]-raceData[raceFragmentsCollected],"white"),raceData[raceFragmentsCollected].." / "..raceData[raceFragmentsMax]).." "..raceData[raceFragmentsIcon],
|
||
|
|
C(raceData[raceArtifactSolvable]==true and "green" or "white",raceData[raceNumFragmentsRequired].." "..raceData[raceArtifactIcon])
|
||
|
|
);
|
||
|
|
if(raceData[raceKeystoneItemID]~=0)then
|
||
|
|
tt:SetLineScript(l,"OnEnter", ItemTooltipShow,raceData[raceKeystoneItemID]);
|
||
|
|
tt:SetLineScript(l,"OnLeave", GameTooltip_Hide);
|
||
|
|
end
|
||
|
|
tt:SetLineScript(l,"OnMouseUp", toggleArchaeologyFrame, raceData[raceIndex]);
|
||
|
|
elseif raceData[raceName] then
|
||
|
|
local l=tt:AddLine(
|
||
|
|
raceData[raceTexture].." "..C("gray",raceData[raceName]),
|
||
|
|
" ",
|
||
|
|
C("gray",raceData[raceFragmentsCollected].." / "..raceData[raceFragmentsMax]),
|
||
|
|
" ",
|
||
|
|
" "
|
||
|
|
);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if ns.profile.GeneralOptions.showHints then
|
||
|
|
tt:AddSeparator(4,0,0,0,0)
|
||
|
|
ns.AddSpannedLine(tt,C("ltblue",L["MouseBtn"]).." || "..C("green",L["Open archaeology frame with choosen faction"]));
|
||
|
|
ns.ClickOpts.ttAddHints(tt,name);
|
||
|
|
end
|
||
|
|
ns.roundupTooltip(tt);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
-- module variables for registration --
|
||
|
|
---------------------------------------
|
||
|
|
module = {
|
||
|
|
events = {
|
||
|
|
"PLAYER_LOGIN",
|
||
|
|
"ARTIFACT_UPDATE",
|
||
|
|
"RESEARCH_ARTIFACT_UPDATE",
|
||
|
|
"RESEARCH_ARTIFACT_COMPLETE",
|
||
|
|
"CURRENCY_DISPLAY_UPDATE",
|
||
|
|
"CHAT_MSG_CURRENCY"
|
||
|
|
},
|
||
|
|
config_defaults = {
|
||
|
|
enabled = false,
|
||
|
|
inTitle = {},
|
||
|
|
continentOrder=true,
|
||
|
|
infoMaxFragments=true,
|
||
|
|
},
|
||
|
|
clickOptionsRename = {
|
||
|
|
["archaeology"] = "1_open_archaeology_frame",
|
||
|
|
["menu"] = "2_open_menu"
|
||
|
|
},
|
||
|
|
clickOptions = {
|
||
|
|
["archaeology"] = {PROFESSIONS_ARCHAEOLOGY,"module","ToggleArchaeologyFrame"},
|
||
|
|
["menu"] = "OptionMenu"
|
||
|
|
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
ns.ClickOpts.addDefaults(module,{
|
||
|
|
archaeology = "_LEFT",
|
||
|
|
menu = "_RIGHT"
|
||
|
|
});
|
||
|
|
|
||
|
|
function module.options()
|
||
|
|
return {
|
||
|
|
broker = {
|
||
|
|
infoRequiredFragments = { type="toggle", order=1, name=L["ArchaeologyInfoRequiredFragements"], desc=L["ArchaeologyInfoRequiredFragementsDesc"] },
|
||
|
|
infoMaxFragments = { type="toggle", order=2, name=L["ArchaeologyInfoMaxFragements"], desc=L["ArchaeologyInfoMaxFragementsDesc"]},
|
||
|
|
},
|
||
|
|
tooltip = {
|
||
|
|
continentOrder = { type="toggle", order=1, name=L["OptArchOrder"], desc=L["OptArchOrderDesc"] }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
function module.init()
|
||
|
|
racesOrder = {
|
||
|
|
"947", -- continent header / mapID / Azeroth
|
||
|
|
461831,461841,461833,461837,461839,
|
||
|
|
"101", -- continent header / mapID / Outland
|
||
|
|
461829,462321,
|
||
|
|
"113", -- continent header / mapID / Northend
|
||
|
|
461843,461835,
|
||
|
|
"424", -- continent header / mapID / Pandaria
|
||
|
|
633002,633000,839111,
|
||
|
|
"572", -- continent header / mapID / Draenor
|
||
|
|
1030617,1030618,1030616,
|
||
|
|
"619", -- continent header / mapID / Legion
|
||
|
|
1445575,1445577,1445573,
|
||
|
|
"876", -- continent header / mapID / KulTiras
|
||
|
|
2060049,
|
||
|
|
"875", -- continent header / mapID / Zandalar
|
||
|
|
2060051
|
||
|
|
};
|
||
|
|
races = { -- [<raceTextureID>] = { <raceIndex>, <currencyId>, <raceKeystone2FragmentsCount> }
|
||
|
|
--Azeroth
|
||
|
|
[461831] = {nil, 384, nil}, -- Dwarf
|
||
|
|
[461841] = {nil, 385, nil}, -- Troll
|
||
|
|
[461833] = {nil, 393, nil}, -- Fossil
|
||
|
|
[461837] = {nil, 394, nil}, -- NightElf
|
||
|
|
[461839] = {nil, 401, nil}, -- Tolvir
|
||
|
|
|
||
|
|
--Outland
|
||
|
|
[461829] = {nil, 398, nil}, -- Draenei
|
||
|
|
[462321] = {nil, 397, nil}, -- Orc
|
||
|
|
|
||
|
|
--Northend
|
||
|
|
[461843] = {nil, 399, nil}, -- Vrykul
|
||
|
|
[461835] = {nil, 400, nil}, -- Nerubian
|
||
|
|
|
||
|
|
--Pandaria
|
||
|
|
[633002] = {nil, 676, 20}, -- Pandaren
|
||
|
|
[633000] = {nil, 677, 20}, -- Mogu
|
||
|
|
[839111] = {nil, 754, 20}, -- Mantid
|
||
|
|
|
||
|
|
--Draenor
|
||
|
|
[1030617] = {nil, 821, 20}, -- DraenorOrc
|
||
|
|
[1030618] = {nil, 828, 20}, -- Ogre
|
||
|
|
[1030616] = {nil, 829, 20}, -- Arakkoa
|
||
|
|
|
||
|
|
--Legion
|
||
|
|
[1445575] = {nil, 1172, nil}, -- HighborneNightElves
|
||
|
|
[1445577] = {nil, 1173, nil}, -- HighmountainTauren
|
||
|
|
[1445573] = {nil, 1174, nil}, -- Demons
|
||
|
|
|
||
|
|
-- BfA
|
||
|
|
[2060049] = {nil,1535, nil}, -- Drust
|
||
|
|
[2060051] = {nil,1534, nil}, -- Zandalari
|
||
|
|
};
|
||
|
|
end
|
||
|
|
|
||
|
|
function module.onevent(self,event,arg1,...)
|
||
|
|
if event=="BE_UPDATE_CFG" and arg1 and arg1:find("^ClickOpt") then
|
||
|
|
ns.ClickOpts.update(name);
|
||
|
|
elseif event=="PLAYER_LOGIN" then
|
||
|
|
updateRaces(true);
|
||
|
|
|
||
|
|
local _;
|
||
|
|
_,_,tradeskill.id = GetProfessions();
|
||
|
|
if tradeskill.id then
|
||
|
|
tradeskill.name,tradeskill.icon,tradeskill.skill,tradeskill.maxSkill = GetProfessionInfo(tradeskill.id);
|
||
|
|
else
|
||
|
|
tradeskill.name,_,tradeskill.icon = GetSpellInfo(78670);
|
||
|
|
tradeskill.skill, tradeskill.maxSkill = 0,0;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if ns.eventPlayerEnteredWorld then
|
||
|
|
if event=="CHAT_MSG_CURRENCY" then
|
||
|
|
local currencyStr = arg1:match(CHAT_MSG_CURRENCY_PATTERN);
|
||
|
|
if currencyName2race[currencyStr] and races[currencyName2race[currencyStr]] then
|
||
|
|
currencySeen = races[currencyName2race[currencyStr]];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
updateRaces(true);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- function module.optionspanel(panel) end
|
||
|
|
-- function module.onmousewheel(self,direction) end
|
||
|
|
-- function module.ontooltip(tt) end
|
||
|
|
|
||
|
|
function module.onenter(self)
|
||
|
|
if (ns.tooltipChkOnShowModifier(false)) then return; end
|
||
|
|
tt = ns.acquireTooltip({ttName, ttColumns, "LEFT", "CENTER", "RIGHT", "RIGHT","RIGHT"},{false},{self});
|
||
|
|
createTooltip(tt);
|
||
|
|
end
|
||
|
|
|
||
|
|
-- function module.onleave(self) end
|
||
|
|
-- function module.onclick(self,button) end
|
||
|
|
-- function module.ondblclick(self,button) end
|
||
|
|
|
||
|
|
function module.ToggleArchaeologyFrame(self,button)
|
||
|
|
if not ArchaeologyFrame then
|
||
|
|
ArchaeologyFrame_LoadUI()
|
||
|
|
end
|
||
|
|
if ArchaeologyFrame then
|
||
|
|
securecall("ArchaeologyFrame_"..(ArchaeologyFrame:IsShown() and "Hide" or "Show"));
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- final module registration --
|
||
|
|
-------------------------------
|
||
|
|
ns.modules[name] = module;
|