| 
Nenue@6
 | 
     1 --- Turok - Aura.lua
 | 
| 
Nenue@6
 | 
     2 -- @file-author@
 | 
| 
Nenue@6
 | 
     3 -- @project-revision@ @project-hash@
 | 
| 
Nenue@6
 | 
     4 -- @file-revision@ @file-hash@
 | 
| 
Nenue@6
 | 
     5 -- Created: 12/25/2015 5:58 AM
 | 
| 
Nenue@6
 | 
     6 -- Aura data collection
 | 
| 
Nenue@6
 | 
     7 local GetTime, UnitAura, GetSpellDescription, GetSpellInfo = GetTime, UnitAura, GetSpellDescription, GetSpellInfo
 | 
| 
Nenue@6
 | 
     8 local T, _G, tinsert = Turok, _G, tinsert
 | 
| 
Nenue@6
 | 
     9 local mod = T:GetModule("TimerControl")
 | 
| 
Nenue@6
 | 
    10 
 | 
| 
Nenue@6
 | 
    11 --@debug@
 | 
| 
Nenue@6
 | 
    12 local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool
 | 
| 
Nenue@6
 | 
    13 local print = function(...)
 | 
| 
Nenue@6
 | 
    14   if _G.Devian and _G.DevianDB.workspace ~= 1 then
 | 
| 
Nenue@6
 | 
    15     _G.print('Aura', ...)
 | 
| 
Nenue@6
 | 
    16   end
 | 
| 
Nenue@6
 | 
    17 end
 | 
| 
Nenue@6
 | 
    18 print('Peep!', ...)
 | 
| 
Nenue@6
 | 
    19 --@end-debug@
 | 
| 
Nenue@6
 | 
    20 
 | 
| 
Nenue@6
 | 
    21 T.defaults.spirit.aura = {
 | 
| 
Nenue@6
 | 
    22   counterText = "%p",
 | 
| 
Nenue@6
 | 
    23   subCounterText = "%.p",
 | 
| 
Nenue@6
 | 
    24   chargesText = "%s",
 | 
| 
Nenue@6
 | 
    25   justifyH = 'CENTER',
 | 
| 
Nenue@6
 | 
    26   justifyV = 'TOP',
 | 
| 
Nenue@6
 | 
    27   leftText = "%p",
 | 
| 
Nenue@6
 | 
    28   rightText = "%n",
 | 
| 
Nenue@6
 | 
    29 
 | 
| 
Nenue@6
 | 
    30   passive = {
 | 
| 
Nenue@6
 | 
    31     icon = {
 | 
| 
Nenue@6
 | 
    32       desaturated = false,
 | 
| 
Nenue@6
 | 
    33       color = {1, 1, 1, 1},
 | 
| 
Nenue@6
 | 
    34       blend = 'BLEND'
 | 
| 
Nenue@6
 | 
    35     }
 | 
| 
Nenue@6
 | 
    36   },
 | 
| 
Nenue@6
 | 
    37   active = {
 | 
| 
Nenue@6
 | 
    38     icon = {
 | 
| 
Nenue@6
 | 
    39       desaturated = false,
 | 
| 
Nenue@6
 | 
    40       color = {1, 1, 1, 1},
 | 
| 
Nenue@6
 | 
    41       blend = 'BLEND'
 | 
| 
Nenue@6
 | 
    42     }
 | 
| 
Nenue@6
 | 
    43   },
 | 
| 
Nenue@6
 | 
    44 }
 | 
| 
Nenue@6
 | 
    45 
 | 
| 
Nenue@6
 | 
    46 local p = mod.prototype.trigger.aura
 | 
| 
Nenue@6
 | 
    47 p.class  = 'trigger'             -- identifier values that are visible from function scope
 | 
| 
Nenue@6
 | 
    48 p.type   = 'aura'
 | 
| 
Nenue@6
 | 
    49 p.cvars = { -- only define things that could break the frame here
 | 
| 
Nenue@6
 | 
    50 }
 | 
| 
Nenue@6
 | 
    51 p.events = {
 | 
| 
Nenue@6
 | 
    52   ['UNIT_AURA'] = true,
 | 
| 
Nenue@6
 | 
    53 }
 | 
| 
Nenue@6
 | 
    54 
 | 
| 
Nenue@6
 | 
    55 --- takes user supplied values or fills itself with the cvar values provided
 | 
| 
Nenue@6
 | 
    56 p.Init = function(self, auraName, auraFilters, auraUnit)
 | 
| 
Nenue@6
 | 
    57 
 | 
| 
Nenue@6
 | 
    58   _G.print('Prototype', 'Aura.Init')
 | 
| 
Nenue@6
 | 
    59   self.unit = auraUnit and auraUnit or self.dvars.unit
 | 
| 
Nenue@6
 | 
    60   self.spellName = auraName and auraName or self.spellName
 | 
| 
Nenue@6
 | 
    61   self.filters = auraFilters and auraFilters or self.dvars.filters
 | 
| 
Nenue@6
 | 
    62   -- set inversion states, states 0 and 1 are only processed when prevState differs
 | 
| 
Nenue@6
 | 
    63   if self.cvars.inverse then
 | 
| 
Nenue@6
 | 
    64     self.flags = {
 | 
| 
Nenue@6
 | 
    65       active = 0,
 | 
| 
Nenue@6
 | 
    66       active_prev = 2,
 | 
| 
Nenue@6
 | 
    67       passive = 0,
 | 
| 
Nenue@6
 | 
    68       passive_prev = 1,
 | 
| 
Nenue@6
 | 
    69       hidden = 1,
 | 
| 
Nenue@6
 | 
    70       hidden_prev = 0,
 | 
| 
Nenue@6
 | 
    71     }
 | 
| 
Nenue@6
 | 
    72     self.duration = 1
 | 
| 
Nenue@6
 | 
    73     self.expires = 1
 | 
| 
Nenue@6
 | 
    74   else
 | 
| 
Nenue@6
 | 
    75     self.flags = {
 | 
| 
Nenue@6
 | 
    76       active = 2,
 | 
| 
Nenue@6
 | 
    77       active_prev = 0,
 | 
| 
Nenue@6
 | 
    78       passive = 1,
 | 
| 
Nenue@6
 | 
    79       passive_prev = 0,
 | 
| 
Nenue@6
 | 
    80       hidden = 0,
 | 
| 
Nenue@6
 | 
    81       hidden_prev = 1}
 | 
| 
Nenue@6
 | 
    82   end
 | 
| 
Nenue@6
 | 
    83   print(cWord('Load:'),cNum(self.spellID or self.inventoryID or self.itemID), cText(self.spellName))
 | 
| 
Nenue@6
 | 
    84 end
 | 
| 
Nenue@6
 | 
    85 
 | 
| 
Nenue@6
 | 
    86 p.Unload = function(self)
 | 
| 
Nenue@6
 | 
    87   print('unloading events')
 | 
| 
Nenue@6
 | 
    88   for k,v in pairs(p.events) do
 | 
| 
Nenue@6
 | 
    89     self:UnregisterEvent(k)
 | 
| 
Nenue@6
 | 
    90   end
 | 
| 
Nenue@6
 | 
    91 end
 | 
| 
Nenue@6
 | 
    92 
 | 
| 
Nenue@6
 | 
    93 --- Return current status data
 | 
| 
Nenue@6
 | 
    94 p.Query = function(self)
 | 
| 
Nenue@6
 | 
    95   print( '    Q:', self.unit , self.spellName, nil, self.filters)
 | 
| 
Nenue@6
 | 
    96   return UnitAura(self.unit , self.spellName, nil, self.filters)
 | 
| 
Nenue@6
 | 
    97 end
 | 
| 
Nenue@6
 | 
    98 
 | 
| 
Nenue@6
 | 
    99 p.SetText = mod.SetText
 | 
| 
Nenue@6
 | 
   100 
 | 
| 
Nenue@6
 | 
   101 --- Set supplied status data, using the list returned by p.Query()
 | 
| 
Nenue@6
 | 
   102 p.Set = function(self, ...)
 | 
| 
Nenue@6
 | 
   103   self.active, self.rank, _, self.count, self.dispelType, self.duration, self.expires, self.caster,
 | 
| 
Nenue@6
 | 
   104   self.isStealable, self.shouldConsolidate, self.spellID, self.canApplyAura, self.isBossDebuff = ...
 | 
| 
Nenue@6
 | 
   105   if self.active then
 | 
| 
Nenue@6
 | 
   106     if self.cvars.duration then
 | 
| 
Nenue@6
 | 
   107       self.duration = self.cvars.duration
 | 
| 
Nenue@6
 | 
   108       print(cKey('force duration ='), cNum(self.cvars.duration))
 | 
| 
Nenue@6
 | 
   109     end
 | 
| 
Nenue@6
 | 
   110     self.start = self.expires - self.duration
 | 
| 
Nenue@6
 | 
   111   end
 | 
| 
Nenue@6
 | 
   112 end
 | 
| 
Nenue@6
 | 
   113 
 | 
| 
Nenue@6
 | 
   114 --- Handle in the frame itself to limit collateral from bugs
 | 
| 
Nenue@6
 | 
   115 function p.Event(self, event, unit)
 | 
| 
Nenue@6
 | 
   116   self.event = event
 | 
| 
Nenue@6
 | 
   117   if not event then
 | 
| 
Nenue@6
 | 
   118     print(' DRY FIRE')
 | 
| 
Nenue@6
 | 
   119   elseif unit ~= self.unit then
 | 
| 
Nenue@6
 | 
   120     return
 | 
| 
Nenue@6
 | 
   121   end
 | 
| 
Nenue@6
 | 
   122 
 | 
| 
Nenue@6
 | 
   123   --- 3 states: nil, 0, >0
 | 
| 
Nenue@6
 | 
   124 
 | 
| 
Nenue@6
 | 
   125   local active, rank, _, count, dispelType, duration, expires, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff = self:Query()
 | 
| 
Nenue@6
 | 
   126   local state
 | 
| 
Nenue@6
 | 
   127   if self.cvars.duration and active ~= self.active then
 | 
| 
Nenue@6
 | 
   128     print('passive aura with forced duration')
 | 
| 
Nenue@6
 | 
   129     state = self.flags.active
 | 
| 
Nenue@6
 | 
   130     duration = self.cvars.duration
 | 
| 
Nenue@6
 | 
   131     expires = GetTime() + self.cvars.duration
 | 
| 
Nenue@6
 | 
   132   elseif (not self.cvars.duration and (duration ~= self.duration or expires ~= self.expires)) or active ~= self.active then
 | 
| 
Nenue@6
 | 
   133     if not active then
 | 
| 
Nenue@6
 | 
   134       if (not self.untriggerFunc) or self:untriggerFunc() then
 | 
| 
Nenue@6
 | 
   135         state = self.flags.hidden
 | 
| 
Nenue@6
 | 
   136       end
 | 
| 
Nenue@6
 | 
   137     else
 | 
| 
Nenue@6
 | 
   138       if (not self.triggerFunc) or self:triggerFunc() then
 | 
| 
Nenue@6
 | 
   139         if duration == 0 then
 | 
| 
Nenue@6
 | 
   140           print('passive aura')
 | 
| 
Nenue@6
 | 
   141           state = self.flags.passive
 | 
| 
Nenue@6
 | 
   142         else
 | 
| 
Nenue@6
 | 
   143           print('updating an active aura')
 | 
| 
Nenue@6
 | 
   144           state = self.flags.active
 | 
| 
Nenue@6
 | 
   145         end
 | 
| 
Nenue@6
 | 
   146         self.start = expires - duration
 | 
| 
Nenue@6
 | 
   147       end
 | 
| 
Nenue@6
 | 
   148     end
 | 
| 
Nenue@6
 | 
   149   end
 | 
| 
Nenue@6
 | 
   150 
 | 
| 
Nenue@6
 | 
   151   if state then
 | 
| 
Nenue@6
 | 
   152     T:Dispatch('TK_AURA_UPDATE', self.spellID, self.filters, state, self.displayState)
 | 
| 
Nenue@6
 | 
   153     self:Set(active, rank, _, count, dispelType, duration, expires, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff)
 | 
| 
Nenue@6
 | 
   154     self:SetState(state)
 | 
| 
Nenue@6
 | 
   155     print(cText('push state'), cNum(self.displayState).. ' (prev: '.. cNum(self.prevState)..')', self.timerName,  cText(active), cKey(duration), cNum(expires), cBool(self.cvars.inverse))
 | 
| 
Nenue@6
 | 
   156   else
 | 
| 
Nenue@6
 | 
   157     print(cText('no changes'), cNum(self.displayState).. ' (prev: '.. cNum(self.prevState)..')', cText(self.timerName))
 | 
| 
Nenue@6
 | 
   158   end
 | 
| 
Nenue@6
 | 
   159 end
 | 
| 
Nenue@6
 | 
   160 
 | 
| 
Nenue@6
 | 
   161 p.Value = function(self)
 | 
| 
Nenue@6
 | 
   162   return (self.charges and self.charges < self.maxCharges) and ((GetTime()  - self.chargeStart) / self.chargeDuration) or ((GetTime()  - self.start) / self.duration)
 | 
| 
Nenue@6
 | 
   163 end |