annotate ObjectiveTracker/QuestData.lua @ 58:f253baf6022d

ObjectiveTracker: - Quest tracker now checks all of its allotted frames for data validity, - it also uses GetQuestLogTitle to verify non-zero log indexes
author Nenue
date Fri, 08 Jul 2016 18:01:49 -0400
parents aa693607b813
children
rev   line source
Nenue@28 1 local B = select(2,...).frame
Nenue@28 2 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
Nenue@28 3 local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
Nenue@30 4 local GetQuestWatchInfo, GetQuestLogCompletionText = GetQuestWatchInfo, GetQuestLogCompletionText
Nenue@30 5 local GetQuestLogLeaderBoard, GetNumQuestLogEntries, GetQuestLogTitle = GetQuestLogLeaderBoard, GetNumQuestLogEntries, GetQuestLogTitle
Nenue@30 6 local GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown = GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown
Nenue@30 7 local GetSuperTrackedQuestID, GetMoney, C_Scenario, GetCVarBool, GetNumQuestWatches = GetSuperTrackedQuestID, GetMoney, C_Scenario, GetCVarBool, GetNumQuestWatches
Nenue@30 8 local GetQuestTagInfo, GetMoneyString, GetDistanceSqToQuest, GetQuestFactionGroup = GetQuestTagInfo, GetMoneyString, GetDistanceSqToQuest, GetQuestFactionGroup
Nenue@30 9 local QUEST_TAG_ACCOUNT, LE_QUEST_FACTION_HORDE, LE_QUEST_FREQUENCY_DAILY, LE_QUEST_FREQUENCY_WEEKLY = QUEST_TAG_ACCOUNT, LE_QUEST_FACTION_HORDE, LE_QUEST_FREQUENCY_DAILY, LE_QUEST_FREQUENCY_WEEKLY
Nenue@30 10 local QUEST_TAG_TCOORDS, IsQuestSequenced = QUEST_TAG_TCOORDS, IsQuestSequenced
Nenue@28 11 local Default, Quest = T.DefaultHandler, T.Quest
Nenue@37 12 local format, wipe, select = format, table.wipe, select
Nenue@37 13 local wipeall = B.wipeall
Nenue@37 14 local lprint, iprint, tprint = B.print('Line'), B.print('Info'), B.print('Tracker')
Nenue@37 15 local print = tprint
Nenue@40 16 local fprint = B.print('Frame')
Nenue@38 17
Nenue@38 18
Nenue@30 19 local superTrackQuestID, playerMoney, inScenario, showPOIs
Nenue@28 20 Quest.Update = function(self, reason, ...)
Nenue@38 21 local print = self.print
Nenue@28 22 print('QuestTracker:Update() received')
Nenue@28 23 T.UpdateActionButtons()
Nenue@28 24 Default.Update(self, reason, ...)
Nenue@28 25 end
Nenue@28 26
Nenue@28 27 T.Quest.numButtons = 0
Nenue@28 28 local usedButtons = T.Quest.itemButtons
Nenue@28 29 local freeButtons = T.Quest.freeButtons
Nenue@28 30
Nenue@38 31 Quest.UpdateObjectives = function(self, block)
Nenue@28 32 local print = lprint
Nenue@38 33 print('|cFF'..self.internalColor..'UpdateObjectives()')
Nenue@28 34 local info = block.info
Nenue@28 35
Nenue@28 36 print((info.isAccount and 'isAccount' or ''), (info.isFaction and 'isFaction' or ''), (info.isDaily and 'isDaily' or ''), (info.isWeekly and 'isWeekly' or ''), info.tagID, info.tagName)
Nenue@28 37
Nenue@38 38 local displayObjectives = true
Nenue@34 39 local block_schema = 'default'
Nenue@28 40 if info.isAccount then
Nenue@28 41 if info.isFaction then
Nenue@28 42 print(' faction', info.tagID)
Nenue@34 43 block_schema = 'faction_'..info.tagID
Nenue@28 44 else
Nenue@28 45 print(' account', info.isAccount, info.isFaction)
Nenue@34 46 block_schema = 'account'
Nenue@28 47 end
Nenue@28 48 elseif info.isDaily then
Nenue@28 49 print(' daily', info.frequency)
Nenue@34 50 block_schema = 'daily'
Nenue@28 51 elseif info.isWeekly then
Nenue@28 52 print(' weekly', info.frequency)
Nenue@34 53 block_schema = 'weekly'
Nenue@28 54 end
Nenue@28 55 local completionText
Nenue@45 56
Nenue@45 57 if info.isAutoComplete and info.isComplete then
Nenue@45 58 displayObjectives = false
Nenue@45 59 info.numObjectives = 1
Nenue@45 60 self:AddLine(block, info.completionText, nil, 'complete')
Nenue@45 61 elseif info.isComplete then
Nenue@44 62 if T.Conf.ShowCompletionText then
Nenue@44 63 self:AddLine(block, info.completionText, nil, 'complete')
Nenue@45 64 displayObjectives = false
Nenue@28 65 end
Nenue@44 66 if not T.Conf.ShowObjectivesWhenComplete then
Nenue@44 67 displayObjectives = false
Nenue@44 68 end
Nenue@38 69 print('|cFF'..self.internalColor..' :: complete quest :: show instruction: "'.. tostring(info.completionText) .. '"')
Nenue@44 70 block_schema = 'complete'
Nenue@28 71 end
Nenue@28 72
Nenue@45 73
Nenue@38 74 Default.UpdateObjectives(self, block, block_schema, displayObjectives)
Nenue@40 75 return 0, block_schema
Nenue@28 76 end
Nenue@28 77
Nenue@38 78 Quest.UpdateLine = function(handler, block, data)
Nenue@28 79 local objectiveType = data.type
Nenue@31 80 return data.text, nil, objectiveType
Nenue@28 81 end
Nenue@28 82
Nenue@28 83 -----------------------------
Nenue@28 84 --- QUEST
Nenue@37 85 local tremove, tinsert = tremove, tinsert
Nenue@37 86 local GetQuestLogIndexByID, IsQuestWatched = GetQuestLogIndexByID, IsQuestWatched
Nenue@28 87 Quest.QuestBlock = {}
Nenue@28 88 Quest.LogBlock = {}
Nenue@28 89 Quest.LogInfo = {}
Nenue@37 90
Nenue@39 91 Quest.OnRemoved = function(block)
Nenue@37 92
Nenue@37 93 end
Nenue@39 94
Nenue@39 95 Quest.GetBlock = function(self, index)
Nenue@39 96 local block = Default.GetBlock(self, index)
Nenue@39 97 block:SetScript('OnEvent', Quest.OnRemoved)
Nenue@39 98 block:RegisterEvent('QUEST_REMOVED')
Nenue@39 99 return block
Nenue@39 100 end
Nenue@39 101
Nenue@37 102 local GetQuestWatchIndex = GetQuestWatchIndex
Nenue@43 103 local numAnimating = 0
Nenue@43 104
Nenue@37 105 --- Get a total of things to show, and straighten out the index while we're at it
Nenue@37 106 --- Return the number shown, total in log, and the info table to parse
Nenue@37 107 Quest.GetNumWatched = function (self, id, added)
Nenue@38 108 local print = self.print
Nenue@40 109 B.print('Block')('########')
Nenue@40 110 B.print('Block')('########')
Nenue@30 111 superTrackQuestID = GetSuperTrackedQuestID()
Nenue@30 112 playerMoney = GetMoney();
Nenue@30 113 inScenario = C_Scenario.IsInScenario();
Nenue@30 114 showPOIs = GetCVarBool("questPOI");
Nenue@37 115 local numAll = GetNumQuestLogEntries()
Nenue@37 116 local numWatched = GetNumQuestWatches()
Nenue@37 117 local bottomIndex = 1
Nenue@37 118 local start, limit = 1, numAll
Nenue@37 119
Nenue@37 120
Nenue@58 121 --- Update the index tables
Nenue@43 122 numAnimating = 0
Nenue@44 123 local numEntries = 0
Nenue@37 124 for logIndex = start, limit do
Nenue@37 125 local reason1, reason2 = '', ''
Nenue@37 126 local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(logIndex)
Nenue@37 127 local watchIndex = GetQuestWatchIndex(logIndex)
Nenue@37 128
Nenue@58 129
Nenue@37 130 if watchIndex and watchIndex >= bottomIndex then
Nenue@43 131 -- do watch data pointers match?
Nenue@58 132 local watchInfo, watchBlock = self.WatchInfo[watchIndex], self.WatchBlock[watchIndex]
Nenue@58 133
Nenue@37 134 if watchInfo and watchInfo.questID ~= questID then
Nenue@38 135 print('GetNumWatched', 'trimming WatchInfo ['..watchIndex..'] =/=', questID)
Nenue@37 136 self.WatchInfo[watchIndex] = nil
Nenue@37 137 end
Nenue@37 138 if watchBlock and watchBlock.info.questID ~= questID then
Nenue@38 139 print('GetNumWatched', 'trimming WatchBlock ['..watchIndex..'] =/=', watchBlock:GetName())
Nenue@37 140 self.WatchBlock[watchIndex] = nil
Nenue@37 141 end
Nenue@37 142 end
Nenue@37 143
Nenue@43 144 -- check log-block pointer
Nenue@37 145 local logBlock = self.LogBlock[logIndex]
Nenue@43 146 if logBlock then
Nenue@43 147 -- check later that the block isn't for a dropped quest
Nenue@43 148 if logBlock.info.questID ~= questID then
Nenue@43 149 print('GetQuests', 'replace info', logBlock.info.questID, '->', questID)
Nenue@43 150 self.LogBlock[logIndex] = nil
Nenue@43 151 end
Nenue@37 152 end
Nenue@43 153 --- end of crazy audit flagging
Nenue@37 154
Nenue@40 155 -- add to watch index if: the questID is non-zero
Nenue@37 156 if questID ~= 0 then
Nenue@44 157 self:GetInfo(logIndex, watchIndex)
Nenue@44 158 print('GetQuests', format('request info |cFF00FF00%2d|r |cFFFFFF00%6d|r |cFFFF4400%3s|r |cFF00FFFF%3s|r', logIndex, questID, tostring(watchIndex or ''), numEntries))
Nenue@37 159 end
Nenue@37 160 end
Nenue@37 161
Nenue@44 162
Nenue@44 163
Nenue@58 164 --- Clean up blocks that got cut off for some reason
Nenue@44 165 for index, block in ipairs(self.usedBlocks) do
Nenue@43 166 -- animating blocks have been evaluated
Nenue@46 167 if not block.blockFadeOut:IsPlaying() then
Nenue@58 168
Nenue@58 169 local logIndex = GetQuestLogIndexByID(block.info.questID, 'player')
Nenue@58 170 print('GetNumWatched', GetQuestLogTitle(logIndex))
Nenue@58 171 local questID = select(8,GetQuestLogTitle(logIndex))
Nenue@58 172 print('GetNumWatched', questID)
Nenue@58 173
Nenue@58 174 if questID == 0 then
Nenue@43 175 self:ClearBlock(block)
Nenue@58 176 print('GetNumWatched', '|cFF44FF00'.. index, (block and block:GetName() or '|cFFFF0000-|r'), logIndex, questID, '(unresolved)', block.info.title)
Nenue@43 177 elseif not IsQuestWatched(block.info.logIndex) then
Nenue@43 178 self:ClearBlock(block)
Nenue@58 179 print('GetNumWatched', '|cFFFF4400'.. index, (block and block:GetName() or '|cFFFF0000-|r'), logIndex, questID, '(unwatched)', block.info.title)
Nenue@45 180 else
Nenue@58 181 print('GetNumWatched', '|cFF0088FF'.. index, (block and block:GetName() or '|cFFFF0000-|r'), logIndex or '|cFF444444-|r', block.info.title)
Nenue@43 182 end
Nenue@45 183 else
Nenue@45 184
Nenue@45 185 print('GetNumWatched', '|cFF00FFFF'.. index, (block and block:GetName() or '|cFFFF0000-|r'), ' (animating)')
Nenue@37 186 end
Nenue@37 187 end
Nenue@37 188
Nenue@37 189 self.numWatched = numWatched
Nenue@37 190 self.numAll = numAll
Nenue@37 191
Nenue@44 192 print('GetNumWatched', 'RESULT', numWatched, 'of', numAll)
Nenue@37 193 return numWatched, numAll, self.WatchList
Nenue@28 194 end
Nenue@30 195
Nenue@37 196
Nenue@30 197 --- Returns an iterable table from which tracker blocks can be filled out. Data includes:
Nenue@30 198 -- All entry-layer GetXInfo return values
Nenue@30 199 -- Manifest of line data to be displayed in relation to the tracked object
Nenue@37 200 Quest.GetInfo = function (self, logIndex, watchIndex)
Nenue@28 201 local print = iprint
Nenue@44 202 print('')
Nenue@37 203 local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(logIndex)
Nenue@30 204 if ( not questID ) then
Nenue@38 205 tprint('GetNumWatched', logIndex, watchIndex, '|cFFFF2299no data|r')
Nenue@44 206 return 0
Nenue@28 207 end
Nenue@28 208
Nenue@37 209 Quest.Info[questID] = Quest.Info[questID] or {}
Nenue@44 210 local numEntries = 0
Nenue@37 211 local q = Quest.Info[questID]
Nenue@37 212 q.questID = questID
Nenue@37 213 q.id = questID
Nenue@37 214 q.logIndex = logIndex
Nenue@37 215 q.watchIndex = watchIndex
Nenue@28 216
Nenue@37 217 local numObjectives, requiredMoney, isAutoComplete, failureTime, timeElapsed, questType
Nenue@37 218 = 0, 0, nil, false, false, 0
Nenue@37 219 if watchIndex then
Nenue@44 220 self.print('WatchIndex', watchIndex)
Nenue@37 221 local _
Nenue@44 222 _, _, _, numObjectives, requiredMoney, _, _, isAutoComplete,
Nenue@37 223 failureTime, timeElapsed, questType = GetQuestWatchInfo(watchIndex)
Nenue@44 224 self.WatchList[watchIndex] = q
Nenue@37 225 --tprint(' |cFF88FF00GetInfo:|r set watch entry', watchIndex)
Nenue@44 226 self.print('WatchIndex', logIndex, watchIndex + numAnimating, '|cFFFF2299'..title..'|r')
Nenue@37 227 end
Nenue@37 228 self.LogInfo[logIndex] = q
Nenue@28 229
Nenue@37 230 q.numObjectives = numObjectives
Nenue@37 231 q.requiredMoney = requiredMoney
Nenue@37 232 q.failureTime = failureTime
Nenue@37 233 q.timeElapsed = timeElapsed
Nenue@30 234
Nenue@37 235
Nenue@37 236
Nenue@32 237 q.type = 'Quest'
Nenue@32 238 q.title = title
Nenue@32 239 q.level = level
Nenue@32 240 q.displayQuestID = displayQuestID
Nenue@32 241 q.suggestedGroup = suggestedGroup
Nenue@32 242
Nenue@30 243 -- re-use Blizzard logic for consistency
Nenue@32 244 local showQuest = true
Nenue@32 245 if isTask then showQuest = false end
Nenue@30 246 local watchMoney = false;
Nenue@30 247 local tagID, typeTag, frequencyTag, completionTag, completionText
Nenue@30 248 local isAccount, isFaction, isWeekly, isDaily = false, false, false, false
Nenue@30 249 local isBreadcrumb = false
Nenue@30 250 local questFailed = false
Nenue@30 251 local watchMoney = false
Nenue@30 252 local timerInfo, moneyInfo = false, false
Nenue@30 253 local objectives = q.objectives or {}
Nenue@30 254
Nenue@30 255
Nenue@30 256 -- Case 1: completed quest or "go to thing" breadcrumb
Nenue@30 257 -- * 1 line containing the completion text
Nenue@30 258 if ( isComplete and isComplete < 0 ) then
Nenue@30 259 isComplete = false
Nenue@30 260 questFailed = true
Nenue@30 261 elseif ( numObjectives == 0 and playerMoney >= requiredMoney and not startEvent ) then
Nenue@30 262 isComplete = true;
Nenue@30 263 questFailed = false
Nenue@30 264 if ( requiredMoney == 0 ) then
Nenue@30 265 isBreadcrumb = true;
Nenue@30 266 end
Nenue@30 267 end
Nenue@44 268 print('QuestFlags', (isComplete and 'isComplete' or ''), (questFailed and 'questFailed' or ''), (isBreadcrumb and 'isBreadcrumb' or ''), numObjectives)
Nenue@30 269
Nenue@30 270 -- completion message?
Nenue@30 271 local isSequenced = IsQuestSequenced(questID)
Nenue@30 272 local temp_status = ''
Nenue@30 273 if ( isComplete ) then
Nenue@30 274 temp_status = 'COMPLETED_OBJECTIVES'
Nenue@44 275 --objectives = Quest.GetObjectives(logIndex, numObjectives, true, isSequenced, isStory)
Nenue@30 276 if ( isAutoComplete ) then
Nenue@30 277 temp_status = 'AUTOCOMPLETE_OBJECTIVES'
Nenue@30 278 completionText = _G.QUEST_WATCH_CLICK_TO_COMPLETE
Nenue@30 279 else
Nenue@30 280 if ( isBreadcrumb ) then
Nenue@30 281 temp_status = 'COMPLETE_BREADCRUMB'
Nenue@44 282 completionText = GetQuestLogCompletionText(logIndex)
Nenue@30 283 else
Nenue@30 284 temp_status = 'COMPLETE_READY_FOR_TURN_IN'
Nenue@30 285 completionText = _G.QUEST_WATCH_QUEST_READY
Nenue@30 286 end
Nenue@30 287 end
Nenue@45 288 if not T.Conf.ShowObjectivesWhenComplete then
Nenue@45 289 q.objectives = {}
Nenue@45 290 end
Nenue@30 291 elseif ( questFailed ) then
Nenue@30 292 temp_status = 'FAILED'
Nenue@30 293 -- Case 2: failed quest
Nenue@30 294 -- * 1 status line; hide other info
Nenue@30 295 completionText = _G.FAILED
Nenue@30 296 else
Nenue@30 297
Nenue@30 298 temp_status = 'PROGRESS_OBJECTIVES'
Nenue@30 299 -- Case 3: quest in progress
Nenue@30 300 -- * Multiple objective lines
Nenue@30 301 -- * Possible extra lines for money and timer data respectively
Nenue@39 302 self.print(' QuestInfo', title, questType, isAutoComplete)
Nenue@37 303 objectives = Quest.GetObjectives(logIndex, numObjectives, false, isSequenced, isStory)
Nenue@30 304 q.objectives = objectives
Nenue@30 305
Nenue@30 306 --- anything past here gets appended to existing objectives
Nenue@30 307
Nenue@30 308 -- money
Nenue@30 309 if ( requiredMoney > playerMoney ) then
Nenue@30 310
Nenue@30 311 temp_status = temp_status .. '_MONEY'
Nenue@30 312 local text = GetMoneyString(playerMoney).." / "..GetMoneyString(requiredMoney);
Nenue@30 313 moneyInfo = {
Nenue@30 314 type = 'money',
Nenue@30 315 text = text,
Nenue@30 316 finished = false,
Nenue@30 317 requiredMoney = requiredMoney,
Nenue@30 318 playerMoney = playerMoney,
Nenue@30 319 }
Nenue@31 320 tinsert(objectives, moneyInfo)
Nenue@30 321 end
Nenue@30 322
Nenue@30 323 -- time limit
Nenue@30 324 if ( failureTime ) then
Nenue@30 325 temp_status = temp_status .. '_TIMED'
Nenue@30 326 if ( timeElapsed and timeElapsed <= failureTime ) then
Nenue@30 327 timerInfo = {
Nenue@30 328 type = 'timer',
Nenue@30 329 finished = false,
Nenue@30 330 timeElapsed = timeElapsed,
Nenue@30 331 failureTime = failureTime,
Nenue@30 332 }
Nenue@31 333 tinsert(objectives, timerInfo)
Nenue@30 334 end
Nenue@30 335 end
Nenue@30 336 end
Nenue@30 337 q.moneyInfo = moneyInfo
Nenue@30 338 q.timerInfo = timerInfo
Nenue@30 339 q.completionText = completionText
Nenue@30 340
Nenue@30 341 -- POI data
Nenue@30 342 local POI = false
Nenue@30 343 if ( showPOIs ) then
Nenue@30 344 POI = {
Nenue@30 345 questID = questID,
Nenue@37 346 logIndex = logIndex,
Nenue@37 347 watchIndex = watchIndex
Nenue@30 348 }
Nenue@30 349 local poiButton;
Nenue@30 350 if ( hasLocalPOI ) then
Nenue@30 351
Nenue@30 352 if ( isComplete ) then
Nenue@30 353 POI.type = 'normal'
Nenue@30 354 else
Nenue@30 355 POI.type = 'numeric'
Nenue@30 356 end
Nenue@30 357 elseif ( isComplete ) then
Nenue@30 358 POI.type = 'remote'
Nenue@30 359 end
Nenue@30 360
Nenue@37 361 local distance, onContinent = GetDistanceSqToQuest(logIndex)
Nenue@30 362 if distance ~= nil and distance > 0 then
Nenue@30 363 POI.distance = distance
Nenue@30 364 POI.onContinent = onContinent
Nenue@30 365 end
Nenue@30 366 end
Nenue@30 367 q.POI = POI
Nenue@30 368
Nenue@30 369 --- Block Tags
Nenue@30 370 -- completionTag - in progres, complete, failed, autocomplete
Nenue@30 371 -- typeTag - account, faction, pvp, dungeon, group
Nenue@30 372 -- frequencyTag - daily/weekly
Nenue@37 373 local schema = 'default'
Nenue@30 374 local questTagID, tagName = GetQuestTagInfo(questID)
Nenue@30 375 local tagInfo = {}
Nenue@30 376 local tagCoords = {}
Nenue@30 377 local factionGroup = GetQuestFactionGroup(questID);
Nenue@30 378 if( questTagID and questTagID == QUEST_TAG_ACCOUNT ) then
Nenue@30 379 if( factionGroup ) then
Nenue@30 380 tagID = "ALLIANCE"
Nenue@37 381 schema = 'alliance'
Nenue@30 382 if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
Nenue@30 383 tagID = "HORDE"
Nenue@37 384 schema = 'horde'
Nenue@30 385 end
Nenue@30 386 isFaction = true
Nenue@30 387 else
Nenue@30 388 tagID = QUEST_TAG_ACCOUNT
Nenue@30 389 isAccount = true
Nenue@30 390 end
Nenue@44 391 tagInfo['type'] = QUEST_TAG_TCOORDS[tagID]
Nenue@30 392 elseif ( factionGroup) then
Nenue@30 393 tagID = "ALLIANCE"
Nenue@30 394 if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
Nenue@30 395 tagID = "HORDE"
Nenue@30 396 end
Nenue@30 397 isFaction = true
Nenue@44 398 tagInfo['type'] = QUEST_TAG_TCOORDS[tagID]
Nenue@30 399 end
Nenue@30 400
Nenue@30 401 if( frequency == LE_QUEST_FREQUENCY_DAILY and (not isComplete or isComplete == 0) ) then
Nenue@30 402 tagID = 'DAILY'
Nenue@44 403 tagInfo['frequency'] = QUEST_TAG_TCOORDS[tagID]
Nenue@30 404 isDaily = true
Nenue@37 405 schema = 'daily'
Nenue@30 406 elseif( frequency == LE_QUEST_FREQUENCY_WEEKLY and (not isComplete or isComplete == 0) )then
Nenue@30 407 tagID = 'WEEKLY'
Nenue@44 408 tagInfo['frequency'] = QUEST_TAG_TCOORDS[tagID]
Nenue@30 409 isWeekly = true
Nenue@37 410 schema = 'weekly'
Nenue@30 411 elseif( questTagID ) then
Nenue@30 412 tagID = questTagID
Nenue@30 413 end
Nenue@30 414
Nenue@30 415 if( isComplete ) then
Nenue@44 416 tagInfo['completion'] = QUEST_TAG_TCOORDS['COMPLETED']
Nenue@30 417 elseif ( questFailed ) then
Nenue@44 418 tagInfo['completion'] = QUEST_TAG_TCOORDS['FAILED']
Nenue@30 419 end
Nenue@30 420
Nenue@30 421 q.tagInfo = tagInfo
Nenue@44 422 q.tagID = tagID -- defining primary tags for compact view
Nenue@30 423 q.tagName = tagName
Nenue@30 424
Nenue@30 425 -- action button information
Nenue@37 426 local link, icon, charges = GetQuestLogSpecialItemInfo(logIndex)
Nenue@37 427 local start, duration, enable = GetQuestLogSpecialItemCooldown(logIndex)
Nenue@30 428 if link or icon or charges then
Nenue@30 429 q.specialItem = {
Nenue@30 430 questID = questID,
Nenue@37 431 logIndex = questLogIndex,
Nenue@30 432 link = link,
Nenue@30 433 charges = charges,
Nenue@30 434 icon = icon,
Nenue@30 435 start = start,
Nenue@30 436 duration = duration,
Nenue@30 437 enable = enable,
Nenue@30 438 }
Nenue@30 439 end
Nenue@30 440
Nenue@32 441 if moneyInfo or timerInfo then
Nenue@32 442 numObjectives = #objectives
Nenue@32 443 end
Nenue@30 444
Nenue@30 445 -- raw data
Nenue@28 446 q.isComplete = isComplete
Nenue@28 447 q.startEvent = startEvent
Nenue@28 448 q.isAutoComplete = isAutoComplete
Nenue@28 449 q.questType = questType
Nenue@28 450 q.isTask = isTask
Nenue@28 451 q.isStory = isStory
Nenue@28 452 q.isOnMap = isOnMap
Nenue@28 453 q.hasLocalPOI = hasLocalPOI
Nenue@28 454 q.frequency = frequency
Nenue@28 455 q.isComplete = isComplete
Nenue@28 456 q.isStory = isStory
Nenue@28 457 q.isTask = isTask
Nenue@31 458 q.statusKey = temp_status
Nenue@32 459 q.selected = (questID == superTrackQuestID)
Nenue@28 460
Nenue@32 461 T.SetRewards(q, questID)
Nenue@32 462
Nenue@34 463 q.questID = questID
Nenue@37 464 q.logIndex = logIndex
Nenue@34 465 q.watchIndex = watchIndex
Nenue@34 466 q.id = questID
Nenue@37 467 q.schema = schema
Nenue@28 468
Nenue@30 469 if Devian and Devian.InWorkspace() then
Nenue@38 470 print('QuestStatus', temp_status, '|cFF00FF00questLogIndex|r:', logIndex, title)
Nenue@30 471 local temp ={}
Nenue@38 472 local data_txt = '|cFF'..self.internalColor..'values:|r'
Nenue@30 473 for k,v in pairs(q) do
Nenue@30 474 if type(v) =='number' then
Nenue@30 475 data_txt = data_txt .. ' |cFFFFFF00'..k..'|r: ' .. tostring(v)
Nenue@30 476 elseif type(v) == 'table' then
Nenue@30 477 tinsert(temp, k)
Nenue@28 478 end
Nenue@28 479 end
Nenue@38 480 print('DataStatus',data_txt)
Nenue@30 481 sort(temp, function(a,b) return a < b end)
Nenue@30 482 for i, k in ipairs(temp) do
Nenue@38 483 iprint('GetInfo', questID, ''..k..'|r')
Nenue@30 484 for kk,v in pairs(q[k]) do
Nenue@38 485 iprint('GetInfo', questID, kk, '=', v)
Nenue@30 486 end
Nenue@28 487 end
Nenue@28 488 end
Nenue@28 489
Nenue@44 490 return numEntries
Nenue@30 491 end
Nenue@28 492
Nenue@37 493 Quest.GetObjectives = function(logIndex, numObjectives, isComplete, isSequenced, isStory)
Nenue@38 494 local print = Quest.print
Nenue@30 495 local objectives = {}
Nenue@39 496 if not logIndex then
Nenue@39 497 return
Nenue@39 498 end
Nenue@39 499
Nenue@30 500 for i = 1, numObjectives do
Nenue@37 501 local text, type, finished = GetQuestLogLeaderBoard(i, logIndex)
Nenue@39 502
Nenue@39 503 local progress = 0
Nenue@39 504 if finished then
Nenue@39 505 progress = 1
Nenue@39 506 elseif text then
Nenue@39 507 local quantity, maxQuantity = text:match('^(%d+)/(%d+)')
Nenue@39 508 if quantity and maxQuantity then
Nenue@39 509 progress = quantity / maxQuantity
Nenue@39 510 --print('GetObjectives', 'calculated objective progress:', quantity, '/', maxQuantity, '=', progress)
Nenue@39 511 end
Nenue@39 512 end
Nenue@39 513
Nenue@39 514 print('GetObjectives', format('|cFF88FF88#%d %s %s %s', i, tostring(type), tostring(text), tostring(finished)), '('.. tostring(progress)..')')
Nenue@39 515
Nenue@39 516
Nenue@30 517 objectives[i] = {
Nenue@28 518 index = i,
Nenue@28 519 type = type,
Nenue@28 520 text = text,
Nenue@39 521 finished = finished,
Nenue@39 522 progress = progress
Nenue@28 523 }
Nenue@28 524 end
Nenue@30 525 return objectives
Nenue@28 526 end
Nenue@28 527
Nenue@30 528 local huge, sqrt = math.huge, math.sqrt
Nenue@28 529 Quest.GetClosest = function()
Nenue@28 530 local minID, minTitle
Nenue@30 531 local minDist = huge
Nenue@28 532 local numQuests = GetNumQuestLogEntries()
Nenue@28 533 for questIndex = 1, numQuests do
Nenue@28 534 local distance, onContinent = GetDistanceSqToQuest(questIndex)
Nenue@28 535 local title, level, _, _, _, _, _, _, questID = GetQuestLogTitle(questIndex)
Nenue@28 536 if onContinent and distance < minDist then
Nenue@28 537 minDist = distance
Nenue@28 538 minTitle = title
Nenue@28 539 minID = questID
Nenue@28 540 end
Nenue@28 541 end
Nenue@28 542
Nenue@30 543 print('nearest quest is', minTitle, 'by', sqrt(minDist))
Nenue@28 544 return minID, minTitle, minDist
Nenue@28 545 end
Nenue@28 546
Nenue@28 547 Quest.OnTurnIn = function(self, questID, xp, money)
Nenue@28 548 end
Nenue@28 549
Nenue@29 550 Quest.Select = function (handler, block)
Nenue@29 551 if block.info.isAutoComplete and block.info.isComplete then
Nenue@34 552 ShowQuestComplete(block.info.logIndex)
Nenue@28 553 else
Nenue@29 554 SetSuperTrackedQuestID(block.info.questID)
Nenue@28 555 end
Nenue@28 556 end
Nenue@28 557
Nenue@29 558 Quest.Link = function(handler, block)
Nenue@34 559 local questLink = GetQuestLink(block.info.logIndex);
Nenue@28 560 if ( questLink ) then
Nenue@28 561 ChatEdit_InsertLink(questLink);
Nenue@28 562 end
Nenue@28 563 end
Nenue@28 564
Nenue@29 565 Quest.Open = function(handler, block)
Nenue@29 566 QuestMapFrame_OpenToQuestDetails(block.info.questID)
Nenue@28 567 end
Nenue@28 568
Nenue@29 569 Quest.Remove = function(handler, block)
Nenue@34 570 print('removing', block.info.logIndex, 'from watcher')
Nenue@34 571 RemoveQuestWatch(block.info.logIndex)
Nenue@29 572 end
Nenue@58 573
Nenue@58 574 Quest.OnRemoved = function(block)
Nenue@58 575 print('OnRemoved', block:GetID())
Nenue@58 576 end