/FrameXML/RuneFrame.lua

http://github.com/tekkub/wow-ui-source · Lua · 146 lines · 125 code · 18 blank · 3 comment · 29 complexity · ca327f207586517b0679afd68f541b78 MD5 · raw file

  1. --Readability == win
  2. local RUNETYPE_BLOOD = 1;
  3. local RUNETYPE_UNHOLY = 2;
  4. local RUNETYPE_FROST = 3;
  5. local RUNETYPE_DEATH = 4;
  6. local CURRENT_MAX_RUNES = 0;
  7. local MAX_RUNE_CAPACITY = 7;
  8. local POWER_TYPE_RUNES = 5;
  9. local RUNES_DISPLAY_MODIFIER = 10;
  10. local runeColor = {0.8, 0.1, 1};
  11. function RuneButton_OnLoad (self)
  12. self.shine = self.Textures.Shine;
  13. self.tooltipText = _G["COMBAT_TEXT_RUNE_DEATH"];
  14. end
  15. function RuneButton_Flash (self)
  16. self.shine:SetVertexColor(unpack(runeColor));
  17. RuneButton_ShineFadeIn(self.shine)
  18. end
  19. function RuneButton_OnEnter(self)
  20. if ( self.tooltipText ) then
  21. GameTooltip_SetDefaultAnchor(GameTooltip, self);
  22. GameTooltip:SetText(self.tooltipText, 1, 1, 1);
  23. GameTooltip:AddLine(RUNES_TOOLTIP, nil, nil, nil, true);
  24. GameTooltip:Show();
  25. end
  26. end
  27. function RuneButton_OnLeave(self)
  28. GameTooltip:Hide();
  29. end
  30. function RuneFrame_OnLoad (self)
  31. -- Disable rune frame if not a death knight.
  32. local _, class = UnitClass("player");
  33. if ( class ~= "DEATHKNIGHT" ) then
  34. self:Hide();
  35. return;
  36. end
  37. self:RegisterEvent("RUNE_POWER_UPDATE");
  38. self:RegisterEvent("RUNE_TYPE_UPDATE");
  39. self:RegisterUnitEvent("UNIT_MAXPOWER", "player");
  40. self:RegisterEvent("PLAYER_ENTERING_WORLD");
  41. self:SetScript("OnEvent", RuneFrame_OnEvent);
  42. end
  43. function RuneFrame_OnEvent (self, event, ...)
  44. if ( event == "UNIT_MAXPOWER") then
  45. RuneFrame_UpdateNumberOfShownRunes();
  46. elseif ( event == "PLAYER_ENTERING_WORLD" ) then
  47. RuneFrame_UpdateNumberOfShownRunes();
  48. for i=1, CURRENT_MAX_RUNES do
  49. RuneFrame_RunePowerUpdate(i, false);
  50. end
  51. elseif ( event == "RUNE_POWER_UPDATE") then
  52. local runeIndex, isEnergize = ...;
  53. RuneFrame_RunePowerUpdate(runeIndex, isEnergize)
  54. elseif ( event == "RUNE_TYPE_UPDATE" ) then
  55. local runeIndex = ...;
  56. if ( runeIndex and runeIndex >= 1 and runeIndex <= CURRENT_MAX_RUNES ) then
  57. RuneButton_Flash(_G["RuneButtonIndividual"..runeIndex]);
  58. end
  59. end
  60. end
  61. function RuneFrame_RunePowerUpdate(runeIndex, isEnergize)
  62. if runeIndex and runeIndex >= 1 and runeIndex <= CURRENT_MAX_RUNES then
  63. local runeButton = _G["RuneButtonIndividual"..runeIndex];
  64. local cooldown = runeButton.Cooldown;
  65. local start, duration, runeReady = GetRuneCooldown(runeIndex);
  66. if not runeReady then
  67. if start then
  68. CooldownFrame_Set(cooldown, start, duration, true, true);
  69. end
  70. runeButton.energize:Stop();
  71. else
  72. cooldown:Hide();
  73. if (not isEnergize and not runeButton.energize:IsPlaying()) then
  74. runeButton.shine:SetVertexColor(1, 1, 1);
  75. RuneButton_ShineFadeIn(runeButton.shine)
  76. end
  77. end
  78. if isEnergize then
  79. runeButton.energize:Play();
  80. end
  81. else
  82. assert(false, "Bad rune index")
  83. end
  84. end
  85. function RuneFrame_UpdateNumberOfShownRunes()
  86. CURRENT_MAX_RUNES = UnitPowerMax(RuneFrame:GetParent().unit, SPELL_POWER_RUNES);
  87. for i=1, MAX_RUNE_CAPACITY do
  88. local runeButton = _G["RuneButtonIndividual"..i];
  89. if(i <= CURRENT_MAX_RUNES) then
  90. runeButton:Show();
  91. else
  92. runeButton:Hide();
  93. end
  94. -- Shrink the runes sizes if you have all 7
  95. if (CURRENT_MAX_RUNES == MAX_RUNE_CAPACITY) then
  96. runeButton.Border:SetSize(21, 21);
  97. runeButton.rune:SetSize(21, 21);
  98. runeButton.Textures.Shine:SetSize(52, 31);
  99. runeButton.energize.RingScale:SetFromScale(0.6, 0.7);
  100. runeButton.energize.RingScale:SetToScale(0.7, 0.7);
  101. runeButton:SetSize(15, 15);
  102. else
  103. runeButton.Border:SetSize(24, 24);
  104. runeButton.rune:SetSize(24, 24);
  105. runeButton.Textures.Shine:SetSize(60, 35);
  106. runeButton.energize.RingScale:SetFromScale(0.7, 0.8);
  107. runeButton.energize.RingScale:SetToScale(0.8, 0.8);
  108. runeButton:SetSize(18, 18);
  109. end
  110. end
  111. end
  112. function RuneButton_ShineFadeIn(self)
  113. if self.shining then
  114. return
  115. end
  116. local fadeInfo={
  117. mode = "IN",
  118. timeToFade = 0.5,
  119. finishedFunc = RuneButton_ShineFadeOut,
  120. finishedArg1 = self,
  121. }
  122. self.shining=true;
  123. UIFrameFade(self, fadeInfo);
  124. end
  125. function RuneButton_ShineFadeOut(self)
  126. self.shining=false;
  127. UIFrameFadeOut(self, 0.5);
  128. end