You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

548 lines
15 KiB

VUHDO_IS_SFX_ENABLED = true;
VUHDO_IS_SOUND_ERRORSPEECH_ENABLED = true;
local VUHDO_RAID;
local VUHDO_RAID_NAMES;
local VUHDO_SPELL_CONFIG;
local VUHDO_SPELLS;
local VUHDO_SPELL_CONFIG;
local GetMacroIndexByName = GetMacroIndexByName;
local GetMacroInfo = GetMacroInfo;
local GetSpellBookItemTexture = GetSpellBookItemTexture;
local VUHDO_replaceMacroTemplates;
local gsub = gsub;
local twipe = table.wipe;
local format = format;
local sEmpty = { };
local sIsAnyAutoFireConfigured;
local _;
CreateFrame("Button", "VDSTB", nil, "SecureActionButtonTemplate"):SetAttribute("type", "stop"); -- Calls SpellStopTargeting
local sStopTargetText = "/click VDSTB LeftButton\n";
function VUHDO_macroFactoryInitLocalOverrides()
VUHDO_RAID = _G["VUHDO_RAID"];
VUHDO_RAID_NAMES = _G["VUHDO_RAID_NAMES"];
VUHDO_SPELL_CONFIG = _G["VUHDO_SPELL_CONFIG"];
VUHDO_SPELLS = _G["VUHDO_SPELLS"];
VUHDO_SPELL_CONFIG = _G["VUHDO_SPELL_CONFIG"];
VUHDO_replaceMacroTemplates = _G["VUHDO_replaceMacroTemplates"];
sIsAnyAutoFireConfigured = VUHDO_SPELL_CONFIG["IS_AUTO_FIRE"] and (
VUHDO_SPELL_CONFIG["IS_FIRE_TRINKET_1"]
or VUHDO_SPELL_CONFIG["IS_FIRE_TRINKET_2"]
or VUHDO_SPELL_CONFIG["IS_FIRE_GLOVES"]
or (VUHDO_SPELL_CONFIG["IS_FIRE_CUSTOM_1"] and not VUHDO_strempty(VUHDO_SPELL_CONFIG["FIRE_CUSTOM_1_SPELL"]))
or (VUHDO_SPELL_CONFIG["IS_FIRE_CUSTOM_2"] and not VUHDO_strempty(VUHDO_SPELL_CONFIG["FIRE_CUSTOM_2_SPELL"]))
);
end
local VUHDO_RAID_MACRO_CACHE = { };
local VUHDO_TARGET_MACRO_CACHE = { };
local sFireText = nil;
--
function VUHDO_resetMacroCaches()
twipe(VUHDO_RAID_MACRO_CACHE);
twipe(VUHDO_TARGET_MACRO_CACHE);
sFireText = nil;
end
--
local function VUHDO_isFireSomething(anAction)
return sIsAnyAutoFireConfigured and (VUHDO_SPELL_CONFIG["IS_FIRE_HOT"] or not (VUHDO_SPELLS[anAction] or sEmpty)["isHot"]);
end
--
local tInstant, tModi2, tCustomUnit;
local function VUHDO_getInstantFireText(aSlotNum)
tInstant = VUHDO_SPELL_CONFIG["FIRE_CUSTOM_" .. aSlotNum .. "_SPELL"];
if VUHDO_SPELL_CONFIG["IS_FIRE_CUSTOM_" .. aSlotNum] and not VUHDO_strempty(tInstant) then
tCustomUnit = VUHDO_SPELL_CONFIG["custom" .. aSlotNum .. "Unit"] or ""
if VUHDO_SPELL_CONFIG["IS_FIRE_OUT_FIGHT"] then
if (VUHDO_SPELLS[tInstant] or sEmpty)["noselftarget"] then
tModi2 = " ";
else
tModi2 = " " .. "[" .. tCustomUnit .. ",exists]" .. " ";
end
else
if (VUHDO_SPELLS[tInstant] or sEmpty)["noselftarget"] then
tModi2 = " [combat] ";
else
tModi2 = " " .. "[combat," .. tCustomUnit .. ",exists]" .. " ";
end
end
return "/use" .. tModi2 .. tInstant .. "\n";
else
return "";
end
end
--
local tModi;
local function VUHDO_getFireText(anAction)
if VUHDO_isFireSomething(anAction) then
if not sFireText then
sFireText = "";
-- FIXME: Patch 10.0.0 is causing game stutters when console commands are run
if VUHDO_IS_SFX_ENABLED then
--sFireText = sFireText .. "/console Sound_EnableSFX 0\n";
end
-- FIXME: Patch 10.0.0 is causing game stutters when console commands are run
if VUHDO_IS_SOUND_ERRORSPEECH_ENABLED then
--sFireText = sFireText .. "/console Sound_EnableErrorSpeech 0\n";
end
tModi = VUHDO_SPELL_CONFIG["IS_FIRE_OUT_FIGHT"] and " " or " [combat] ";
if VUHDO_SPELL_CONFIG["IS_FIRE_GLOVES"] then
sFireText = sFireText .. "/use".. tModi .."10\n";
end
if VUHDO_SPELL_CONFIG["IS_FIRE_TRINKET_1"] then
sFireText = sFireText .. "/use".. tModi .."13\n";
end
if VUHDO_SPELL_CONFIG["IS_FIRE_TRINKET_2"] then
sFireText = sFireText .. "/use".. tModi .."14\n";
end
-- Instant 1
sFireText = sFireText .. VUHDO_getInstantFireText(1);
-- Instant 2
sFireText = sFireText .. VUHDO_getInstantFireText(2);
-- Ton wieder an
-- FIXME: Patch 10.0.0 is causing game stutters when console commands are run
if VUHDO_IS_SOUND_ERRORSPEECH_ENABLED then
--sFireText = sFireText .. "/console Sound_EnableErrorSpeech 1\n";
end
-- FIXME: Patch 10.0.0 is causing game stutters when console commands are run
if VUHDO_IS_SFX_ENABLED then
--sFireText = sFireText .. "/console Sound_EnableSFX 1\n";
end
sFireText = sFireText .. "/run UIErrorsFrame:Clear()\n";
end
return sFireText;
else
return "";
end
end
--
local function VUHDO_getMacroPetUnit(aTarget)
if VUHDO_RAID[aTarget] and not VUHDO_RAID[aTarget]["isPet"] then
return VUHDO_RAID[aTarget]["petUnit"];
else
return nil;
end
end
--
local tFriendText;
local tEnemyText;
local tModiSpell;
local tMacroId, tMacroText;
local tLowerFriendly, tLowerHostile, tStopText;
local tIsNoHelp;
local function VUHDO_generateTargetMacroText(aTarget, aFriendlyAction, aHostileAction)
if not aFriendlyAction or not aHostileAction then return ""; end
tMacroId = GetMacroIndexByName(aHostileAction);
if tMacroId == 0 then
tMacroId = GetMacroIndexByName(aFriendlyAction);
end
if (tMacroId ~= 0) then
_, _, tMacroText = GetMacroInfo(tMacroId);
return tMacroText;
end
if VUHDO_SPELL_CONFIG["IS_CANCEL_CURRENT"] then
tStopText = "/stopcasting\n";
else
tStopText = "";
end
tLowerFriendly = strlower(aFriendlyAction);
tIsNoHelp = false;
if "target" == tLowerFriendly then
tFriendText = "/tar [noharm,@vuhdo]\n";
elseif "focus" == tLowerFriendly then
tFriendText = "/focus [noharm,@vuhdo]\n";
elseif "assist" == tLowerFriendly then
tFriendText = "/assist [noharm,@vuhdo]\n";
elseif #aFriendlyAction > 0 and GetSpellInfo(aFriendlyAction) then
if (VUHDO_SPELLS[aFriendlyAction] or sEmpty)["nohelp"] then
tModiSpell = "[@vuhdo] ";
tIsNoHelp = true;
else
tModiSpell = "[noharm,@vuhdo] ";
end
-- Legion introduced an Order Hall follower for Shamans which yields a mission reward
-- This reward is an item ambiguously named 'Healing Stream Totem'
-- Explicitly use '/cast' so that the 'Healing Stream Totem' spell is used instead
if tLowerFriendly == strlower(VUHDO_SPELL_ID.BUFF_HEALING_STREAM_TOTEM) then
tFriendText = "/cast ";
else
tFriendText = "/use ";
end
tFriendText = tFriendText .. tModiSpell .. aFriendlyAction .. "\n";
if VUHDO_SPELL_CONFIG["IS_AUTO_TARGET"] then
tFriendText = tFriendText .. "/tar [@vuhdo]\n";
end
else
tFriendText = "";
end
tLowerHostile = strlower(aHostileAction);
if tIsNoHelp then
tEnemyText = "";
elseif "target" == tLowerHostile then
tEnemyText = "/tar [harm,@vuhdo]";
elseif "focus" == tLowerHostile then
tEnemyText = "/focus [harm,@vuhdo]";
elseif "assist" == tLowerHostile then
tEnemyText = "/assist [harm,@vuhdo]";
elseif #aHostileAction > 0 and GetSpellInfo(aHostileAction) then
tEnemyText = "/use [harm,@vuhdo] " .. aHostileAction;
else
tEnemyText = "";
end
return sStopTargetText .. tStopText .. VUHDO_getFireText(aFriendlyAction) .. tFriendText .. tEnemyText;
end
--
local tIndex;
function VUHDO_buildTargetButtonMacroText(aTarget, aFriendlyAction, aHostileAction)
tIndex = aFriendlyAction .. "*" .. aHostileAction;
if not VUHDO_TARGET_MACRO_CACHE[tIndex] then
VUHDO_TARGET_MACRO_CACHE[tIndex] = VUHDO_generateTargetMacroText(aTarget, aFriendlyAction, aHostileAction);
end
return VUHDO_replaceMacroTemplates(VUHDO_TARGET_MACRO_CACHE[tIndex], aTarget);
end
--
local tPet;
function VUHDO_buildFocusMacroText(aTarget)
tPet = VUHDO_getMacroPetUnit(aTarget);
if tPet then
return format("/focus [@%s,help][@%s,help][@%s]", aTarget, tPet, aTarget);
else
return "/focus [@" .. aTarget .. "]";
end
end
--
local tPet;
function VUHDO_buildTargetMacroText(aTarget)
tPet = VUHDO_getMacroPetUnit(aTarget);
if tPet then
return format("/tar [@%s,help][@%s,help][@%s]", aTarget, tPet, aTarget);
else
return "/tar [@" .. aTarget .. "]";
end
end
--
local tPet;
function VUHDO_buildAssistMacroText(aTarget)
tPet = VUHDO_getMacroPetUnit(aTarget);
if tPet then
return format("/assist [@%s,help][@%s,help][@%s]", aTarget, tPet, aTarget);
else
return "/assist [@" .. aTarget .. "]";
end
end
--
function VUHDO_buildExtraActionButtonMacroText(aTarget)
return "/tar [@" .. aTarget .. "]\n/click ExtraActionButton1 LeftButton\n/targetlasttarget";
end
--
function VUHDO_buildMouseLookMacroText()
return "/run if IsMouselooking() then MouselookStop() else MouselookStart() end\n";
end
local VUHDO_PROHIBIT_HELP = {
[VUHDO_SPELL_ID.REBIRTH] = true,
[VUHDO_SPELL_ID.INTERCESSION] = true,
[VUHDO_SPELL_ID.REDEMPTION] = true,
[VUHDO_SPELL_ID.ABSOLUTION] = true,
[VUHDO_SPELL_ID.ANCESTRAL_SPIRIT] = true,
[VUHDO_SPELL_ID.ANCESTRAL_VISION] = true,
[VUHDO_SPELL_ID.REVIVE] = true,
[VUHDO_SPELL_ID.REVITALIZE] = true,
[VUHDO_SPELL_ID.RESURRECTION] = true,
[VUHDO_SPELL_ID.MASS_RESURRECTION] = true,
[VUHDO_SPELL_ID.RESUSCITATE] = true,
[VUHDO_SPELL_ID.REAWAKEN] = true,
[VUHDO_SPELL_ID.RAISE_ALLY] = true,
[VUHDO_SPELL_ID.RETURN] = true,
[VUHDO_SPELL_ID.MASS_RETURN] = true,
}
--
local tRezText;
local function VUHDO_getAutoBattleRezText(anIsKeyboard)
if ("DRUID" == VUHDO_PLAYER_CLASS or "PALADIN" == VUHDO_PLAYER_CLASS) and VUHDO_SPELL_CONFIG["autoBattleRez"] then
tRezText = "/use [dead,combat,@" .. (anIsKeyboard and "mouseover" or "vuhdo");
if VUHDO_SPELL_CONFIG["smartCastModi"] ~= "all" then
tRezText = tRezText .. ",mod:" .. VUHDO_SPELL_CONFIG["smartCastModi"];
end
tRezText = tRezText .. "] ";
if "DRUID" == VUHDO_PLAYER_CLASS then
tRezText = tRezText .. VUHDO_SPELL_ID.REBIRTH .. "\n";
elseif "PALADIN" == VUHDO_PLAYER_CLASS then
tRezText = tRezText .. VUHDO_SPELL_ID.INTERCESSION .. "\n";
end
else
tRezText = "";
end
return tRezText;
end
--
local tText;
local tModiSpell;
local tSpellPost;
local tVehicleCond;
local tStopText;
local tCastText;
local function VUHDO_generateRaidMacroTemplate(anAction, anIsKeyboard, aTarget, aPet)
if VUHDO_SPELL_CONFIG["IS_CANCEL_CURRENT"] then
tStopText = "/stopcasting\n";
else
tStopText = "";
end
tText = sStopTargetText .. tStopText .. VUHDO_getFireText(anAction);
if (VUHDO_SPELLS[anAction] or sEmpty)["nohelp"] or VUHDO_PROHIBIT_HELP[anAction] then
tModiSpell = "";
else
tModiSpell = "help,nodead,";
end
tSpellPost = VUHDO_getAutoBattleRezText(anIsKeyboard);
-- Legion introduced an Order Hall follower for Shamans which yields a mission reward
-- This reward is an item ambiguously named 'Healing Stream Totem'
-- Explicitly use '/cast' so that the 'Healing Stream Totem' spell is used instead
if strlower(anAction) == strlower(VUHDO_SPELL_ID.BUFF_HEALING_STREAM_TOTEM) then
tCastText = "/cast ";
else
tCastText = "/use ";
end
if anIsKeyboard then
tText = tText .. tCastText .. "[" .. tModiSpell .. "@mouseover] " .. anAction .. "\n";
tText = tText .. tSpellPost;
else
if aPet and VUHDO_SPELL_ID.REBIRTH ~= anAction and VUHDO_SPELL_ID.INTERCESSION ~= anAction then
tVehicleCond = "[nodead,help,@vdpet]";
else
tVehicleCond = "";
end
-- Blizzard has broken the way vehicles work for the Antoran High Command encounter
-- For now just disable vehicle support (note: this breaks encounters like Malygos)
--tText = tText .. tCastText .. "[" .. tModiSpell .. "nounithasvehicleui,@vuhdo]" .. tVehicleCond .. " " .. anAction .. "\n";
tText = tText .. tCastText .. "[" .. tModiSpell .. "@vuhdo]" .. tVehicleCond .. " " .. anAction .. "\n";
tText = tText .. tSpellPost;
if aPet then
tText = tText .. "/tar [unithasvehicleui,@vdpet]\n";
end
if VUHDO_SPELL_CONFIG["IS_AUTO_TARGET"] then
tText = tText .. "/tar [@vuhdo]\n";
else
tText = tText .. "/tar [harm,@vuhdo]\n";
end
end
return tText;
end
--
local tIndex;
local tPet;
local tText;
function VUHDO_buildMacroText(anAction, anIsKeyboard, aTarget)
tPet = VUHDO_getMacroPetUnit(aTarget);
if anIsKeyboard then
tIndex = anAction .. (tPet and (anAction .. "X") or (anAction .. "K"));
else
tIndex = anAction .. (tPet and (anAction .. "P") or anAction);
end
if not VUHDO_RAID_MACRO_CACHE[tIndex] then
VUHDO_RAID_MACRO_CACHE[tIndex] = VUHDO_generateRaidMacroTemplate(anAction, anIsKeyboard, aTarget, tPet);
end
tText = VUHDO_replaceMacroTemplates(VUHDO_RAID_MACRO_CACHE[tIndex], aTarget);
--VUHDO_DEBUG[tIndex] = tText;
if anIsKeyboard and #tText > 256 then
VUHDO_Msg(VUHDO_I18N_MACRO_KEY_ERR_1 .. anAction .. " (" .. #tText .. VUHDO_I18N_MACRO_KEY_ERR_2, 1, 0.3, 0.3);
end
return tText;
end
--
local tText;
function VUHDO_buildPurgeMacroText(anAction, aTarget)
tText = format("/use [@%s] %s\n", aTarget, anAction);
if VUHDO_SPELL_CONFIG["IS_AUTO_TARGET"] then
tText = format("%s/tar [@%s]\n", tText, aTarget);
end
return tText;
end
-- Catch players who have released spirit
local tText;
function VUHDO_buildRezMacroText(anAction, aTarget)
tText = format("/tar [@%s]\n", aTarget);
tText = format("%s/use %s\n", tText, anAction);
if not VUHDO_SPELL_CONFIG["IS_AUTO_TARGET"] then
tText = format("%s/targetlasttarget\n", tText);
end
return tText;
end
--
local tName;
local tIndex;
local tNumLocal;
local function VUHDO_createOrUpdateMacro(aMacroNum, aMacroText, aSpell)
tName = "VuhDoAuto" .. aMacroNum;
tIndex = GetMacroIndexByName(tName);
if tIndex == 0 then
_, tNumLocal = GetNumMacros();
if tNumLocal >= 18 then
VUHDO_Msg(VUHDO_I18N_MACRO_NUM_ERR .. aSpell, 1, 0.4, 0.4);
return nil;
end
return CreateMacro(tName, "Spell_Holy_GreaterHeal", aMacroText, true, nil);
else
return EditMacro(tIndex, tName, "Spell_Holy_GreaterHeal", aMacroText, true, nil)
end
end
--
function VUHDO_initKeyboardMacros()
local tBindingName;
local tMacroId;
local tSpell;
local tBody;
local tKey1, tKey2;
local tBindPrefix = "VUHDO_KEY_ASSIGN_";
VUHDO_IS_SFX_ENABLED = tonumber(GetCVar("Sound_EnableSFX")) == 1;
VUHDO_IS_SOUND_ERRORSPEECH_ENABLED = tonumber(GetCVar("Sound_EnableErrorSpeech")) == 1;
if not VUHDO_SPELLS_KEYBOARD then return; end
ClearOverrideBindings(VuhDo);
for tCnt = 1, 16 do
tSpell = VUHDO_SPELLS_KEYBOARD[format("SPELL%d", tCnt)];
tBindingName = format("%s %d", VUHDO_I18N_MOUSE_OVER_BINDING, tCnt);
if VUHDO_strempty(tSpell) then
tBindingName = format("%s\n|cff505050%s|r", tBindingName, VUHDO_I18N_UNASSIGNED);
else
tBindingName = format("%s\n(|cff%s00%s|r)", tBindingName, VUHDO_isSpellKnown(tSpell) and "00ff" or "ff00", tSpell);
end
_G[format("BINDING_NAME_%s%d", tBindPrefix, tCnt)] = tBindingName;
tKey1, tKey2 = GetBindingKey(tBindPrefix .. tCnt);
if not VUHDO_strempty(tSpell) and (tKey1 or tKey2) then
tBody = VUHDO_buildMacroText(tSpell, true, nil);
tMacroId = VUHDO_createOrUpdateMacro(tCnt, tBody, tSpell);
if tMacroId then
if tKey1 then SetOverrideBindingMacro(VuhDo, true, tKey1, tMacroId); end
if tKey2 then SetOverrideBindingMacro(VuhDo, true, tKey2, tMacroId); end
end
else
DeleteMacro(format("VuhDoAuto%d", tCnt));
end
end
-- Buff watch smart cast binding
tKey1, tKey2 = GetBindingKey(tBindPrefix .. "SMART_BUFF");
if tKey1 then SetOverrideBindingClick(VuhDo, true, tKey1, "VuhDoSmartCastGlassButton", "LeftButton"); end
if tKey2 then SetOverrideBindingClick(VuhDo, true, tKey2, "VuhDoSmartCastGlassButton", "LeftButton"); end
end