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.

472 lines
15 KiB

local _;
local VUHDO_RAID_NAMES;
local VUHDO_RAID;
local VUHDO_BUFF_REMOVAL_SPELLS;
local VUHDO_SPELL_ASSIGNMENTS;
local VUHDO_CONFIG;
local VUHDO_buildMacroText;
local VUHDO_buildTargetButtonMacroText;
local VUHDO_buildTargetMacroText;
local VUHDO_buildFocusMacroText;
local VUHDO_buildAssistMacroText;
local VUHDO_buildExtraActionButtonMacroText;
local VUHDO_buildMouseLookMacroText;
local VUHDO_replaceMacroTemplates;
local VUHDO_isActionValid;
local VUHDO_isSpellKnown;
local GetMacroIndexByName = GetMacroIndexByName;
local GetMacroInfo = GetMacroInfo;
local GetSpellBookItemTexture = GetSpellBookItemTexture;
local UnitIsDeadOrGhost = UnitIsDeadOrGhost;
local gsub = gsub;
local GetCursorInfo = GetCursorInfo;
local GetShapeshiftForm = GetShapeshiftForm;
local InCombatLockdown = InCombatLockdown;
local pairs = pairs;
local strlower = strlower;
local format = format;
local sIsCliqueCompat;
function VUHDO_keySetupInitLocalOverrides()
VUHDO_RAID_NAMES = _G["VUHDO_RAID_NAMES"];
VUHDO_RAID = _G["VUHDO_RAID"];
VUHDO_BUFF_REMOVAL_SPELLS = _G["VUHDO_BUFF_REMOVAL_SPELLS"];
VUHDO_SPELL_ASSIGNMENTS = _G["VUHDO_SPELL_ASSIGNMENTS"];
VUHDO_CONFIG = _G["VUHDO_CONFIG"];
VUHDO_buildMacroText = _G["VUHDO_buildMacroText"];
VUHDO_buildTargetButtonMacroText = _G["VUHDO_buildTargetButtonMacroText"];
VUHDO_buildTargetMacroText = _G["VUHDO_buildTargetMacroText"];
VUHDO_buildFocusMacroText = _G["VUHDO_buildFocusMacroText"];
VUHDO_buildAssistMacroText = _G["VUHDO_buildAssistMacroText"];
VUHDO_buildExtraActionButtonMacroText = _G["VUHDO_buildExtraActionButtonMacroText"];
VUHDO_buildMouseLookMacroText = _G["VUHDO_buildMouseLookMacroText"];
VUHDO_replaceMacroTemplates = _G["VUHDO_replaceMacroTemplates"];
VUHDO_isActionValid = _G["VUHDO_isActionValid"];
VUHDO_isSpellKnown = _G["VUHDO_isSpellKnown"];
sIsCliqueCompat = VUHDO_CONFIG["IS_CLIQUE_COMPAT_MODE"];
end
local VUHDO_REZ_SPELLS_NAMES = {
[VUHDO_SPELL_ID.REDEMPTION] = true,
[VUHDO_SPELL_ID.ABSOLUTION] = true,
[VUHDO_SPELL_ID.INTERCESSION] = true,
[VUHDO_SPELL_ID.ANCESTRAL_SPIRIT] = true,
[VUHDO_SPELL_ID.ANCESTRAL_VISION] = true,
[VUHDO_SPELL_ID.REVIVE] = true,
[VUHDO_SPELL_ID.REBIRTH] = 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.RETURN] = true,
[VUHDO_SPELL_ID.MASS_RETURN] = true,
};
local tUnit, tInfo, tIdent;
local tButtonName;
local tMacroId, tMacroText;
local tActionLow;
local tInvalidGroup = { ["group"] = -1 };
local function _VUHDO_setupHealButtonAttributes(aModiKey, aButtonId, anAction, aButton, anIsTgButton, anIndex)
tUnit = aButton["raidid"];
tActionLow = strlower(anAction);
if "assist" == tActionLow then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId, VUHDO_buildAssistMacroText(tUnit));
elseif "focus" == tActionLow then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId, VUHDO_buildFocusMacroText(tUnit));
elseif "target" == tActionLow then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId, VUHDO_buildTargetMacroText(tUnit));
elseif "extraactionbutton" == tActionLow then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId, VUHDO_buildExtraActionButtonMacroText(tUnit));
elseif "mouselook" == tActionLow then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId, VUHDO_buildMouseLookMacroText());
elseif "menu" == tActionLow or "tell" == tActionLow then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, nil);
elseif "dropdown" == tActionLow then
aButton:SetAttribute(aModiKey .."type" .. aButtonId, "VUHDO_contextMenu");
VUHDO_contextMenu = function()
tUnit = aButton["raidid"];
local tName, tNumber, tMenu;
if UnitIsUnit(tUnit, "player") then
tMenu = "SELF";
elseif UnitIsUnit(tUnit, "vehicle") then
tMenu = "VEHICLE";
elseif UnitIsUnit(tUnit, "pet") then
tMenu = "PET";
elseif UnitIsPlayer(tUnit) then
tInfo = VUHDO_RAID[tUnit];
tName = tInfo["name"];
tNumber = tInfo["number"];
if UnitInRaid(tUnit) then
tMenu = "RAID_PLAYER";
elseif UnitInParty(tUnit) then
tMenu = "PARTY";
else
tMenu = "PLAYER";
end
else
tMenu = "TARGET";
tName = RAID_TARGET_ICON;
end
UIDropDownMenu_SetInitializeFunction(VuhDoUnitButtonDropDown,
function(self)
if tMenu then
UnitPopup_ShowMenu(self, tMenu, tUnit, tName, tNumber);
end
end
);
UIDropDownMenu_SetDisplayMode(VuhDoUnitButtonDropDown, "MENU");
ToggleDropDownMenu(1, nil, VuhDoUnitButtonDropDown, "cursor", 0, 0);
end
aButton["VUHDO_contextMenu"] = VUHDO_contextMenu;
else
anAction = VUHDO_REPLACE_SPELL_NAME[anAction] or anAction;
if VUHDO_NATIVE_ASSIGN_SPELLS[anAction] then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "spell");
aButton:SetAttribute(aModiKey .. "spell" .. aButtonId, anAction);
elseif VUHDO_isSpellKnown(anAction) or VUHDO_IN_COMBAT_RELOG then -- Spells may not be initialized yet
-- Dead players do not trigger "help/noharm" conditionals
if VUHDO_REZ_SPELLS_NAMES[anAction] then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId,
VUHDO_buildRezMacroText(anAction, tUnit));
return;
-- Cleansing charmed players is an offensive thing to do
elseif VUHDO_BUFF_REMOVAL_SPELLS[anAction] then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId,
VUHDO_buildPurgeMacroText(anAction, tUnit));
return;
else
-- build a spell macro
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId,
VUHDO_buildMacroText(anAction, false, tUnit));
end
else
tMacroId = GetMacroIndexByName(anAction);
if tMacroId ~= 0 then -- Macro?
_, _, tMacroText = GetMacroInfo(tMacroId);
tMacroText = VUHDO_replaceMacroTemplates(tMacroText, tUnit);
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId, tMacroText);
elseif IsUsableItem(anAction) then -- Item?
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "item");
aButton:SetAttribute(aModiKey .. "item" .. aButtonId, anAction);
else -- we don't know, assume it's a spell
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "spell");
aButton:SetAttribute(aModiKey .. "spell" .. aButtonId, anAction);
end
end
end
end
--
local tUnit;
local tHostSpell;
local tSpellInfo;
local tActionLow;
local function VUHDO_setupHealButtonAttributes(aModiKey, aButtonId, anAction, aButton, anIsTgButton, anIndex)
tUnit = aButton["raidid"];
tActionLow = strlower(anAction);
if anIsTgButton or tUnit == "focus" or (tUnit == "target" and "dropdown" ~= tActionLow) or VUHDO_isBossUnit(tUnit) then
if not anIndex then
tSpellInfo = VUHDO_HOSTILE_SPELL_ASSIGNMENTS[VUHDO_KEYS_MODIFIER[aModiKey] .. aButtonId];
tHostSpell = tSpellInfo ~= nil and tSpellInfo[3] or "";
else
tHostSpell = VUHDO_SPELLS_KEYBOARD["HOSTILE_WHEEL"][anIndex][3];
end
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, "macro");
if (tHostSpell or "") ~= "" or (tActionLow or "") ~= "" then
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId,
VUHDO_buildTargetButtonMacroText(tUnit, tActionLow, tHostSpell));
else
aButton:SetAttribute(aModiKey .. "macrotext" .. aButtonId, nil);
end
return;
end
if (tActionLow or "") == "" then
aButton:SetAttribute(aModiKey .. "type" .. aButtonId, nil);
return;
else
_VUHDO_setupHealButtonAttributes(aModiKey, aButtonId, anAction, aButton, anIsTgButton, anIndex);
end
end
--
local tString, tAssignIdx, tFriendSpell, tHostSpell;
local function VUHDO_getWheelDefString()
tString = "";
for tIndex, tValue in pairs(VUHDO_WHEEL_BINDINGS) do
tAssignIdx = VUHDO_WHEEL_INDEX_BINDING[tIndex];
tFriendSpell = VUHDO_SPELLS_KEYBOARD["HOSTILE_WHEEL"][tAssignIdx][3];
tHostSpell = VUHDO_SPELLS_KEYBOARD["WHEEL"][tAssignIdx][3];
if #tFriendSpell > 0 or #tHostSpell > 0 then
tString = format("%sself:SetBindingClick(0, \"%s\", self:GetName(), \"w%d\");", tString, tValue, tIndex);
end
end
return tString;
end
--
local tString;
local function VUHDO_getInternalKeyString()
tString = "";
for tIndex, tEntries in pairs(VUHDO_SPELLS_KEYBOARD["INTERNAL"]) do
tString = format("%sself:SetBindingClick(0, \"%s\", self:GetName(), \"ik%d\");", tString, tEntries[2] == "\\" and "\\\\" or tEntries[2] or "", tIndex);
end
return tString;
end
-- Parse and interpret action-type
local tPreAction;
local tTarget;
local tIsWheel;
local tHostSpell;
local tWheelDefString;
local tCnt;
local tFrame;
local tBinding;
function VUHDO_setupAllHealButtonAttributes(aButton, aUnit, anIsDisable, aForceTarget, anIsTgButton, anIsIcButton)
if aUnit then
aButton:SetAttribute("unit", aUnit);
aButton["raidid"] = aUnit;
end
if not aButton:GetAttribute("vd_tt_hook") then
if anIsIcButton then
aButton:HookScript("OnEnter", function(self) VUHDO_showDebuffTooltip(self); VuhDoActionOnEnter(self:GetParent():GetParent():GetParent():GetParent()) end);
aButton:HookScript("OnLeave", function(self) VUHDO_hideDebuffTooltip(); VuhDoActionOnLeave(self:GetParent():GetParent():GetParent():GetParent()) end);
else
aButton:HookScript("OnEnter", function(self) VuhDoActionOnEnter(self); end);
aButton:HookScript("OnLeave", function(self) VuhDoActionOnLeave(self); end);
end
aButton:SetAttribute("vd_tt_hook", true);
end
if sIsCliqueCompat then
aButton:EnableMouseWheel(1);
return;
end
tPreAction = anIsDisable and "" or aForceTarget and "target" or nil;
for tNoMinus, tWithMinus in pairs(VUHDO_MODIFIER_KEYS) do
for tCnt = 1, 16 do -- VUHDO_NUM_MOUSE_BUTTONS
tBinding = VUHDO_SPELL_ASSIGNMENTS[format("%s%d", tNoMinus, tCnt)];
VUHDO_setupHealButtonAttributes(tWithMinus, tCnt,
tPreAction or tBinding ~= nil and tBinding[3] or "",
aButton, anIsTgButton);
end
end
tIsWheel = false;
for tIndex, tSpellDescr in pairs(VUHDO_SPELLS_KEYBOARD["WHEEL"]) do
tHostSpell = VUHDO_SPELLS_KEYBOARD["HOSTILE_WHEEL"][tIndex][3];
if #tSpellDescr[3] > 0 or #tHostSpell > 0 then
tIsWheel = true;
VUHDO_setupHealButtonAttributes("", tSpellDescr[2], tSpellDescr[3], aButton, anIsTgButton, tIndex);
end
end
for tIndex, tEntries in pairs(VUHDO_SPELLS_KEYBOARD["INTERNAL"]) do
if VUHDO_isActionValid(tEntries[1], false) then
_VUHDO_setupHealButtonAttributes("", "-ik" .. tIndex, tEntries[1], aButton, anIsTgButton, tIndex);
else
aButton:SetAttribute("type-ik" .. tIndex, "macro");
aButton:SetAttribute("macrotext-ik" .. tIndex, VUHDO_replaceMacroTemplates(tEntries[3] or "", aUnit));
end
end
if VUHDO_BUTTON_CACHE[aButton] or VUHDO_BUTTON_CACHE[aButton:GetParent():GetParent():GetParent():GetParent()] then
tWheelDefString = "self:ClearBindings();";
if tIsWheel then
tWheelDefString = tWheelDefString .. VUHDO_getWheelDefString();
end
tWheelDefString = tWheelDefString .. VUHDO_getInternalKeyString();
aButton:SetAttribute("_onenter", tWheelDefString);
aButton:SetAttribute("_onleave", "self:ClearBindings();");
aButton:SetAttribute("_onshow", "self:ClearBindings();");
aButton:SetAttribute("_onhide", "self:ClearBindings();");
aButton:SetAttribute(
"_onmousedown",
"if not self:IsUnderMouse(false) then self:ClearBindings(); end"
);
end
end
local VUHDO_setupAllHealButtonAttributes = VUHDO_setupAllHealButtonAttributes;
--
local tProhibitSmartCastOn = {
["target"] = true,
["assist"] = true,
["focus"] = true,
["menu"] = true,
["dropdown"] = true,
["tell"] = true,
["boss1"] = true,
["boss2"] = true,
["boss3"] = true,
["boss4"] = true,
["boss5"] = true,
};
-- Setup for smart cast
local tKey;
local function VUHDO_setupAllButtonsTo(aButton, aSpellName)
for tNoMinus, tWithMinus in pairs(VUHDO_MODIFIER_KEYS) do
for tCnt = 1, VUHDO_NUM_MOUSE_BUTTONS do
tKey = tNoMinus .. tCnt;
if not VUHDO_SPELL_ASSIGNMENTS[tKey] or not tProhibitSmartCastOn[VUHDO_SPELL_ASSIGNMENTS[tKey][3]] then
VUHDO_setupHealButtonAttributes(tWithMinus, tCnt, aSpellName, aButton, false);
end
end
end
end
--
function VUHDO_setupAllTargetButtonAttributes(aButton, aUnit)
VUHDO_setupAllHealButtonAttributes(aButton, aUnit .. "target", false, false, true, false);
end
--
function VUHDO_setupAllTotButtonAttributes(aButton, aUnit)
VUHDO_setupAllHealButtonAttributes(aButton, aUnit .. "targettarget", false, false, true, false);
end
--
local tCnt;
function VUHDO_disableActions(aButton)
VUHDO_setupAllHealButtonAttributes(aButton, nil, true, false, false, false);
aButton:Hide(); -- For clearing mouse-wheel click bindings
aButton:Show();
end
--
local tCursorItemType;
local tAbilities;
local tUnit;
local tInfo;
local tBuff;
function VUHDO_setupSmartCast(aButton)
if InCombatLockdown() or UnitIsDeadOrGhost("player")
or (VUHDO_PLAYER_CLASS == "PRIEST" and GetShapeshiftForm() == 4) then -- Priest Spirit of Redemption?
return false;
end
tUnit = aButton["raidid"];
tInfo = VUHDO_RAID[tUnit];
if not tInfo then return false; end
-- Resurrect?
if VUHDO_CONFIG["SMARTCAST_RESURRECT"] and tInfo["dead"] then
local tMainRes = VUHDO_getResurrectionSpells();
if tMainRes then
VUHDO_setupAllButtonsTo(aButton, tMainRes);
return true;
end
end
if not tInfo["baseRange"] then return false; end
-- Trade?
tCursorItemType = GetCursorInfo();
if "item" == tCursorItemType or "money" == tCursorItemType then
DropItemOnUnit(tUnit);
VUHDO_disableActions(aButton);
return true;
end
-- Cleanse?
if VUHDO_CONFIG["SMARTCAST_CLEANSE"] and not tInfo["dead"] then
if VUHDO_DEBUFF_TYPE_NONE ~= tInfo["debuff"] then
tAbilities = VUHDO_getDebuffAbilities();
if tAbilities[tInfo["debuff"]] then
VUHDO_setupAllButtonsTo(aButton, tAbilities[tInfo["debuff"]]);
return true;
end
end
end
-- Buff?
if VUHDO_CONFIG["SMARTCAST_BUFF"] and tInfo["missbuff"] and not tInfo["dead"] then
tBuff = tInfo["mibuvariants"];
if VUHDO_isBuffOfTargetType(tBuff[1], VUHDO_BUFF_TARGET_HOSTILE) and not UnitIsEnemy("player", tUnit) then
return false;
else
VUHDO_setupAllButtonsTo(aButton, tBuff[1]);
VUHDO_setupHealButtonAttributes("", "2", tBuff[1], aButton, false);
return true;
end
end
return false;
end