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.

380 lines
12 KiB

-- module independent variables --
----------------------------------
local addon, ns = ...
local C, L, I = ns.LC.color, ns.L, ns.I
if ns.client_version<6 then return end
-- module own local variables and local cached functions --
-----------------------------------------------------------
local name = "Tanaan Jungle Dailies"; -- L["Tanaan Jungle Dailies"] L["ModDesc-Tanaan Jungle Dailies"]
local ttName, ttName2, ttColumns, ttColumns2, tt, tt2, module = name.."TT",name.."TT2", 2, 2;
local try,dailiesReset,weekliesReset,namesCount,namesNeed,completed,numCompleted,names,questlog,numQuestlog = 6,0,0,0,0,{},{},{},{},{};
local dubs,updateLock,updateTimeout = {},true,10;
local ids,zone2hidden,numIDTypes,colorIDTypes,typeOrder,npcs,groupIds,titles;
-- [<questId>] = <number> ( 1=bosses, 2=zone dailies, 3=hidden zone dailies, 4=bonus zone dailies, 5=random dailies, 6=weeklies )
--[=[
what the difference between zone, hidden and bonus dailys?
you get the zone daily from the table in your faction tanaan jungle hub.
if you have the zone daily in your log and fly into the zone you will automatically get the hidden quest.
you can see it through blizzards objective tracker under the minimap. note: the hidden quest contains all subtargets to complete the quest.
the bonus quest you get by fly or walk into zone without a active zone daily in questlog.
--]=]
-- register icon names and default files --
-------------------------------------------
I[name] = {iconfile="interface\\icons\\Achievement_Zone_Tanaanjungle", coords={.15,.55,.15,.55}, size={64,64}}; --IconName::Tanaan Jungle Dailies--
-- some local functions --
--------------------------
local function updateResetTimes()
if dailiesReset>0 then return end
dailiesReset = time() + GetQuestResetTime() - 86400;
local wday,reset = tonumber(date("%w"));
if(wday==0)then
reset = 4*86400;
elseif(wday>3)then
reset = wday*86400;
elseif(wday<3)then
reset = (3+wday)*86400;
end
weekliesReset = dailiesReset - wday;
end
local function callbackLocaleNames(data)
if data.type=="quest" or data.type=="unit" then
if type(data.lines[1])=="string" and strlen(data.lines[1])>0 then
if data.type=="unit" then
names[data.id2] = data.lines[1];
else
names[data.id] = data.lines[1];
end
namesCount = namesCount + 1;
end
end
end
local function updateLocaleNames()
local failed,tmp,c = false,{},0;
local locale=GetLocale();
if Broker_Everything_DataDB.locale~=locale then
Broker_Everything_DataDB.locale=locale;
Broker_Everything_DataDB.localeNames={};
end
names = Broker_Everything_DataDB.localeNames;
-- collect locale quest titles
for id,v in pairs(ids)do
if v~=1 and v~=3 then
if names[id]==nil then
ns.ScanTT.query({type="quest",id=id,level=100,callback=callbackLocaleNames});
else
namesCount = namesCount + 1;
end
namesNeed = namesNeed + 1;
end
end
-- collect locale npc names
for nID,qID in pairs(npcs)do
if names[qID]==nil then
ns.ScanTT.query({type="unit",id=nID,id2=qID,callback=callbackLocaleNames});
else
namesCount = namesCount + 1;
end
namesNeed = namesNeed + 1;
end
end
local function updateQuestStatus()
if updateLock then return end
updateLock = true;
local t,c,nC,Q,cQ = time(),{},{},0,0;
for id,v in pairs(ids)do
Q=Q+1;
if c[id]==nil then c[id]=0; end
if nC[v]==nil then nC[v]=0; end
local index = (GetQuestLogIndexByID or C_QuestLog.GetLogIndexForQuestID)(id) or 0; -- TODO: removed in shadowlands
if C_QuestLog.IsQuestFlaggedCompleted(id)==true then
c[id]=t; nC[v]=nC[v]+1; cQ=cQ+1;
elseif index>0 then
questlog[id]=true;
end
end
if cQ<Q then
completed,numCompleted=c,nC;
if ns.toon.tanaanjungle==nil then
ns.toon.tanaanjungle={};
end
ns.toon.tanaanjungle.completed = c;
ns.toon.tanaanjungle.questlog = questlog; --?
local bbt = {}; -- broker button text
for _,i in ipairs(typeOrder) do
tinsert(bbt,C(colorIDTypes[i], numCompleted[i]) .. "/" .. C(colorIDTypes[i], numIDTypes[i]));
end
ns.LDB:GetDataObjectByName(module.ldbName).text = table.concat(bbt,", ");
end
updateLock = false;
end
local function listQuests(TT,questlog,completed,numCompleted)
local questNameUknown = C("orange",L["Wait on name..."]);
for _,i in ipairs(typeOrder) do
local num=0;
TT:AddSeparator(4,0,0,0,0);
TT:AddLine(C(colorIDTypes[i],L[titles[i][1]]), C(colorIDTypes[i], numCompleted[i] or 0) .. "/" .. C(colorIDTypes[i], numIDTypes[i]));
TT:AddSeparator();
for id,qType in pairs(ids)do
if qType==i then
local color,state = nil,nil;
if completed[id]~=nil and completed[id]>dailiesReset then
color,state = "green",GOAL_COMPLETED;
elseif questlog[id]==true then
color,state = "yellow",L["In Questlog"];
if (i>=2 and i<=4) then
state = format("%s |cff00ccff(%d%%)|r",state,GetQuestProgressBarPercent(zone2hidden[id] or id));
end
elseif qType==1 or qType==4 or qType==6 then
color,state = "white",AVAILABLE;
if (i>=2 and i<=4) then
state = format("%s |cff00ccff(%d%%)|r",state,GetQuestProgressBarPercent(zone2hidden[id] or id));
end
end
if color then
local questName = questNameUknown;
if names[id] then
questName = C("ltyellow",names[id]);
end
TT:AddLine((ns.profile[name].showQuestIDs and C("gray",id).." " or "") .. questName,C(color,state));
num=num+1;
end
end
end
if num==0 then
local l = TT:AddLine();
TT:SetCell(l,1,C("ltgray",L["No quests completed or in your quest log..."]),nil,nil,ttColumns);
end
end
end
local function createTooltip2(self,tt2,Class,Name,Realm,Data)
if (tt2) and (tt2.key) and (tt2.key~=ttName2) then return end -- don't override other LibQTip tooltips...
tt2 = ns.acquireTooltip({ttName2, ttColumns2, "LEFT", "RIGHT", "CENTER", "RIGHT", "LEFT"},{true},{self,"horizontal",tt});
if tt2.lines~=nil then tt2:Clear(); end
listQuests(tt2,{},Data.completed,Data.numCompleted);
ns.roundupTooltip(tt2);
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 l = tt:AddHeader();
tt:SetCell(l,1,C("dkyellow",L[name]),nil,nil,ttColumns);
if(namesCount~=namesNeed)then
local l=tt:AddLine();
tt:SetCell(l,1,L["This module is waiting for some localized names."],nil,nil,2);
tt:AddLine(L["Count of data to collect:"],namesCount.." / "..namesNeed);
ns.roundupTooltip(tt);
return;
end
updateResetTimes();
--updateQuestStatus();
if ns.profile[name].showChars then
tt:AddSeparator(4,0,0,0,0);
local l=tt:AddLine( C("ltblue",CHARACTER) ); -- 1
tt:AddSeparator();
for index,toonNameRealm,toonName,toonRealm,toonData,isCurrent in ns.pairsToons(name,{currentFirst=true,forceSameRealm=true}) do
if toonData.level>=100 and toonData.tanaanjungle then
local bbt = {}; -- broker button text
for _,i in ipairs(typeOrder) do
local num = 0;
if toonData.tanaanjungle.completed then
for I,V in pairs(toonData.tanaanjungle.completed)do
if ids[I]==numIDTypes[i] and V>dailiesReset then
num=num+1;
end
end
end
tinsert(bbt,C(colorIDTypes[i], num) .. "/" .. C(colorIDTypes[i], numIDTypes[i]));
end
local l=tt:AddLine(C(toonData.class,ns.scm(toonName))..ns.showRealmName(name,toonRealm),table.concat(bbt,", "));
if isCurrent then -- highlight current toon
tt:SetLineColor(l, 0.1, 0.3, 0.6);
end
end
end
end
listQuests(tt,questlog,completed,numCompleted);
if ns.profile.GeneralOptions.showHints then
tt:AddSeparator(3,0,0,0,0)
ns.AddSpannedLine(tt,C("copper",L["Hold shift"]).." || "..C("green",L["Show your other chars"]));
ns.ClickOpts.ttAddHints(tt,name);
end
ns.roundupTooltip(tt);
end
-- module variables for registration --
---------------------------------------
module = {
events = {
"PLAYER_LOGIN",
"PLAYER_REGEN_ENABLED",
"QUEST_LOG_UPDATE"
},
config_defaults = {
enabled = false,
showQuestIDs = false,
},
clickOptionsRename = {
["questlog"] = "1_open_questlog",
["menu"] = "2_open_menu"
},
clickOptions = {
["questlog"] = "QuestLog",
["menu"] = "OptionMenu"
}
}
ns.ClickOpts.addDefaults(module,{
questlog = "_LEFT",
menu = "_RIGHT"
});
function module.options()
return {
broker = nil,
tooltip = {
showQuestIDs={ type="toggle", order=1, name=L["QuestIDs"], desc=L["Show QuestIDs in tooltip"] },
showChars={2,true},
showAllFactions=3,
showRealmNames=4,
showCharsFrom=5
},
misc = nil,
}
end
function module.init()
ids = ns.player.faction=="Alliance" and {
[39287]=1,[39288]=1,[39289]=1,[39290]=1, -- bosses
[38585]=2,[38587]=3,[39453]=4,-- Assault on the Throne of Kil'jaeden
[38441]=2,[37970]=3,[39445]=4,-- Assault on the Fel Forge
[37891]=2,[37865]=3,[39451]=4,-- Assault on Ironhold Harbor
[38250]=2,[37938]=3,[39447]=4,-- Assault on the Ruins of Kra'nak
[38045]=2,[38043]=3,[39441]=4,-- Bleeding the Bleeding Hollow
[38046]=2,[38051]=3,[39443]=4,-- Battle at the Iron Front
[37968]=2,[37966]=3,[39450]=4,-- Assault on the Temple of Sha'naar
[39433]=5,-- npc 95424
[39581]=5,[39582]=5,[39586]=5, -- npc 96147
[39567]=5,[39568]=5,[39570]=5,[39574]=5,[39573]=5,[39571]=5,[39569]=5, -- npc 90974
[39565]=6 -- npc 92805
} or {
[39287]=1,[39288]=1,[39289]=1,[39290]=1,-- bosses
[38586]=2,[38588]=3,[39454]=4,-- Assault on the Throne of Kil'jaeden
[38440]=2,[38439]=3,[39446]=4,-- Assault on the Fel Forge
[37940]=2,[37866]=3,[39452]=4,-- Assault on Ironhold Harbor
[38252]=2,[38009]=3,[39448]=4,-- Assault on the Ruins of Kra'nak
[38044]=2,[38040]=3,[39442]=4,-- Bleeding the Bleeding Hollow
[38047]=2,[38054]=3,[39444]=4,-- Battle at the Iron Front
[38449]=2,[38020]=3,[39449]=4,-- Assault on the Temple of Sha'naar
[39433]=5,-- npc 95424
[39519]=5,[39529]=5,[39532]=5,-- npc 93396
[39511]=5,[39509]=5,[39510]=5,[39512]=5,[39526]=5,[39514]=5,[39513]=5,-- npc 96014
[39565]=6-- npc 92805
};
zone2hidden = {
[38585]=38587,[38441]=37970,[37891]=37865,[38250]=37938,
[38045]=38043,[38046]=38051,[37968]=37966,[38586]=38588,
[38440]=38439,[37940]=37866,[38252]=38009,[38044]=38040,
[38047]=38054,[38449]=38020,
};
numIDTypes = {
4, -- bosses
1, -- random zone daily
1, -- hidden zone daily
7, -- bonus dailies
4, -- random dailies
1, -- weeklies
};
colorIDTypes = {
"ltblue",
"green",
"red",
"yellow",
"orange",
"violet",
}
typeOrder = {1,6,5,2,4};
npcs = { -- [<npcID>] = <questID>
[95053]=39287,[95044]=39288,[95056]=39289,[95054]=39290
};
groupIds = {
--[39432] =
};
titles = { -- {"<title>", <maxQuestCount>}
{"Rare bosses",4}, -- L["Rare bosses"]
{"Random zone daily",1}, -- L["Random zone dailies"]
{"Hidden random zone dailies",3}, -- L["Hidden random zone dailies"]
{"Daily zone bonus",7}, -- L["Daily zone bonus"]
{"Reputation dailies",4}, -- L["Reputation dailies"]
{"Reputation weeklies",1} -- L["Reputation weeklies"]
}
end
function module.onevent(self,event,...)
if event=="BE_UPDATE_CFG" and ... and (...):find("^ClickOpt") then
ns.ClickOpts.update(name);
elseif event=="PLAYER_LOGIN" then
updateResetTimes();
if ns.toon==nil then
ns.toon={};
end
ns.toon.tanaanjungle = nil;
if ns.toon.tanaanjungle==nil then
ns.toon.tanaanjungle={};
end
updateQuestStatus();
C_Timer.After(3, updateLocaleNames);
elseif event=="QUEST_LOG_UPDATE" then
updateQuestStatus();
end
end
-- function module.onupdate() end
-- function module.onupdate(self,elapse) end
-- function module.optionspanel(panel) end
-- function module.onmousewheel(self,direction) end
-- function module.ontooltip(tooltip) end
function module.onenter(self)
if (ns.tooltipChkOnShowModifier(false)) then return; end
tt = ns.acquireTooltip({ttName, ttColumns, "LEFT", "RIGHT", "CENTER", "RIGHT", "LEFT"},{false},{self});
createTooltip(tt);
end
-- function module.onleave(self) end
-- final module registration --
-------------------------------
ns.modules[name] = module;