From f389b667b2e8c09b65578d41f2b7408b394d2c1f Mon Sep 17 00:00:00 2001 From: Alar of Daggerspine Date: Mon, 12 Jan 2015 03:25:13 +0100 Subject: [PATCH] public alpha Signed-off-by: Alar of Daggerspine --- GarrisonCommander.lua | 792 ++++++++++++++++++------------------------------- doc.txt | 214 ++++++++++++- wowhead.lua | 773 +++++++++++++++++++++++------------------------ 3 files changed, 895 insertions(+), 884 deletions(-) diff --git a/GarrisonCommander.lua b/GarrisonCommander.lua index d8afc16..525703e 100644 --- a/GarrisonCommander.lua +++ b/GarrisonCommander.lua @@ -37,13 +37,12 @@ local bigscreen=true local GMM=false local MP=false local MPGoodGuy=false -local MPPage +local MPSwitch local dbg=false local trc=false local pin=false local baseHeight local minHeight - if (LibDebug) then LibDebug() end local function tcopy(obj, seen) if type(obj) ~= 'table' then return obj end @@ -125,6 +124,7 @@ local GARRISON_FOLLOWER_MAX_UPGRADE_QUALITY=GARRISON_FOLLOWER_MAX_UPGRADE_QUALIT local GARRISON_FOLLOWER_MAX_LEVEL=GARRISON_FOLLOWER_MAX_LEVEL -- 100 local LEVEL=LEVEL -- Level +local MISSING=ADDON_MISSING local NOT_COLLECTED=NOT_COLLECTED -- not collected local GMF=GarrisonMissionFrame local GMFFollowerPage=GMF.FollowerTab @@ -548,8 +548,10 @@ end function addon:OnInitialized() --@debug@ xprint("OnInitialized") - self:DebugEvents() --@end-debug@ +--@alpha@ + self:Popup(L["You are using an Alpha version of Garrison Commander. Please post bugs on Curse if you find them"],10) +--@end-alpha@ for _,b in ipairs(GMFMissionsListScrollFrame.buttons) do local scale=0.8 local f,h,s=b.Title:GetFont() @@ -570,7 +572,7 @@ function addon:OnInitialized() self:AddLabel("Mission Panel") self:AddToggle("IGM",true,IGNORE_UNAIVALABLE_FOLLOWERS,IGNORE_UNAIVALABLE_FOLLOWERS_DETAIL) self:AddToggle("IGP",true,L['Ignore "maxed"'],L["Level 100 epic followers are not used for xp only missions."]) - self:AddToggle("NOFILL",false,L["Do not prefill mission page"],L["Disables automatic population of mission page screen. You can also press control while clicking to disable it for a single mission"]) + self:AddToggle("NOFILL",false,L["No mission prefill"],L["Disables automatic population of mission page screen. You can also press control while clicking to disable it for a single mission"]) self:AddSelect("MSORT","Garrison_SortMissions_Original", { Garrison_SortMissions_Original=L["Original method"], @@ -601,26 +603,15 @@ function addon:CheckMP() MPGoodGuy=true return end - MP=true - self:AddToggle("CKMP",true,L["Use GC Interface"],L["Switches between Garrison Commander and Master Plan mission interface. This also allow you to see Garrison Mission Manager buttons.\n If doesnt work, tell me, and I will try to discover which new way of hiding GC and GMM had MP found....."]) - if (GarrisonMissionFrameTab3) then -- Active Missions - GarrisonMissionFrameTab3:HookScript("OnClick",function(this) - GarrisonMissionList_SetTab(GarrisonMissionFrameMissionsTab2) - MPPage=3 - end) - end - if (GarrisonMissionFrameTab1) then --Available Missions - GarrisonMissionFrameTab1:HookScript("OnClick",function(this) - GarrisonMissionList_SetTab(GarrisonMissionFrameMissionsTab1) - MPPage=1 - end) - end - if (GarrisonMissionFrameTab2) then -- Followers list - GarrisonMissionFrameTab2:HookScript("OnClick",function(this) - GarrisonMissionFrame_SelectTab(2) - MPPage=2 - end) + if GetAddOnMetadata("MasterPlan","Version")>="0.23" then + -- New compatible version + self:AddToggle("CKMP",true,L["Use GC Interface"],L["Switches between Garrison Commander and Master Plan mission interface. Tested with MP >0.23"]) + MPGoodGuy=true + MPSwitch=true end + MP=true + MPSwitch=true + self:AddToggle("CKMP",true,L["Use GC Interface"],L["Switches between Garrison Commander and Master Plan mission interface. Tested with MP >0.20"]) end end function addon:CheckGMM() @@ -635,6 +626,13 @@ function addon:ApplyIGM(value) end function addon:ApplyCKMP(value) self:Clock() + if (MasterPlanMissionList) then + if (value) then + MasterPlanMissionList:Hide() + else + MasterPlanMissionList:Show() + end + end self:RefreshMission() end function addon:ApplyDBG(value) @@ -1152,13 +1150,10 @@ function addon:SetThreatColor(obj,missionID) end function addon:HookedGarrisonMissionButton_AddThreatsToTooltip(missionID) + if (GMC:IsShown()) then return end self:RenderTooltip(missionID) end function addon:RenderTooltip(missionID) ---@debug@ - GameTooltip:AddLine("ID:" .. tostring(missionID)) ---@end-debug@ - if (GMC:IsShown()) then return end local mission=self:GetMissionData(missionID) if (not mission) then --@debug@ @@ -1426,7 +1421,9 @@ function addon:BuildMissionCache(id,data) xprint("No type",id,data.name) --@end-debug@ else - self.db.global.types[type]={name=type,description=typeDesc,icon=typeIcon} + if (not self.db.global.types[type]) then + self.db.global.types[type]={name=type,description=typeDesc,icon=typeIcon} + end end mission.slots={} local slots=mission.slots @@ -1441,8 +1438,10 @@ function addon:BuildMissionCache(id,data) if (type) then tinsert(slots,{name=TYPE,key=type,icon=typeIcon}) end + --collectgarbace("step",100) end mission.basePerc=select(4,G.GetPartyMissionInfo(id)) + end function addon:SetDbDefaults(default) default.global=default.global or {} @@ -1669,12 +1668,11 @@ local dbgFrame local lastCPU=0 local startTime=GetTime() -- Keeping it as a nice example of coroutine management.. but not using it anymore -local InProgress function addon:Clock() if (GMFMissions.showInProgress) then - --collectgarbage("step",200) + collectgarbage("step",200) else - --collectgarbage("step",100) + collectgarbage("step",100) end --@debug@ if (not dbgFrame) then @@ -1692,8 +1690,10 @@ function addon:Clock() if (m~=lastmin) then lastmin=m end - UpdateAddOnCPUUsage() - UpdateAddOnMemoryUsage() + if (trc) then + UpdateAddOnCPUUsage() + UpdateAddOnMemoryUsage() + end local cpu=GetAddOnCPUUsage("GarrisonCommander") dbgFrame.Text:SetText(format("GC Cpu %3.2f/%2.2f/%2.2f Mem %4.3fMB ", cpu, @@ -1703,7 +1703,7 @@ function addon:Clock() lastCPU=cpu --@end-debug@ dbcache.lastseen=time() - if (not MP) then return end + if (not MP or MPGoodGuy) then return end MPShown=not self:GetBoolean("CKMP") local children={GMFMissions:GetChildren()} for i=1,#children do @@ -1721,7 +1721,7 @@ function addon:Clock() GarrisonMissionFrameMissionsListScrollFrame:Hide() else GarrisonMissionFrameMissionsListScrollFrame:Show() - GarrisonMissionFrameMissionsListScrollFrame:SetParent(GarrisonMissionFrameMissions) + GarrisonMissionFrameMissionsListScrollFrame:SetParent(GMFMissions) end --@debug@ for k,d in pairs(coroutines) do @@ -1766,10 +1766,10 @@ end function addon:ShowMissionControl() if (not GMC:IsShown()) then GarrisonMissionFrame_SelectTab(999) - GarrisonMissionFrame.FollowerTab:Hide() - GarrisonMissionFrame.FollowerList:Hide() - GarrisonMissionFrame.MissionTab:Hide() - GarrisonMissionFrame.TitleText:SetText("Garrison Commander Mission Control") + GMF.FollowerTab:Hide() + GMF.FollowerList:Hide() + GMF.MissionTab:Hide() + GMF.TitleText:SetText("Garrison Commander Mission Control") GMC:Show() GMC.startButton:Click() GMC.tabMC:SetChecked(true) @@ -2133,14 +2133,15 @@ function addon:CreateOptionsLayer(...) local o=AceGUI:Create("SimpleGroup") -- a transparent frame o:SetLayout("Flow") o:SetCallback("OnClose",function(widget) widget:Release() end) + local totsize=0 for i=1,select('#',...) do - self:AddOptionToOptionsLayer(o,select(i,...)) + totsize=totsize+self:AddOptionToOptionsLayer(o,select(i,...)) end - return o + return o,totsize end function addon:AddOptionToOptionsLayer(o,flag,maxsize) - maxsize=tonumber(maxsize) or 150 - if (not flag) then return end + maxsize=tonumber(maxsize) or 140 + if (not flag) then return 0 end local info=self:GetVarInfo(flag) if (info) then local data={option=info} @@ -2188,11 +2189,21 @@ function addon:AddOptionToOptionsLayer(o,flag,maxsize) end) o:AddChildren(widget) end + return maxsize end function addon:Options() -- Main Garrison Commander Header GCF=CreateFrame("Frame","GCF",UIParent,"GarrisonCommanderTitle") +--@alpha@ + local fs=GCF:CreateFontString(nil, "BACKGROUND", "WorldMapTextFont") + fs:SetAllPoints() + fs:SetJustifyH("CENTER") + fs:SetJustifyV("CENTER") + fs:SetText("A l p h a V e r s i o n") + fs:SetTextColor(C.Silver()) + fs:SetAlpha(0.6) +--@end-alpha@ -- Removing wood corner. I do it here to not derive an xml frame. This shoud play better with ui extensions GCF.CloseButton:Hide() for _,f in pairs({GCF:GetRegions()}) do @@ -2299,10 +2310,10 @@ function addon:ScriptTrace(hook,frame,...) --@end-debug@ end function addon:IsProgressMissionPage() - return GMF:IsShown() and GMFMissions:IsShown() and GMFMissions.showInProgress and not GMFFollowers:IsShown() and not GMF.MissionComplete:IsShown() + return GMF:IsShown() and GMF.MissionTab and GMF.MissionTab.MissionList.showInProgress end function addon:IsAvailableMissionPage() - return GMF:IsShown() and GMFMissions:IsShown() and not GMFMissions.showInProgress and not GMFFollowers:IsShown() and not GMF.MissionComplete:IsShown() + return GMF:IsShown() and GMF.MissionTab:IsShown() and not GMF.MissionTab.MissionList.showInProgress end function addon:IsFollowerList() return GMF:IsShown() and GMFFollowers:IsShown() @@ -2315,22 +2326,25 @@ end function addon:IsMissionPage() return GMF:IsShown() and GMFMissionPage:IsShown() and GMFFollowers:IsShown() end -function addon:HookedGarrisonMissionList_SetTab(tab) - if (tab==GarrisonMissionFrameMissionsTab2) then - InProgress=true - else - InProgress=false - end - xprint("Inprogress",InProgress) -end +--- +-- Switches between missions (1) and followers (others) panels function addon:HookedGarrisonMissionFrame_SelectTab(id) - if (id~=1) then - InProgress=false - end GMC:Hide() GMC.tabMC:SetChecked(false) wipe(GMCUsedFollowers) end +--- +-- Switchs between active and availabla missions depending on tab object +do + local original=GarrisonMissionList_SetTab + function GarrisonMissionList_SetTab(...) + -- I dont actually care wich page we are shoing, I know I must redraw missions + original(...) + for i=1,#GMFMissionListButtons do + GMFMissionListButtons.lastMissionID=nil + end + end +end function addon:HookedGarrisonMissionFrame_HideCompleteMissions() self:BuildMissionsCache(true,true) end @@ -2409,9 +2423,9 @@ function addon:HookedGarrisonFollowerButton_UpdateCounters(frame,follower,showCo end function addon:HookedGarrisonFollowerListButton_OnClick(frame,button) --@debug@ - trace("Click",frame:GetName(),button,GarrisonMissionFrame.FollowerTab.Model:IsShown()) + trace("Click",frame:GetName(),button,GMF.FollowerTab.Model:IsShown()) --@end-debug@ - if (button=="LeftButton" and GarrisonMissionFrame.FollowerTab.FollowerID ~= frame.info.followerID) then + if (button=="LeftButton" and GMF.FollowerTab.FollowerID ~= frame.info.followerID) then if (frame.info.isCollected) then self:HookedGarrisonFollowerPage_ShowFollower(frame.info,frame.info.followerID) end @@ -2710,14 +2724,13 @@ function addon:SetUp(...) --/Interface/FriendsFrame/UI-Toast-FriendOnlineIcon end function addon:AddMenu() - GCF.Menu=self:CreateOptionsLayer(MP and 'CKMP' or nil,'BIGSCREEN','MOVEPANEL','IGM','IGP','NOFILL') - self:AddOptionToOptionsLayer(GCF.Menu,'MSORT') - self:AddOptionToOptionsLayer(GCF.Menu,'ShowMissionControl') + local menu,size=self:CreateOptionsLayer(MP and 'CKMP' or nil,'BIGSCREEN','MOVEPANEL','IGM','IGP','NOFILL','MSORT') + --self:AddOptionToOptionsLayer(GCF.Menu,'MSORT') + --self:AddOptionToOptionsLayer(GCF.Menu,'ShowMissionControl') --@debug@ - self:AddOptionToOptionsLayer(GCF.Menu,'DBG') - self:AddOptionToOptionsLayer(GCF.Menu,'TRC') + self:AddOptionToOptionsLayer(menu,'DBG') + self:AddOptionToOptionsLayer(menu,'TRC') --@end-debug@ - local menu=GCF.Menu local frame=menu.frame frame:Show() menu:ClearAllPoints() @@ -2725,6 +2738,7 @@ function addon:AddMenu() menu:SetWidth(GCF:GetWidth()-50) menu:SetHeight(GCF:GetHeight()-50) menu:DoLayout() + GCF.Menu=menu end function addon:RemoveMenu() if (GCF.Menu) then @@ -2732,7 +2746,12 @@ function addon:RemoveMenu() GCF.Menu=nil end end - +function addon:AddMissionId(b) + if (b.info and b.info.missionID) then + GameTooltip:AddDoubleLine("MissionID",b.info.missionID) + GameTooltip:Show() + end +end --- -- Additional setup -- This method is called every time garrison mission panel is open because @@ -2759,9 +2778,8 @@ function addon:StartUp(...) end self:SafeSecureHook("GarrisonMissionFrame_HideCompleteMissions") -- Mission reward completed self:SafeSecureHook("GarrisonMissionPage_ShowMission") - self:SafeSecureHook("GarrisonMissionList_UpdateMissions") self:SafeSecureHook("GarrisonMissionFrame_SelectTab") - self:SafeSecureHook("GarrisonMissionList_SetTab") + -- GarrisonMissionList_SetTab is overrided self:SafeHookScript(GMFMissions,"OnShow")--,"GrowPanel") self:SafeHookScript(GMFFollowers,"OnShow")--,"GrowPanel") @@ -2770,18 +2788,19 @@ function addon:StartUp(...) self:SafeSecureHook("GarrisonFollowerButton_UpdateCounters") -- Mission management self:SafeHookScript(GMF.MissionComplete.NextMissionButton,"OnClick","OnClick_GarrisonMissionFrame_MissionComplete_NextMissionButton",true) - self:SafeSecureHook("GarrisonMissionFrame_ShowCompleteMissions") - self:SafeSecureHook("GarrisonMissionFrame_CheckCompleteMissions") - self:SafeSecureHook("MissionCompletePreload_LoadMission") -- Hooking mission buttons on click for i=1,#GMFMissionListButtons do local b=GMFMissionListButtons[i] self:SafeHookScript(b,"OnClick","OnClick_GarrisonMissionButton",true) +--@debug@ + self:SafeHookScript(b,"OnEnter","AddMissionId",true) +--@end-debug@ end self:ScheduleRepeatingTimer("Clock",1) self:BuildMissionsCache(true,true) self:BuildRunningMissionsCache() self:Trigger("MSORT") + self:Trigger("CKMP") end function addon:MarkAsNew(obj,key,message) if (not db.news[key]) then @@ -2801,18 +2820,23 @@ function addon:PermanentEvents() self:SafeRegisterEvent("GARRISON_FOLLOWER_ADDED") self:SafeRegisterEvent("GARRISON_FOLLOWER_REMOVED") self:RegisterBucketEvent("GARRISON_MISSION_LIST_UPDATE",2,"EventGARRISON_MISSION_LIST_UPDATE") - + self:SafeRegisterEvent("GARRISON_FOLLOWER_LIST_UPDATE") --@debug@ self:DebugEvents() --@end-debug@ end function addon:DebugEvents() - self:SafeRegisterEvent("GARRISON_FOLLOWER_LIST_UPDATE") -- Should be used only when has true as parameter self:SafeRegisterEvent("GARRISON_MISSION_BONUS_ROLL_LOOT") self:SafeRegisterEvent("GARRISON_MISSION_FINISHED") self:SafeRegisterEvent("GARRISON_UPDATE") self:SafeRegisterEvent("GARRISON_USE_PARTY_GARRISON_CHANGED") self:SafeRegisterEvent("GARRISON_MISSION_NPC_OPENED") + self:SafeSecureHook("GarrisonMissionList_UpdateMissions") + self:SafeSecureHook("GarrisonMissionFrame_ShowCompleteMissions") + self:SafeSecureHook("GarrisonMissionFrame_CheckCompleteMissions") + self:SafeSecureHook("MissionCompletePreload_LoadMission") + + end function addon:checkMethod(method,hook) if (type(self[method])=="function") then @@ -2980,6 +3004,7 @@ function addon:GetFollowerStatusForMission(followerID,skipbusy) end end function addon:GetFollowerStatus(followerID,withTime,colored) + if (not followerID) then return UNAVAILABLE end local status=G.GetFollowerStatus(followerID) if (status and status== GARRISON_FOLLOWER_ON_MISSION and withTime) then local running=dbcache.running[dbcache.runningIndex[followerID]] @@ -3090,28 +3115,31 @@ function addon:RenderFollowerButton(frame,followerID,missionID) frame.NotFull:Hide() end if (not followerID) then - frame.PortraitFrame.Empty:Show() if (frame.Name) then + frame.PortraitFrame.Empty:Show() frame.Name:Hide() frame.Class:Hide() frame.Status:Hide() else - frame.PortraitFrame.Empty:SetAlpha(0.5) - frame.PortraitFrame.Portrait:Hide() + frame.PortraitFrame.Empty:Hide() + frame.PortraitFrame.Portrait:Show() frame.PortraitFrame.LevelBorder:SetAtlas("GarrMission_PortraitRing_iLvlBorder"); frame.PortraitFrame.LevelBorder:SetWidth(70); - frame.PortraitFrame.Level:SetText("Missing") + frame.PortraitFrame.Level:SetText(MISSING) + frame.PortraitFrame.Level:SetTextColor(1,0,0,0.7) end frame.PortraitFrame.LevelBorder:SetAtlas("GarrMission_PortraitRing_LevelBorder"); frame.PortraitFrame.LevelBorder:SetWidth(58); GarrisonFollowerPortrait_Set(frame.PortraitFrame.Portrait) - frame.info=nil + frame.PortraitFrame.PortraitRingQuality:SetVertexColor(C.Silver()); + frame.PortraitFrame.LevelBorder:SetVertexColor(C.Silver()); return end + frame.PortraitFrame.Level:SetTextColor(1,1,1,1) frame.PortraitFrame.Portrait:Show() - frame.info=self:GetFollowerData(followerID) - local info=frame.info + local info=self:GetFollowerData(followerID) if (not info) then return end + frame.info=info frame.missionID=missionID if (frame.Name) then frame.Name:Show() @@ -3128,7 +3156,7 @@ function addon:RenderFollowerButton(frame,followerID,missionID) frame.PortraitFrame.Empty:Hide(); local showItemLevel; - if (info.level == GarrisonMissionFrame.followerMaxLevel ) then + if (info.level == GMF.followerMaxLevel ) then frame.PortraitFrame.LevelBorder:SetAtlas("GarrMission_PortraitRing_iLvlBorder"); frame.PortraitFrame.LevelBorder:SetWidth(70); showItemLevel = true; @@ -3209,8 +3237,8 @@ function addon:RenderExtraButton(button,numRewards) local missionInfo=button.info local missionID=missionInfo.missionID panel.missionID=missionID - local mission=self:GetMissionData(missionID) - if not mission then return end -- something went wrong while refreshing + local mission=missionInfo + if not mission then print "not yet updated missions" return end -- something went wrong while refreshing if (not bigscreen) then local index=mission.numFollowers+numRewards-3 local position=(index * -65) - 130 @@ -3221,8 +3249,7 @@ function addon:RenderExtraButton(button,numRewards) local perc=select(4,G.GetPartyMissionInfo(missionID)) panel.Percent:SetFormattedText(GARRISON_MISSION_PERCENT_CHANCE,perc) panel.Age:Hide() - local q=self:GetDifficultyColor(perc) - panel.Percent:SetTextColor(q.r,q.g,q.b) + panel.Percent:SetTextColor(self:GetDifficultyColors(perc)) for i=1,3 do local frame=button.gcPANEL.Party[i] if (missionInfo.followers[i]) then @@ -3236,6 +3263,7 @@ function addon:RenderExtraButton(button,numRewards) end local party=parties[missionID] if (#party.members==0) then + local mission=self:GetMissionData(missionID) -- matchmaker and fillcounters need our enriched mission self:FillCounters(missionID,mission) self:MatchMaker(missionID,mission,party) end @@ -3259,13 +3287,11 @@ function addon:RenderExtraButton(button,numRewards) end panel=button.gcINDICATOR panel.Percent:SetFormattedText(GARRISON_MISSION_PERCENT_CHANCE,perc) - local q=self:GetDifficultyColor(perc) - panel.Percent:SetTextColor(q.r,q.g,q.b) + panel.Percent:SetTextColor(self:GetDifficultyColors(perc)) panel.Percent:SetWidth(80) panel.Percent:SetJustifyH("RIGHT") if (age) then local expire=ns.wowhead[missionID] - if expire then expire=expire.cd else expire =9999999 end if (expire==9999999) then panel.Age:SetText("Expires: Far far away") panel.Age:SetTextColor(C.White()) @@ -3288,7 +3314,7 @@ function addon:RenderExtraButton(button,numRewards) end function addon:CheckExpire(missionID) local age=tonumber(dbcache.seen[missionID]) - local expire=ns.wowhead[missionID].cd + local expire=ns.wowhead[missionID] print("Age",date("%m/%d/%y %H:%M:%S",age)) print("Now",date("%m/%d/%y %H:%M:%S")) print("Expire",expire,ns.expire[missionID]) @@ -3428,7 +3454,8 @@ function addon:RenderButton(button,rewards,numRewards) --@end-debug@ end local missionID=button.info.missionID - --if (GMF.MissionTab.MissionList.showInProgress) then return end + if GMF.MissionTab.MissionList.showInProgress and missionID==button.lastMissionID then return end + button.lastMissionID=missionID if (bigscreen) then local width=GMF.MissionTab.MissionList.showInProgress and BIGBUTTON or SMALLBUTTON button:SetWidth(width+600) @@ -3506,6 +3533,34 @@ function addon:RenderButton(button,rewards,numRewards) button.Env:Hide() end end + if (numRewards > 0) then + local index=1 + for id,reward in pairs(rewards) do + local Reward = button.Rewards[index]; + Reward.Quantity:SetTextColor(C.Yellow()) + if (reward.followerXP) then + Reward.Quantity:SetText(reward.followerXP) + Reward.Quantity:Show() + elseif (reward.currencyID==0) then + Reward.Quantity:SetFormattedText("%d",reward.quantity/10000) + Reward.Quantity:Show() + elseif (reward.itemID and reward.itemID==120205) then + Reward.Quantity:SetFormattedText("%d",self:GetMissionData(missionID,'xp') or 1) + Reward.Quantity:Show() + elseif (reward.itemID and reward.quantity==1) then + local _,_,q,i=GetItemInfo(reward.itemID) + Reward.Quantity:SetText(i) + local c=ITEM_QUALITY_COLORS[q] + if (not c) then + Reward.Quantity:SetTextColor(1,1,1) + else + Reward.Quantity:SetTextColor(c.r,c.g,c.b) + end + Reward.Quantity:Show() + end + index=index+1 + end + end else if (button.Env) then button.Env:Hide() end end @@ -3514,407 +3569,17 @@ function addon:RenderButton(button,rewards,numRewards) button.GcThreats[i]:Hide() end end - if (numRewards > 0) then - local index=1 - for id,reward in pairs(rewards) do - local Reward = button.Rewards[index]; - Reward.Quantity:SetTextColor(C.Yellow()) - if (reward.followerXP) then - Reward.Quantity:SetText(reward.followerXP) - Reward.Quantity:Show() - elseif (reward.currencyID==0) then - Reward.Quantity:SetFormattedText("%d",reward.quantity/10000) - Reward.Quantity:Show() - elseif (reward.itemID and reward.itemID==120205) then - Reward.Quantity:SetFormattedText("%d",self:GetMissionData(missionID,'xp') or 1) - Reward.Quantity:Show() - elseif (reward.itemID and reward.quantity==1) then - local _,_,q,i=GetItemInfo(reward.itemID) - Reward.Quantity:SetText(i) - local c=ITEM_QUALITY_COLORS[q] - if (not c) then - Reward.Quantity:SetTextColor(1,1,1) - else - Reward.Quantity:SetTextColor(c.r,c.g,c.b) - end - Reward.Quantity:Show() - end - index=index+1 - end - end if (button.fromFollowerPage) then - --button.Title:ClearAllPoints() - --button.Title:SetPoint("TOPLEFT",165,-5) - --button.Summary:ClearAllPoints() - --button.Summary:SetPoint("BOTTOMLEFT",165,5) - --button:SetHeight(70) + print("From follower page") return end if (not button.gcPANEL) then self:BuildExtraButton(button) end + print("Renderng extrabutton") self:RenderExtraButton(button,numRewards) end ---@do-not-package@ -_G.GAC=addon ---[[ - -GMFMissions.CompleteDialog.BorderFrame.CompleteAll -Garrison page structure -Tab selection: -Managed by -GarrisonMissionFrameTab(1|2) onclick: -->GarrisonMissionFrameTab_OnClick(self) ---->GarrisonMissionFrame_SelectTab(self:GetID()) - 1 for Missions, 2 for followers - -Main Container is GarrisonMissionFrame -Followers tab selected: -->GarrisonMissionFrameFollowers -> anchored GarrisonMissionFrame TOPLEFT 33,-64 --->GarrisonMissionFrameFollowersListScrollFrame ---->GarrisonMissionFrameFollowersListScrooFrameScrollChild ----->GarrisonMissionFrameFollowersListScrooFrameButton(1..9) -->GarrisonMissionFrame.FollowerTab -> abcuored GarrisonMissionFrame TOPRIGHT -35 -64 -Missions tab selected -->GarrisonMissionFrameMissions -> anchored (parent)e TOPLEFT 35,-65 - - - - -GarrisonMissionFrameMissionsListScrollFrameButtonx.info: -Dump: value=GarrisonMissionFrameMissionsListScrollFrameButton1.info -[1]={ - description="In a remote corner of Talador, a small faction of draenei has embraced the worship of Sargeras. Stop their cult before it spreads.", - cost=10, - duration="4 hr", - durationSeconds=14400, - level=100, - type="Combat", - locPrefix="GarrMissionLocation-Talador", - rewards={ - [290]={ - title="Money Reward", - quantity=600000, - icon="Interface\\Icons\\inv_misc_coin_01", - currencyID=0 - } - }, - numRewards=1, - numFollowers=2, - state=-2, - iLevel=0, - name="Cult of Sargeras", - followers={ - }, - location="Talador", - isRare=false, - typeAtlas="GarrMission_MissionIcon-Combat", - missionID=126 -} -Dump: value=G.GetFollowerInfo("0x000000000002F5E1") -[1]={ - displayHeight=0.5, - iLevel=600, - scale=0.60000002384186, - classAtlas="GarrMission_ClassIcon-Druid", - garrFollowerID="0x0000000000000022", - displayScale=1, - status="On Mission", - level=100, - quality=4, - portraitIconID=1066112, - isFavorite=false, - xp=0, - className="Guardian Druid", - classSpec=8, - name="Qiana Moonshadow", - followerID="0x000000000002F5E1", - height=1.3999999761581, - displayID=55047, - levelXP=0, - isCollected=true -} -value=GarrisonMissionFrame.MissionTab.MissionList.availableMissions[13] -[1]={ - description="Scouts report a many-headed beast named Festerbloom waylaying travelers crossing the Murkbog. Clear the path for everyone's sake.", - cost=20, - duration="10 hr", - durationSeconds=36000, - level=96, - type="Combat", - locPrefix="GarrMissionLocation-SpiresofArak", - rewards={ - [778]={ - title="Bonus Follower XP", - followerXP=1400, - tooltip="+1,400 XP", - icon="Interface\\Icons\\XPBonus_Icon", - name="+1,400 XP" - } - }, - numRewards=1, - numFollowers=3, - state=-2, - iLevel=0, - name="Murkbog Terror", - followers={ - }, - location="Spires of Arak", - isRare=false, - typeAtlas="GarrMission_MissionIcon-Combat", - missionID=374 -} -Dump: value=GarrisonMissionFrame.MissionTab.MissionList.inProgressMissions -[1]={ - description="The voidlords and voidcallers plaguing Shadowmoon Valley are being summoned by someone. Find and kill whoever is responsible.", - cost=15, - duration="6 hr", - durationSeconds=21600, - level=100, - timeLeft="1 hr 12 min", - type="Combat", - inProgress=true, - locPrefix="GarrMissionLocation-ShadowmoonValley", - rewards={ - [251]={ - title="Bonus Follower XP", - followerXP=8000, - tooltip="+8,000 XP", - icon="Interface\\Icons\\XPBonus_Icon", - name="+8,000 XP" - } - }, - numRewards=1, - numFollowers=3, - state=-1, - iLevel=0, - name="Twisting the Nether", - followers={ - [1]="0x000000000002F5E1", - [2]="0x0000000000079D62", - [3]="0x00000000001307EF" - }, - location="Shadowmoon Valley", - isRare=false, - typeAtlas="GarrMission_MissionIcon-Combat", - missionID=114 -} -Dump: value=G.GetMissionInfo(119) -local location, xp, environment, environmentDesc, environmentTexture, locPrefix, isExhausting, enemies = C_Garrison.GetMissionInfo(missionID); -[1]="Nagrand", -[2]=1500, -[3]="Orc", -[4]="Lok'tar ogar!", -[5]="Interface\\ICONS\\Achievement_Boss_General_Nazgrim.blp", -[6]="GarrMissionLocation-Nagrand", -[7]=false, -[8]={ - [1]={ - portraitFileDataID=1067358, - displayID=56189, - name="Warsong Earthcaller", - mechanics={ - [4]={ - description="A dangerous harmful effect that should be dispelled.", - name="Magic Debuff", - icon="Interface\\ICONS\\Spell_Shadow_ShadowWordPain.blp" - }, - [8]={ - description="A dangerous spell that should be interrupted.", - name="Powerful Spell", - icon="Interface\\ICONS\\Spell_Shadow_ShadowBolt.blp" - } - } - } -} -local totalTimeString, totalTimeSeconds, isMissionTimeImproved, successChance, partyBuffs, isEnvMechanicCountered, xpBonus, materialMultiplier = C_Garrison.GetPartyMissionInfo(MISSION_PAGE_FRAME.missionInfo.missionID); -Dump: value=C_Garrison.GetPartyMissionInfo(118) -[1]="8 hr", -[2]=28800, -[3]=false, -[4]=0, -[5]={ -}, -[6]=false, -[7]=0, -[8]=1 -Dump: value=table returned by GetFollowerInfo for a collected follower -[1]={ - displayHeight=0.5, - iLevel=600, - isCollected=true, - classAtlas="GarrMission_ClassIcon-Druid", - garrFollowerID="0x0000000000000022", - displayScale=1, - level=100, - quality=4, - portraitIconID=1066112, - isFavorite=false, - xp=0, - className="Guardian Druid", - classSpec=8, - name="Qiana Moonshadow", - followerID="0x000000000002F5E1", - height=1.3999999761581, - displayID=55047, - scale=0.60000002384186, - levelXP=0 -} - local location, xp, environment, environmentDesc, environmentTexture, locPrefix, isExhausting, enemies = G.GetMissionInfo(missionID) ---]] -function addon:GetScroller(title,type) - type=type or "Frame" - local scrollerWindow=AceGUI:Create("Frame") - scrollerWindow:SetTitle(title) - scrollerWindow:SetLayout("Fill") - --local scrollcontainer = AceGUI:Create("SimpleGroup") -- "InlineGroup" is also good - --scrollcontainer:SetFullWidth(true) - --scrollcontainer:SetFullHeight(true) -- probably? - --scrollcontainer:SetLayout("Fill") -- important! - --scrollerWindow:AddChild(scrollcontainer) - local scroll = AceGUI:Create("ScrollFrame") - scroll:SetLayout("Flow") -- probably? - scroll:SetFullWidth(true) - scroll:SetFullHeight(true) - scrollerWindow:AddChild(scroll) - scrollerWindow:SetCallback("OnClose","Release") - scrollerWindow:SetHeight(800) - scrollerWindow:SetWidth(400) - scrollerWindow:SetPoint("CENTER") - scrollerWindow:Show() - return scroll -end -function addon:AddRow(obj,text,...) - local l=AceGUI:Create("Label") - l:SetText(text) - l:SetColor(...) - l:SetFullWidth(true) - obj:AddChild(l) -end -function addon:cutePrint(scroll,level,k,v) - if (type(level)=="table") then - for k,v in pairs(level) do - self:cutePrint(scroll,"",k,v) - end - return - end - if (type(v)=="table") then - self:AddRow(scroll,level..C(k,"Azure")..":" ..C("Table","Orange")) - for kk,vv in pairs(v) do - self:cutePrint(scroll,level .. " ",kk,vv) - end - else - if (type(v)=="string" and v:sub(1,2)=='0x') then - v=v.. " " ..tostring(self:GetFollowerData(v,'name')) - end - self:AddRow(scroll,level..C(k,"White")..":" ..C(v,"Yellow")) - end -end -function addon:DumpFollower(name) - local follower=self:GetFollowerData(name) - if (follower) then - local scroll=self:GetScroller(follower.name) - self:cutePrint(scroll,follower) - end - -end -function addon:DumpFollowerMissions(missionID) - local scroll=self:GetScroller("FollowerMissions " .. self:GetMissionData(missionID,'name')) - self:cutePrint(scroll,followerMissions.missions[missionID]) -end -function addon:DumpIfnored() - local scroll=self:GetScroller("Ignored") - self:cutePrint(scroll,self.privatedb.profile.ignored) -end -function addon:DumpMission(missionID) - local scroll=self:GetScroller("MissionCache " .. self:GetMissionData(missionID,'name')) - self:cutePrint(scroll,cache.missions[missionID]) -end -function addon:DumpMissions() - local scroll=self:GetScroller("MissionCache") - for id,data in pairs(cache.missions) do - self:cutePrint(scroll,id .. '.'..data.name) - end -end ---- --- Debug function ---@param missionID Identificativo missione -function addon:DumpCounters(missionID) - local scroll=self:GetScroller("Counters " .. self:GetMissionData(missionID,'name')) - self:cutePrint(scroll,counters[missionID]) - self:cutePrint(scroll,"Lista per follower","","") - self:cutePrint(scroll,counterFollowerIndex[missionID]) - self:cutePrint(scroll,"Lista per threat","","") - self:cutePrint(scroll,counterThreatIndex[missionID]) -end -function addon:Dump(title,data) - local scroll=self:GetScroller(title) - self:cutePrint(scroll,data) - -end -function addon:DumpCounterers(missionID) - local scroll=self:GetScroller("Counterers " .. self:GetMissionData(missionID,'name')) - self:cutePrint(scroll,cache.missions[missionID].counterers) -end -function addon:DumpParty(missionID) - local scroll=self:GetScroller("Party " .. self:GetMissionData(missionID,'name')) - self:cutePrint(scroll,parties[missionID]) -end -function addon:GenerateTimersPeriodic() - return coroutine.wrap( - function(self) - repeat - local t=new() - G.GetInProgressMissions(t) - for index=1,#t do - local mission=t[index] - for i=1,mission.numFollowers do - end - end - coroutine.yield() - until false - end - ) -end -function addon:GMF_OnDragStart(frame) - if (not self:GetBoolean('MOVEPANEL')) then return end - frame.IsSizingOrMoving=true - if (IsShiftKeyDown()) then - frame.IsSizing=true - frame:StartSizing("BOTTOMRIGHT") - frame:SetScript("OnUpdate",function(frame,elapsed) - if (frame.timepassed and frame.timepassed >1) then - GarrisonMissionList_UpdateMissions() - else - frame.timepassed=frame.timepassed or 0 - frame.timepassed=frame.timepassed +elapsed - end - end) - else - frame.IsSizing=nil - frame:StartMoving() - end -end -function addon:GMF_OnDragStop(frame) - frame:StopMovingOrSizing() - frame:SetScript("OnUpdate",nil) - if (frame.IsSizing) then - BIGSIZEW=frame:GetWidth() - SIZEV=frame:GetHeight() - BIGBUTTON=min(BIGSIZEW*0.55,BIGSIZEW-GCSIZE) - SMALLBUTTON=BIGBUTTON - if (not self:IsFollowerList()) then - HybridScrollFrame_CreateButtons(frame.MissionTab.MissionList.listScroll, "GarrisonMissionListButtonTemplate", 13, -8, nil, nil, nil, -4); - GarrisonMissionList_Update(); - else - HybridScrollFrame_CreateButtons(frame.FollowerList.listScroll, "GarrisonMissionFollowerButtonTemplate", 7, -7, nil, nil, nil, -6); - end - end - frame.IsSizing=nil - frame.IsSizingOrMoving=nil -end - ---@end-do-not-package@ -- Courtesy of Motig -- Concept and interface reused with permission -- Mission building rewritten from scratch @@ -4052,7 +3717,6 @@ do local currentMission=0 local x=0 function addon:GMCCalculateMissions(this,elapsed) - InProgress=false db.news.MissionControl=true timeElapsed = timeElapsed + elapsed if (#aMissions == 0 ) then @@ -4187,7 +3851,12 @@ function addon:GMCBuildPanel() GMC.startButton:SetScript('OnLeave', function() GameTooltip:Hide() end) GMC.runButton = CreateFrame('BUTTON', nil,list.frame, 'GameMenuButtonTemplate') GMC.runButton:SetText('Send all mission at once') - GMC.runButton:SetScript('OnEnter', function() GameTooltip:SetOwner(GMC.runButton, 'ANCHOR_TOPRIGHT') GameTooltip:AddLine('Submit all yopur mission at once. No question asked.') GameTooltip:Show() end) + GMC.runButton:SetScript('OnEnter', function() + GameTooltip:SetOwner(GMC.runButton, 'ANCHOR_TOPRIGHT') + GameTooltip:AddLine('Submit all yopur mission at once. No question asked.') + GameTooltip:AddLine('You can also send mission one by one clicking on each button.') + GameTooltip:Show() + end) GMC.runButton:SetScript('OnLeave', function() GameTooltip:Hide() end) GMC.runButton:SetWidth(148) GMC.runButton:SetPoint('TOPRIGHT',-15,25) @@ -4200,6 +3869,7 @@ function addon:GMCBuildPanel() end function addon:GMCRewardRefresh() local single=GMC.settings.useOneChance + local ref for i=1,#GMC.ignoreFrames do local frame=GMC.ignoreFrames[i] local allowed=GMC.settings.allowedRewards[frame.key] @@ -4214,11 +3884,14 @@ function addon:GMCRewardRefresh() frame.slider:Hide() frame:SetPoint(a1,o,a2,100,y) end + ref=frame end if (single) then + GMC.itf2:SetPoint('TOPLEFT',ref,'BOTTOMLEFT', -110, -15) GMC.cp:SetDesaturated(false) GMC.ct:SetTextColor(C.Green()) else + GMC.itf2:SetPoint('TOPLEFT',ref,'BOTTOMLEFT', 10, -15) GMC.cp:SetDesaturated(true) GMC.ct:SetTextColor(C.Silver()) end @@ -4394,7 +4067,7 @@ function addon:GMCBuildRewards() end self:GMCRewardRefresh() GMC.aif:SetSize(256, (scale*h+gap) * #t) - GMC.itf2:SetPoint('TOPLEFT',ref,'BOTTOMLEFT', 0, -15) + GMC.itf2:SetPoint('TOPLEFT',ref,'BOTTOMLEFT', 5, -15) return GMC.aif end @@ -4547,33 +4220,158 @@ function addon:GMCBuildMissionList() return ml.widget end ---@debug@ +--@do-not-package@ +_G.GAC=addon --- Enable a trace for every function call. It's a VERY heavy debug -- -local memorysinks=setmetatable({},{__index=function(t,k) return 0 end}) +local memorysinks={} +local lib=LibStub("LibInit") for k,v in pairs(addon) do - if (type(v))=="function" then + if (type(v))=="function" and not lib[k] then local wrapped do local original=addon[k] wrapped=function(...) - if not trc then - return original(addon,...) - else - local membefore=floor(UpdateAddOnMemoryUsage("GarrisonCommander")) - local a1,a2,a3,a4,a5,a6,a7,a8,a9=original(addon,...) - local memafter=floor(UpdateAddOnMemoryUsage("GarrisonCommander")) - return a1,a2,a3,a4,a5,a6,a7,a8,a9 + if trc then + UpdateAddOnMemoryUsage() + end + local membefore=floor(GetAddOnMemoryUsage("GarrisonCommander")) + local s=GetTime() + local a1,a2,a3,a4,a5,a6,a7,a8,a9=original(...) + local e=GetTime() + local memafter=floor(GetAddOnMemoryUsage("GarrisonCommander")) + memorysinks[k].mem=memorysinks[k].mem+memafter-membefore + memorysinks[k].calls=memorysinks[k].calls+1 + memorysinks[k].elapsed=memorysinks[k].elapsed+e-s + if (memafter-membefore > 100) then + pp(C(k,'Red'),'used ',memafter-membefore) end + return a1,a2,a3,a4,a5,a6,a7,a8,a9 end end addon[k]=wrapped + memorysinks[k]={mem=0,elapsed=0,calls=0} end end +function addon:ResetSinks() + for k,v in pairs(memorysinks) do + memorysinks[k].mem=0 + memorysinks[k].calls=0 + memorysinks[k].elapsed=0 + end +end +local sorted={} function addon:DumpSinks() - local scroll=self:GetScroller("Sinks") - self:cutePrint(scroll,memorysinks) + local scroll=self:GetScroller("Sinks",400,1000) + wipe(sorted) + for k,v in pairs(memorysinks) do + if v.mem > 0 then + tinsert(sorted,format("Mem %06d %-80s (calls: %3d) Mem per call:%3.2f Elapsed %3.3f (per call %3.3f)",v.mem,k,v.calls,v.mem/v.calls,v.elapsed,v.elapsed/v.calls)) + end + end + table.sort(sorted,function(a,b) return a>b end) + self:cutePrint(scroll,sorted) +end +function addon:GetScroller(title,type,h,w) + h=h or 800 + w=w or 400 + type=type or "Frame" + local scrollerWindow=AceGUI:Create("Frame") + scrollerWindow:SetTitle(title) + scrollerWindow:SetLayout("Fill") + --local scrollcontainer = AceGUI:Create("SimpleGroup") -- "InlineGroup" is also good + --scrollcontainer:SetFullWidth(true) + --scrollcontainer:SetFullHeight(true) -- probably? + --scrollcontainer:SetLayout("Fill") -- important! + --scrollerWindow:AddChild(scrollcontainer) + local scroll = AceGUI:Create("ScrollFrame") + scroll:SetLayout("Flow") -- probably? + scroll:SetFullWidth(true) + scroll:SetFullHeight(true) + scrollerWindow:AddChild(scroll) + scrollerWindow:SetCallback("OnClose","Release") + scrollerWindow:SetHeight(h) + scrollerWindow:SetWidth(w) + scrollerWindow:SetPoint("CENTER") + scrollerWindow:Show() + return scroll +end +function addon:AddRow(obj,text,...) + local l=AceGUI:Create("Label") + l:SetText(text) + l:SetColor(...) + l:SetFullWidth(true) + obj:AddChild(l) +end +function addon:cutePrint(scroll,level,k,v) + if (type(level)=="table") then + for k,v in pairs(level) do + self:cutePrint(scroll,"",k,v) + end + return + end + if (type(v)=="table") then + self:AddRow(scroll,level..C(k,"Azure")..":" ..C("Table","Orange")) + for kk,vv in pairs(v) do + self:cutePrint(scroll,level .. " ",kk,vv) + end + else + if (type(v)=="string" and v:sub(1,2)=='0x') then + v=v.. " " ..tostring(self:GetFollowerData(v,'name')) + end + self:AddRow(scroll,level..C(k,"White")..":" ..C(v,"Yellow")) + end +end +function addon:DumpFollower(name) + local follower=self:GetFollowerData(name) + if (follower) then + local scroll=self:GetScroller(follower.name) + self:cutePrint(scroll,follower) + end + +end +function addon:DumpFollowerMissions(missionID) + local scroll=self:GetScroller("FollowerMissions " .. self:GetMissionData(missionID,'name')) + self:cutePrint(scroll,followerMissions.missions[missionID]) +end +function addon:DumpIgnored() + local scroll=self:GetScroller("Ignored") + self:cutePrint(scroll,self.privatedb.profile.ignored) +end +function addon:DumpMission(missionID) + local scroll=self:GetScroller("MissionCache " .. self:GetMissionData(missionID,'name')) + self:cutePrint(scroll,cache.missions[missionID]) +end +function addon:DumpMissions() + local scroll=self:GetScroller("MissionCache") + for id,data in pairs(cache.missions) do + self:cutePrint(scroll,id .. '.'..data.name) + end +end +--- +-- Debug function +--@param missionID Identificativo missione +function addon:DumpCounters(missionID) + local scroll=self:GetScroller("Counters " .. self:GetMissionData(missionID,'name')) + self:cutePrint(scroll,counters[missionID]) + self:cutePrint(scroll,"Lista per follower","","") + self:cutePrint(scroll,counterFollowerIndex[missionID]) + self:cutePrint(scroll,"Lista per threat","","") + self:cutePrint(scroll,counterThreatIndex[missionID]) +end +function addon:Dump(title,data) + local scroll=self:GetScroller(title) + self:cutePrint(scroll,data) + +end +function addon:DumpCounterers(missionID) + local scroll=self:GetScroller("Counterers " .. self:GetMissionData(missionID,'name')) + self:cutePrint(scroll,cache.missions[missionID].counterers) +end +function addon:DumpParty(missionID) + local scroll=self:GetScroller("Party " .. self:GetMissionData(missionID,'name')) + self:cutePrint(scroll,parties[missionID]) end _G.GCF=GCF ---@end-debug@ \ No newline at end of file +--@end-do-not-package@ diff --git a/doc.txt b/doc.txt index 02b7e22..fb27416 100644 --- a/doc.txt +++ b/doc.txt @@ -39,4 +39,216 @@ Dump: value=C_Garrison.GetMissionRewardInfo(91) itemID=112848, quantity=1 } -} \ No newline at end of file +} + +--[[ + +GMFMissions.CompleteDialog.BorderFrame.CompleteAll +Garrison page structure +Tab selection: +Managed by +GarrisonMissionFrameTab(1|2) onclick: +->GarrisonMissionFrameTab_OnClick(self) +--->GarrisonMissionFrame_SelectTab(self:GetID()) - 1 for Missions, 2 for followers + +Main Container is GarrisonMissionFrame +Followers tab selected: +->GarrisonMissionFrameFollowers -> anchored GarrisonMissionFrame TOPLEFT 33,-64 +-->GarrisonMissionFrameFollowersListScrollFrame +--->GarrisonMissionFrameFollowersListScrooFrameScrollChild +---->GarrisonMissionFrameFollowersListScrooFrameButton(1..9) +->GarrisonMissionFrame.FollowerTab -> abcuored GarrisonMissionFrame TOPRIGHT -35 -64 +Missions tab selected +->GarrisonMissionFrameMissions -> anchored (parent)e TOPLEFT 35,-65 + + + + +GarrisonMissionFrameMissionsListScrollFrameButtonx.info: +Dump: value=GarrisonMissionFrameMissionsListScrollFrameButton1.info +[1]={ + description="In a remote corner of Talador, a small faction of draenei has embraced the worship of Sargeras. Stop their cult before it spreads.", + cost=10, + duration="4 hr", + durationSeconds=14400, + level=100, + type="Combat", + locPrefix="GarrMissionLocation-Talador", + rewards={ + [290]={ + title="Money Reward", + quantity=600000, + icon="Interface\\Icons\\inv_misc_coin_01", + currencyID=0 + } + }, + numRewards=1, + numFollowers=2, + state=-2, + iLevel=0, + name="Cult of Sargeras", + followers={ + }, + location="Talador", + isRare=false, + typeAtlas="GarrMission_MissionIcon-Combat", + missionID=126 +} +Dump: value=G.GetFollowerInfo("0x000000000002F5E1") +[1]={ + displayHeight=0.5, + iLevel=600, + scale=0.60000002384186, + classAtlas="GarrMission_ClassIcon-Druid", + garrFollowerID="0x0000000000000022", + displayScale=1, + status="On Mission", + level=100, + quality=4, + portraitIconID=1066112, + isFavorite=false, + xp=0, + className="Guardian Druid", + classSpec=8, + name="Qiana Moonshadow", + followerID="0x000000000002F5E1", + height=1.3999999761581, + displayID=55047, + levelXP=0, + isCollected=true +} +value=GarrisonMissionFrame.MissionTab.MissionList.availableMissions[13] +[1]={ + description="Scouts report a many-headed beast named Festerbloom waylaying travelers crossing the Murkbog. Clear the path for everyone's sake.", + cost=20, + duration="10 hr", + durationSeconds=36000, + level=96, + type="Combat", + locPrefix="GarrMissionLocation-SpiresofArak", + rewards={ + [778]={ + title="Bonus Follower XP", + followerXP=1400, + tooltip="+1,400 XP", + icon="Interface\\Icons\\XPBonus_Icon", + name="+1,400 XP" + } + }, + numRewards=1, + numFollowers=3, + state=-2, + iLevel=0, + name="Murkbog Terror", + followers={ + }, + location="Spires of Arak", + isRare=false, + typeAtlas="GarrMission_MissionIcon-Combat", + missionID=374 +} +Dump: value=GarrisonMissionFrame.MissionTab.MissionList.inProgressMissions +[1]={ + description="The voidlords and voidcallers plaguing Shadowmoon Valley are being summoned by someone. Find and kill whoever is responsible.", + cost=15, + duration="6 hr", + durationSeconds=21600, + level=100, + timeLeft="1 hr 12 min", + type="Combat", + inProgress=true, + locPrefix="GarrMissionLocation-ShadowmoonValley", + rewards={ + [251]={ + title="Bonus Follower XP", + followerXP=8000, + tooltip="+8,000 XP", + icon="Interface\\Icons\\XPBonus_Icon", + name="+8,000 XP" + } + }, + numRewards=1, + numFollowers=3, + state=-1, + iLevel=0, + name="Twisting the Nether", + followers={ + [1]="0x000000000002F5E1", + [2]="0x0000000000079D62", + [3]="0x00000000001307EF" + }, + location="Shadowmoon Valley", + isRare=false, + typeAtlas="GarrMission_MissionIcon-Combat", + missionID=114 +} +Dump: value=G.GetMissionInfo(119) +local location, xp, environment, environmentDesc, environmentTexture, locPrefix, isExhausting, enemies = C_Garrison.GetMissionInfo(missionID); +[1]="Nagrand", +[2]=1500, +[3]="Orc", +[4]="Lok'tar ogar!", +[5]="Interface\\ICONS\\Achievement_Boss_General_Nazgrim.blp", +[6]="GarrMissionLocation-Nagrand", +[7]=false, +[8]={ + [1]={ + portraitFileDataID=1067358, + displayID=56189, + name="Warsong Earthcaller", + mechanics={ + [4]={ + description="A dangerous harmful effect that should be dispelled.", + name="Magic Debuff", + icon="Interface\\ICONS\\Spell_Shadow_ShadowWordPain.blp" + }, + [8]={ + description="A dangerous spell that should be interrupted.", + name="Powerful Spell", + icon="Interface\\ICONS\\Spell_Shadow_ShadowBolt.blp" + } + } + } +} +local totalTimeString, totalTimeSeconds, isMissionTimeImproved, successChance, partyBuffs, isEnvMechanicCountered, xpBonus, materialMultiplier = C_Garrison.GetPartyMissionInfo(MISSION_PAGE_FRAME.missionInfo.missionID); +Dump: value=C_Garrison.GetPartyMissionInfo(118) +[1]="8 hr", +[2]=28800, +[3]=false, +[4]=0, +[5]={ +}, +[6]=false, +[7]=0, +[8]=1 +Dump: value=table returned by GetFollowerInfo for a collected follower +[1]={ + displayHeight=0.5, + iLevel=600, + isCollected=true, + classAtlas="GarrMission_ClassIcon-Druid", + garrFollowerID="0x0000000000000022", + displayScale=1, + level=100, + quality=4, + portraitIconID=1066112, + isFavorite=false, + xp=0, + className="Guardian Druid", + classSpec=8, + name="Qiana Moonshadow", + followerID="0x000000000002F5E1", + height=1.3999999761581, + displayID=55047, + scale=0.60000002384186, + levelXP=0 +} + local location, xp, environment, environmentDesc, environmentTexture, locPrefix, isExhausting, enemies = G.GetMissionInfo(missionID) +--]] +-- In case we need to change rown number in GMF + if (not self:IsFollowerList()) then + HybridScrollFrame_CreateButtons(frame.MissionTab.MissionList.listScroll, "GarrisonMissionListButtonTemplate", 13, -8, nil, nil, nil, -4); + GarrisonMissionList_Update(); + else + HybridScrollFrame_CreateButtons(frame.FollowerList.listScroll, "GarrisonMissionFollowerButtonTemplate", 7, -7, nil, nil, nil, -6); + end diff --git a/wowhead.lua b/wowhead.lua index 79582ea..a8aa0ad 100644 --- a/wowhead.lua +++ b/wowhead.lua @@ -1,407 +1,408 @@ --- DataMined from WowHead on 06/01/2015 +-- DataMined from WowHead on 11/01/2015 -- Contains 304 missions --[[ Array ( - [id] => 2 - [level] => 90 - [itemlevel] => 0 - [traveltime] => 0 - [missiontime] => 1800 - [cooldown] => 9999999 - [cost] => 0 - [followers] => 1 - [experience] => 100 - [basebonuschance] => 65 - [name] => Gronnlings Abound - [description] => Gronnlings are a menace to the region. We should partner with the Frostwolf clan to thin the population. One may even join our cause... - [location] => Frostwall Approach - [mechanictype] => 23 - [missiontype] => 3 - [flags] => 0 - [rewards] => Array - ( - [experience] => Array - ( - ) + [id] => 2 + [level] => 90 + [itemlevel] => 0 + [traveltime] => 0 + [missiontime] => 1800 + [cooldown] => 9999999 + [cost] => 0 + [followers] => 1 + [experience] => 100 + [basebonuschance] => 65 + [name] => Gronnlings Abound + [description] => Gronnlings are a menace to the region. We should partner with the Frostwolf clan to thin the population. One may even join our cause... + [location] => Frostwall Approach + [mechanictype] => 23 + [missiontype] => 3 + [flags] => 0 + [rewards] => Array + ( + [experience] => Array + ( + ) - [prestige] => Array - ( - ) + [prestige] => Array + ( + ) - [item] => Array - ( - [0] => Array - ( - [item] => 112737 - [amount] => 1 - ) + [item] => Array + ( + [0] => Array + ( + [item] => 112737 + [amount] => 1 + ) - ) + ) - [currency] => Array - ( - ) + [currency] => Array + ( + ) - [chest] => Array - ( - ) + [chest] => Array + ( + ) - ) + ) - [encounters] => Array - ( - [1] => Array - ( - [setkey] => 2 - [id] => 1 - [npc] => 80693 - [name] => Frostfire Gronnling - [portraitfile] => 1067373 - [portraitfilename] => enemyportrait_56633 - [mechanics] => Array - ( - [10] => Array - ( - [setkey] => 2 - [id] => 10 - [amount] => 300 - [type] => 1 - [category] => 2 - [name] => Wild Aggression - [description] => An unpredictable enemy whose aggression should be controlled. - [icon] => spell_nature_reincarnation - ) + [encounters] => Array + ( + [1] => Array + ( + [setkey] => 2 + [id] => 1 + [npc] => 80693 + [name] => Frostfire Gronnling + [portraitfile] => 1067373 + [portraitfilename] => enemyportrait_56633 + [mechanics] => Array + ( + [10] => Array + ( + [setkey] => 2 + [id] => 10 + [amount] => 300 + [type] => 1 + [category] => 2 + [name] => Wild Aggression + [description] => An unpredictable enemy whose aggression should be controlled. + [icon] => spell_nature_reincarnation + ) - ) + ) - ) + ) - ) + ) - [mechanics] => Array - ( - [0] => Array - ( - [setkey] => 2 - [id] => 0 - [amount] => 0 - [type] => 23 - [category] => 0 - [name] => Snow - [description] => An arctic region. - [icon] => achievement_zone_stormpeaks_02 - ) + [mechanics] => Array + ( + [0] => Array + ( + [setkey] => 2 + [id] => 0 + [amount] => 0 + [type] => 23 + [category] => 0 + [name] => Snow + [description] => An arctic region. + [icon] => achievement_zone_stormpeaks_02 + ) - ) + ) ) --]] local me,ns=... -ns.wowhead={ -[2]={cd=9999999,cs=0}, -[3]={cd=9999999,cs=5}, -[6]={cd=9999999,cs=10}, -[7]={cd=9999999,cs=10}, -[43]={cd=9999999,cs=0}, -[44]={cd=9999999,cs=0}, -[55]={cd=9999999,cs=0}, -[65]={cd=9999999,cs=5}, -[66]={cd=9999999,cs=0}, -[67]={cd=0,cs=10}, -[73]={cd=86400,cs=0}, -[86]={cd=9999999,cs=5}, -[87]={cd=9999999,cs=5}, -[88]={cd=9999999,cs=0}, -[89]={cd=0,cs=10}, -[90]={cd=9999999,cs=10}, -[91]={cd=9999999,cs=10}, -[107]={cd=129600,cs=15}, -[108]={cd=129600,cs=15}, -[109]={cd=129600,cs=15}, -[110]={cd=129600,cs=15}, -[111]={cd=129600,cs=15}, -[112]={cd=129600,cs=15}, -[113]={cd=129600,cs=15}, -[114]={cd=129600,cs=15}, -[115]={cd=129600,cs=10}, -[116]={cd=129600,cs=20}, -[117]={cd=129600,cs=10}, -[118]={cd=129600,cs=15}, -[119]={cd=129600,cs=15}, -[120]={cd=129600,cs=10}, -[125]={cd=129600,cs=20}, -[126]={cd=129600,cs=10}, -[127]={cd=129600,cs=15}, -[128]={cd=129600,cs=10}, -[129]={cd=129600,cs=10}, -[130]={cd=129600,cs=15}, -[131]={cd=129600,cs=15}, -[132]={cd=129600,cs=0}, -[133]={cd=129600,cs=0}, -[135]={cd=86400,cs=10}, -[136]={cd=86400,cs=10}, -[137]={cd=86400,cs=10}, -[138]={cd=86400,cs=10}, -[139]={cd=86400,cs=10}, -[140]={cd=86400,cs=10}, -[141]={cd=86400,cs=10}, -[142]={cd=86400,cs=10}, -[143]={cd=86400,cs=10}, -[144]={cd=86400,cs=10}, -[145]={cd=86400,cs=10}, -[146]={cd=86400,cs=10}, -[147]={cd=86400,cs=10}, -[148]={cd=86400,cs=10}, -[149]={cd=86400,cs=10}, -[150]={cd=86400,cs=10}, -[151]={cd=86400,cs=10}, -[152]={cd=86400,cs=10}, -[153]={cd=86400,cs=10}, -[154]={cd=86400,cs=10}, -[155]={cd=86400,cs=10}, -[156]={cd=86400,cs=10}, -[157]={cd=86400,cs=10}, -[158]={cd=86400,cs=10}, -[159]={cd=86400,cs=10}, -[160]={cd=86400,cs=10}, -[161]={cd=86400,cs=10}, -[162]={cd=86400,cs=10}, -[163]={cd=86400,cs=10}, -[164]={cd=86400,cs=10}, -[165]={cd=86400,cs=10}, -[166]={cd=86400,cs=10}, -[167]={cd=86400,cs=10}, -[168]={cd=86400,cs=10}, -[169]={cd=86400,cs=10}, -[170]={cd=86400,cs=10}, -[171]={cd=86400,cs=10}, -[172]={cd=86400,cs=10}, -[173]={cd=86400,cs=10}, -[174]={cd=86400,cs=10}, -[175]={cd=86400,cs=10}, -[176]={cd=86400,cs=10}, -[177]={cd=86400,cs=10}, -[178]={cd=86400,cs=10}, -[179]={cd=86400,cs=10}, -[180]={cd=86400,cs=10}, -[181]={cd=86400,cs=10}, -[182]={cd=86400,cs=10}, -[183]={cd=86400,cs=0}, -[184]={cd=86400,cs=0}, -[185]={cd=86400,cs=0}, -[186]={cd=86400,cs=0}, -[187]={cd=86400,cs=0}, -[188]={cd=86400,cs=0}, -[189]={cd=86400,cs=0}, -[190]={cd=86400,cs=0}, -[191]={cd=86400,cs=0}, -[192]={cd=86400,cs=0}, -[193]={cd=86400,cs=0}, -[194]={cd=86400,cs=0}, -[195]={cd=86400,cs=20}, -[196]={cd=86400,cs=20}, -[197]={cd=86400,cs=20}, -[198]={cd=86400,cs=20}, -[199]={cd=86400,cs=20}, -[200]={cd=86400,cs=20}, -[201]={cd=86400,cs=20}, -[202]={cd=86400,cs=20}, -[203]={cd=86400,cs=20}, -[204]={cd=86400,cs=20}, -[205]={cd=86400,cs=15}, -[206]={cd=86400,cs=15}, -[207]={cd=86400,cs=15}, -[208]={cd=86400,cs=15}, -[209]={cd=86400,cs=15}, -[210]={cd=86400,cs=15}, -[211]={cd=86400,cs=15}, -[212]={cd=86400,cs=15}, -[213]={cd=86400,cs=15}, -[214]={cd=86400,cs=15}, -[215]={cd=86400,cs=10}, -[217]={cd=86400,cs=10}, -[218]={cd=86400,cs=10}, -[219]={cd=86400,cs=10}, -[220]={cd=86400,cs=10}, -[221]={cd=9999999,cs=10}, -[222]={cd=9999999,cs=10}, -[223]={cd=86400,cs=10}, -[224]={cd=86400,cs=10}, -[228]={cd=9999999,cs=10}, -[229]={cd=9999999,cs=10}, -[230]={cd=86400,cs=10}, -[231]={cd=86400,cs=10}, -[232]={cd=86400,cs=10}, -[242]={cd=86400,cs=10}, -[243]={cd=86400,cs=10}, -[244]={cd=86400,cs=10}, -[245]={cd=86400,cs=10}, -[247]={cd=129600,cs=20}, -[248]={cd=129600,cs=20}, -[249]={cd=129600,cs=20}, -[250]={cd=129600,cs=20}, -[251]={cd=129600,cs=20}, -[252]={cd=129600,cs=20}, -[253]={cd=129600,cs=20}, -[254]={cd=129600,cs=20}, -[255]={cd=129600,cs=15}, -[256]={cd=129600,cs=25}, -[257]={cd=129600,cs=15}, -[258]={cd=129600,cs=20}, -[259]={cd=129600,cs=15}, -[260]={cd=129600,cs=15}, -[261]={cd=129600,cs=15}, -[262]={cd=129600,cs=15}, -[263]={cd=129600,cs=15}, -[264]={cd=129600,cs=15}, -[265]={cd=129600,cs=15}, -[266]={cd=129600,cs=15}, -[267]={cd=129600,cs=15}, -[268]={cd=129600,cs=0}, -[269]={cd=129600,cs=0}, -[271]={cd=86400,cs=15}, -[272]={cd=86400,cs=10}, -[273]={cd=86400,cs=20}, -[274]={cd=86400,cs=10}, -[275]={cd=86400,cs=15}, -[276]={cd=86400,cs=25}, -[277]={cd=86400,cs=10}, -[278]={cd=86400,cs=10}, -[279]={cd=86400,cs=10}, -[280]={cd=86400,cs=10}, -[281]={cd=86400,cs=10}, -[282]={cd=86400,cs=10}, -[283]={cd=86400,cs=10}, -[284]={cd=86400,cs=15}, -[285]={cd=86400,cs=10}, -[286]={cd=86400,cs=20}, -[287]={cd=86400,cs=15}, -[288]={cd=86400,cs=25}, -[289]={cd=86400,cs=10}, -[290]={cd=129600,cs=30}, -[291]={cd=129600,cs=30}, -[292]={cd=129600,cs=30}, -[293]={cd=129600,cs=30}, -[294]={cd=129600,cs=30}, -[295]={cd=129600,cs=30}, -[296]={cd=129600,cs=30}, -[297]={cd=129600,cs=30}, -[298]={cd=129600,cs=20}, -[299]={cd=129600,cs=40}, -[300]={cd=129600,cs=20}, -[301]={cd=129600,cs=30}, -[302]={cd=129600,cs=30}, -[303]={cd=129600,cs=20}, -[304]={cd=129600,cs=40}, -[305]={cd=129600,cs=20}, -[306]={cd=129600,cs=30}, -[307]={cd=129600,cs=20}, -[308]={cd=129600,cs=20}, -[309]={cd=129600,cs=20}, -[310]={cd=129600,cs=20}, -[311]={cd=129600,cs=0}, -[312]={cd=129600,cs=0}, -[313]={cd=1209000,cs=100}, -[314]={cd=1209000,cs=100}, -[315]={cd=1209000,cs=100}, -[316]={cd=1209000,cs=100}, -[317]={cd=1209000,cs=100}, -[318]={cd=1209000,cs=100}, -[319]={cd=1209000,cs=100}, -[320]={cd=1209000,cs=100}, -[321]={cd=1209000,cs=100}, -[322]={cd=1209000,cs=100}, -[323]={cd=1209000,cs=100}, -[324]={cd=1209000,cs=100}, -[325]={cd=1209000,cs=100}, -[326]={cd=1209000,cs=100}, -[327]={cd=1209000,cs=100}, -[328]={cd=1209000,cs=100}, -[329]={cd=86400,cs=5}, -[330]={cd=86400,cs=10}, -[331]={cd=86400,cs=10}, -[332]={cd=86400,cs=10}, -[333]={cd=86400,cs=0}, -[334]={cd=252000,cs=25}, -[335]={cd=252000,cs=25}, -[336]={cd=252000,cs=25}, -[337]={cd=252000,cs=25}, -[338]={cd=86400,cs=10}, -[339]={cd=86400,cs=10}, -[340]={cd=86400,cs=10}, -[341]={cd=86400,cs=10}, -[342]={cd=86400,cs=10}, -[343]={cd=86400,cs=10}, -[344]={cd=86400,cs=10}, -[345]={cd=86400,cs=10}, -[346]={cd=86400,cs=10}, -[347]={cd=86400,cs=0}, -[348]={cd=86400,cs=10}, -[349]={cd=86400,cs=10}, -[350]={cd=86400,cs=10}, -[351]={cd=86400,cs=10}, -[352]={cd=86400,cs=0}, -[353]={cd=86400,cs=10}, -[354]={cd=86400,cs=10}, -[355]={cd=86400,cs=10}, -[356]={cd=86400,cs=10}, -[357]={cd=86400,cs=10}, -[358]={cd=252000,cs=25}, -[359]={cd=252000,cs=25}, -[360]={cd=252000,cs=25}, -[361]={cd=252000,cs=25}, -[362]={cd=86400,cs=0}, -[363]={cd=86400,cs=0}, -[364]={cd=86400,cs=10}, -[365]={cd=86400,cs=25}, -[366]={cd=57600,cs=20}, -[367]={cd=57600,cs=20}, -[368]={cd=57600,cs=20}, -[369]={cd=57600,cs=20}, -[370]={cd=57600,cs=20}, -[371]={cd=57600,cs=20}, -[372]={cd=57600,cs=20}, -[373]={cd=57600,cs=20}, -[374]={cd=57600,cs=20}, -[375]={cd=57600,cs=20}, -[376]={cd=57600,cs=20}, -[377]={cd=57600,cs=20}, -[378]={cd=86400,cs=10}, -[379]={cd=86400,cs=10}, -[380]={cd=129600,cs=15}, -[381]={cd=86400,cs=10}, -[382]={cd=86400,cs=10}, -[383]={cd=86400,cs=10}, -[384]={cd=86400,cs=10}, -[385]={cd=129600,cs=15}, -[386]={cd=86400,cs=10}, -[387]={cd=86400,cs=10}, -[388]={cd=86400,cs=10}, -[389]={cd=86400,cs=10}, -[390]={cd=86400,cs=10}, -[391]={cd=86400,cs=10}, -[392]={cd=86400,cs=10}, -[393]={cd=86400,cs=10}, -[394]={cd=86400,cs=10}, -[395]={cd=86400,cs=10}, -[396]={cd=86400,cs=10}, -[397]={cd=86400,cs=10}, -[398]={cd=86400,cs=10}, -[399]={cd=86400,cs=10}, -[400]={cd=86400,cs=10}, -[401]={cd=86400,cs=10}, -[402]={cd=86400,cs=10}, -[403]={cd=1209000,cs=50}, -[404]={cd=1209000,cs=50}, -[405]={cd=1209000,cs=50}, -[406]={cd=1209000,cs=50}, -[407]={cd=1209000,cs=50}, -[408]={cd=1209000,cs=75}, -[409]={cd=1209000,cs=75}, -[410]={cd=1209000,cs=75}, -[411]={cd=1209000,cs=75}, -[412]={cd=1209000,cs=75}, -[413]={cd=1209000,cs=75}, -[99999999]={} + ns.wowhead={ +[2]=9999999, +[3]=9999999, +[6]=9999999, +[7]=9999999, +[43]=9999999, +[44]=9999999, +[55]=9999999, +[65]=9999999, +[66]=9999999, +[67]=0, +[73]=86400, +[86]=9999999, +[87]=9999999, +[88]=9999999, +[89]=0, +[90]=9999999, +[91]=9999999, +[107]=129600, +[108]=129600, +[109]=129600, +[110]=129600, +[111]=129600, +[112]=129600, +[113]=129600, +[114]=129600, +[115]=129600, +[116]=129600, +[117]=129600, +[118]=129600, +[119]=129600, +[120]=129600, +[125]=129600, +[126]=129600, +[127]=129600, +[128]=129600, +[129]=129600, +[130]=129600, +[131]=129600, +[132]=129600, +[133]=129600, +[135]=86400, +[136]=86400, +[137]=86400, +[138]=86400, +[139]=86400, +[140]=86400, +[141]=86400, +[142]=86400, +[143]=86400, +[144]=86400, +[145]=86400, +[146]=86400, +[147]=86400, +[148]=86400, +[149]=86400, +[150]=86400, +[151]=86400, +[152]=86400, +[153]=86400, +[154]=86400, +[155]=86400, +[156]=86400, +[157]=86400, +[158]=86400, +[159]=86400, +[160]=86400, +[161]=86400, +[162]=86400, +[163]=86400, +[164]=86400, +[165]=86400, +[166]=86400, +[167]=86400, +[168]=86400, +[169]=86400, +[170]=86400, +[171]=86400, +[172]=86400, +[173]=86400, +[174]=86400, +[175]=86400, +[176]=86400, +[177]=86400, +[178]=86400, +[179]=86400, +[180]=86400, +[181]=86400, +[182]=86400, +[183]=86400, +[184]=86400, +[185]=86400, +[186]=86400, +[187]=86400, +[188]=86400, +[189]=86400, +[190]=86400, +[191]=86400, +[192]=86400, +[193]=86400, +[194]=86400, +[195]=86400, +[196]=86400, +[197]=86400, +[198]=86400, +[199]=86400, +[200]=86400, +[201]=86400, +[202]=86400, +[203]=86400, +[204]=86400, +[205]=86400, +[206]=86400, +[207]=86400, +[208]=86400, +[209]=86400, +[210]=86400, +[211]=86400, +[212]=86400, +[213]=86400, +[214]=86400, +[215]=86400, +[217]=86400, +[218]=86400, +[219]=86400, +[220]=86400, +[221]=9999999, +[222]=9999999, +[223]=86400, +[224]=86400, +[228]=9999999, +[229]=9999999, +[230]=86400, +[231]=86400, +[232]=86400, +[242]=86400, +[243]=86400, +[244]=86400, +[245]=86400, +[247]=129600, +[248]=129600, +[249]=129600, +[250]=129600, +[251]=129600, +[252]=129600, +[253]=129600, +[254]=129600, +[255]=129600, +[256]=129600, +[257]=129600, +[258]=129600, +[259]=129600, +[260]=129600, +[261]=129600, +[262]=129600, +[263]=129600, +[264]=129600, +[265]=129600, +[266]=129600, +[267]=129600, +[268]=129600, +[269]=129600, +[271]=86400, +[272]=86400, +[273]=86400, +[274]=86400, +[275]=86400, +[276]=86400, +[277]=86400, +[278]=86400, +[279]=86400, +[280]=86400, +[281]=86400, +[282]=86400, +[283]=86400, +[284]=86400, +[285]=86400, +[286]=86400, +[287]=86400, +[288]=86400, +[289]=86400, +[290]=129600, +[291]=129600, +[292]=129600, +[293]=129600, +[294]=129600, +[295]=129600, +[296]=129600, +[297]=129600, +[298]=129600, +[299]=129600, +[300]=129600, +[301]=129600, +[302]=129600, +[303]=129600, +[304]=129600, +[305]=129600, +[306]=129600, +[307]=129600, +[308]=129600, +[309]=129600, +[310]=129600, +[311]=129600, +[312]=129600, +[313]=1209000, +[314]=1209000, +[315]=1209000, +[316]=1209000, +[317]=1209000, +[318]=1209000, +[319]=1209000, +[320]=1209000, +[321]=1209000, +[322]=1209000, +[323]=1209000, +[324]=1209000, +[325]=1209000, +[326]=1209000, +[327]=1209000, +[328]=1209000, +[329]=86400, +[330]=86400, +[331]=86400, +[332]=86400, +[333]=86400, +[334]=252000, +[335]=252000, +[336]=252000, +[337]=252000, +[338]=86400, +[339]=86400, +[340]=86400, +[341]=86400, +[342]=86400, +[343]=86400, +[344]=86400, +[345]=86400, +[346]=86400, +[347]=86400, +[348]=86400, +[349]=86400, +[350]=86400, +[351]=86400, +[352]=86400, +[353]=86400, +[354]=86400, +[355]=86400, +[356]=86400, +[357]=86400, +[358]=252000, +[359]=252000, +[360]=252000, +[361]=252000, +[362]=86400, +[363]=86400, +[364]=86400, +[365]=86400, +[366]=57600, +[367]=57600, +[368]=57600, +[369]=57600, +[370]=57600, +[371]=57600, +[372]=57600, +[373]=57600, +[374]=57600, +[375]=57600, +[376]=57600, +[377]=57600, +[378]=86400, +[379]=86400, +[380]=129600, +[381]=86400, +[382]=86400, +[383]=86400, +[384]=86400, +[385]=129600, +[386]=86400, +[387]=86400, +[388]=86400, +[389]=86400, +[390]=86400, +[391]=86400, +[392]=86400, +[393]=86400, +[394]=86400, +[395]=86400, +[396]=86400, +[397]=86400, +[398]=86400, +[399]=86400, +[400]=86400, +[401]=86400, +[402]=86400, +[403]=1209000, +[404]=1209000, +[405]=1209000, +[406]=1209000, +[407]=1209000, +[408]=1209000, +[409]=1209000, +[410]=1209000, +[411]=1209000, +[412]=1209000, +[413]=1209000, +_lastupdate_=1421009516 } +setmetatable(ns.wowhead,{__index=function(t,k) return 0 end}) -- 1.7.9.5