vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 -- Create the addon object
2 ArcHUD = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceHook-2.0", "AceConsole-2.0", "AceDB-2.0", "AceModuleCore-2.0", "AceDebug-2.0", "Metrognome-2.0")
3  
4 -- Locale object
5 local L = AceLibrary("AceLocale-2.0"):new("ArcHUD_Core")
6  
7 -- Debugging levels
8 -- 1 Warning
9 -- 2 Info
10 -- 3 Notice
11 -- 4 Off
12 local debugLevels = {"warn", "info", "notice", "off"}
13  
14 -- Set up Dewdrop and core addon options menu
15 local dewdrop = AceLibrary:GetInstance("Dewdrop-2.0")
16 local ddframe
17  
18 -- Set up database
19 ArcHUD:RegisterDB("ArcHUDDB")
20 ArcHUD:RegisterDefaults("profile", {
21 Debug = nil,
22 TargetFrame = true,
23 PlayerModel = true,
24 MobModel = false,
25 ShowGuild = true,
26 ShowClass = false,
27 Width = 30,
28 YLoc = 0,
29 FadeFull = 0.1,
30 FadeOOC = 0.5,
31 FadeIC = 0.75,
32 RingVisibility = 3,
33 PartyLock = true,
34 TargetTarget = true,
35 TargetTargetTarget = true,
36 NamePlates = true,
37 Scale = 1.0,
38 AttachTop = false,
39 ShowBuffs = true,
40 HoverMsg = true,
41 HoverDelay = 3,
42 BlizzPlayer = true,
43 BlizzTarget = true,
44 })
45  
46 -- Set up chat commands
47 ArcHUD:RegisterChatCommand({"/archud", "/ah"}, {
48 type = "group",
49 name = "ArcHUD",
50 args = {
51 reset = {
52 type = "group",
53 name = "reset",
54 desc = L"CMD_RESET",
55 args = {
56 confirm = {
57 type = "execute",
58 name = "CONFIRM",
59 desc = L"CMD_RESET_CONFIRM",
60 func = "ResetOptionsConfirm",
61 }
62 }
63 },
64 config = {
65 type = "execute",
66 name = "config",
67 desc = L"CMD_OPTS_FRAME",
68 func = function()
69 if not ddframe then
70 ddframe = CreateFrame("Frame", nil, UIParent)
71 ddframe:SetWidth(2)
72 ddframe:SetHeight(2)
73 ddframe:SetPoint("BOTTOMLEFT", GetCursorPosition())
74 ddframe:SetClampedToScreen(true)
75 dewdrop:Register(ddframe, 'dontHook', true, 'children', ArcHUD.createDDMenu)
76 end
77 local x,y = GetCursorPosition()
78 ddframe:SetPoint("BOTTOMLEFT", x / UIParent:GetScale(), y / UIParent:GetScale())
79 dewdrop:Open(ddframe)
80 end,
81 },
82 debug = {
83 type = "text",
84 name = "debug",
85 desc = L"CMD_OPTS_DEBUG",
86 get = function()
87 return debugLevels[ArcHUD:GetDebugLevel() or 4]
88 end,
89 set = function(v)
90 if(v == "notice") then
91 ArcHUD:SetDebugLevel(3)
92 ArcHUD.db.profile.Debug = 3
93 elseif(v == "info") then
94 ArcHUD:SetDebugLevel(2)
95 ArcHUD.db.profile.Debug = 2
96 elseif(v == "warn") then
97 ArcHUD:SetDebugLevel(1)
98 ArcHUD.db.profile.Debug = 1
99 elseif(v == "off") then
100 ArcHUD:SetDebugLevel(nil)
101 ArcHUD.db.profile.Debug = nil
102 end
103 end,
104 validate = {"off", "warn", "info", "notice"},
105 order = -2,
106 },
107 },
108 }, "ARCHUD")
109  
110 function ArcHUD.modDB(action, key, namespace, value)
111 if(not action or not key) then return end
112 if(namespace and not value and not ArcHUD:HasModule(namespace)) then
113 value = namespace
114 namespace = nil
115 end
116  
117 if(action == "toggle") then
118 ArcHUD:LevelDebug(3, "Toggling key '%s'", key)
119 if(namespace) then
120 ArcHUD:AcquireDBNamespace(namespace).profile[key] = not ArcHUD:AcquireDBNamespace(namespace).profile[key]
121 else
122 ArcHUD.db.profile[key] = not ArcHUD.db.profile[key]
123 end
124 elseif(action == "set") then
125 ArcHUD:LevelDebug(3, "Setting new value for key '%s' = '%s'", key, value)
126 if(namespace) then
127 ArcHUD:AcquireDBNamespace(namespace).profile[key] = tonumber(value)
128 else
129 ArcHUD.db.profile[key] = tonumber(value)
130 end
131 end
132  
133 if(namespace) then
134 ArcHUD:TriggerEvent("ARCHUD_MODULE_UPDATE", namespace)
135 else
136 ArcHUD:OnProfileDisable()
137 ArcHUD:OnProfileEnable()
138 end
139 end
140  
141 function ArcHUD.createDDMenu(level, menu)
142 if(level == 1) then
143 for _,v in ipairs(ArcHUD.dewdrop_menu["L1"]) do
144 if(type(v) == "table") then
145 ArcHUD:LevelDebug(3, "Creating button on level %s", level)
146 dewdrop:AddLine(unpack(v))
147 else
148 ArcHUD:LevelDebug(1, "Error in createDDMenu in level %d (table expected, got %s)", level, type(v))
149 end
150 end
151 else
152 if(ArcHUD.dewdrop_menu[menu]) then
153 local id
154 local val
155 local arg3
156 local arg4
157 local isradio
158 for _,v in ipairs(ArcHUD.dewdrop_menu[menu]) do
159 if(type(v) == "table") then
160 ArcHUD:LevelDebug(3, "Creating button on level %s in menu %s", level, menu)
161 id, val, arg3, arg4, isradio = nil, nil, nil, nil, nil
162 for a,b in ipairs(v) do
163 --ArcHUD:LevelDebug(3, " ID: %d, Value: %s", a, (type(b) == "function" and "function" or b))
164 if(b == "checked" or b == "sliderValue") then
165 id = a+1
166 elseif(b == "isRadio" and v[a+1]) then
167 isradio = true
168 elseif(b == "arg2" or b == "sliderArg2") then
169 val = v[a+1]
170 elseif(b == "arg3" or b == "sliderArg3") then
171 arg3 = v[a+1]
172 elseif(b == "arg4" or b == "sliderArg4") then
173 arg4 = v[a+1]
174 end
175 end
176 if(id) then
177 ArcHUD:LevelDebug(3, " Found value on '%d', setting name '%s'", id, val)
178 if(isradio) then
179 if(arg4) then
180 ArcHUD:LevelDebug(3, " Using namespace '%s'", arg3)
181 v[id] = (ArcHUD:AcquireDBNamespace(arg3).profile[val] == arg4 and true or false)
182 ArcHUD:LevelDebug(3, " Value set to '%s'", v[id])
183 else
184 v[id] = (ArcHUD.db.profile[val] == arg3 and true or false)
185 ArcHUD:LevelDebug(3, " Value set to '%s'", v[id])
186 end
187 else
188 if(arg3) then
189 ArcHUD:LevelDebug(3, " Using namespace '%s'", arg3)
190 v[id] = ArcHUD:AcquireDBNamespace(arg3).profile[val]
191 ArcHUD:LevelDebug(3, " Value set to '%s'", v[id])
192 else
193 v[id] = ArcHUD.db.profile[val]
194 ArcHUD:LevelDebug(3, " Value set to '%s'", v[id])
195 end
196 end
197 end
198 dewdrop:AddLine(unpack(v))
199 else
200 ArcHUD:LevelDebug(1, "Error in createDDMenu in level %d (table expected, got %s)", level, type(v))
201 end
202 end
203 end
204 end
205 end
206  
207 function ArcHUD:OnInitialize()
208 -- Set debug level
209 self:SetDebugLevel(self.db.profile.Debug)
210  
211 self.ClassColor = {
212 ["MAGE"] = "00FFFF",
213 ["WARLOCK"] = "8D54FB",
214 ["PRIEST"] = "FFFFFF",
215 ["DRUID"] = "FF8A00",
216 ["SHAMAN"] = "FF71A8",
217 ["PALADIN"] = "FF71A8",
218 ["ROGUE"] = "FFFF00",
219 ["HUNTER"] = "00FF00",
220 ["WARRIOR"] = "B39442",
221 }
222  
223 self:LevelDebug(3, "Creating core addon Dewdrop menu")
224 self.dewdrop_menu = {
225 ["L1"] = {
226 {"text", L("TEXT","TITLE"), "isTitle", true},
227 {"text", L("Version: ")..self.version, "notClickable", true},
228 {"text", L("Author: ")..self.author, "notClickable", true},
229 {},
230 {"text", L("TEXT","DISPLAY"), "hasArrow", true, "value", "L2_display"},
231 {"text", L("TEXT","FADE"), "hasArrow", true, "value", "L2_fade"},
232 {"text", L("TEXT","MISC"), "hasArrow", true, "value", "L2_misc"},
233 {},
234 {"text", L("TEXT","RINGS"), "isTitle", true},
235 },
236 ["L2_display"] = {
237 {
238 "text", L("TEXT","TARGETFRAME"),
239 "tooltipTitle", L("TEXT","TARGETFRAME"),
240 "tooltipText", L("TOOLTIP","TARGETFRAME"),
241 "checked", false,
242 "func", ArcHUD.modDB,
243 "arg1", "toggle",
244 "arg2", "TargetFrame"
245 },
246 {
247 "text", L("TEXT","BLIZZPLAYER"),
248 "tooltipTitle", L("TEXT","BLIZZPLAYER"),
249 "tooltipText", L("TOOLTIP","BLIZZPLAYER"),
250 "checked", false,
251 "func", ArcHUD.modDB,
252 "arg1", "toggle",
253 "arg2", "BlizzPlayer"
254 },
255 {
256 "text", L("TEXT","BLIZZTARGET"),
257 "tooltipTitle", L("TEXT","BLIZZTARGET"),
258 "tooltipText", L("TOOLTIP","BLIZZTARGET"),
259 "checked", false,
260 "func", ArcHUD.modDB,
261 "arg1", "toggle",
262 "arg2", "BlizzTarget"
263 },
264 {
265 "text", L("TEXT","PLAYERMODEL"),
266 "tooltipTitle", L("TEXT","PLAYERMODEL"),
267 "tooltipText", L("TOOLTIP","PLAYERMODEL"),
268 "checked", false,
269 "func", ArcHUD.modDB,
270 "arg1", "toggle",
271 "arg2", "PlayerModel"
272 },
273 {
274 "text", L("TEXT","MOBMODEL"),
275 "tooltipTitle", L("TEXT","MOBMODEL"),
276 "tooltipText", L("TOOLTIP","MOBMODEL"),
277 "checked", false,
278 "func", ArcHUD.modDB,
279 "arg1", "toggle",
280 "arg2", "MobModel"
281 },
282 {
283 "text", L("TEXT","SHOWGUILD"),
284 "tooltipTitle", L("TEXT","SHOWGUILD"),
285 "tooltipText", L("TOOLTIP","SHOWGUILD"),
286 "checked", false,
287 "func", ArcHUD.modDB,
288 "arg1", "toggle",
289 "arg2", "ShowGuild"
290 },
291 {
292 "text", L("TEXT","SHOWCLASS"),
293 "tooltipTitle", L("TEXT","SHOWCLASS"),
294 "tooltipText", L("TOOLTIP","SHOWCLASS"),
295 "checked", false,
296 "func", ArcHUD.modDB,
297 "arg1", "toggle",
298 "arg2", "ShowClass"
299 },
300 {
301 "text", L("TEXT","NAMEPLATES"),
302 "tooltipTitle", L("TEXT","NAMEPLATES"),
303 "tooltipText", L("TOOLTIP","NAMEPLATES"),
304 "checked", false,
305 "func", ArcHUD.modDB,
306 "arg1", "toggle",
307 "arg2", "NamePlates"
308 },
309 {
310 "text", L("TEXT","ATTACHTOP"),
311 "tooltipTitle", L("TEXT","ATTACHTOP"),
312 "tooltipText", L("TOOLTIP","ATTACHTOP"),
313 "checked", false,
314 "func", ArcHUD.modDB,
315 "arg1", "toggle",
316 "arg2", "AttachTop"
317 },
318 {
319 "text", L("TEXT","TOT"),
320 "tooltipTitle", L("TEXT","TOT"),
321 "tooltipText", L("TOOLTIP","TOT"),
322 "checked", false,
323 "func", ArcHUD.modDB,
324 "arg1", "toggle",
325 "arg2", "TargetTarget"
326 },
327 {
328 "text", L("TEXT","TOTOT"),
329 "tooltipTitle", L("TEXT","TOTOT"),
330 "tooltipText", L("TOOLTIP","TOTOT"),
331 "checked", false,
332 "func", ArcHUD.modDB,
333 "arg1", "toggle",
334 "arg2", "TargetTargetTarget"
335 },
336 {
337 "text", L("TEXT","HOVERMSG"),
338 "tooltipTitle", L("TEXT","HOVERMSG"),
339 "tooltipText", L("TOOLTIP","HOVERMSG"),
340 "checked", false,
341 "func", ArcHUD.modDB,
342 "arg1", "toggle",
343 "arg2", "HoverMsg"
344 },
345 {
346 "text", L("TEXT","HOVERDELAY"),
347 "tooltipTitle", L("TEXT","HOVERDELAY"),
348 "tooltipText", L("TOOLTIP","HOVERDELAY"),
349 "hasArrow", true,
350 "hasSlider", true,
351 "sliderMin", 0,
352 "sliderMax", 5,
353 "sliderMinText", "Instant",
354 "sliderMaxText", "5s",
355 "sliderStep", 0.5,
356 "sliderValue", 0,
357 "sliderFunc", ArcHUD.modDB,
358 "sliderArg1", "set",
359 "sliderArg2", "HoverDelay"
360 },
361 },
362 ["L2_fade"] = {
363 {
364 "text", L("TEXT","FADE_FULL"),
365 "tooltipTitle", L("TEXT","FADE_FULL"),
366 "tooltipText", L("TOOLTIP","FADE_FULL"),
367 "hasArrow", true,
368 "hasSlider", true,
369 "sliderStep", 0.01,
370 "sliderIsPercent", true,
371 "sliderValue", 0,
372 "sliderFunc", ArcHUD.modDB,
373 "sliderArg1", "set",
374 "sliderArg2", "FadeFull"
375 },
376 {
377 "text", L("TEXT","FADE_OOC"),
378 "tooltipTitle", L("TEXT","FADE_OOC"),
379 "tooltipText", L("TOOLTIP","FADE_OOC"),
380 "hasArrow", true,
381 "hasSlider", true,
382 "sliderStep", 0.01,
383 "sliderIsPercent", true,
384 "sliderValue", 0,
385 "sliderFunc", ArcHUD.modDB,
386 "sliderArg1", "set",
387 "sliderArg2", "FadeOOC"
388 },
389 {
390 "text", L("TEXT","FADE_IC"),
391 "tooltipTitle", L("TEXT","FADE_IC"),
392 "tooltipText", L("TOOLTIP","FADE_IC"),
393 "hasArrow", true,
394 "hasSlider", true,
395 "sliderStep", 0.01,
396 "sliderIsPercent", true,
397 "sliderValue", 0,
398 "sliderFunc", ArcHUD.modDB,
399 "sliderArg1", "set",
400 "sliderArg2", "FadeIC"
401 },
402 },
403 ["L2_misc"] = {
404 {
405 "text", L("TEXT","WIDTH"),
406 "tooltipTitle", L("TEXT","WIDTH"),
407 "tooltipText", L("TOOLTIP","WIDTH"),
408 "hasArrow", true,
409 "hasSlider", true,
410 "sliderMin", 30,
411 "sliderMax", 100,
412 "sliderStep", 1,
413 "sliderValue", 0,
414 "sliderFunc", ArcHUD.modDB,
415 "sliderArg1", "set",
416 "sliderArg2", "Width"
417 },
418 {
419 "text", L("TEXT","YLOC"),
420 "tooltipTitle", L("TEXT","YLOC"),
421 "tooltipText", L("TOOLTIP","YLOC"),
422 "hasArrow", true,
423 "hasSlider", true,
424 "sliderMin", -50,
425 "sliderMax", 200,
426 "sliderStep", 1,
427 "sliderValue", 0,
428 "sliderFunc", ArcHUD.modDB,
429 "sliderArg1", "set",
430 "sliderArg2", "YLoc"
431 },
432 {
433 "text", L("TEXT","SCALE"),
434 "tooltipTitle", L("TEXT","SCALE"),
435 "tooltipText", L("TOOLTIP","SCALE"),
436 "hasArrow", true,
437 "hasSlider", true,
438 "sliderStep", 0.01,
439 "sliderMax", 2,
440 "sliderIsPercent", true,
441 "sliderValue", 0,
442 "sliderFunc", ArcHUD.modDB,
443 "sliderArg1", "set",
444 "sliderArg2", "Scale"
445 },
446 {
447 "text", L("TEXT","RINGVIS"),
448 "tooltipTitle", L("TEXT","RINGVIS"),
449 "tooltipText", L("TOOLTIP","RINGVIS"),
450 "hasArrow", true,
451 "value", "L3_ringvis"
452 },
453 },
454 ["L3_ringvis"] = {
455 {
456 "text", L("TEXT","RINGVIS_1"),
457 "tooltipTitle", L("TEXT","RINGVIS_1"),
458 "tooltipText", L("TOOLTIP","RINGVIS_1"),
459 "isRadio", true,
460 "checked", true,
461 "func", ArcHUD.modDB,
462 "arg1", "set",
463 "arg2", "RingVisibility",
464 "arg3", 1
465 },
466 {
467 "text", L("TEXT","RINGVIS_2"),
468 "tooltipTitle", L("TEXT","RINGVIS_2"),
469 "tooltipText", L("TOOLTIP","RINGVIS_2"),
470 "isRadio", true,
471 "checked", false,
472 "func", ArcHUD.modDB,
473 "arg1", "set",
474 "arg2", "RingVisibility",
475 "arg3", 2
476 },
477 {
478 "text", L("TEXT","RINGVIS_3"),
479 "tooltipTitle", L("TEXT","RINGVIS_3"),
480 "tooltipText", L("TOOLTIP","RINGVIS_3"),
481 "isRadio", true,
482 "checked", false,
483 "func", ArcHUD.modDB,
484 "arg1", "set",
485 "arg2", "RingVisibility",
486 "arg3", 3
487 },
488 },
489 }
490  
491 -- Taken from Moog_Hud
492 self.RepColor = { "FF4444", "DD4444", "DD7744", "BB9944", "44DD44", "55EE44", "66FF44"}
493  
494 self:LevelDebug(3, "Registering Metrognome timers")
495 self:RegisterMetro("UpdatePetNamePlate", self.UpdatePetNamePlate, 2, self)
496 self:RegisterMetro("UpdateTargetTarget", self.UpdateTargetTarget, 1, self)
497 self:RegisterMetro("CheckNamePlateMouseOver", self.CheckNamePlateMouseOver, 0.1, self)
498  
499 self:LevelDebug(3, "Setting up TargetHUD globals")
500 self.TargetHUD = getglobal("ArcTargetHUD")
501 self.TargetHUD.frame = "ArcTargetHUD"
502 self.TargetHUD.Name = getglobal(self.TargetHUD.frame.."Name")
503 self.TargetHUD.Level = getglobal(self.TargetHUD.frame.."Level")
504 self.TargetHUD.HPText = getglobal(self.TargetHUD.frame.."HPText")
505 self.TargetHUD.MPText = getglobal(self.TargetHUD.frame.."MPText")
506 self.TargetHUD.PVPIcon = getglobal(self.TargetHUD.frame.."PVPIcon")
507 self.TargetHUD.MLIcon = getglobal(self.TargetHUD.frame.."MLIcon")
508 self.TargetHUD.LeaderIcon = getglobal(self.TargetHUD.frame.."LeaderIcon")
509 self.TargetHUD.RaidTargetIcon = getglobal(self.TargetHUD.frame.."RaidTargetIcon")
510 self.TargetHUD.Combo = getglobal("ArcHUDFrameCombo")
511 self.TargetHUD.Model = getglobal("ArcPlayerModelFrame")
512  
513 self.TargetHUD.Target = getglobal(self.TargetHUD.frame.."Target")
514 self.TargetHUD.Target.frame = self.TargetHUD.frame.."Target"
515 self.TargetHUD.Target.Name = getglobal(self.TargetHUD.Target.frame.."Name")
516 self.TargetHUD.Target.HPText = getglobal(self.TargetHUD.Target.frame.."HPText")
517 self.TargetHUD.Target.MPText = getglobal(self.TargetHUD.Target.frame.."MPText")
518  
519 self.TargetHUD.TargetTarget = getglobal(self.TargetHUD.frame.."TargetTarget")
520 self.TargetHUD.TargetTarget.frame = self.TargetHUD.frame.."TargetTarget"
521 self.TargetHUD.TargetTarget.Name = getglobal(self.TargetHUD.TargetTarget.frame.."Name")
522 self.TargetHUD.TargetTarget.HPText = getglobal(self.TargetHUD.TargetTarget.frame.."HPText")
523 self.TargetHUD.TargetTarget.MPText = getglobal(self.TargetHUD.TargetTarget.frame.."MPText")
524  
525 self:LevelDebug(3, "Setting up NamePlate globals")
526 self.NamePlates = {}
527 -- Player clickable nameplate
528 self.NamePlates.Player = getglobal("ArcHUDFramePlayerNamePlate")
529 self.NamePlates.Player.frame = "ArcHUDFramePlayerNamePlate"
530 self.NamePlates.Player.unit = "player"
531 self.NamePlates.Player.Text = getglobal(self.NamePlates.Player.frame.."Text")
532  
533 -- Pet clickable nameplate
534 self.NamePlates.Pet = getglobal("ArcHUDFramePetNamePlate")
535 self.NamePlates.Pet.frame = "ArcHUDFramePetNamePlate"
536 self.NamePlates.Pet.unit = "pet"
537 self.NamePlates.Pet.Text = getglobal(self.NamePlates.Pet.frame.."Text")
538  
539 -- Target clickable nameplate
540 self.NamePlates.Target = getglobal(self.TargetHUD.frame.."NamePlate")
541 self.NamePlates.Target.frame = self.TargetHUD.frame.."NamePlate"
542 self.NamePlates.Target.unit = "target"
543  
544 -- Targettarget clickable nameplate
545 self.NamePlates.TargetTarget = getglobal(self.TargetHUD.frame.."TargetNamePlate")
546 self.NamePlates.TargetTarget.frame = self.TargetHUD.frame.."TargetNamePlate"
547 self.NamePlates.TargetTarget.unit = "targettarget"
548  
549 -- Targettargettarget clickable nameplate
550 self.NamePlates.TargetTargetTarget = getglobal(self.TargetHUD.frame.."TargetTargetNamePlate")
551 self.NamePlates.TargetTargetTarget.frame = self.TargetHUD.frame.."TargetTargetNamePlate"
552 self.NamePlates.TargetTargetTarget.unit = "targettargettarget"
553  
554 self:LevelDebug(3, "Initializing nameplates")
555 -- Initialize nameplate dropdowns
556 self:InitNamePlate("Target")
557 self:InitNamePlate("TargetTarget")
558 self:InitNamePlate("TargetTargetTarget")
559 self:InitNamePlate("Player")
560 self:InitNamePlate("Pet")
561  
562 -- Update fonts for locale
563 self:LevelDebug(3, "Updating fonts for locale")
564 self:UpdateFonts(self.TargetHUD)
565 self:UpdateFonts(self.NamePlates)
566  
567 self.TargetHUD.PVPIcon:GetParent():SetScale(0.6)
568 self.TargetHUD.RaidTargetIcon:GetParent():SetScale(0.75)
569  
570 self:TriggerEvent("ARCHUD_LOADED")
571 self:LevelDebug(2, "ArcHUD has been initialized.")
572 end
573  
574 function ArcHUD:OnEnable()
575 self:LevelDebug(3, "Registering events")
576 self:RegisterEvent("PLAYER_COMBO_POINTS", "EventHandler")
577 self:RegisterEvent("PLAYER_ENTERING_WORLD", "EventHandler")
578  
579 self:RegisterEvent("PLAYER_ENTER_COMBAT", "CombatStatus")
580 self:RegisterEvent("PLAYER_LEAVE_COMBAT", "CombatStatus")
581 self:RegisterEvent("PLAYER_REGEN_ENABLED", "CombatStatus")
582 self:RegisterEvent("PLAYER_REGEN_DISABLED", "CombatStatus")
583 self:RegisterEvent("PET_ATTACK_START", "CombatStatus")
584 self:RegisterEvent("PET_ATTACK_STOP", "CombatStatus")
585  
586 self:RegisterEvent("UNIT_FACTION", "UpdateFaction")
587 self:RegisterEvent("PARTY_MEMBERS_CHANGED", "UpdateFaction")
588  
589 self:RegisterEvent("RAID_TARGET_UPDATE", "UpdateRaidTargetIcon")
590  
591 self:RegisterEvent("PLAYER_FLAGS_CHANGED")
592  
593 self:OnProfileEnable()
594  
595 self.Enabled = true
596  
597 ArcHUDFrame:Show()
598 self:LevelDebug(3, "Triggering ring enable event")
599 self:TriggerEvent("ARCHUD_MODULE_ENABLE")
600 self:LevelDebug(2, "ArcHUD is now enabled")
601 end
602  
603 function ArcHUD:OnDisable()
604 self:LevelDebug(3, "Triggering ring disable event")
605 self:TriggerEvent("ARCHUD_MODULE_DISABLE")
606  
607 -- Hide frame
608 ArcHUDFrame:Hide()
609  
610 self.Enabled = false
611 self:LevelDebug(2, "ArcHUD is now disabled")
612 end
613  
614 function ArcHUD:OnProfileEnable()
615 if(self.db.profile.BlizzPlayer and self.BlizzPlayerHidden or not self.db.profile.BlizzPlayer and not self.BlizzPlayerHidden) then
616 self:HideBlizzardPlayer(self.db.profile.BlizzPlayer)
617 end
618 if(self.db.profile.BlizzTarget and self.BlizzTargetHidden or not self.db.profile.BlizzTarget and not self.BlizzTargetHidden) then
619 self:HideBlizzardTarget(self.db.profile.BlizzTarget)
620 end
621  
622 if(self.db.profile.TargetFrame) then
623 self:LevelDebug(3, "Targetframe enabled. Registering unit events")
624 self:RegisterEvent("UNIT_HEALTH", "EventHandler")
625 self:RegisterEvent("UNIT_MAXHEALTH", "EventHandler")
626 self:RegisterEvent("UNIT_MANA", "EventHandler")
627 self:RegisterEvent("UNIT_RAGE", "EventHandler")
628 self:RegisterEvent("UNIT_FOCUS", "EventHandler")
629 self:RegisterEvent("UNIT_ENERGY", "EventHandler")
630 self:RegisterEvent("UNIT_MAXMANA", "EventHandler")
631 self:RegisterEvent("UNIT_MAXRAGE", "EventHandler")
632 self:RegisterEvent("UNIT_MAXFOCUS", "EventHandler")
633 self:RegisterEvent("UNIT_MAXENERGY", "EventHandler")
634 self:RegisterEvent("UNIT_DISPLAYPOWER", "EventHandler")
635 if(self.db.profile.ShowBuffs) then
636 self:RegisterEvent("UNIT_AURA", "TargetAuras")
637 else
638 for i=1,16 do
639 getglobal(self.TargetHUD.frame.."Buff"..i):Hide()
640 getglobal(self.TargetHUD.frame.."DeBuff"..i):Hide()
641 end
642 end
643 self:RegisterEvent("PLAYER_TARGET_CHANGED", "TargetUpdate")
644  
645 -- Show target frame if we have a target
646 if(UnitExists("target")) then
647 self:TargetUpdate()
648 end
649  
650 self:LevelDebug(3, "Enabling TargetTarget updates")
651 -- Enable Target's Target('s Target) updates
652 self:StartMetro("UpdateTargetTarget")
653  
654  
655 if(self.db.profile.AttachTop) then
656 self:LevelDebug(3, "Attaching targetframe to top")
657 self.TargetHUD:ClearAllPoints()
658 self.TargetHUD:SetPoint("BOTTOM", self.TargetHUD:GetParent(), "TOP", 0, -100)
659 else
660 self:LevelDebug(3, "Attaching targetframe to bottom")
661 self.TargetHUD:ClearAllPoints()
662 self.TargetHUD:SetPoint("TOP", self.TargetHUD:GetParent(), "BOTTOM", 0, -50)
663 end
664 else
665 self:StopMetro("UpdateTargetTarget")
666 self.TargetHUD:Hide()
667 end
668  
669 self:LevelDebug(3, "Positioning ring anchors. Width: "..self.db.profile.Width)
670 -- Position the HUD according to user settings
671 if(self:HasModule("Anchors")) then
672 self:GetModule("Anchors").Left:ClearAllPoints()
673 self:GetModule("Anchors").Left:SetPoint("TOPLEFT", ArcHUDFrame, "TOPLEFT", 0-self.db.profile.Width, 0)
674 self:GetModule("Anchors").Right:ClearAllPoints()
675 self:GetModule("Anchors").Right:SetPoint("TOPLEFT", ArcHUDFrame, "TOPRIGHT", self.db.profile.Width, 0)
676 end
677  
678 self:LevelDebug(3, "Position frame. YLoc: "..self.db.profile.YLoc)
679 ArcHUDFrame:ClearAllPoints()
680 ArcHUDFrame:SetPoint("CENTER", WorldFrame, "CENTER", 0, self.db.profile.YLoc)
681  
682 self:LevelDebug(3, "Setting scale. Scale: "..self.db.profile.Scale)
683 -- Scale the HUD according to user settings.
684 ArcHUDFrame:SetScale(self.db.profile.Scale)
685  
686 -- Set initial combat flags
687 self.PlayerIsInCombat = false
688 self.PlayerIsRegenOn = true
689 self.PetIsInCombat = false
690  
691 self:LevelDebug(3, "Setting player name to nameplate")
692 -- Set playername
693 self:UpdateFaction()
694  
695 -- Enable nameplate updates
696 if(self.db.profile.NamePlates) then
697 self:LevelDebug(3, "Nameplates enabled. Showing frames and starting update timers")
698 self:UnregisterMetro("Enable_player")
699 self:UnregisterMetro("Enable_pet")
700 self:RegisterMetro("Enable_player", self.EnableDisableNameplate, self.db.profile.HoverDelay, self, "Player")
701 self:RegisterMetro("Enable_pet", self.EnableDisableNameplate, self.db.profile.HoverDelay, self, "Pet")
702 self.NamePlates.Player:Show()
703 self.NamePlates.Pet:Show()
704 self:StartMetro("UpdatePetNamePlate")
705 self:StartMetro("CheckNamePlateMouseOver")
706 else
707 self:LevelDebug(3, "Nameplates not enabled.")
708 self:UnregisterMetro("Enable_player")
709 self:UnregisterMetro("Enable_pet")
710 self.NamePlates.Player:Hide()
711 self.NamePlates.Pet:Hide()
712 end
713 end
714  
715 function ArcHUD:OnProfileDisable()
716 self:LevelDebug(3, "Unregistering events")
717 if(self:IsEventRegistered("UNIT_HEALTH")) then
718 self:UnregisterEvent("UNIT_HEALTH")
719 self:UnregisterEvent("UNIT_MAXHEALTH")
720 self:UnregisterEvent("UNIT_MANA")
721 self:UnregisterEvent("UNIT_RAGE")
722 self:UnregisterEvent("UNIT_FOCUS")
723 self:UnregisterEvent("UNIT_ENERGY")
724 self:UnregisterEvent("UNIT_MAXMANA")
725 self:UnregisterEvent("UNIT_MAXRAGE")
726 self:UnregisterEvent("UNIT_MAXFOCUS")
727 self:UnregisterEvent("UNIT_MAXENERGY")
728 self:UnregisterEvent("UNIT_DISPLAYPOWER")
729 end
730 if(self:IsEventRegistered("UNIT_AURA")) then self:UnregisterEvent("UNIT_AURA") end
731 if(self:IsEventRegistered("UNIT_FACTION")) then self:UnregisterEvent("UNIT_FACTION") end
732 if(self:IsEventRegistered("PLAYER_TARGET_CHANGED")) then self:UnregisterEvent("PLAYER_TARGET_CHANGED") end
733  
734 self:LevelDebug(3, "Disabling timers")
735 self:StopMetro("UpdateTargetTarget")
736 self:StopMetro("UpdatePetNamePlate")
737 self:StopMetro("CheckNamePlateMouseOver")
738 self:UnregisterMetro("Enable_player")
739 self:UnregisterMetro("Enable_pet")
740  
741 self:LevelDebug(3, "Hiding frames")
742 for i=1,16 do
743 getglobal(self.TargetHUD.frame.."Buff"..i):Hide()
744 getglobal(self.TargetHUD.frame.."DeBuff"..i):Hide()
745 end
746 self.TargetHUD:Hide()
747 self.NamePlates.Player:Hide()
748 self.NamePlates.Pet:Hide()
749 end
750  
751 function ArcHUD:ResetOptionsConfirm()
752 self:ResetDB("profile")
753 self:OnProfileDisable()
754 self:OnProfileEnable()
755 self:TriggerEvent("ARCHUD_MODULE_UPDATE")
756 self:Print(L"TEXT_RESET_CONFIRM")
757 end
758  
759 function ArcHUD:InitNamePlate(frame)
760 local this = self.NamePlates[frame]
761  
762 this:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up")
763  
764 this.OnClick = function(self)
765 if(ArcHUD_CustomClick) then
766 ArcHUD_CustomClick(arg1, self.unit)
767 else
768 if(SpellIsTargeting()) then
769 SpellStopTargeting()
770 return
771 end
772 if(arg1 == "LeftButton") then
773 TargetUnit(self.unit)
774 elseif(arg1 == "RightButton") then
775 ToggleDropDownMenu(1, nil, getglobal(ArcHUD:strcap(self.unit).."FrameDropDown"), "cursor", 0, 0)
776 end
777 end
778 end
779 this.OnEnter = function(self)
780 if(SpellIsTargeting()) then
781 if (SpellCanTargetUnit(self.unit)) then
782 SetCursor("CAST_CURSOR")
783 else
784 SetCursor("CAST_ERROR_CURSOR")
785 end
786 end
787 GameTooltip:SetOwner(self, ANCHOR_BOTTOMRIGHT)
788 GameTooltip:SetUnit(self.unit)
789 GameTooltip:Show()
790 end
791 this.OnLeave = function(self)
792 if(SpellIsTargeting()) then
793 SetCursor("CAST_ERROR_CURSOR")
794 end
795 if(GameTooltip:IsOwned(self)) then
796 GameTooltip:Hide()
797 end
798 end
799  
800 if(frame ~= "Target" and frame ~= "TargetTarget" and frame ~= "TargetTargetTarget") then
801 self:RegisterMetro(frame.."Alpha", ArcHUDRingTemplate.AlphaUpdate, 0.01, this)
802 self:StartMetro(frame.."Alpha")
803  
804 this.fadeIn = 0.25
805 this.fadeOut = 0.25
806  
807 ArcHUDRingTemplate.SetRingAlpha(this, self.db.profile.FadeFull)
808 else
809 this.Enabled = TRUE
810 end
811 end
812  
813 function ArcHUD:CheckNamePlateMouseOver()
814 if(MouseIsOver(self.NamePlates.Player)) then
815 if(not self.NamePlates.Player.Started) then
816 ArcHUDRingTemplate.SetRingAlpha(self.NamePlates.Player, 1.0)
817 self.NamePlates.Player.Started = true
818 self:StartMetro("Enable_player")
819 end
820 else
821 if(self.NamePlates.Player.Started) then
822 ArcHUDRingTemplate.SetRingAlpha(self.NamePlates.Player, self.db.profile.FadeFull)
823 self:StopMetro("Enable_player")
824 self.NamePlates.Player.Started = false
825 self.NamePlates.Player:EnableMouse(false)
826 self.NamePlates.Player:SetToplevel(false)
827 end
828 end
829  
830 -- Check pet nameplate
831 if(not UnitExists("pet")) then
832 return
833 end
834 if(MouseIsOver(self.NamePlates.Pet)) then
835 if(not self.NamePlates.Pet.Started) then
836 ArcHUDRingTemplate.SetRingAlpha(self.NamePlates.Pet, 1.0)
837 self.NamePlates.Pet.Started = true
838 self:StartMetro("Enable_pet")
839 end
840 else
841 if(self.NamePlates.Pet.Started) then
842 ArcHUDRingTemplate.SetRingAlpha(self.NamePlates.Pet, self.db.profile.FadeFull)
843 self:StopMetro("Enable_pet")
844 self.NamePlates.Pet.Started = false
845 self.NamePlates.Pet:EnableMouse(false)
846 self.NamePlates.Pet:SetToplevel(false)
847 end
848 end
849 end
850  
851 function ArcHUD:EnableDisableNameplate(unit)
852 self.NamePlates[unit]:EnableMouse(true)
853 self.NamePlates[unit]:SetToplevel(true)
854 self:StopMetro("Enable_"..string.lower(unit))
855 if(self.db.profile.HoverMsg) then
856 self:Print("Enabling mouse input for "..unit)
857 end
858 end
859  
860 function ArcHUD:TargetUpdate()
861 -- Make sure we are targeting someone and that ArcHUD is enabled
862 if (UnitExists("target") and self.db.profile.TargetFrame) then
863 -- 3D target model
864 if((self.db.profile.PlayerModel and UnitIsPlayer("target")) or (self.db.profile.MobModel and not UnitIsPlayer("target"))) then
865 self.TargetHUD.Model:Show()
866 self.TargetHUD.Model:SetUnit("target")
867 else
868 self.TargetHUD.Model:Hide()
869 end
870 self.TargetHUD:Show()
871  
872 if(UnitIsDead("target") or UnitIsGhost("target")) then
873 self.TargetHUD.HPText:SetText("Dead")
874 else
875 -- Support for MobHealth3
876 if(MobHealth3) then
877 local cur, max, found = MobHealth3:GetUnitHealth("target", UnitHealth("target"), UnitHealthMax("target"))
878 self.TargetHUD.HPText:SetText(cur.."/"..max)
879 -- Support for MobHealth2 / MobInfo-2
880 elseif(self:MobHealth_GetTargetCurHP()) then
881 self.TargetHUD.HPText:SetText(self:MobHealth_GetTargetCurHP().."/"..self:MobHealth_GetTargetMaxHP())
882 else
883 self.TargetHUD.HPText:SetText(UnitHealth("target").."/"..UnitHealthMax("target"))
884 end
885 end
886  
887 -- Does the unit have mana? If so we want to show it
888 if (UnitManaMax("target") > 0) then
889 self.TargetHUD.MPText:SetText(UnitMana("target").."/"..UnitManaMax("target"))
890 else
891 self.TargetHUD.MPText:SetText(" ")
892 end
893  
894 local addtolevel = ""
895 if(self.db.profile.ShowClass) then
896 addtolevel = " " .. (UnitIsPlayer("target") and UnitClass("target") or UnitCreatureFamily("target") or UnitCreatureType("target"))
897 self.TargetHUD.Level:SetJustifyH("CENTER")
898 else
899 self.TargetHUD.Level:SetJustifyH("LEFT")
900 end
901 -- What kind of target is it? If UnitLevel returns negative we have a target whose
902 -- level are too high to show or a boss
903 if (UnitLevel("target") < 0) then
904 if ( UnitClassification("target") == "worldboss" ) then
905 self.TargetHUD.Level:SetText("Boss" .. addtolevel)
906 else
907 self.TargetHUD.Level:SetText("L??" .. addtolevel)
908 end
909 else
910 -- Make sure we mark elites with a + after the level
911 if(not string.find(UnitClassification("target"), "elite")) then
912 self.TargetHUD.Level:SetText("L" .. UnitLevel("target") .. addtolevel)
913 else
914 self.TargetHUD.Level:SetText("L" .. UnitLevel("target") .. "+" .. addtolevel)
915 end
916 end
917  
918 -- Check if the target is friendly to the player
919 targetfriend = UnitIsFriend("player","target")
920  
921 -- Color the level display based on the targets level in relation
922 -- to player level
923 if (targetfriend) then
924 self.TargetHUD.Level:SetTextColor(1, 0.9, 0)
925 elseif (UnitIsTrivial("target")) then
926 self.TargetHUD.Level:SetTextColor(0.7, 0.7, 0.7)
927 elseif (UnitLevel("target") == -1) then
928 self.TargetHUD.Level:SetTextColor(1, 0, 0)
929 elseif (UnitLevel("target") <= (UnitLevel("player")-3)) then
930 self.TargetHUD.Level:SetTextColor(0, 0.9, 0)
931 elseif (UnitLevel("target") >= (UnitLevel("player")+5)) then
932 self.TargetHUD.Level:SetTextColor(1, 0, 0)
933 elseif (UnitLevel("target") >= (UnitLevel("player")+3)) then
934 self.TargetHUD.Level:SetTextColor(1, 0.5, 0)
935 else
936 self.TargetHUD.Level:SetTextColor(1, 0.9, 0)
937 end
938  
939 -- Color the targets hp and mana text correctly
940 local info = {}
941 if (UnitPowerType("target") == 0) then
942 info = { r = 0.00, g = 1.00, b = 1.00 }
943 else
944 info = ManaBarColor[UnitPowerType("target")]
945 end
946 self.TargetHUD.MPText:SetTextColor(info.r, info.g, info.b)
947  
948 if(targetfriend) then
949 self.TargetHUD.HPText:SetTextColor(0, 1, 0)
950 else
951 self.TargetHUD.HPText:SetTextColor(1, 0, 0)
952 end
953  
954 -- The name of the target should be colored differently if it's a player or if
955 -- it's a mob
956 local _, class = UnitClass("target")
957 local color = self.ClassColor[class]
958 if (color and UnitIsPlayer("target")) then
959 -- Is target in a guild?
960 local guild, _, _ = GetGuildInfo("target")
961  
962 -- Color the target name based on class since we have a player targeted
963 if(guild and ArcHUD.db.profile.ShowGuild) then
964 self.TargetHUD.Name:SetText("|cff"..color..UnitName("target").." <"..guild..">".."|r")
965 else
966 self.TargetHUD.Name:SetText("|cff"..color..UnitName("target").."|r")
967 end
968 else
969 -- Color the target name based on reaction (red to green) since we have a
970 -- mob targeted
971 local reaction = self.RepColor[UnitReaction("target","player")]
972 if(reaction) then
973 self.TargetHUD.Name:SetText("|cff"..reaction..UnitName("target").."|r")
974 else
975 self.TargetHUD.Name:SetText(UnitName("target"))
976 end
977 end
978  
979 -- Show clickable nameplate only if the target is a friendly player and not self
980 --[[if(UnitIsPlayer("target") and targetfriend and not UnitIsUnit("player", "target")) then
981 self.NamePlates.Target:Show()
982 else
983 self.NamePlates.Target:Hide()
984 end]]
985  
986 if(self.db.profile.ShowBuffs) then
987 -- Update buffs and debuffs for the target
988 self:TargetAuras()
989 end
990  
991 self:UpdateFaction("target")
992 self:UpdateRaidTargetIcon()
993 self:PLAYER_FLAGS_CHANGED("target")
994  
995 if(self.BlizzTargetHidden) then
996 if(UnitIsEnemy("target", "player")) then
997 PlaySound("igCreatureAggroSelect")
998 elseif(UnitIsFriend("player", "target")) then
999 PlaySound("igCharacterNPCSelect")
1000 else
1001 PlaySound("igCreatureNeutralSelect")
1002 end
1003 end
1004 else
1005 -- We didn't have anything targeted or ArcHUD is disabled so lets hide the
1006 -- target frame again
1007 if(self.BlizzTargetHidden) then
1008 PlaySound("INTERFACESOUND_LOSTTARGETUNIT")
1009 end
1010 self.TargetHUD:Hide()
1011 end
1012 end
1013  
1014 function ArcHUD:UpdateFaction(unit)
1015 self:LevelDebug(2, "UpdateFaction: arg1 = %s, unit = %s", arg1 or "nil", unit or "nil")
1016  
1017 if(not unit and arg1 and arg1 ~= "player") then return end
1018 if(arg1 and not unit) then unit = arg1 end
1019  
1020 if(unit and unit == "target") then
1021 local factionGroup = UnitFactionGroup("target")
1022 if(UnitIsPVPFreeForAll("target")) then
1023 self.TargetHUD.PVPIcon:SetTexture("Interface\\TargetingFrame\\UI-PVP-FFA")
1024 self.TargetHUD.PVPIcon:Show()
1025 elseif(factionGroup and UnitIsPVP("target")) then
1026 self.TargetHUD.PVPIcon:SetTexture("Interface\\TargetingFrame\\UI-PVP-"..factionGroup)
1027 self.TargetHUD.PVPIcon:Show()
1028 else
1029 self.TargetHUD.PVPIcon:Hide()
1030 end
1031 else
1032 local factionGroup, factionName = UnitFactionGroup("player");
1033 local _, class = UnitClass("player")
1034 local color = self.ClassColor[class]
1035 if(UnitIsPVPFreeForAll("player")) then
1036 self.NamePlates.Player.Text:SetText("|cffffff00[FFA] |cff"..(color or "ffffff")..(UnitName("player") or "Unknown Entity").."|r")
1037 elseif(factionGroup and UnitIsPVP("player")) then
1038 self.NamePlates.Player.Text:SetText("|cffff0000[PVP] |cff"..(color or "ffffff")..(UnitName("player") or "Unknown Entity").."|r")
1039 else
1040 self.NamePlates.Player.Text:SetText("|cff"..(color or "ffffff")..(UnitName("player") or "Unknown Entity").."|r")
1041 end
1042 end
1043 end
1044  
1045 function ArcHUD:UpdateRaidTargetIcon()
1046 if(not UnitExists("target")) then self.TargetHUD.RaidTargetIcon:Hide() return end
1047  
1048 local index = GetRaidTargetIndex("target")
1049 if(index) then
1050 SetRaidTargetIconTexture(self.TargetHUD.RaidTargetIcon, index)
1051 self.TargetHUD.RaidTargetIcon:Show()
1052 else
1053 self.TargetHUD.RaidTargetIcon:Hide()
1054 end
1055 end
1056  
1057 function ArcHUD:PLAYER_FLAGS_CHANGED(unit)
1058 if(arg1 and not unit) then unit = arg1 end
1059 if(not UnitExists("target")) then self.TargetHUD.LeaderIcon:Hide() return end
1060  
1061 if(unit == "target") then
1062 if(UnitIsPartyLeader("target")) then
1063 self.TargetHUD.LeaderIcon:Show()
1064 else
1065 self.TargetHUD.LeaderIcon:Hide()
1066 end
1067 end
1068 end
1069  
1070 function ArcHUD:TargetAuras()
1071 if(not arg1 == "target") then return end
1072 local frame = self.TargetHUD.frame
1073 local unit = "target"
1074 local i, icon, buff, debuff, debuffborder, debuffcount, debuffType, color
1075 for i = 1, 16 do
1076 buff = UnitBuff(unit, i)
1077 button = getglobal(frame.."Buff"..i)
1078 if (buff) then
1079 icon = getglobal(button:GetName().."Icon")
1080 icon:SetTexture(buff)
1081 button:Show()
1082 button.unit = unit
1083 else
1084 button:Hide()
1085 end
1086 end
1087  
1088 for i = 1, 16 do
1089 debuff, debuffApplications, debuffType = UnitDebuff(unit, i)
1090 button = getglobal(frame.."DeBuff"..i)
1091 if (debuff) then
1092 icon = getglobal(button:GetName().."Icon")
1093 debuffborder = getglobal(button:GetName().."Border")
1094 debuffcount = getglobal(button:GetName().."Count")
1095 icon:SetTexture(debuff)
1096 button:Show()
1097 debuffborder:Show()
1098 button.isdebuff = 1
1099 button.unit = unit
1100 if ( debuffType ) then
1101 color = DebuffTypeColor[debuffType]
1102 else
1103 color = DebuffTypeColor["none"]
1104 end
1105 debuffborder:SetVertexColor(color.r, color.g, color.b)
1106 if (debuffApplications > 1) then
1107 debuffcount:SetText(debuffApplications)
1108 debuffcount:Show()
1109 else
1110 debuffcount:Hide()
1111 end
1112 else
1113 button:Hide()
1114 end
1115 end
1116 end
1117  
1118 function ArcHUD:SetAuraTooltip(this)
1119 if (not this:IsVisible()) then return end
1120 GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
1121 local unit = this.unit
1122 if (this.isdebuff == 1) then
1123 GameTooltip:SetUnitDebuff(unit, this:GetID())
1124 else
1125 GameTooltip:SetUnitBuff(unit, this:GetID())
1126 end
1127 end
1128  
1129 function ArcHUD:EventHandler()
1130 if (event == "UNIT_DISPLAYPOWER") then
1131 local info = {}
1132 if (arg1 == "target") then
1133 if (UnitPowerType(arg1) == 0) then
1134 info = { r = 0.00, g = 1.00, b = 1.00 }
1135 else
1136 info = ManaBarColor[UnitPowerType(arg1)]
1137 end
1138 self.TargetHUD.MPText:SetTextColor(info.r, info.g, info.b)
1139 end
1140 elseif (event == "PLAYER_COMBO_POINTS") then
1141 local points = GetComboPoints()
1142 if (points > 0) then
1143 self.TargetHUD.Combo:SetText(points)
1144 else
1145 self.TargetHUD.Combo:SetText("")
1146 end
1147 elseif (event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH") then
1148 if (arg1 == "target") then
1149 -- Support for MobHealth3
1150 if(MobHealth3) then
1151 local cur, max, found = MobHealth3:GetUnitHealth(arg1, UnitHealth(arg1), UnitHealthMax(arg1))
1152 self.TargetHUD.HPText:SetText(cur.."/"..max)
1153 -- Support for MobHealth2 / MobInfo-2
1154 elseif(self:MobHealth_GetTargetCurHP()) then
1155 self.TargetHUD.HPText:SetText(self:MobHealth_GetTargetCurHP().."/"..self:MobHealth_GetTargetMaxHP())
1156 else
1157 self.TargetHUD.HPText:SetText(UnitHealth(arg1).."/"..UnitHealthMax(arg1))
1158 end
1159 end
1160 elseif(event == "PLAYER_ENTERING_WORLD") then
1161 self.PlayerIsInCombat = false
1162 self.PlayerIsRegenOn = true
1163 else
1164 if (arg1 == "target") then
1165 self.TargetHUD.MPText:SetText(UnitMana(arg1).."/"..UnitManaMax(arg1))
1166 end
1167 end
1168 end
1169  
1170 function ArcHUD:CombatStatus()
1171 self:LevelDebug(2, "CombatStatus: event = " .. event)
1172 if(event == "PLAYER_ENTER_COMBAT" or event == "PLAYER_REGEN_DISABLED") then
1173 self.PlayerIsInCombat = true
1174 if(event == "PLAYER_REGEN_DISABLED") then
1175 self.PlayerIsRegenOn = false
1176 end
1177 elseif(event == "PLAYER_LEAVE_COMBAT" or event == "PLAYER_REGEN_ENABLED") then
1178 if(event == "PLAYER_LEAVE_COMBAT" and self.PlayerIsRegenOn) then
1179 self.PlayerIsInCombat = false
1180 elseif(event == "PLAYER_REGEN_ENABLED") then
1181 self.PlayerIsInCombat = false
1182 self.PlayerIsRegenOn = true
1183 end
1184 elseif(event == "PET_ATTACK_START") then
1185 self.PetIsInCombat = true
1186 elseif(event == "PET_ATTACK_STOP") then
1187 self.PetIsInCombat = false
1188 end
1189 end
1190  
1191 function ArcHUD:UpdatePetNamePlate()
1192 if(UnitExists("pet")) then
1193 local happiness, _, _ = GetPetHappiness()
1194 local color
1195 if(happiness) then
1196 if(happiness == 1) then
1197 color = "ff0000"
1198 happiness = " :("
1199 elseif(happiness == 2) then
1200 color = "ffff00"
1201 happiness = " :||"
1202 elseif(happiness == 3) then
1203 color = "00ff00"
1204 happiness = " :)"
1205 end
1206 else
1207 color = "ffffff"
1208 happiness = ""
1209 end
1210 self.NamePlates.Pet.Text:SetText("|cff"..color..UnitName("pet").." "..happiness.."|r")
1211 self.NamePlates.Pet:Show()
1212 else
1213 self.NamePlates.Pet:Hide()
1214 end
1215 end
1216  
1217 function ArcHUD:UpdateTargetTarget()
1218 -- Handle Target's Target
1219 if(UnitExists("targettarget") and self.db.profile.TargetTarget) then
1220 local _, class = UnitClass("targettarget")
1221 local color = self.ClassColor[class]
1222 if (color and UnitIsPlayer("targettarget")) then
1223 self.TargetHUD.Target.Name:SetText("|cff"..color..UnitName("targettarget").."|r")
1224 else
1225 local reaction = self.RepColor[UnitReaction("targettarget","player")]
1226 if(reaction) then
1227 self.TargetHUD.Target.Name:SetText("|cff"..reaction..UnitName("targettarget").."|r")
1228 else
1229 self.TargetHUD.Target.Name:SetText(UnitName("targettarget"))
1230 end
1231 end
1232  
1233 local info = {}
1234 if (UnitPowerType("targettarget") == 0) then
1235 info = { r = 0.00, g = 1.00, b = 1.00 }
1236 else
1237 info = ManaBarColor[UnitPowerType("targettarget")]
1238 end
1239 self.TargetHUD.Target.MPText:SetTextColor(info.r, info.g, info.b)
1240  
1241 if(UnitIsFriend("player","targettarget")) then
1242 self.TargetHUD.Target.HPText:SetTextColor(0, 1, 0)
1243 else
1244 self.TargetHUD.Target.HPText:SetTextColor(1, 0, 0)
1245 end
1246 if(UnitIsDead("targettarget") or UnitIsGhost("targettarget")) then
1247 self.TargetHUD.Target.HPText:SetText("Dead")
1248 else
1249 self.TargetHUD.Target.HPText:SetText(math.floor(UnitHealth("targettarget")/UnitHealthMax("targettarget")*100).."%")
1250 end
1251  
1252 if (UnitManaMax("targettarget") > 0) then
1253 self.TargetHUD.Target.MPText:SetText(math.floor(UnitMana("targettarget")/UnitManaMax("targettarget")*100).."%")
1254 else
1255 self.TargetHUD.Target.MPText:SetText(" ")
1256 end
1257 self.TargetHUD.Target:Show()
1258 else
1259 self.TargetHUD.Target:Hide()
1260 end
1261  
1262 -- Handle Target's Target's Target
1263 if(UnitExists("targettargettarget") and self.db.profile.TargetTargetTarget) then
1264 local _, class = UnitClass("targettargettarget")
1265 local color = self.ClassColor[class]
1266 if (color and UnitIsPlayer("targettargettarget")) then
1267 self.TargetHUD.TargetTarget.Name:SetText("|cff"..color..UnitName("targettargettarget").."|r")
1268 else
1269 local reaction = self.RepColor[UnitReaction("targettargettarget","player")]
1270 if(reaction) then
1271 self.TargetHUD.TargetTarget.Name:SetText("|cff"..reaction..UnitName("targettargettarget").."|r")
1272 else
1273 self.TargetHUD.TargetTarget.Name:SetText(UnitName("targettargettarget"))
1274 end
1275 end
1276  
1277 local info = {}
1278 if (UnitPowerType("targettargettarget") == 0) then
1279 info = { r = 0.00, g = 1.00, b = 1.00 }
1280 else
1281 info = ManaBarColor[UnitPowerType("targettargettarget")]
1282 end
1283 self.TargetHUD.TargetTarget.MPText:SetTextColor(info.r, info.g, info.b)
1284  
1285 if(UnitIsFriend("player","targettargettarget")) then
1286 self.TargetHUD.TargetTarget.HPText:SetTextColor(0, 1, 0)
1287 else
1288 self.TargetHUD.TargetTarget.HPText:SetTextColor(1, 0, 0)
1289 end
1290 if(UnitIsDead("targettargettarget") or UnitIsGhost("targettargettarget")) then
1291 self.TargetHUD.TargetTarget.HPText:SetText("Dead")
1292 else
1293 self.TargetHUD.TargetTarget.HPText:SetText(math.floor(UnitHealth("targettargettarget")/UnitHealthMax("targettargettarget")*100).."%")
1294 end
1295  
1296 if (UnitManaMax("targettargettarget") > 0) then
1297 self.TargetHUD.TargetTarget.MPText:SetText(math.floor(UnitMana("targettargettarget")/UnitManaMax("targettargettarget")*100).."%")
1298 else
1299 self.TargetHUD.TargetTarget.MPText:SetText(" ")
1300 end
1301 self.TargetHUD.TargetTarget:Show()
1302 else
1303 self.TargetHUD.TargetTarget:Hide()
1304 end
1305 end
1306  
1307 function ArcHUD:UpdateFonts(tbl)
1308 local update = false
1309 for k,v in pairs(tbl) do
1310 if(type(v) == "table") then
1311 if(v.GetFont) then
1312 local fontName, fontSize, fontFlags = v:GetFont()
1313 if(fontName) then
1314 self:LevelDebug(2, "UpdateFonts: fontName = %s, localeFont = %s", fontName, L"FONT")
1315 end
1316 if(fontName and not string.find(fontName, L"FONT")) then
1317 v:SetFont("Fonts\\"..L"FONT", fontSize, fontFlags)
1318 update = true
1319 end
1320 end
1321 self:UpdateFonts(v)
1322 end
1323 end
1324 if(update) then
1325 self:LevelDebug(3, "Fonts updated")
1326 end
1327 end
1328  
1329  
1330 -- MobInfo-2 mob health code
1331 --------------------------------
1332 function ArcHUD:MobHealth_PPP(index)
1333 if(MobHealth_PPP) then
1334 return MobHealth_PPP( index );
1335 else
1336 if( index and MobHealthDB[index] ) then
1337 local s, e, pts, pct = string.find(MobHealthDB[index], "^(%d+)/(%d+)$");
1338 if( pts and pct ) then
1339 pts = pts + 0;
1340 pct = pct + 0;
1341 if( pct ~= 0 ) then
1342 return pts / pct;
1343 end
1344 end
1345 end
1346 return 0;
1347 end
1348 end -- of My_MobHealth_PPP
1349  
1350 function ArcHUD:MobHealth_GetTargetCurHP()
1351 if(MobHealthFrame) then
1352 if(MobHealth_GetTargetCurHP) then
1353 return MobHealth_GetTargetCurHP();
1354 else
1355 local name = UnitName("target");
1356 local level = UnitLevel("target");
1357 local healthPercent = UnitHealth("target");
1358 if name and level and healthPercent then
1359 local index = name..":"..level;
1360 local ppp = self:MobHealth_PPP( index );
1361 return math.floor( healthPercent * ppp + 0.5);
1362 end
1363 end
1364 end
1365 return nil;
1366 end -- of MobHealth_GetTargetCurHP()
1367  
1368 function ArcHUD:MobHealth_GetTargetMaxHP()
1369 if(MobHealthFrame) then
1370 if(MobHealth_GetTargetMaxHP) then
1371 return MobHealth_GetTargetMaxHP();
1372 else
1373 local name = UnitName("target");
1374 local level = UnitLevel("target");
1375 if name and level then
1376 local index = name..":"..level;
1377 local ppp = self:MobHealth_PPP( index );
1378 return math.floor( 100 * ppp + 0.5);
1379 end
1380 end
1381 end
1382 return nil;
1383 end -- of MobHealth_GetTargetMaxHP()
1384  
1385  
1386 -- Blizzard Frame functions
1387 -- Taken from AceUnitFrames
1388 function ArcHUD:HideBlizzardPlayer(hide)
1389 self.BlizzPlayerHidden = not hide
1390 if not hide then
1391 PlayerFrame:UnregisterAllEvents()
1392 PlayerFrameHealthBar:UnregisterAllEvents()
1393 PlayerFrameManaBar:UnregisterAllEvents()
1394 PlayerFrame:Hide()
1395  
1396 PetFrame:UnregisterAllEvents()
1397 PetFrameHealthBar:UnregisterAllEvents()
1398 PetFrameManaBar:UnregisterAllEvents()
1399 PetFrame:Hide()
1400 else
1401 PlayerFrame:RegisterEvent("UNIT_LEVEL")
1402 PlayerFrame:RegisterEvent("UNIT_COMBAT")
1403 PlayerFrame:RegisterEvent("UNIT_PVP_UPDATE")
1404 PlayerFrame:RegisterEvent("UNIT_MAXMANA")
1405 PlayerFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
1406 PlayerFrame:RegisterEvent("PLAYER_ENTER_COMBAT")
1407 PlayerFrame:RegisterEvent("PLAYER_LEAVE_COMBAT")
1408 PlayerFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
1409 PlayerFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
1410 PlayerFrame:RegisterEvent("PLAYER_UPDATE_RESTING")
1411 PlayerFrame:RegisterEvent("PARTY_MEMBERS_CHANGED")
1412 PlayerFrame:RegisterEvent("PARTY_LEADER_CHANGED")
1413 PlayerFrame:RegisterEvent("PARTY_LOOT_METHOD_CHANGED")
1414 PlayerFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
1415 PlayerFrame:RegisterEvent("RAID_ROSTER_UPDATE")
1416 PlayerFrame:RegisterEvent("PLAYTIME_CHANGED")
1417 PlayerFrame:RegisterEvent("UNIT_NAME_UPDATE")
1418 PlayerFrame:RegisterEvent("UNIT_PORTRAIT_UPDATE")
1419 PlayerFrame:RegisterEvent("UNIT_DISPLAYPOWER")
1420 PlayerFrameHealthBar:RegisterEvent("CVAR_UPDATE")
1421 PlayerFrameHealthBar:RegisterEvent("UNIT_HEALTH")
1422 PlayerFrameHealthBar:RegisterEvent("UNIT_MAXHEALTH")
1423 PlayerFrameManaBar:RegisterEvent("CVAR_UPDATE")
1424 PlayerFrameManaBar:RegisterEvent("UNIT_MANA")
1425 PlayerFrameManaBar:RegisterEvent("UNIT_RAGE")
1426 PlayerFrameManaBar:RegisterEvent("UNIT_FOCUS")
1427 PlayerFrameManaBar:RegisterEvent("UNIT_ENERGY")
1428 PlayerFrameManaBar:RegisterEvent("UNIT_HAPPINESS")
1429 PlayerFrameManaBar:RegisterEvent("UNIT_MAXMANA")
1430 PlayerFrameManaBar:RegisterEvent("UNIT_MAXRAGE")
1431 PlayerFrameManaBar:RegisterEvent("UNIT_MAXFOCUS")
1432 PlayerFrameManaBar:RegisterEvent("UNIT_MAXENERGY")
1433 PlayerFrameManaBar:RegisterEvent("UNIT_MAXHAPPINESS")
1434 PlayerFrameManaBar:RegisterEvent("UNIT_DISPLAYPOWER")
1435 PlayerFrame:Show()
1436  
1437 PetFrame:RegisterEvent("UNIT_PET")
1438 PetFrame:RegisterEvent("UNIT_COMBAT")
1439 PetFrame:RegisterEvent("UNIT_AURA")
1440 PetFrame:RegisterEvent("PET_ATTACK_START")
1441 PetFrame:RegisterEvent("PET_ATTACK_STOP")
1442 PetFrame:RegisterEvent("UNIT_HAPPINESS")
1443 PetFrame:RegisterEvent("UNIT_NAME_UPDATE")
1444 PetFrame:RegisterEvent("UNIT_PORTRAIT_UPDATE")
1445 PetFrame:RegisterEvent("UNIT_DISPLAYPOWER")
1446 PetFrameHealthBar:RegisterEvent("CVAR_UPDATE")
1447 PetFrameHealthBar:RegisterEvent("UNIT_HEALTH")
1448 PetFrameHealthBar:RegisterEvent("UNIT_MAXHEALTH")
1449 PetFrameManaBar:RegisterEvent("CVAR_UPDATE")
1450 PetFrameManaBar:RegisterEvent("UNIT_MANA")
1451 PetFrameManaBar:RegisterEvent("UNIT_RAGE")
1452 PetFrameManaBar:RegisterEvent("UNIT_FOCUS")
1453 PetFrameManaBar:RegisterEvent("UNIT_ENERGY")
1454 PetFrameManaBar:RegisterEvent("UNIT_HAPPINESS")
1455 PetFrameManaBar:RegisterEvent("UNIT_MAXMANA")
1456 PetFrameManaBar:RegisterEvent("UNIT_MAXRAGE")
1457 PetFrameManaBar:RegisterEvent("UNIT_MAXFOCUS")
1458 PetFrameManaBar:RegisterEvent("UNIT_MAXENERGY")
1459 PetFrameManaBar:RegisterEvent("UNIT_MAXHAPPINESS")
1460 PetFrameManaBar:RegisterEvent("UNIT_DISPLAYPOWER")
1461 end
1462 end
1463  
1464 function ArcHUD:HideBlizzardTarget(hide)
1465 self.BlizzTargetHidden = not hide
1466 if not hide then
1467 TargetFrame:UnregisterAllEvents()
1468 TargetFrameHealthBar:UnregisterAllEvents()
1469 TargetFrameManaBar:UnregisterAllEvents()
1470 TargetFrame:Hide()
1471  
1472 ComboFrame:UnregisterAllEvents()
1473 else
1474 TargetFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
1475 TargetFrame:RegisterEvent("UNIT_HEALTH")
1476 TargetFrame:RegisterEvent("UNIT_LEVEL")
1477 TargetFrame:RegisterEvent("UNIT_FACTION")
1478 TargetFrame:RegisterEvent("UNIT_CLASSIFICATION_CHANGED")
1479 TargetFrame:RegisterEvent("UNIT_AURA")
1480 TargetFrame:RegisterEvent("PLAYER_FLAGS_CHANGED")
1481 TargetFrame:RegisterEvent("PARTY_MEMBERS_CHANGED")
1482 TargetFrame:RegisterEvent("UNIT_NAME_UPDATE")
1483 TargetFrame:RegisterEvent("UNIT_PORTRAIT_UPDATE")
1484 TargetFrame:RegisterEvent("UNIT_DISPLAYPOWER")
1485 TargetFrameHealthBar:RegisterEvent("CVAR_UPDATE")
1486 TargetFrameHealthBar:RegisterEvent("UNIT_HEALTH")
1487 TargetFrameHealthBar:RegisterEvent("UNIT_MAXHEALTH")
1488 TargetFrameManaBar:RegisterEvent("CVAR_UPDATE")
1489 TargetFrameManaBar:RegisterEvent("UNIT_MANA")
1490 TargetFrameManaBar:RegisterEvent("UNIT_RAGE")
1491 TargetFrameManaBar:RegisterEvent("UNIT_FOCUS")
1492 TargetFrameManaBar:RegisterEvent("UNIT_ENERGY")
1493 TargetFrameManaBar:RegisterEvent("UNIT_HAPPINESS")
1494 TargetFrameManaBar:RegisterEvent("UNIT_MAXMANA")
1495 TargetFrameManaBar:RegisterEvent("UNIT_MAXRAGE")
1496 TargetFrameManaBar:RegisterEvent("UNIT_MAXFOCUS")
1497 TargetFrameManaBar:RegisterEvent("UNIT_MAXENERGY")
1498 TargetFrameManaBar:RegisterEvent("UNIT_MAXHAPPINESS")
1499 TargetFrameManaBar:RegisterEvent("UNIT_DISPLAYPOWER")
1500 --if(UnitExists("target")) then
1501 --TargetFrame:Show()
1502 --end
1503 this = TargetFrame
1504 TargetFrame_Update()
1505  
1506 ComboFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
1507 ComboFrame:RegisterEvent("PLAYER_COMBO_POINTS")
1508 end
1509 end