Mercurial > wow > buffalo2
comparison ObjectiveTracker/BonusObjectiveData.lua @ 43:9480bd904f4c
- file name organizing
| author | Nenue |
|---|---|
| date | Mon, 25 Apr 2016 13:51:58 -0400 |
| parents | ObjectiveTracker/BonusObjectives.lua@03ed70f846de |
| children |
comparison
equal
deleted
inserted
replaced
| 42:c73051785f19 | 43:9480bd904f4c |
|---|---|
| 1 --- ${PACKAGE_NAME} | |
| 2 -- @file-author@ | |
| 3 -- @project-revision@ @project-hash@ | |
| 4 -- @file-revision@ @file-hash@ | |
| 5 -- Created: 4/13/2016 7:48 PM | |
| 6 local B = select(2,...).frame | |
| 7 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') | |
| 8 local Default, Quest = T.DefaultHandler, T.Quest | |
| 9 local print = B.print('Tracker') | |
| 10 local lprint = B.print('Line') | |
| 11 local iprint = B.print('Info') | |
| 12 local Bonus = T.Bonus | |
| 13 | |
| 14 local UnitName, GetRealmName, GetQuestObjectiveInfo, GetTasksTable, GetTaskInfo = UnitName, GetRealmName, GetQuestObjectiveInfo, GetTasksTable, GetTaskInfo | |
| 15 local GetMapNameByID, GetCurrentMapAreaID = GetMapNameByID, GetCurrentMapAreaID | |
| 16 local tinsert, ipairs, pairs, tostring, wipe = tinsert, ipairs, pairs, tostring, table.wipe | |
| 17 local GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime = GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime | |
| 18 local TASK_DISPLAY_TEST = 1 -- 1: normal (is nearby or on the map) 2: strict (is nearby) 3: data exists | |
| 19 | |
| 20 --- Holds data for recently completed tasks | |
| 21 local completedTasks = {} | |
| 22 | |
| 23 --- Returns a tasks table modified to include recently completed objectives | |
| 24 local InternalGetTasksTable = function() | |
| 25 local print = Bonus.print | |
| 26 local char = UnitName("player") | |
| 27 local realm = GetRealmName() | |
| 28 local tasks = GetTasksTable() | |
| 29 | |
| 30 for questID, data in pairs(Bonus.Info) do | |
| 31 print('GetTasksTable', questID, #data.objectives) | |
| 32 for i, o in ipairs(data.objectives) do | |
| 33 print('GetTasksTable', questID, i, o.text) | |
| 34 end | |
| 35 end | |
| 36 | |
| 37 for questID, data in pairs(completedTasks) do | |
| 38 if questID > 0 then | |
| 39 local found = false | |
| 40 for i = 1, #tasks do | |
| 41 if tasks[i] == questID then | |
| 42 found = true | |
| 43 break | |
| 44 end | |
| 45 end | |
| 46 -- if it's not part of the current table, then try to insert it where it was last found | |
| 47 if not found then | |
| 48 if data.watchIndex < #tasks then | |
| 49 tinsert(tasks, data.watchIndex, data) | |
| 50 else | |
| 51 tinsert(tasks, data) | |
| 52 end | |
| 53 end | |
| 54 end | |
| 55 end | |
| 56 return tasks | |
| 57 end | |
| 58 | |
| 59 --- Returns an entry from the composed tasks table if possible, otherwise makes an API pull | |
| 60 | |
| 61 local InternalGetTaskInfo = function(questID) | |
| 62 if completedTasks[questID] then | |
| 63 -- if it's a recently completed task, use the information stored for it | |
| 64 return true, true, #completedTasks[questID].objectives | |
| 65 else | |
| 66 return GetTaskInfo(questID) | |
| 67 end | |
| 68 end | |
| 69 | |
| 70 --- Same as above but for the objective entries | |
| 71 local InternalGetQuestObjectiveInfo = function(questID, objectiveIndex) | |
| 72 if ( completedTasks[questID] ) then | |
| 73 print('using internal data') | |
| 74 return completedTasks[questID].objectives[objectiveIndex], completedTasks[questID].objectiveType, true; | |
| 75 else | |
| 76 return GetQuestObjectiveInfo(questID, objectiveIndex, false); | |
| 77 end | |
| 78 end | |
| 79 | |
| 80 --- end redundant copy of silliness | |
| 81 ------------------------------------------------------------------------------------------ | |
| 82 | |
| 83 Bonus.Completed = {} | |
| 84 Bonus.POI = {} | |
| 85 Bonus.Scenario = {} | |
| 86 Bonus.QuestBlock = {} | |
| 87 Bonus.WatchInfo = {} | |
| 88 | |
| 89 local function CanShowTask(isInArea, isOnMap, existingTask, numObjectives) | |
| 90 if TASK_DISPLAY_TEST == 1 then | |
| 91 return (isInArea) | |
| 92 elseif TASK_DISPLAY_TEST == 2 then | |
| 93 return (isInArea and(isOnMap and existingTask)) | |
| 94 elseif TASK_DISPLAY_TEST == 3 then | |
| 95 return true | |
| 96 end | |
| 97 end | |
| 98 | |
| 99 function Bonus:GetNumWatched () | |
| 100 | |
| 101 local print = self.print | |
| 102 print(self.name, self) | |
| 103 | |
| 104 local tasks = InternalGetTasksTable() | |
| 105 local numWatched = 0 | |
| 106 local numAll = 0 | |
| 107 local existingTasks = {} | |
| 108 wipe(self.WatchList) | |
| 109 print('|cFF'..self.internalColor..'Bonus.GetNumWatched()|r', #tasks) | |
| 110 print('InternalGetTaskInfo') | |
| 111 | |
| 112 for i, questID in ipairs(tasks) do | |
| 113 local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID) | |
| 114 local existingTask = self.InfoBlock[questID] | |
| 115 local displayObjectiveHeader = false; | |
| 116 local displayTask = CanShowTask(isInArea, isOnMap, existingTask) | |
| 117 if displayTask then | |
| 118 print('TaskInfo', '|cFF00FF00showable objective list', questID) | |
| 119 self.Info[questID] = self.Info[questID] or {} | |
| 120 | |
| 121 local t = self.Info[questID] | |
| 122 if (isOnMap or isInArea) and existingTask then | |
| 123 t.areaID = GetCurrentMapAreaID() | |
| 124 local _ | |
| 125 t.mapName, _, _, t.isMicroDungeon, t.microDungeonMapName = GetMapInfo() | |
| 126 print('InternalGetTaskInfo', 'map data', t.areaID, t.mapName) | |
| 127 end | |
| 128 | |
| 129 local taskTitle | |
| 130 t.id = questID | |
| 131 t.objectives = {} | |
| 132 local isComplete = true; | |
| 133 for objectiveIndex = 1, numObjectives do | |
| 134 local text, objectiveType, finished, displayAsObjective = InternalGetQuestObjectiveInfo(questID, objectiveIndex, false); | |
| 135 displayObjectiveHeader = displayObjectiveHeader or displayAsObjective; | |
| 136 if not taskTitle then | |
| 137 if objectiveType == 'progressbar' and not text:match('^%d%+\\%d+') then | |
| 138 taskTitle = text | |
| 139 text = '' | |
| 140 end | |
| 141 end | |
| 142 | |
| 143 | |
| 144 print('TaskObjective', text, objectiveType, finished, displayAsObjective) | |
| 145 t.objectives[objectiveIndex] = t.objectives[objectiveIndex] or {} | |
| 146 local o = t.objectives[objectiveIndex] | |
| 147 | |
| 148 o.index = objectiveIndex | |
| 149 o.text = text | |
| 150 o.type = objectiveType | |
| 151 o.finished = finished | |
| 152 o.displayAsObjective = displayAsObjective | |
| 153 isComplete = (isComplete and finished) | |
| 154 end | |
| 155 | |
| 156 T.SetRewards(t, questID) | |
| 157 | |
| 158 -- didn't get a name from progress bar? what about area name | |
| 159 if not taskTitle then | |
| 160 if isInArea then | |
| 161 taskTitle = GetMapNameByID(GetCurrentMapAreaID()) | |
| 162 end | |
| 163 end | |
| 164 t.numObjectives = numObjectives | |
| 165 t.isInArea = isInArea | |
| 166 t.isOnMap = isOnMap | |
| 167 t.existingTask = existingTask | |
| 168 t.questID = questID | |
| 169 t.id = questID | |
| 170 t.taskIndex = i | |
| 171 t.title = taskTitle | |
| 172 t.isComplete = isComplete | |
| 173 self.WatchList[i] = t | |
| 174 elseif existingTask then | |
| 175 print('TaskInfo', '|cFFFF4400hideable task', questID) | |
| 176 existingTask:Hide() | |
| 177 end | |
| 178 | |
| 179 | |
| 180 print ('TaskInfo', i, '|cFFFFFF00'.. questID..'|r', '('..(isInArea and '|cFF88FF88' or '|cFF666666') .. 'isInArea|r', 'AND', (isOnMap and '|cFF88FF88' or '|cFF666666') .. 'isOnMap|r)', 'OR', (existingTask and '|cFF88FF88' or '|cFF666666') .. 'existingTask|r', (displayTask and '|cFF00FF00show|r' or '|cFFFF4400hide|r')) | |
| 181 end | |
| 182 | |
| 183 | |
| 184 self.numWatched = #self.WatchList | |
| 185 self.numAll = #existingTasks | |
| 186 return self.numWatched, self.numWatched, self.WatchList | |
| 187 end | |
| 188 | |
| 189 Bonus.OnEvent = function(block, event, ...) | |
| 190 if event == 'QUEST_LOG_UPDATE' then | |
| 191 local info = block.info | |
| 192 | |
| 193 local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(info.questID) | |
| 194 if not CanShowTask(isInArea, isOnMap, block, numObjectives) then | |
| 195 block:Hide() | |
| 196 end | |
| 197 end | |
| 198 end | |
| 199 | |
| 200 Bonus.GetBlock = function(self, index) | |
| 201 local block = Default.GetBlock(self, index) | |
| 202 block:SetScript('OnEvent', self.OnEvent) | |
| 203 block:RegisterEvent('QUEST_LOG_UPDATE') | |
| 204 return block | |
| 205 end | |
| 206 | |
| 207 --- info cleanup done when turn-ins are detected | |
| 208 Bonus.OnTurnIn = function(self, block, questID, xp, money) | |
| 209 --[=[ | |
| 210 local info = self.Info[questID] | |
| 211 if info.rewardInfo and #info.rewardInfo >= 1 then | |
| 212 for i, reward in ipairs(info.rewardInfo) do | |
| 213 --[[ | |
| 214 type = 'item', | |
| 215 index = i , | |
| 216 name = name, | |
| 217 texture = texture, | |
| 218 count = count, | |
| 219 quality = quality, | |
| 220 isUsable = isUsable | |
| 221 ]] | |
| 222 print(' reward ', i, ' ', reward.type, reward.name, reward.count) | |
| 223 | |
| 224 end | |
| 225 end | |
| 226 | |
| 227 print('|cFFFF8800'..block:GetName()..':OnTurnIn call', questID, xp, money) | |
| 228 local savedTasks = B.Conf.TasksLog or {} | |
| 229 | |
| 230 info.completedTime = GetTime() | |
| 231 info.animate = true | |
| 232 T.SetAnimate(self.updateReasonModule) | |
| 233 savedTasks[questID] = { | |
| 234 id = questID, | |
| 235 title = info.title, | |
| 236 finished = true, | |
| 237 numObjectives = info.numObjectives, | |
| 238 objectives = info.objectives, | |
| 239 rewardInfo = info.rewardInfo, | |
| 240 } | |
| 241 B.Conf.TasksLog = savedTasks | |
| 242 | |
| 243 print(' ## CONF TASKLOG ##') | |
| 244 for i, t in pairs(savedTasks[questID]) do | |
| 245 print(' |cFFFFFF00'.. tostring(i)..'|r', t) | |
| 246 | |
| 247 end | |
| 248 for o, j in ipairs(savedTasks[questID].objectives) do | |
| 249 print(' |cFF00FFFF#'.. o ..'|r', j.type, j.finished) | |
| 250 end | |
| 251 | |
| 252 print('adding', info.title, 'to cache') | |
| 253 --]=] | |
| 254 end | |
| 255 | |
| 256 Bonus.GetInfo = function(self, taskIndex) | |
| 257 print(self.name, self) | |
| 258 return self.WatchInfo[taskIndex] | |
| 259 end | |
| 260 | |
| 261 | |
| 262 | |
| 263 --- Update hooks | |
| 264 Bonus.UpdateObjectives = function(handler, block, blockSchema) | |
| 265 block.schema = blockSchema or 'default' | |
| 266 local info = block.info | |
| 267 block.title:SetText(info.title) | |
| 268 | |
| 269 | |
| 270 Default.UpdateObjectives(handler, block) | |
| 271 return blockSchema | |
| 272 end | |
| 273 | |
| 274 Bonus.UpdateLine = function(handler, block, data) | |
| 275 local info = block.info | |
| 276 local print = lprint | |
| 277 local text, attachment = '', nil | |
| 278 if data.type == 'progressbar' then | |
| 279 print(' |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID))) | |
| 280 local percent = 100 | |
| 281 if not data.finished then | |
| 282 percent = GetQuestProgressBarPercent(info.questID) | |
| 283 end | |
| 284 data.value = percent | |
| 285 data.maxValue = 100 | |
| 286 | |
| 287 attachment = T.GetWidget(data, 'StatusBar', info.questID..'-'..data.index) | |
| 288 attachment:SetParent(block) | |
| 289 print(attachment:GetNumPoints()) | |
| 290 for i = 1, attachment:GetNumPoints() do | |
| 291 print(' ',attachment:GetPoint(i)) | |
| 292 end | |
| 293 | |
| 294 attachment.value = percent | |
| 295 attachment.maxValue = 100 | |
| 296 attachment.status:SetFormattedText(PERCENTAGE_STRING, percent) | |
| 297 --attachment:SetParent(handler.frame) | |
| 298 --print(attachment.status:GetText()) | |
| 299 print(' |cFFFF0022** text:|r', data.text, '|cFFFF0022value:|r', data.value, '|cFFFF0022max:|r', data.maxValue) | |
| 300 end | |
| 301 text = data.text | |
| 302 return text, attachment, 'default' | |
| 303 end | |
| 304 | |
| 305 Bonus.Select = function(handler, block) | |
| 306 print(handler, block) | |
| 307 handler:OnTurnIn(block, block.info.questID) | |
| 308 end | |
| 309 Bonus.Remove = function(self) | |
| 310 | |
| 311 end |
