CT_ShieldMod_ShieldDamageLeft = 0; CT_ShieldMod_MeleeStats = { }; CT_ShieldMod_SpellStats = { }; CT_ShieldMod_Version = "B1.0"; CT_ShieldMod_SaveStatus = "off"; SLASH_SHIELDMOD1 = "/shieldmod"; SLASH_SHIELDMOD2 = "/sm"; SlashCmdList["SHIELDMOD"] = function(msg) if ( msg == "save on" ) then CT_ShieldMod_SaveStatus = "on"; if ( CT_Mods and CT_Mods[CT_SHIELDMOD_MODNAME] ) then CT_Mods[CT_SHIELDMOD_MODNAME]["modStatus"] = "on"; end DEFAULT_CHAT_FRAME:AddMessage(" Shield Mod is now saving data over sessions.", 1, 1, 0); elseif ( msg == "save off" ) then CT_ShieldMod_SaveStatus = "off"; if ( CT_Mods and CT_Mods[CT_SHIELDMOD_MODNAME] ) then CT_Mods[CT_SHIELDMOD_MODNAME]["modStatus"] = "off"; end DEFAULT_CHAT_FRAME:AddMessage(" Shield Mod is no longer saving data over sessions.", 1, 1, 0); else DEFAULT_CHAT_FRAME:AddMessage(" You can use the following slash commands to control Shield Mod:", 1, 1, 0); DEFAULT_CHAT_FRAME:AddMessage(" |c00FFFFFF/shieldmod save on|r - Saves stats over sessions.", 1, 1, 0); DEFAULT_CHAT_FRAME:AddMessage(" |c00FFFFFF/shieldmod save off|r - Stops saving stats over sessions.", 1, 1, 0); DEFAULT_CHAT_FRAME:AddMessage(" Note that you can also use |c00FFFFFF/sm|r.", 1, 1, 0); end end if ( CT_AddMovable ) then CT_AddMovable("CT_ShieldFrame", CT_SHIELDMOD_MOVABLE, "RIGHT", "LEFT", "Minimap", -14, 0); end function CT_ShieldMod_OnEnter() if ( not CT_RegisterMod or CT_MF_ShowFrames ) then GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); GameTooltip:SetText("Click to drag"); end end function CT_ShieldMod_ModOnClick(modId) SlashCmdList["SHIELDMOD"]("save " .. CT_Mods[modId]["modStatus"]); end function CT_ShieldMod_OnLoad() this:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS"); this:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES"); this:RegisterEvent("CHAT_MSG_COMBAT_PARTY_HITS"); this:RegisterEvent("CHAT_MSG_COMBAT_PARTY_MISSES"); this:RegisterEvent("CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES"); this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PARTY_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"); this:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_SELF"); this:RegisterEvent("VARIABLES_LOADED"); if ( not CT_RegisterMod ) then DEFAULT_CHAT_FRAME:AddMessage(" Shield Mod " .. CT_ShieldMod_Version .. " loaded. Write /shieldmod for more info.", 1, 1, 0); else CT_RegisterMod(CT_SHIELDMOD_MODNAME, CT_SHIELDMOD_SUBNAME, 4, "Interface\\Icons\\Spell_Holy_PowerWordShield", CT_SHIELDMOD_TOOLTIP, "off", nil, CT_ShieldMod_ModOnClick); end end function CT_ShieldMod_AddDamage(unit, dmg) if ( not CT_ShieldMod_MeleeStats[unit] ) then CT_ShieldMod_MeleeStats[unit] = { ["hits"] = 1, ["dmg"] = dmg }; else CT_ShieldMod_MeleeStats[unit].hits = CT_ShieldMod_MeleeStats[unit].hits + 1; CT_ShieldMod_MeleeStats[unit].dmg = CT_ShieldMod_MeleeStats[unit].dmg + dmg; end end function CT_ShieldMod_AbsorbShield(unit, spell) if ( not CT_ShieldMod_HasShield ) then return; end local recognized; if ( spell ) then if ( CT_ShieldMod_SpellStats[unit] and CT_ShieldMod_SpellStats[unit][spell] ) then CT_ShieldMod_ShieldDamageLeft = CT_ShieldMod_ShieldDamageLeft - floor(CT_ShieldMod_SpellStats[unit][spell].dmg / CT_ShieldMod_SpellStats[unit][spell].hits+0.5); recognized = true; end else if ( CT_ShieldMod_MeleeStats[unit] ) then CT_ShieldMod_ShieldDamageLeft = CT_ShieldMod_ShieldDamageLeft - floor(CT_ShieldMod_MeleeStats[unit].dmg / CT_ShieldMod_MeleeStats[unit].hits+0.5); recognized = true; end end if ( CT_ShieldMod_ShieldDamageLeft < 0 ) then CT_ShieldMod_ShieldDamageLeft = 0; end CT_ShieldFrameText:SetText("Damage Left: |c00FFFFFF" .. CT_ShieldMod_ShieldDamageLeft .. "|r"); CT_ShieldFrame:SetWidth(CT_ShieldFrameText:GetWidth()+10); CT_ShieldFrame:SetHeight(CT_ShieldFrameText:GetHeight()+15); if ( not recognized ) then CT_ShieldFrame.recognized = nil; CT_ShieldFrame:SetBackdropColor(1, 0, 0, 0.5); elseif ( CT_ShieldFrame.recognized ) then CT_ShieldFrame.recognized = 1; CT_ShieldFrame:SetBackdropColor(0, 0, 1, 0.5); end end function CT_ShieldMod_AddSpellDamage(unit, spell, dmg) if ( not CT_ShieldMod_SpellStats[unit] ) then CT_ShieldMod_SpellStats[unit] = { [spell] = { ["hits"] = 1, ["dmg"] = dmg } }; elseif ( not CT_ShieldMod_SpellStats[unit][spell] ) then CT_ShieldMod_SpellStats[unit][spell] = { ["hits"] = 1, ["dmg"] = dmg }; else CT_ShieldMod_SpellStats[unit][spell].hits = CT_ShieldMod_SpellStats[unit][spell].hits + 1; CT_ShieldMod_SpellStats[unit][spell].dmg = CT_ShieldMod_SpellStats[unit][spell].dmg + dmg; end end function CT_ShieldMod_OnEvent(event) if ( event == "VARIABLES_LOADED" ) then if ( CT_ShieldMod_SaveStatus == "off" ) then CT_ShieldMod_SpellStats = { }; CT_ShieldMod_MeleeStats = { }; end elseif ( UnitClass("player") ~= "Priest" ) then return; elseif ( event == "CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS" or event == "CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS" or event == "CHAT_MSG_COMBAT_PARTY_HITS" or event == "CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES" or event == "CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES" or event == "CHAT_MSG_COMBAT_PARTY_MISSES" ) then local _, _, unit, dmg1, dmg2 = string.find(arg1, "(.+) hits you for (%d+) %((%+) absorbed%)%."); if ( unit and dmg1 and dmg2 ) then CT_ShieldMod_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2)); return; end local _, _, unit, dmg1, dmg2 = string.find(arg1, "(.+) crits you for (%d+) %((%+) absorbed%)%."); if ( unit and dmg1 and dmg2 ) then CT_ShieldMod_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2)); return; end local _, _, unit, dmg1, dmg2 = string.find(arg1, "(.+) hits you for (%d+)%. %((%+) blocked%)"); if ( unit and dmg1 and dmg2 ) then CT_ShieldMod_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2)); return; end local _, _, unit, dmg1, dmg2 = string.find(arg1, "(.+) crits you for (%d+)%. %((%+) blocked%)"); if ( unit and dmg1 and dmg2 ) then CT_ShieldMod_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2)); return; end local _, _, unit, dmg = string.find(arg1, "(.+) hits you for (%d+)%.") if ( unit and dmg ) then CT_ShieldMod_AddDamage(unit, tonumber(dmg)); return; end local _, _, unit, dmg = string.find(arg1, "(.+) crits you for (%d+)%."); if ( unit and dmg ) then CT_ShieldMod_AddDamage(unit, tonumber(dmg)); return; end local _, _, unit = string.find(arg1, "(.+) attacks%. You absorb all the damage%."); if ( unit ) then CT_ShieldMod_AbsorbShield(unit); return; end elseif ( event == "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE" or event == "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE" or event == "CHAT_MSG_SPELL_PARTY_DAMAGE" or event == "CHAT_MSG_SPELL_SELF_DAMAGE" ) then local _, _, unit, spell, dmg1, dmg2 = string.find(arg1, "(.+)'s (.+) hits you for (%d+) %((%d+) absorbed%)%."); if ( unit and spell and dmg1 and dmg2 ) then CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg1)+tonumber(dmg2)); return; end local _, _, unit, spell, dmg1, dmg2 = string.find(arg1, "(.+)'s (.+) crits you for (%d+) %((%d+) absorbed%)%."); if ( unit and spell and dmg1 and dmg2 ) then CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg1)+tonumber(dmg2)); return; end local _, _, unit, spell, dmg = string.find(arg1, "(.+)'s (.+) hits you for (%d+)%."); if ( unit and spell and dmg ) then CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg)); return; end local _, _, unit, spell, dmg = string.find(arg1, "(.+)'s (.+) crits you for (%d+)%."); if ( unit and spell and dmg ) then CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg)); return; end local _, _, unit, spell = string.find(arg1, "You absorb (.+)'s (.+)%."); if ( unit and spell ) then CT_ShieldMod_AbsorbShield(unit, spell); return; end local _, _, spell, dmg = string.find(arg1, "Your (.+) hits you for (%d+)%."); if ( spell and dmg) then CT_ShieldMod_AddSpellDamage("GenericUnit", spell, tonumber(dmg)); return; end local _, _, spell = string.find(arg1, "You absorb your (.+)%."); if ( spell ) then CT_ShieldMod_AbsorbShield("GenericUnit", spell); return; end elseif ( event == "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE" ) then local _, _, dmg, unit, spell = string.find(arg1, "You suffer (%d+) .+ from (.+)'s (.+)%."); if ( unit and spell and dmg ) then CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg)); return; end elseif ( event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS" or event == "CHAT_MSG_SPELL_AURA_GONE_SELF" ) then if ( arg1 == "You gain Power Word: Shield." ) then CT_ShieldMod_HasShield = 1; CT_ShieldFrame:Show(); elseif ( arg1 == "Power Word: Shield fades from you." ) then CT_ShieldMod_HasShield = nil; CT_ShieldFrame:Hide(); end return; end end CT_ShieldMod_oldUA = UseAction; function CT_ShieldMod_newUA(id, cursor, self) CT_ShieldMod_oldUA(id, cursor, self); CT_ShieldMod_ScanTooltip(id); end UseAction = CT_ShieldMod_newUA; CT_ShieldMod_oldCS = CastSpell; function CT_ShieldMod_newCS(id, tab) CT_ShieldMod_oldCS(id, tab); CT_ShieldMod_ScanTooltip(id, 1, tab); end CastSpell = CT_ShieldMod_newCS; function CT_ShieldMod_ScanTooltip(id, useSpell, spellTab) CT_ShieldModTooltipTextLeft1:SetText(""); local oldVar = GetCVar("UberTooltips"); SetCVar("UberTooltips", 1); if ( useSpell ) then CT_ShieldModTooltip:SetSpell(id, spellTab); else CT_ShieldModTooltip:SetAction(id); end SetCVar("UberTooltips", oldVar); if ( CT_ShieldModTooltipTextLeft1:GetText() ~= "Power Word: Shield" ) then return; end for i = 1, CT_ShieldModTooltip:NumLines(), 1 do local left = getglobal("CT_ShieldModTooltipTextLeft" .. i); if ( left and left:GetText() ) then local _, _, dmg = string.find(left:GetText(), "absorbing (%d+) damage"); if ( dmg ) then CT_ShieldMod_ShieldDamageLeft = tonumber(dmg); return; end end local right = getglobal("CT_ShieldModTooltipTextRight" .. i); if ( right and right:GetText() ) then local _, _, dmg = string.find(right:GetText(), "absorbing (%d+) damage"); if ( dmg ) then CT_ShieldMod_ShieldDamageLeft = tonumber(dmg); return; end end end end