Mercurial > wow > buffalo2
diff ObjectiveCore.lua @ 6:589de8ea05b9
- validate tracked objects' existence by use of those handler.Info tables we made
- apply collision checking to action buttons when their corresponding entry has scrolled out
author | Nenue |
---|---|
date | Fri, 01 Apr 2016 01:30:42 -0400 |
parents | ObjectiveTracker.lua@3397aae1f44d |
children | 7923243ae972 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ObjectiveCore.lua Fri Apr 01 01:30:42 2016 -0400 @@ -0,0 +1,209 @@ +--- ${PACKAGE_NAME} +-- @file-author@ +-- @project-revision@ @project-hash@ +-- @file-revision@ @file-hash@ +-- Created: 3/26/2016 1:51 AM +local B = select(2,...).frame +local wipe, pairs, ipairs, min, max, unpack = table.wipe, pairs, ipairs, min, max, unpack +local setmetatable, type = setmetatable, type +local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo +local GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo +local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') +local print = B.print('Objectives') +local ObjectiveTrackerFrame = ObjectiveTrackerFrame + +--[[ + Full quest info is available if: + - It's in the player quest log, or is available from the Gossip interface + - It's being shared from another player and is acceptible + - It's an auto-quest that is available in the current location + Partial quest info is availabe if: + - It's already completed (i.e. it appears in CompletedQuestInfo()). + - It's an scheduled interval quest (daily, weekly, etc.) + - It's contained in a quest link received from chat + Under any other circumstances, only minimal info can be pulled: + - Its availability to the player + - Its relation with the currently engaged NPC + - Its binary completion status + +]] +--- Global Frames +local Wrapper = _G.VeneerObjectiveWrapper +local Scroller = Wrapper.scrollArea +local Scroll = _G.VeneerObjectiveScroll + +--- list used to make things happen +mod.orderedNames = {[1] = 'AutoQuest', [2] = 'Quest', [3] = 'Cheevs'} + +--- ipairs() list of handlers for wrapper update +mod.orderedHandlers = {} +mod.orderedTrackers = {} +mod.indexedTrackers = {} +--- pairs() list of handler frames for tracker updates +mod.namedTrackers = {} + +--- Handler stubs +mod.AutoQuest = { + name = "AutoQuest" +} +mod.Quest = { + name = "Quest" +} +mod.Cheevs = { + name = "Cheevs" +} + + +--- Temp values set during updates +local wrapperWidth, wrapperHeight +local scrollWidth, scrollHeight +local previousBlock +local currentBlock + +local frame_guide_init = function(self) + self.testU = self.testU or self:CreateTexture('TestU', 'OVERLAY', 'VnTestLine') + self.testB = self.testB or self:CreateTexture('TestB', 'OVERLAY', 'VnTestLine') + self.testL = self.testL or self:CreateTexture('TestL', 'OVERLAY', 'VnTestLine') + self.testR = self.testR or self:CreateTexture('TestR', 'OVERLAY', 'VnTestLine') +end +local frame_guide = function(self, target) + if not target then return end + if target:IsDragging() then return end + local thickness = 1 + local midX, midY = target:GetCenter() + local width, height = target:GetWidth() * 1.5, target:GetHeight() * 1.5 + --print('frame', target:GetLeft(), target:GetTop(), target:GetRight(), target:GetBottom()) + self.testB:ClearAllPoints() + self.testB:SetPoint('TOP', UIParent, 'BOTTOMLEFT', midX, target:GetBottom()) + self.testB:SetSize(width,thickness) + + self.testU:ClearAllPoints() + self.testU:SetPoint('BOTTOM', UIParent, 'BOTTOMLEFT', midX, target:GetTop()) + self.testU:SetSize(width,thickness) + + self.testL:ClearAllPoints() + self.testL:SetPoint('RIGHT', UIParent, 'BOTTOMLEFT', target:GetLeft(), midY) + self.testL:SetSize(thickness,height) + + self.testR:ClearAllPoints() + self.testR:SetPoint('LEFT', UIParent, 'BOTTOMLEFT', target:GetRight(), midY) + self.testR:SetSize(thickness,height) +end + +--- Handler template +local CreateHandler = function (self, name, index) + print(self, name) + local handler = setmetatable({}, { + __tostring = function() return name end, + __call = function (self) mod.UpdateTracker(self) end + }) + if type(mod.orderedHandlers[index]) == 'table' then + return mod.orderedHandlers[index] + end + + print('take up locals first') + local preset = {} + for k,v in pairs(mod[name]) do + preset[k] = true + if type(v) == 'table' then + handler[k] = {} + else + handler[k] = v + end + end + + print('resulting handler contents') + for k, v in pairs(self) do + if not handler[k] then + if type(v) == 'table' then + -- assume all tables to be local data; don't inherit or ref + handler[k] = {} + else + handler[k] = mod.Tracker[k] + end + else + print(name, 'has its own', k) + end + end + print('|cFFFF4400'..tostring(name)..'|r:') + for k, v in pairs(handler) do + print(string.format("%24s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v))) + end + mod[name] = handler + mod.orderedHandlers[index] = handler + return true +end + +mod.Tracker = setmetatable({}, { + __call = CreateHandler, + __tostring = function() return 'DEFAULT_TRACKING_HANDLER' end +}) +local Tracker = mod.Tracker +Tracker.numWatched = 0 --- number of entries being handled +Tracker.numBlocks = 0 --- number of blocks created +Tracker.actualBlocks = 0 --- number of blocks in use + +Tracker.freeBlocks = {} --- block heap +Tracker.usedBlocks = {} + +Tracker.Watched = {} -- find by watchIndex +Tracker.Info = {} -- find by data ID +Tracker.BlockInfo = {} -- find by block ID +Tracker.LogInfo = {} -- find by log ID (quest log mainly) +Tracker.WatchBlock = {} +Tracker.WatchInfo = {} +Tracker.LogBlock = {} + + + +Tracker.GetBlock = function(handler, blockIndex) + local block = handler.usedBlocks[blockIndex] + if not handler.usedBlocks[blockIndex] then + if #handler.freeBlocks >= 1 then + block = handler.freeBlocks[#handler.freeBlocks] + handler.freeBlocks[#handler.freeBlocks] = nil + else + block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, Scroll, 'VeneerTrackerBlock') + block.SetStyle = mod.SetBlockStyle + block:ClearAllPoints() -- making sure the anchors are clear in case they get added for some other template usage + end + + handler.usedBlocks[blockIndex] = block + end + return handler.usedBlocks[blockIndex] +end + +function mod:OnInitialize() + self.InitializeTrackers() + self.InitializeXPTracker() + mod.SetEvents() + ObjectiveTrackerFrame:UnregisterAllEvents() + ObjectiveTrackerFrame:Hide() +end + +--[[ +QUESTLINE_UPDATE This event is not yet documented +QUESTTASK_UPDATE This event is not yet documented +QUEST_ACCEPTED Fires when a new quest is added to the player's quest log (which is what happens after a player accepts a quest). +QUEST_ACCEPT_CONFIRM Fires when certain kinds of quests (e.g. NPC escort quests) are started by another member of the player's group +QUEST_AUTOCOMPLETE Fires when a quest is automatically completed (remote handin available) +QUEST_BOSS_EMOTE This event is not yet documented +QUEST_CHOICE_CLOSE This event is not yet documented +QUEST_CHOICE_UPDATE This event is not yet documented +QUEST_COMPLETE Fires when the player is looking at the "Complete" page for a quest, at a questgiver. +QUEST_DETAIL Fires when details of an available quest are presented by a questgiver +QUEST_FINISHED Fires when the player ends interaction with a questgiver or ends a stage of the questgiver dialog +QUEST_GREETING Fires when a questgiver presents a greeting along with a list of active or available quests +QUEST_ITEM_UPDATE Fires when information about items in a questgiver dialog is updated +QUEST_LOG_UPDATE Fires when the game client receives updates relating to the player's quest log (this event is not just related to the quests inside it) +QUEST_POI_UPDATE This event is not yet documented +QUEST_PROGRESS Fires when interacting with a questgiver about an active quest +QUEST_REMOVED This event is not yet documented +QUEST_TURNED_IN Fired when a quest is turned in +QUEST_WATCH_LIST_CHANGED This event is not yet documented +QUEST_WATCH_OBJECTIVES_CHANGED This event is not yet documented +QUEST_WATCH_UPDATE Fires when the player's status regarding a quest's objectives changes, for instance picking up a required object or killing a mob for that quest. All forms of (quest objective) progress changes will trigger this event.] + +TRACKED_ACHIEVEMENT_LIST_CHANGED This event is not yet documented +TRACKED_ACHIEVEMENT_UPDATE Fires when the player's progress changes on an achievement marked for watching in the objectives tracker + ]] \ No newline at end of file