vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
SM_INV_SLOT = {
["AMMOSLOT"]=0,
["HEADSLOT"]=1,
["NECKSLOT"]=2, 
["SHOULDERSLOT"]=3, 
["SHIRTSLOT"]=4, 
["CHESTSLOT"]=5, 
["WAISTSLOT"]=6, 
["LEGSSLOT"]=7, 
["FEETSLOT"]=8, 
["WRISTSLOT"]=9, 
["HANDSSLOT"]=10, 
["FINGER0SLOT"]=11, 
["FINGER1SLOT"]=12, 
["TRINKET0SLOT"]=13, 
["TRINKET1SLOT"]=14, 
["BACKSLOT"]=15, 
["MAINHANDSLOT"]=16, 
["SECONDARYHANDSLOT"]=17, 
["RANGEDSLOT"]=18, 
["TABARDSLOT"]=19, 
["BAG0SLOT"]=20, 
["BAG1SLOT"]=21, 
["BAG2SLOT"]=22, 
["BAG3SLOT"]=23, 
}

SlashCmdList["SUPERMACRO"] = function(msg)
        local info = ChatTypeInfo["SYSTEM"];
        local text;
        local cmd = gsub(msg,"^%s*(%a*)%s*(.*)%s*$","%1" );
        local param = gsub(msg,"^%s*(%a*)%s*([%w %p]*)%s*$","%2" );
        if ( cmd=="hideaction") then
                text = param;
                if ( text == "0" or text=="false") then
                        SM_VARS.hideAction = 0;
                        HideActionText();
                elseif ( text == "1" or text=="true") then
                        SM_VARS.hideAction = 1;
                        HideActionText();
                else
                        ChatFrame_DisplaySlashHelp("SUPERMACRO",3,3);
                end
                if ( not SM_VARS.hideAction ) then SM_VARS.hideAction = 0; end
                text = "SM_VARS.hideAction is "..SM_VARS.hideAction;
                if ( SuperMacroOptionsFrame:IsVisible() ) then
                        SuperMacroOptionsFrame_OnShow();
                end
                DEFAULT_CHAT_FRAME:AddMessage( text, info.r, info.g, info.b, info.id);
                return;
        end
        if ( cmd=="printcolor" ) then
                text = param;
                if ( text =="default" ) then
                        SM_VARS.printColor.r = PRINT_COLOR_DEF.r;
                        SM_VARS.printColor.g = PRINT_COLOR_DEF.g;
                        SM_VARS.printColor.b = PRINT_COLOR_DEF.b;
                        if ( SuperMacroOptionsFrame:IsVisible() ) then
                                SuperMacroOptionsFrame_OnShow();
                        end
                        return;
                end
                if ( gsub(text,"%s*","")=="" ) then
                        ChatFrame_DisplaySlashHelp("SUPERMACRO",4,4);
                        return;
                end
                local color = gsub(msg, ".*color%s*(.*)","%1");
                local red = gsub(color, "%s*(-?%d*%.*%d*)%s*.*","%1");
                local green = gsub(color, "%s*(-?%d*%.*%d*)%s*(-?%d*%.*%d*)%s*(-?%d*%.*%d*)%s*.*","%2");
                local blue = gsub(color, "%s*(-?%d*%.*%d*)%s*(-?%d*%.*%d*)%s*(-?%d*%.*%d*)%s*.*","%3");
                red = tonumber(red) or 0;
                green = tonumber(green) or 0;
                blue = tonumber(blue) or 0;
                red = (red < 0 and 0) or (red > 1 and 1) or red;
                green = (green < 0 and 0) or (green > 1 and 1) or green;
                blue = (blue < 0 and 0) or (blue > 1 and 1) or blue;
                SM_VARS.printColor = { r=red,g=green,b=blue };
                if ( SuperMacroOptionsFrame:IsVisible() ) then
                        SuperMacroOptionsFrame_OnShow();
                end
                return;
        end
        if ( cmd=="macrotip" ) then
                text = param;
                if ( text =="default" ) then
                        SM_VARS.macroTip1 = 1;
                        SM_VARS.macroTip2 = 0;
                        if ( SuperMacroOptionsFrame:IsVisible() ) then
                                SuperMacroOptionsFrame_OnShow();
                        end
                        return;
                end
                text = tonumber(text);
                if ( text and text >= 0 and text <= 3) then
                        if ( mod(text, 2) == 1 ) then
                                SM_VARS.macroTip1 = 1;
                        else
                                SM_VARS.macroTip1 = 0;
                        end
                        if ( text >= 2 ) then
                                SM_VARS.macroTip2 = 1;
                        else
                                SM_VARS.macroTip2 = 0;
                        end
                        if ( SuperMacroOptionsFrame:IsVisible() ) then
                                SuperMacroOptionsFrame_OnShow();
                        end
                else
                        ChatFrame_DisplaySlashHelp("SUPERMACRO",5,6);   
                end
                return;
        end
        if ( cmd=="options" ) then
                ShowUIPanel(SuperMacroOptionsFrame);
                return;
        end
        
        ChatFrame_DisplaySlashHelp("SUPERMACRO");
        return;
end

SlashCmdList["MACRO"] = function(msg)
        if(not msg or msg == "") then
                ShowUIPanel(SuperMacroFrame);
        else
                RunMacro(msg);
        end
end

-- use item
SlashCmdList["SMUSE"] = function(msg)
        use(unpack(ListToTable(msg)));
end

-- equip item
SlashCmdList["SMEQUIP"] = function(msg)
        use(unpack(ListToTable(msg)));
end

-- equip offhand item
SlashCmdList["SMEQUIPOFF"] = function(msg)
        local bag, slot = FindItem(TrimSpaces(msg));
        if ( bag and slot ) then
                PickupContainerItem(bag, slot);
                PickupInventoryItem(17);
        end
end

-- unequip item by part or name
SlashCmdList["SMUNEQUIP"] = function(msg)
        local e,f = FindLastEmptyBagSlot();
        if ( e ) then
                PickupInventoryItem(FindItem(TrimSpaces(msg)));
                PickupContainerItem(e,f);
        end
end

-- print text to chatframe
SlashCmdList["SMPRINT"] = function(msg)
        SM_print(msg);
end

-- after action passed text
SlashCmdList["SMPASS"] = function(msg)
        Pass(msg);
end

-- after action failed text
SlashCmdList["SMFAIL"] = function(msg)
        Fail(msg);
end

-- use items in order
SlashCmdList["SMDOORDER"] = function(msg)
        DoOrder(unpack(ListToTable(msg)));
end

-- channel without interruption
SlashCmdList["SMCHANNEL"] = function(msg)
        SM_Channel(msg);
end

function SM_print(msg)
        DEFAULT_CHAT_FRAME:AddMessage(msg, SM_VARS.printColor.r, SM_VARS.printColor.g, SM_VARS.printColor.b);
end

if ( not ChatFrame_DisplaySlashHelp ) then
function ChatFrame_DisplaySlashHelp(pre, start, last, frame)
        if ( not frame ) then
                frame=DEFAULT_CHAT_FRAME;
        end
        local info = ChatTypeInfo["SYSTEM"];
        local i = 1;
        if ( type(start) =="number" ) then i = start; end
        if ( i < 1 ) then i =1; end
        local text = TEXT(getglobal(pre.."_HELP_LINE"..i));
        while text do
                frame:AddMessage(text, info.r, info.g, info.b, info.id);
                i = i + 1;
                text = TEXT(getglobal(pre.."_HELP_LINE"..i));
                if ( last and i > last ) then break; end
        end
end
end -- if

-- in sec do cmd
SlashCmdList["SMIN"] = function(msg)
        local _,_,s,r,c = strfind(msg, "(%d+h?%d*m?%d*s?)(%+?)%s+(.*)");
        if ( not c or TrimSpaces(c)=="" ) then return end
        c=gsub(c,"\\n","\n");
        SuperMacro_InEnter(s,c,r);
end

SM_SHIFT_FORM = { bear=1,aquatic=2,cat=3,travel=4,moonkin=5, stealth=1, battle=1,defend=2,berzerk=3 };

SlashCmdList["SMSHIFT"] = function(msg)
        local form=msg;
        if ( SM_SHIFT_FORM[msg] ) then
                form=SM_SHIFT_FORM[msg];
        end
        CastShapeshiftForm(form);
end

SlashCmdList["SMCRAFT"] = function(msg)
        local skill, item, count = unpack(ListToTable(msg));
        count = tonumber(count);
        CraftItem(skill, item, count);
end

SlashCmdList["SMSAYRANDOM"] = function(msg)
        SayRandom(unpack(ListToTable(msg)));
end

SlashCmdList["SMCANCELBUFF"] = function(msg)
        CancelBuff(unpack(ListToTable(msg)));
end

function SayRandom(...)
        tinsert(arg, "");
        local r=random(arg.n);
        RunLine(arg[r]);
end

function SuperMacro_InEnter( sec, cmd, rep)
        if ( not sec or not cmd ) then return end
        local t=SM_INFRAME.events;
        local seconds=sec;
        if ( strfind(seconds,'[hms]') ) then
                seconds=gsub(seconds,'^(%d+)(h?)(%d*)(m?)(%d*)(s?)$', function(hd, h, md, m, sd, s)
                        local a=0;
                        if ( h=="h" ) then a=a+hd*3600
                        else md=hd..md end;
                        if ( m=="m" ) then a=a+md*60
                        else sd=md..sd end;
                        if ( sd~="" ) then a=a+sd end;
                        return a;
                end );
        end
        s=GetTime()+seconds;
        t[s]={};
        t[s].cmd=cmd;
        t[s].sec=seconds;
        t[s].rep=rep and rep or "";
        t.n=t.n+1;
        SM_INFRAME:Show();
end

SM_IN=SuperMacro_InEnter;

function SM_INFRAME_OnUpdate( )
        local t=this.events;
        if ( getn(t)==0 ) then
                SM_INFRAME:Hide();
        end
        for k,v in t do
                if ( k~='n' and k<=GetTime() ) then
                        RunBody(v.cmd);
                        if ( v.rep~="" ) then
                                local s=GetTime()+v.sec;
                                t[s]={};
                                t[s].cmd=v.cmd;
                                t[s].sec=v.sec;
                                t[s].rep=v.rep;
                                t[k]=nil;
                        else
                                t[k]=nil;
                                t.n=t.n-1;
                        end
                end
        end
end

function Pass(text)
        if( IsCurrentAction(lastActionUsed) ) then
                RunLine(text);
                return text;
        end
end

function Fail(text)
        if ( not IsCurrentAction(lastActionUsed) ) then
                RunLine(text);
                return text;
        end
end

function UseItemByName(item)
        local bag,slot = FindItem(item);
        if ( not bag ) then return; end;
        if ( slot ) then
                UseContainerItem(bag,slot); -- use, equip item in bag
                return bag, slot;
        else
                UseInventoryItem(bag); -- unequip from body
                return bag;
        end
end

function use(bag, slot)
        local b,s=tonumber(bag), tonumber(slot);
        if ( b ) then
                if ( s ) then
                        UseContainerItem(bag,slot); -- use, equip item in bag
                else
                        UseInventoryItem(bag); -- unequip from body
                end
        else
                UseItemByName(bag);
        end
end

function DoOrder(...)
        for k,i in arg do
                local item=FindItem(i);
                local spell,book=SM_FindSpell(i);
                if ( spell and GetSpellCooldown(spell,book)==0) then
                        CastSpell(spell,book);
                        return i, spell, book;
                end
                if ( item and GetItemCooldown(i)==0 ) then
                        UseItemByName(i);
                        return i, item, slot;
                end
        end
end

function FindItem(item)
        if ( not item ) then return; end
        item = string.lower(ItemLinkToName(item));
        local link;
        for i = 1,23 do
                link = GetInventoryItemLink("player",i);
                if ( link ) then
                        if ( item == string.lower(ItemLinkToName(link)) )then
                                return i, nil, GetInventoryItemTexture('player', i), GetInventoryItemCount('player', i);
                        end
                end
        end
        local count, bag, slot, texture;
        local totalcount = 0;
        for i = 0,NUM_BAG_FRAMES do
                for j = 1,MAX_CONTAINER_ITEMS do
                        link = GetContainerItemLink(i,j);
                        if ( link ) then
                                if ( item == string.lower(ItemLinkToName(link))) then
                                        bag, slot = i, j;
                                        texture, count = GetContainerItemInfo(i,j);
                                        totalcount = totalcount + count;
                                end
                        end
                end
        end
        return bag, slot, texture, totalcount;
end

function GetItemCooldown(item)
        local bag, slot = FindItem(item);
        if ( slot ) then
                return GetContainerItemCooldown(bag, slot);
        elseif ( bag ) then
                return GetInventoryItemCooldown('player', bag);
        end
end

function FindLastEmptyBagSlot()
        for i=NUM_BAG_FRAMES,0,-1 do
                for j=GetContainerNumSlots(i),1,-1 do
                        if not GetContainerItemInfo(i,j) then
                                return i,j;
                        end
                end
        end
end

function ListToTable(text)
        local t={};
        -- if comma is part of item, put % before it
        -- eg, Sulfuras%, Hand of Ragnaros
        text=gsub(text, "%%,", "%%044");
        -- convert link to name, commas ok
        text=gsub(text, "|c.-%[(.+)%]|h|r", function(x)
                return gsub(x, ",", "%%044");
        end );

        gsub(text, "[^,]+", function(a) -- list separated by comma
                a = TrimSpaces(a);
                if ( a~="" ) then
                        a=gsub(a, "%%044", ",");
                        tinsert(t,a);
                end
        end);
        return t;
end

function TrimSpaces(str)
        return gsub(str,"^%s*(.-)%s*$","%1");
end

function ItemLinkToName(link)
        return gsub(link,"^.*%[(.*)%].*$","%1");
end

function FindBuff( obuff, unit, item)
        local buff=strlower(obuff);
        local tooltip=SM_Tooltip;
        local textleft1=getglobal(tooltip:GetName().."TextLeft1");
        if ( not unit ) then
                unit ='player';
        end
        local my, me, mc, oy, oe, oc = GetWeaponEnchantInfo();
        if ( my ) then
                tooltip:SetOwner(UIParent, "ANCHOR_NONE");
                tooltip:SetInventoryItem( unit, 16);
                for i=1, 23 do
                        local text = getglobal("SM_TooltipTextLeft"..i):GetText();
                        if ( not text ) then
                                break;
                        elseif ( strfind(strlower(text), buff) ) then
                                tooltip:Hide();
                                return "main",me, mc;
                        end
                end
                tooltip:Hide();
        elseif ( oy ) then
                tooltip:SetOwner(UIParent, "ANCHOR_NONE");
                tooltip:SetInventoryItem( unit, 17);
                for i=1, 23 do
                        local text = getglobal("SM_TooltipTextLeft"..i):GetText();
                        if ( not text ) then
                                break;
                        elseif ( strfind(strlower(text), buff) ) then
                                tooltip:Hide();
                                return "off", oe, oc;
                        end
                end
                tooltip:Hide();
        end
        if ( item ) then return end
        tooltip:SetOwner(UIParent, "ANCHOR_NONE");
        tooltip:SetTrackingSpell();
        local b = textleft1:GetText();
        if ( b and strfind(strlower(b), buff) ) then
                tooltip:Hide();
                return "track",b;
        end
        local c=nil;
        for i=1, 16 do
                tooltip:SetOwner(UIParent, "ANCHOR_NONE");
                tooltip:SetUnitBuff(unit, i);
                b = textleft1:GetText();
                tooltip:Hide();
                if ( b and strfind(strlower(b), buff) ) then
                        return "buff", i, b;
                elseif ( c==b ) then
                        break;
                end
                --c = b;
        end
        c=nil;
        for i=1, 16 do
                tooltip:SetOwner(UIParent, "ANCHOR_NONE");
                tooltip:SetUnitDebuff(unit, i);
                b = textleft1:GetText();
                tooltip:Hide();
                if ( b and strfind(strlower(b), buff) ) then
                        return "debuff", i, b;
                elseif ( c==b) then
                        break;
                end
                --c = b;
        end
        tooltip:Hide();
end

function CancelBuff(...)
        for j=1, getn(arg) do
        local buff = strlower(arg[j]);
        for i=0, 24 do
                SM_Tooltip:SetOwner(UIParent, "ANCHOR_NONE");
                SM_Tooltip:SetPlayerBuff(i);
                local name = SM_TooltipTextLeft1:GetText();
                if ( not name ) then break end;
                if ( strfind(strlower(name), buff) ) then
                        CancelPlayerBuff(i);
                end
                SM_Tooltip:Hide();
        end
        end
end

function SM_Pickup(bag, slot)
        if ( type(bag)=="string") then
                if ( SM_INV_SLOT[strupper(bag)] ) then
                        bag=GetInventorySlotInfo(bag);
                else
                        bag,slot=FindItem(bag);
                end
        end
        if ( bag and not slot ) then
                PickupInventoryItem(bag);
        elseif ( bag and slot ) then
                PickupContainerItem(bag, slot);
        end
end

function caststop(...)
        for i=1, arg.n do
                CastSpellByName(arg[i]);
                SpellStopCasting();
        end
end

function SM_Channel(spell)
        local cf = CastingBarFrame;
        local cd = GetSpellCooldown(SM_FindSpell(spell));
        if ( not cf.channeling and cd<=1.5 ) then
                cast(spell);
        end
end

function FindTradeSkillIndex(tradeskill)
        tradeskill=strlower(tradeskill);
        if ( TradeSkillFrame and TradeSkillFrame:IsVisible()) then
                for i=1,GetNumTradeSkills() do
                        local tsn,tst,tsx=GetTradeSkillInfo(i);
                        if (strlower(tsn)==tradeskill) then
                                SelectTradeSkill(i);
                                TradeSkillInputBox:SetNumber(tsx);
                                TradeSkillFrame.numAvailable=tsx;
                                return i, tsx;
                        end
                end
        end
        if ( CraftFrame and CraftFrame:IsVisible()) then
                for i=1,GetNumCrafts() do
                --craftName, craftSubSpellName, craftType, numAvailable, isExpanded,?,?
                        local tsn,_,_,tsx=GetCraftInfo(i);
                        if (strlower(tsn)==tradeskill) then
                                SelectCraft(i);
                                return i, 'c';
                        end
                end
        end
end

function CraftItem( tradeskill, tradeitem, count)
        if ( TradeSkillFrame and TradeSkillFrame:IsVisible() ) then
                HideUIPanel(TradeSkillFrame);
        end
        if ( CraftFrame and CraftFrame:IsVisible() ) then
                HideUIPanel(CraftFrame);
        end
        cast(tradeskill);
        local index, avail = FindTradeSkillIndex(tradeitem);
        if ( avail=='c' ) then
                DoCraft(index);
        elseif (avail and avail > 0) then
                local amount;
                count = count or 1;
                if ( count <= 0 ) then
                -- 0 to make all, -1 to leave 1
                        amount =avail+count;
                else
                -- amount user entered
                        amount=count;
                end
                amount = amount<1 and 1 or amount>avail and avail or amount;
                TradeSkillInputBox:SetNumber(amount);
                DoTradeSkill(index, amount);
        end
end

-- shortened replacements
-- also try Alias addon to save space, like to get player's mana

cast = CastSpellByName;
stopcast = SpellStopCasting;
echo = SM_print;
send = SendChatMessage;
buffed = FindBuff;
unbuff = CancelBuff;
pickup = SM_Pickup;

-- added debug print
function Printd(...)
        for i=1, arg.n do
                local t=arg[i] and (arg[i]~="" and arg[i] or '-""-' )or "-nil-";
                if ( type(t)=="boolean") then
                        t="-"..tostring(t).."-";
                end
                DEFAULT_CHAT_FRAME:AddMessage(t,1,1,1);
        end
end

function PrintColor(r,g,b,...)
        for i=1, arg.n do
                local t=arg[i] and (arg[i]~="" and arg[i] or '-""-' )or "-nil-";
                if ( type(t)=="boolean") then
                        t="-"..tostring(t).."-";
                end
                DEFAULT_CHAT_FRAME:AddMessage(t,r,g,b);
        end
end

Printc=PrintColor;

-- Prints a table in an organized format
function PrintTable(table, rowname, level) 
        if ( rowname == nil ) then rowname = "ROOT"; end
--Print(level)
        --level = level and level or 1;
        if ( not level ) then level = 1; end
        local msg = "";
        for i=1, level do 
                msg = msg .. "   ";     
        end

        if ( table == nil ) then Print (msg.."["..rowname.."] := nil "); return end
        if ( type(table) == "table" ) then
                Print(msg..rowname.." { ");
                for k,v in table do
                        PrintTable(v,k,level+1);
                end
                Print(msg.."} ");
        elseif (type(table) == "function" ) then 
                Print(msg.."["..rowname.."] => {{FunctionPtr*}}");
        else
                Print(msg.."["..rowname.."] => "..table);
        end
end

Printt=PrintTable;

Generated by GNU Enscript 1.6.5.90.