View Single Post
05-07-17, 09:41 AM   #1
Layback_
An Onyxian Warder
Join Date: Feb 2016
Posts: 358
How could this be written neater?

Hi all,

I've tried to make an aura tracker addon and..... it is working fine, but the code looks really disgusting.

Lua Code:
  1. -- Upvalue variables
  2. local _G = getfenv(0);
  3.  
  4. local GetSpecialization = _G.GetSpecialization;
  5. local GetSpellInfo = _G.GetSpellInfo;
  6. local ReloadUI = _G.ReloadUI;
  7.  
  8. -- Local variables
  9. local size = 40;
  10. local point = {"CENTER", UIParent, "CENTER", 0, -110};
  11. local gap = 2;
  12. local max = 6;
  13.  
  14. local buffIDList = {
  15.     ["WARLOCK"] = {
  16.         [3] = { -- Destruction
  17.             235156,
  18.             215165,
  19.             119899,
  20.         },
  21.     },
  22. };
  23.  
  24. -- Local functions
  25. local InitObjects;
  26.  
  27. -- AuraTrack
  28. local AuraTrack = CreateFrame("Frame");
  29. AuraTrack:RegisterEvent("ADDON_LOADED");
  30. AuraTrack:RegisterEvent("PLAYER_ENTERING_WORLD");
  31. AuraTrack:SetScript("OnEvent", function(self, event, ...)
  32.     self[event](self, ...);
  33. end);
  34.  
  35. function AuraTrack:ADDON_LOADED(...)
  36.     if ... == "MyAuraTracker" then
  37.         InitObjects();
  38.  
  39.         self:UnregisterEvent("ADDON_LOADED");
  40.     end
  41. end
  42.  
  43. function AuraTrack:PLAYER_ENTERING_WORLD()
  44.     local holder = self.holder;
  45.  
  46.     holder:RegisterUnitEvent("UNIT_AURA", "player");
  47.     holder:SetScript("OnEvent", function(self, event, ...)
  48.         AuraTrack[event](AuraTrack, ...);
  49.     end);
  50.  
  51.     self:UnregisterEvent("PLAYER_ENTERING_WORLD");
  52. end
  53.  
  54. function AuraTrack:UNIT_AURA(...)
  55.     local holder = self.holder;
  56.  
  57.     -- Get player's class and spec to access buffIDList table
  58.     local _, class = UnitClass(...);
  59.     local spec = GetSpecialization();
  60.  
  61.     -- For each button, check if they are already assigned with aura
  62.     for i = 1, #holder.button do
  63.         local button = holder.button[i];
  64.  
  65.         -- If the button is assigned with aura and that aura is on-going, update its duration and so on
  66.         -- Otherwise, remove id from button and hide
  67.         if button.spellID then
  68.             local spellName = GetSpellInfo(button.spellID);
  69.  
  70.             local _, _, icon, count, _, duration, expires = UnitAura(..., spellName);
  71.  
  72.             if duration and duration > 0 then
  73.                 button.cd:SetCooldown(expires - duration, duration);
  74.  
  75.                 button.icon:SetTexture(icon);
  76.  
  77.                 button.count:SetText((count and count > 0) and count or "");
  78.  
  79.                 button:Show();
  80.             else
  81.                 button.spellID = nil;
  82.  
  83.                 button:Hide();
  84.             end
  85.         end
  86.     end
  87.  
  88.     -- For each buff, check if they are activated
  89.     for i = 1, #buffIDList[class][spec] do
  90.         local spellName = GetSpellInfo(buffIDList[class][spec][i]);
  91.  
  92.         local _, _, icon, count, _, duration, expires = UnitAura(..., spellName);
  93.  
  94.         -- If the buff is activated, see if that buff is already assigned to a button
  95.         if duration and duration > 0 then
  96.             local assigned = false;
  97.  
  98.             for j = 1, #holder.button do
  99.                 if holder.button[j].spellID == buffIDList[class][spec][i] then
  100.                     assigned = true;
  101.                 end
  102.             end
  103.  
  104.             -- If buff is not assigned to any of buttons,
  105.             -- assign the id and update its duration and so on
  106.             if not assigned then
  107.                 for j = 1, #holder.button do
  108.                     local button = holder.button[j];
  109.  
  110.                     if not button.spellID then
  111.                         button.spellID = buffIDList[class][spec][i];
  112.  
  113.                         button.cd:SetCooldown(expires - duration, duration);
  114.  
  115.                         button.icon:SetTexture(icon);
  116.  
  117.                         button.count:SetText((count and count > 0) and count or "");
  118.  
  119.                         button:Show();
  120.                        
  121.                         break;
  122.                     end
  123.                 end
  124.             end
  125.         end
  126.     end
  127. end
  128.  
  129. function InitObjects()
  130.     local holder = CreateFrame("Frame", "AuraTrackerHolder", UIParent);
  131.     holder:SetPoint(unpack(point));
  132.     holder:SetSize((size + gap) * max - gap, size);
  133.  
  134.     holder.button = {};
  135.  
  136.     for i = 1, max do
  137.         local button = CreateFrame("Frame", "$parentButton" .. i, holder);
  138.         button:Hide();
  139.  
  140.         if i == 1 then
  141.             button:SetPoint("LEFT");
  142.         else
  143.             button:SetPoint("LEFT", holder.button[i - 1], "RIGHT", gap, 0);
  144.         end
  145.  
  146.         button:SetSize(size, size);
  147.  
  148.         local cd = CreateFrame("Cooldown", "$parentCooldown", button, "CooldownFrameTemplate");
  149.         cd:SetAllPoints(button);
  150.  
  151.         local icon = button:CreateTexture(nil, "BORDER");
  152.         icon:SetAllPoints(button);
  153.  
  154.         local count = button:CreateFontString(nil, "OVERLAY");
  155.         count:SetFontObject(NumberFontNormal);
  156.         count:SetPoint("TOP", button, "BOTTOM", 0, -2);
  157.  
  158.         holder.button[i] = button;
  159.  
  160.         button.cd = cd;
  161.         button.icon = icon;
  162.         button.count = count;
  163.     end
  164.  
  165.     AuraTrack.holder = holder;
  166. end

I am pretty happy with the rest of parts, but :UNIT_AURA() function is... meh.......

Even if I've left some comments there, pretty sure I would forget what I have done there with all those for loops.

Could I ask some helps?!

Thank you.

Last edited by Layback_ : 05-07-17 at 10:03 AM.
  Reply With Quote