/FrameXML/UIErrorsFrame.lua

http://github.com/tekkub/wow-ui-source · Lua · 140 lines · 124 code · 16 blank · 0 comment · 24 complexity · c191a81c2751d715c87862e595276e63 MD5 · raw file

  1. UIErrorsMixin = {};
  2. function UIErrorsMixin:OnLoad()
  3. self:RegisterEvent("SYSMSG");
  4. self:RegisterEvent("UI_INFO_MESSAGE");
  5. self:RegisterEvent("UI_ERROR_MESSAGE");
  6. self.flashingFontStrings = {};
  7. end
  8. function UIErrorsMixin:OnEvent(event, ...)
  9. if event == "SYSMSG" then
  10. local message, r, g, b = ...;
  11. self:AddMessage(message, r, g, b, 1.0);
  12. elseif event == "UI_INFO_MESSAGE" then
  13. local messageType, message = ...;
  14. self:TryDisplayMessage(messageType, message, 1.0, 1.0, 0.0);
  15. elseif event == "UI_ERROR_MESSAGE" then
  16. local messageType, message = ...;
  17. self:TryDisplayMessage(messageType, message, 1.0, 0.1, 0.1);
  18. end
  19. end
  20. local FLASH_DURATION_SEC = 0.2;
  21. function UIErrorsMixin:OnUpdate()
  22. local now = GetTime();
  23. local needsMoreUpdates = false;
  24. for fontString, timeStart in pairs(self.flashingFontStrings) do
  25. if fontString:GetText() == fontString.origMsg then
  26. if fontString:IsShown() and now - timeStart <= FLASH_DURATION_SEC then
  27. local percent = (now - timeStart) / FLASH_DURATION_SEC;
  28. local easedPercent = (percent > .5 and (1.0 - percent) / .5 or percent / .5) * .4;
  29. fontString:SetTextColor(fontString.origR + easedPercent, fontString.origG + easedPercent, fontString.origB + easedPercent);
  30. needsMoreUpdates = true;
  31. else
  32. fontString:SetTextColor(fontString.origR, fontString.origG, fontString.origB);
  33. self.flashingFontStrings[fontString] = nil;
  34. end
  35. else
  36. self.flashingFontStrings[fontString] = nil;
  37. end
  38. end
  39. if not needsMoreUpdates then
  40. self:SetScript("OnUpdate", nil);
  41. end
  42. end
  43. local THROTTLED_MESSAGE_TYPES = {
  44. [LE_GAME_ERR_SPELL_FAILED_TOTEMS] = true,
  45. [LE_GAME_ERR_SPELL_FAILED_EQUIPPED_ITEM] = true,
  46. [LE_GAME_ERR_SPELL_ALREADY_KNOWN_S] = true,
  47. [LE_GAME_ERR_SPELL_FAILED_SHAPESHIFT_FORM_S] = true,
  48. [LE_GAME_ERR_SPELL_FAILED_ALREADY_AT_FULL_MANA] = true,
  49. [LE_GAME_ERR_OUT_OF_MANA] = true,
  50. [LE_GAME_ERR_SPELL_OUT_OF_RANGE] = true,
  51. [LE_GAME_ERR_SPELL_FAILED_S] = true,
  52. [LE_GAME_ERR_SPELL_FAILED_REAGENTS] = true,
  53. [LE_GAME_ERR_SPELL_FAILED_REAGENTS_GENERIC] = true,
  54. [LE_GAME_ERR_SPELL_FAILED_NOTUNSHEATHED] = true,
  55. [LE_GAME_ERR_SPELL_UNLEARNED_S] = true,
  56. [LE_GAME_ERR_SPELL_FAILED_EQUIPPED_SPECIFIC_ITEM] = true,
  57. [LE_GAME_ERR_SPELL_FAILED_ALREADY_AT_FULL_POWER_S] = true,
  58. [LE_GAME_ERR_SPELL_FAILED_EQUIPPED_ITEM_CLASS_S] = true,
  59. [LE_GAME_ERR_SPELL_FAILED_ALREADY_AT_FULL_HEALTH] = true,
  60. [LE_GAME_ERR_GENERIC_NO_VALID_TARGETS] = true,
  61. [LE_GAME_ERR_ITEM_COOLDOWN] = true,
  62. [LE_GAME_ERR_CANT_USE_ITEM] = true,
  63. [LE_GAME_ERR_SPELL_FAILED_ANOTHER_IN_PROGRESS] = true,
  64. };
  65. local BLACK_LISTED_MESSAGE_TYPES = {
  66. [LE_GAME_ERR_ABILITY_COOLDOWN] = true,
  67. [LE_GAME_ERR_SPELL_COOLDOWN] = true,
  68. [LE_GAME_ERR_SPELL_FAILED_ANOTHER_IN_PROGRESS] = true,
  69. [LE_GAME_ERR_OUT_OF_HOLY_POWER] = true,
  70. [LE_GAME_ERR_OUT_OF_POWER_DISPLAY] = true,
  71. [LE_GAME_ERR_OUT_OF_SOUL_SHARDS] = true,
  72. [LE_GAME_ERR_OUT_OF_FOCUS] = true,
  73. [LE_GAME_ERR_OUT_OF_COMBO_POINTS] = true,
  74. [LE_GAME_ERR_OUT_OF_CHI] = true,
  75. [LE_GAME_ERR_OUT_OF_PAIN] = true,
  76. [LE_GAME_ERR_OUT_OF_HEALTH] = true,
  77. [LE_GAME_ERR_OUT_OF_RAGE] = true,
  78. [LE_GAME_ERR_OUT_OF_ARCANE_CHARGES] = true,
  79. [LE_GAME_ERR_OUT_OF_RANGE] = true,
  80. [LE_GAME_ERR_OUT_OF_ENERGY] = true,
  81. [LE_GAME_ERR_OUT_OF_LUNAR_POWER] = true,
  82. [LE_GAME_ERR_OUT_OF_RUNIC_POWER] = true,
  83. [LE_GAME_ERR_OUT_OF_INSANITY] = true,
  84. [LE_GAME_ERR_OUT_OF_RUNES] = true,
  85. [LE_GAME_ERR_OUT_OF_FURY] = true,
  86. [LE_GAME_ERR_OUT_OF_MAELSTROM] = true,
  87. };
  88. function UIErrorsMixin:FlashFontString(fontString)
  89. if GetCVarBool("flashErrorMessageRepeats") then
  90. if self.flashingFontStrings[fontString] then
  91. self.flashingFontStrings[fontString] = GetTime();
  92. else
  93. fontString.origR, fontString.origG, fontString.origB = fontString:GetTextColor();
  94. fontString.origMsg = fontString:GetText();
  95. self.flashingFontStrings[fontString] = GetTime();
  96. end
  97. self:SetScript("OnUpdate", self.OnUpdate);
  98. end
  99. end
  100. function UIErrorsMixin:ShouldDisplayMessageType(messageType, message)
  101. if BLACK_LISTED_MESSAGE_TYPES[messageType] then
  102. return false;
  103. end
  104. if THROTTLED_MESSAGE_TYPES[messageType] then
  105. local existingFontString = self:GetFontStringByID(messageType);
  106. if existingFontString and existingFontString:GetText() == message then
  107. self:FlashFontString(existingFontString);
  108. self:ResetMessageFadeByID(messageType);
  109. return false;
  110. end
  111. end
  112. return true;
  113. end
  114. function UIErrorsMixin:TryDisplayMessage(messageType, message, r, g, b)
  115. if self:ShouldDisplayMessageType(messageType, message) then
  116. self:AddMessage(message, r, g, b, 1.0, messageType);
  117. local errorName, soundKitID, voiceID = GetGameMessageInfo(messageType);
  118. if voiceID then
  119. PlayVocalErrorSoundID(voiceID);
  120. elseif soundKitID then
  121. PlaySoundKitID(soundKitID);
  122. end
  123. end
  124. end