X-Git-Url: https://www.aleksib.fi/git/wowui.git/blobdiff_plain/922c2d739aa8ac8793961c0e3f562398e0654beb..5adea533cd42eb9aa9ab72ea8306234e83ff5626:/kehys/player.lua diff --git a/kehys/player.lua b/kehys/player.lua index ce390f5..7fcc04c 100644 --- a/kehys/player.lua +++ b/kehys/player.lua @@ -3,8 +3,9 @@ local _, addon = ...; local unpack = unpack; local format = string.format; local CFrame = CreateFrame("Frame", "kehysPlayerInit", UIParent); +local CTimerAfter = C_Timer.After; -local barTexture = "Interface\\AddOns\\OmaRF\\images\\minimalist"; +local barTexture = "Interface\\AddOns\\kehys\\images\\minimalist"; local vehicletoggle = [=[ if newstate == "vehicle" then self:SetAttribute("displayed", self:GetAttribute("vehicle")); @@ -13,8 +14,8 @@ local vehicletoggle = [=[ end ]=] -local updater = nil; -function addon.PlayerFrame(parent, width, height, update, event) +local playerUpdate = nil; +local function initPlayer(parent, width, height, update, event) assert(type(parent) == "table", "Player frame creation missing parent!"); assert(type(width) == "number", "Player frame creation missing width!"); assert(type(height) == "number", "Player frame creation missing height!"); @@ -26,28 +27,25 @@ function addon.PlayerFrame(parent, width, height, update, event) local f = CreateFrame("Button", "kehysPlayer", parent, "SecureUnitButtonTemplate,SecureHandlerStateTemplate"); f:Hide(); - f:SetPoint("CENTER", parent, "CENTER", 10, 10); + f:SetPoint("CENTER", parent, "CENTER", -300, -178); f:SetWidth(width); f:SetHeight(height); f.barwidth = width - 2; -- 1px padding f:SetAttribute("unit", "player"); f:SetAttribute("displayed", "player"); f:SetAttribute("vehicle", "vehicle"); - f.nonraid = true; + f.unit = "player"; + f.displayed = "player"; + f.vehicle = "vehicle"; + f.constant = true; f.prev = {}; - -- empty, just to be able to use general updater - f.alert = {}; - f.heal = {}; - f.tankcd = {}; - f.stacks = {}; - f.buff1 = {}; - f.incoming = {}; - updater = function() - CTimerAfter(0.1, updater); + playerUpdate = function() + CTimerAfter(0.1, playerUpdate); update(f); end f:SetScript("OnEvent", event); + f:RegisterForClicks("AnyDown"); f:SetAttribute("*type1", "target"); f:SetAttribute("*type2", "togglemenu"); f:SetAttribute("toggleForVehicle", true); @@ -57,26 +55,24 @@ function addon.PlayerFrame(parent, width, height, update, event) -- create visuals f.base = f:CreateTexture(nil, "BACKGROUND"); f.base:SetAllPoints(); - f.base:SetColorTexture(1, 1, 1); - f.base:SetVertexColor(unpack(addon.Colors.Base)); - f.background = f:CreateTexture(nil, "BACKGROUND", nil, 2); + f.base:SetColorTexture(0, 0, 0, 0.5); + f.background = f:CreateTexture(nil, "BACKGROUND", nil, 1); f.background:SetPoint("TOPLEFT", f, "TOPLEFT", 1, -1); f.background:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -1, 1); - f.background:SetColorTexture(0.7, 0.7, 0.7); f.health = f:CreateTexture(nil, "BORDER"); f.health:SetPoint("TOPLEFT", f.background, "TOPLEFT"); - f.health:SetPoint("BOTTOMLEFT", f.background, "LEFT", 0, 1); + f.health:SetPoint("BOTTOMLEFT", f.background, "LEFT", 0, -height/8); f.health:SetTexture(barTexture); - f.health:SetVertexColor(0.3, 0.3, 0.3); + f.health:SetVertexColor(0.7, 0.7, 0.7); f.health:Hide(); f.mana = f:CreateTexture(nil, "BORDER"); - f.mana:SetPoint("TOPLEFT", f.background, "LEFT", 0, -1); + f.mana:SetPoint("TOPLEFT", f.background, "LEFT", 0, -height/8); f.mana:SetPoint("BOTTOMLEFT", f.background, "BOTTOMLEFT"); f.mana:SetTexture(barTexture); - f.mana:SetVertexColor(0.3, 0.4, 0.7); + f.mana:SetVertexColor(0.1, 0.5, 0.9); f.mana:Hide(); f.manatext = f:CreateFontString(nil, "ARTWORK", "GameFontHighlight"); - f.manatext:SetPoint("RIGHT", frame.background, "RIGHT", -2, -height/4); + f.manatext:SetPoint("BOTTOMRIGHT", f.background, "BOTTOMRIGHT", -2, 4); f.manatext:Hide(); f.shield = f:CreateTexture(nil, "BORDER"); f.shield:SetPoint("TOPLEFT", f.health, "TOPRIGHT"); @@ -86,7 +82,7 @@ function addon.PlayerFrame(parent, width, height, update, event) f.shield:Hide(); f.shieldhl = f:CreateTexture(nil, "ARTWORK"); f.shieldhl:SetPoint("TOPLEFT", f, "TOPRIGHT", -2, 0); - f.shieldhl:SetPoint("BOTTOMRIGHT", f, "RIGHT"); + f.shieldhl:SetPoint("BOTTOMRIGHT", f, "RIGHT", 0, -height/8); f.shieldhl:SetColorTexture(0.5, 0.8, 1); f.shieldhl:Hide(); f.healpred = f:CreateTexture(nil, "ARTWORK"); @@ -97,11 +93,11 @@ function addon.PlayerFrame(parent, width, height, update, event) f.healabsorb = f:CreateTexture(nil, "ARTWORK"); f.healabsorb:SetPoint("TOPRIGHT", f.health, "TOPRIGHT"); f.healabsorb:SetPoint("BOTTOMRIGHT", f.health, "BOTTOMRIGHT"); - f.healabsorb:SetColorTexture(0.1, 0.1, 0.1); + f.healabsorb:SetColorTexture(0.1, 0.1, 0.1, 0); f.healabsorb:Hide(); f.text = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight"); - f.text:SetPoint("LEFT", f.health, "LEFT", 10, 0); - f.text:SetFont(STANDARD_TEXT_FONT, 13); + f.text:SetPoint("RIGHT", f, "RIGHT", -2, 8); + f.text:SetFont(STANDARD_TEXT_FONT, 15); f.text:Hide(); f.targeticon = f:CreateTexture(nil, "OVERLAY"); f.targeticon:SetPoint("CENTER", f, "TOP", 0, -1); @@ -109,12 +105,119 @@ function addon.PlayerFrame(parent, width, height, update, event) f.targeticon:SetHeight(12); f.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons"); f.targeticon:Hide(); + f.status = f:CreateTexture(nil, "OVERLAY"); + f.status:SetPoint("TOPLEFT", f.background, "BOTTOMLEFT", -8, 8); + f.status:SetPoint("BOTTOMRIGHT", f.background, "BOTTOMLEFT", 8, -8); + f.status:SetTexture("Interface\\CHARACTERFRAME\\UI-StateIcon"); + f.status:Hide(); - registerEvents(f); - registerUnitEvents(f); + addon.RegisterEvents(f); + addon.RegisterUnitEvents(f); event(f, "UPDATE_ALL_BARS"); - updater(); - f.Show(); + playerUpdate(); + f:Show(); + return f; +end + +local petUpdate = nil; +local function initPet(parent, width, height, update, event) + assert(type(parent) == "table", "Pet frame creation missing parent!"); + assert(type(width) == "number", "Pet frame creation missing width!"); + assert(type(height) == "number", "Pet frame creation missing height!"); + assert(type(update) == "function", + "Pet frame creation missing update function!"); + assert(type(event) == "function", + "Pet frame creation missing event function!"); + + local f = CreateFrame("Button", "kehysPet", parent, + "SecureUnitButtonTemplate,SecureHandlerStateTemplate"); + f:Hide(); + f:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, 0); + f:SetWidth(width); + f:SetHeight(height); + f.barwidth = width - 2; -- 1px padding + f:SetAttribute("unit", "pet"); + f:SetAttribute("displayed", "pet"); + f:SetAttribute("vehicle", "player"); + f.unit = "pet"; + f.displayed = "pet"; + f.vehicle = "player" + f.prev = {}; + + petUpdate = function() + if f.updating then + CTimerAfter(0.1, petUpdate); + return update(f); + end + end + f:SetScript("OnEvent", event); + f:SetScript("OnHide", function() + f:UnregisterAllEvents(); + f.updating = false; + f.prev = {}; + end); + f:SetScript("OnShow", function() + addon.RegisterEvents(f); + addon.RegisterUnitEvents(f); + event(f, "UPDATE_ALL_BARS"); + f.updating = true; + petUpdate(); + end); + f:RegisterForClicks("AnyDown"); + f:SetAttribute("*type1", "target"); + f:SetAttribute("*type2", "togglemenu"); + f:SetAttribute("toggleForVehicle", true); + + -- create visuals + f.base = f:CreateTexture(nil, "BACKGROUND"); + f.base:SetAllPoints(); + f.base:SetColorTexture(0, 0, 0, 0.5); + f.background = f:CreateTexture(nil, "BACKGROUND", nil, 1); + f.background:SetPoint("TOPLEFT", f, "TOPLEFT", 1, -1); + f.background:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -1, 1); + f.health = f:CreateTexture(nil, "BORDER"); + f.health:SetPoint("TOPLEFT", f.background, "TOPLEFT"); + f.health:SetPoint("BOTTOMLEFT", f.background, "BOTTOMLEFT"); + f.health:SetTexture(barTexture); + f.health:SetVertexColor(0.7, 0.7, 0.7); + f.health:Hide(); + f.shield = f:CreateTexture(nil, "BORDER"); + f.shield:SetPoint("TOPLEFT", f.health, "TOPRIGHT"); + f.shield:SetPoint("BOTTOMLEFT", f.health, "BOTTOMRIGHT"); + f.shield:SetTexture(barTexture); + f.shield:SetVertexColor(0, 0.7, 1); + f.shield:Hide(); + f.shieldhl = f:CreateTexture(nil, "ARTWORK"); + f.shieldhl:SetPoint("TOPLEFT", f, "TOPRIGHT", -2, 0); + f.shieldhl:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT"); + f.shieldhl:SetColorTexture(0.5, 0.8, 1); + f.shieldhl:Hide(); + f.healpred = f:CreateTexture(nil, "ARTWORK"); + f.healpred:SetPoint("TOPLEFT", f.health, "TOPRIGHT"); + f.healpred:SetPoint("BOTTOMLEFT", f.health, "BOTTOMRIGHT"); + f.healpred:SetColorTexture(0.5, 0.6, 0.5); + f.healpred:Hide(); + f.healabsorb = f:CreateTexture(nil, "ARTWORK"); + f.healabsorb:SetPoint("TOPRIGHT", f.health, "TOPRIGHT"); + f.healabsorb:SetPoint("BOTTOMRIGHT", f.health, "BOTTOMRIGHT"); + f.healabsorb:SetColorTexture(0.1, 0.1, 0.1); + f.healabsorb:Hide(); + f.name = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight"); + f.name:SetPoint("LEFT", f, "LEFT", 5, 0); + f.text = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight"); + f.text:SetPoint("RIGHT", f, "RIGHT", -3, -1); + f.text:SetFont(STANDARD_TEXT_FONT, 10); + f.text:Hide(); + f.targeticon = f:CreateTexture(nil, "OVERLAY"); + f.targeticon:SetPoint("CENTER", f, "TOP", 0, -1); + f.targeticon:SetWidth(12); + f.targeticon:SetHeight(12); + f.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons"); + f.targeticon:Hide(); + + RegisterUnitWatch(f); + RegisterStateDriver(f, "vehicleui", "[vehicleui] vehicle; no"); + f:SetAttribute("_onstate-vehicleui", vehicletoggle); end CFrame:SetScript("OnEvent", function(self) @@ -123,6 +226,7 @@ CFrame:SetScript("OnEvent", function(self) CFrame:SetPoint("CENTER", nil, "CENTER"); CFrame:SetWidth(2); CFrame:SetHeight(2); - initPlayer(self, 180, 100, addon.FrameUpdate, addon.UnitEvent); + local player = initPlayer(self, 160, 48, addon.FrameUpdate, addon.UnitEvent); + initPet(player, 80, 24, addon.FrameUpdate, addon.UnitEvent); end); CFrame:RegisterEvent("PLAYER_LOGIN");