diff ObjectiveTracker/ObjectiveTracker.lua @ 37:e84d645c8ab8

- revised the tracker update function to build its complete data list up front and use the values as points of comparison for determining possible out of place blocks, which will be iterated over afterward to remove what wasn't re-used - also entailed revising the exact role of global event handlers and function hooks, limiting their directions of communication so one doesn't end up calling the other multiple or inifinity times - schema handling polish
author Nenue
date Mon, 18 Apr 2016 07:56:23 -0400
parents 69d03f8e293e
children 1f8f9cc3d956
line wrap: on
line diff
--- a/ObjectiveTracker/ObjectiveTracker.lua	Sun Apr 17 13:00:31 2016 -0400
+++ b/ObjectiveTracker/ObjectiveTracker.lua	Mon Apr 18 07:56:23 2016 -0400
@@ -126,8 +126,10 @@
   freeBlocks = {},  --- blocks hidden due to list shrinkage
   usedBlocks = {},  --- block in use
   BlockInfo = {},   --- by block creation offset, used by framescript
+  WatchList = {},   --- ordered manifest of watched items
 
   --- Indexes
+  InfoBlock = {},   --- by unique ID
   LogBlock = {},    --- by API log offset, used by GetBlock if possible
   WatchBlock = {},  --- block by internal offset, used in GetBlock scope
   WatchInfo = {},   --- info by internal offset, used in Update scope
@@ -154,6 +156,7 @@
 T.Cheevs = {
   name = "Cheevs",
   displayName = "Achievements",
+  schema = 'achievement',
   updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT,
   updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT +
       OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED,
@@ -258,12 +261,12 @@
 end
 
 Event.QUEST_WATCH_LIST_CHANGED = function(questID, added)
-  if ( added ) then
+  if ( added == true ) then
     if ( not IsQuestTask(questID) ) then
       return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
     end
-  else
-    return OBJECTIVE_TRACKER_UPDATE_QUEST, questID, added
+  elseif questID then
+    return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
   end
 end
 
@@ -274,8 +277,8 @@
   end
   return OBJECTIVE_TRACKER_UPDATE_ALL
 end
-Event.SUPER_TRACKED_QUEST_CHANGED = function()
-  return OBJECTIVE_TRACKER_UPDATE_QUEST
+Event.SUPER_TRACKED_QUEST_CHANGED = function(questID)
+  return OBJECTIVE_TRACKER_UPDATE_QUEST, questID
 end
 Event.ZONE_CHANGED = function()
   local inMicroDungeon = IsPlayerInMicroDungeon();
@@ -306,11 +309,7 @@
   return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
 end
 Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added)
-  if ( added ) then
-    return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID
-  else
-    return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
-  end
+  return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID, added
 end
 Event.ZONE_CHANGED_NEW_AREA = function ()
   if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
@@ -452,38 +451,26 @@
 
 local Play = function(file) if Devian and Devian.InWorkspace() then PlaySoundFile(file) end end
 
+local tprint = B.print('Tracker')
 T.OnHookedFunc = function(name, ...)
-  print('|cFFFF8800securehook:|r', name, '|cFF00FFFFargs:|r', ...)
-  local updateReason = T[name](...)
+  tprint('|cFFFF8800securehook:|r', name, '|cFF00FFFFargs:|r', ...)
+  local updateReason, arg1, arg2, arg3 = T[name](...)
   if updateReason then
-    print('|cFF00FFFFupdate reason:|r', updateReason)
-    T:Update(updateReason)
+    print('|cFF00FFFFupdate reason:|r', updateReason, arg1, arg2, arg3)
+    T:Update(updateReason, arg1, arg2, arg3)
   end
 end
 
 function T:OnEvent (event, ...)
   local isHandled
-  print('OnEvent(|cFF00FF00'.. event ..'|r):', ...)
+  tprint('OnEvent(|cFF00FF00'.. event ..'|r):', ...)
   local reason, arg1, arg2, arg3
   if Event[event] then
     if type(Event[event]) == 'function' then
       Play([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]])
       reason, arg1, arg2, arg3 = Event[event](...)
-    elseif type(Event[event]) == 'table' then
-      Play([[Interface\Addons\SharedMedia_MyMedia\sound\Link.ogg]])
-      for i, action in ipairs(Event[event]) do
-        if type(action) == 'function' then
-          reason, arg1, arg2, arg3 = action(event, ...)
-        else
-          reason = action
-        end
-
-        if reason then
-          T:Update(reason, arg1, arg2, arg3)
-        end
-      end
     else
-      --Play([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]])
+      Play([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]])
       reason = Event[event]
     end
   else