sm_slash.lua
字号:
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["SMUSEORDER"] = 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
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;
end
SM_IN=SuperMacro_InEnter;
function SM_INFRAME_OnUpdate( )
local t=this.events;
if ( getn(t)==0 ) then return 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);
if ( not unit ) then
unit ='player';
end
local my, me, mc, oy, oe, oc = GetWeaponEnchantInfo();
if ( my ) then
SM_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
SM_Tooltip:Hide();
return "main",me, mc;
end
end
elseif ( oy ) then
SM_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
SM_Tooltip:Hide();
return "off", oe, oc;
end
end
end
if ( item ) then return end
SM_Tooltip:SetTrackingSpell();
local b = SM_TooltipTextLeft1:GetText();
if ( b and strfind(strlower(b), buff) ) then
SM_Tooltip:Hide();
return "track",b;
end
local c;
for i=1, 16 do
SM_Tooltip:SetUnitBuff(unit, i);
local b = SM_TooltipTextLeft1:GetText();
if ( b and strfind(strlower(b), buff) ) then
SM_Tooltip:Hide();
return "buff", i, b;
elseif ( c==b ) then
break;
end
c = b;
end
c=nil;
for i=1, 16 do
SM_Tooltip:SetUnitDebuff(unit, i);
local b = SM_TooltipTextLeft1:GetText();
if ( b and strfind(strlower(b), buff) ) then
SM_Tooltip:Hide();
return "debuff", i, b;
elseif ( c==b) then
break;
end
c = b;
end
SM_Tooltip:Hide();
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(spell)
CastSpellByName(spell);
SpellStopCasting();
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
-- 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;
pickup = SM_Pickup;
-- added debug print
function Print(...)
for i=1, arg.n do
local t=arg[i] and (arg[i]~="" and arg[i] or '-""-' )or "-nil-";
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-";
DEFAULT_CHAT_FRAME:AddMessage(t,1,1,1);
end
end
-- 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -