8b1be3a - More auras and stagger tracking
[wowui.git] / kehys / player.lua
1 -- player.lua
2 local _, addon = ...;
3 local unpack = unpack;
4 local format = string.format;
5 local CFrame = CreateFrame("Frame", "kehysPlayerInit", UIParent);
6 local CTimerAfter = C_Timer.After;
7
8 local barTexture = "Interface\\AddOns\\kehys\\images\\minimalist";
9 local vehicletoggle = [=[
10     if newstate == "vehicle" then
11         self:SetAttribute("displayed", self:GetAttribute("vehicle"));
12     else
13         self:SetAttribute("displayed", self:GetAttribute("unit"));
14     end
15 ]=]
16
17 local playerUpdate = nil;
18 local function initPlayer(parent, width, height, update, event)
19     assert(type(parent) == "table", "Player frame creation missing parent!");
20     assert(type(width) == "number", "Player frame creation missing width!");
21     assert(type(height) == "number", "Player frame creation missing height!");
22     assert(type(update) == "function",
23            "Player frame creation missing update function!");
24     assert(type(event) == "function",
25            "Player frame creation missing event function!");
26
27     local f = CreateFrame("Button", "kehysPlayer", parent,
28                           "SecureUnitButtonTemplate,SecureHandlerStateTemplate");
29     f:Hide();
30     f:SetPoint("CENTER", parent, "CENTER", -300, -178);
31     f:SetWidth(width);
32     f:SetHeight(height);
33     f.barwidth = width - 2; -- 1px padding
34     f:SetAttribute("unit", "player");
35     f:SetAttribute("displayed", "player");
36     f:SetAttribute("vehicle", "vehicle");
37     f.unit = "player";
38     f.displayed = "player";
39     f.vehicle = "vehicle";
40     f.constant = true;
41     f.prev = {};
42
43     playerUpdate = function()
44         CTimerAfter(0.1, playerUpdate);
45         update(f);
46     end
47     f:SetScript("OnEvent", event);
48     f:RegisterForClicks("AnyDown");
49     f:SetAttribute("*type1", "target");
50     f:SetAttribute("*type2", "togglemenu");
51     f:SetAttribute("toggleForVehicle", true);
52     RegisterStateDriver(f, "vehicleui", "[vehicleui] vehicle; no");
53     f:SetAttribute("_onstate-vehicleui", vehicletoggle);
54
55     -- create visuals
56     f.base = f:CreateTexture(nil, "BACKGROUND");
57     f.base:SetAllPoints();
58     f.base:SetColorTexture(0, 0, 0, 0.5);
59     f.background = f:CreateTexture(nil, "BACKGROUND", nil, 1);
60     f.background:SetPoint("TOPLEFT", f, "TOPLEFT", 1, -1);
61     f.background:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -1, 1);
62     f.health = f:CreateTexture(nil, "BORDER");
63     f.health:SetPoint("TOPLEFT", f.background, "TOPLEFT");
64     f.health:SetPoint("BOTTOMLEFT", f.background, "LEFT", 0, -height/8);
65     f.health:SetTexture(barTexture);
66     f.health:SetVertexColor(0.7, 0.7, 0.7);
67     f.health:Hide();
68     f.mana = f:CreateTexture(nil, "BORDER");
69     f.mana:SetPoint("TOPLEFT", f.background, "LEFT", 0, -height/8);
70     f.mana:SetPoint("BOTTOMLEFT", f.background, "BOTTOMLEFT");
71     f.mana:SetTexture(barTexture);
72     f.mana:SetVertexColor(0.1, 0.5, 0.9);
73     f.mana:Hide();
74     f.manatext = f:CreateFontString(nil, "ARTWORK", "GameFontHighlight");
75     f.manatext:SetPoint("BOTTOMRIGHT", f.background, "BOTTOMRIGHT", -2, 4);
76     f.manatext:Hide();
77     f.shield = f:CreateTexture(nil, "BORDER");
78     f.shield:SetPoint("TOPLEFT", f.health, "TOPRIGHT");
79     f.shield:SetPoint("BOTTOMLEFT", f.health, "BOTTOMRIGHT");
80     f.shield:SetTexture(barTexture);
81     f.shield:SetVertexColor(0, 0.7, 1);
82     f.shield:Hide();
83     f.shieldhl = f:CreateTexture(nil, "ARTWORK");
84     f.shieldhl:SetPoint("TOPLEFT", f, "TOPRIGHT", -2, 0);
85     f.shieldhl:SetPoint("BOTTOMRIGHT", f, "RIGHT", 0, -height/8);
86     f.shieldhl:SetColorTexture(0.5, 0.8, 1);
87     f.shieldhl:Hide();
88     f.healpred = f:CreateTexture(nil, "ARTWORK");
89     f.healpred:SetPoint("TOPLEFT", f.health, "TOPRIGHT");
90     f.healpred:SetPoint("BOTTOMLEFT", f.health, "BOTTOMRIGHT");
91     f.healpred:SetColorTexture(0.5, 0.6, 0.5);
92     f.healpred:Hide();
93     f.healabsorb = f:CreateTexture(nil, "ARTWORK");
94     f.healabsorb:SetPoint("TOPRIGHT", f.health, "TOPRIGHT");
95     f.healabsorb:SetPoint("BOTTOMRIGHT", f.health, "BOTTOMRIGHT");
96     f.healabsorb:SetColorTexture(0.1, 0.1, 0.1);
97     f.healabsorb:Hide();
98     f.text = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
99     f.text:SetPoint("RIGHT", f, "RIGHT", -2, 8);
100     f.text:SetFont(STANDARD_TEXT_FONT, 15);
101     f.text:Hide();
102     f.targeticon = f:CreateTexture(nil, "OVERLAY");
103     f.targeticon:SetPoint("CENTER", f, "TOP", 0, -1);
104     f.targeticon:SetWidth(12);
105     f.targeticon:SetHeight(12);
106     f.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons");
107     f.targeticon:Hide();
108     f.status = f:CreateTexture(nil, "OVERLAY");
109     f.status:SetPoint("TOPLEFT", f.background, "BOTTOMLEFT", -8, 8);
110     f.status:SetPoint("BOTTOMRIGHT", f.background, "BOTTOMLEFT", 8, -8);
111     f.status:SetTexture("Interface\\CHARACTERFRAME\\UI-StateIcon");
112     f.status:Hide();
113
114     addon.RegisterEvents(f);
115     addon.RegisterUnitEvents(f);
116     event(f, "UPDATE_ALL_BARS");
117     playerUpdate();
118     f:Show();
119     return f;
120 end
121
122 local petUpdate = nil;
123 local function initPet(parent, width, height, update, event)
124     assert(type(parent) == "table", "Pet frame creation missing parent!");
125     assert(type(width) == "number", "Pet frame creation missing width!");
126     assert(type(height) == "number", "Pet frame creation missing height!");
127     assert(type(update) == "function",
128            "Pet frame creation missing update function!");
129     assert(type(event) == "function",
130            "Pet frame creation missing event function!");
131
132     local f = CreateFrame("Button", "kehysPet", parent,
133                           "SecureUnitButtonTemplate,SecureHandlerStateTemplate");
134     f:Hide();
135     f:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, 0);
136     f:SetWidth(width);
137     f:SetHeight(height);
138     f.barwidth = width - 2; -- 1px padding
139     f:SetAttribute("unit", "pet");
140     f:SetAttribute("displayed", "pet");
141     f:SetAttribute("vehicle", "player");
142     f.unit = "pet";
143     f.displayed = "pet";
144     f.vehicle = "player"
145     f.prev = {};
146
147     petUpdate = function()
148         if f.updating then
149             CTimerAfter(0.1, petUpdate);
150             return update(f);
151         end
152     end
153     f:SetScript("OnEvent", event);
154     f:SetScript("OnHide", function()
155         f:UnregisterAllEvents();
156         f.updating = false;
157         f.prev = {};
158     end);
159     f:SetScript("OnShow", function()
160         addon.RegisterEvents(f);
161         addon.RegisterUnitEvents(f);
162         event(f, "UPDATE_ALL_BARS");
163         f.updating = true;
164         petUpdate();
165     end);
166     f:RegisterForClicks("AnyDown");
167     f:SetAttribute("*type1", "target");
168     f:SetAttribute("*type2", "togglemenu");
169     f:SetAttribute("toggleForVehicle", true);
170
171     -- create visuals
172     f.base = f:CreateTexture(nil, "BACKGROUND");
173     f.base:SetAllPoints();
174     f.base:SetColorTexture(0, 0, 0, 0.5);
175     f.background = f:CreateTexture(nil, "BACKGROUND", nil, 1);
176     f.background:SetPoint("TOPLEFT", f, "TOPLEFT", 1, -1);
177     f.background:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -1, 1);
178     f.health = f:CreateTexture(nil, "BORDER");
179     f.health:SetPoint("TOPLEFT", f.background, "TOPLEFT");
180     f.health:SetPoint("BOTTOMLEFT", f.background, "BOTTOMLEFT");
181     f.health:SetTexture(barTexture);
182     f.health:SetVertexColor(0.7, 0.7, 0.7);
183     f.health:Hide();
184     f.shield = f:CreateTexture(nil, "BORDER");
185     f.shield:SetPoint("TOPLEFT", f.health, "TOPRIGHT");
186     f.shield:SetPoint("BOTTOMLEFT", f.health, "BOTTOMRIGHT");
187     f.shield:SetTexture(barTexture);
188     f.shield:SetVertexColor(0, 0.7, 1);
189     f.shield:Hide();
190     f.shieldhl = f:CreateTexture(nil, "ARTWORK");
191     f.shieldhl:SetPoint("TOPLEFT", f, "TOPRIGHT", -2, 0);
192     f.shieldhl:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT");
193     f.shieldhl:SetColorTexture(0.5, 0.8, 1);
194     f.shieldhl:Hide();
195     f.healpred = f:CreateTexture(nil, "ARTWORK");
196     f.healpred:SetPoint("TOPLEFT", f.health, "TOPRIGHT");
197     f.healpred:SetPoint("BOTTOMLEFT", f.health, "BOTTOMRIGHT");
198     f.healpred:SetColorTexture(0.5, 0.6, 0.5);
199     f.healpred:Hide();
200     f.healabsorb = f:CreateTexture(nil, "ARTWORK");
201     f.healabsorb:SetPoint("TOPRIGHT", f.health, "TOPRIGHT");
202     f.healabsorb:SetPoint("BOTTOMRIGHT", f.health, "BOTTOMRIGHT");
203     f.healabsorb:SetColorTexture(0.1, 0.1, 0.1);
204     f.healabsorb:Hide();
205     f.name = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
206     f.name:SetPoint("LEFT", f, "LEFT", 5, 0);
207     f.text = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
208     f.text:SetPoint("RIGHT", f, "RIGHT", -3, -1);
209     f.text:SetFont(STANDARD_TEXT_FONT, 10);
210     f.text:Hide();
211     f.targeticon = f:CreateTexture(nil, "OVERLAY");
212     f.targeticon:SetPoint("CENTER", f, "TOP", 0, -1);
213     f.targeticon:SetWidth(12);
214     f.targeticon:SetHeight(12);
215     f.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons");
216     f.targeticon:Hide();
217
218     RegisterUnitWatch(f);
219     RegisterStateDriver(f, "vehicleui", "[vehicleui] vehicle; no");
220     f:SetAttribute("_onstate-vehicleui", vehicletoggle);
221 end
222
223 CFrame:SetScript("OnEvent", function(self)
224     self:UnregisterAllEvents();
225     CFrame:SetFrameStrata("LOW");
226     CFrame:SetPoint("CENTER", nil, "CENTER");
227     CFrame:SetWidth(2);
228     CFrame:SetHeight(2);
229     local player = initPlayer(self, 160, 48, addon.FrameUpdate, addon.UnitEvent);
230     initPet(player, 80, 24, addon.FrameUpdate, addon.UnitEvent);
231 end);
232 CFrame:RegisterEvent("PLAYER_LOGIN");