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.

761 lines
26 KiB

-- module independent variables --
----------------------------------
local addon, ns = ...
if ns.client_version<6 then return end
local C, L, I = ns.LC.color, ns.L, ns.I
-- module own local variables and local cached functions --
-----------------------------------------------------------
local nameC,nameF,nameS = "FollowersCore","Followers","Ships"; -- GARRISON_FOLLOWERS, GARRISON_SHIPYARD_FOLLOWERS L["ModDesc-Followers"] L["ModDesc-Ships"]
local ttNameF, ttColumnsF, ttF, moduleF = nameF.."TT", 7;
local ttNameS, ttColumnsS, ttS, moduleS = nameS.."TT" ,7;
local moduleC
local clickOptionsRename = {
["1_open_garrison_report"] = "garrreport",
["2_open_menu"] = "OptionMenu"
};
local clickOptions = {
["garrreport"] = "GarrisonReport",
["menu"] = "OptionMenu"
};
local clickOptionsDefaults = {
garrreport = "__NONE",
menu = "_RIGHT"
};
local FOLLOWERS,SHIPS = GARRISON_FOLLOWERS,GARRISON_SHIPYARD_FOLLOWERS;
local CHAMPIONS,TROOPS = FOLLOWERLIST_LABEL_CHAMPIONS,FOLLOWERLIST_LABEL_TROOPS;
local COMPANIONS = COVENANT_MISSIONS_FOLLOWERS;
local ttInset1,ttInset2,ttHasStatusHeader,ttHasExpansionHeader = " "," ",false,false;
local typeListF = {
{type="Type_9_0",exp=8,label=COMPANIONS,hasCombatSpells=true},
{type="Type_8_0",exp=7,label=CHAMPIONS,labelTroops=TROOPS},
{type="Type_7_0",exp=6,label=CHAMPIONS,labelTroops=TROOPS},
{type="Type_6_0",exp=5,label=FOLLOWERS},
};
local typeListS = {
{type="Type_6_2",exp=5,label=SHIPS},
};
local status2index = {
-- 1 = available
[GARRISON_FOLLOWER_ON_MISSION] = 2, -- onmission
[GARRISON_FOLLOWER_EXHAUSTED] = 3, -- exhausted
[GARRISON_FOLLOWER_WORKING] = 4, -- working
[GARRISON_FOLLOWER_INACTIVE] = 5, -- inactive
};
-- tooltipStatusColors by statusIndex
local tooltipStatusColors = {"green","yellow","ltblue","orange","red"};
local qualityColors = {"white","ff1eaa00","ff0070dd","ffa335ee","ffff8000","ffB3965D"};
local tooltipStatusLabel = {
C("green",AVAILABLE),
C("yellow",GARRISON_FOLLOWER_ON_MISSION),
C("orange",GARRISON_FOLLOWER_WORKING),
C("ltblue",CHALLENGE_MODE_KEYSTONE_DEPLETED),--GARRISON_FOLLOWER_EXHAUSTED
C("red",ADDON_DISABLED),
};
-- available, onmission, working, exhausted, disabled, aftermission
local traitIconStringPattern = {"Trade_","INV_Misc_Gem_01","Ability_HanzandFranz_ChestBump","INV_Misc_Pelt_Wolf_01","INV_Inscription_Tradeskill01"};
local traitIconFildIDs = {
[136240] = true, -- Trade_Alchemy
[136241] = true, -- Trade_BlackSmithing
[136242] = true, -- Trade_BrewPoison
[136243] = true, -- Trade_Engineering
[136244] = true, -- Trade_Engraving
[136245] = true, -- Trade_Fishing
[136246] = true, -- Trade_Herbalism
[136247] = true, -- Trade_LeatherWorking
[136248] = true, -- Trade_Mining
[136249] = true, -- Trade_Tailoring
[134071] = true, -- INV_Misc_Gem_01
[1037260] = true, -- Ability_HanzandFranz_ChestBump
[134366] = true, -- INV_Misc_Pelt_Wolf_01
[237171] = true, -- INV_Inscription_Tradeskill01
};
local config_defaults = {
enabled = false,
-- broker options
--[[ -- filled by function
showBroker_<Type_%d_%d> = true,
]]
-- tooltip options
--[[ -- filled by function
showTooltip_<Type_%d_%d> = false,
showTooltip_<Type_%d_%d>t = false, -- troops
showSummary_<Type_%d_%d> = false,
--]]
-- tooltip status tables
showStatus1 = true, -- available
showStatus2 = true, -- on mission
showStatus3 = true, -- exhausted
showStatus4 = false, -- working
showStatus5 = false, -- inactive
bgColoredStatus = false,
-- tooltip alt/twink options
showAllInOne = false,
showHeaderInfo = true,
};
-- register icon names and default files --
-------------------------------------------
I[nameF] = {iconfile="Interface\\Icons\\Achievement_GarrisonFolLower_Rare", coords={0.1,0.9,0.1,0.9} }; --IconName::Follower--
I[nameS] = {iconfile="Interface\\Icons\\Achievement_GarrisonFolLower_Rare", coords={0.1,0.9,0.1,0.9} }; --IconName::Ships--
-- some local functions --
--------------------------
local sortKey;
do -- creates a string with big number for sorting
local sortKeyFormat = "%02d%02d%03d%04d%04d";
function sortKey(count,level,xp,quality,iLevel)
return sortKeyFormat:format(100-level,10 --[[-quality]],100-ceil(xp),9999-iLevel,count);
end
end
local function isTrait(icon)
if traitIconFildIDs[icon] then
return true;
elseif type(icon)=="string" then
-- fallback for old icon path strings
for i=1, #traitIconStringPattern do
if icon:find(traitIconStringPattern) then
return true;
end
end
end
return false;
end
-- for broker only
local function updateFollowers(name,Table,forTooltip)
-- get garrison/shipyard level
local garrLevel,name = false,nameF;
if Table.type=="Type_6_2" then
Table.garrLevel = (C_Garrison.GetOwnedBuildingInfoAbbrev(98) or 0) - 204;
name = nameS;
else
Table.garrLevel = C_Garrison.GetGarrisonInfo(Enum.GarrisonType[Table.type]) or 0;
end
if Table.garrLevel<1 then
-- garrison / shipyard not enabled
return false;
end
-- reset / prepare some entries
Table.follower_num = 0;
if Table.labelTroops then
Table.troop_num = 0;
end
for i=1, 5 do
Table["status"..i] = {};
Table["status"..i.."_num"] = 0;
end
local follower,troop,data,entryInfo,_ = {},{},C_Garrison.GetFollowers(Enum.GarrisonFollowerType["Follower"..Table.type]) or {},nil,nil;
for i=1, #data do
entryInfo = data[i];
if entryInfo.isCollected then
entryInfo.statusIndex = status2index[entryInfo.status] or 1; -- available
if entryInfo.statusIndex==2 then -- onmission
entryInfo.missionEnd = time()+C_Garrison.GetFollowerMissionTimeLeftSeconds(entryInfo.followerID);
end
if forTooltip then
entryInfo.classColor = "red";
if type(entryInfo.classAtlas)=="string" then -- has classAtlas
_,entryInfo.classColor = strsplit("-",entryInfo.classAtlas);
end
if strlen(entryInfo.name)==0 then
entryInfo.name = "["..UNKNOWN.."]";
end
entryInfo.xpPercent = 100;
if entryInfo.levelXP>0 then
entryInfo.xpPercent = entryInfo.xp/entryInfo.levelXP*100;
entryInfo.xpPercentStr = ("%1.1f"):format(entryInfo.xpPercent).."%";
end
if entryInfo.isTroop then
entryInfo.durabilityIconStr = "";
local t = {};
for i=1, entryInfo.maxDurability do
if i<=entryInfo.durability then
tinsert(t,"|T1384099:11:12:0:0:256:256:1:16:1:14|t"); --"GarrisonTroops-Health"
else
tinsert(t,"|T1384099:11:12:0:0:256:256:18:33:1:14|t"); --"GarrisonTroops-Health-Consume"
end
end
entryInfo.durabilityIconStr = table.concat(t," ");
end
end
if entryInfo.isTroop and Table.labelTroops then
-- for broker button
Table.troop_num = Table.troop_num + 1;
-- sortable entries for tooltip
if forTooltip then
troop[ sortKey(Table.troop_num, entryInfo.level, entryInfo.xpPercent, entryInfo.quality, entryInfo.iLevel) ] = entryInfo;
end
elseif not entryInfo.isTroop then
-- for broker button
Table["status"..entryInfo.statusIndex.."_num"] = Table["status"..entryInfo.statusIndex.."_num"] + 1;
Table.follower_num = Table.follower_num + 1;
-- sortable entries for tooltip
if forTooltip then
follower[ sortKey(Table.follower_num, entryInfo.level, entryInfo.xpPercent, entryInfo.quality, entryInfo.iLevel) ] = entryInfo;
end
-- for alts/twink display in tooltip
ns.toon[name][Table.type][entryInfo.garrFollowerID or entryInfo.followerID] = entryInfo.missionEnd or entryInfo.statusIndex; -- n < 10 == statusIndex; n > 10 == mission ending time
end
end
end
if forTooltip then
return follower,troop;
end
end
local function updateBroker(name)
local text,Table = {},name==nameF and typeListF or typeListS;
local status = {};
for _, entry in ipairs(Table) do
if ns.profile[name]["showBroker_"..entry.type] then
if ns.profile[name].showAllInOne then
for i=1, 4 do
status[i] = (status[i] or 0)+(entry["status"..i.."_num"] or 0);
end
status[0] = (status[0] or 0)+(entry.follower_num or 0);
else
tinsert(text, ("%s/%s/%s/%s"):format(
C("ltblue",(entry.status4_num or 0)),
C("yellow",(entry.status2_num or 0)+(entry.status3_num or 0)),
C("green",(entry.status1_num or 0)),
(entry.follower_num or 0)
));
end
end
end
if ns.profile[name].showAllInOne then
tinsert(text, ("%s/%s/%s/%s"):format(
C("ltblue",(status[4] or 0)),
C("yellow",(status[2] or 0)+(status[3] or 0)),
C("green",(status[1] or 0)),
(status[0] or 0)
));
end
-- fallback
if #text==0 then
if name==nameS then
tinsert(text,GARRISON_SHIPYARD_FOLLOWERS);
else
tinsert(text,GARRISON_FOLLOWERS);
end
end
(ns.LDB:GetDataObjectByName(ns.modules[name].ldbName) or {}).text = table.concat(text,", ");
end
local function addEntries(tt,name,entriesList,statusIndex,statusLabel,Table)
for _,entryInfo in ns.pairsByKeys(entriesList) do
if entryInfo.statusIndex==statusIndex then
-- add status header
if not ttHasStatusHeader then
local entries = {statusLabel,C("ltblue",TYPE),C("ltblue",XP),C("ltblue",ABILITIES)};
if name==nameF then
tinsert(entries,4,C("ltblue",L["iLevel"]));
end
tt:AddSeparator(4,0,0,0,0);
tt:AddLine(unpack(entries));
tt:AddSeparator();
ttHasStatusHeader = true;
end
-- add expansion header
if not ttHasExpansionHeader then
tt:AddLine(ttInset1..C("gray",_G["EXPANSION_NAME"..Table.exp]));
tt:AddSeparator(1.1, 1,1,1, .4);
ttHasExpansionHeader = true;
end
-- followerID string
local id = "";
--if ns.profile[name].showFollowerID then
if true then
local fID = tonumber(entryInfo.garrFollowerID or entryInfo.followerID);
if fID then
id = " "..C("ltgray","(".. fID ..")");
end
end
-- abilities / combatSpells
local abilities,abilityIcons,traitIcons,combatSpellIcons = {},{},{},{};
for _,at in ipairs((C_Garrison.GetFollowerAbilities(entryInfo.followerID))) do
if at.icon then
tinsert(isTrait(at.icon) and traitIcons or abilityIcons,"|T"..at.icon..":14:14:0:0:64:64:4:56:4:56|t");
end
end
if #abilityIcons>0 then
tinsert(abilities,table.concat(abilityIcons," "));
end
if #traitIcons>0 then
tinsert(abilities,table.concat(traitIcons," "));
end
local combatSpells = false
if Table.hasCombatSpells then
combatSpells = C_Garrison.GetFollowerAutoCombatSpells(entryInfo.followerID,entryInfo.level);
end
if combatSpells then
for _,cs in ipairs(combatSpells) do
if cs.icon then
tinsert(combatSpellIcons,"|T"..cs.icon..":14:14:0:0:64:64:4:56:4:56|t");
end
end
if #combatSpellIcons>0 then
tinsert(abilities,table.concat(combatSpellIcons," "));
end
end
-- tooltip line
local abilitiesStr,line = table.concat(abilities," || ");
if name==nameF then
line = tt:AddLine(
ttInset2 .. C(entryInfo.classColor,entryInfo.name) .. id,
entryInfo.level.." ",
entryInfo.xpPercentStr or C("gray","100%"),
entryInfo.iLevel,
abilitiesStr
);
else
line = tt:AddLine(
ttInset2 .. C(entryInfo.classColor,entryInfo.name) .. id,
entryInfo.className.." ",
entryInfo.xpPercentStr or C("gray","100%"),
abilitiesStr,
entryInfo.durabilityIconStr
);
end
-- add color backdrop
if entryInfo.quality>1 then
local color = C(qualityColors[entryInfo.quality],"colortable");
tt.lines[line].cells[1]:SetBackdrop({bgFile=ns.media.."rowbg", tile=false, insets={ left=0, right=0, top=1, bottom=0 }})
tt.lines[line].cells[1]:SetBackdropColor(color[1],color[2],color[3],.5);
end
if ns.profile[name].bgColoredStatus then
local color = C(tooltipStatusColors[statusIndex] or "red","colortable");
tt.lines[line]:SetBackdrop({bgFile=ns.media.."rowbg", tile=false, insets={ left=0, right=0, top=1, bottom=0 }})
tt.lines[line]:SetBackdropColor(color[1],color[2],color[3],.21);
end
end
end
end
local clientShortcut
do
local list = {"C","BC","WotLK","Cata","MoP","WoD","Legion","BfA","SL"};
function clientShortcut(Type)
local version = tonumber((Type:gsub("Type_(%d+)_%d+","%1")));
if version and list[version] then
return C("ltgray",list[version]);
end
return "";
end
end
local function createTooltip(tt,name,ttName)
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 ttColumns = ttColumnsF;
if name==nameS then
tt:AddHeader(C("dkyellow",GARRISON_SHIPYARD_FOLLOWERS));
ttColumns = ttColumnsS;
elseif ns.client_version>7 then
tt:AddHeader(C("dkyellow",("%s, %s, %s"):format(GARRISON_FOLLOWERS,FOLLOWERLIST_LABEL_CHAMPIONS,FOLLOWERLIST_LABEL_TROOPS)));
else
tt:AddHeader(C("dkyellow",GARRISON_FOLLOWERS));
end
if ns.profile[name].showChars then
tt:AddSeparator(4,0,0,0,0);
local l=tt:AddLine( C("ltblue",CHARACTER) ); -- 1
local showHeaderInfo = ns.profile[name].showHeaderInfo;
if IsShiftKeyDown() then
tt:SetCell(l, 2, C("ltblue",L["Back from missions"])..(showHeaderInfo and "|n"..L["next"].." / "..SPELL_TARGET_TYPE12_DESC or ""), nil, "RIGHT", 3);
else
tt:SetCell(l, 2, C("ltblue",GARRISON_FOLLOWER_ON_MISSION)..(showHeaderInfo and "|n".. C("green",GOAL_COMPLETED) .." / ".. C("yellow",GARRISON_SHIPYARD_MSSION_INPROGRESS_TOOLTIP) or ""), nil, "RIGHT", 3);
end
tt:SetCell(l, 5, C("ltblue",L["Without missions"])..(showHeaderInfo and "|n".. C("green",L["Chilling"]) .." / ".. C("yellow",GARRISON_FOLLOWER_WORKING) or ""), nil, "RIGHT", 2);
tt:SetCell(l, 7, C("ltblue",GARRISON_FOLLOWERS)..(showHeaderInfo and "|n" .. C("cyan",COLLECTED) .." / ".. C("green",CONTRIBUTION_ACTIVE) .." / ".. C("yellow",GARRISON_FOLLOWER_INACTIVE) or ""));
tt:AddSeparator();
local t = time();
for index, toonNameRealm, toonName, toonRealm, toonData, isCurrent in ns.pairsToons(name,{currentFirst=true,forceSameRealm=true}) do
-- available, onmission, working, exhausted, disabled, aftermission
local countStatus,collected,cMission,cWorking,cCollected,clients,show = {},{},{},{},{},{};
local nextMissionEnding,activeMission = 0,0;
for _,e in ipairs(name==nameF and typeListF or typeListS) do
local Type = e.type;
if ns.profile[name]["showSummary_"..Type] and toonData[name] and toonData[name][Type] then
local ExpansionFollowers = toonData[name][Type];
countStatus[Type],collected[Type] = {0,0,0,0,0,0},0;
for followerID, followerStatus in pairs(ExpansionFollowers)do
if followerStatus>10 then
if followerStatus>t and (nextMissionEnding==0 or followerStatus<nextMissionEnding) then
nextMissionEnding = followerStatus;
end
if followerStatus>activeMission then
activeMission = followerStatus;
end
followerStatus = followerStatus>t and 2 or 6;
end
countStatus[Type][followerStatus] = countStatus[Type][followerStatus] + 1;
collected[Type] = collected[Type] + 1;
show = true
end
tinsert(clients, clientShortcut(Type));
tinsert(cMission, (countStatus[Type][6]==0 and "" or C("green",countStatus[Type][6])) .."/".. (countStatus[Type][2]==0 and "" or C("yellow",countStatus[Type][2])) );
tinsert(cWorking, (countStatus[Type][4]==0 and "" or C("green",countStatus[Type][4])) .."/".. (countStatus[Type][3]==0 and "" or C("yellow",countStatus[Type][3])) );
tinsert(cCollected, C("cyan",collected[Type]) .. "/" .. C("green",collected[Type]-countStatus[Type][5]) .. "/" .. C("yellow",countStatus[Type][5]) );
end
end
if show then
local faction,str,l = toonData.faction and " |TInterface\\PVPFrame\\PVP-Currency-"..toonData.faction..":16:16:0:-1:16:16:0:16:0:16|t" or "";
if IsShiftKeyDown() then
str = SecondsToTime(nextMissionEnding-t) .. " / " .. SecondsToTime(activeMission-t);
else
str = table.concat(cMission,"|n");
end
l = tt:AddLine(C(toonData.class,ns.scm(toonName)) .. ns.showRealmName(name,toonRealm) .. faction );
tt:SetCell(l, 2, table.concat(clients,"|n"), nil, "CENTER");
tt:SetCell(l, 3, str, nil, "RIGHT", 2);
tt:SetCell(l, 5, table.concat(cWorking, "|n"), nil, "RIGHT", 2);
tt:SetCell(l, 7, table.concat(cCollected, "|n") );
if isCurrent then -- highlight current toon
tt:SetLineColor(l, 0.1, 0.3, 0.6);
end
end
end
end
local followerList,troopList,tableList = {},{},{};
for i, Table in ipairs(name==nameF and typeListF or typeListS) do
if ns.profile[name]["showTooltip_"..Table.type] then
local follower,troop = updateFollowers(name,Table,true);
if follower then
tinsert(tableList,Table);
followerList[#tableList] = follower;
if troop and ns.profile[name]["showTooltip_"..Table.type.."t"] then
troopList[#tableList] = troop;
end
end
end
end
-- order: status, expansion, followers
ttHasStatusHeader,ttHasExpansionHeader = false,false;
for _,statusIndex in ipairs({2,3,4,1,5})do
local statusLabel = tooltipStatusLabel[statusIndex];
if ns.profile[name]["showStatus"..statusIndex] then
ttHasStatusHeader = false;
for index,Table in ipairs(tableList) do -- loop tables (expansions)
ttHasExpansionHeader = false;
-- followers / ships
addEntries(tt,name,followerList[index],statusIndex,statusLabel,Table);
-- troops
if troopList[index] and ns.profile[name]["showTooltip_"..Table.type.."t"] then
addEntries(tt,name,troopList[index],statusIndex,statusLabel,Table);
end
end
end
end
if ns.profile.GeneralOptions.showHints then
tt:AddSeparator(4,0,0,0,0);
tt:SetCell(tt:AddLine(),1,C("ltblue",L["MouseBtn"]).." || "..C("green",L["Activate specialization"]),nil,"LEFT",ttColumns);
ns.ClickOpts.ttAddHints(tt,name);
end
ns.roundupTooltip(tt);
end
-- module functions and variables --
------------------------------------
moduleC = {
isHiddenModule = true,
events = {
"PLAYER_LOGIN",
"GARRISON_FOLLOWER_LIST_UPDATE",
"GARRISON_FOLLOWER_UPGRADED",
"GARRISON_FOLLOWER_XP_CHANGED",
"GARRISON_FOLLOWER_REMOVED",
},
config_defaults = {
enabled = false, -- autoenabled by other modules
},
--clickOptionsRename = {},
--clickOptions = {}
};
moduleF = {
events = {"PLAYER_LOGIN"},
config_defaults = CopyTable(config_defaults),
clickOptionsRename = clickOptionsRename,
clickOptions = clickOptions
};
moduleS = {
events = {"PLAYER_LOGIN"},
config_defaults = CopyTable(config_defaults),
clickOptionsRename = clickOptionsRename,
clickOptions = clickOptions
};
ns.ClickOpts.addDefaults(moduleF,clickOptionsDefaults);
ns.ClickOpts.addDefaults(moduleS,clickOptionsDefaults);
local initOptions
do
local optTooltip,optBroker = {},{};
local sharedOptTooltip = {
showChars={1,true},
showAllFactions=2,
showRealmNames=3,
showCharsFrom=4,
bgColoredStatus = { type="toggle", order=5, name=L["FollowersBgColorStatus"], desc=L["FollowersBgColorStatusDesc"] },
showHeaderInfo = { type="toggle", order=6, name=L["FollowersHeaderInfo"], desc=L["FollowersHeaderInfoDesc"]:format(C("cyan",COLLECTED) .." / ".. C("green",CONTRIBUTION_ACTIVE) .." / ".. C("yellow",GARRISON_FOLLOWER_INACTIVE)) },
statusHeader = { type="group", order=10, name=STATUS, args={} },
expansionHeader = { type="header", order = 20, name=EXPANSION_FILTER_TEXT },
}
local sharedOptBroker = {
showAllInOne = { type="toggle", order=1, name=L["Show all in one"], desc=L["FollowersAIODesc"]},
expansions = { type="header", order=20, name=EXPANSION_FILTER_TEXT },
}
local hide = {
ShipsNew_broker_showAllInOne = true,
ShipsNew_broker_expansions = true
}
local replace = {
bgColoredStatus = {[nameF]=GARRISON_FOLLOWERS,[nameS]=GARRISON_SHIPYARD_FOLLOWERS}
}
local function CopyOptEntry(modName,Entry)
if type(Entry)=="table" then
local entry = CopyTable(Entry);
if type(entry.name)=="string" and entry.name:match("%%s") then
entry.name = entry.name:format(L[modName])
end
if type(entry.desc)=="string" and entry.desc:match("%%s") then
entry.desc = entry.desc:format(L[modName])
end
return entry;
end
return Entry;
end
local function isSummaryEnabled(modName)
return not ns.profile[modName].showChars;
end
local function addTypeListOpt(modName,entry,c)
local expansionLabel = _G["EXPANSION_NAME"..entry.exp];
optTooltip[modName]["exp_"..entry.exp] = {
type = "group", order = c, inline = true, name = expansionLabel,
args = {
["showTooltip_"..entry.type] = { type="toggle", order=1, name=entry.label, desc=L["Show %s in tooltip"]:format(entry.label)},
["showSummary_"..entry.type] = { type="toggle", order=3, name=OVERVIEW, desc=L["FollowersSummaryDesc"]:format(expansionLabel), width="double", disabled=function() return isSummaryEnabled(modName) end},
}
};
if entry.labelTroops then
optTooltip[modName]["exp_"..entry.exp].args["showTooltip_"..entry.type.."t"] = { type="toggle", order=2, name=TROOPS, desc=L["Show troops in tooltip"], width="half"};
end
local bbLabel = string.format("%s (%s)",expansionLabel,entry.label);
optBroker[modName]["showBroker_"..entry.type] = { type="toggle", order=c, name=bbLabel, desc=L["Show %s in broker button"]:format(bbLabel) };
end
function initOptions()
for _, modName in ipairs({nameF,nameS})do
-- update config defaults
local m,t = moduleF,typeListF;
if modName==nameS then
m,t = moduleS,typeListS;
end
local cfgDef,state = m.config_defaults,true;
for _, e in ipairs(t)do -- typeListF / typeListS
cfgDef["showBroker_"..e.type] = state;
cfgDef["showTooltip_"..e.type] = state;
if e.labelTroops then
cfgDef["showTooltip_"..e.type.."t"] = state;
end
cfgDef["showSummary_"..e.type] = state;
-- only the first (current expansion) will be enabled by default
state = false;
end
-- copy shared options
optBroker[modName] = {};
for optKey,optEntry in pairs(sharedOptBroker)do
if not hide[modName.."_broker_"..optKey] then
optBroker[modName][optKey] = CopyOptEntry(modName,optEntry);
end
end
optTooltip[modName] = {};
for optKey,optEntry in pairs(sharedOptTooltip)do
if not hide[modName.."_tooltip_"..optKey] then
optTooltip[modName][optKey] = CopyOptEntry(modName,optEntry);
if replace[optKey] then
optTooltip[modName][optKey].desc = optTooltip[modName][optKey].desc:format(replace[optKey][modName]);
end
end
end
end
-- clean shared option tables
sharedOptBroker,sharedOptTooltip = nil,nil;
-- add more options [status labels]
local c = 11;
for i,statusLabel in ipairs(tooltipStatusLabel)do
optTooltip[nameF].statusHeader.args["showStatus"..i] = { type="toggle", order=c, name=statusLabel, desc=L["FollowersStatusLabelDesc"]:format(statusLabel) };
optTooltip[nameS].statusHeader.args["showStatus"..i] = optTooltip[nameF].statusHeader.args["showStatus"..i];
c=c+1;
end
local c = 21;
for _,entry in ipairs(typeListF) do
addTypeListOpt(nameF,entry,c)
c=c+1;
end
c = 21;
for _,entry in ipairs(typeListS)do
addTypeListOpt(nameS,entry,c)
c=c+1;
end
end
function moduleF.options()
if initOptions then
initOptions();
initOptions=nil;
end
return {broker=optBroker[nameF],tooltip=optTooltip[nameF],misc=nil};
end
function moduleS.options()
if initOptions then
initOptions();
initOptions=nil;
end
return {broker=optBroker[nameS],tooltip=optTooltip[nameS],misc=nil};
end
end
-- function module.init() end
function moduleC.onevent(self,event,arg1,...)
if event=="BE_UPDATE_CFG" then
if arg1 and arg1:find("^ClickOpt") then
if moduleF.isEnabled then
ns.ClickOpts.update(nameF);
end
if moduleS.isEnabled then
ns.ClickOpts.update(nameS);
end
return;
end
end
if moduleF.isEnabled then
if ns.toon[nameF]==nil then
ns.toon[nameF] = {};
end
for _,Table in pairs(typeListF)do
if ns.toon[nameF][Table.type]==nil then
ns.toon[nameF][Table.type] = {};
end
updateFollowers(nameF,Table);
end
updateBroker(nameF);
end
if moduleS.isEnabled then
if ns.toon[nameS]==nil then
ns.toon[nameS] = {};
end
for _,Table in pairs(typeListS)do
if ns.toon[nameS][Table.type]==nil then
ns.toon[nameS][Table.type] = {};
end
updateFollowers(nameS,Table);
end
updateBroker(nameS);
end
end
local function onevent(self,event,arg1,...)
if event=="BE_UPDATE_CFG" then
if arg1 and arg1:find("^ClickOpt") then
--ns.ClickOpts.update(name);
return
end
-- update broker on config changes
if self.eventframe==moduleF.eventframe then
if moduleF.isEnabled then
updateBroker(nameF);
end
else
if moduleS.isEnabled then
updateBroker(nameS);
end
end
elseif event=="PLAYER_LOGIN" and not moduleC.isEnabled then
ns.moduleInit(nameC,true);
end
end
moduleF.onevent = onevent;
moduleS.onevent = onevent;
-- function module.onmousewheel(self,direction) end
-- function module.optionspanel(panel) end
-- function module.ontooltip(tt) end
function moduleF.onenter(self)
if (ns.tooltipChkOnShowModifier(false)) then return; end
ttF = ns.acquireTooltip({ttNameF, ttColumnsF, "LEFT", "CENTER", "CENTER", "CENTER", "CENTER", "CENTER", "RIGHT"},{true},{self});
createTooltip(ttF, nameF, ttNameF)
end
function moduleS.onenter(self)
if (ns.tooltipChkOnShowModifier(false)) then return; end
ttS = ns.acquireTooltip({ttNameS, ttColumnsS, "LEFT", "LEFT", "CENTER", "CENTER", "CENTER", "RIGHT","RIGHT"},{true},{self});
createTooltip(ttS, nameS)
end
-- function module.onleave(self) end
-- function module.onclick(self,button) end
-- function module.ondblclick(self,button) end
-- final module registration --
-------------------------------
ns.modules[nameC] = moduleC;
ns.modules[nameF] = moduleF;
ns.modules[nameS] = moduleS;