Nenue@0
|
1 --- ${PACKAGE_NAME}
|
Nenue@0
|
2 -- @file-author@
|
Nenue@0
|
3 -- @project-revision@ @project-hash@
|
Nenue@0
|
4 -- @file-revision@ @file-hash@
|
Nenue@0
|
5 -- Created: 3/26/2016 1:51 AM
|
Nenue@0
|
6 local B = select(2,...).frame
|
Nenue@14
|
7 local pairs, setmetatable, type, tostring = pairs, setmetatable, type, tostring
|
Nenue@14
|
8 local format = string.format
|
Nenue@16
|
9 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
|
Nenue@0
|
10 local print = B.print('Objectives')
|
Nenue@16
|
11 local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame
|
Nenue@0
|
12
|
Nenue@0
|
13 --[[
|
Nenue@0
|
14 Full quest info is available if:
|
Nenue@0
|
15 - It's in the player quest log, or is available from the Gossip interface
|
Nenue@0
|
16 - It's being shared from another player and is acceptible
|
Nenue@0
|
17 - It's an auto-quest that is available in the current location
|
Nenue@0
|
18 Partial quest info is availabe if:
|
Nenue@0
|
19 - It's already completed (i.e. it appears in CompletedQuestInfo()).
|
Nenue@0
|
20 - It's an scheduled interval quest (daily, weekly, etc.)
|
Nenue@0
|
21 - It's contained in a quest link received from chat
|
Nenue@0
|
22 Under any other circumstances, only minimal info can be pulled:
|
Nenue@0
|
23 - Its availability to the player
|
Nenue@0
|
24 - Its relation with the currently engaged NPC
|
Nenue@0
|
25 - Its binary completion status
|
Nenue@0
|
26
|
Nenue@0
|
27 ]]
|
Nenue@16
|
28
|
Nenue@16
|
29
|
Nenue@16
|
30 --- Performance values
|
Nenue@16
|
31 --[[
|
Nenue@16
|
32 self:RegisterEvent("QUEST_LOG_UPDATE");
|
Nenue@16
|
33 self:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED");
|
Nenue@16
|
34 self:RegisterEvent("QUEST_WATCH_LIST_CHANGED");
|
Nenue@16
|
35 self:RegisterEvent("QUEST_AUTOCOMPLETE");
|
Nenue@16
|
36 self:RegisterEvent("QUEST_ACCEPTED");
|
Nenue@16
|
37 self:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED");
|
Nenue@16
|
38 self:RegisterEvent("SCENARIO_UPDATE");
|
Nenue@16
|
39 self:RegisterEvent("SCENARIO_CRITERIA_UPDATE");
|
Nenue@16
|
40 self:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE");
|
Nenue@16
|
41 self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
|
Nenue@16
|
42 self:RegisterEvent("ZONE_CHANGED");
|
Nenue@16
|
43 self:RegisterEvent("QUEST_POI_UPDATE");
|
Nenue@16
|
44 self:RegisterEvent("VARIABLES_LOADED");
|
Nenue@16
|
45 self:RegisterEvent("QUEST_TURNED_IN");
|
Nenue@16
|
46 self:RegisterEvent("PLAYER_MONEY");
|
Nenue@16
|
47 ]]
|
Nenue@16
|
48 mod.Reason ={
|
Nenue@16
|
49 UPDATE_MASK_AUTOQUEST = 0x00000001,
|
Nenue@16
|
50 UPDATE_MASK_QUEST = 0x00000002,
|
Nenue@16
|
51 UPDATE_MASK_BONUS = 0x00000004,
|
Nenue@16
|
52 UPDATE_MASK_CHEEVS = 0x00000008,
|
Nenue@16
|
53 UPDATE_MASK_ALL = 0x00000017,
|
Nenue@16
|
54
|
Nenue@16
|
55 QUEST_LOG_UPDATE = 0x00000003,
|
Nenue@16
|
56 TRACKED_ACHIEVEMENT_LIST_CHANGED = 0x00000008,
|
Nenue@16
|
57 QUEST_WATCH_LIST_CHANGED = 0x00000003,
|
Nenue@16
|
58 QUEST_AUTOCOMPLETE = 0x00000003,
|
Nenue@16
|
59 QUEST_ACCEPTED = 0x00000003,
|
Nenue@16
|
60 SUPER_TRACKED_QUEST_CHANGED = 0x00000002,
|
Nenue@16
|
61 SCENARIO_UPDATE = 0x00000004,
|
Nenue@16
|
62 SCENARIO_CRITERIA_UPDATE = 0x00000004,
|
Nenue@16
|
63 TRACKED_ACHIEVEMENT_UPDATE = 0x00000008,
|
Nenue@16
|
64 ZONE_CHANGED_NEW_AREA = 0x00000017,
|
Nenue@16
|
65 ZONE_CHANGED = 0x00000017,
|
Nenue@16
|
66 QUEST_POI_UPDATE = 0x00000003,
|
Nenue@16
|
67 QUEST_TURNED_IN = 0x00000003,
|
Nenue@16
|
68 }
|
Nenue@16
|
69 mod.MoneyReasons = 0
|
Nenue@0
|
70
|
Nenue@10
|
71 --- Baseline defaults
|
Nenue@16
|
72 mod.defaults = {}
|
Nenue@10
|
73
|
Nenue@0
|
74 --- list used to make things happen
|
Nenue@16
|
75 mod.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
|
Nenue@0
|
76
|
Nenue@0
|
77 --- ipairs() list of handlers for wrapper update
|
Nenue@16
|
78 mod.orderedHandlers = {}
|
Nenue@16
|
79 mod.orderedTrackers = {}
|
Nenue@16
|
80 mod.indexedTrackers = {}
|
Nenue@0
|
81 --- pairs() list of handler frames for tracker updates
|
Nenue@16
|
82 mod.namedTrackers = {}
|
Nenue@0
|
83
|
Nenue@0
|
84 --- Handler stubs
|
Nenue@16
|
85 mod.AutoQuest = {
|
Nenue@14
|
86 name = "AutoQuest",
|
Nenue@16
|
87 displayName = "Notice",
|
Nenue@0
|
88 }
|
Nenue@16
|
89 mod.Quest = {
|
Nenue@14
|
90 name = "Quest",
|
Nenue@14
|
91 displayName = "Quests",
|
Nenue@0
|
92 }
|
Nenue@16
|
93 mod.Cheevs = {
|
Nenue@14
|
94 name = "Cheevs",
|
Nenue@14
|
95 displayName = "Achievements",
|
Nenue@14
|
96 }
|
Nenue@16
|
97 mod.Bonus = {
|
Nenue@14
|
98 name = "Bonus",
|
Nenue@14
|
99 displayName = "Bonus Objectives",
|
Nenue@0
|
100 }
|
Nenue@0
|
101
|
Nenue@0
|
102 --- Handler template
|
Nenue@0
|
103 local CreateHandler = function (self, name, index)
|
Nenue@0
|
104 print(self, name)
|
Nenue@16
|
105
|
Nenue@16
|
106 local handler = setmetatable(mod[name] or {}, {
|
Nenue@0
|
107 __tostring = function() return name end,
|
Nenue@16
|
108 __call = function (self) mod.UpdateTracker(self) end
|
Nenue@0
|
109 })
|
Nenue@16
|
110 if type(mod.orderedHandlers[index]) == 'table' then
|
Nenue@16
|
111 return mod.orderedHandlers[index]
|
Nenue@0
|
112 end
|
Nenue@0
|
113
|
Nenue@0
|
114 print('take up locals first')
|
Nenue@0
|
115 local preset = {}
|
Nenue@16
|
116 for k,v in pairs(mod[name]) do
|
Nenue@0
|
117 preset[k] = true
|
Nenue@0
|
118 if type(v) == 'table' then
|
Nenue@0
|
119 handler[k] = {}
|
Nenue@0
|
120 else
|
Nenue@0
|
121 handler[k] = v
|
Nenue@0
|
122 end
|
Nenue@0
|
123 end
|
Nenue@0
|
124
|
Nenue@16
|
125
|
Nenue@0
|
126 print('resulting handler contents')
|
Nenue@0
|
127 for k, v in pairs(self) do
|
Nenue@0
|
128 if not handler[k] then
|
Nenue@0
|
129 if type(v) == 'table' then
|
Nenue@0
|
130 -- assume all tables to be local data; don't inherit or ref
|
Nenue@0
|
131 handler[k] = {}
|
Nenue@0
|
132 else
|
Nenue@16
|
133 handler[k] = mod.Tracker[k]
|
Nenue@0
|
134 end
|
Nenue@0
|
135 else
|
Nenue@0
|
136 print(name, 'has its own', k)
|
Nenue@0
|
137 end
|
Nenue@0
|
138 end
|
Nenue@0
|
139 print('|cFFFF4400'..tostring(name)..'|r:')
|
Nenue@0
|
140 for k, v in pairs(handler) do
|
Nenue@16
|
141 print(format("%24s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
|
Nenue@0
|
142 end
|
Nenue@16
|
143
|
Nenue@16
|
144 mod[name] = handler
|
Nenue@16
|
145
|
Nenue@16
|
146 mod.orderedHandlers[index] = handler
|
Nenue@0
|
147 return true
|
Nenue@0
|
148 end
|
Nenue@0
|
149
|
Nenue@16
|
150 mod.Tracker = setmetatable({}, {
|
Nenue@0
|
151 __call = CreateHandler,
|
Nenue@0
|
152 __tostring = function() return 'DEFAULT_TRACKING_HANDLER' end
|
Nenue@0
|
153 })
|
Nenue@16
|
154 local Tracker = mod.Tracker
|
Nenue@0
|
155 Tracker.numWatched = 0 --- number of entries being handled
|
Nenue@0
|
156 Tracker.numBlocks = 0 --- number of blocks created
|
Nenue@0
|
157 Tracker.actualBlocks = 0 --- number of blocks in use
|
Nenue@0
|
158
|
Nenue@0
|
159 Tracker.freeBlocks = {} --- block heap
|
Nenue@0
|
160 Tracker.usedBlocks = {}
|
Nenue@0
|
161
|
Nenue@0
|
162 Tracker.Watched = {} -- find by watchIndex
|
Nenue@0
|
163 Tracker.Info = {} -- find by data ID
|
Nenue@0
|
164 Tracker.BlockInfo = {} -- find by block ID
|
Nenue@16
|
165 Tracker.WatchInfo = {} -- find data by watch index
|
Nenue@16
|
166 Tracker.WatchBlock = {} -- find block by watch index
|
Nenue@0
|
167
|
Nenue@0
|
168
|
Nenue@0
|
169
|
Nenue@0
|
170 Tracker.GetBlock = function(handler, blockIndex)
|
Nenue@0
|
171 local block = handler.usedBlocks[blockIndex]
|
Nenue@0
|
172 if not handler.usedBlocks[blockIndex] then
|
Nenue@0
|
173 if #handler.freeBlocks >= 1 then
|
Nenue@0
|
174 block = handler.freeBlocks[#handler.freeBlocks]
|
Nenue@0
|
175 handler.freeBlocks[#handler.freeBlocks] = nil
|
Nenue@0
|
176 else
|
Nenue@16
|
177 block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, VeneerObjectiveScroll, 'VeneerTrackerBlock')
|
Nenue@16
|
178 block.SetStyle = mod.SetBlockStyle
|
Nenue@14
|
179 block.Select = handler.Select
|
Nenue@14
|
180 block.Open = handler.Open
|
Nenue@14
|
181 block.Remove = handler.Remove
|
Nenue@14
|
182 block.Link = handler.Link
|
Nenue@14
|
183 block:SetScript('OnMouseUp', handler.OnMouseUp)
|
Nenue@14
|
184 block:SetScript('OnMouseDown', handler.OnMouseDown)
|
Nenue@14
|
185 block:ClearAllPoints()
|
Nenue@0
|
186 end
|
Nenue@0
|
187
|
Nenue@0
|
188 handler.usedBlocks[blockIndex] = block
|
Nenue@0
|
189 end
|
Nenue@0
|
190 return handler.usedBlocks[blockIndex]
|
Nenue@0
|
191 end
|
Nenue@0
|
192
|
Nenue@16
|
193 function mod:OnInitialize()
|
Nenue@14
|
194 self.InitializeWrapper()
|
Nenue@3
|
195 self.InitializeXPTracker()
|
Nenue@16
|
196 mod.SetEvents()
|
Nenue@0
|
197 ObjectiveTrackerFrame:UnregisterAllEvents()
|
Nenue@0
|
198 ObjectiveTrackerFrame:Hide()
|
Nenue@0
|
199 end
|