From 8b9156fe2bd5d71d1f8fa564a3a9ba97cf49645f Mon Sep 17 00:00:00 2001 From: Hamid Date: Wed, 24 Jul 2024 00:52:49 -0400 Subject: [PATCH] TWW Pre-patch updates & fixes - Fix issues related to new API changes in 11.0.0 - Fixes for GetSpellInfo & GetSpellName changes - Fix InterfaceOptionsFrame_OpenToCategory deprecation issue - Fix nil error in tooltip initialization of .xml - Add option to display over healing - Add support for Evoker's secondary power (Essence) - Add support for Dragonriding's power (Vigor) - Get PLAYER_MAX_LEVEL using Lua API - Use the timestamp from Blizz combat log first, and then revert to our own if not available - Adjust limits of heal/dmg filtering based on expansion version - Quickly ignore events that are not related to player or his pet - Fix division by zero in rare cases where combat duration is zero due to mobs evading - Update ACE lib - Use same xml files for both classic & retail (Only useo 2 toc files: Mainline and Cata) --- .github/workflows/bigwigs_pkg.yml | 1 + .github/workflows/pre-commit | 44 +- .github/workflows/upload2wago.sh | 6 +- .luacheckrc | 339 +++---- .luarc.json | 9 +- EavesDrop.lua | 198 ++-- EavesDrop.xml | 6 +- EavesDropStats.lua | 2 +- EavesDrop.toc => EavesDrop_Cata.toc | 8 +- EavesDrop_Mainline.toc | 8 +- EavesDrop_Wrath.toc | 26 - Media/Textures/EavesDrop.blp | Bin 0 -> 350740 bytes TODO.md | 9 +- Wrath/EavesDrop.xml | 893 ------------------ .../widgets/AceGUIWidget-EditBox.lua | 12 +- .../widgets/AceGUIWidget-MultiLineEditBox.lua | 12 +- locals/localization-enUS.lua | 4 + locals/localization-koKR.lua | 6 +- locals/localization-zhCN.lua | 6 +- options.lua | 46 +- 20 files changed, 419 insertions(+), 1216 deletions(-) rename EavesDrop.toc => EavesDrop_Cata.toc (62%) delete mode 100644 EavesDrop_Wrath.toc create mode 100644 Media/Textures/EavesDrop.blp delete mode 100644 Wrath/EavesDrop.xml diff --git a/.github/workflows/bigwigs_pkg.yml b/.github/workflows/bigwigs_pkg.yml index e4dcc15..6d11164 100644 --- a/.github/workflows/bigwigs_pkg.yml +++ b/.github/workflows/bigwigs_pkg.yml @@ -5,6 +5,7 @@ on: branches: - main - dragon + - tww-beta tags: - "*" - "!**-alpha**" diff --git a/.github/workflows/pre-commit b/.github/workflows/pre-commit index d4d4202..f6567a7 100755 --- a/.github/workflows/pre-commit +++ b/.github/workflows/pre-commit @@ -7,56 +7,42 @@ CYAN=$'\e[1;34m' GRAY=$'\e[1;33m' NC=$'\e[0m' -retail_wago=$(head -n 4 .github/workflows/upload2wago.sh | tail -n 1 | cut -d '=' -f 2) -retail_patch=${retail_wago//./0} -wotlk_wago=$(head -n 5 .github/workflows/upload2wago.sh | tail -n 1 | cut -d '=' -f 2) -wotlk_patch=${wotlk_wago//./0} +mainline_wago=$(head -n 4 .github/workflows/upload2wago.sh | tail -n 1 | cut -d '=' -f 2) +mainline_patch=${mainline_wago//./0} +cata_wago=$(head -n 5 .github/workflows/upload2wago.sh | tail -n 1 | cut -d '=' -f 2) +cata_patch=${cata_wago//./0} + mainline_toc=$(head -n 1 EavesDrop_Mainline.toc | cut -d ' ' -f 3) -retail_toc=$(head -n 1 EavesDrop.toc | cut -d ' ' -f 3) -wotlk_toc=$(head -n 1 EavesDrop_Wrath.toc | cut -d ' ' -f 3) +cata_toc=$(head -n 1 EavesDrop_Cata.toc | cut -d ' ' -f 3) error=0 -if [ "$retail_patch" != "$mainline_toc" ]; then +if [ "$mainline_patch" != "$mainline_toc" ]; then echo "Retail client Interface version is $mainline_toc" - echo "which doesn't match with wago.io metadata: $retail_wago" + echo "which doesn't match with wago.io metadata: $mainline_wago" echo "Check EavesDrop_Mainline.toc and .github/workflows/upload2wago.sh" echo error=1 fi -if [ "$wotlk_patch" != "$wotlk_toc" ]; then - echo "WOTLK client Interface version is $wotlk_toc" - echo "which doesn't match with wago.io metadata: $wotlk_wago" - echo "Check EavesDrop_Wrath.toc and .github/workflows/upload2wago.sh" - echo - error=1 -fi - -if [ "$mainline_toc" != "$retail_toc" ]; then - echo "EavesDrop_Mainline.toc & Eavesdrop.toc have different Interface values" - echo "$mainline_toc <> $retail_toc" +if [ "$cata_patch" != "$cata_toc" ]; then + echo "CATA client Interface version is $cata_toc" + echo "which doesn't match with wago.io metadata: $cata_wago" + echo "Check EavesDrop_Cata.toc and .github/workflows/upload2wago.sh" echo error=1 fi mainline_addon_version=$(head -n 5 EavesDrop_Mainline.toc | tail -n 1 | cut -d ' ' -f 3) -retail_addon_version=$(head -n 5 EavesDrop.toc | tail -n 1 | cut -d ' ' -f 3) -wotlk_addon_version=$(head -n 5 EavesDrop_Wrath.toc | tail -n 1 | cut -d ' ' -f 3) +cata_addon_version=$(head -n 5 EavesDrop_Cata.toc | tail -n 1 | cut -d ' ' -f 3) -if [ "$mainline_addon_version" != "$wotlk_addon_version" ]; then - echo "Addon version mismatch between WOTLK and Retail: $wotlk_addon_version <> $mainline_addon_version" +if [ "$mainline_addon_version" != "$cata_addon_version" ]; then + echo "Addon version mismatch between CATA and Retail: $cata_addon_version <> $mainline_addon_version" echo error=1 fi -if [ "$mainline_addon_version" != "$retail_addon_version" ]; then - echo "Addon version mismatch between EavesDrop_Mainline.toc" - echo "and EavesDrop.toc: $mainline_addon_version <> $retail_addon_version" - error=1 -fi - pat='(\s*--\s+@?(end-)?debug@?)|(\s*--\s*(end-)?debug@?)|(\s*\S+.*--@(end-)?debug@)|(\s*--@(end-)?debug[\s\S]+@)|(--@\s+(end-)?debug@)|(\s*--\s+@(end-)?debug@)|(--\s*@(end-)?debug(?:(((?!@).)+|\b)))$' for file in $(git diff --name-only --cached); do if [[ $file != *.lua ]]; then diff --git a/.github/workflows/upload2wago.sh b/.github/workflows/upload2wago.sh index 759b0ea..fcc887d 100755 --- a/.github/workflows/upload2wago.sh +++ b/.github/workflows/upload2wago.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash # DO NOT MOVE THE NEXT 3 LINES. Their value should always be equivalent to 'Interface' in .toc files # A pre-commit git script will use these and compare to .toc files. -SUPPORTED_RETAIL_PATCH=10.2.7 -SUPPORTED_WOTLK_PATCH=3.4.1 +SUPPORTED_RETAIL_PATCH=11.0.0 +SUPPORTED_CATA_PATCH=4.4.0 set -x cat < metadata.json -{ "label": "$TAG_NAME", "stability": "stable", "changelog": "Release v$TAG_NAME\\n\\n$CHANGELOG", "supported_retail_patch": "$SUPPORTED_RETAIL_PATCH", "supported_wotlk_patch": "$SUPPORTED_WOTLK_PATCH" } +{ "label": "$TAG_NAME", "stability": "stable", "changelog": "Release v$TAG_NAME\\n\\n$CHANGELOG", "supported_retail_patch": "$SUPPORTED_RETAIL_PATCH", "supported_cata_patch": "$SUPPORTED_CATA_PATCH" } END sed -z -i 's/\n$//;s/\n/\\n/g' metadata.json diff --git a/.luacheckrc b/.luacheckrc index a3c95fb..dd2fb9f 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -1,179 +1,186 @@ std = "lua51" max_line_length = false exclude_files = { - "**/libs/**/*.lua", - "locals", - ".luacheckrc" + "**/libs/**/*.lua", + "locals", + ".luacheckrc", } ignore = { - "11./SLASH_.*", -- Setting an undefined (Slash handler) global variable - "11./BINDING_.*", -- Setting an undefined (Keybinding header) global variable - "212/self.*", -- Unused argument - -- "211", -- Unused local variable - -- "211/L", -- Unused local variable "L" - -- "211/CL", -- Unused local variable "CL" - -- "43.", -- Shadowing an upvalue, an upvalue argument, an upvalue loop variable. - -- "431", -- shadowing upvalue - -- "542", -- An empty if branch + "11./SLASH_.*", -- Setting an undefined (Slash handler) global variable + "11./BINDING_.*", -- Setting an undefined (Keybinding header) global variable + "212/self.*", -- Unused argument + -- "211", -- Unused local variable + -- "211/L", -- Unused local variable "L" + -- "211/CL", -- Unused local variable "CL" + -- "43.", -- Shadowing an upvalue, an upvalue argument, an upvalue loop variable. + -- "431", -- shadowing upvalue + -- "542", -- An empty if branch } globals = { - -- self - "std", - "max_line_length", - "ignore", - "exclude_files", - "globals", - -- Lua - "bit.band", - "bit", - "ceil", - "date", - "string.split", - "table.wipe", - "table.foreach", - "time", - "wipe", + -- self + "std", + "max_line_length", + "ignore", + "exclude_files", + "globals", + -- Lua + "bit.band", + "bit", + "ceil", + "date", + "string.split", + "table.wipe", + "table.foreach", + "time", + "wipe", - -- Utility functions - "geterrorhandler", - "fastrandom", - "format", - "strjoin", - "strtrim", - "strsplit", - "strmatch", - "strupper", - "strlen", - "strsub", - "tContains", - "tDeleteItem", - "tIndexOf", - "tinsert", - "tostringall", - "tremove", - "gsub", - "DevTools_Dump", + -- Utility functions + "geterrorhandler", + "fastrandom", + "format", + "strjoin", + "strtrim", + "strsplit", + "strmatch", + "strupper", + "strlen", + "strsub", + "tContains", + "tDeleteItem", + "tIndexOf", + "tinsert", + "tostringall", + "tremove", + "gsub", + "DevTools_Dump", - -- WoW - "C_Timer", - "C_ClassColor", - "ALL", - "ACCEPT", - "ALWAYS", - "UNKNOWN", - "BNET_CLIENT_WOW", - "BOSS", - "BOSSES_KILLED", - "SKILL_RANK_UP", - "MELEE_ATTACK", - "CANCEL", - "CHALLENGE_MODE", - "CLOSE", - "COMBATLOG_OBJECT_AFFILIATION_MINE", - "COMBATLOG_FILTER_HOSTILE_PLAYERS", - "COMBATLOG_FILTER_HOSTILE_UNITS", - "COMBATLOG_FILTER_MY_PET", - "COMBATLOG_FILTER_MINE", - "COMBATLOG_OBJECT_NONE", - "CombatLog_Object_IsA", - "Blizzard_CombatLog_Filters", - "CombatLogGetCurrentEventInfo", - "SetPortraitTexture", - "REFLECT", - "SPELL_SCHOOL0_CAP", - "SPELL_SCHOOL1_CAP", - "SPELL_SCHOOL2_CAP", - "SPELL_SCHOOL3_CAP", - "SPELL_SCHOOL3_CAP", - "SPELL_SCHOOL4_CAP", - "SPELL_SCHOOL5_CAP", - "SPELL_SCHOOL6_CAP", - "RAID_CLASS_COLORS", - "ALTERNATE_RESOURCE_TEXT", - "MAELSTROM_POWER", - "CHI_POWER", - "ARCANE_CHARGES_POWER", - "INSANITY_POWER", - "HOLY_POWER", - "RUNIC_POWER", - "LUNAR_POWER", - "SHARDS", - "FURY", - "PAIN", - "MANA", - "RAGE", - "FOCUS", - "COMBO_POINTS", - "RUNES", - "ENERGY", - "Enum", - "HONOR", - "XP", - "CombatLog_OnEvent", - "IsShiftKeyDown", - "IsControlKeyDown", - "WrapTextInColorCode", + -- WoW + "C_Timer", + "C_ClassColor", + "C_Spell", + "ALL", + "ACCEPT", + "ALWAYS", + "UNKNOWN", + "BNET_CLIENT_WOW", + "BOSS", + "BOSSES_KILLED", + "SKILL_RANK_UP", + "MELEE_ATTACK", + "CANCEL", + "CHALLENGE_MODE", + "CLOSE", + "COMBATLOG_OBJECT_AFFILIATION_MINE", + "COMBATLOG_FILTER_HOSTILE_PLAYERS", + "COMBATLOG_FILTER_HOSTILE_UNITS", + "COMBATLOG_FILTER_MY_PET", + "COMBATLOG_FILTER_MINE", + "COMBATLOG_OBJECT_NONE", + "CombatLog_Object_IsA", + "Blizzard_CombatLog_Filters", + "CombatLogGetCurrentEventInfo", + "SetPortraitTexture", + "REFLECT", + "SPELL_SCHOOL0_CAP", + "SPELL_SCHOOL1_CAP", + "SPELL_SCHOOL2_CAP", + "SPELL_SCHOOL3_CAP", + "SPELL_SCHOOL3_CAP", + "SPELL_SCHOOL4_CAP", + "SPELL_SCHOOL5_CAP", + "SPELL_SCHOOL6_CAP", + "RAID_CLASS_COLORS", + "ALTERNATE_RESOURCE_TEXT", + "MAELSTROM_POWER", + "CHI_POWER", + "ARCANE_CHARGES_POWER", + "INSANITY_POWER", + "HOLY_POWER", + "RUNIC_POWER", + "LUNAR_POWER", + "SHARDS", + "FURY", + "PAIN", + "MANA", + "RAGE", + "FOCUS", + "COMBO_POINTS", + "RUNES", + "ENERGY", + "Enum", + "HONOR", + "XP", + "ESSENCE", + "CombatLog_OnEvent", + "IsShiftKeyDown", + "IsControlKeyDown", + "WrapTextInColorCode", - "BackdropTemplateMixin", - "UIParent", - "GetTime", - "GetLocale", - "UnitName", - "UnitXP", - "UnitXPMax", - "UnitClass", - "UnitLevel", - "UnitIsDeadOrGhost", - "UnitIsDead", - "InCombatLockdown", - "PlaySound", - "StopSound", - "CreateFrame", - "ChatFontNormal", - "GameFontHighlightNormal", - "ChatEdit_ActivateChat", - "ChatEdit_ChooseBoxForSend", - "AceGUIMultiLineEditBoxInsertLink", - "GetSpellInfo", - "IsSpellKnown", - "GetCurrentCombatTextEventInfo", - "IsAddOnLoaded", - "hooksecurefunc", + "BackdropTemplateMixin", + "UIParent", + "GetTime", + "GetLocale", + "UnitName", + "UnitXP", + "UnitXPMax", + "UnitClass", + "UnitLevel", + "UnitIsDeadOrGhost", + "UnitIsDead", + "InCombatLockdown", + "PlaySound", + "StopSound", + "CreateFrame", + "ChatFontNormal", + "GameFontHighlightNormal", + "ChatEdit_ActivateChat", + "ChatEdit_ChooseBoxForSend", + "AceGUIMultiLineEditBoxInsertLink", + "GetSpellInfo", + "IsSpellKnown", + "GetCurrentCombatTextEventInfo", + "IsAddOnLoaded", + "hooksecurefunc", + "GetSpellTexture", + "GetBuildInfo", + "GetExpansionLevel", + "GetMaxLevelForExpansionLevel", + "GetSpellName", + "Settings", - -- Ace3 - "LibStub", - -- EavesDrop - "EavesDrop", - "EavesDropFrame", - "EavesDropFrameDownButton", - "EavesDropFrameUpButton", - "EavesDropHistoryFrame", - "EavesDropHistoryButton", - "EavesDropFramePlayerText", - "EavesDropFrameTargetText", - "EavesDropStatsDB", - "EavesDropTab", - "EavesDropTopBar", - "EavesDropBottomBar", - "EavesDropFontNormal", - "EavesDropFontNormalSmall", - "EavesDropHistoryTopBar", - "EavesDropHistoryBottomBar", - "EavesDropHistoryFrameOutgoingHit", - "EavesDropHistoryFrameOutgoingHeal", - "EavesDropHistoryFrameIncomingHit", - "EavesDropHistoryFrameIncomingHeal", - "EavesDropHistoryFrameSkillText", - "EavesDropHistoryFrameAmountCritText", - "EavesDropHistoryFrameAmountNormalText", - "EavesDropHistoryFrameResetText", - "FauxScrollFrame_Update", - "FauxScrollFrame_SetOffset", - "EavesDropHistoryScrollBar", - "FauxScrollFrame_GetOffset", - "InterfaceOptionsFrame_OpenToCategory", + -- Ace3 + "LibStub", + -- EavesDrop + "EavesDrop", + "EavesDropFrame", + "EavesDropFrameDownButton", + "EavesDropFrameUpButton", + "EavesDropHistoryFrame", + "EavesDropHistoryButton", + "EavesDropFramePlayerText", + "EavesDropFrameTargetText", + "EavesDropStatsDB", + "EavesDropTab", + "EavesDropTopBar", + "EavesDropBottomBar", + "EavesDropFontNormal", + "EavesDropFontNormalSmall", + "EavesDropHistoryTopBar", + "EavesDropHistoryBottomBar", + "EavesDropHistoryFrameOutgoingHit", + "EavesDropHistoryFrameOutgoingHeal", + "EavesDropHistoryFrameIncomingHit", + "EavesDropHistoryFrameIncomingHeal", + "EavesDropHistoryFrameSkillText", + "EavesDropHistoryFrameAmountCritText", + "EavesDropHistoryFrameAmountNormalText", + "EavesDropHistoryFrameResetText", + "FauxScrollFrame_Update", + "FauxScrollFrame_SetOffset", + "EavesDropHistoryScrollBar", + "FauxScrollFrame_GetOffset", + "InterfaceOptionsFrame_OpenToCategory", - -- Deubg - "ViragDevTool", + -- Deubg + "ViragDevTool", } - diff --git a/.luarc.json b/.luarc.json index 5dcdb5f..86c9c46 100644 --- a/.luarc.json +++ b/.luarc.json @@ -83,6 +83,7 @@ "ENERGY", "Enum", "HONOR", + "ESSENCE", "XP", "CombatLog_OnEvent", "IsShiftKeyDown", @@ -104,6 +105,12 @@ "GetSpellInfo", "GetCurrentCombatTextEventInfo", "hooksecurefunc", + "GetSpellTexture", + "GetBuildInfo", + "GetExpansionLevel", + "GetMaxLevelForExpansionLevel", + "GetSpellName", + "Settings", // Ace3 "LibStub", // EavesDrop @@ -137,4 +144,4 @@ "FauxScrollFrame_GetOffset", "InterfaceOptionsFrame_OpenToCategory" ] -} +} \ No newline at end of file diff --git a/EavesDrop.lua b/EavesDrop.lua index b0f9168..5c2e32b 100644 --- a/EavesDrop.lua +++ b/EavesDrop.lua @@ -63,7 +63,7 @@ end -- API calls local UnitName = UnitName local UnitXP = UnitXP -local GetSpellInfo = GetSpellInfo +local GetSpellTexture = C_Spell.GetSpellTexture and C_Spell.GetSpellTexture or GetSpellTexture local GetTime = GetTime local InCombatLockdown = InCombatLockdown @@ -82,6 +82,14 @@ local print = function(...) end end +--- Returns true if s is either nil or an empty string +--- +---@param s string +---@return boolean +local function isEmptyString(s) --luacheck: ignore + return s == nil or s == "" +end + -- Combat log locals local maxXP = UnitXPMax("player") local pxp = UnitXP("player") @@ -161,6 +169,8 @@ local POWER_STRINGS = { [Enum.PowerType.ArcaneCharges] = ARCANE_CHARGES_POWER, [Enum.PowerType.Fury] = FURY, [Enum.PowerType.Pain] = PAIN, + [Enum.PowerType.Essence] = L["Essence"], + [Enum.PowerType.AlternateMount] = L["Vigor"], } -- set table default size sense table.insert no longer does @@ -209,6 +219,7 @@ function EavesDrop:IsClassic() return (_G.WOW_PROJECT_ID == _G.WOW_PROJECT_CLASSIC) or (_G.WOW_PROJECT_ID == _G.WOW_PROJECT_BURNING_CRUSADE_CLASSIC) or (_G.WOW_PROJECT_ID == _G.WOW_PROJECT_WRATH_CLASSIC) + or (_G.WOW_PROJECT_ID == _G.WOW_PROJECT_CATACLYSM_CLASSIC) end function EavesDrop:IsRetail() return (_G.WOW_PROJECT_ID == _G.WOW_PROJECT_MAINLINE) @@ -288,16 +299,27 @@ function EavesDrop:OnInitialize() self:PerformDisplayOptions() - if self.IsRetail() then - PLAYER_MAX_LEVEL = 70 - elseif _G.WOW_PROJECT_ID == _G.WOW_PROJECT_WRATH_CLASSIC then - PLAYER_MAX_LEVEL = 80 - elseif _G.WOW_PROJECT_ID == _G.WOW_PROJECT_BURNING_CRUSADE_CLASSIC then - PLAYER_MAX_LEVEL = 70 - elseif _G.WOW_PROJECT_ID == _G.WOW_PROJECT_CLASSIC then + if _G.WOW_PROJECT_ID == _G.WOW_PROJECT_CLASSIC then PLAYER_MAX_LEVEL = 60 + else + PLAYER_MAX_LEVEL = GetMaxLevelForExpansionLevel(GetExpansionLevel()) end + -- local tww = select(4, GetBuildInfo()) -- REMOVE this on release of TWW, it's just a hack to test the addon on Beta server + -- if tww >= 110000 then + -- PLAYER_MAX_LEVEL = 80 + -- elseif self.IsRetail() then + -- PLAYER_MAX_LEVEL = 70 + -- elseif _G.WOW_PROJECT_ID == _G.WOW_PROJECT_CATACLYSM_CLASSIC then + -- PLAYER_MAX_LEVEL = 85 + -- elseif _G.WOW_PROJECT_ID == _G.WOW_PROJECT_WRATH_CLASSIC then + -- PLAYER_MAX_LEVEL = 80 + -- elseif _G.WOW_PROJECT_ID == _G.WOW_PROJECT_BURNING_CRUSADE_CLASSIC then + -- PLAYER_MAX_LEVEL = 70 + -- elseif _G.WOW_PROJECT_ID == _G.WOW_PROJECT_CLASSIC then + -- PLAYER_MAX_LEVEL = 60 + -- end + PLAYER_CURRENT_LEVEL = UnitLevel("player") maxXP = UnitXPMax("player") pxp = UnitXP("player") @@ -587,6 +609,21 @@ end function EavesDrop:CombatEvent(_, _) -- local timestamp, event, hideCaster, sourceGUID, sourceName, sourceFlags, sourceFlags2, destGUID, destName, destFlags, local _, event, _, _, sourceName, sourceFlags, _, _, destName, destFlags, _ = CombatLogGetCurrentEventInfo() + + -- Ensure the event is related to player and his pet + local toPlayer, fromPlayer, toPet, fromPet + if sourceName and not CombatLog_Object_IsA(sourceFlags, COMBATLOG_OBJECT_NONE) then + fromPlayer = CombatLog_Object_IsA(sourceFlags, COMBATLOG_FILTER_MINE) + fromPet = CombatLog_Object_IsA(sourceFlags, COMBATLOG_FILTER_MY_PET) + end + if destName and not CombatLog_Object_IsA(destFlags, COMBATLOG_OBJECT_NONE) then + toPlayer = CombatLog_Object_IsA(destFlags, COMBATLOG_FILTER_MINE) + toPet = CombatLog_Object_IsA(destFlags, COMBATLOG_FILTER_MY_PET) + end + + if not fromPlayer and not toPlayer and not fromPet and not toPet then return end + if (not fromPlayer and not toPlayer) and (toPet or fromPet) and not db["PET"] then return end + local etype = COMBAT_EVENTS[event] if not etype then return end @@ -604,19 +641,6 @@ function EavesDrop:CombatEvent(_, _) return end - local toPlayer, fromPlayer, toPet, fromPet - if sourceName and not CombatLog_Object_IsA(sourceFlags, COMBATLOG_OBJECT_NONE) then - fromPlayer = CombatLog_Object_IsA(sourceFlags, COMBATLOG_FILTER_MINE) - fromPet = CombatLog_Object_IsA(sourceFlags, COMBATLOG_FILTER_MY_PET) - end - if destName and not CombatLog_Object_IsA(destFlags, COMBATLOG_OBJECT_NONE) then - toPlayer = CombatLog_Object_IsA(destFlags, COMBATLOG_FILTER_MINE) - toPet = CombatLog_Object_IsA(destFlags, COMBATLOG_FILTER_MY_PET) - end - - if not fromPlayer and not toPlayer and not fromPet and not toPet then return end - if (not fromPlayer and not toPlayer) and (toPet or fromPet) and not db["PET"] then return end - local amount, school, resisted, blocked, absorbed, critical, glancing, crushing local spellId, spellName, spellSchool, missType, powerType, extraAmount, overHeal local text, texture, message, inout, color, auraType @@ -671,7 +695,7 @@ function EavesDrop:CombatEvent(_, _) else spellId, spellName, _, amount, _, school, resisted, blocked, absorbed, critical, glancing, crushing = select(12, CombatLogGetCurrentEventInfo()) - texture = select(3, GetSpellInfo(spellId)) + texture = GetSpellTexture(spellId) outtype, intype = "TSPELL", "PSPELL" whiteDMG = false end @@ -742,7 +766,7 @@ function EavesDrop:CombatEvent(_, _) spellId, spellName, _, auraType, _ = select(12, CombatLogGetCurrentEventInfo()) -- If spell is blacklisted, don't show it if isBlacklisted(spellName, spellId) then return end - texture = select(3, GetSpellInfo(spellId)) + texture = GetSpellTexture(spellId) if toPlayer and db[auraType] then self:DisplayEvent( INCOMING, @@ -760,7 +784,7 @@ function EavesDrop:CombatEvent(_, _) spellId, spellName, _, auraType, _ = select(12, CombatLogGetCurrentEventInfo()) -- If spell is blacklisted, don't show it if isBlacklisted(spellName, spellId) then return end - texture = select(3, GetSpellInfo(spellId)) + texture = GetSpellTexture(spellId) if toPlayer and db[auraType .. "FADE"] then self:DisplayEvent( INCOMING, @@ -778,28 +802,67 @@ function EavesDrop:CombatEvent(_, _) local _absorbed --luacheck: ignore spellId, spellName, spellSchool, amount, overHeal, _absorbed, critical = select(12, CombatLogGetCurrentEventInfo()) text = tostring(shortenValue(amount)) - texture = select(3, GetSpellInfo(spellId)) - --@debug@ - --[[ if _absorbed and _absorbed ~= 0 then + local original_overheal = overHeal + -- texture = select(3, GetSpellInfo(spellId)) + texture = GetSpellTexture(spellId) + + local a, o = false, false + local updatedAmount = amount + -- If spell is blacklisted, don't show it + if isBlacklisted(spellName, spellId) or (amount < db["HFILTER"]) then return end + if db["OVERHEAL"] and overHeal and overHeal > 0 then + o = true + updatedAmount = updatedAmount - overHeal + end + if db["HEALABSORB"] and _absorbed and _absorbed > 0 then + a = true + --@debug@ + print(string_format("amount: %d, absorbed: %d", amount, _absorbed)) + --@end-debug@ + if updatedAmount == 0 then + overHeal = overHeal - _absorbed + else + updatedAmount = updatedAmount - _absorbed + end + -- updatedAmount = updatedAmount - _absorbed + end + + -- Is this a bug in game?!!! + if overHeal < 0 or updatedAmount < 0 or amount < overHeal or amount < _absorbed then + --@debug@ + print(string_format("|cffff0000Found An Issue|r")) + print(string_format("ORIGINAL: Amount: %d, _absorbed: %d, overHeal: %d", amount, _absorbed, original_overheal)) + print(string_format("ADJUSTED: Amount: %d, _absorbed: %d, overHeal: %d", updatedAmount, _absorbed, overHeal)) print( string_format( - "|cff00ff00--> _absorbed|r (NON-Absorb event): amount: %d, absorbed: %d, diff: %d", - amount, - _absorbed, - amount - _absorbed + "Negative values:\noverHeal: %s, updatedAmount: %s, amount 0 then + -- text = string_format("%s {%s}", shortenValue(amount - overHeal), shortenValue(overHeal)) + -- end + if critical then text = critchar .. text .. critchar end + -- print(1, db["HEALABSORB"], _absorbed) if toPlayer or toPet then totHealingIn = totHealingIn + amount - -- If spell is blacklisted, don't show it - if isBlacklisted(spellName, spellId) or (amount < db["HFILTER"]) then return end - if db["OVERHEAL"] and overHeal > 0 then - text = string_format("%s {%s}", shortenValue(amount - overHeal), shortenValue(overHeal)) - end - if critical then text = critchar .. text .. critchar end if db["HEALERID"] == true and not fromPlayer and not fromPet then text = text .. " (" .. (sourceName or "Unknown") .. ")" end @@ -814,12 +877,6 @@ function EavesDrop:CombatEvent(_, _) text = "+" .. text elseif fromPlayer or fromPet then totHealingOut = totHealingOut + amount - -- If spell is blacklisted or its amount is small, don't show it - if isBlacklisted(spellName, spellId) or (amount < db["HFILTER"]) then return end - if db["OVERHEAL"] and overHeal > 0 then - text = string_format("%s {%s}", shortenValue(amount - overHeal), shortenValue(overHeal)) - end - if critical then text = critchar .. text .. critchar end color = db["THEAL"] if self:TrackStat(inout, "heal", spellName, texture, SCHOOL_STRINGS[spellSchool], amount, critical, message) then text = newhigh .. text .. newhigh @@ -836,7 +893,7 @@ function EavesDrop:CombatEvent(_, _) tcolor = "TMELEE" else spellId, spellName, _, missType, _, amount = select(12, CombatLogGetCurrentEventInfo()) - texture = select(3, GetSpellInfo(spellId)) + texture = GetSpellTexture(spellId) tcolor = "TSPELL" end text = _G[missType] @@ -881,7 +938,7 @@ function EavesDrop:CombatEvent(_, _) spellId, spellName, _, amount, powerType, extraAmount = select(12, CombatLogGetCurrentEventInfo()) -- If spell is blacklisted, don't show it if isBlacklisted(spellName, spellId) then return end - texture = select(3, GetSpellInfo(spellId)) + texture = GetSpellTexture(spellId) if toPlayer then totHealingIn = totHealingIn + amount text = string_format("-%d %s", amount, string_nil(POWER_STRINGS[powerType])) @@ -904,7 +961,7 @@ function EavesDrop:CombatEvent(_, _) spellId, spellName, _, amount, _, powerType = select(12, CombatLogGetCurrentEventInfo()) -- If spell is blacklisted, don't show it if isBlacklisted(spellName, spellId) then return end - texture = select(3, GetSpellInfo(spellId)) + texture = GetSpellTexture(spellId) if toPlayer then if amount < db["MFILTER"] then return end color = db["PGAIN"] @@ -944,14 +1001,16 @@ function EavesDrop:CombatEvent(_, _) else -- self:Print(event, sourceName, destName) --@debug@ - if event == "HEALABSORB" then - print("|cffaabbff HEALABSORB event ==============================|r") + local _d = false + if etype == "HEALABSORB" then + print(_d, "|cffaabbff HEALABSORB event ==============================|r") local load = { select(12, CombatLogGetCurrentEventInfo()) } for idx, v in ipairs(load) do - print(string_format("Arg%s: %s", tostring(idx), tostring(v))) + print(_d, string_format("Arg%s: %s", tostring(idx), tostring(v))) end end print( + _d, string_format( "Event: %s, |cffff0000source: %s, |cffF48CBAdest: %s|r", tostring(event), @@ -1120,10 +1179,11 @@ function EavesDrop:PLAYER_REGEN_ENABLED() self:DisplayEvent(MISC, L["EndCombat"], nil, db["MISC"]) if db["SUMMARY"] == true then local duration = round(GetTime() - timeStart, 1) - local DPS = round(totDamageOut / duration, 1) or 0 - local HPS = round(totHealingOut / duration, 1) or 0 - local IDPS = round(totDamageIn / duration, 1) or 0 - local IHPS = round(totHealingIn / duration, 1) or 0 + local _nz = duration ~= 0 + local DPS = _nz and round(totDamageOut / duration, 1) or 0 + local HPS = _nz and round(totHealingOut / duration, 1) or 0 + local IDPS = _nz and round(totDamageIn / duration, 1) or 0 + local IHPS = _nz and round(totHealingIn / duration, 1) or 0 local strSummary = convertRGBtoHEXString(db["MISC"], duration .. " " .. L["IncombatSummary"]) .. "\n" .. convertRGBtoHEXString(db["PHIT"], L["IncomingDamge"] .. ": " .. totDamageIn .. " (" .. IDPS .. ")") @@ -1158,7 +1218,7 @@ function EavesDrop:PLAYER_DEAD() if GetTime() < (EavesDrop.lastDeath or 0) + 2 then return end EavesDrop.lastDeath = GetTime() --@debug@ - print("*****", date("%I:%M:%S")) + print("*****", date("%H:%M:%S")) print("PLAYER_DEAD fired at ", GetTime()) print("Processing PLAYER_DEAD event") print("*****") @@ -1197,17 +1257,22 @@ function EavesDrop:DisplayEvent(inout, text, texture, color, message, spellname) pEvent.color = color or tempcolor -- Messages probably already have a timestamp, so let's clear that up if db["TIMESTAMP"] == true and message then - -- Check if we have a timestamp here and remove to use our own + -- Check if we have a timestamp here and clean it up before using it. local timecutoff = string.find(message, "> ") + local combat_message, timestamp -- If we did, skip those two characters "> " - if timecutoff then message = strsub(message, timecutoff + 2) end - - pEvent.tooltipText = string_format("|cffffffff%s|r\n%s", date("%I:%M:%S"), message) + if timecutoff then + combat_message = strsub(message, timecutoff + 2) + timestamp = strsub(message, 1, timecutoff - 1) + pEvent.tooltipText = string_format("|cffffffff%s|r\n%s", timestamp, combat_message) + else + pEvent.tooltipText = string_format("|cffffffff%s|r\n%s", date("%H:%M:%S"), message) + end elseif db["TIMESTAMP"] == true and text then - pEvent.tooltipText = string_format("|cffffffff%s|r\n%s", date("%I:%M:%S"), text) + pEvent.tooltipText = string_format("|cffffffff%s|r\n%s", date("%H:%M:%S"), text) elseif db["TIMESTAMP"] == true then - pEvent.tooltipText = string_format("|cffffffff%s|r\n%s", date("%I:%M:%S"), tooltiptext or "") + pEvent.tooltipText = string_format("|cffffffff%s|r\n%s", date("%H:%M:%S"), tooltiptext or "") elseif spellname then pEvent.tooltipText = spellname else @@ -1284,6 +1349,11 @@ function EavesDrop:UpdateEvents() end --@end-debug@ text:SetText(value.text or "") + --@debug@ + if not value or not value.color or not value.color.r or not value.color.g or not value.color.b then + DevTools_Dump(value) + end + --@end-debug@ text:SetTextColor(value.color.r, value.color.g, value.color.b, 1) frame.delay = delay frame.alpha = 1 @@ -1497,7 +1567,7 @@ function EavesDrop:ParseReflect( ... ) local spellId, spellName, _, amount, school, _, _, _, critical, _, _ = select(1, ...) - local texture = select(3, GetSpellInfo(spellId)) + local texture = GetSpellTexture(spellId) local text local messsage = CombatLog_OnEvent( Blizzard_CombatLog_CurrentSettings, @@ -1581,8 +1651,8 @@ end function EavesDrop:ShowHistory() if not EavesDropHistoryFrame:IsShown() then EavesDropHistoryFrame:Show() + PlaySound(888) else EavesDropHistoryFrame:Hide() end - PlaySound(888) end diff --git a/EavesDrop.xml b/EavesDrop.xml index 9c736fd..584802d 100644 --- a/EavesDrop.xml +++ b/EavesDrop.xml @@ -533,8 +533,10 @@ EavesDropTab:SetAlpha(1); - GameTooltip:SetOwner(self, EavesDrop.ToolTipAnchor); - GameTooltip:SetText(self.tooltipText, nil, 1); + if ( self.tooltipText ) then + GameTooltip:SetOwner(self, EavesDrop.ToolTipAnchor); + GameTooltip:SetText(self.tooltipText, nil, 1); + end EavesDropTab:SetAlpha(0); diff --git a/EavesDropStats.lua b/EavesDropStats.lua index 0174566..9ef8c0a 100644 --- a/EavesDropStats.lua +++ b/EavesDropStats.lua @@ -20,7 +20,7 @@ local string_format = string.format ---------------------- -- append date and time to event local function geteventtime(arg1) - return string.format("|cffffffff%s|r\n%s", date("%x %I:%M:%S"), arg1 or "") + return string.format("|cffffffff%s|r\n%s", date("%x %H:%M:%S"), arg1 or "") end ------------------------------ diff --git a/EavesDrop.toc b/EavesDrop_Cata.toc similarity index 62% rename from EavesDrop.toc rename to EavesDrop_Cata.toc index ffcf8ff..66add05 100644 --- a/EavesDrop.toc +++ b/EavesDrop_Cata.toc @@ -1,9 +1,9 @@ -## Interface: 100207 +## Interface: 40400 ## Name: EavesDrop ## Title: EavesDrop ## Notes: A simple combat log that displays events similar to SCT ## Version: @project-version@ -## Author: Grayhoof (Edited by Domzae, Updated for SL/WOTLK/DF by spamwax) +## Author: Grayhoof (Edited by Domzae, Updated for retail & classic by |cFFF48CBAspamwax|r) ## SavedVariables: EavesDropDB ## SavedVariablesPerCharacter: EavesDropStatsDB ## X-Website: https://github.com/spamwax/EavesDrop @@ -14,6 +14,10 @@ ## X-Wago-ID: WqKQw1Nx ## X-Curse-Project-Name: EavesDrop ## X-Curse-Project-ID: 2812 +## IconTexture: Interface\Icons\inv_mousehearthstone +## X-Credits: Grayhoof, spamwax, Domzae +## Notes-zhCN: 一个简单的战斗日志,显示所有伤害、增益等…… +## Notes-koKR: 모든 데미지, 버프 등을 표시하는 간단한 전투 로그입니다. embeds.xml diff --git a/EavesDrop_Mainline.toc b/EavesDrop_Mainline.toc index f461dca..54cd17d 100644 --- a/EavesDrop_Mainline.toc +++ b/EavesDrop_Mainline.toc @@ -1,9 +1,9 @@ -## Interface: 100207 +## Interface: 110000 ## Name: EavesDrop ## Title: EavesDrop ## Notes: A simple combat log that displays events similar to SCT ## Version: @project-version@ -## Author: Grayhoof (Edited by Domzae, Updated for SL/WOTLK/DF by spamwax) +## Author: Grayhoof (Edited by Domzae, Updated for retail & classic by |cFFF48CBAspamwax|r) ## SavedVariables: EavesDropDB ## SavedVariablesPerCharacter: EavesDropStatsDB ## X-Website: https://github.com/spamwax/EavesDrop @@ -14,6 +14,10 @@ ## X-Wago-ID: WqKQw1Nx ## X-Curse-Project-Name: EavesDrop ## X-Curse-Project-ID: 2812 +## IconTexture: Interface\Icons\inv_mousehearthstone +## X-Credits: Grayhoof, spamwax, Domzae +## Notes-zhCN: 一个简单的战斗日志,显示所有伤害、增益等…… +## Notes-koKR: 모든 데미지, 버프 등을 표시하는 간단한 전투 로그입니다. embeds.xml diff --git a/EavesDrop_Wrath.toc b/EavesDrop_Wrath.toc deleted file mode 100644 index ad89715..0000000 --- a/EavesDrop_Wrath.toc +++ /dev/null @@ -1,26 +0,0 @@ -## Interface: 30401 -## Name: EavesDrop -## Title: EavesDrop -## Notes: A simple combat log that displays events similar to SCT -## Version: @project-version@ -## Author: Grayhoof (Edited by Domzae, Updated for SL/WOTLK/DF by spamwax) -## SavedVariables: EavesDropDB -## SavedVariablesPerCharacter: EavesDropStatsDB -## X-Website: https://github.com/spamwax/EavesDrop -## X-Category: Combat -## X-RelSite-WoWI: 5332 -## X-Embeds: Ace3, LibSharedMedia-3.0 -## OptionalDeps: Ace3, LibSharedMedia-3.0 -## X-Wago-ID: WqKQw1Nx -## X-Curse-Project-Name: EavesDrop -## X-Curse-Project-ID: 2812 - -embeds.xml - -locals\localization-enUS.lua -locals\localization-koKR.lua -locals\localization-zhCN.lua -EavesDrop.lua -EavesDropStats.lua -options.lua -Wrath\EavesDrop.xml diff --git a/Media/Textures/EavesDrop.blp b/Media/Textures/EavesDrop.blp new file mode 100644 index 0000000000000000000000000000000000000000..345f212e0b71370d3fdd89c3c3afac2c62fc335c GIT binary patch literal 350740 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%0DS-0PBhs^I{ZPxbS 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:SetBackdrop({bgFile = "Interface\\QuestFrame\\UI-QuestTitleHighlight", insets={left=2, right=2, top=2, bottom=2}}); - self:SetBackdropColor(0, 0, 0, 0); - - - self:SetBackdropColor(1, 1, 1, 0.33); - GameTooltip:SetOwner(self, EavesDrop.ToolTipAnchor); - - GameTooltip:SetText(self.tooltipText, nil, 1); - - - self:SetBackdropColor(0, 0, 0, 0); - GameTooltip:Hide(); - - - if button == "LeftButton" and IsShiftKeyDown() and self.tooltipText then - EavesDrop:SendToChat(self.tooltipText) - elseif IsAltKeyDown() then - if button == "LeftButton" then - EavesDrop:OpenMenu() - elseif button == "RightButton" then - EavesDrop:ShowHistory() - end - end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:SetBackdrop({bgFile = "Interface\\QuestFrame\\UI-QuestTitleHighlight", insets={left=1, right=1, top=1, bottom=1}}); - self:SetBackdropColor(0, 0, 0, .33); - - - self:SetBackdropColor(1, 1, 1, 1); - if ( self.tooltipText ) then - GameTooltip:SetOwner(self, EavesDrop.ToolTipAnchor); - GameTooltip:SetText(self.tooltipText, nil, 1); - end - - - self:SetBackdropColor(0, 0, 0, .33); - GameTooltip:Hide(); - - - if button == "LeftButton" and IsShiftKeyDown() and self.tooltipText2 then - EavesDrop:SendToChat(self.tooltipText2) - elseif button == "RightButton" and IsShiftKeyDown() and self.tooltipText1 then - EavesDrop:SendToChat(self.tooltipText1) - end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:OnBackdropLoaded() - self:SetBackdrop({bgFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeFile="Interface\\Tooltips\\UI-Tooltip-Border", tile=true, tileSize=16, edgeSize=16, insets={left=5, right=5, top=5, bottom=5}}); - - - self:OnBackdropSizeChanged() - - - EavesDrop:Scroll(self, delta); - - - EavesDropTab:SetAlpha(1); - - - EavesDropTab:SetAlpha(0); - - - if IsAltKeyDown() then - if button == "LeftButton" then - EavesDrop:OpenMenu() - elseif button == "RightButton" then - EavesDrop:ShowHistory() - end - end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:SetBackdrop({bgFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeFile="Interface\\Tooltips\\UI-Tooltip-Border", tile=true, tileSize=16, edgeSize=16, insets={left=5, right=5, top=5, bottom=5}}); - self:RegisterForDrag("LeftButton"); - - - if (not EavesDrop.db.profile["LOCKED"] ) then - self:StartMoving(); - end - - - self:StopMovingOrSizing(); - local x, y = self:GetLeft(), self:GetTop() - local es = self:GetEffectiveScale() - local ps = UIParent:GetScale() - x = x*es - GetScreenWidth()*ps/2 - y = y*es - GetScreenHeight()*ps/2 - EavesDrop.db.profile.hx, EavesDrop.db.profile.hy = x, y - - - - \ No newline at end of file diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua index bb1e4fd..f2a238b 100644 --- a/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua +++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua @@ -1,7 +1,7 @@ --[[----------------------------------------------------------------------------- EditBox Widget -------------------------------------------------------------------------------]] -local Type, Version = "EditBox", 28 +local Type, Version = "EditBox", 29 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end @@ -10,7 +10,7 @@ local tostring, pairs = tostring, pairs -- WoW APIs local PlaySound = PlaySound -local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, GetSpellInfo +local GetCursorInfo, ClearCursor = GetCursorInfo, ClearCursor local CreateFrame, UIParent = CreateFrame, UIParent local _G = _G @@ -76,12 +76,16 @@ end local function EditBox_OnReceiveDrag(frame) local self = frame.obj - local type, id, info = GetCursorInfo() + local type, id, info, extra = GetCursorInfo() local name if type == "item" then name = info elseif type == "spell" then - name = GetSpellInfo(id, info) + if C_Spell and C_Spell.GetSpellName then + name = C_Spell.GetSpellName(extra) + else + name = GetSpellInfo(id, info) + end elseif type == "macro" then name = GetMacroInfo(id) end diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua index bacb2be..f0095b5 100644 --- a/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua +++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua @@ -1,4 +1,4 @@ -local Type, Version = "MultiLineEditBox", 32 +local Type, Version = "MultiLineEditBox", 33 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end @@ -6,7 +6,7 @@ if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end local pairs = pairs -- WoW APIs -local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, ClearCursor +local GetCursorInfo, ClearCursor = GetCursorInfo, ClearCursor local CreateFrame, UIParent = CreateFrame, UIParent local _G = _G @@ -100,9 +100,13 @@ local function OnMouseUp(self) end local function OnReceiveDrag(self) -- EditBox / ScrollFrame - local type, id, info = GetCursorInfo() + local type, id, info, extra = GetCursorInfo() if type == "spell" then - info = GetSpellInfo(id, info) + if C_Spell and C_Spell.GetSpellName then + info = C_Spell.GetSpellName(extra) + else + info = GetSpellInfo(id, info) + end elseif type ~= "item" then return end diff --git a/locals/localization-enUS.lua b/locals/localization-enUS.lua index e0f7803..8c051c9 100644 --- a/locals/localization-enUS.lua +++ b/locals/localization-enUS.lua @@ -22,6 +22,8 @@ if L then L["History"] = "Show EavesDrop History" L["IncombatSummary"] = "seconds in combat" L["NewLevel"] = "Gratz! New Level %d" + L["Vigor"] = "Vigor" + L["Essence"] = "Essence" --events L["Events"] = "Events" @@ -53,6 +55,8 @@ if L then L["EOverhealingD"] = "Display your overhealing." L["EHealers"] = "Healer ID" L["EHealersD"] = "Display who healed you and who you heal." + L["EHealAbsorbs"] = "Healing Absorbs" + L["EHealAbsorbsD"] = "Display healing absorbs and adjust net healing and overheals accordingly." L["ESummary"] = "Combat Summary" L["ESummaryD"] = "Display a short summary of damage and healing per combat encounter." diff --git a/locals/localization-koKR.lua b/locals/localization-koKR.lua index 0cd11da..5ecf55e 100644 --- a/locals/localization-koKR.lua +++ b/locals/localization-koKR.lua @@ -1,4 +1,4 @@ -local L = LibStub("AceLocale-3.0"):NewLocale("EavesDrop", "koKR") +local L = LibStub("AceLocale-3.0"):NewLocale("EavesDrop", "koKR") if L then --main @@ -22,6 +22,8 @@ if L then L["History"] = "기록 보기" L["IncombatSummary"] = "전투 시간" L["NewLevel"] = "축하합니다! 새로운 수준 %d" + L["Vigor"] = "활기" + L["Essence"] = "본질" --events L["Events"] = "이벤트" @@ -53,6 +55,8 @@ if L then L["EOverhealingD"] = "플레이어의 생명력을 초과하는 치유량 표시" L["EHealers"] = "힐러 표시" L["EHealersD"] = "플레이어에게 힐을 준 대상, 플레이어가 힐을 준 대상 표시" + L["EHealAbsorbs"] = "치유 흡수" + L["EHealAbsorbsD"] = "치유 표시는 순 치유량을 흡수하고 조정하며 그에 따라 초과 치유량을 조정합니다." L["ESummary"] = "전투 요약" L["ESummaryD"] = "매 전투시 공격 및 치유에 대한 요약을 보여줍니다." diff --git a/locals/localization-zhCN.lua b/locals/localization-zhCN.lua index f294d9f..b3d9c4c 100644 --- a/locals/localization-zhCN.lua +++ b/locals/localization-zhCN.lua @@ -1,4 +1,4 @@ -local L = LibStub("AceLocale-3.0"):NewLocale("EavesDrop", "zhCN", false) +local L = LibStub("AceLocale-3.0"):NewLocale("EavesDrop", "zhCN", false) if L then --main @@ -22,6 +22,8 @@ if L then L["History"] = "显示EavesDrop历史记录" L["IncombatSummary"] = "秒战斗" L["NewLevel"] = "恭喜! 新关卡 %d" + L["Vigor"] = "活力" + L["Essence"] = "本质" --events L["Events"] = "事件显示开启/关闭" @@ -53,6 +55,8 @@ if L then L["EOverhealingD"] = "显示你的过量治疗" L["EHealers"] = "治疗者姓名" L["EHealersD"] = "显示谁治疗了你与你治疗了谁" + L["EHealAbsorbs"] = "治疗吸收" + L["EHealAbsorbsD"] = "显示治疗吸收并相应调整净治疗和过度治疗。" L["ESummary"] = "战斗摘要" L["ESummaryD"] = "显示每场战斗遭遇的伤害与治疗摘要" diff --git a/options.lua b/options.lua index 1263e3d..4865fce 100644 --- a/options.lua +++ b/options.lua @@ -1,8 +1,13 @@ +-- ^^ Example for addon options settings? +-- https://discord.com/channels/327414731654692866/1014994401644269670/1234228949459144765 +-- https://github.com/tg123/myslot/commit/23f7863661310f40dab63dcf55b0f8ed3fadf667 + local L = LibStub("AceLocale-3.0"):GetLocale("EavesDrop", true) local EavesDrop = EavesDrop local media = LibStub("LibSharedMedia-3.0") +local GetSpellName = C_Spell.GetSpellName and C_Spell.GetSpellName or GetSpellName -- common functions for options callbacks local function getOption(info) return (info.arg and EavesDrop.db.profile[info.arg] or EavesDrop.db.profile[info[#info]]) @@ -108,7 +113,7 @@ local setBlacklistOption = function(info, inp) return elseif tonumber(aura_name) and tonumber(aura_id) then -- number, number id = tonumber(aura_name) - name = GetSpellInfo(id) + name = GetSpellName(id) if not name then print(string.format("EavesDrop: |cffff0000Invalid spell ID:|r %d", id)) return @@ -121,7 +126,7 @@ local setBlacklistOption = function(info, inp) end elseif tonumber(aura_name) and not tonumber(aura_id) then -- number, string id = tonumber(aura_name) - name = GetSpellInfo(id) + name = GetSpellName(id) if name then key = id value = name @@ -138,7 +143,7 @@ local setBlacklistOption = function(info, inp) if tonumber(aura_name) then -- it's spell id id = tonumber(aura_name) - name = GetSpellInfo(id) + name = GetSpellName(id) if name then key = id value = name @@ -283,6 +288,14 @@ function EavesDrop:SetupOptions() get = getOption, set = setOption, }, + HEALABSORB = { + name = L["EHealAbsorbs"], + type = "toggle", + desc = L["EHealAbsorbsD"], + order = 16, + get = getOption, + set = setOption, + }, HEALERID = { name = L["EHealers"], type = "toggle", @@ -786,6 +799,7 @@ function EavesDrop:SetupOptions() end end, }, + -- Heal HFILTER = { name = L["MHFilter"], type = "range", @@ -794,9 +808,10 @@ function EavesDrop:SetupOptions() get = getOption, set = setOption, min = 0, - max = 2000, - step = 25, + max = EavesDrop:IsRetail() and 100000 or 2000, + step = EavesDrop:IsRetail() and 1000 or 25, }, + -- Power Gain MFILTER = { name = L["MMFilter"], type = "range", @@ -808,6 +823,7 @@ function EavesDrop:SetupOptions() max = 2000, step = 25, }, + -- Damage DFILTER = { name = L["MDFilter"], type = "range", @@ -816,8 +832,8 @@ function EavesDrop:SetupOptions() get = getOption, set = setOption, min = 0, - max = 2000, - step = 25, + max = EavesDrop:IsRetail() and 100000 or 2000, + step = EavesDrop:IsRetail() and 1000 or 25, }, TRUNCATETYPE = { name = L["MBuffTruncType"], @@ -896,12 +912,12 @@ function EavesDrop:GetDefaultConfig() ["PBUFF"] = { r = 0.7, g = 0.7, b = 0.0 }, ["PDEBUFF"] = { r = 0.0, g = 0.5, b = 0.5 }, [SPELL_SCHOOL0_CAP] = { r = 1, g = 0, b = 0 }, - [SPELL_SCHOOL1_CAP] = { r = 1, g = 1, b = 0 }, - [SPELL_SCHOOL2_CAP] = { r = 1, g = 0.3, b = 0 }, - [SPELL_SCHOOL3_CAP] = { r = 0.5, g = 1, b = 0.2 }, - [SPELL_SCHOOL4_CAP] = { r = 0.4, g = 0.6, b = 0.9 }, - [SPELL_SCHOOL5_CAP] = { r = 0.4, g = 0.4, b = 0.5 }, - [SPELL_SCHOOL6_CAP] = { r = 0.8, g = 0.8, b = 1 }, + [SPELL_SCHOOL1_CAP] = { r = 1, g = 0.9, b = 0.5 }, + [SPELL_SCHOOL2_CAP] = { r = 1, g = 0.5, b = 0 }, + [SPELL_SCHOOL3_CAP] = { r = 0.3, g = 1, b = 0.3 }, + [SPELL_SCHOOL4_CAP] = { r = 0.5, g = 1, b = 1 }, + [SPELL_SCHOOL5_CAP] = { r = 0.5, g = 0.5, b = 1 }, + [SPELL_SCHOOL6_CAP] = { r = 1, g = 0.5, b = 1 }, ["NUMLINES"] = 10, ["FADETIME"] = 10, ["LINEHEIGHT"] = 20, @@ -931,6 +947,7 @@ function EavesDrop:GetDefaultConfig() ["FADEFRAME"] = false, ["FLIP"] = false, ["OVERHEAL"] = false, + ["HEALABSORB"] = false, ["HEALERID"] = false, ["HISTORY"] = true, ["TEXTSIZE"] = 14, @@ -951,5 +968,6 @@ end function EavesDrop:OpenMenu() -- LibStub("AceConfigDialog-3.0"):Open("EavesDrop") - InterfaceOptionsFrame_OpenToCategory("EavesDrop") + -- InterfaceOptionsFrame_OpenToCategory("EavesDrop") + Settings.OpenToCategory("EavesDrop") end