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.
336 lines
10 KiB
336 lines
10 KiB
local Narci = Narci;
|
|
|
|
local After = C_Timer.After;
|
|
local GetContainerNumFreeSlots = (C_Container and C_Container.GetContainerNumFreeSlots) or GetContainerNumFreeSlots;
|
|
local GetItemCount = GetItemCount;
|
|
local NUM_BAGS = NUM_BAG_SLOTS or 4;
|
|
|
|
local REQUIREMENT_FORMAT = "|cff808080"..REQUIRES_LABEL.." %s|r";
|
|
local EXTRACTOR_ITEM_ID = 187532; --Soulfire Chisel
|
|
local EXTRACTOR_ITEM_NAME = "Soulfire Chisel";
|
|
local EXTRACTOR_ITEM_LOCALIZED_NAME = C_Item.GetItemNameByID(EXTRACTOR_ITEM_ID); --nilable
|
|
local MARCO_USE_ITEM_BY_ID = "/use item:%s";
|
|
|
|
|
|
local function CanPlayerRemoveGem(itemID)
|
|
--return GetItemCount(itemID) > 0
|
|
if HasExtraActionBar() then
|
|
local EXTRA_ACTION_BUTTON_ACTION = 217;
|
|
local SPELL_ID_PLUCK = 405805;
|
|
local actionType, id, subType = GetActionInfo(EXTRA_ACTION_BUTTON_ACTION);
|
|
|
|
if id == SPELL_ID_PLUCK then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
|
|
local function GetExtractAction()
|
|
local socketID = Narci_EquipmentOption:GetSocketOrderID();
|
|
return string.format("/click ExtraActionButton1\r/click ItemSocketingSocket%s", socketID);
|
|
end
|
|
|
|
local function GetNumFreeBagSlots()
|
|
--a copy of CalculateTotalNumberOfFreeBagSlots
|
|
local totalFree, freeSlots, bagFamily = 0, 0, 0;
|
|
for i = 0, NUM_BAGS do --BACKPACK_CONTAINER, NUM_BAG_SLOTS
|
|
freeSlots, bagFamily = GetContainerNumFreeSlots(i);
|
|
if ( bagFamily == 0 ) then
|
|
totalFree = totalFree + freeSlots;
|
|
end
|
|
end
|
|
return totalFree;
|
|
end
|
|
|
|
local IsMounted = IsMounted;
|
|
local IsFlying = IsFlying;
|
|
local function ActionButton_OnUpdate(self, elapsed)
|
|
if not self.t then
|
|
self.t = 0;
|
|
end
|
|
self.t = self.t + elapsed;
|
|
if self.t >= 0.5 then
|
|
if IsFlying() then
|
|
self.t = nil;
|
|
self:SetScript("OnUpdate", nil);
|
|
self:SetFailedReason(2);
|
|
end
|
|
else
|
|
return
|
|
end
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------
|
|
--Extract Domination Shard
|
|
local function SharedPostClickFunc(self, button)
|
|
if button == "RightButton" then
|
|
return
|
|
end
|
|
self:StopAnimating();
|
|
self.ArrowLeft.Expand:Play();
|
|
self.ArrowRight.Expand:Play();
|
|
self:Disable();
|
|
After(0.8, function()
|
|
self:AttemptToEnable();
|
|
end);
|
|
end
|
|
|
|
local function NarcissusActionButton_PostClick(self, button)
|
|
if button == "RightButton" then
|
|
Narci_EquipmentOption:ShowMenu();
|
|
return
|
|
end
|
|
self:RegisterEvent("BAG_UPDATE");
|
|
SharedPostClickFunc(self);
|
|
local gemFrame = NarciGemSlotOverlay;
|
|
if gemFrame:IsShown() then
|
|
gemFrame.Pulse.Expand:Stop();
|
|
gemFrame.Pulse.Shrink:Play();
|
|
end
|
|
end
|
|
|
|
|
|
NarciItemSocketingActionButtonMixin = {};
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnLoad()
|
|
self.isReleased = true;
|
|
self:SetLabelText("Extract Shard");
|
|
self:OnLeave();
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnEnter()
|
|
self.Label:SetTextColor(0.92, 0.92, 0.92);
|
|
self.ArrowLeft:SetVertexColor(1, 1, 1);
|
|
self.ArrowRight:SetVertexColor(1, 1, 1);
|
|
self:StopAnimating();
|
|
self.ArrowLeft.Close:Play();
|
|
self.ArrowRight.Close:Play();
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnLeave()
|
|
self.Label:SetTextColor(102/255, 187/255, 1);
|
|
self.ArrowLeft:SetVertexColor(0.5, 0.5, 0.5);
|
|
self.ArrowRight:SetVertexColor(0.5, 0.5, 0.5);
|
|
self.ArrowLeft.Close:Stop();
|
|
self.ArrowRight.Close:Stop();
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnShow()
|
|
self:RegisterEvent("PLAYER_MOUNT_DISPLAY_CHANGED");
|
|
self:RegisterEvent("PLAYER_REGEN_DISABLED");
|
|
if self:IsEnabled() and not self:IsMouseOver() then
|
|
self:OnLeave();
|
|
end
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnHide()
|
|
self:StopAnimating();
|
|
self:UnregisterEvent("PLAYER_REGEN_DISABLED");
|
|
self:UnregisterEvent("PLAYER_MOUNT_DISPLAY_CHANGED");
|
|
self:Release();
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:DisableButton()
|
|
self:Show();
|
|
self:Disable();
|
|
--if not EXTRACTOR_ITEM_LOCALIZED_NAME then
|
|
-- EXTRACTOR_ITEM_LOCALIZED_NAME = C_Item.GetItemNameByID(EXTRACTOR_ITEM_ID);
|
|
--end
|
|
--self.Label:SetText( string.format(REQUIREMENT_FORMAT, (EXTRACTOR_ITEM_LOCALIZED_NAME or EXTRACTOR_ITEM_NAME)) );
|
|
self.Label:SetText(Narci.L["Socket Occupied"]);
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:AttemptToEnable()
|
|
self:Show();
|
|
self:SetScript("OnUpdate", nil);
|
|
local numFreeSlots = GetNumFreeBagSlots();
|
|
if numFreeSlots > 0 then
|
|
if IsMounted() then
|
|
if IsFlying() then
|
|
self:SetFailedReason(2);
|
|
else
|
|
self:TrackFlyingStatus();
|
|
self:Enable();
|
|
self.Label:SetText(Narci.L["Unsocket Gem"]);
|
|
end
|
|
else
|
|
self:Enable();
|
|
self.Label:SetText(Narci.L["Unsocket Gem"]);
|
|
end
|
|
else
|
|
self:SetFailedReason(1);
|
|
end
|
|
|
|
Narci_EquipmentOption.ItemList.NoItemText:Hide(); --HideNoItemAlert
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:TrackFlyingStatus()
|
|
self:SetScript("OnUpdate", ActionButton_OnUpdate);
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:SetFailedReason(id)
|
|
self:Disable();
|
|
if id == 1 then
|
|
self.Label:SetText(TUTORIAL_TITLE58);
|
|
elseif id == 2 then
|
|
self.Label:SetText(string.gsub(SPELL_FAILED_NOT_FLYING, "[%.。]", ""));
|
|
end
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:SetLabelText(text)
|
|
self.Label:SetText(text);
|
|
local textWidth = self.Label:GetWidth();
|
|
if textWidth < 64 then
|
|
textWidth = 64;
|
|
end
|
|
--self:SetWidth(textWidth + 24);
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:SetActionForBlizzardUI()
|
|
self:SetExtractAction();
|
|
self.preclickFunc = nil;
|
|
self:SetScript("PostClick", SharedPostClickFunc);
|
|
self:UnregisterEvent("BAG_UPDATE");
|
|
end
|
|
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnEnterCombat()
|
|
self:Release();
|
|
if self.parentFrame and self.parentFrame.ErrorMsg then
|
|
self.parentFrame.ErrorMsg:Show();
|
|
end
|
|
self:RegisterEvent("PLAYER_REGEN_ENABLED");
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnLeaveCombat()
|
|
if self.parentFrame and self.parentFrame.ErrorMsg then
|
|
self.parentFrame.ErrorMsg:Hide();
|
|
self:SetParentFrame(self.parentFrame);
|
|
end
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnExtactSuccess()
|
|
self:UnregisterEvent("BAG_UPDATE");
|
|
local slotButton = Narci.RefreshSlot(self.equipmentSlotIndex);
|
|
After(0.5, function()
|
|
if Narci_EquipmentOption:IsShown() then
|
|
Narci_EquipmentOption:SetGemListFromSlotButton(slotButton);
|
|
end
|
|
local gemFrame = NarciGemSlotOverlay;
|
|
if gemFrame:IsShown() then
|
|
gemFrame.Pulse.Shrink:Stop();
|
|
gemFrame.Pulse.Expand:Play();
|
|
end
|
|
end);
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnMountChanged()
|
|
After(0.1, function()
|
|
if not self.isReleased then
|
|
self:AttemptToEnable();
|
|
end
|
|
end)
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnEvent(event)
|
|
if event == "BAG_UPDATE" then
|
|
self:OnExtactSuccess();
|
|
elseif event == "PLAYER_REGEN_DISABLED" then
|
|
self:OnEnterCombat();
|
|
elseif event == "PLAYER_REGEN_ENABLED" then
|
|
self:OnLeaveCombat();
|
|
elseif event == "PLAYER_MOUNT_DISPLAY_CHANGED" then
|
|
self:OnMountChanged();
|
|
end
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnEnable()
|
|
self:SetScript("OnUpdate", nil);
|
|
self:StopAnimating();
|
|
self.ArrowLeft:SetDesaturated(false);
|
|
self.ArrowRight:SetDesaturated(false);
|
|
self.ArrowLeft:SetAlpha(1);
|
|
self.ArrowRight:SetAlpha(1);
|
|
if self:IsMouseOver() then
|
|
self.Label:SetTextColor(0.92, 0.92, 0.92);
|
|
else
|
|
self.Label:SetTextColor(102/255, 187/255, 1);
|
|
end
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:OnDisable()
|
|
self.ArrowLeft:SetDesaturated(true);
|
|
self.ArrowRight:SetDesaturated(true);
|
|
self.Label:SetTextColor(0.5, 0.5, 0.5);
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:SetActionForNarcissusUI()
|
|
local itemID = EXTRACTOR_ITEM_ID;
|
|
local equipmentSlotIndex = Narci_EquipmentOption.slotID;
|
|
self.equipmentSlotIndex = equipmentSlotIndex;
|
|
if CanPlayerRemoveGem(itemID) and equipmentSlotIndex then
|
|
local macroText = GetExtractAction(); --string.format("/use item:%s\r/use %s", itemID, equipmentSlotIndex);
|
|
self:SetAttribute("type1", "macro");
|
|
self:SetAttribute("macrotext", macroText);
|
|
self:AttemptToEnable();
|
|
self:RegisterForClicks("LeftButtonUp", "RightButtonUp");
|
|
self:SetScript("PostClick", NarcissusActionButton_PostClick);
|
|
self.preclickFunc = SocketInventoryItem;
|
|
self.preclickArg1 = equipmentSlotIndex;
|
|
else
|
|
self:DisableButton();
|
|
end
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:SetExtractAction()
|
|
local itemID = EXTRACTOR_ITEM_ID;
|
|
if CanPlayerRemoveGem(itemID) then
|
|
local macroText = GetExtractAction(); --string.format("/use item:%s\r/click ItemSocketingSocket1", itemID);
|
|
|
|
self:SetAttribute("type1", "macro");
|
|
self:SetAttribute("macrotext", macroText);
|
|
self:AttemptToEnable();
|
|
else
|
|
self:DisableButton();
|
|
end
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:SetParentFrame(frame, isNarcissusUI)
|
|
self.parentFrame = frame;
|
|
if InCombatLockdown() then
|
|
self:RegisterEvent("PLAYER_REGEN_ENABLED");
|
|
return false;
|
|
end
|
|
if frame then
|
|
self:SetParent(frame);
|
|
self:ClearAllPoints();
|
|
self:SetPoint("CENTER", frame, "CENTER", 0, 0);
|
|
if isNarcissusUI then
|
|
self:SetActionForNarcissusUI();
|
|
else
|
|
self:SetActionForBlizzardUI();
|
|
end
|
|
self.isReleased = nil;
|
|
self.FadeIn:Play();
|
|
else
|
|
self:Release();
|
|
end
|
|
return true;
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:Release()
|
|
if not self.isReleased then
|
|
self:Hide();
|
|
self:ClearAllPoints();
|
|
self:SetParent(NarciSecureFrameContainer);
|
|
self.isReleased = true;
|
|
end
|
|
end
|
|
|
|
function NarciItemSocketingActionButtonMixin:PreClick()
|
|
NarciAPI.SecureActionButtonPreClick();
|
|
if self.preclickFunc then
|
|
self.preclickFunc(self.preclickArg1);
|
|
end
|
|
end
|