vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

local aquaformid, travelformid;

function DruidBar_OnLoad()
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("PLAYER_LEAVING_WORLD");
        this:RegisterEvent("UNIT_MANA");
        this:RegisterEvent("UNIT_MAXMANA");
        this:RegisterEvent("SPELLCAST_STOP");
        this:RegisterEvent("VARIABLES_LOADED");
        this:RegisterEvent("UNIT_INVENTORY_CHANGED");
        this:RegisterEvent("PLAYER_AURAS_CHANGED");
        this:RegisterEvent("UPDATE_SHAPESHIFT_FORMS");
        this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE");
        this:RegisterEvent("INSTANCE_BOOT_START");
        this:RegisterEvent("INSTANCE_BOOT_STOP");
        SlashCmdList["DRUIDBARSLASH"] = DruidBar_Enable_ChatCommandHandler;
        SLASH_DRUIDBARSLASH1 = "/dbar";
        SLASH_DRUIDBARSLASH2 = "/druidbar";
        DBarSpellCatch:SetOwner(DruidBarUpdateFrame, "ANCHOR_NONE");
end

local inform, lowregentimer, fullmanatimer, lastshift, inCombat, firstEZ, pre_UseAction, shiftload, isMoving, waitonce, firstshift;
lowregentimer = 0;
fullmanatimer = 0;
function DruidBar_OnEvent(event, arg1, arg2, arg3)
        if event == "PLAYER_ENTERING_WORLD" then
                --Thanks to Tigerheart from Argent Dawn for this little piece of work, as well as fireball and prudence for bringing it up!
                this:RegisterEvent("UNIT_MANA");
                this:RegisterEvent("UNIT_MAXMANA");
                this:RegisterEvent("PLAYER_REGEN_ENABLED");
                this:RegisterEvent("PLAYER_REGEN_DISABLED");
                this:RegisterEvent("UNIT_INVENTORY_CHANGED");
                this:RegisterEvent("PLAYER_AURAS_CHANGED");
                this:RegisterEvent("UPDATE_SHAPESHIFT_FORMS");
                return;
        elseif event == "PLAYER_LEAVING_WORLD" then
                this:UnregisterEvent("UNIT_MANA");
                this:UnregisterEvent("UNIT_MAXMANA");
                this:UnregisterEvent("PLAYER_REGEN_ENABLED");
                this:UnregisterEvent("PLAYER_REGEN_DISABLED");
                this:UnregisterEvent("UNIT_INVENTORY_CHANGED");
                this:UnregisterEvent("PLAYER_AURAS_CHANGED");
                this:RegisterEvent("UPDATE_SHAPESHIFT_FORMS");          
                return;
        end
        if event == "VARIABLES_LOADED" then
                if not DruidBarKey then DruidBarKey = {};
                        DruidBarKey.keepthemana = 0;
                        DruidBarKey.maxmana = 10;
                        DruidBarKey.int = 0;
                        DruidBarKey.subtractmana = 0;
                        DruidBarKey.extra = 0;
                        DruidBarKey.Enabled = true;
                        DruidBarKey.EZShift = true;
                        DruidBarKey.Graphics = true;
                end
                _, init = UnitClass("player");
                if UnitPowerType("player") ~= 0 then firstshift = true; end
                if not shiftload and init == "DRUID" then
                        pre_ShapeshiftBar_ChangeForm = ShapeshiftBar_ChangeForm;
                        ShapeshiftBar_ChangeForm = DruidBar_ChangeForm;
                        shiftload = true;
                end
                DBarSpellCatch:SetOwner(DruidBarUpdateFrame, "ANCHOR_NONE");
        elseif init and init == "DRUID" and DruidBarKey.Enabled then
                if event == "UNIT_MAXMANA" and arg1 == "player" then
                        DruidBar_MaxManaScript();
                elseif event == "UNIT_INVENTORY_CHANGED" and arg1 == "player" then
                        DruidBar_MaxManaScript();
                elseif event == "UNIT_MANA" and arg1 == "player" then
                        if UnitPowerType(arg1) == 0 then
                                DruidBarKey.keepthemana = UnitMana(arg1);
                        elseif DruidBarKey.keepthemana < DruidBarKey.maxmana then
                                local add = DruidBar_ReflectionCheck();
                                DruidBarKey.keepthemana = DruidBarKey.keepthemana + add + DruidBarKey.extra;
                                if DruidBarKey.keepthemana > DruidBarKey.maxmana then DruidBarKey.keepthemana = DruidBarKey.maxmana; end
                        end
                        fullmanatimer = 0;
                elseif event == "PLAYER_AURAS_CHANGED" or event == "UPDATE_SHAPESHIFT_FORMS" then
                        if UnitPowerType("player") == 1 and not inform then
                                inform = true;
                                --Bear
                                DruidBar_Subtract();
                        elseif UnitPowerType("player") == 3 and not inform then
                                inform = true;
                                --Cat
                                DruidBar_Subtract();
                        elseif UnitPowerType("player") == 0 and inform then
                                inform = nil;
                                DruidBarKey.keepthemana = UnitMana("player");
                                if DruidBarKey.maxmana ~= UnitManaMax("player") then
                                        DruidBarKey.maxmana = UnitManaMax("player");
                                end
                                --player/aqua/travel
                        end
                elseif (event == "SPELLCAST_STOP") then
                        if (not firstEZ) then
                                if (DruidBarKey.EZShift) then
                                        pre_UseAction = UseAction;
                                        UseAction = DruidBar_UseAction;
                                end
                                firstEZ = true;
                        end
                        if UnitPowerType("player") == 0 then lowregentimer = 5;
                        waitonce = nil; end
                end
        elseif init and init == "DRUID" and not DruidBarKey.Enabled then
                if event == "UNIT_MAXMANA" and arg1 == "player" then
                        DruidBar_MaxManaScript();
                end
        end
end

local notyet;
function DruidBar_OnUpdate(elapsed)
        if init and init == "DRUID" and DruidBarKey.Enabled then
                if not notyet then 
                        DruidBar_MaxManaScript(); 
                        for i = 1, GetNumShapeshiftForms() do
                                local icon = GetShapeshiftFormInfo(i);
                                if icon == "Interface\\Icons\\Ability_Druid_AquaticForm" then aquaformid = i; end
                                if icon == "Interface\\Icons\\Ability_Druid_TravelForm" then travelformid = i; end
                        end
                        notyet = true; 
                end
                DruidBarMana:SetMinMaxValues(0, DruidBarKey.maxmana);
                DruidBarMana:SetValue(DruidBarKey.keepthemana);
                if lowregentimer > 0 then
                        lowregentimer = lowregentimer - elapsed;
                        if lowregentimer <= 0 then lowregentimer = 0; end
                end
                if UnitPowerType("player") ~= 0 then
                        fullmanatimer = fullmanatimer + elapsed;
                        if fullmanatimer > 6 and floor((DruidBarKey.keepthemana*100) / DruidBarKey.maxmana) > 90 then
                                DruidBarKey.keepthemana = DruidBarKey.maxmana;
                        end
                end
                if DruidBarKey.Graphics then
                        if DruidBarKey.kmg then
                                dbarhide(DruidBarFrame);
                                dbarhide(DruidBarReplaceText);
                                DruidBar_KMGraphics(); 
                        else
                                dbarhide(DruidBarKMG);
                                if DruidBarKey.Replace then DruidBar_ReplaceGraphics(); else DruidBar_MainGraphics(); end
                        end
                else
                        dbarhide(DruidBarFrame);
                        dbarhide(DruidBarReplaceText);
                        dbarhide(DruidBarKMG);
                        if PlayerFrameManaBar:GetWidth() < 100 then PlayerFrameManaBar:SetWidth(120); end
                end
        else
                dbarhide(DruidBarFrame);
                dbarhide(DruidBarKMG);
        end
end

function DruidBar_ReflectionCheck()
        local managain = 0;
        local j = 1;
        while (UnitBuff("player",j)) do
                DBarSpellCatch:SetUnitBuff("player", j);
                local msg = DBarSpellCatchTextLeft1:GetText();
                if msg and (strfind(msg,DRUIDBAR_INNERVATE)) then
                        return ((ceil(UnitStat(arg1,5) / 5)+15) * 5);
                end
                j = j + 1;
        end
        if lowregentimer > 0 then 
                if waitonce then
                        local name, iconTexture, tier, column, rank, maxRank, isExceptional, meetsPrereq = GetTalentInfo(3, 6);
                        if rank == 0 then return 0; else
                                managain = ((ceil(UnitStat("player",5) / 5)+15) * (0.05 * rank));
                        end
                else
                        waitonce = true;
                end
        elseif lowregentimer <= 0 then
                managain = (ceil(UnitStat("player",5) / 5)+15);
        end
        return managain;
end

--Gets the mana cost of your shapeshifting spells.
function DruidBar_GetShapeshiftCost()
        if not DBarSpellCatch:IsOwned(DruidBarUpdateFrame) then DBarSpellCatch:SetOwner(DruidBarUpdateFrame, "ANCHOR_NONE"); end
        DruidBarKey.subtractmana = 0;
        local a, b, c, d = GetSpellTabInfo(4);
        for i = 1, c+d, 1 do
                local spellname = GetSpellName(i, BOOKTYPE_SPELL);
                spellname = strlower(spellname);
                if spellname and (strfind(spellname, DRUIDBAR_CAT_FORM) or strfind(spellname, DRUIDBAR_BEAR_FORM)) then
                        DBarSpellCatch:SetSpell(i, 1);
                        local msg = DBarSpellCatchTextLeft2:GetText();
                        if DruidBarKey.Debug then DEFAULT_CHAT_FRAME:AddMessage(msg); end
                        local params;
                        if msg then
                                local index = strfind(msg, DRUIDBAR_MANA_DELIM);
                                if index then
                                        if GetLocale() == "frFR" then params = strsub(msg, index+1); else params = strsub(msg, 1, index-1); end
                                        if DruidBarKey.Debug then DEFAULT_CHAT_FRAME:AddMessage(params); end
                                        DruidBarKey.subtractmana = tonumber(params);
                                        if DruidBarKey.subtractmana and DruidBarKey.subtractmana > 0 then return; end
                                end
                        end
                end
        end
end

function DruidBar_Subtract()
        if not firstshift then
                local j = 1;
                while (UnitBuff("player",j)) do
                        DBarSpellCatch:SetUnitBuff("player", j);
                        local msg = DBarSpellCatchTextLeft1:GetText();
                        if msg and (strfind(msg,DRUIDBAR_META)) then
                                if DruidBarKey.Debug then DEFAULT_CHAT_FRAME:AddMessage("Rune detected, no mana cost!"); end
                                return;
                        end
                        j = j + 1;
                end
                DruidBarKey.keepthemana = DruidBarKey.keepthemana - DruidBarKey.subtractmana;
                if DruidBarKey.Debug then DEFAULT_CHAT_FRAME:AddMessage("Mana Deduction: "..DruidBarKey.subtractmana); end
        else
                firstshift = nil;
        end
end

--Change form! whatever you cast, if you're shifted, you'll shift back to caster.
function DruidBar_ChangeForm(id)
        local a, b, c, d;
        a = "Interface\\Icons\\Ability_Druid_AquaticForm";
        b = "Interface\\Icons\\Ability_Racial_BearForm";
        c = "Interface\\Icons\\Ability_Druid_CatForm";
        d = "Interface\\Icons\\Ability_Druid_TravelForm";
        local changingback = nil;
        for i = 1, GetNumShapeshiftForms() do
                local icon, name, active = GetShapeshiftFormInfo(i);
                if active then id = i; changingback = true; end
        end
        if (id) then
                local tex = GetShapeshiftFormInfo(id);
                if DruidBarKey.message and not changingback then
                        if not DruidBarKey.BearMessage or not strfind(tostring(DruidBarKey.BearMessage), "table:") then
                                DruidBarKey.BearMessage = {};
                                DruidBarKey.BearMessage[1] = "ROAR! ROAR I SAY! I guess there's no denyin'...";
                                DruidBarKey.BearMessage[2] = "SAY";
                        end
                        if not DruidBarKey.CatMessage or not strfind(tostring(DruidBarKey.CatMessage), "table:") then
                                DruidBarKey.CatMessage = {};
                                DruidBarKey.CatMessage[1] = "Nyao.";
                                DruidBarKey.CatMessage[2] = "SAY";
                        end
                        if not DruidBarKey.AquaMessage or not strfind(tostring(DruidBarKey.AquaMessage), "table:") then
                                DruidBarKey.AquaMessage = {};
                                DruidBarKey.AquaMessage[1] = "Thrust vectoring owns the seas!";
                                DruidBarKey.AquaMessage[2] = "SAY";
                        end
                        if not DruidBarKey.TravMessage or not strfind(tostring(DruidBarKey.TravMessage), "table:") then
                                DruidBarKey.TravMessage = {};
                                DruidBarKey.TravMessage[1] = "Multi-cat drifting!";
                                DruidBarKey.TravMessage[2] = "SAY";
                        end
                        if tex == b and DruidBarKey.BearMessage then
                                SendChatMessage(DruidBarKey.BearMessage[1], DruidBarKey.BearMessage[2]);
                        elseif tex == a and DruidBarKey.AquaMessage then
                                SendChatMessage(DruidBarKey.AquaMessage[1], DruidBarKey.AquaMessage[2]);
                        elseif tex == c and DruidBarKey.CatMessage then
                                SendChatMessage(DruidBarKey.CatMessage[1], DruidBarKey.CatMessage[2]);
                        elseif tex == d and DruidBarKey.TravMessage then
                                SendChatMessage(DruidBarKey.TravMessage[1], DruidBarKey.TravMessage[2]);
                        end
                end
                pre_ShapeshiftBar_ChangeForm(id);
                return nil;
        else
                return true;
        end
end

--Hooks into the original UseAction. Passes ChangeForm to shift out of caster.
function DruidBar_UseAction(id, ex, theSelf)
        local texture = GetActionTexture(id);
        local a, b, c, d;
        a = "Interface\\Icons\\Ability_Druid_AquaticForm";
        b = "Interface\\Icons\\Ability_Racial_BearForm";
        c = "Interface\\Icons\\Ability_Druid_CatForm";
        d = "Interface\\Icons\\Ability_Druid_TravelForm";
        e = ".blp";
        if (texture == a or texture == b or texture == c or texture == d or texture == a..e or texture == b..e or texture == c..e or texture == d..e) then
                local fix = DruidBar_ChangeForm(nil);
                if (GetActionText(id) or fix) then
                        pre_UseAction(id, ex, theSelf);
                end
        else
                pre_UseAction(id, ex, theSelf);
        end
end

function dbarhide(frame)
        if frame:IsVisible() then
                frame:Hide();
        end
end
function dbarshow(frame)
        if not frame:IsVisible() then
                frame:Show();
        end
end

function dbarlen()
        if not DruidBarKey.xvar then DruidBarKey.xvar = 160; end
        if DruidBarFrame:GetWidth() ~= DruidBarKey.xvar then
                DruidBarFrame:SetWidth(DruidBarKey.xvar);
                DruidBarKey.xvar = DruidBarFrame:GetWidth();
        end
        DruidBarMana:SetWidth(DruidBarKey.xvar*0.9375);
end

function dbarhei()
        if not DruidBarKey.yvar then DruidBarKey.yvar = 18; end
        if DruidBarFrame:GetHeight() ~= DruidBarKey.yvar then
                DruidBarFrame:SetHeight(DruidBarKey.yvar);
                DruidBarKey.yvar = DruidBarFrame:GetHeight();
        end
        DruidBarMana:SetHeight(DruidBarKey.yvar*(2/3));
end
local DruidBar_Anchored = nil

function DruidBar_MainGraphics()
        local str;
        if DruidBarKey.Percent and DruidBarKey.Percent == 1 then
                str = "|CFFFFFFFF"..floor(DruidBarKey.keepthemana / DruidBarKey.maxmana * 100).."%|r";
        elseif DruidBarKey.Percent then
                str = "|CFFFFFFFF"..floor(DruidBarKey.keepthemana).."/"..floor(DruidBarKey.maxmana).."|r";
        else
                str = "|CFFFFFFFF"..floor(DruidBarKey.keepthemana).."/"..floor(DruidBarKey.maxmana).." "..floor(DruidBarKey.keepthemana / DruidBarKey.maxmana * 100).."%|r";
        end
        dbarhide(DruidBarReplaceText);
        if PlayerFrameManaBar:GetWidth() < 100 then PlayerFrameManaBar:SetWidth(120); end
        
        if (DruidBarKey.Hide and UnitPowerType("player") ~= 0 and DruidBar_Full()) or not DruidBarKey.Hide then
                dbarshow(DruidBarFrame);
                dbarshow(DruidBarBorder);
                if (DruidBarKey.Text and DruidBarKey.Text == 1) or (not DruidBarKey.Text and MouseIsOver(DruidBarFrame)) then
                        dbarshow(DruidBarText1);
                        dbarhide(DruidBarText);
                        DruidBarText1:SetText(str);
                elseif DruidBarKey.Text then
                        dbarshow(DruidBarText);
                        dbarhide(DruidBarText1);
                        DruidBarText:SetText(str);
                else
                        dbarhide(DruidBarText);
                        dbarhide(DruidBarText1);
                end
                dbarlen(); 
                dbarhei();
                if DruidBarKey.XPBar then
                        DruidBarFrame:ClearAllPoints();
                        DruidBarFrame:SetPoint("TOPLEFT","PlayerFrame","TOPLEFT", 80, -63);
                        PlayerFrame:SetFrameLevel("1");
                        DruidBarFrame:SetFrameLevel("1");
                        DruidBarMana:SetFrameLevel("1");
                        DruidBar_Anchored = true;
                elseif DruidBar_Anchored then
                        DruidBarFrame:ClearAllPoints();
                        DruidBarFrame:SetPoint("CENTER","UIParent","CENTER", 0, 0);
                        PlayerFrame:SetFrameLevel("1")
                        DruidBarFrame:SetFrameLevel("1");
                        DruidBarFrame:SetFrameLevel("1");
                        DruidBar_Anchored = nil;
                end
                if DruidBarKey.Lock then
                        dbarshow(DruidBarDontMove);
                else
                        dbarhide(DruidBarDontMove);
                end
        else
                dbarhide(DruidBarFrame);
                dbarhide(DruidBarDontMove);
        end
end

function DruidBar_ReplaceGraphics()
        if UnitPowerType("player") ~= 0 then
                dbarshow(DruidBarFrame);
                dbarhide(DruidBarDontMove);
                dbarhide(DruidBarBorder);
                dbarhide(DruidBarText);
                dbarhide(DruidBarText1);
                dbarhide(PlayerFrameManaBarText);
                dbarshow(DruidBarReplaceText);
                PlayerFrameManaBar:SetWidth(60);
                DruidBarFrame:ClearAllPoints();
                DruidBarFrame:SetPoint("TOPLEFT","PlayerFrame","TOPLEFT", 116, -50);
                DruidBarMana:SetWidth(60);
                DruidBarMana:SetHeight(10);
                DruidBarMana:SetFrameLevel("1");
                local str, str1;
                str = "|CFFFFFFFF"..UnitMana("player").."|r";
                if DruidBarKey.Percent and DruidBarKey.Percent == 1 then
                        str1 = "|CFFFFFFFF"..floor(DruidBarKey.keepthemana / DruidBarKey.maxmana * 100).."%|r";
                elseif DruidBarKey.Percent then
                        str1 = "|CFFFFFFFF"..floor(DruidBarKey.keepthemana).."|r";
                else
                        str1 = "|CFFFFFFFF"..(floor(DruidBarKey.keepthemana / 100)/10).."k,"..floor(DruidBarKey.keepthemana / DruidBarKey.maxmana * 100).."%|r";
                end
                DruidBarReplaceText:SetFrameLevel("2");
                if (DruidBarKey.Text and DruidBarKey.Text == 1) or (not DruidBarKey.Text and (MouseIsOver(DruidBarFrame) or MouseIsOver(PlayerFrameManaBar)))then
                        dbarshow(DEnergyText1);
                        dbarshow(DManaText1);
                        dbarhide(DManaText);
                        dbarhide(DEnergyText);
                        DEnergyText1:SetText(str);
                        DManaText1:SetText(str1);
                elseif DruidBarKey.Text then
                        dbarshow(DEnergyText);
                        dbarhide(DEnergyText1);
                        dbarshow(DManaText);
                        dbarhide(DManaText1);
                        DEnergyText:SetText(str);
                        DManaText:SetText(str1);
                else
                        dbarhide(DEnergyText);
                        dbarhide(DEnergyText1);
                        dbarhide(DManaText);
                        dbarhide(DManaText1);
                end
        else
                dbarhide(DruidBarFrame);
                dbarhide(DEnergyText);
                dbarhide(DEnergyText1);
                dbarhide(DManaText);
                dbarhide(DManaText1);
                dbarhide(DruidBarReplaceText);
                PlayerFrameManaBar:SetWidth(120);
        end
end

function DruidBar_KMGraphics()
        if (MGplayer_ManaBar) then
                if UnitPowerType("player") == 0 then
                        MGplayer_ManaBar:SetWidth(MGplayer_HealthBar:GetWidth());
                        MGplayer_ManaBar:ClearAllPoints();
                        MGplayer_ManaBar:SetPoint("TOP","MGplayer_HealthBar","BOTTOM",0,-2);
                        DruidBarKMG:Hide();
                else    
                        local sub = 0;
                        if MG_Get("ShowEndcaps") == 1 then sub = 1; else sub = -1; end
                        KMGDruidBar:SetWidth(MGplayer_HealthBar:GetWidth() / 2 - sub);
                        KMGDruidBar:SetHeight(MGplayer_ManaBar:GetHeight());
                        MGplayer_ManaBar:SetWidth(MGplayer_HealthBar:GetWidth() / 2);
                        DruidBarKMG:Show();
                        DruidBarKMG:ClearAllPoints();
                        MGplayer_ManaBar:ClearAllPoints();
                        MGplayer_ManaBar:SetPoint("TOPLEFT","MGplayer_HealthBar","BOTTOMLEFT",0,-2);
                        local points = MGplayer_HealthBar:GetWidth() / 4 * 3;
                        if MG_Get("ShowEndcaps") == 1 then
                                dbarshow(KMGDruidBar_ManaEndcapRight);
                        else
                                dbarhide(KMGDruidBar_ManaEndcapRight);
                                if MGplayer_ManaBar:GetWidth() <= 92 then points = points - 1; else points = points - 1; end
                        end
                        DruidBarKMG:SetScale(MGplayer_HealthBar:GetScale());
                        DruidBarKMG:SetPoint("LEFT","MGplayer_ManaBar","LEFT", points, 0);
                        DruidBarKMG:SetFrameLevel("1");
                        KMGDruidBar:SetFrameLevel(MGplayer_ManaBar:GetFrameLevel());
                        KMGDruidBar:SetMinMaxValues(0, DruidBarKey.maxmana);
                        KMGDruidBar:SetValue(DruidBarKey.keepthemana);
                        if (DruidBarKey.Percent and MGplayer_HealthBar:GetWidth() <= 92) then
                                local curstat = (UnitMana("player") / UnitManaMax("player") * 100);
                                local manstat = (floor(DruidBarKey.keepthemana / DruidBarKey.maxmana * 100)).."%";
                                MGplayer_ManaText:SetText(curstat.."/"..manstat);
                        elseif (MGplayer_HealthBar:GetWidth() <= 92) then
                                local curstat = UnitMana("player");
                                MGplayer_ManaText:SetText(curstat.."/"..floor(DruidBarKey.keepthemana));
                        end
                end
        else
                DruidBarKMG:Hide();
                DruidBarKey.kmg = nil;
        end
end

--Text Parsing. Yay!
function TextParse(InputString)
--[[ By FERNANDO!
        This function should take a string and return a table with each word from the string in
        each entry. IE, "Linoleum is teh awesome" returns {"Linoleum", "is", "teh", "awesome"}
        Some good should come of this, I've been avoiding writing a text parser for a while, and
        I need one I understand completely. ^_^

        If you want to gank this function and use it for whatever, feel free. Just give me props
        somewhere. This function, as far as I can tell, is fairly foolproof. It's hard to get it
        to screw up. It's also completely self-contained. Just cut and paste.]]
   local Text = InputString;
   local TextLength = 1;
   local OutputTable = {};
   local OTIndex = 1;
   local StartAt = 1;
   local StopAt = 1;
   local TextStart = 1;
   local TextStop = 1;
   local TextRemaining = 1;
   local NextSpace = 1;
   local Chunk = "";
   local Iterations = 1;
   local EarlyError = false;

   if ((Text ~= nil) and (Text ~= "")) then
   -- ... Yeah. I'm not even going to begin without checking to make sure Im not getting
   -- invalid data. The big ol crashes I got with my color functions taught me that. ^_^

      -- First, it's time to strip out any extra spaces, ie any more than ONE space at a time.
      while (string.find(Text, "  ") ~= nil) do
         Text = string.gsub(Text, "  ", " ");
      end

      -- Now, what if text consisted of only spaces, for some ungodly reason? Well...
      if (string.len(Text) <= 1) then
         EarlyError = true;
      end

      -- Now, if there is a leading or trailing space, we nix them.
      if EarlyError ~= true then
        TextStart = 1;
        TextStop = string.len(Text);

        if (string.sub(Text, TextStart, TextStart) == " ") then
           TextStart = TextStart+1;
        end

        if (string.sub(Text, TextStop, TextStop) == " ") then
           TextStop = TextStop-1;
        end

        Text = string.sub(Text, TextStart, TextStop);
      end

      -- Finally, on to breaking up the goddamn string.

      OTIndex = 1;
      TextRemaining = string.len(Text);

      while (StartAt <= TextRemaining) and (EarlyError ~= true) do

         -- NextSpace is the index of the next space in the string...
         NextSpace = string.find(Text, " ",StartAt);
         -- if there isn't another space, then StopAt is the length of the rest of the
         -- string, otherwise it's just before the next space...
         if (NextSpace ~= nil) then
            StopAt = (NextSpace - 1);
         else
            StopAt = string.len(Text);
            LetsEnd = true;
         end

         Chunk = string.sub(Text, StartAt, StopAt);
         OutputTable[OTIndex] = Chunk;
         OTIndex = OTIndex + 1;

         StartAt = StopAt + 2;

      end
   else
      OutputTable[1] = "Error: Bad value passed to TextParse!";
   end

   if (EarlyError ~= true) then
      return OutputTable;
   else
      return {"Error: Bad value passed to TextParse!"};
   end
end

--Normal print job.
function DruidBar_Print(msg,r,g,b,frame,id,unknown4th)
        if(unknown4th) then
                local temp = id;
                id = unknown4th;
                unknown4th = id;
        end
                                
        if (not r) then r = 1.0; end
        if (not g) then g = 1.0; end
        if (not b) then b = 1.0; end
        if ( frame ) then 
                frame:AddMessage(msg,r,g,b,id,unknown4th);
        else
                if ( DEFAULT_CHAT_FRAME ) then 
                        DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b,id,unknown4th);
                end
        end
end

function DruidBar_Toggle(tog, str) if tog then DruidBar_Print(str.." off"); return nil; else DruidBar_Print(str.." on"); return true; end end

function DruidBar_Enable_ChatCommandHandler(text)
        local msg = TextParse(text);
        msg[1] = strlower(msg[1]);
        if msg[1] == "on" then
                DruidBarKey.Enabled = true;
                DruidBar_Print("DruidBar is Enabled!",1,1,0);
        elseif msg[1] == "off" then
                DruidBarKey.Enabled = nil;
                DruidBar_Print("DruidBar is Disabled!",1,1,0);
        elseif msg[1] == "toggle" then
                DruidBarKey.Enabled = DruidBar_Toggle(DruidBarKey.Enabled, "DruidBar is");
        elseif msg[1] == "vis" then
                DruidBarKey.Graphics = DruidBar_Toggle(DruidBarKey.Graphics, "DruidBar's visual data is");
        elseif msg[1] == "message" then
                if msg[2] and msg[2] == "toggle" then
                        DruidBarKey.message = DruidBar_Toggle(DruidBarKey.message, "Shapeshifting messages are");
                elseif msg[2] then
                        msg[2] = strlower(msg[2]);
                        if msg[3] then msg[3] = strlower(msg[3]); end
                        if msg[3] and (msg[3] == "say" or msg[3] == "party" or msg[3] == "raid" or msg[3] == "emote") then
                                --ookay...
                        else
                                DruidBar_Print("Invalid chat type. message format is: /dbar message [toggle/bear/cat/aqua/travel] [say/party/raid/emote] [message]");
                                return;
                        end
                        if msg[2] == "bear" then
                                DruidBarKey.BearMessage = {};
                                local x = string.gsub(text, msg[1].." "..msg[2].." "..msg[3].." ", "");
                                DruidBarKey.BearMessage[1] = x;
                                DruidBarKey.BearMessage[2] = msg[3];
                                DruidBar_Print("Current Bear message is now:"..x);
                        elseif msg[2] == "cat" then
                                DruidBarKey.CatMessage = {};
                                local x = string.gsub(text, msg[1].." "..msg[2].." "..msg[3].." ", "");
                                DruidBarKey.CatMessage[1] = x;
                                DruidBarKey.CatMessage[2] = msg[3];
                                DruidBar_Print("Current Cat message is now:"..x);
                        elseif msg[2] == "aqua" then
                                DruidBarKey.AquaMessage = {};
                                local x = string.gsub(text, msg[1].." "..msg[2].." "..msg[3].." ", "");
                                DruidBarKey.AquaMessage[1] = x;
                                DruidBarKey.AquaMessage[2] = msg[3];
                                DruidBar_Print("Current Aquatic message is now:"..x);
                        elseif msg[2] == "travel" then
                                DruidBarKey.TravMessage = {};
                                local x = string.gsub(text, msg[1].." "..msg[2].." "..msg[3].." ", "");
                                DruidBarKey.TravMessage[1] = x;
                                DruidBarKey.TravMessage[2] = msg[3];
                                DruidBar_Print("Current Travel message is now:"..x);
                        else
                                DruidBar_Print("Invalid message type. message takes 5 parameters: Toggle, Bear, Cat, Aqua, or Travel.");
                        end
                else
                        DruidBar_Print("Invalid chat type. message format is: /dbar message [toggle/bear/cat/aqua/travel] [say/party/raid/emote] [message]");
                end
        elseif msg[1] == "width" and msg[2] and tonumber(msg[2]) then
                DruidBarKey.xvar = tonumber(msg[2]);
                DruidBar_Print("Width is now set to "..msg[2]);
        elseif msg[1] == "height" and msg[2] and tonumber(msg[2]) then
                DruidBarKey.yvar = tonumber(msg[2]);
                DruidBar_Print("Height is now set to "..msg[2]);
        elseif msg[1] == "hide" then
                DruidBarKey.Hide = DruidBar_Toggle(DruidBarKey.Hide, "Hiding bar when in caster form is");
        elseif msg[1] == "full" then
                DruidBarKey.Full = DruidBar_Toggle(DruidBarKey.Full, "Hiding bar when mana is full is");
        elseif msg[1] == "lock" then
                DruidBarKey.Lock = DruidBar_Toggle(DruidBarKey.Lock, "Lock feature is");
        elseif msg[1] == "replace" then
                DruidBarKey.Replace = DruidBar_Toggle(DruidBarKey.Replace, "Replacing the player frame's mana bar is");
        elseif msg[1] == "player" then
                DruidBarKey.XPBar = DruidBar_Toggle(DruidBarKey.XPBar, "Showing the bar below the Player Frame is");
                if DruidBarKey.XPBar then DruidBarKey.xvar = 150; DruidBarKey.yvar = 18; else DruidBarKey.xvar = 160; DruidBarKey.yvar = 18; end
        elseif msg[1] == "text" then
                if not DruidBarKey.Text then DruidBarKey.Text = 0; DruidBar_Print("Original-Style text on!"); elseif DruidBarKey.Text == 0 then DruidBarKey.Text = 1; DruidBar_Print("New-Style text on!"); elseif DruidBarKey.Text == 1 then DruidBarKey.Text = nil; DruidBar_Print("Text removed."); end
        elseif msg[1] == "percent" then
                if not DruidBarKey.Percent then DruidBarKey.Percent = 0; DruidBar_Print("DruidBar will show Raw numbers"); elseif DruidBarKey.Percent == 0 then DruidBarKey.Percent = 1; DruidBar_Print("DruidBar will now show Percentages"); elseif DruidBarKey.Percent == 1 then DruidBarKey.Percent = nil; DruidBar_Print("DruidBar will show both Percentages and Raw numbers"); end
        elseif msg[1] == "status" then
                DruidBar_Status();
        elseif msg[1] == "best" then
                DruidBar_ChangeBestForm();
        elseif msg[1] == "ez" then
                DruidBarKey.EZShift = DruidBar_Toggle(DruidBarKey.EZShift, "Easy Shifting is now");
        elseif msg[1] == "kmg" then
                if (MGplayer_ManaBar) then
                        DruidBarKey.kmg = DruidBar_Toggle(DruidBarKey.kmg, "Replacing the MiniGroup mana bar is");
                else
                        DruidBarKey.kmg = nil;
                        DruidBar_Print("Can't replace MiniGroup if it don't exist, YO!");
                end
        elseif msg[1] == "debug" then
                DruidBarKey.Debug = DruidBar_Toggle(DruidBarKey.Debug, "Debug options");
        else
                DruidBar_Print("Invalid option. Options are: [on/off/toggle/vis/message/width/height/percent/hide/full/lock/replace/kmg/best/player/text/status]");
        end
end

function DruidBar_Status()
        DruidBar_Print("DruidBar Toggle Status:");
        DruidBar_Print("DruidBar's enabled status is "..DruidBar_On(DruidBarKey.Enabled));
        DruidBar_Print("Graphics are "..DruidBar_On(DruidBarKey.Graphics));
        DruidBar_Print("Shapeshift messages are "..DruidBar_On(DruidBarKey.message));
        DruidBar_Print("Hiding when in caster is "..DruidBar_On(DruidBarKey.Hide));
        DruidBar_Print("Hiding when mana is full is "..DruidBar_On(DruidBarKey.Full));
        DruidBar_Print("Replacing the Player Frame's mana bar is "..DruidBar_On(DruidBarKey.Replace));
        DruidBar_Print("Showing under the Player Frame is "..DruidBar_On(DruidBarKey.XPBar));
        local str;
        if not DruidBarKey.Text then str = "|CFF888888Off|r"; elseif DruidBarKey.Text == 1 then str = "|CFFFFFFFFModern|r"; else str = "|CFF00FF00Classic|r"; end
        DruidBar_Print("The current style of text is "..str);
        if not DruidBarKey.Percent then str = "|CFF00FF00Percent and Raw|r"; elseif DruidBarKey.Percent == 1 then str = "|CFFFF00FFRaw|r"; else str = "|CFF0000FFPercent|r"; end
        DruidBar_Print("The current display of text is "..str);
        DruidBar_Print("Debugging is "..DruidBar_On(DruidBarKey.Debug));
end

function DruidBar_On(tog)
        if tog then
                return "|CFF00FF00On.|r";
        else
                return "|CFFFF0000Off.|r";
        end
end

function DruidBar_MaxManaScript()
                        local _, int = UnitStat("player", 4);
                        DruidBar_GetShapeshiftCost();
                        if UnitPowerType("player") == 0 then
                                if UnitManaMax("player") > 0 then
                                        DruidBarKey.maxmana = UnitManaMax("player");
                                        DruidBarKey.keepthemana = UnitMana("player");
                                        DruidBarKey.int = int;
                                end
                        elseif UnitPowerType("player") ~= 0 then
                                if DruidBarKey.int ~= int then
                                        if int > DruidBarKey.int then
                                                local dif = int - DruidBarKey.int;
                                                DruidBarKey.maxmana = DruidBarKey.maxmana + (dif * 15);
                                                DruidBarKey.int = int;
                                        elseif int < DruidBarKey.int then
                                                local dif = DruidBarKey.int - int;
                                                DruidBarKey.maxmana = DruidBarKey.maxmana - (dif * 15);
                                                DruidBarKey.int = int;
                                        end
                                end
                                if DruidBarKey.keepthemana > DruidBarKey.maxmana then
                                        DruidBarKey.keepthemana = DruidBarKey.maxmana;
                                end
                        end
                        DruidBarKey.extra = 0;
                        for i = 1, 18 do
                                DBarSpellCatch:ClearLines();
                                DBarSpellCatch:SetInventoryItem("player", i);
                                for j = 1, DBarSpellCatch:NumLines() do
                                        local strchek = getglobal("DBarSpellCatchTextLeft"..j):GetText();
                                        if strchek then
                                                
                                                if strfind(strchek, DRUIDBAR_REGEN1) then
                                                        DruidBarKey.extra = DruidBarKey.extra + string.gsub(strchek, DRUIDBAR_REGEN3, "%1")
                                                end
                                                if strfind(strchek, DRUIDBAR_REGEN2) then
                                                        DruidBarKey.extra = DruidBarKey.extra + string.gsub(strchek, DRUIDBAR_REGEN4, "%1");
                                                end
                                        end
                                end
                        end
                        DruidBarKey.extra = (DruidBarKey.extra * 2) / 5;
end

function DruidBar_Full()
        if DruidBarKey.Full then
                if DruidBarKey.keepthemana < DruidBarKey.maxmana then
                        return true;
                else
                        return nil;
                end
        else
                return true;
        end
end


function UIErrorsFrame:realEcho()

end



function UIErrorsFrame:fakeEcho(str, a1, a2, a3, a4, a5, a6)
    --DruidBar_Print(str, a1, a2, a3)
    --The outdoors message is normally delayed by lag so that it doesn't actually come until after the function is re-enabled.  However, on occasion when the latency is very low and the interface lags, it will come while the function is still disabled.  Allow the message through if this is the case.
    if(str == "Can only use outside") then
        UIErrorsFrame:realEcho(str, a1, a2, a3, a4, a5, a6)
    end

end


--[[              Shapeshifting Code                    ]]--
--Thanks to mib for this code! it's awesome!
--also thanks to Zevzabich for a bit of help since the pure rapeage of both my character and my lua that is know as 0.10
function DruidBar_ChangeBestForm()
        local m_bag = -1;
        local m_pos = -1;
        local aq_bag = -1;
        local aq_pos = -1;
        -- search position of mount         
        for bag = 0,4 do
                for i = 1,16 do
                        local t = GetContainerItemInfo(bag, i)
                        if (t) then
                                if (strfind(t,"\Ability_Mount_")) then
                                        m_bag = bag;
                                        m_pos = i;
                                end
                                if strfind(t, "\INV_Misc_Horn_01") and strfind(strlower(GetContainerItemLink(bag,i)), "frostwolf") then
                                        m_bag = bag;
                                        m_pos = i;
                                end
                                if (strfind(t, "INV_Misc_QirajiCrystal")) then
                                        aq_bag = bag;
                                        aq_pos = i;
                                end
                        end
                end
        end
        local _, pqrs = UnitClass("player");
        if pqrs == "DRUID" then
                --first hide the error messages
                --we try to do all 3 at once!

                UIErrorsFrame.realEcho = UIErrorsFrame.AddMessage;
                UIErrorsFrame.AddMessage = UIErrorsFrame.fakeEcho;
                if strfind(GetRealZoneText(), "Ahn'Qiraj") and not strfind(GetRealZoneText(), "Gates of Ahn'Qiraj") and not strfind(GetRealZoneText(), "Ruins of Ahn'Qiraj") then
                        UseContainerItem(aq_bag, aq_pos);
                else
                        UseContainerItem(m_bag, m_pos);
                end
                ShapeshiftBar_ChangeForm(travelformid);
                ShapeshiftBar_ChangeForm(aquaformid);
                --then we allow error messages again
                UIErrorsFrame.AddMessage = UIErrorsFrame.realEcho;
        else
                local i = 1;
                --check for high-speed castable mounts.
                while true do
                        local spellName = GetSpellName(i, BOOKTYPE_SPELL);
                        if not spellName then
                                do break end
                        end
                        if spellName == "Summon Charger" or spellName == "Summon Dreadsteed" then
                                CastSpell(i, BOOKTYPE_SPELL);
                                return;
                        end
                        i = i + 1;
                end
                i = 1;
                --check for lv40 castable mounts, or ghost wolf.
                while true do
                        local spellName = GetSpellName(i, BOOKTYPE_SPELL);
                        if not spellName then
                                do break end
                        end
                        if spellName == "Summon Felsteed" or spellName == "Ghost Wolf" or spellName == "Summon Warhorse" then
                                CastSpell(i, BOOKTYPE_SPELL);
                                return;
                        end
                        i = i + 1;
                end
                --nothing yet? let's try to mount normally.
                UIErrorsFrame.realEcho = UIErrorsFrame.AddMessage;
                UIErrorsFrame.AddMessage = UIErrorsFrame.fakeEcho;
                --and trying...
                if strfind(GetRealZoneText(), "Ahn'Qiraj") and not strfind(GetRealZoneText(), "Gates of Ahn'Qiraj") and not strfind(GetRealZoneText(), "Ruins of Ahn'Qiraj") then
                        UseContainerItem(aq_bag, aq_pos);
                else
                        UseContainerItem(m_bag, m_pos);
                end
                --then we allow error messages again
                UIErrorsFrame.AddMessage = UIErrorsFrame.realEcho;
        end
end

Generated by GNU Enscript 1.6.5.90.