vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[ 

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("<Carnival> 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