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.

330 lines
12 KiB

-- module independent variables --
----------------------------------
local addon, ns = ...
if ns.client_version<7 then return end
local C, L, I = ns.LC.color, ns.L, ns.I
-- module own local variables and local cached functions --
-----------------------------------------------------------
local name = "Order hall" -- L["Order hall"] L["ModDesc-Order hall"]
local ldbName,ttName,ttColumns,tt,module = name, name.."TT",3;
local now,GarrisonTalentAvailability = 0;
if Enum.GarrisonTalentAvailability then
GarrisonTalentAvailability = Enum.GarrisonTalentAvailability;
else
GarrisonTalentAvailability = {
UnavailableAnotherIsResearching = LE_GARRISON_TALENT_AVAILABILITY_UNAVAILABLE_ANOTHER_IS_RESEARCHING,
UnavailableNotEnoughResources = LE_GARRISON_TALENT_AVAILABILITY_UNAVAILABLE_NOT_ENOUGH_RESOURCES,
UnavailableNotEnoughGold = LE_GARRISON_TALENT_AVAILABILITY_UNAVAILABLE_NOT_ENOUGH_GOLD,
UnavailableTierUnavailable = LE_GARRISON_TALENT_AVAILABILITY_UNAVAILABLE_TIER_UNAVAILABLE,
UnavailableRequiresPrerequisiteTalent = LE_GARRISON_TALENT_AVAILABILITY_UNAVAILABLE_REQUIRES_PREREQUISITE_TALENT,
}
end
local TalentUnavailableReasons = {}
TalentUnavailableReasons[GarrisonTalentAvailability.UnavailableAnotherIsResearching] = ORDER_HALL_TALENT_UNAVAILABLE_ANOTHER_IS_RESEARCHING;
TalentUnavailableReasons[GarrisonTalentAvailability.UnavailableNotEnoughResources] = ORDER_HALL_TALENT_UNAVAILABLE_NOT_ENOUGH_RESOURCES;
TalentUnavailableReasons[GarrisonTalentAvailability.UnavailableNotEnoughGold] = ORDER_HALL_TALENT_UNAVAILABLE_NOT_ENOUGH_GOLD;
TalentUnavailableReasons[GarrisonTalentAvailability.UnavailableTierUnavailable] = ORDER_HALL_TALENT_UNAVAILABLE_TIER_UNAVAILABLE;
TalentUnavailableReasons[GarrisonTalentAvailability.UnavailableRequiresPrerequisiteTalent] = ORDER_HALL_TALENT_UNAVAILABLE_REQUIRES_PREREQUISITE_TALENT;
local ClassTalents = {
-- legion
[LE_GARRISON_TYPE_7_0 or Enum.GarrisonType.Type_7_0] = {
-- 18 hours instant world quest
InstantWQ = {
-- [<talentId>] = {<classId>,<itemId>}
[410] = {reagentItem=140157}, -- warrior
[399] = {reagentItem=140155}, -- paladin
[432] = {reagentItem=139888}, -- death knight
[388] = {reagentItem=140038}, -- mage
[367] = {reagentItem=139892}, -- warlock
[421] = {reagentItem=140158}, -- demon hunter
}
}
};
-- register icon names and default files --
-------------------------------------------
I[name] = {iconfile="Interface\\Icons\\inv_garrison_resource", coords={0.05,0.95,0.05,0.95}}; --IconName::Order hall--
-- some local functions --
--------------------------
-- talentType = (InstantWQ|?)
local function GetClassTalentTreeInfoByType(garrType,talentType)
local garrTalentTreeID,_,_,classId = 0,UnitClass("player");
local talentIds = (ClassTalents[garrType] and ClassTalents[garrType][talentType] and ClassTalents[garrType][talentType]) or false;
if talentIds then
local treeIDs = C_Garrison.GetTalentTreeIDsByClassID(garrType, classId);
if (treeIDs and #treeIDs > 0) then
garrTalentTreeID = treeIDs[1];
end
local _, _, tree = (C_Garrison.GetTalentTreeInfoForID or C_Garrison.GetTalentTreeInfo)(garrTalentTreeID); -- TODO: removed in shadowlands
if tree and #tree>0 then
for i=1, #tree do
if talentIds[tree[i].id] then
if type(talentIds[tree[i].id])=="table" then
for k,v in pairs(talentIds[tree[i].id])do
tree[i][k] = v;
end
end
return tree[i];
end
end
end
end
return;
end
--[[
local function updateBroker()
local obj = ns.LDB:GetDataObjectByName(module.ldbName);
local title = {};
tinsert(title, C("ltblue",ready) .."/".. C("orange",progress - ready) );
obj.text = table.concat(title,", ");
end
--]]
local function createTooltip2(tt)
end
local function createTalentTooltip(self,talent)
GameTooltip:SetOwner(tt, "ANCHOR_NONE");
GameTooltip:SetPoint(ns.GetTipAnchor(tt,"horizontal"));
GameTooltip:AddLine(talent.name, 1, 1, 1);
GameTooltip:AddLine(talent.description, nil, nil, nil, true);
if talent.isBeingResearched then
GameTooltip:AddLine(" ");
GameTooltip:AddLine(NORMAL_FONT_COLOR_CODE..TIME_REMAINING..FONT_COLOR_CODE_CLOSE.." "..SecondsToTime(talent.researchTimeRemaining), 1, 1, 1);
elseif not talent.selected then
GameTooltip:AddLine(" ");
GameTooltip:AddLine(RESEARCH_TIME_LABEL.." "..HIGHLIGHT_FONT_COLOR_CODE..SecondsToTime(talent.researchDuration)..FONT_COLOR_CODE_CLOSE);
if ((talent.researchCost and talent.researchCurrency) or talent.researchGoldCost) then
local str = NORMAL_FONT_COLOR_CODE..COSTS_LABEL..FONT_COLOR_CODE_CLOSE;
if (talent.researchCost and talent.researchCurrency) then
local currencyInfo = C_CurrencyInfo.GetCurrencyInfo(talent.researchCurrency);
str = str.." "..BreakUpLargeNumbers(talent.researchCost).."|T"..currencyInfo.iconFileID..":0:0:2:0|t";
end
if (talent.researchGoldCost ~= 0) then
str = str.." "..talent.researchGoldCost.."|TINTERFACE\\MONEYFRAME\\UI-MoneyIcons.blp:16:16:2:0:64:16:0:16:0:16|t";
end
GameTooltip:AddLine(str, 1, 1, 1);
end
if talent.talentAvailability ~= LE_GARRISON_TALENT_AVAILABILITY_AVAILABLE then
if (talent.talentAvailability == LE_GARRISON_TALENT_AVAILABILITY_UNAVAILABLE_PLAYER_CONDITION and talent.playerConditionReason) then
GameTooltip:AddLine(talent.playerConditionReason, 1, 0, 0);
elseif (TalentUnavailableReasons[talent.talentAvailability]) then
GameTooltip:AddLine(TalentUnavailableReasons[talent.talentAvailability], 1, 0, 0);
end
end
end
GameTooltip:Show();
end
local function addShipment(tt,...)
local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString = ...;
if name then
tt:SetCell(tt:AddLine(),1," |T"..texture..":14:14:0:0:64:64:4:58:4:58|t "..C("ltyellow",name),nil,"LEFT",0);
if shipmentCapacity>0 then
local delim,line,remain = C("gray"," || "),{},(creationTime+duration)-now;
tinsert(line,C("green",shipmentsReady).."/"..C("yellow",shipmentsTotal));
if remain>0 then
tinsert(line,SecondsToTime((creationTime+duration)-now));
local nextShipments = shipmentsTotal-shipmentsReady-1;
if nextShipments>0 then
tinsert(line,SecondsToTime((creationTime+(duration+(nextShipments*duration)))-now));
end
else
tinsert(line,"("..GOAL_COMPLETED..")");
delim = " ";
end
tt:SetCell(tt:AddLine(),1,table.concat(line,delim),nil,"CENTER",0);
end
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
tt:AddHeader(C("dkyellow",L[name]));
tt:AddSeparator(4,0,0,0,0);
local ohLevel = C_Garrison.GetGarrisonInfo(LE_GARRISON_TYPE_7_0 or Enum.GarrisonType.Type_7_0) or 0;
if ohLevel>0 then
now = time();
-- create order hall talent tree
local garrTalentTreeID = 0
local treeIDs = C_Garrison.GetTalentTreeIDsByClassID(LE_GARRISON_TYPE_7_0 or Enum.GarrisonType.Type_7_0, select(3, UnitClass("player")));
if (treeIDs and #treeIDs > 0) then
garrTalentTreeID = treeIDs[1];
end
local _, _, tree = (C_Garrison.GetTalentTreeInfoForID or C_Garrison.GetTalentTreeInfo)(garrTalentTreeID);
if tree and #tree>0 then
local t,l={},tt:AddLine(C("ltblue",ORDER_HALL_TALENT_TITLE));
tt:AddSeparator();
local tiers = {};
for i,v in ipairs(tree)do
if tiers[v.tier]==nil then
tiers[v.tier] = 0;
tt:AddLine("","|","");
end
tiers[v.tier] = tiers[v.tier]+1;
end
tt:AddLine();
local activeResearch = false;
for i,v in ipairs(tree)do
if v.researchStartTime>0 then
activeResearch = v;
end
local line,cell,align = l+v.tier+2,1,"RIGHT";
if tiers[v.tier]==2 then
if v.uiOrder==1 then
cell,align = 3,"LEFT";
end
tt:SetCell(line,cell,C( (v.researched and "green") or (activeResearch and activeResearch.name==v.name and "dkyellow") or "gray",v.name),nil,align);
if cell==3 and activeResearch then
activeResearch.show=true;
end
else
tt:SetCell(line,1,C(v.researched and "green" or "gray",v.name),nil,"CENTER",0);
if activeResearch then
activeResearch.show=true;
end
end
tt:SetCellScript(line,cell,"OnEnter",createTalentTooltip, v);
tt:SetCellScript(line,cell,"OnLeave",GameTooltip_Hide);
end
if activeResearch and activeResearch.show then
tt:AddSeparator(2,1,1,1,1);
local l=tt:AddLine();
local line = C("ltyellow",activeResearch.name..HEADER_COLON);
if activeResearch.researchTimeRemaining>0 then
line = line .." ("..SecondsToTime(activeResearch.researchTimeRemaining)..")";
end
tt:SetCell(l,1,line,nil,"CENTER",0);
tt:SetLineColor(l,1,1,1,.3);
activeResearch=false;
end
end
-- create shipment list
tt:AddSeparator(4,0,0,0,0);
tt:AddLine(C("ltblue",L["Shipments"]));
tt:AddSeparator();
local buildings = C_Garrison.GetBuildings(LE_GARRISON_TYPE_7_0 or Enum.GarrisonType.Type_7_0);
local followerShipments = C_Garrison.GetFollowerShipments(LE_GARRISON_TYPE_7_0 or Enum.GarrisonType.Type_7_0);
local looseShipments = C_Garrison.GetLooseShipments(LE_GARRISON_TYPE_7_0 or Enum.GarrisonType.Type_7_0);
if (#looseShipments+#followerShipments+#buildings)>0 then
if #buildings>0 then
tt:AddLine(C("gray","Buildings"));
for i = 1, #buildings do
if buildings[i].buildingID then
addShipment(tt,C_Garrison.GetLandingPageShipmentInfo(buildings[i].buildingID));
end
end
end
if #followerShipments>0 then
tt:AddLine(C("gray","Troops"));
for i = 1, #followerShipments do
addShipment(tt,C_Garrison.GetLandingPageShipmentInfoByContainerID(followerShipments[i]));
end
end
if #looseShipments>0 then
tt:AddLine(C("gray",AUCTION_SUBCATEGORY_OTHER));
for i = 1, #looseShipments do
addShipment(tt,C_Garrison.GetLandingPageShipmentInfoByContainerID(looseShipments[i]));
end
end
else
tt:SetCell(tt:AddLine(),1,C("gray",L["No active shipments found..."]),nil,"CENTER",0);
end
else
tt:SetCell(tt:AddLine(),1,L["You have not unlocked your order hall"],nil,"CENTER",0);
end
if (ns.profile.GeneralOptions.showHints) then
tt:AddSeparator(4,0,0,0,0);
ns.ClickOpts.ttAddHints(tt,name);
end
ns.roundupTooltip(tt);
end
-- module functions and variables --
------------------------------------
module = {
events = {
"PLAYER_LOGIN"
},
config_defaults = {
enabled = false
},
clickOptionsRename = {
["garrreport"] = "1_open_garrison_report",
--["menu"] = "2_open_menu"
},
clickOptions = {
["garrreport"] = "GarrisonReport",
--["menu"] = "OptionMenu"
}
}
ns.ClickOpts.addDefaults(module,{
garrreport = "_LEFT",
-- menu = "_RIGHT"
});
-- function module.options() return {} end
-- function module.init() end
function module.onevent(self,event,arg1,...)
if event=="BE_UPDATE_CFG" and arg1 and arg1:find("^ClickOpt") then
ns.ClickOpts.update(name);
end
if event=="PLAYER_LOGIN" then
local InstantWQ = GetClassTalentTreeInfoByType(LE_GARRISON_TYPE_7_0 or Enum.GarrisonType.Type_7_0,"InstantWQ");
if InstantWQ and InstantWQ.reagentItem then
GetItemInfo(InstantWQ.reagentItem);
end
end
if ns.eventPlayerEnteredWorld then
--updateBroker();
end
end
-- function module.optionspanel(panel) end
-- function module.onmousewheel(self,direction) end
-- function module.ontooltip(self) end
function module.onenter(self)
if (ns.tooltipChkOnShowModifier(false)) then return; end
tt = ns.acquireTooltip({ttName,ttColumns, "LEFT","LEFT", "CENTER", "CENTER", "CENTER", "RIGHT","RIGHT"},{false},{self});
createTooltip(tt);
end
-- function module.onleave(self) end
-- function module.onclick(self,button) end
-- function module.ondblclick(self,button) end
-- final module registration --
-------------------------------
ns.modules[name] = module;