Mercurial > wow > skeletonkey
comparison SkeletonUnit/UnitFrame.lua @ 3:07293831dd7b
- implement unit parameters table inheritance from a stock table
- UnitFrames.unit() and UnitFrames.ui() methods
| author | Nenue |
|---|---|
| date | Tue, 21 Jun 2016 08:14:22 -0400 |
| parents | cd7d06bcd98d |
| children | a30285f8191e |
comparison
equal
deleted
inserted
replaced
| 2:f7a0898d293c | 3:07293831dd7b |
|---|---|
| 5 -- @file - r e v i s i o n @ @file-hash@ | 5 -- @file - r e v i s i o n @ @file-hash@ |
| 6 -- Created: 6/16/2016 3:46 AM | 6 -- Created: 6/16/2016 3:46 AM |
| 7 -------------------------------------------- | 7 -------------------------------------------- |
| 8 | 8 |
| 9 local KT = LibKT.register(SkeletonUnits) | 9 local KT = LibKT.register(SkeletonUnits) |
| 10 local db | |
| 10 local PLAYER_NAMEPLATE | 11 local PLAYER_NAMEPLATE |
| 11 local PLAYER_WIDTH = 220 | 12 local PLAYER_WIDTH = 220 |
| 12 local BUFF_SIZE = 24 | 13 local BUFF_SIZE = 24 |
| 13 local sk = SkeletonUnits | 14 local uf = SkeletonUnits |
| 14 local player = KTPlayerFrame | 15 local prototypes = {} |
| 15 local prototypes = { | |
| 16 player = {}, | |
| 17 target = {}, | |
| 18 pet = {}, | |
| 19 focus = {} | |
| 20 } | |
| 21 local units = {} | 16 local units = {} |
| 22 local buttons = {} | 17 local buttons = {} |
| 23 local params = { | 18 |
| 24 player = {width = 220, height = 30}, | 19 local params = setmetatable({}, { |
| 25 pet = {height = 25} | 20 __index = function(t, k) |
| 21 print('get', k) | |
| 22 return rawget(t.player, k) | |
| 23 end, | |
| 24 __newindex = function(t, k, v) | |
| 25 if type(v) == 'table' then | |
| 26 v = setmetatable(v, { | |
| 27 __index = function(tt, kk) | |
| 28 print('get', k, kk) | |
| 29 return rawget(t.player, kk) | |
| 30 end, | |
| 31 __newindex = function(tt, kk, vv) | |
| 32 if type(vv) == 'table' then | |
| 33 vv = setmetatable(vv, { | |
| 34 __index = function(_tt, _kk) | |
| 35 print('_get', k, kk, _kk) | |
| 36 return rawget(t.player[kk], _kk) | |
| 37 end | |
| 38 }) | |
| 39 end | |
| 40 rawset(tt, kk ,vv) | |
| 41 end | |
| 42 }) | |
| 43 end | |
| 44 rawset(t,k,v) | |
| 45 end | |
| 46 }) | |
| 47 | |
| 48 params.player = { | |
| 49 width = 220, | |
| 50 height = 30, | |
| 51 health = { height = 24 }, | |
| 52 power = { height = 6}, | |
| 53 } | |
| 54 params.pet = { | |
| 55 width = 180, | |
| 56 height = 25 | |
| 26 } | 57 } |
| 27 sk.handler = sk -- so sk.event can work | 58 params.focus = params.pet |
| 59 | |
| 60 uf.handler = uf -- so uf.event can work | |
| 28 | 61 |
| 29 | 62 |
| 30 local UpdateUnitAnchor = function(self) | 63 local UpdateUnitAnchor = function(self) |
| 31 self.nameplate = C_NamePlate.GetNamePlateForUnit(self.unit) | 64 self.nameplate = C_NamePlate.GetNamePlateForUnit(self.unit) |
| 32 if self.nameplate and self.nameplate.namePlateUnitToken then | 65 if self.nameplate and self.nameplate.namePlateUnitToken then |
| 47 | 80 |
| 48 end | 81 end |
| 49 return buttons[unit][index] | 82 return buttons[unit][index] |
| 50 end | 83 end |
| 51 | 84 |
| 52 sk.init = function() | 85 uf.unit = function(unit) |
| 53 for unit, handler in pairs(prototypes) do | 86 if not prototypes[unit] then |
| 54 if not _G['KT'..unit..'Frame'] then | 87 return |
| 55 CreateFrame('Frame', 'KT'.. unit .. 'Frame', sk) | 88 end |
| 56 end | 89 print('|cFFFFFF00unit|r:', unit) |
| 57 local frame = _G['KT'..unit..'Frame'] | 90 |
| 58 frame.unit = unit | 91 if not _G['KT'..unit..'Frame'] then |
| 59 frame.anchorPoint = {frame:GetPoint(1)} | 92 CreateFrame('Frame', 'KT'.. unit .. 'Frame', uf) |
| 60 frame.handler = handler | 93 end |
| 61 if handler.init then | 94 |
| 62 handler.init(frame, unit) | 95 local frame = _G['KT'..unit..'Frame'] |
| 63 end | 96 frame.unit = unit |
| 64 buttons[unit] = {} | 97 frame.anchorPoint = {frame:GetPoint(1)} |
| 65 units[unit] = frame | 98 frame.handler = prototypes[unit] |
| 66 end | 99 |
| 67 | 100 buttons[unit] = {} |
| 68 sk:RegisterEvent('PLAYER_TARGET_CHANGED') | 101 units[unit] = frame |
| 69 sk:RegisterUnitEvent("UNIT_AURA") | 102 |
| 70 end | 103 local width = params.player.width |
| 71 sk.variables = function() | 104 local height = params.player.height |
| 105 | |
| 106 if params[unit] then | |
| 107 if params[unit].width then | |
| 108 width = params[unit].width | |
| 109 end | |
| 110 if params[unit].height then | |
| 111 height = params[unit].height | |
| 112 end | |
| 113 end | |
| 114 | |
| 115 frame:SetWidth(width) | |
| 116 frame:SetHeight(height) | |
| 117 | |
| 118 return frame | |
| 119 end | |
| 120 | |
| 121 uf.ui = function () | |
| 72 for unit, frame in pairs(units) do | 122 for unit, frame in pairs(units) do |
| 73 if frame.handler.variables then | 123 frame.handler.refresh(frame) |
| 74 frame.handler.variables(frame, unit) | 124 end |
| 75 end | 125 end |
| 76 local width = params.player.width | 126 |
| 77 local height = params.player.height | 127 uf.init = function() |
| 78 if params[unit] then | 128 uf:RegisterEvent('PLAYER_TARGET_CHANGED') |
| 79 if params[unit].width then | 129 uf:RegisterUnitEvent("UNIT_AURA") |
| 80 width = params[unit].width | 130 end |
| 81 end | 131 |
| 82 if params[unit].height then | 132 uf.variables = function() |
| 83 height = params[unit].height | 133 if not FossilDB then |
| 84 end | 134 FossilDB = { |
| 85 end | 135 units = {'player', 'target', 'focus', 'pet', 'targettarget' }, |
| 86 | 136 position = {} |
| 87 frame:SetWidth(width) | 137 } |
| 88 frame:SetHeight(height) | 138 end |
| 89 end | 139 db = FossilDB |
| 90 end | 140 |
| 91 | 141 for i, unit in pairs(db.units) do |
| 92 sk.event = function(self, event, ...) | 142 print(unit) |
| 143 local frame = uf.unit(unit) | |
| 144 if frame then | |
| 145 frame.handler.init(frame) | |
| 146 end | |
| 147 end | |
| 148 uf.ui() | |
| 149 end | |
| 150 | |
| 151 uf.event = function(self, event, ...) | |
| 93 if self.handler[event] then | 152 if self.handler[event] then |
| 94 self.handler[event](self, event, ...) | 153 self.handler[event](self, event, ...) |
| 95 end | 154 end |
| 96 end | 155 return true |
| 97 | 156 end |
| 98 sk.PLAYER_TARGET_CHANGED = function() | 157 |
| 158 uf.PLAYER_TARGET_CHANGED = function() | |
| 99 prototypes.player.refresh(units.target) | 159 prototypes.player.refresh(units.target) |
| 100 end | 160 end |
| 101 | 161 |
| 102 prototypes.player.init = function(self) | 162 prototypes.player = {} |
| 163 local player = prototypes.player | |
| 164 player.init = function(self) | |
| 103 self:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", self.unit) | 165 self:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", self.unit) |
| 104 self:RegisterUnitEvent("UNIT_POWER_FREQUENT", self.unit) | 166 self:RegisterUnitEvent("UNIT_POWER_FREQUENT", self.unit) |
| 105 self:RegisterEvent("NAME_PLATE_UNIT_ADDED") | 167 self:RegisterEvent("NAME_PLATE_UNIT_ADDED") |
| 106 self:RegisterEvent("NAME_PLATE_UNIT_REMOVED") | 168 self:RegisterEvent("NAME_PLATE_UNIT_REMOVED") |
| 107 self:RegisterEvent("UNIT_TARGET") | 169 self:RegisterEvent("UNIT_TARGET") |
| 108 self:SetScript('OnEvent', sk.event) | 170 self:SetScript('OnEvent', uf.event) |
| 109 end | 171 end |
| 110 | 172 |
| 111 --- Runs once | |
| 112 prototypes.player.variables = function(self) | |
| 113 self.handler.refresh(self) | |
| 114 end | |
| 115 | 173 |
| 116 --- Runs when event handler decides so | 174 --- Runs when event handler decides so |
| 117 prototypes.player.refresh = function(self) | 175 player.refresh = function(self) |
| 118 if not UnitExists(self.unit) then | 176 if not UnitExists(self.unit) then |
| 119 self:Hide() | 177 self:Hide() |
| 120 return | 178 return |
| 121 end | 179 end |
| 122 | 180 |
| 123 local class, classFile = UnitClass(self.unit) | 181 if UnitIsPlayer(self.unit) then |
| 124 if classFile then | 182 local class, classFile = UnitClass(self.unit) |
| 125 self.healthbar:SetColorTexture(RAID_CLASS_COLORS[classFile].r, RAID_CLASS_COLORS[classFile].g, RAID_CLASS_COLORS[classFile].b) | 183 if classFile then |
| 126 end | 184 self.healthbar:SetColorTexture(RAID_CLASS_COLORS[classFile].r, RAID_CLASS_COLORS[classFile].g, RAID_CLASS_COLORS[classFile].b) |
| 185 end | |
| 186 elseif UnitIsFriend('player', self.unit) then | |
| 187 self.healthbar:SetColorTexture(0,.75,0,1) | |
| 188 elseif UnitIsEnemy('player', self.unit) then | |
| 189 self.healthbar:SetColorTexture(1,0,0,1) | |
| 190 else | |
| 191 self.healthbar:SetColorTexture(1,1,0,1) | |
| 192 end | |
| 193 self.powertype = UnitPowerType(self.unit) | |
| 194 if self.powertype then | |
| 195 self.powerbar:SetColorTexture(0,.3,1, 1) | |
| 196 | |
| 197 self.handler.UNIT_POWER_FREQUENT(self) | |
| 198 else | |
| 199 self.healthbar:SetHeight(params[self.unit].health.height + params[self.unit].power.height) | |
| 200 end | |
| 201 | |
| 202 | |
| 127 | 203 |
| 128 self.handler.UNIT_HEALTH_FREQUENT(self) | 204 self.handler.UNIT_HEALTH_FREQUENT(self) |
| 129 self.handler.UNIT_POWER_FREQUENT(self) | 205 end |
| 130 end | 206 |
| 131 | 207 uf.UNIT_AURA = function(self, event, unit) |
| 132 sk.UNIT_AURA = function(self, event, unit) | 208 if not units[unit] then return true end |
| 133 if not units[unit] then return end | |
| 134 | 209 |
| 135 local buffOffset = 0 | 210 local buffOffset = 0 |
| 136 local buttons = buttons[unit] | 211 local buttons = buttons[unit] |
| 137 for i = 1, 16 do | 212 for i = 1, 16 do |
| 138 | 213 |
| 151 if buttons[i] then | 226 if buttons[i] then |
| 152 buttons[i]:Hide() | 227 buttons[i]:Hide() |
| 153 end | 228 end |
| 154 end | 229 end |
| 155 end | 230 end |
| 156 end | 231 return true |
| 157 | 232 end |
| 158 prototypes.player.NAME_PLATE_UNIT_ADDED = function(self, event, nameplate) | 233 |
| 159 UpdateUnitAnchor(self) | 234 player.NAME_PLATE_UNIT_ADDED = function(self, event, nameplate) |
| 160 end | 235 --UpdateUnitAnchor(self) |
| 161 prototypes.player.NAME_PLATE_UNIT_REMOVED = function(self, event, nameplate) | 236 end |
| 162 UpdateUnitAnchor(self) | 237 player.NAME_PLATE_UNIT_REMOVED = function(self, event, nameplate) |
| 163 end | 238 --UpdateUnitAnchor(self) |
| 164 | 239 end |
| 165 prototypes.player.UNIT_HEALTH_FREQUENT = function(self, ...) | 240 |
| 241 player.UNIT_HEALTH_FREQUENT = function(self, ...) | |
| 166 if UnitHealthMax(self.unit) > 0 then | 242 if UnitHealthMax(self.unit) > 0 then |
| 167 self.healthbar:SetWidth(PLAYER_WIDTH * UnitHealth(self.unit) / UnitHealthMax(self.unit)) | 243 self.healthbar:SetWidth(PLAYER_WIDTH * UnitHealth(self.unit) / UnitHealthMax(self.unit)) |
| 168 self.healthtext:SetText(UnitHealth(self.unit)) | 244 self.healthtext:SetText(UnitHealth(self.unit)) |
| 169 else | 245 else |
| 170 self.healthbar:SetWidth(PLAYER_WIDTH) | 246 self.healthbar:SetWidth(PLAYER_WIDTH) |
| 171 self.healthtext:SetText(nil) | 247 self.healthtext:SetText(nil) |
| 172 end | 248 end |
| 173 return true | 249 return true |
| 174 end | 250 end |
| 175 | 251 |
| 176 prototypes.player.UNIT_POWER_FREQUENT = function(self) | 252 player.UNIT_POWER_FREQUENT = function(self) |
| 177 if UnitPowerMax(self.unit) > 0 then | 253 if UnitPowerMax(self.unit) > 0 then |
| 178 self.powerbar:SetWidth(PLAYER_WIDTH * UnitPower(self.unit) / UnitPowerMax(self.unit)) | 254 self.powerbar:SetWidth(PLAYER_WIDTH * UnitPower(self.unit) / UnitPowerMax(self.unit)) |
| 179 self.powertext:SetText(UnitPower(self.unit)) | 255 self.powertext:SetText(UnitPower(self.unit)) |
| 180 else | 256 else |
| 181 self.powerbar:Hide() | 257 self.powerbar:Hide() |
| 183 end | 259 end |
| 184 return true | 260 return true |
| 185 end | 261 end |
| 186 | 262 |
| 187 | 263 |
| 188 prototypes.player.UNIT_TARGET = function(self, ...) | 264 player.UNIT_TARGET = function(self, ...) |
| 189 if not UnitExists(self.unit) then | 265 if not UnitExists(self.unit) then |
| 190 self:Hide() | 266 self:Hide() |
| 191 else | 267 else |
| 192 self:Show() | 268 self:Show() |
| 193 self.handler.refresh(self) | 269 self.handler.refresh(self) |
| 194 UpdateUnitAnchor(self) | 270 end |
| 195 end | 271 end |
| 196 end | 272 |
| 197 | 273 prototypes.pet = player |
| 198 prototypes.pet = prototypes.player | 274 prototypes.target = player |
| 199 prototypes.target = prototypes.player |
