--[[ Carnival_EnemyCastBar Description: ------------ Displays a replication of your targets spell casting bar on your UI, which can be moved around. Spell casting time is not something that is available to your WoW client, so I have provided cast times for most (if not all spells). As talents can be a factor on the cast time of some spells, the lowest cast time possible is used ie. all Shadow Bolt cast times will display at 2.5 seconds even though the player you have targetted doesnt have those specific talents. Interruptions on your target, ie. they get hit, will not adjust the display on your cast bar, as again, its impossible to know if it affected the cast. This currently works for both Alliance and Horde, but has only been really tested playing against alliance characters. Will display either a green cast bar for friendly targets, or a red for a hostile target. To move the bars, simply target someone and wait for them to do something, when they do, simply click and drag the FIRST bar that appears. This might take a few tries, just get a friend to cast their Hearthstone while you have them targetted and this becomes a whole lot easier :) I do intend to develop this further, just a lot of people who I told about this are extremly interested in getting their grubby little paws on it. So this is only an alpha release, as it currently doesnt do everything I want it to. Expect a new version soon! Support: -------- Either reply on the website you downloaded this from (www.curse-gaming.com or http://ui.worldofwar.net) or on my guilds forums (http://www.carnivalguild.co.uk) Author: ------- Miranda on Al'Akir (EU) But please, don't ask me for support while im in game! If you want to thank me however, feel free :) Revision History: ----------------- 18/01/06 v1.0 ALPHA * Initial Alpha Release 24/01/06 v1.1 BETA * Adjusted bars so that they "grow" from the bottom up * Adjusted cast time on several spells, * Added timers for warlock pet spells, * Added timers for most trinkets, talisman of power, zandalarian hero charm, to show remaining time * Added timers for gained abilities, arcane power, sprint, to show remaining time, * Added timers for racial talents, perception, war stomp, will of the forsaken, to show cast time or remaining time depending on the talent, * Added timers for various PvE events, - Molten Core - Lucifron (Impending Doom, Lucifron's Curse) - Magmadar (Fear) - Gehennas (Gehennas' Curse) - Majordomo (Magic Reflection, Damage Shield) - Ragnaros (Submerge, Knockback and Sons of the Flame) - Blackwing Lair - Firemaw (Wing Buffet, Shadow Flame) - Ebonroc (Wing Buffet, Shadow Flame) - Flamegor (Wing Buffet, Shadow Flame) - Chromaggus (Frost Burn, Time Lapse, Ignite Flesh, Corrosive Acid, Incinerate) - Neferian (Event Start, Bellowing Roar, Class Calls) * Fixed some possibly laggy code 24/01/06 v1.2 BETA * Fixed a major problem with the XML frame 27/01/06 v1.3 BETA * Added Slash Commands - /cenemycast enable/disable - /cenemycast show - /cenemycast pvp - /cenemycast pve * Fixed issue with "X gains Y" events * Added Stoneform, * Added Shadowguard, * Added Priest - Mana Burn, * Added Priest - Holy Fire, * Added Priest - Mind Soothe, * Added Priest - Prayer of Healing, * Added Priest - Shackle Undead, * Added Druid - Hibernate, * Added Druid - Soothe Animal, * Added Druid - Bark Skin, * Added Druid - Innervate, * Added Mage - Conjure Mana Ruby, * Added Mage - Conjure Mana Citrine, * Added Mage - Conjure Mana Jade, * Added Mage - Conjure Mana Agate, * Added Mage - Slow Fall, * Added Warrior - Bloodrage, * Added Warrior - Shield Wall, * Added Warrior - Recklessness, * Added Warrior - Berserker Rage, 31/01/06 v1.4 BETA * Fixed an error about FADESTEP, * Fixed problem with Bellowing Roar on Nefarian/Onyxia, Onyxia's is 1.5sconds, Nefarain's is 2.0seconds * Fixed debug output saying "ECB Control - Running i" * Added cooldown data to the spell database, however the data is not in use yet * Added timer for Hakkar in Zul'Gurrub * Added German localization! * Added /ecb lock - Locks or Unlocks the Casting Bars * Added /ecb reset - Resets the bar position * Adjusted Mage - Fireball, * Adjusted Driud - Bark Skin, * Adjusted Driud - Innervate, * Adjusted Druid - Healing Touch, * Adjusted Druid - Regrowth, * Adjusted Hunter - Scare Beast, * Adjusted Mage - Conjure Water, * Adjusted Mage - Conjure Food, * Adjusted Paladin - Howl of Terror, * Adjusted Paladin - Summon Charger, * Adjusted Paladin - Summon Warhorse * Adjusted Warlock - Summon Felsteed, * Adjusted Warlock - Summon Dreadsteed, * Adjusted Warlock - Imp - Firebolt, * Adjusted Warrior - Slam, * Added Paladin - Divine Protection, * Added Paladin - Divine Shield, * Added Hunter - Dismiss Pet, * Added Hunter - Revive Pet, * Added Hunter - Eyes of the Beast, * Added Hunter - Rapid Fire, * Added Mage - Fire Ward, * Added Mage - Frost Ward, * Added Mage - Teleport: Darnassus, * Added Mage - Teleport: Thunder Bluff, * Added Mage - Teleport: Ironforge, * Added Mage - Teleport: Orgrimmar, * Added Mage - Teleport: Stormwind, * Added Mage - Teleport: Undercity, * Added Mage - Portal: Darnassus, * Added Mage - Portal: Thunder Bluff, * Added Mage - Portal: Ironforge, * Added Mage - Portal: Orgrimmar, * Added Mage - Portal: Stormwind, * Added Mage - Portal: Undercity, * Added Druid - Teleport: Moonglade, * Added Druid - Tiger's Fury, * Added Druid - Frenzied Regeneration, * Added Druid - Rejuvenation * Added Druid - Abolish Poison * Added Priest - Fade, * Added Priest - Renew, * Added Priest - Abolish Disease, * Added Rogue - Evasion, * Added Rogue - Mind-numbing Poison, * Added Rogue - Mind-numbing Poison II, * Added Rogue - Mind-numbing Poison III, * Added Rogue - Pick Lock, * Added Shaman - Far Sight, * Added Shaman - Fire Nova Totem, * Added Shaman - Mana Tide Totem, * Added Shaman - Stoneclaw Totem, * Added Warrior - Slam, * Added Warrior - Retaliation, * Added Warlock - Ritual of Doom, * Added Warlock - Enslave Demon, * Added Warlock - Inferno, * Added Warlock - Shadow Ward, * Added Warlock - Create Spellstone, * Added Warlock - Create Healthstone, * Added Warlock - Create Soulstone, * Added Warlock - Create Firestone, * Added Warlock - Voidwalker - Consume Shadows, 20/02/06 v1.5 * Added French Localization * Added "/cenemycast timer" to toggle the timer text * Fixed the time issue with Flamestrike and BWL mobs * Fixed Nefarian/Ragnaros Timers so that they actually work * Fixed (maybe) the issue with the bars not locking * Fixed (maybe) the issue with multiple bars for the same mob (BWL Drakes) * Fixed most (if not all) the issues with some PvE bars not appearing on MC bosses * Removed the /ecb alias so that it doesnt clash with eCastingBar * Guessed at a fix for the clash with WarriorAlert * Added PvE - BWL - Flamegor - Frenzy * Added PvE - BWL - Chromaggus - Frenzy * Added PvE - BWL - Nefarian - Landing Warning * Added PvE - Outdoor - Azuregos - Manastorm * Added PvE - AQ40 - Obsidian Eradicator Respawn - 15minutes * Added PvE - AQ20 - Anubisath - Explode - 5 seconds? * Added General - First Aid - 8 seconds * Added Engineering - Frost Reflector * Added Engineering - Shadow Reflector * Added Engineering - Fire Reflector * (Reflectors *should* work, however have had NO testing) * Added Mage - Ice Block - 10 seconds * Added Paladin - Blessing of Freedom - 16 seconds * Added Paladin - Blessing of Protection - 10 seconds * Added Paladin - Blessing of Sacrifice - 10 seconds * Adjusted - Hakkar - Blood Siphon - 90 seconds * Adjusted - Warlock - Summon Imp - 6 seconds * Adjusted - Warlock - Summon Succubus - 6 seconds * Adjusted - Warlock - Summon Voidwalker - 6 seconds * Adjusted - Warlock - Summon Felhunter - 6 seconds 21/02/06 v1.6 * Fixed problem with French localization * Fixed problem with German localization * Adjusted PvE - AQ20 - Anubisath - Explode - 6 seconds ]]-- carniactive = true; mobname = "Mob"; mob = "Mob"; spell = "Cast Bar"; function ECB_RegisterUltimateUI() UltimateUI_RegisterConfiguration( "UUI_ECB", "SECTION", "Enemy Cast Bar", "Options to show castbars of other players / npcs." ); UltimateUI_RegisterConfiguration( "UUI_ECB_SEPARATOR", "SEPARATOR", "Enemy Cast Bar", "Options to show castbars of other players / npcs." ); UltimateUI_RegisterConfiguration( "UUI_ECB_ENABLE", "CHECKBOX", "Enable / Disable ECB", "Check or uncheck this box to enable or disable Enemy Cast Bar.", ECB_Enable, 1 ); UltimateUI_RegisterConfiguration( "UUI_ECB_LOCK", "CHECKBOX", "Lock", "Check or uncheck this box to lock ECB to it's current position.", Carnival_EnemyCastBar_LockPos, 0 ); UltimateUI_RegisterConfiguration( "UUI_ECB_RESET_POSITION", "BUTTON", "", "", Carnival_EnemyCastBar_ResetPos, 0, 0, 0, 0, "Reset Position" ); UltimateUI_RegisterConfiguration( "UUI_ECB_TEST", "BUTTON", "", "", ECB_Test, 0, 0, 0, 0, "Show" ); UltimateUI_RegisterConfiguration( "UUI_ECB_TIMER", "CHECKBOX", "Show Time on ECB", "Show or hide Cast Bar time.", ECB_Timer, 1 ); UltimateUI_RegisterConfiguration( "UUI_ECB_PVE", "CHECKBOX", "Show PvE Spells", "Enables or disables ECB from showing PvE only spells.", ECB_PVE, 1 ); UltimateUI_RegisterConfiguration( "UUI_ECB_PVP", "CHECKBOX", "Show PvP Spells", "Enables or disables ECB from showing PvP only spells.", ECB_PVP, 1 ); end function Carnival_EnemyCastBar_OnLoad() this:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF"); this:RegisterEvent("CHAT_MSG_SPELL_FRIENDLYPLAYER_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_FRIENDLYPLAYER_BUFF"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PARTY_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PARTY_BUFF"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_PARTY_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS"); this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"); this:RegisterEvent("CHAT_MSG_MONSTER_YELL"); this:RegisterEvent("CHAT_MSG_MONSTER_EMOTE"); this:RegisterEvent("CHAT_MSG_COMBAT_HOSTILE_DEATH"); this:RegisterEvent("VARIABLES_LOADED"); SLASH_CARNIVALENEMYCASTBAR1 = "/cenemycast"; SLASH_CARNIVALENEMYCASTBAR2 = "/cecb"; SlashCmdList["CARNIVALENEMYCASTBAR"] = function(msg) Carnival_EnemyCastBar_Handler(msg); end for i=1, 20 do local button = getglobal("Carni_ECB_"..i); button:Hide(); end if ( not Carnival_EnemyCastBar ) then Carnival_EnemyCastBar = { }; Carnival_EnemyCastBar.bStatus = true; Carnival_EnemyCastBar.bPvP = true; Carnival_EnemyCastBar.bPvE = true; Carnival_EnemyCastBar.bLocked = true; Carnival_EnemyCastBar.bDebug = true; Carnival_EnemyCastBar.bTimer = true; for i=1, 20 do local frame = getglobal("Carni_ECB_"..i); frame:StopMovingOrSizing(); frame:EnableMouse(0); Carnival_EnemyCastBar.bLocked = true; end end end function Carnival_EnemyCastBar_OnClick() if ( arg1 == "LeftButton" ) then DEFAULT_CHAT_FRAME:AddMessage("ECB - LeftButton"); elseif ( arg1 == "RightButton" ) then DEFAULT_CHAT_FRAME:AddMessage("ECB - RightButton"); end end function Carnival_EnemyCastBar_LockPos() Carnival_EnemyCastBar.bLocked = not Carnival_EnemyCastBar.bLocked; if (Carnival_EnemyCastBar.bLocked) then for i=1, 20 do local frame = getglobal("Carni_ECB_"..i); frame:StopMovingOrSizing(); frame:EnableMouse(0); end --DEFAULT_CHAT_FRAME:AddMessage("Carnival_EnemyCastBar - Bars Locked"); else for i=1, 20 do local frame = getglobal("Carni_ECB_"..i); frame:EnableMouse(1); end -- DEFAULT_CHAT_FRAME:AddMessage("Carnival_EnemyCastBar - Bars Unlocked"); end end function Carnival_EnemyCastBar_ResetPos() local frame = getglobal("Carni_ECB_1"); frame:Hide(); frame:ClearAllPoints(); frame:SetPoint("BOTTOMLEFT", "UIParent", "CENTER", 0, 0); for i=2, 20 do o = i - 1; local frame = getglobal("Carni_ECB_"..i); frame:Hide(); frame:ClearAllPoints(); frame:SetPoint("TOPLEFT", "Carni_ECB_"..o, "TOPLEFT", 0, 20); end end function Carnival_EnemyCastBar_Options(var) if (var) then return "on"; else return "off"; end end function ECB_Enable(arg) if( arg == 1 ) then Carnival_EnemyCastBar.bStatus = true; --DEFAULT_CHAT_FRAME:AddMessage("ECB Addon is now enabled") elseif( arg == 0) then Carnival_EnemyCastBar.bStatus = false; --DEFAULT_CHAT_FRAME:AddMessage("ECB Addon is now disabled") else DEFAULT_CHAT_FRAME:AddMessage("ECB_Enable(arg) returned invalid arg."); end end function ECB_Test() Carnival_EnemyCastBar_Show("Mob", "Spell Name", 10.0, "friendly"); end function ECB_Timer(arg) if( arg == 1 ) then Carnival_EnemyCastBar.bTimer = true; --DEFAULT_CHAT_FRAME:AddMessage("Cast Bars time display enabled") elseif( arg == 0) then Carnival_EnemyCastBar.bTimer = false; --DEFAULT_CHAT_FRAME:AddMessage("Cast Bar time display disabled") else DEFAULT_CHAT_FRAME:AddMessage("ECB_Timer(arg) returned invalid arg."); end end function ECB_PVE(arg) if( arg == 1 ) then Carnival_EnemyCastBar.bPvE = true; --DEFAULT_CHAT_FRAME:AddMessage("Cast Bars for PvE spells are now enabled") elseif( arg == 0) then Carnival_EnemyCastBar.bPvE = false; --DEFAULT_CHAT_FRAME:AddMessage("Cast Bars for PvE spells are now disabled") else DEFAULT_CHAT_FRAME:AddMessage("ECB_PVE(arg) returned invalid arg."); end end function ECB_PVP(arg) if( arg == 1 ) then Carnival_EnemyCastBar.bPvP = true; --DEFAULT_CHAT_FRAME:AddMessage("Cast Bars for PvP spells are now enabled") elseif( arg == 0) then Carnival_EnemyCastBar.bPvP = false; --DEFAULT_CHAT_FRAME:AddMessage("Cast Bars for PvP spells are now disabled") else DEFAULT_CHAT_FRAME:AddMessage("ECB_PVP(arg) returned invalid arg."); end end function Carnival_EnemyCastBar_Handler(msg) if (msg == "") then DEFAULT_CHAT_FRAME:AddMessage(" PvE/PvP Enemy Cast Bar") DEFAULT_CHAT_FRAME:AddMessage("/cenemycast enable/disable ("..Carnival_EnemyCastBar_Options(Carnival_EnemyCastBar.bStatus)..") - Enables or Disables the Addon") DEFAULT_CHAT_FRAME:AddMessage("/cenemycast show - Shows the bar, this will allow you to move it around") DEFAULT_CHAT_FRAME:AddMessage("/cenemycast reset - Resets the bars to their original position") DEFAULT_CHAT_FRAME:AddMessage("/cenemycast lock - Toggle - Will lock and unlock the bars into position") DEFAULT_CHAT_FRAME:AddMessage("/cenemycast pvp ("..Carnival_EnemyCastBar_Options(Carnival_EnemyCastBar.bPvP)..") - Toggles the cast bar for PvP spells on and off") DEFAULT_CHAT_FRAME:AddMessage("/cenemycast pve ("..Carnival_EnemyCastBar_Options(Carnival_EnemyCastBar.bPvE)..") - Toggles the cast bar for PvE spells on and off") DEFAULT_CHAT_FRAME:AddMessage("/cenemycast timer ("..Carnival_EnemyCastBar_Options(Carnival_EnemyCastBar.bTimer)..") - Toggles the cast bar timer text on and off") elseif (msg == "enable") then Carnival_EnemyCastBar.bStatus = true; DEFAULT_CHAT_FRAME:AddMessage("Addon is now enabled") elseif (msg == "disable") then Carnival_EnemyCastBar.bStatus = false; DEFAULT_CHAT_FRAME:AddMessage("Addon is now disabled") elseif (msg == "lock") then Carnival_EnemyCastBar_LockPos() elseif (msg == "reset") then Carnival_EnemyCastBar_ResetPos() DEFAULT_CHAT_FRAME:AddMessage("Bars are now reset") elseif (msg == "show") then Carnival_EnemyCastBar_Show("Mob", "Spell Name", 10.0, "friendly"); elseif (msg == "timer") then if (Carnival_EnemyCastBar.bTimer) then Carnival_EnemyCastBar.bTimer = false; DEFAULT_CHAT_FRAME:AddMessage("Cast Bar time display disabled") else Carnival_EnemyCastBar.bTimer = true; DEFAULT_CHAT_FRAME:AddMessage("Cast Bars time display enabled") end elseif (msg == "pvp") then if (Carnival_EnemyCastBar.bPvP) then Carnival_EnemyCastBar.bPvP = false; DEFAULT_CHAT_FRAME:AddMessage("Cast Bars for PvP spells are now disabled") else Carnival_EnemyCastBar.bPvP = true; DEFAULT_CHAT_FRAME:AddMessage("Cast Bars for PvP spells are now enabled") end elseif (msg == "pve") then if (Carnival_EnemyCastBar.bPvE) then Carnival_EnemyCastBar.bPvE = false; DEFAULT_CHAT_FRAME:AddMessage("Cast Bars for PvE spells are now disabled") else Carnival_EnemyCastBar.bPvE = true; DEFAULT_CHAT_FRAME:AddMessage("Cast Bars for PvE spells are now enabled") end end end function Carnival_EnemyCastBar_Show(mob, spell, castime, ctype) local showing = false; local i = 1; local o = 20; while (i < o) do local button = getglobal("Carni_ECB_"..i); if (not button:IsVisible()) then if (showing == false) then if (ctype == "hostile") then red = 1.0; green = 0.0; blue = 0.0; elseif (ctype == "friendly") then red = 0.0; green = 1.0; blue = 0.0; elseif (ctype == "cooldown") then red = 0.0; green = 0.0; blue = 1.0; elseif (ctype == "gains") then red = 1.0; green = 0.0; blue = 1.0; end getglobal("Carni_ECB_"..i).startTime = GetTime(); getglobal("Carni_ECB_"..i).active = true; getglobal("Carni_ECB_"..i).label = mob .." - ".. spell; getglobal("Carni_ECB_"..i).spell = spell; getglobal("Carni_ECB_"..i).endTime = getglobal("Carni_ECB_"..i).startTime + castime; getglobal("Carni_ECB_"..i.."_StatusBar"):SetMinMaxValues(button.startTime,button.endTime); getglobal("Carni_ECB_"..i.."_StatusBar"):SetValue(button.startTime); getglobal("Carni_ECB_"..i.."_StatusBar"):SetStatusBarColor(red, green, blue); button:Show(); showing = true; end end i = i + 1; end showing = false; end function Carnival_EnemyCastBar_OnEvent(event) if (event == "VARIABLES_LOADED") then if (UltimateUI_RegisterConfiguration) then ECB_RegisterUltimateUI(); end end if (event == "CHAT_MSG_MONSTER_YELL") then if (Carnival_EnemyCastBar.bDebug) then DEFAULT_CHAT_FRAME:AddMessage("EVENT: "..event) end Carnival_EnemyCastBar_Yells(arg1, arg2); elseif (event == "CHAT_MSG_MONSTER_EMOTE") then Carnival_EnemyCastBar_Emotes(arg1, arg2); else Carnival_EnemyCastBar_Gfind(arg1); end end function Carnival_EnemyCastBar_Gfind(arg1) if (Carnival_EnemyCastBar.bStatus) then if (arg1 ~= nil) then for mob, spell in string.gfind(arg1, Carnival_EnemyCastBar_SPELL_CAST) do Carnival_EnemyCastBar_Control(mob, spell, "casts"); return; end for mob, spell in string.gfind(arg1, Carnival_EnemyCastBar_SPELL_PERFORM) do Carnival_EnemyCastBar_Control(mob, spell, "performs"); return; end for mob, spell in string.gfind(arg1, Carnival_EnemyCastBar_SPELL_GAINS) do Carnival_EnemyCastBar_Control(mob, spell, "gains"); return; end for mob in string.gfind(arg1, Carnival_EnemyCastBar_MOB_DIES) do Carnival_EnemyCastBar_Control(mob, mob, "cooldown"); return; end for mob, crap, spell in string.gfind(arg1, Carnival_EnemyCastBar_SPELL_AFFLICTED) do Carnival_EnemyCastBar_Control(mob, spell, "afflicted"); return; end for mob, damage, from, spell in string.gfind(arg1, Carnival_EnemyCastBar_SPELL_DAMAGE) do if (mob == "Hakkar") then Carnival_EnemyCastBar_Control(mob, spell, "yells"); return; end end end end end function Carnival_EnemyCastBar_UniqueCheck(spellname) alreadyshowing = 0; for i=1, 20 do local spell = getglobal("Carni_ECB_"..i).spell; if (spell == spellname) then alreadyshowing = 1; end end return alreadyshowing; end function Carnival_EnemyCastBar_Control(mob, spell, special) --DEFAULT_CHAT_FRAME:AddMessage("ECB Control - "..mob.." ("..spell..")"); if (Carnival_EnemyCastBar_Raids[spell] ~= nil) then if (Carnival_EnemyCastBar.bPvE) then castime = Carnival_EnemyCastBar_Raids[spell].t; ctype = Carnival_EnemyCastBar_Raids[spell].c; -- Spell might have the same name but a different cast time on another mob, ie. Onyxia/Nefarian on Bellowing Roar if (Carnival_EnemyCastBar_Raids[spell].r) then if (mob == Carnival_EnemyCastBar_Raids[spell].r) then castime = Carnival_EnemyCastBar_Raids[spell].a; end end if (Carnival_EnemyCastBar_Raids[spell].m) then mob = Carnival_EnemyCastBar_Raids[spell].m end alreadyshowing = 0; if (Carnival_EnemyCastBar_Raids[spell].u) then unique = Carnival_EnemyCastBar_Raids[spell].u if (unique == "true") then alreadyshowing = Carnival_EnemyCastBar_UniqueCheck(spell) end end if (alreadyshowing == 0) then Carnival_EnemyCastBar_Show(mob, spell, castime, ctype); end if (Carnival_EnemyCastBar_Raids[spell].i ~= nil) then if (alreadyshowing == 0) then --DEFAULT_CHAT_FRAME:AddMessage("ECB Control - Running i"); castime = Carnival_EnemyCastBar_Raids[spell].i; Carnival_EnemyCastBar_Show(mob, spell, castime, "hostile"); end end end else if (Carnival_EnemyCastBar.bPvP) then if (UnitName("target") == mob) then if (Carnival_EnemyCastBar_Spells[spell] ~= nil) then if (UnitIsEnemy("player", "target")) then ctype = "hostile"; else ctype = "friendly"; end if (Carnival_EnemyCastBar_Spells[spell].i ~= nil) then castime = Carnival_EnemyCastBar_Spells[spell].i; Carnival_EnemyCastBar_Show(mob, spell, castime, ctype); end castime = Carnival_EnemyCastBar_Spells[spell].t; if (special == "gains") then if (Carnival_EnemyCastBar_Spells[spell].g) then castime = Carnival_EnemyCastBar_Spells[spell].g; end end -- Spell might have the same name but a different cast time on another mob, ie. Death Talon Hatchers/Players on Bellowing Roar if (Carnival_EnemyCastBar_Spells[spell].r) then if (mob == Carnival_EnemyCastBar_Spells[spell].r) then castime = Carnival_EnemyCastBar_Spells[spell].a; end end if (Carnival_EnemyCastBar_Spells[spell].c ~= nil) then ctype = Carnival_EnemyCastBar_Spells[spell].c; end Carnival_EnemyCastBar_Show(mob, spell, castime, ctype); end end end end end function Carnival_EnemyCastBar_Yells(arg1, arg2) if (Carnival_EnemyCastBar.bStatus) then if (Carnival_EnemyCastBar.bDebug) then DEFAULT_CHAT_FRAME:AddMessage("YELL: "..arg2) end if (arg2 == "Nefarian") then if (Carnival_EnemyCastBar.bDebug) then DEFAULT_CHAT_FRAME:AddMessage("NEFARIAN YELL: "..arg1) end if ( string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_SHAMAN_CALL) or string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_DRUID_CALL) or string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_WARLOCK_CALL) or string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_PRIEST_CALL) or string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_HUNTER_CALL) or string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_WARRIOR_CALL) or string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_ROGUE_CALL) or string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_PALADIN_CALL) or string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_MAGE_CALL) ) then Carnival_EnemyCastBar_Control("Nefarian", "Class Call", "pve"); return; end elseif (arg2 == "Lord Victor Nefarius") then if (Carnival_EnemyCastBar.bDebug) then DEFAULT_CHAT_FRAME:AddMessage("LORD VICTOR YELL: "..arg1) end if (string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_STARTING)) then Carnival_EnemyCastBar_Control("Nefarian", "Mob Spawn", "pve"); return; elseif (string.find(arg1, Carnival_EnemyCastBar_NEFARIAN_LAND)) then Carnival_EnemyCastBar_Control("Nefarian", "Landing", "pve"); return; end elseif (arg2 == "Ragnaros") then if (string.find(arg1, Carnival_EnemyCastBar_RAGNAROS_STARTING)) then Carnival_EnemyCastBar_Control("Ragnaros", "Submerge", "pve"); return; elseif (string.find(arg1, Carnival_EnemyCastBar_RAGNAROS_KICKER)) then Carnival_EnemyCastBar_Control("Ragnaros", "Knockback", "pve"); return; elseif (string.find(arg1, Carnival_EnemyCastBar_RAGNAROS_SONS)) then Carnival_EnemyCastBar_Control("Ragnaros", "Sons of Flame", "pve"); return; end end end end function Carnival_EnemyCastBar_Emotes(arg1, arg2) if (Carnival_EnemyCastBar.bStatus) then if (arg2 == "Flamegor") then if (string.find(arg1, Carnival_EnemyCastBar_FLAMEGOR_FRENZY)) then Carnival_EnemyCastBar_Control("Flamegor", "Frenzy", "pve"); return; end elseif (arg2 == "Chromaggus") then if (string.find(arg1, Carnival_EnemyCastBar_CHROMAGGUS_FRENZY)) then Carnival_EnemyCastBar_Control("Chromaggus", "Killing Frenzy", "pve"); return; end end end end --[[function Carnival_EnemyCastBar_PartyChecker(spellcaster, target) if (target) then local unit, player; local max = 0; local groupstr = ""; if (UnitInRaid("player")) then max = 40; groupstr = "raid"; else max = 4; groupstr = "party"; end ChatFrame5:AddMessage(spellcaster.." is casting a spell, are they targetting "..target.."?"); for i=0, max do unit = groupstr..i; player = UnitName(unit); if (player) then ChatFrame5:AddMessage("Checking "..unit.." ("..player..")"); if (player == spellcaster) then mob = UnitName(unit.."target"); if (mob) then ChatFrame5:AddMessage(""..unit.." ("..player..") target is "..mob); end if (mob == target) then ChatFrame5:AddMessage(spellcaster.." IS TARGETTING "..target.." - SHOW THE BAR!!!"); return true; end end end end end end--]] function Carnival_EnemyCastBar_Target() TargetByName(mobname); end function Carnival_EnemyCastBar_OnUpdate() if (not carniactive) then -- Fade the bar out local alpha = this:GetAlpha() - 0.05; if (alpha > 0) then this:SetAlpha(alpha); else -- Hide up, reset alpha this:Hide(); this:SetAlpha(1.0); end this.active = false; mobname = ""; else if (this.endTime ~= nil) then local label = mobname; local now = GetTime(); -- Update the spark, status bar and label local remains = this.endTime - now; --label = label .. Carnival_EnemyCastBar_NiceTime(remains); local sparkPos = ((now - this.startTime) / (this.endTime - this.startTime)) * 195; getglobal(this:GetName() .. "_StatusBar"):SetValue(now); getglobal(this:GetName() .. "_Text"):SetText( this.label ); getglobal(this:GetName() .. "_StatusBar_Spark"):SetPoint("CENTER", getglobal(this:GetName() .. "_StatusBar"), "LEFT", sparkPos, 0); if (Carnival_EnemyCastBar.bTimer) then getglobal(this:GetName() .. "_CastTimeText"):SetText( format("%.1f", remains) ); end if (0 > remains) then getglobal(this:GetName()):Hide(); getglobal(this:GetName()).spell = nil; this.active = false; mobname = ""; end end end end -- Movable window function Carnival_EnemyCastBar_OnDragStart() CarniEnemyCastBarFrame:StartMoving(); end function Carnival_EnemyCastBar_OnDragStop() CarniEnemyCastBarFrame:StopMovingOrSizing(); end -- Format seconds into m:ss function Carnival_EnemyCastBar_NiceTime(secs) return string.format("%d:%02d", secs / 60, math.mod(secs, 60)); end