SUPERMACRO_VERSION = "3.14"; UIPanelWindows["SuperMacroFrame"] = { area = "left", pushable = 7, whileDead = 1 }; UIPanelWindows["SuperMacroOptionsFrame"] = { area = "left", pushable = 0, whileDead = 1 }; MACRO_ROWS = 3; MACRO_COLUMNS = 10; MACROS_REGULAR_SHOWN = 36; MACROS_SUPER_SHOWN = MACRO_ROWS * MACRO_COLUMNS; MAX_MACROS = 18; --MAX_TOTAL_MACROS = 36; NUM_MACRO_ICONS_SHOWN = 30;--20 NUM_ICONS_PER_ROW = 5;--5 NUM_ICON_ROWS = 6;--4 MACRO_ROW_HEIGHT = 36; MACRO_ICON_ROW_HEIGHT = 36; --MACRO_MAX_LETTERS = 255; EXTEND_MAX_LETTERS = 7000; SUPER_MAX_LETTERS = 7000; PRINT_COLOR_DEF = {r=1, g=1, b=1}; SM_VARS = {}; -- options variables, Saved --SM_VARS.hideAction = 0; --SM_VARS.printColor = PRINT_COLOR_DEF; --SM_VARS.macroTip1 = 1; --SM_VARS.macroTip2 = 0; --SM_VARS.minimap = 1; --SM_VARS.replaceIcon = 1; --SM_VARS.checkCooldown = 1; SM_EXTEND = {}; -- ingame extended, Saved SM_SUPER={}; -- supers' names, texture, body, Saved SM_ORDERED={}; -- supers in alphabetical order SM_ACTION={}; -- hold actions that have supers, for current player SM_ACTION_SUPER={}; -- hold actions for supers, Saved per character SM_MACRO_ICON={}; -- hold all available icons and their id SM_ACTION_SPELL={}; -- hold macros that cast spell or items SM_ACTION_SPELL.regular={}; SM_ACTION_SPELL.super={}; SM_AliasFunctions={}; -- functions to replace aliases SM_AliasFunctions.low=0; SM_AliasFunctions.high=0; local oldextend; function SuperMacroFrame_OnLoad() PanelTemplates_SetNumTabs(this, 2); SuperMacroFrame.selectedTab = 1; PanelTemplates_UpdateTabs(this); SuperMacroFrameTitle:SetText(SUPERMACRO_TITLE.." "..SUPERMACRO_VERSION); SuperMacroFrameCharacterMacroText:SetText(format(CHARACTER_SPECIFIC_MACROS, UnitName("player"))); SM_UpdateAction(); this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("TRADE_SKILL_SHOW"); this:RegisterEvent("CRAFT_SHOW"); this:RegisterEvent("PLAYER_ENTERING_WORLD"); lastActionUsed = nil; SuperMacroFrame_SetAccountMacros(); SM_MACRO_ICON=SM_LoadMacroIcons(); if ( not Print ) then Print=Printd; end end function SuperMacroFrame_OnShow() SuperMacroFrame.extendChanged=nil; SuperMacroFrame_Update(); PlaySound("igCharacterInfoOpen"); end function SuperMacroFrame_OnHide() SuperMacroPopupFrame:Hide(); SuperMacroFrame_SaveMacro(); PlaySound("igCharacterInfoClose"); if ( SuperMacroFrame.extendChanged ) then SuperMacroSaveExtend(); end SuperMacroFrame.extendChanged=nil; -- purge empty extends for m,e in ipairs(SM_EXTEND) do if ( e=="" ) then SM_EXTEND[m]=nil; end end SuperMacroRunScriptExtend(); end function SuperMacroFrame_SetAccountMacros() local numAccountMacros, numCharacterMacros = GetNumMacros(); if ( numAccountMacros > 0 ) then SuperMacroFrame_SelectMacro(1); else SuperMacroFrame_SetCharacterMacros(); end end function SuperMacroFrame_SetCharacterMacros() local numAccountMacros, numCharacterMacros = GetNumMacros(); if ( numCharacterMacros > 0 ) then SuperMacroFrame_SelectMacro(19); else SuperMacroFrame_SelectMacro(nil); end end function SuperMacroFrame_ShowFrame( tab ) if ( tab~="regular" ) then SuperMacroFrameRegularFrame:Hide(); else SuperMacroFrameRegularFrame:Show(); end if ( tab~="super" ) then SuperMacroFrameSuperFrame:Hide(); else SM_ORDERED=SortSuperMacroList(); SuperMacroFrameSuperFrame:Show(); end end function SuperMacroFrame_Update() -- determine to show regular or super macros from SM_VARS.tabShown -- START show regular frame if ( SM_VARS.tabShown=="regular" ) then SuperMacroFrame_ShowFrame("regular"); local numMacros; local numAccountMacros, numCharacterMacros = GetNumMacros(); local macroButton, macroIcon, macroName; local name, texture, body, isLocal; local selectedName, selectedBody, selectedIcon; -- Disable Buttons if ( SuperMacroPopupFrame:IsVisible() ) then SuperMacroEditButton:Disable(); SuperMacroDeleteButton:Disable(); SuperMacroSaveButton:Disable(); else SuperMacroEditButton:Enable(); SuperMacroDeleteButton:Enable(); SuperMacroSaveButton:Enable(); end if ( not SuperMacroFrame.selectedMacro or (numAccountMacros+numCharacterMacros==0) ) then SuperMacroDeleteButton:Disable(); SuperMacroEditButton:Disable(); SuperMacroSaveButton:Disable(); SuperMacroFrameSelectedMacroName:SetText(''); SuperMacroFrameText:SetText(''); SuperMacroFrameSelectedMacroButtonIcon:SetTexture(''); end -- Macro List for j=0, MAX_MACROS, MAX_MACROS do if ( j == 0 ) then numMacros = numAccountMacros; else numMacros = numCharacterMacros; end for i=1, MAX_MACROS do local macroID = i+j; getglobal("SuperMacroButton"..macroID.."ID"):SetText(macroID); macroButton = getglobal("SuperMacroButton"..macroID); macroIcon = getglobal("SuperMacroButton"..macroID.."Icon"); macroName = getglobal("SuperMacroButton"..macroID.."Name"); if ( i <= numMacros ) then name, texture, body, isLocal = GetMacroInfo(macroID); macroButton:SetID(macroID); macroIcon:SetTexture(texture); macroName:SetText(name); macroButton:Enable(); -- Highlight Selected Macro if ( macroID == SuperMacroFrame.selectedMacro ) then macroButton:SetChecked(1); SuperMacroFrameSelectedMacroName:SetText(name); SuperMacroFrameText:SetText(body); SuperMacroFrameSelectedMacroButton:SetID(macroID); SuperMacroFrameSelectedMacroButtonIcon:SetTexture(texture); else macroButton:SetChecked(0); end else macroButton:SetChecked(0); macroIcon:SetTexture(""); macroName:SetText(""); macroButton:Disable(); end end end --Update New Button if ( numAccountMacros == MAX_MACROS ) then SuperMacroNewAccountButton:Disable(); else SuperMacroNewAccountButton:Enable(); end if ( numCharacterMacros == MAX_MACROS ) then SuperMacroNewCharacterButton:Disable(); else SuperMacroNewCharacterButton:Enable(); end end -- END update regular frame -- START show super frame if ( SM_VARS.tabShown=="super" ) then SuperMacroFrame_ShowFrame("super"); local numMacros=SM_SUPER_SIZE or GetNumSuperMacros(); local macroButton, macroIcon, macroName; local name, texture, body; -- Disable Buttons if ( SuperMacroPopupFrame:IsVisible() ) then SuperMacroNewSuperButton:Disable(); SuperMacroSaveSuperButton:Disable(); SuperMacroDeleteSuperButton:Disable(); SuperMacroEditButton:Disable(); else SuperMacroNewSuperButton:Enable(); SuperMacroSaveSuperButton:Enable(); SuperMacroDeleteSuperButton:Enable(); SuperMacroEditButton:Enable(); end if ( not SuperMacroFrame.selectedSuper or GetNumSuperMacros()==0) then --[[ SuperMacroSaveSuperButton:Enable(); SuperMacroDeleteSuperButton:Enable(); SuperMacroEditButton:Enable(); else --]] SuperMacroSaveSuperButton:Disable(); SuperMacroDeleteSuperButton:Disable(); SuperMacroEditButton:Disable(); SuperMacroFrameSelectedMacroName:SetText(''); SuperMacroFrameSuperText:SetText(''); SuperMacroFrameSelectedMacroSuperButtonIcon:SetTexture(''); end -- Macro List local offset=FauxScrollFrame_GetOffset(SuperMacroFrameSuperScrollFrame); local firstmacro = offset*MACRO_COLUMNS+1; local lastmacro = firstmacro + MACRO_ROWS*MACRO_COLUMNS -1; for i=1, MACROS_SUPER_SHOWN do getglobal("SuperMacroSuperButton"..i.."ID"):SetText(firstmacro+i-1); macroButton = getglobal("SuperMacroSuperButton"..i); macroIcon = getglobal("SuperMacroSuperButton"..i.."Icon"); macroName = getglobal("SuperMacroSuperButton"..i.."Name"); local macroID = firstmacro+i-1; if ( macroID <= numMacros ) then name, texture, body = GetOrderedSuperMacroInfo(macroID); macroButton:SetID(macroID); macroIcon:SetTexture(texture); macroName:SetText(name); macroButton:Enable(); -- Highlight Selected Macro if ( macroID == SuperMacroFrame.selectedSuper ) then macroButton:SetChecked(1); SuperMacroFrameSelectedMacroName:SetText(name); SuperMacroFrameSuperText:SetText(body); SuperMacroFrameSelectedMacroSuperButtonIcon:SetTexture(texture); else macroButton:SetChecked(0); end else macroButton:SetChecked(0); macroIcon:SetTexture(""); macroName:SetText(""); macroButton:Disable(); end end -- Scroll frame stuff FauxScrollFrame_Update(SuperMacroFrameSuperScrollFrame, ceil(numMacros/10), MACRO_ROWS, MACRO_ROW_HEIGHT ); end -- END update super frame end function SuperMacroFrame_AddMacroLine(line) if ( SuperMacroFrameText:IsVisible() ) then SuperMacroFrameText:SetText(SuperMacroFrameText:GetText()..line); end end function SuperMacroButton_OnClick( button ) local id=this:GetID(); if ( SuperMacroFrame.extendChanged and SuperMacroFrame.selectedMacro ) then SuperMacroSaveExtend(); end SuperMacroFrame_SaveMacro(); SuperMacroFrame_SelectMacro(id); SuperMacroFrame_Update(); SuperMacroPopupFrame:Hide(); SuperMacroFrameText:ClearFocus(); local macro=SuperMacroFrameSelectedMacroName:GetText(); local extendText=SM_EXTEND[macro]; if ( extendText ) then SuperMacroFrameExtendText:SetText(extendText); else SuperMacroFrameExtendText:SetText(""); end if ( button=="RightButton" ) then RunMacro(id); end end function SuperMacroSuperButton_OnClick( button ) local id=this:GetID(); SuperMacroFrame_SaveSuperMacro(); SuperMacroFrame_SelectSuperMacro(id); SuperMacroFrame_Update(); SuperMacroPopupFrame:Hide(); SuperMacroFrameSuperText:ClearFocus(); if ( button=="RightButton" ) then RunSuperMacro(id); end end function SuperMacroFrame_SelectSuperMacro(id) SuperMacroFrame.selectedSuper = id; end function SuperMacroFrame_SelectMacro(id) SuperMacroFrame.selectedMacro = id; end function SuperMacroNewAccountButton_OnClick() SuperMacroFrame_SaveMacro(); SuperMacroSaveExtend(); oldextend=nil; SuperMacroPopupFrame.mode = "newaccount"; SuperMacroPopupFrame:Show(); end function SuperMacroNewCharacterButton_OnClick() SuperMacroFrame_SaveMacro(); SuperMacroSaveExtend(); oldextend=nil; SuperMacroPopupFrame.mode = "newcharacter"; SuperMacroPopupFrame:Show(); end function SuperMacroNewSuperButton_OnClick() SuperMacroFrame_SaveSuperMacro(); SuperMacroPopupFrame.mode = "newsuper"; SuperMacroPopupFrame:Show(); end function SuperMacroEditButton_OnClick() if ( SuperMacroFrame.extendChanged ) then SuperMacroSaveExtend(); end -- erase old name extend oldextend=SuperMacroFrameExtendText:GetText(); local oldmacro=SelectedMacroName(); --SM_EXTEND[oldmacro]=nil; if ( not SameMacroName() ) then SuperMacroSaveExtend(oldmacro, 1); -- delete old extend end SuperMacroFrame_SaveMacro(); SuperMacroPopupFrame.mode = "edit"; SuperMacroPopupFrame.oldname=SuperMacroFrameSelectedMacroName:GetText(); SuperMacroPopupFrame:Show(); end function SuperMacroFrame_HideDetails() SuperMacroEditButton:Hide(); SuperMacroFrameCharLimitText:Hide(); SuperMacroFrameText:Hide(); SuperMacroFrameSelectedMacroName:Hide(); SuperMacroFrameSelectedMacroBackground:Hide(); SuperMacroFrameSelectedMacroButton:Hide(); end function SuperMacroFrame_ShowDetails() SuperMacroEditButton:Show(); SuperMacroFrameCharLimitText:Show(); SuperMacroFrameEnterMacroText:Show(); SuperMacroFrameText:Show(); SuperMacroFrameSelectedMacroName:Show(); SuperMacroFrameSelectedMacroBackground:Show(); SuperMacroFrameSelectedMacroButton:Show(); end function SuperMacroPopupFrame_OnShow() if ( this.mode == "newaccount" or this.mode == "newcharacter" ) then SuperMacroFrameText:Hide(); SuperMacroFrameSelectedMacroButtonIcon:SetTexture(""); SuperMacroPopupFrame.selectedIcon = nil; elseif ( this.mode == "newsuper" ) then SuperMacroFrameSuperText:Hide(); SuperMacroFrameSelectedMacroSuperButtonIcon:SetTexture(""); SuperMacroPopupFrame.selectedIcon = nil; end SuperMacroFrameText:ClearFocus(); SuperMacroFrameSuperText:ClearFocus(); SuperMacroPopupEditBox:SetFocus(); PlaySound("igCharacterInfoOpen"); SuperMacroPopupFrame_Update(); SuperMacroPopupOkayButton_Update(); -- Disable Buttons SuperMacroEditButton:Disable(); SuperMacroDeleteButton:Disable(); SuperMacroNewAccountButton:Disable(); SuperMacroNewCharacterButton:Disable(); end function SuperMacroPopupFrame_OnHide() if ( this.mode == "newaccount" or this.mode == "newcharacter" ) then SuperMacroFrameText:Show(); SuperMacroFrameText:SetFocus(); elseif ( this.mode == "newsuper" ) then SuperMacroFrameSuperText:Show(); SuperMacroFrameSuperText:SetFocus(); end -- Enable Buttons SuperMacroEditButton:Enable(); SuperMacroDeleteButton:Enable(); local numAccountMacros, numCharacterMacros = GetNumMacros(); if ( numAccountMacros < MAX_MACROS ) then SuperMacroNewAccountButton:Enable(); end if ( numCharacterMacros < MAX_MACROS ) then SuperMacroNewCharacterButton:Enable(); end end function SuperMacroPopupFrame_Update() local numMacroIcons = GetNumMacroIcons(); local macroPopupIcon, macroPopupButton; local macroPopupOffset = FauxScrollFrame_GetOffset( SuperMacroPopupScrollFrame ); local index; -- Determine whether we're creating a new macro or editing an existing one if ( this.mode == "newaccount" or this.mode == "newcharacter" ) then SuperMacroPopupEditBox:SetText(""); elseif ( this.mode == "newsuper" ) then SuperMacroPopupEditBox:SetText(""); elseif ( this.mode == "edit" ) then local name; if ( SM_VARS.tabShown=="regular") then name = GetMacroInfo(SuperMacroFrame.selectedMacro); elseif ( SM_VARS.tabShown=="super" ) then name = GetOrderedSuperMacroInfo(SuperMacroFrame.selectedSuper); end SuperMacroPopupEditBox:SetText(name); end -- Icon list for i=1, NUM_MACRO_ICONS_SHOWN do macroPopupIcon = getglobal("SuperMacroPopupButton"..i.."Icon"); macroPopupButton = getglobal("SuperMacroPopupButton"..i); index = (macroPopupOffset * NUM_ICONS_PER_ROW) + i; if ( index <= numMacroIcons ) then macroPopupIcon:SetTexture(GetMacroIconInfo(index)); macroPopupButton:Show(); else macroPopupIcon:SetTexture(""); macroPopupButton:Hide(); end if ( index == SuperMacroPopupFrame.selectedIcon ) then macroPopupButton:SetChecked(1); else macroPopupButton:SetChecked(nil); end end -- Scrollbar stuff FauxScrollFrame_Update(SuperMacroPopupScrollFrame, ceil(numMacroIcons / NUM_ICONS_PER_ROW) , NUM_ICON_ROWS, MACRO_ICON_ROW_HEIGHT ); end function SuperMacroPopupOkayButton_Update() if ( (strlen(SuperMacroPopupEditBox:GetText()) > 0) and SuperMacroPopupFrame.selectedIcon ) then SuperMacroPopupOkayButton:Enable(); else SuperMacroPopupOkayButton:Disable(); end if ( SuperMacroPopupFrame.mode == "edit" and (strlen(SuperMacroPopupEditBox:GetText()) > 0) ) then SuperMacroPopupOkayButton:Enable(); end end function SuperMacroPopupButton_OnClick() SuperMacroPopupFrame.selectedIcon = this:GetID() + (FauxScrollFrame_GetOffset(SuperMacroPopupScrollFrame) * NUM_ICONS_PER_ROW); if ( SM_VARS.tabShown=="regular" ) then SuperMacroFrameSelectedMacroButtonIcon:SetTexture( GetMacroIconInfo(SuperMacroPopupFrame.selectedIcon)); elseif ( SM_VARS.tabShown=="super" ) then SuperMacroFrameSelectedMacroSuperButtonIcon:SetTexture( GetMacroIconInfo(SuperMacroPopupFrame.selectedIcon)); end SuperMacroPopupOkayButton_Update(); SuperMacroPopupFrame_Update(); end function SuperMacroPopupOkayButton_OnClick() local index = 1; local texture=SuperMacroFrameSelectedMacroSuperButtonIcon:GetTexture(); local macroname=SuperMacroPopupEditBox:GetText(); if ( SuperMacroPopupFrame.mode == "newaccount" ) then index = CreateMacro(macroname, SuperMacroPopupFrame.selectedIcon, nil, nil, false ); SuperMacroFrame_SelectMacro(index); elseif ( SuperMacroPopupFrame.mode == "newcharacter" ) then index = CreateMacro(macroname, SuperMacroPopupFrame.selectedIcon, nil, nil, true ); SuperMacroFrame_SelectMacro(index); elseif ( SuperMacroPopupFrame.mode == "newsuper" ) then index = CreateSuperMacro(macroname, texture, ''); SuperMacroFrame_SelectSuperMacro(index); elseif ( SuperMacroPopupFrame.mode == "edit" ) then if ( SM_VARS.tabShown=="regular" ) then index = EditMacro(SuperMacroFrame.selectedMacro, macroname, SuperMacroPopupFrame.selectedIcon); if ( GetMacroIndexByName(SuperMacroPopupFrame.oldname)==0 ) then SM_UpdateActionSpell(SuperMacroPopupFrame.oldname, "regular", ''); end SM_UpdateActionSpell(macroname, "regular", GetMacroInfo(index, "body")); SuperMacroFrame_SelectMacro(index); elseif ( SM_VARS.tabShown=="super" ) then local oldsuper=GetOrderedSuperMacroInfo(SuperMacroFrame.selectedSuper); if ( SM_SUPER[macroname] ) then macroname=SuperMacroPopupFrame.oldname; end index = EditSuperMacro(SuperMacroFrame.selectedSuper, macroname, texture); SuperMacroFrame_SelectSuperMacro(index); SuperMacro_UpdateAction(oldsuper, macroname); end end SuperMacroPopupFrame:Hide(); SuperMacroFrame_Update(); -- if edited name, use oldextend if ( oldextend ) then SuperMacroFrameExtendText:SetText(oldextend); elseif ( SameMacroName() ) then -- get extend with same name, else empty local text = SuperMacroGetExtend( GetMacroInfo( SameMacroName(),"name" ) ) ; if ( text ) then SuperMacroFrameExtendText:SetText( text ); end else SuperMacroFrameExtendText:SetText(""); end SuperMacroSaveExtend(); oldextend=nil; end function SuperMacroOptionsButton_OnClick() if ( SuperMacroOptionsFrame:IsVisible() ) then HideUIPanel(SuperMacroOptionsFrame); else ShowUIPanel(SuperMacroOptionsFrame); end end function SuperMacroFrame_SaveMacro() if ( SuperMacroFrame.textChanged and SuperMacroFrame.selectedMacro ) then EditMacro(SuperMacroFrame.selectedMacro, nil, nil, SuperMacroFrameText:GetText()); SuperMacroFrame.textChanged = nil; SM_UpdateActionSpell( GetMacroInfo(SuperMacroFrame.selectedMacro, "name"), "regular", SuperMacroFrameText:GetText()); end end function SuperMacroFrame_SaveSuperMacro() if ( SuperMacroFrame.textChanged and SuperMacroFrame.selectedSuper ) then local macroName = SelectedMacroName(); local macroTexture = SuperMacroFrameSelectedMacroSuperButtonIcon:GetTexture(); local macroBody = SuperMacroFrameSuperText:GetText(); SM_SUPER[macroName] = {macroName,macroTexture,macroBody}; SuperMacroFrame.textChanged = nil; SM_UpdateActionSpell(macroName, "super", macroBody); end end function SuperMacroFrame_OnEvent(event) if ( event=="TRADE_SKILL_SHOW") then if ( not old_SM_TradeSkillSkillButton_OnClick) then old_SM_TradeSkillSkillButton_OnClick = TradeSkillSkillButton_OnClick; TradeSkillSkillButton_OnClick = SM_TradeSkillSkillButton_OnClick; SM_TradeSkillItem_OnClick(); end end if ( event=="CRAFT_SHOW") then if ( not old_SM_CraftButton_OnClick) then old_SM_CraftButton_OnClick = CraftButton_OnClick; CraftButton_OnClick = SM_CraftButton_OnClick; SM_CraftItem_OnClick(); end end if ( event=="VARIABLES_LOADED" ) then if ( not SM_VARS.hideAction ) then SM_VARS.hideAction = 0; end if ( not SM_VARS.printColor ) then SM_VARS.printColor = PRINT_COLOR_DEF; end if ( not SM_VARS.macroTip1 ) then SM_VARS.macroTip1= 1; end if ( not SM_VARS.macroTip2 ) then SM_VARS.macroTip2= 0; end if ( not SM_VARS.minimap ) then SM_VARS.minimap = 1; end if ( not SM_VARS.replaceIcon ) then SM_VARS.replaceIcon = 1; end if ( not SM_VARS.checkCooldown ) then SM_VARS.checkCooldown = 1; end if ( not SM_VARS.tabShown ) then SM_VARS.tabShown = "regular"; end if ( SM_VARS.tabShown=="regular" ) then SuperMacroFrame.selectedTab = 1; PanelTemplates_UpdateTabs(this); elseif ( SM_VARS.tabShown=="super" ) then SuperMacroFrame.selectedTab = 2; PanelTemplates_UpdateTabs(this); end HideActionText(); ToggleSMMinimap(); SuperMacroRunScriptExtend(); SuperMacroFrame.extendChanged=nil; SM_ORDERED=SortSuperMacroList(); local player=UnitName("player").." of "..GetRealmName(); if ( not SM_ACTION_SUPER[player] ) then SM_ACTION_SUPER[player]={}; end SM_ACTION=SM_ACTION_SUPER[player]; SM_UpdateActionSpell(); -- update alias replacement function -- ASF aka Alias-Spellchecker-Filter if (ReplaceAlias and ASFOptions.aliasOn) then SM_InsertAliasFunction(ReplaceAlias); end -- ChatAlias if (CA_ParseMessage) then SM_InsertAliasFunction(ReplaceAlias, -1); -- this messes up newlines, so should not run during RunMacro end -- for any other alias addons, do tinsert(SM_AliasFunctions, your_function) inside your mod end if ( event=="PLAYER_ENTERING_WORLD" ) then SM_UpdateActionSpell(); end if ( event=="PLAYER_LEAVING_WORLD" ) then SM_ACTION_SUPER[player]=SM_ACTION; end end function RunMacro(index) -- close edit boxes, then enter body line by line if ( SuperMacroFrame_SaveMacro ) then SuperMacroFrame_SaveMacro(); end if ( MacroFrame_SaveMacro ) then MacroFrame_SaveMacro(); end local body; if ( type(index) == "number" ) then body = GetMacroInfo(index, "body"); elseif ( type(index) == "string" ) then body = GetMacroInfo(GetMacroIndexByName(index),"body"); end if ( not body ) then return; end if ( ChatFrameEditBox:IsVisible() ) then ChatEdit_OnEscapePressed(ChatFrameEditBox); end body = SM_ReplaceAlias(body); --SM_MacroRunning = true; while ( strlen(body)>0 ) do local block, line; body, block, line=FindBlock(body); if ( block ) then RunScript(block); else RunLine(line); end end --SM_MacroRunning = nil; end Macro=RunMacro; function RunSuperMacro(index) if ( SuperMacroFrame_SaveSuperMacro ) then SuperMacroFrame_SaveSuperMacro(); end local _,body=nil; if ( type(index)=="number") then _,_,body = GetOrderedSuperMacroInfo(index); elseif ( type(index) == "string" ) then body = GetSuperMacroInfo(index,"body"); end if ( not body ) then return; end if ( ChatFrameEditBox:IsVisible() ) then ChatEdit_OnEscapePressed(ChatFrameEditBox); end body = SM_ReplaceAlias(body); --SM_MacroRunning = true; while ( strlen(body)>0 ) do local block, line; body, block, line=FindBlock(body); if ( block ) then RunScript(block); else RunLine(line); end end --SM_MacroRunning = nil; end function FindBlock(body) local a,b,block=strfind(body,"^/script (%-%-%-%-%[%[.-%-%-%-%-%]%])[\n]*"); if ( block ) then body=strsub(body,b+1); return body, block; end local a,b,line=strfind(body,"^([^\n]*)[\n]*"); if ( line ) then body=strsub(body,b+1); return body, nil, line; end end function RunBody(text) local body=text; local length = strlen(body); for w in string.gfind(body, "[^\n]+") do RunLine(w); end end function RunLine(...) -- execute a line in a macro -- if script or cast, then rectify and RunScript -- else send to chat edit box for k=1,arg.n do local text=arg[k]; -- replace aliases text = SM_ReplaceAlias(text, -1); if ( string.find(text, "^/cast") ) then local i, book = SM_FindSpell(gsub(text,"^%s*/cast%s*(%w.*[%w%)])%s*$","%1")); if ( i ) then CastSpell(i,book); end else if ( string.find(text,"^/script ")) then RunScript(gsub(text,"^/script ","")); else text = gsub( text, "\n", ""); -- cannot send newlines, will disconnect ChatFrameEditBox:SetText(text); ChatEdit_SendText(ChatFrameEditBox); end end end -- for end -- RunLine() function SM_ReplaceAlias(body, after) local size, step; if ( after==-1 ) then size, step = SM_AliasFunctions.low, -1; else size, step = SM_AliasFunctions.high, 1; end for i=step, size, step do body = SM_AliasFunctions[i](body); end return body; end function SM_InsertAliasFunction(func, pos) if ( pos==-1 ) then SM_AliasFunctions.low = SM_AliasFunctions.low - 1; SM_AliasFunctions[SM_AliasFunctions.low]=func; return SM_AliasFunctions.low; else SM_AliasFunctions.high = SM_AliasFunctions.high + 1; SM_AliasFunctions[SM_AliasFunctions.high]=func; return SM_AliasFunctions.high; end end function SM_FindSpell(spell) local s = gsub(spell, "%s*(.-)%s*%(.*","%1"); local r; local num = tonumber(gsub( spell, "%D*(%d+)%D*", "%1"),10); if ( string.find(spell, "%(%s*[Rr]acial")) then r = "racial" elseif ( string.find(spell, "%(%s*[Ss]ummon")) then r = "summon" elseif ( string.find(spell, "%(%s*[Aa]pprentice")) then r = "apprentice" elseif ( string.find(spell, "%(%s*[Jj]ourneyman")) then r = "journeyman" elseif ( string.find(spell, "%(%s*[Ee]xpert")) then r = "expert" elseif ( string.find(spell, "%(%s*[Aa]rtisan")) then r = "artisan" elseif ( string.find(spell, "%(%s*[Mm]aster")) then r = "master" elseif ( string.find(spell, "[Rr]ank%s*%d+") and num and num > 0) then r = gsub(spell, ".*%(.*[Rr]ank%s*(%d+).*", "Rank "..num); else r = "" end return FindSpell(s,r); end function FindSpell(spell, rank) local i = 1; local booktype = { "spell", "pet", }; --local booktype = "spell"; local s,r; local ys, yr; for k, book in booktype do while spell do s, r = GetSpellName(i,book); if ( not s ) then i = 1; break; end if ( string.lower(s) == string.lower(spell)) then ys=true; end if ( (r == rank) or (r and rank and string.lower(r) == string.lower(rank))) then yr=true; end if ( rank=='' and ys and (not GetSpellName(i+1, book) or string.lower(GetSpellName(i+1, book)) ~= string.lower(spell) )) then yr = true; -- use highest spell rank if omitted end if ( ys and yr ) then return i,book; end i=i+1; ys = nil; yr = nil; end end return; end function SuperMacroSaveExtendButton_OnClick() SuperMacroSaveExtend(); SuperMacroRunScriptExtend(); end function SuperMacroDeleteExtendButton_OnClick() SuperMacroSaveExtend(SelectedMacroName(),1); SuperMacroRunScriptExtend(); end function SuperMacroSaveExtend(macro, delete) local text=SuperMacroFrameExtendText:GetText(); if ( delete ) then text = nil; end if ( not macro ) then macro = SelectedMacroName(); end if ( macro ) then if ( text and text~="" ) then SM_EXTEND[macro]=text; else SM_EXTEND[macro]=nil; if ( macro == SelectedMacroName() ) then SuperMacroFrameExtendText:SetText(''); end end end SuperMacroFrame.extendChanged=nil; SuperMacroFrameExtendText:ClearFocus(); end function SuperMacroGetExtend(macro) return SM_EXTEND[macro]; end function SuperMacroRunScriptExtend() for m,e in pairs(SM_EXTEND) do if ( e ) then RunScript(e); end end end function SuperMacroDeleteButton_OnClick() -- check other macros with same name to see if save extend local macro=GetMacroInfo(SuperMacroFrame.selectedMacro,"name"); if ( SameMacroName()==false ) then SuperMacroSaveExtend(macro,1); -- delete extend end DeleteMacro(SuperMacroFrame.selectedMacro); SuperMacroFrame_OnLoad(); SuperMacroFrame_Update(); local name = GetMacroInfo(1,"name"); oldextend = SM_EXTEND[name]; if ( oldextend ) then SuperMacroFrameExtendText:SetText(oldextend); end oldextend = nil; SuperMacroFrameText:ClearFocus(); end function SuperMacroDeleteSuperButton_OnClick() DeleteSuperMacro(SuperMacroFrame.selectedSuper); --SuperMacroFrame_OnLoad(); SuperMacroFrame_Update(); local name = GetOrderedSuperMacroInfo(1); SuperMacroFrameSuperText:ClearFocus(); end function SameMacroName(macroindex) if ( not macroindex and SuperMacroFrame.selectedMacro ) then macroindex = SuperMacroFrame.selectedMacro; else return; -- error check for nil, no macro selected end local macro=GetMacroInfo(macroindex,"name"); local prevmacro, nextmacro = GetMacroInfo(macroindex-1,"name"), GetMacroInfo(macroindex+1,"name"); if ( prevmacro == macro ) then return macroindex-1; elseif ( nextmacro == macro ) then return macroindex+1; else return false; -- must check "==false" -- don't check "not SameMacroName()" unless error check or no macro selected end end function SelectedMacroName() return SuperMacroFrameSelectedMacroName:GetText(); end local oldGetMacroInfo=GetMacroInfo; function GetMacroInfo(index, code) if ( not index ) then return; end -- code can be "name", "texture", "body", "islocal" local a={}; a.name,a.texture,a.body,a.islocal=oldGetMacroInfo(index); if (not code) then return a.name,a.texture,a.body,a.islocal; else return a[code]; end end function SetActionMacro( actionid , macro ) local macroid = GetMacroIndexByName( macro ) if ( macroid and actionid > 0 and actionid <= 120 ) then PickupAction( actionid ); PickupMacro( macroid ); PlaceAction ( actionid ); end end function ToggleSMMinimap() if ( SM_VARS.minimap == 1 ) then SuperMacroMinimapButton:Show(); else SuperMacroMinimapButton:Hide(); end end function SM_UpdateAction() -- Update Macros on action bars local function doUpdate(button) if ( button ) then button:SetScript("OnLeave", SM_ActionButton_OnLeave); local oldscript=button:GetScript("OnClick"); button:SetScript("OnClick", function() if ( not SM_ActionButton_OnClick() ) then oldscript(); end end); -- refresh buttons on load local macroName = getglobal(button:GetName().."Name") and getglobal(button:GetName().."Name"):GetText(); if ( macroName ) then local macroID = GetMacroIndexByName(macroName); if ( macroID ) then local name, texture, body, isLocal = GetMacroInfo(macroID); EditMacro(macroID, nil, nil, body, isLocal); end end end end for i=1,12 do doUpdate(getglobal("ActionButton"..i)); doUpdate(getglobal("BonusActionButton"..i)); doUpdate(getglobal("MultiBarBottomLeftButton"..i)); doUpdate(getglobal("MultiBarBottomRightButton"..i)); doUpdate(getglobal("MultiBarRightButton"..i)); doUpdate(getglobal("MultiBarLeftButton"..i)); end if ( FUActionButton1 ) then for i=1,72 do doUpdate(getglobal("FUActionButton"..i)); end end ---[[ if ( DAB_ActionButton_1 ) then for i=1, 120 do doUpdate(getglobal("DAB_ActionButton_"..i)); end end --]] end function GetNumSuperMacros() return getn(SM_ORDERED); end function GetSuperMacroInfo( superName, code) if ( not superName or not SM_SUPER[superName] ) then return; end -- code can be "name", "texture", "body" local a={}; a.name,a.texture,a.body=unpack(SM_SUPER[superName]); if (not code) then return a.name,a.texture,a.body; else return a[code]; end end function SortSuperMacroList() -- sort SM_SUPER into ordered list local a={}; for n in pairs(SM_SUPER) do table.insert(a, n); end table.sort(a, atoz); return a; end function GetOrderedSuperMacroInfo( id ) if ( not SM_ORDERED ) then SM_ORDERED=SortSuperMacroList(); end if ( not SM_SUPER[SM_ORDERED[id] ] ) then return; end return unpack(SM_SUPER[SM_ORDERED[id] ]); end function GetOrderedSuperMacro( name ) for i,v in SM_ORDERED do if ( v==name ) then return i; end end end function CreateSuperMacro( name, texture, body ) if ( not SM_SUPER[name] ) then SM_SUPER[name]={name, texture, body or ''}; end SM_UpdateActionSpell( name, "super", body); SM_ORDERED=SortSuperMacroList(); return GetOrderedSuperMacro(name); end function EditSuperMacro( id, name, texture) local oldMacro, oldTexture, oldBody=GetOrderedSuperMacroInfo(id); if ( oldMacro~=name ) then SM_SUPER[oldMacro]=nil; SM_UpdateActionSpell( oldMacro, "super", nil); end SM_SUPER[name]={ name, texture, oldBody}; SM_UpdateActionSpell( name, "super", oldBody); SM_ORDERED=SortSuperMacroList(); return GetOrderedSuperMacro(name); end function DeleteSuperMacro( macro ) local id=macro; if ( type(macro)=="number" ) then macro=GetOrderedSuperMacroInfo(macro); else id=GetOrderedSuperMacro(macro); end SM_SUPER[macro]=nil; SM_ORDERED=SortSuperMacroList(); if ( GetNumSuperMacros()==0 ) then id=nil; else id=id>1 and id-1 or 1; end SuperMacroFrame_SelectSuperMacro(id); end function SM_LoadMacroIcons() local icon={}; for i=1,GetNumMacroIcons() do local texture=GetMacroIconInfo(i); icon[texture]=i; end return icon; end function SM_UpdateActionSpell( macroname, macrotype, body) -- SM_ACTION_SPELL={} -- SM_ACTION_SPELL.regular={} -- SM_ACTION_SPELL.super={} if ( not macroname ) then -- update all macros for i=1, 36 do local name,_,body=GetMacroInfo(i); if ( name ) then SM_UpdateActionSpell(name, "regular", body); end end for i=1, GetNumSuperMacros() do local name,_,body=GetOrderedSuperMacroInfo(i); SM_UpdateActionSpell(name, "super", body); end return; end --macrotype is "regular" or "super" if ( macrotype~="regular" and macrotype~="super" ) then macrotype="regular"; end SM_ACTION_SPELL[macrotype][macroname]={}; local id, book, texture, count, spell=FindFirstSpell(body); if ( id ) then SM_ACTION_SPELL[macrotype][macroname].type="spell"; spell=count; else id, book, texture, count, spell=FindFirstItem(body); if ( id ) then SM_ACTION_SPELL[macrotype][macroname].type="item"; end end if ( not id ) then SM_ACTION_SPELL[macrotype][macroname]=nil; return; end SM_ACTION_SPELL[macrotype][macroname].spell=spell; SM_ACTION_SPELL[macrotype][macroname].texture=texture; end function SM_GetActionSpell(macroname, macrotype) if ( macrotype and macrotype~="regular" ) then macrotype="super"; else macrotype="regular"; end if ( not SM_ACTION_SPELL[macrotype][macroname] ) then return nil; end local actiontype=SM_ACTION_SPELL[macrotype][macroname].type; local spell=SM_ACTION_SPELL[macrotype][macroname].spell; local texture=SM_ACTION_SPELL[macrotype][macroname].texture; return actiontype, spell, texture; end