Mercurial > wow > buffalo2
comparison ObjectiveTracker/Quests.lua @ 40:03ed70f846de
- move block accessors into a new file
- define a tMove function for reconciling the free/used tables as needed
- when retrieving an old block frame, confirm ID still matches; resolves multiple watch items on one block
- stop any animations when a block is freed; resolves stuck flare graphics
| author | Nenue |
|---|---|
| date | Sun, 24 Apr 2016 14:15:25 -0400 |
| parents | 92534dc793f2 |
| children |
comparison
equal
deleted
inserted
replaced
| 39:92534dc793f2 | 40:03ed70f846de |
|---|---|
| 11 local Default, Quest = T.DefaultHandler, T.Quest | 11 local Default, Quest = T.DefaultHandler, T.Quest |
| 12 local format, wipe, select = format, table.wipe, select | 12 local format, wipe, select = format, table.wipe, select |
| 13 local wipeall = B.wipeall | 13 local wipeall = B.wipeall |
| 14 local lprint, iprint, tprint = B.print('Line'), B.print('Info'), B.print('Tracker') | 14 local lprint, iprint, tprint = B.print('Line'), B.print('Info'), B.print('Tracker') |
| 15 local print = tprint | 15 local print = tprint |
| 16 | 16 local fprint = B.print('Frame') |
| 17 | 17 |
| 18 | 18 |
| 19 local superTrackQuestID, playerMoney, inScenario, showPOIs | 19 local superTrackQuestID, playerMoney, inScenario, showPOIs |
| 20 Quest.Update = function(self, reason, ...) | 20 Quest.Update = function(self, reason, ...) |
| 21 local print = self.print | 21 local print = self.print |
| 69 displayObjectives = false | 69 displayObjectives = false |
| 70 print('|cFF'..self.internalColor..' :: complete quest :: show instruction: "'.. tostring(info.completionText) .. '"') | 70 print('|cFF'..self.internalColor..' :: complete quest :: show instruction: "'.. tostring(info.completionText) .. '"') |
| 71 end | 71 end |
| 72 | 72 |
| 73 Default.UpdateObjectives(self, block, block_schema, displayObjectives) | 73 Default.UpdateObjectives(self, block, block_schema, displayObjectives) |
| 74 return block_schema | 74 return 0, block_schema |
| 75 end | 75 end |
| 76 | 76 |
| 77 Quest.UpdateLine = function(handler, block, data) | 77 Quest.UpdateLine = function(handler, block, data) |
| 78 local objectiveType = data.type | 78 local objectiveType = data.type |
| 79 return data.text, nil, objectiveType | 79 return data.text, nil, objectiveType |
| 84 local tremove, tinsert = tremove, tinsert | 84 local tremove, tinsert = tremove, tinsert |
| 85 local GetQuestLogIndexByID, IsQuestWatched = GetQuestLogIndexByID, IsQuestWatched | 85 local GetQuestLogIndexByID, IsQuestWatched = GetQuestLogIndexByID, IsQuestWatched |
| 86 Quest.QuestBlock = {} | 86 Quest.QuestBlock = {} |
| 87 Quest.LogBlock = {} | 87 Quest.LogBlock = {} |
| 88 Quest.LogInfo = {} | 88 Quest.LogInfo = {} |
| 89 function Quest:FreeBlock (block) | |
| 90 local used = Quest.usedBlocks | |
| 91 local free = Quest.freeBlocks | |
| 92 local reason = '' | |
| 93 local doRelease = false | |
| 94 local info = block.info | |
| 95 local questID = info.questID | |
| 96 local logIndex = info.logIndex | |
| 97 | |
| 98 if info.posIndex then | |
| 99 if used[info.posIndex] == block then | |
| 100 doRelease = true | |
| 101 reason = 'posIndex mismatch' | |
| 102 end | |
| 103 elseif logIndex then | |
| 104 if not IsQuestWatched(logIndex) then | |
| 105 reason = 'not being watched' | |
| 106 elseif not self.LogBlock[logIndex] then | |
| 107 doRelease = true | |
| 108 reason = 'missing logBlock entry' | |
| 109 elseif (self.LogBlock[logIndex] ~= block) then | |
| 110 doRelease = true | |
| 111 reason = 'different block using index' | |
| 112 end | |
| 113 elseif info.questID then | |
| 114 if not GetQuestLogIndexByID(info.questID) then | |
| 115 doRelease = true | |
| 116 reason = 'no identifiable quest log entry' | |
| 117 end | |
| 118 end | |
| 119 | |
| 120 | |
| 121 if doRelease then | |
| 122 print(' |cFF00FF00FreeBlock (' .. block:GetName() .. '):', reason) | |
| 123 block:Hide() | |
| 124 tremove(used, info.posIndex) | |
| 125 tinsert(free, block) | |
| 126 end | |
| 127 end | |
| 128 | 89 |
| 129 Quest.OnRemoved = function(block) | 90 Quest.OnRemoved = function(block) |
| 130 | 91 |
| 131 end | 92 end |
| 132 | 93 |
| 137 return block | 98 return block |
| 138 end | 99 end |
| 139 | 100 |
| 140 local watchesChecked = {} | 101 local watchesChecked = {} |
| 141 local infosChecked = {} | 102 local infosChecked = {} |
| 142 local blocksChecked = {} | |
| 143 local GetQuestWatchIndex = GetQuestWatchIndex | 103 local GetQuestWatchIndex = GetQuestWatchIndex |
| 144 --- Get a total of things to show, and straighten out the index while we're at it | 104 --- Get a total of things to show, and straighten out the index while we're at it |
| 145 --- Return the number shown, total in log, and the info table to parse | 105 --- Return the number shown, total in log, and the info table to parse |
| 106 local blocksChecked = {} | |
| 146 Quest.GetNumWatched = function (self, id, added) | 107 Quest.GetNumWatched = function (self, id, added) |
| 147 local print = self.print | 108 local print = self.print |
| 109 B.print('Block')('########') | |
| 110 B.print('Block')('########') | |
| 148 superTrackQuestID = GetSuperTrackedQuestID() | 111 superTrackQuestID = GetSuperTrackedQuestID() |
| 149 playerMoney = GetMoney(); | 112 playerMoney = GetMoney(); |
| 150 inScenario = C_Scenario.IsInScenario(); | 113 inScenario = C_Scenario.IsInScenario(); |
| 151 showPOIs = GetCVarBool("questPOI"); | 114 showPOIs = GetCVarBool("questPOI"); |
| 152 local numAll = GetNumQuestLogEntries() | 115 local numAll = GetNumQuestLogEntries() |
| 153 local numWatched = GetNumQuestWatches() | 116 local numWatched = GetNumQuestWatches() |
| 154 local bottomIndex = 1 | 117 local bottomIndex = 1 |
| 155 print('GetNumWatched', self.name, numWatched, 'of', numAll) | 118 print('GetNumWatched', self.name, numWatched, 'of', numAll) |
| 156 local start, limit = 1, numAll | 119 local start, limit = 1, numAll |
| 157 | 120 |
| 158 --- start a list of blocks affected by this function | |
| 159 wipe(blocksChecked) | |
| 160 if id and not added then | 121 if id and not added then |
| 122 -- if a particular id is supplied, add to checklist | |
| 161 if self.InfoBlock[id] then | 123 if self.InfoBlock[id] then |
| 162 tinsert(blocksChecked, self.InfoBlock[id]) | 124 blocksChecked[self.InfoBlock[id]] = self.InfoBlock[id] |
| 163 end | 125 end |
| 164 end | 126 end |
| 165 | 127 |
| 128 --- Start complicated frame-recycling bullshit | |
| 166 for logIndex = start, limit do | 129 for logIndex = start, limit do |
| 167 local reason1, reason2 = '', '' | 130 local reason1, reason2 = '', '' |
| 168 local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(logIndex) | 131 local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(logIndex) |
| 169 local watchIndex = GetQuestWatchIndex(logIndex) | 132 local watchIndex = GetQuestWatchIndex(logIndex) |
| 170 | 133 |
| 134 -- check if: the watch data pointers don't match | |
| 171 if watchIndex and watchIndex >= bottomIndex then | 135 if watchIndex and watchIndex >= bottomIndex then |
| 172 local watchInfo = self.WatchInfo[watchIndex] | 136 local watchInfo = self.WatchInfo[watchIndex] |
| 173 local watchBlock = self.WatchBlock[watchIndex] | 137 local watchBlock = self.WatchBlock[watchIndex] |
| 174 if watchInfo and watchInfo.questID ~= questID then | 138 if watchInfo and watchInfo.questID ~= questID then |
| 175 print('GetNumWatched', 'trimming WatchInfo ['..watchIndex..'] =/=', questID) | 139 print('GetNumWatched', 'trimming WatchInfo ['..watchIndex..'] =/=', questID) |
| 176 self.WatchInfo[watchIndex] = nil | 140 self.WatchInfo[watchIndex] = nil |
| 177 end | 141 end |
| 178 if watchBlock and watchBlock.info.questID ~= questID then | 142 if watchBlock and watchBlock.info.questID ~= questID then |
| 179 print('GetNumWatched', 'trimming WatchBlock ['..watchIndex..'] =/=', watchBlock:GetName()) | 143 print('GetNumWatched', 'trimming WatchBlock ['..watchIndex..'] =/=', watchBlock:GetName()) |
| 180 self.WatchBlock[watchIndex] = nil | 144 self.WatchBlock[watchIndex] = nil |
| 181 tinsert(blocksChecked, watchBlock) | 145 blocksChecked[watchBlock] = watchBlock |
| 182 end | 146 end |
| 183 end | 147 end |
| 184 | 148 |
| 149 -- check if: the logIndex pointer doesn't match | |
| 185 local logBlock = self.LogBlock[logIndex] | 150 local logBlock = self.LogBlock[logIndex] |
| 186 if logBlock and logBlock.info.questID ~= questID then | 151 if logBlock and logBlock.info.questID ~= questID then |
| 187 --print(' |cFFBBFF00GetNumWatched: trimming LogBlock ['..logIndex..'] =/=', logBlock:GetName()) | 152 print('GetQuests', 'replace info', logBlock.info.questID, '->', questID) |
| 188 self.LogBlock[logIndex] = nil | 153 self.LogBlock[logIndex] = nil |
| 189 tinsert(blocksChecked, logBlock) | 154 blocksChecked[logBlock] = logBlock |
| 190 end | 155 end |
| 191 | 156 |
| 157 -- add to watch index if: the questID is non-zero | |
| 192 if questID ~= 0 then | 158 if questID ~= 0 then |
| 193 self.Info[questID] = self:GetInfo(logIndex, watchIndex) | 159 self.Info[questID] = self:GetInfo(logIndex, watchIndex) |
| 194 --print(' |cFF44BBFFGetNumWatched:|r map', questID, 'to', logIndex, (watchIndex and ('('..watchIndex..')') or '')) | 160 print('GetQuests', format('request info |cFF00FF00%2d|r |cFFFFFF00%6d|r |cFFFF4400%3s|r', logIndex, questID, tostring(watchIndex or ''))) |
| 195 end | 161 end |
| 196 end | 162 end |
| 197 | 163 |
| 198 --- remove any orphaned blocks from view and, if possible, free it for re-use | 164 --- After GetInfo pass, look for any non-conformant blocks and deal with them |
| 199 for i, block in ipairs(blocksChecked) do | 165 for _, block in pairs(blocksChecked) do |
| 200 if not GetQuestLogIndexByID(block.info.questID, 'player') then | 166 local logIndex = GetQuestLogIndexByID(block.info.questID, 'player') |
| 201 print('GetNumWatched', 'iterating a block without an index |cFFBBFF00'.. block:GetName()..'|r') | 167 -- free if: logIndex doesn't resolve |
| 202 block:Hide() | 168 if not logIndex then |
| 203 self:FreeBlock(block) | 169 B.print('Block')('GetNumWatched', '|cFFBBFF00block has no index '.. block:GetName()..'|r') |
| 204 end | 170 self:ClearBlock(block) |
| 205 if not IsQuestWatched(block.info.logIndex) then | 171 -- hide if: logIndex isn't being watched |
| 206 print('GetNumWatched', 'hiding untracked quest |cFFBBFF00'.. block:GetName()..'|r') | 172 elseif not IsQuestWatched(block.info.logIndex) then |
| 207 block:Hide() | 173 B.print('Block')('GetNumWatched', '|cFFBBFF00fade from list '.. block:GetName()..'|r') |
| 208 end | 174 -- todo: figure out why animation gets clobbered |
| 175 self:ClearBlock(block) | |
| 176 end | |
| 177 blocksChecked[block] = nil | |
| 209 end | 178 end |
| 210 | 179 |
| 211 self.numWatched = numWatched | 180 self.numWatched = numWatched |
| 212 self.numAll = numAll | 181 self.numAll = numAll |
| 213 | 182 |
