| 
Nenue@6
 | 
     1 --- Turok - Import.lua
 | 
| 
Nenue@6
 | 
     2 -- @file-author@
 | 
| 
Nenue@6
 | 
     3 -- @project-revision@ @project-hash@
 | 
| 
Nenue@6
 | 
     4 -- @file-revision@ @file-hash@
 | 
| 
Nenue@6
 | 
     5 -- Created: 1/4/2016 11:07 AM
 | 
| 
Nenue@6
 | 
     6 -- Dialog interfaces and framework debugging tools; see the Google Doc
 | 
| 
Nenue@6
 | 
     7 
 | 
| 
Nenue@6
 | 
     8 local tconcat, unpack, pairs, ipairs, tostring, string = table.concat, unpack, pairs, ipairs, tostring, string
 | 
| 
Nenue@6
 | 
     9 local BOOKTYPE_SPELL, GetSpellBookItemName, GetSpellBookItemInfo = BOOKTYPE_SPELL, GetSpellBookItemName, GetSpellBookItemInfo
 | 
| 
Nenue@6
 | 
    10 local GetSpellTabInfo, GetNumSpellTabs, GetSpellInfo, GetFlyoutInfo, GetSpellDescription = GetSpellTabInfo, GetNumSpellTabs, GetSpellInfo, GetFlyoutInfo, GetSpellDescription
 | 
| 
Nenue@6
 | 
    11 local GetFlyoutSlotInfo, GetSpellBaseCooldown, FindSpellBookSlotBySpellID, IsTalentSpell = GetFlyoutSlotInfo, GetSpellBaseCooldown, FindSpellBookSlotBySpellID, IsTalentSpell
 | 
| 
Nenue@6
 | 
    12 local GetNumClasses, GetClassInfo, GetNumSpecializationsForClassID, GetSpecializationInfoForClassID
 | 
| 
Nenue@6
 | 
    13 = GetNumClasses, GetClassInfo, GetNumSpecializationsForClassID, GetSpecializationInfoForClassID
 | 
| 
Nenue@6
 | 
    14 local _G, setmetatable, type, T = _G, setmetatable, type, Turok
 | 
| 
Nenue@6
 | 
    15 local mod = Turok.modules.TimerControl
 | 
| 
Nenue@6
 | 
    16 mod.EditDialog = TkTimerConfig
 | 
| 
Nenue@6
 | 
    17 mod.SelectDialog = {}
 | 
| 
Nenue@6
 | 
    18 
 | 
| 
Nenue@6
 | 
    19 local print = function(...)
 | 
| 
Nenue@6
 | 
    20   if Devian and DevianDB.workspace ~= 1 then
 | 
| 
Nenue@6
 | 
    21     print('Dialog', ...)
 | 
| 
Nenue@6
 | 
    22   end
 | 
| 
Nenue@6
 | 
    23 end
 | 
| 
Nenue@6
 | 
    24 print('Peep!', ...)
 | 
| 
Nenue@6
 | 
    25 local strpad = function(str, num)
 | 
| 
Nenue@6
 | 
    26   return tostring(str) .. string.rep(' ', num - #tostring(str))
 | 
| 
Nenue@6
 | 
    27 end
 | 
| 
Nenue@6
 | 
    28 
 | 
| 
Nenue@6
 | 
    29 --- Handles mouse click on spellbook row frame
 | 
| 
Nenue@6
 | 
    30 mod.SpellBook_Click = function(self, btn)
 | 
| 
Nenue@6
 | 
    31   print('mouse', btn, self.spellID)
 | 
| 
Nenue@6
 | 
    32   mod.Dialog_Select(mod.EditDialog, self.spellID)
 | 
| 
Nenue@6
 | 
    33 end
 | 
| 
Nenue@6
 | 
    34 
 | 
| 
Nenue@6
 | 
    35 --- Creates the spell book import frame
 | 
| 
Nenue@6
 | 
    36 --
 | 
| 
Nenue@6
 | 
    37 local cmd
 | 
| 
Nenue@6
 | 
    38 function mod.Import_Open()
 | 
| 
Nenue@6
 | 
    39   local self = mod
 | 
| 
Nenue@6
 | 
    40   print('Spirit', 'SpecSpells')
 | 
| 
Nenue@6
 | 
    41   local book_list = {}
 | 
| 
Nenue@6
 | 
    42   local tab = {}
 | 
| 
Nenue@6
 | 
    43   local list_info = {}
 | 
| 
Nenue@6
 | 
    44   local book_max = 0
 | 
| 
Nenue@6
 | 
    45   for k = 1, GetNumSpellTabs() do
 | 
| 
Nenue@6
 | 
    46     local name, texture, offset, numSpells = GetSpellTabInfo(k)
 | 
| 
Nenue@6
 | 
    47     tab[offset] = {k, name, texture, numSpells}
 | 
| 
Nenue@6
 | 
    48     print('Spirit', name, offset, numSpells)
 | 
| 
Nenue@6
 | 
    49     book_max = offset + numSpells
 | 
| 
Nenue@6
 | 
    50   end
 | 
| 
Nenue@6
 | 
    51   local tabID, tabName, tabTexture
 | 
| 
Nenue@6
 | 
    52   local flyout, spellflyout = {}, {}
 | 
| 
Nenue@6
 | 
    53   for i = 1, book_max do
 | 
| 
Nenue@6
 | 
    54     if tab[i] then
 | 
| 
Nenue@6
 | 
    55       tabID, tabName, tabTexture = unpack(tab[i])
 | 
| 
Nenue@6
 | 
    56     end
 | 
| 
Nenue@6
 | 
    57 
 | 
| 
Nenue@6
 | 
    58     if book_list[i] == nil then
 | 
| 
Nenue@6
 | 
    59       local skillType, spellID = GetSpellBookItemInfo(i, BOOKTYPE_SPELL)
 | 
| 
Nenue@6
 | 
    60       local spellNameUpper, spellSubText = GetSpellBookItemName(i, BOOKTYPE_SPELL)
 | 
| 
Nenue@6
 | 
    61       local spellName, spellRank, spellTexture, castTime, minRange, maxRange = GetSpellInfo(spellID)
 | 
| 
Nenue@6
 | 
    62       _G.print('Spirit', i, spellID, spellName)
 | 
| 
Nenue@6
 | 
    63       _G.print('Spirit', '  ', skillType, spellSubText)
 | 
| 
Nenue@6
 | 
    64 
 | 
| 
Nenue@6
 | 
    65       local spellDesc
 | 
| 
Nenue@6
 | 
    66       if skillType == 'FLYOUT' then
 | 
| 
Nenue@6
 | 
    67         local numSlots
 | 
| 
Nenue@6
 | 
    68         spellName, spellDesc, numSlots = GetFlyoutInfo(spellID)
 | 
| 
Nenue@6
 | 
    69         print('flyout #'..spellID..':', spellName)
 | 
| 
Nenue@6
 | 
    70         flyout[spellID] = {}
 | 
| 
Nenue@6
 | 
    71         for i=1, numSlots do
 | 
| 
Nenue@6
 | 
    72           local fspellID, _, isKnown, fSpellName, fSpellValue = GetFlyoutSlotInfo(spellID, i)
 | 
| 
Nenue@6
 | 
    73           print('  spell #', fspellID, fSpellName, isKnown)
 | 
| 
Nenue@6
 | 
    74           if isKnown then
 | 
| 
Nenue@6
 | 
    75           flyout[spellID][i] = fspellID
 | 
| 
Nenue@6
 | 
    76           spellflyout[fspellID] = spellID
 | 
| 
Nenue@6
 | 
    77           end
 | 
| 
Nenue@6
 | 
    78         end
 | 
| 
Nenue@6
 | 
    79 
 | 
| 
Nenue@6
 | 
    80       else
 | 
| 
Nenue@6
 | 
    81         spellDesc = GetSpellDescription(spellID)
 | 
| 
Nenue@6
 | 
    82       end
 | 
| 
Nenue@6
 | 
    83 
 | 
| 
Nenue@6
 | 
    84       book_list[i] = {
 | 
| 
Nenue@6
 | 
    85         skillType = skillType,
 | 
| 
Nenue@6
 | 
    86         spellIndex = i,
 | 
| 
Nenue@6
 | 
    87         spellID = spellID,
 | 
| 
Nenue@6
 | 
    88         spellName = spellName,
 | 
| 
Nenue@6
 | 
    89         spellDesc = spellDesc,
 | 
| 
Nenue@6
 | 
    90         spellNameUpper = spellNameUpper,
 | 
| 
Nenue@6
 | 
    91         spellSubText = spellSubText,
 | 
| 
Nenue@6
 | 
    92         spellTexture = spellTexture,
 | 
| 
Nenue@6
 | 
    93         spellCooldown = GetSpellBaseCooldown(spellID),
 | 
| 
Nenue@6
 | 
    94         castTime = castTime,
 | 
| 
Nenue@6
 | 
    95         minRange = minRange,
 | 
| 
Nenue@6
 | 
    96         maxRange = maxRange,
 | 
| 
Nenue@6
 | 
    97         tabID = tabID,
 | 
| 
Nenue@6
 | 
    98         tabName = tabName,
 | 
| 
Nenue@6
 | 
    99         tabTexture = tabTexture
 | 
| 
Nenue@6
 | 
   100       }
 | 
| 
Nenue@6
 | 
   101 
 | 
| 
Nenue@6
 | 
   102 
 | 
| 
Nenue@6
 | 
   103 
 | 
| 
Nenue@6
 | 
   104       end
 | 
| 
Nenue@6
 | 
   105   end
 | 
| 
Nenue@6
 | 
   106 
 | 
| 
Nenue@6
 | 
   107   local selector = CreateFrame('Frame', 'TkSpellSelector', UIParent, 'TurokListFrame')
 | 
| 
Nenue@6
 | 
   108   self.frames.selector = selector
 | 
| 
Nenue@6
 | 
   109   selector.name:SetText("Spells")
 | 
| 
Nenue@6
 | 
   110   selector:SetPoint('TOP')
 | 
| 
Nenue@6
 | 
   111   selector.page = 1
 | 
| 
Nenue@6
 | 
   112 
 | 
| 
Nenue@6
 | 
   113   selector.GetRow = function(row, info, id, item_num)
 | 
| 
Nenue@6
 | 
   114     print('  ', row:GetName(), info, id, item_num)
 | 
| 
Nenue@6
 | 
   115     if not row.opts then
 | 
| 
Nenue@6
 | 
   116       row.opts = {
 | 
| 
Nenue@6
 | 
   117         CreateFrame('CheckButton', 'TkCheck_'..item_num, row, 'TurokCheckButtonInline'),
 | 
| 
Nenue@6
 | 
   118         row:CreateFontString('TextItem_'..item_num, 'OVERLAY', 'TurokFontDetail'),
 | 
| 
Nenue@6
 | 
   119         row:CreateTexture(nil, 'OVERLAY'),
 | 
| 
Nenue@6
 | 
   120         row:CreateTexture(nil, 'OVERLAY'),
 | 
| 
Nenue@6
 | 
   121         row:CreateFontString('TextItem_'..item_num..'ID', 'OVERLAY', 'TurokFontDetail'),
 | 
| 
Nenue@6
 | 
   122       }
 | 
| 
Nenue@6
 | 
   123     end
 | 
| 
Nenue@6
 | 
   124     local page = book_list[id]
 | 
| 
Nenue@6
 | 
   125     if page.skillType == 'FLYOUT' then
 | 
| 
Nenue@6
 | 
   126       row.background:SetTexture(1,.2,.3,.4)
 | 
| 
Nenue@6
 | 
   127 
 | 
| 
Nenue@6
 | 
   128     elseif rawget(mod.frames.spellID, page.spellID) then
 | 
| 
Nenue@6
 | 
   129       print('has timer frame under spell #', page.spellID, mod.frames.spellID[page.spellID])
 | 
| 
Nenue@6
 | 
   130        row.background:SetTexture(1,1,0,1)
 | 
| 
Nenue@6
 | 
   131       local timer = mod.frames.spellID[page.spellID]
 | 
| 
Nenue@6
 | 
   132       row:SetScript('OnMouseDown', function(self) self.clicked = true end)
 | 
| 
Nenue@6
 | 
   133       row:SetScript('OnMouseUp', function(self) if self.clicked then self.clicked = nil mod.Dialog_Select(mod.Editor, timer.timerName) end end)
 | 
| 
Nenue@6
 | 
   134     elseif page.spellCooldown and page.spellCooldown > 0 then
 | 
| 
Nenue@6
 | 
   135         row.background:SetTexture(.3,.6,1,1)
 | 
| 
Nenue@6
 | 
   136     else
 | 
| 
Nenue@6
 | 
   137         row.background:SetTexture(0,0,0,0.3)
 | 
| 
Nenue@6
 | 
   138     end
 | 
| 
Nenue@6
 | 
   139 
 | 
| 
Nenue@6
 | 
   140     row:SetScript('OnMouseDown', mod.SpellBook_Click)
 | 
| 
Nenue@6
 | 
   141 
 | 
| 
Nenue@6
 | 
   142     row.desc = page.spellDesc
 | 
| 
Nenue@6
 | 
   143     row.spellID = page.spellID
 | 
| 
Nenue@6
 | 
   144     row.opts[1].desc = page.skillType
 | 
| 
Nenue@6
 | 
   145     row.opts[1]:SetSize(20,20)
 | 
| 
Nenue@6
 | 
   146     row.opts[1].description:SetText(nil)
 | 
| 
Nenue@6
 | 
   147     row.opts[1]:SetChecked(page.checked)
 | 
| 
Nenue@6
 | 
   148     row.opts[2]:SetText(page.spellName)
 | 
| 
Nenue@6
 | 
   149     row.opts[2]:SetWidth(200)
 | 
| 
Nenue@6
 | 
   150     row.opts[2]:SetJustifyH('LEFT')
 | 
| 
Nenue@6
 | 
   151     row.opts[3]:SetSize(20,20)
 | 
| 
Nenue@6
 | 
   152     row.opts[3]:SetTexture(page.spellTexture)
 | 
| 
Nenue@6
 | 
   153     row.opts[3]:SetPoint('CENTER')
 | 
| 
Nenue@6
 | 
   154     row.opts[4]:SetSize(20,20)
 | 
| 
Nenue@6
 | 
   155     row.opts[4]:SetTexture(page.tabTexture)
 | 
| 
Nenue@6
 | 
   156     row.opts[4]:SetPoint('CENTER')
 | 
| 
Nenue@6
 | 
   157     row.opts[5]:SetWidth(60)
 | 
| 
Nenue@6
 | 
   158     row.opts[5]:SetJustifyH('LEFT')
 | 
| 
Nenue@6
 | 
   159     row.opts[5]:SetText(page.spellID)
 | 
| 
Nenue@6
 | 
   160   end
 | 
| 
Nenue@6
 | 
   161 
 | 
| 
Nenue@6
 | 
   162   selector.Click = function(button, list)
 | 
| 
Nenue@6
 | 
   163     local b = button:GetName():match("_(%a+)$")
 | 
| 
Nenue@6
 | 
   164     if b == 'Prev' then
 | 
| 
Nenue@6
 | 
   165       --print(b, list.offset, list.num_rows)
 | 
| 
Nenue@6
 | 
   166       if list.page > 1 then
 | 
| 
Nenue@6
 | 
   167         list.page = list.page - 1
 | 
| 
Nenue@6
 | 
   168         TkList_SetView(list, list.num_rows * (list.page-1) + 1)
 | 
| 
Nenue@6
 | 
   169       end
 | 
| 
Nenue@6
 | 
   170       list.pagenum:SetText(list.page)
 | 
| 
Nenue@6
 | 
   171     elseif b == 'Next' then
 | 
| 
Nenue@6
 | 
   172       --print(' ',list.page, list.num_rows, list.max_row)
 | 
| 
Nenue@6
 | 
   173       if (list.page) * list.num_rows < list.max_row then
 | 
| 
Nenue@6
 | 
   174         list.page = list.page + 1
 | 
| 
Nenue@6
 | 
   175         TkList_SetView(list, list.offset + list.num_rows)
 | 
| 
Nenue@6
 | 
   176       end
 | 
| 
Nenue@6
 | 
   177       list.pagenum:SetText(list.page)
 | 
| 
Nenue@6
 | 
   178 
 | 
| 
Nenue@6
 | 
   179     elseif b == 'Add' then
 | 
| 
Nenue@6
 | 
   180       mod.CommitBook(book_list, tab, list_info)
 | 
| 
Nenue@6
 | 
   181     end
 | 
| 
Nenue@6
 | 
   182     --print(list.page, list.offset, list.num_rows)
 | 
| 
Nenue@6
 | 
   183   end
 | 
| 
Nenue@6
 | 
   184 
 | 
| 
Nenue@6
 | 
   185   selector.Wheel = function(self, delta)
 | 
| 
Nenue@6
 | 
   186     local offset = self.offset - delta
 | 
| 
Nenue@6
 | 
   187     if offset > 0 and offset <= (self.max_row - self.num_rows) then
 | 
| 
Nenue@6
 | 
   188       TkList_SetView(self, offset)
 | 
| 
Nenue@6
 | 
   189     end
 | 
| 
Nenue@6
 | 
   190   end
 | 
| 
Nenue@6
 | 
   191 
 | 
| 
Nenue@6
 | 
   192   selector.Check = function(checkbutton, row, list)
 | 
| 
Nenue@6
 | 
   193     local index = checkbutton:GetParent().actual_row
 | 
| 
Nenue@6
 | 
   194     book_list[index].checked = (not book_list[index].checked) and true or false
 | 
| 
Nenue@6
 | 
   195     checkbutton:SetChecked(book_list[index].checked)
 | 
| 
Nenue@6
 | 
   196 
 | 
| 
Nenue@6
 | 
   197     if book_list[index].skillType == 'FLYOUT' then
 | 
| 
Nenue@6
 | 
   198       for slot, spellID in pairs(flyout[book_list[index].spellID]) do
 | 
| 
Nenue@6
 | 
   199 
 | 
| 
Nenue@6
 | 
   200         local spIndex = FindSpellBookSlotBySpellID(spellID)
 | 
| 
Nenue@6
 | 
   201         print('  also toggling', slot, spellID, ' book slot', spIndex, book_list[spIndex].spellName)
 | 
| 
Nenue@6
 | 
   202         book_list[spIndex].checked = book_list[index].checked
 | 
| 
Nenue@6
 | 
   203       end
 | 
| 
Nenue@6
 | 
   204       TkList_SetView(list, list.offset)
 | 
| 
Nenue@6
 | 
   205     end
 | 
| 
Nenue@6
 | 
   206   end
 | 
| 
Nenue@6
 | 
   207   TkList_Init(selector, book_list, 1, 12)
 | 
| 
Nenue@6
 | 
   208   selector:Show()
 | 
| 
Nenue@6
 | 
   209   mod.SelectDialog = selector
 | 
| 
Nenue@6
 | 
   210 end
 | 
| 
Nenue@6
 | 
   211 --@end-debug@
 | 
| 
Nenue@6
 | 
   212 
 | 
| 
Nenue@6
 | 
   213 
 | 
| 
Nenue@6
 | 
   214 function mod.CommitBook(bookInfo, tabInfo, uiInfo)
 | 
| 
Nenue@6
 | 
   215   print('committing')
 | 
| 
Nenue@6
 | 
   216   print('  book data: ', #bookInfo, 'entries')
 | 
| 
Nenue@6
 | 
   217   print('  tab data: ', #tabInfo, 'entries')
 | 
| 
Nenue@6
 | 
   218 
 | 
| 
Nenue@6
 | 
   219   for index, e in ipairs(bookInfo) do
 | 
| 
Nenue@6
 | 
   220     if e.checked then
 | 
| 
Nenue@6
 | 
   221       local spellPretext = ''
 | 
| 
Nenue@6
 | 
   222       if IsTalentSpell(index) then
 | 
| 
Nenue@6
 | 
   223         spellPretext = 'Talent'
 | 
| 
Nenue@6
 | 
   224       end
 | 
| 
Nenue@6
 | 
   225         print('   ', strpad(spellPretext .. e.spellName, 20))
 | 
| 
Nenue@6
 | 
   226         print('   ', strpad(e.spellSubText, 10), strpad(e.spellCooldown,5), strpad(e.skillType,6))
 | 
| 
Nenue@6
 | 
   227 
 | 
| 
Nenue@6
 | 
   228     end
 | 
| 
Nenue@6
 | 
   229   end
 | 
| 
Nenue@6
 | 
   230 end
 | 
| 
Nenue@6
 | 
   231 
 | 
| 
Nenue@6
 | 
   232 
 | 
| 
Nenue@6
 | 
   233 
 | 
| 
Nenue@6
 | 
   234 
 | 
| 
Nenue@6
 | 
   235 --- /tki command
 | 
| 
Nenue@6
 | 
   236 -- Constructs an index that associates global spec ID's with a list of the timers that would display under it.
 | 
| 
Nenue@6
 | 
   237 -- List entries are stored as [name] = true to prevent duplication of values in SavedVariables.
 | 
| 
Nenue@6
 | 
   238 
 | 
| 
Nenue@6
 | 
   239 function mod:CreateIndex()
 | 
| 
Nenue@6
 | 
   240 
 | 
| 
Nenue@6
 | 
   241   --@debug@ Revert config to defaults
 | 
| 
Nenue@6
 | 
   242   _G.TurokData = T.defaults
 | 
| 
Nenue@6
 | 
   243   --@end-debug@
 | 
| 
Nenue@6
 | 
   244 
 | 
| 
Nenue@6
 | 
   245   mod.db.timerindex = {}
 | 
| 
Nenue@6
 | 
   246   setmetatable(mod.db.timerindex, {__mode = "v"}) -- ensure that dead leafs fall off
 | 
| 
Nenue@6
 | 
   247   local index = mod.index
 | 
| 
Nenue@6
 | 
   248   local timers = mod.timersByName
 | 
| 
Nenue@6
 | 
   249 
 | 
| 
Nenue@6
 | 
   250   -- build class info hash and create subtables
 | 
| 
Nenue@6
 | 
   251   local classID = {}
 | 
| 
Nenue@6
 | 
   252   local className = {}
 | 
| 
Nenue@6
 | 
   253   local specIDPage = {}
 | 
| 
Nenue@6
 | 
   254   local specPageID = {}
 | 
| 
Nenue@6
 | 
   255   local classSpecs = {}
 | 
| 
Nenue@6
 | 
   256   print('|cFF0088FFCreateIndex|r')
 | 
| 
Nenue@6
 | 
   257 
 | 
| 
Nenue@6
 | 
   258   --- use the internal class/specialization list
 | 
| 
Nenue@6
 | 
   259   for i = 1, GetNumClasses() do
 | 
| 
Nenue@6
 | 
   260     local _, tag, id = GetClassInfo(i)
 | 
| 
Nenue@6
 | 
   261     classID[tag] = id
 | 
| 
Nenue@6
 | 
   262     className[id] = tag
 | 
| 
Nenue@6
 | 
   263     index[id] = {}
 | 
| 
Nenue@6
 | 
   264     specPageID[tag] = {}
 | 
| 
Nenue@6
 | 
   265     index[tag] = index[id]
 | 
| 
Nenue@6
 | 
   266 
 | 
| 
Nenue@6
 | 
   267     classSpecs[tag] = GetNumSpecializationsForClassID(id)
 | 
| 
Nenue@6
 | 
   268     for j = 1, classSpecs[tag] do
 | 
| 
Nenue@6
 | 
   269       local specID, specName = GetSpecializationInfoForClassID(id, j)
 | 
| 
Nenue@6
 | 
   270       print('|cFFFF0088map:|r', tag, j, specID, specName)
 | 
| 
Nenue@6
 | 
   271       specIDPage[specID] = j
 | 
| 
Nenue@6
 | 
   272       specPageID[tag][j] = specID
 | 
| 
Nenue@6
 | 
   273       index[specID] = {}
 | 
| 
Nenue@6
 | 
   274       index[id][j] = {}
 | 
| 
Nenue@6
 | 
   275     end
 | 
| 
Nenue@6
 | 
   276   end
 | 
| 
Nenue@6
 | 
   277   index.global = {}
 | 
| 
Nenue@6
 | 
   278 
 | 
| 
Nenue@6
 | 
   279   for name,timer in pairs(timers) do
 | 
| 
Nenue@6
 | 
   280     -- class is set
 | 
| 
Nenue@6
 | 
   281     if type(timer) == 'table' then
 | 
| 
Nenue@6
 | 
   282       print(name)
 | 
| 
Nenue@6
 | 
   283       if timer.playerClass then
 | 
| 
Nenue@6
 | 
   284 
 | 
| 
Nenue@6
 | 
   285         index[timer.playerClass][name] = true
 | 
| 
Nenue@6
 | 
   286 
 | 
| 
Nenue@6
 | 
   287         -- spec restricted
 | 
| 
Nenue@6
 | 
   288         if timer.specPage then
 | 
| 
Nenue@6
 | 
   289           if type(timer.specPage) ~= 'table' then
 | 
| 
Nenue@6
 | 
   290             -- fix it up
 | 
| 
Nenue@6
 | 
   291             timer.specPage = {timer.specPage }
 | 
| 
Nenue@6
 | 
   292           end
 | 
| 
Nenue@6
 | 
   293 
 | 
| 
Nenue@6
 | 
   294           print('  |cFFFFFF00class:|r', timer.playerClass .. ', |cFF99FF00spec:|r '.. tconcat(timer.specPage,', '))
 | 
| 
Nenue@6
 | 
   295           for _, specPage in ipairs(timer.specPage) do
 | 
| 
Nenue@6
 | 
   296             index[timer.playerClass][specPage][name] = true
 | 
| 
Nenue@6
 | 
   297             index[specPageID[timer.playerClass][specPage]][name] = true
 | 
| 
Nenue@6
 | 
   298           end
 | 
| 
Nenue@6
 | 
   299 
 | 
| 
Nenue@6
 | 
   300           -- no spec restriction, copy it out
 | 
| 
Nenue@6
 | 
   301         elseif not timer.specID then
 | 
| 
Nenue@6
 | 
   302           print('  |cFFFFFF00class:|r', timer.playerClass .. ', |cFF99FF00spec:|r ALL')
 | 
| 
Nenue@6
 | 
   303           for i = 1, classSpecs[timer.playerClass] do
 | 
| 
Nenue@6
 | 
   304             local specID = specPageID[timer.playerClass][i]
 | 
| 
Nenue@6
 | 
   305 
 | 
| 
Nenue@6
 | 
   306             index[timer.playerClass][i][name] = true             -- store for local ID
 | 
| 
Nenue@6
 | 
   307             index[specID][name] = true -- store for global ID
 | 
| 
Nenue@6
 | 
   308           end
 | 
| 
Nenue@6
 | 
   309         end
 | 
| 
Nenue@6
 | 
   310       end
 | 
| 
Nenue@6
 | 
   311 
 | 
| 
Nenue@6
 | 
   312       if timer.specID then
 | 
| 
Nenue@6
 | 
   313         index[timer.specID][name] = true
 | 
| 
Nenue@6
 | 
   314       end
 | 
| 
Nenue@6
 | 
   315 
 | 
| 
Nenue@6
 | 
   316       if not (timer.playerClass or timer.specID or timer.specPage) then
 | 
| 
Nenue@6
 | 
   317         for tag, id in pairs(classID) do
 | 
| 
Nenue@6
 | 
   318           index[tag][name] = true
 | 
| 
Nenue@6
 | 
   319           for specPage, specID in pairs(specPageID[tag]) do
 | 
| 
Nenue@6
 | 
   320             index[tag][specPage][name] = true
 | 
| 
Nenue@6
 | 
   321             index[specID][name] = true
 | 
| 
Nenue@6
 | 
   322           end
 | 
| 
Nenue@6
 | 
   323         end
 | 
| 
Nenue@6
 | 
   324         print('  |cFFFFFF00class:|r ALL, |cFF99FF00spec:|r ALL')
 | 
| 
Nenue@6
 | 
   325       end
 | 
| 
Nenue@6
 | 
   326     end
 | 
| 
Nenue@6
 | 
   327   end
 | 
| 
Nenue@6
 | 
   328 
 | 
| 
Nenue@6
 | 
   329   _G.TurokData.timerindex = index
 | 
| 
Nenue@6
 | 
   330   T:Print('Hive data updated. /rl to commit.')
 | 
| 
Nenue@6
 | 
   331 end
 |