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
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;
|
|
|