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.
222 lines
5.9 KiB
222 lines
5.9 KiB
-- 1. Show Quick Slot for Technoscrying World Quest
|
|
|
|
|
|
local _, addon = ...
|
|
local API = addon.API;
|
|
local QuickSlot = addon.QuickSlot;
|
|
|
|
local IsQuestActive = C_TaskQuest.IsActive;
|
|
local IsOnQuest = C_QuestLog.IsOnQuest;
|
|
local HasOverrideActionBar = HasOverrideActionBar;
|
|
local GetOverrideBarSkin = GetOverrideBarSkin;
|
|
local UnitPowerBarID = UnitPowerBarID; --659
|
|
local IsFlying = IsFlying;
|
|
|
|
local GOGGLE_NAME = C_Item.GetItemNameByID(202247);
|
|
local GOGGLE_ITEM_ID = 202247;
|
|
local GOGGLE_SPELL_ID = 398013;
|
|
|
|
local QUICKSLOT_NAME = "technoscryers";
|
|
|
|
local QUESTS = {
|
|
[78820] = 2133, --Zaralek Cavern
|
|
[78931] = 2151, --The Forbidden Reach
|
|
[78616] = 2022, --The Waking Shores
|
|
};
|
|
|
|
local QUEST_MAPS = {};
|
|
for _, uiMapID in pairs(QUESTS) do
|
|
table.insert(QUEST_MAPS, uiMapID);
|
|
end
|
|
|
|
local ZoneTriggerModule;
|
|
local EL = CreateFrame("Frame");
|
|
|
|
|
|
function EL:ShouldShowQuickSlot()
|
|
if IsFlying() then
|
|
return false
|
|
end
|
|
return not ((HasOverrideActionBar() and GetOverrideBarSkin() == 534041) or (UnitPowerBarID("player") == 659))
|
|
end
|
|
|
|
function EL:StopZoneTrigger()
|
|
if ZoneTriggerModule then
|
|
ZoneTriggerModule:SetEnabled(false);
|
|
end
|
|
end
|
|
|
|
function EL:SetupZoneTrigger(maps)
|
|
if not ZoneTriggerModule then
|
|
local module = API.CreateZoneTriggeredModule("azarchives");
|
|
ZoneTriggerModule = module;
|
|
ZoneTriggerModule:SetValidZones(QUEST_MAPS);
|
|
|
|
local function OnEnterZoneCallback()
|
|
EL:ListenEvents(true);
|
|
end
|
|
|
|
local function OnLeaveZoneCallback()
|
|
EL:ListenEvents(false);
|
|
end
|
|
|
|
module:SetEnterZoneCallback(OnEnterZoneCallback);
|
|
module:SetLeaveZoneCallback(OnLeaveZoneCallback);
|
|
end
|
|
|
|
|
|
ZoneTriggerModule:SetEnabled(true);
|
|
ZoneTriggerModule:Update();
|
|
end
|
|
|
|
function EL:SearchQuests()
|
|
--Not used
|
|
--We don't know when the quests will refresh so we always listen quest events on 3 maps
|
|
|
|
local maps = {};
|
|
|
|
for questID, uiMapID in pairs(QUESTS) do
|
|
if IsQuestActive(questID) then
|
|
table.insert(maps, uiMapID);
|
|
end
|
|
end
|
|
|
|
if #maps > 0 then
|
|
self:SetupZoneTrigger(maps);
|
|
else
|
|
self:StopZoneTrigger();
|
|
end
|
|
end
|
|
|
|
function EL:ListenEvents(state)
|
|
if state then
|
|
self:RegisterEvent("QUEST_ACCEPTED");
|
|
self:RegisterEvent("QUEST_REMOVED");
|
|
self:SetScript("OnEvent", self.OnEvent);
|
|
else
|
|
self:UnregisterEvent("QUEST_ACCEPTED");
|
|
self:UnregisterEvent("QUEST_REMOVED");
|
|
self:UnregisterEvent("UPDATE_OVERRIDE_ACTIONBAR");
|
|
self:UnregisterEvent("UNIT_POWER_BAR_HIDE");
|
|
self:UnregisterEvent("PLAYER_MOUNT_DISPLAY_CHANGED");
|
|
self:SetScript("OnEvent", nil);
|
|
self:SetCheckFlying(false);
|
|
QuickSlot:RequestCloseUI(QUICKSLOT_NAME);
|
|
end
|
|
end
|
|
|
|
local function CheckFlying_OnUpdate(self, elapsed)
|
|
self.t = self.t + elapsed;
|
|
if self.t > 0.5 then
|
|
self.t = 0;
|
|
local isFlying = IsFlying();
|
|
if isFlying ~= self.isFlying then
|
|
self.isFlying = isFlying;
|
|
self:UpdateQuickSlot();
|
|
end
|
|
end
|
|
end
|
|
|
|
function EL:SetCheckFlying(state)
|
|
if state then
|
|
self.t = 0;
|
|
self.isFlying = nil;
|
|
self:SetScript("OnUpdate", CheckFlying_OnUpdate);
|
|
else
|
|
self:SetScript("OnUpdate", nil);
|
|
end
|
|
end
|
|
|
|
function EL:UpdateQuest()
|
|
local isOnQuest;
|
|
|
|
for questID in pairs(QUESTS) do
|
|
if IsOnQuest(questID) then
|
|
isOnQuest = true
|
|
break
|
|
end
|
|
end
|
|
|
|
if isOnQuest then
|
|
self:ListenEvents(true);
|
|
self:RegisterEvent("UPDATE_OVERRIDE_ACTIONBAR");
|
|
self:RegisterUnitEvent("UNIT_POWER_BAR_HIDE", "player");
|
|
self:UpdateQuickSlot();
|
|
self:SetCheckFlying(true);
|
|
else
|
|
self:UnregisterEvent("UPDATE_OVERRIDE_ACTIONBAR");
|
|
self:UnregisterEvent("UNIT_POWER_BAR_HIDE");
|
|
self:SetCheckFlying(false);
|
|
QuickSlot:RequestCloseUI(QUICKSLOT_NAME);
|
|
end
|
|
end
|
|
|
|
local QUICKSLOT_DATA = {
|
|
buttons = {
|
|
{actionType = "item", itemID = GOGGLE_ITEM_ID, spellID = GOGGLE_SPELL_ID},
|
|
},
|
|
systemName = QUICKSLOT_NAME,
|
|
spellcastType = 1, --Channel
|
|
};
|
|
|
|
function EL:UpdateQuickSlot()
|
|
if self:ShouldShowQuickSlot() then
|
|
QuickSlot:SetButtonData(QUICKSLOT_DATA);
|
|
QuickSlot:ShowUI();
|
|
if not GOGGLE_NAME then
|
|
GOGGLE_NAME = C_Item.GetItemNameByID(202247);
|
|
end
|
|
local itemName = GOGGLE_NAME or "Technoscryers";
|
|
QuickSlot:SetHeaderText(itemName, true);
|
|
QuickSlot:SetDefaultHeaderText(itemName);
|
|
else
|
|
QuickSlot:RequestCloseUI(QUICKSLOT_NAME);
|
|
end
|
|
end
|
|
|
|
function EL:OnEvent(event, ...)
|
|
if event == "QUEST_ACCEPTED" then
|
|
local questID = ...
|
|
if questID and QUESTS[questID] then
|
|
self:UpdateQuest()
|
|
end
|
|
|
|
elseif event == "QUEST_REMOVED" then
|
|
local questID = ...
|
|
if questID and QUESTS[questID] then
|
|
self:UpdateQuest();
|
|
--self:SearchQuests();
|
|
end
|
|
|
|
elseif event == "UPDATE_OVERRIDE_ACTIONBAR" or event == "UNIT_POWER_BAR_HIDE" then
|
|
self:UpdateQuickSlot();
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EnableModule(state)
|
|
if state then
|
|
--EL:SearchQuests();
|
|
EL:SetupZoneTrigger();
|
|
EL:UpdateQuest();
|
|
else
|
|
EL:StopZoneTrigger();
|
|
EL:ListenEvents(false);
|
|
end
|
|
end
|
|
|
|
do
|
|
local moduleData = {
|
|
name = addon.L["ModuleName Technoscryers"],
|
|
dbKey = "Technoscryers",
|
|
description = addon.L["ModuleDescription Technoscryers"],
|
|
toggleFunc = EnableModule,
|
|
categoryID = 1002,
|
|
uiOrder = 10,
|
|
moduleAddedTime = 1706633000,
|
|
};
|
|
|
|
addon.ControlCenter:AddModule(moduleData);
|
|
end
|