diff SkeletonUnit/UnitFrame.lua @ 1:cd7d06bcd98d

KeyBinds: set hotkey text for blizzard action buttons UnitFrame: prototype templates for the majority of units
author Nenue
date Tue, 21 Jun 2016 04:47:52 -0400
parents 69e828f4238a
children 07293831dd7b
line wrap: on
line diff
--- a/SkeletonUnit/UnitFrame.lua	Mon Jun 20 06:35:11 2016 -0400
+++ b/SkeletonUnit/UnitFrame.lua	Tue Jun 21 04:47:52 2016 -0400
@@ -6,46 +6,145 @@
 -- Created: 6/16/2016 3:46 AM
 --------------------------------------------
 
-local KT = select(2,...)
+local KT = LibKT.register(SkeletonUnits)
 local PLAYER_NAMEPLATE
 local PLAYER_WIDTH = 220
 local BUFF_SIZE = 24
+local sk = SkeletonUnits
+local player = KTPlayerFrame
+local prototypes = {
+  player = {},
+  target = {},
+  pet = {},
+  focus = {}
+}
+local units = {}
+local buttons = {}
+local params = {
+  player = {width = 220, height = 30},
+  pet = {height = 25}
+}
+sk.handler = sk -- so sk.event can work
 
 
-KT.register(KTplayerFrame)
-KTplayerFrame:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", "player")
-KTplayerFrame:RegisterUnitEvent("UNIT_POWER_FREQUENT", "player")
-KTplayerFrame:RegisterUnitEvent("UNIT_AURA", 'player')
-KTplayerFrame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
-KTplayerFrame:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
-KTplayerFrame.event = function(self)
-  --  print(C_NamePlate.GetNamePlateForUnit('player'))
+local UpdateUnitAnchor = function(self)
+  self.nameplate = C_NamePlate.GetNamePlateForUnit(self.unit)
+  if self.nameplate and self.nameplate.namePlateUnitToken then
+    self:ClearAllPoints()
+    self:SetPoint('TOP', self.nameplate, 'BOTTOM', 0, 0)
+    print('snapping', self.unit, 'to', self.nameplate.namePlateUnitToken)
+  else
+    self:ClearAllPoints()
+    self:SetPoint(unpack(self.anchorPoint))
+  end
 end
 
-local buttons = {}
 local SetupButton = function(self, unit, index)
-  if not buttons[index] then
-    buttons[index] = CreateFrame('Frame', 'KT'..unit..'Buff'..index, self, 'KTAuraButton')
-    buttons[index]:SetSize(BUFF_SIZE, BUFF_SIZE)
-    buttons[index].cooldown:SetHideCountdownNumbers(true)
+  if not buttons[unit][index] then
+    buttons[unit][index] = CreateFrame('Frame', 'KT'..unit..'Buff'..index, self, 'KTAuraButton')
+    buttons[unit][index]:SetSize(BUFF_SIZE, BUFF_SIZE)
+    buttons[unit][index].cooldown:SetHideCountdownNumbers(true)
 
   end
-  return buttons[index]
+  return buttons[unit][index]
 end
 
-KTplayerFrame.UNIT_AURA = function(self, event, unit)
+sk.init = function()
+  for unit, handler in pairs(prototypes) do
+    if not _G['KT'..unit..'Frame'] then
+      CreateFrame('Frame', 'KT'.. unit .. 'Frame', sk)
+    end
+    local frame = _G['KT'..unit..'Frame']
+    frame.unit = unit
+    frame.anchorPoint = {frame:GetPoint(1)}
+    frame.handler = handler
+    if handler.init then
+      handler.init(frame, unit)
+    end
+    buttons[unit] = {}
+    units[unit] = frame
+  end
+
+  sk:RegisterEvent('PLAYER_TARGET_CHANGED')
+  sk:RegisterUnitEvent("UNIT_AURA")
+end
+sk.variables = function()
+  for unit, frame in pairs(units) do
+    if frame.handler.variables then
+      frame.handler.variables(frame, unit)
+    end
+    local width = params.player.width
+    local height = params.player.height
+    if params[unit] then
+      if params[unit].width then
+      width = params[unit].width
+      end
+      if params[unit].height then
+        height = params[unit].height
+      end
+    end
+
+    frame:SetWidth(width)
+    frame:SetHeight(height)
+  end
+end
+
+sk.event = function(self, event, ...)
+  if self.handler[event] then
+    self.handler[event](self, event, ...)
+  end
+end
+
+sk.PLAYER_TARGET_CHANGED = function()
+  prototypes.player.refresh(units.target)
+end
+
+prototypes.player.init = function(self)
+  self:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", self.unit)
+  self:RegisterUnitEvent("UNIT_POWER_FREQUENT", self.unit)
+  self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
+  self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
+  self:RegisterEvent("UNIT_TARGET")
+  self:SetScript('OnEvent', sk.event)
+end
+
+--- Runs once
+prototypes.player.variables = function(self)
+  self.handler.refresh(self)
+end
+
+--- Runs when event handler decides so
+prototypes.player.refresh = function(self)
+  if not UnitExists(self.unit) then
+    self:Hide()
+    return
+  end
+
+  local class, classFile = UnitClass(self.unit)
+  if classFile then
+    self.healthbar:SetColorTexture(RAID_CLASS_COLORS[classFile].r, RAID_CLASS_COLORS[classFile].g, RAID_CLASS_COLORS[classFile].b)
+  end
+
+  self.handler.UNIT_HEALTH_FREQUENT(self)
+  self.handler.UNIT_POWER_FREQUENT(self)
+end
+
+sk.UNIT_AURA = function(self, event, unit)
+  if not units[unit] then return end
+
   local buffOffset = 0
+  local buttons = buttons[unit]
   for i = 1, 16 do
-    --UnitAura()
-    local aura, _, texture, count, dispelType, duration, expires, caster = UnitAura(unit, i, nil, 'HELPFUL')
+
+    local aura, _, texture, count, dispelType, duration, expires, caster = UnitAura(unit, i, 'HARMFUL')
     if aura then
-      local button = SetupButton(self, unit, i)
+      local button = SetupButton(units[unit], unit, i)
 
       button.icon:SetTexture(texture)
       button.cooldown:SetCooldown(expires - duration, duration)
       button.cooldown:Show()
       button.count:SetText(count > 0 and count or nil)
-      button:SetPoint('BOTTOMLEFT', self, 'TOPLEFT', buffOffset* BUFF_SIZE, 2)
+      button:SetPoint('BOTTOMLEFT', units[unit], 'TOPLEFT', buffOffset* BUFF_SIZE, 2)
       button:Show()
       buffOffset = buffOffset + 1
     else
@@ -56,35 +155,45 @@
   end
 end
 
-KTplayerFrame.NAME_PLATE_UNIT_ADDED = function(self, event, unit)
-  print('|cFF008800'..unit)
-  if UnitIsUnit('player', unit) then
-    PLAYER_NAMEPLATE = unit
-    self:ClearAllPoints()
-    self:SetPoint('TOP', C_NamePlate.GetNamePlateForUnit(unit), 'BOTTOM', 0, 0)
+prototypes.player.NAME_PLATE_UNIT_ADDED = function(self, event, nameplate)
+    UpdateUnitAnchor(self)
+end
+prototypes.player.NAME_PLATE_UNIT_REMOVED = function(self, event, nameplate)
+    UpdateUnitAnchor(self)
+end
+
+prototypes.player.UNIT_HEALTH_FREQUENT = function(self, ...)
+  if UnitHealthMax(self.unit) > 0 then
+    self.healthbar:SetWidth(PLAYER_WIDTH * UnitHealth(self.unit) / UnitHealthMax(self.unit))
+    self.healthtext:SetText(UnitHealth(self.unit))
+  else
+    self.healthbar:SetWidth(PLAYER_WIDTH)
+    self.healthtext:SetText(nil)
   end
+  return true
 end
-KTplayerFrame.NAME_PLATE_UNIT_REMOVED = function(self, event, unit)
-  if unit == PLAYER_NAMEPLATE then
-    PLAYER_NAMEPLATE = nil
-    self:ClearAllPoints()
-    self:SetPoint('LEFT', UIParent, 'LEFT', 25, 0)
+
+prototypes.player.UNIT_POWER_FREQUENT = function(self)
+  if UnitPowerMax(self.unit) > 0 then
+    self.powerbar:SetWidth(PLAYER_WIDTH * UnitPower(self.unit) / UnitPowerMax(self.unit))
+    self.powertext:SetText(UnitPower(self.unit))
+  else
+    self.powerbar:Hide()
+    self.powertext:SetText(nil)
+  end
+  return true
+end
+
+
+prototypes.player.UNIT_TARGET = function(self, ...)
+  if not UnitExists(self.unit) then
+    self:Hide()
+  else
+    self:Show()
+    self.handler.refresh(self)
+    UpdateUnitAnchor(self)
   end
 end
 
-KTplayerFrame.UNIT_HEALTH_FREQUENT = function(self, ...)
-  --print(UnitHealth('player') / UnitHealthMax('player'))
-  self.healthbar:SetWidth(PLAYER_WIDTH * UnitHealth('player') / UnitHealthMax('player'))
-  return true
-end
-
-KTplayerFrame.UNIT_POWER_FREQUENT = function(self)
-  self.powerbar:SetWidth(PLAYER_WIDTH * UnitPower('player') / UnitPowerMax('player'))
-  return true
-end
-
-KTplayerFrame:SetWidth(PLAYER_WIDTH)
-KTplayerFrame.variables = function()
-  KTplayerFrame:UNIT_HEALTH_FREQUENT()
-  KTplayerFrame:UNIT_POWER_FREQUENT()
-end
\ No newline at end of file
+prototypes.pet = prototypes.player
+prototypes.target = prototypes.player
\ No newline at end of file