--@do-not-package@
local _G=_G
--@debug@
LoadAddOn("Blizzard_DebugTools")
--@end-debug@
local me, ns = ...
if (me=="doc") then
local mt={
keys=setmetatable({},{__index=function(t,k) rawset(t,k,{}) return t[k] end }),
__metatable=true
}
function mt:__index(k)
if k=="n" then
return #mt.keys[self]
end
return rawget(self,k)
end
function mt:__len()
return #mt.keys[self]
end
function mt:__newindex(k,v)
local keys=mt.keys[self]
local pos=#keys+1
print("Inserting",k)
for i,x in ipairs(keys) do
if x>k then
pos=i
break;
end
end
table.insert(keys,pos,k)
print("Inserted",k,"at",pos)
rawset(self,k,v)
end
function a()
return function(unsorted,i)
i=i+1
local k=mt.keys[unsorted][i]
if k then return i,k end
end,self,0
end
function mt:__call()
do
local current=0
return function(unsorted,i)
current=current+1
local k=mt.keys[unsorted][current]
if k then return k,self[k] end
end,self,0
end
end
local my=setmetatable({},mt)
my.pippo=3
my.pluto=4
my.andrea=2
my.zanzi=1
print("Sorted")
for k,v in my() do print(k,v) end
print("Unsorted")
for k,v in pairs(my) do print(k,v) end
return
end
local pp=print
if ns.Configure then ns.Configure() end
local addon=ns.addon --#addon
local L=ns.L
local D=ns.D
local C=ns.C
local AceGUI=ns.AceGUI
local _G=_G
_G.GAC=addon
local m={}
function m:AddRow(text,...)
local l=AceGUI:Create("Label")
l:SetText(text)
l:SetColor(...)
l:SetFullWidth(true)
self:AddChild(l)
return l
end
--[[
function m:AddIconText(icon,text,qt)
local l=AceGUI:Create("InteractiveLabel")
l:SetFontObject(GameFontNormalSmall)
if (qt) then
l:SetText(format("%s x %s",text,qt))
else
l:SetText(text)
end
l:SetImage(icon)
l:SetImageSize(24,24)
l:SetFullWidth(true)
l.frame:EnableMouse(true)
l.frame:SetFrameLevel(999)
self:AddChild(l)
return l
end
function m:AddItem(itemID,qt)
local _,itemlink,itemquality,_,_,_,_,_,_,itemtexture=GetItemInfo(itemID)
if not itemlink then
return self:AddIconText(itemtexture,itemID)
else
return self:AddIconText(itemtexture,itemlink)
end
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.frame:SetAlpha(1)
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()
for k,v in pairs(m) do scroll[k]=v end
scroll.addRow=scroll.AddRow
return scroll
end
function addon:AddRow(obj,text,...)
--@debug@
assert(obj)
--@end-debug@
if (obj) then
local l=AceGUI:Create("Label")
l:SetText(text)
l:SetColor(...)
l:SetFullWidth(true)
obj:AddChild(l)
end
end
local function safesort(a,b)
if (tonumber(a) and tonumber(b)) then
return a < b
else
return tostring(a) < tostring(b)
end
end
function addon:cutePrint(scroll,level,k,v)
if (type(level)=="table") then
for k,v in kpairs(level,safesort) do
self:cutePrint(scroll,"",k,v)
end
return
end
if (type(v)=="table") then
if (level:len()>6) then return end
self:AddRow(scroll,level..C(k,"Azure")..":" ..C("Table","Orange") .. " " .. tostring(#v))
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:DumpStatus(title)
local scroll=self:GetScroller(title)
for i=1,#followersCache do
local followerID=followersCache[i].followerID
scroll:AddRow(format("%s (%s): %d",self:GetFollowerData(followerID,'fullname'),self:GetFollowerData(followerID,'followerID'),G.GetFollowerXP(followerID)))
end
scroll:AddRow("Garrison resources: " .. select(2,GetCurrencyInfo(GARRISON_CURRENCY)))
scroll:AddRow("Money: " .. GetMoneyString(GetMoney()))
end
function addon:DumpFollowers()
local scroll=self:GetScroller("Followers Cache (" .. #followersCache ..")" )
self:cutePrint(scroll,followersCache)
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,self:GetMissionData(missionID))
end
function addon:DumpMissions()
local scroll=self:GetScroller("MissionCache")
for id,data in pairs(self:GetMissionData(missionID)) 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)
if type(data)=="string" then
data=_G[data]
end
if type(data) ~= "table" then
print(data,"is not a table")
return
end
local scroll=self:GetScroller(title)
print("Dumping",title)
self:cutePrint(scroll,data)
return scroll
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:DumpAgeDb()
local t=ns.new()
for i,v in pairs(dbcache.seen) do
tinsert(t,format("%80s %s %d",self:GetMissionData(i,'name'),date("%d/%m/%y %H:%M:%S",v),ns.wowhead[i]))
end
local scroll=self:GetScroller("Expire db")
self:cutePrint(scroll,t)
ns.del(t)
end
do
local appo
appo=addon.OnInitialized
function addon:OnInitialized()
appo(self)
self:AddLabel("Developers options")
self:AddToggle("DBG",false, "Enable Debug")
self:AddToggle("TRC",false, "Enable Trace")
self:AddOpenCmd("show","showdata","Prints a mission score")
end
end
local function traitGen()
local TT=C_Garrison.GetRecruiterAbilityList(true)
local map={}
local keys={}
for i,v in pairs(C_Garrison.GetRecruiterAbilityCategories()) do
keys[v]=i
end
for _,trait in pairs(TT) do
local key=keys[trait.category]
if type(map[key])~="table" then
map[key]={}
end
map[key][trait.id]=trait.name
end
DevTools_Dump(map)
do
local f=ns.AceGUI:Create("Frame")
local editbox=ns.AceGUI:Create("EditBox")
f:AddChild(editbox)
editbox:SetFullHeight(true)
f:SetLayout("Fill")
f:DoLayout()
local accumulator=""
local context = {
depth = 0,
key = nil,
};
context.GetTableName = function() return nil end
context.GetFunctionName = context.GetTableName
context.GetUserdataName = context.GetTableName
context.Write=function(this,msg) accumulator=accumulator..msg end
DevTools_RunDump(map,context)
editbox:SetText(accumulator)
end
end
local trackedEvents={}
local function eventTrace ( self, event, ... )
if (event=="VARIABLES_LOADED") then
trackedEvents=ATEINFO.trackedEvents or {}
elseif (event:find("GARRISON",1,true)) then
local signature="("..event
for i=1,select('#',...) do
signature=','..signature.." ".. tostring(select(i,...))
end
signature=signature..")"
trackedEvents[event]=signature
end
end
function addon:showdata(fullargs,action,missionid,chance)
self:Print(fullargs,",",missionid,chance)
missionid=tonumber(missionid)
if missionid then
if action=="score" then
self:Print(self:GetMissionData(missionid,'name'),self:MissionScore(self:GetMissionData(missionid)))
elseif action=="mission" then
self:DumpMission(missionid)
elseif action=="match" then
self:TestMission(missionid)
elseif action=="mcmatch" then
self:GCTestMission(missionid,false,tonumber(chance) or 50)
end
else
if action=="traits" then
traitGen()
elseif action=="events" then
self:Dump("EventList",trackedEvents)
end
end
end
local f=CreateFrame("Frame")
f:SetScript("OnEvent",eventTrace)
f:RegisterAllEvents()
--]]
--- Enable a trace for every function call. It's a VERY heavy debug
--
ns.HD=false
if not ns.HD then return end
print("DISABLEEEEEEEE")
local memorysinks={}
local callstack={}
local lib=LibStub("LibInit")
for k,v in pairs(addon) do
if (type(v))=="function" and not lib[k] then
local wrapped
do
local original=addon[k]
wrapped=function(...)
tinsert(callstack,k)
local membefore=GetAddOnMemoryUsage("GarrisonCommander")
local a1,a2,a3,a4,a5,a6,a7,a8,a9=original(...)
local memafter=GetAddOnMemoryUsage("GarrisonCommander")
tremove(callstack)
memorysinks[k].mem=memorysinks[k].mem+memafter-membefore
memorysinks[k].calls=memorysinks[k].calls+1
if (#callstack) then
memorysinks[k].callers=strjoin("->",unpack(callstack))
else
memorysinks[k].callers="main"
end
if (memafter-membefore > 5) 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,calls=0,callers=""}
end
end
function addon:ResetSinks()
for k,v in pairs(memorysinks) do
memorysinks[k].mem=0
memorysinks[k].calls=0
end
end
local sorted={}
function addon:DumpSinks()
local scroll=self:GetScroller("Sinks",nil,400,1000)
wipe(sorted)
for k,v in pairs(memorysinks) do
if v.mem then
tinsert(sorted,format("Mem %06d (calls: %03d) Mem per call:%03.2f Callstack:%s(%s)",v.mem,v.calls,v.mem/v.calls,C(k,"Orange"),v.callers))
end
end
table.sort(sorted,function(a,b) return a>b end)
self:cutePrint(scroll,sorted)
end
_G.GAC=addon
--[[
PlaySound("UI_Garrison_CommandTable_Open");
PlaySound("UI_Garrison_CommandTable_Close");
PlaySound("UI_Garrison_Nav_Tabs");
PlaySound("UI_Garrison_Nav_Tabs");
PlaySound("UI_Garrison_CommandTable_SelectMission");
PlaySound("UI_Garrison_CommandTable_IncreaseSuccess");
PlaySound("UI_Garrison_CommandTable_100Success");
PlaySound("UI_Garrison_CommandTable_ReducedSuccessChance");
PlaySound("UI_Garrison_Mission_Threat_Countered");
PlaySoundKitID(43507); -- 100% chance reached
PlaySound("UI_Garrison_CommandTable_AssignFollower");
PlaySound("UI_Garrison_CommandTable_UnassignFollower");
PlaySound("UI_Garrison_Mission_Threat_Countered");
PlaySound("UI_Garrison_CommandTable_MissionStart");
PlaySound("UI_Garrison_CommandTable_ViewMissionReport");
PlaySound("UI_Garrison_Mission_Complete_Encounter_Chance");
PlaySound("UI_Garrison_CommandTable_Nav_Next");
PlaySound("UI_Garrison_CommandTable_ChestUnlock_Gold_Success");
PlaySound("UI_Garrison_Mission_Threat_Countered");
PlaySound("UI_Garrison_MissionEncounter_Animation_Generic");
PlaySoundKitID(currentAnim.castSoundID);
PlaySoundKitID(currentAnim.impactSoundID);
PlaySound("UI_Garrison_Mission_Complete_Encounter_Fail");
PlaySound("UI_Garrison_Mission_Complete_Mission_Success");
PlaySound("UI_Garrison_CommandTable_MissionSuccess_Stinger");
PlaySound("UI_Garrison_Mission_Complete_MissionFail_Stinger");
PlaySound("UI_Garrison_CommandTable_ChestUnlock");
PlaySound("UI_Garrison_CommandTable_Follower_LevelUp");
--]]
--@end-do-not-package@