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.

204 lines
7.2 KiB

do
local _, addon = ...;
local function CheckCampaignStatus()
local campaignID = 165;
local campaignState = C_CampaignInfo.GetState(campaignID);
if (not campaignState) or campaignState == 1 then
return
end
local isBlueFaction = UnitFactionGroup("player") == "Alliance";
local keyQuestID, keyZoneText;
if isBlueFaction then
keyQuestID = 67700;
keyZoneText = C_Map.GetAreaInfo(4411) or "Stormwind Harbor";
else
keyQuestID = 67700;
keyZoneText = C_Map.GetAreaInfo(4411) or "Stormwind Harbor";
end
if C_QuestLog.IsQuestFlaggedCompleted(keyQuestID) then
return
end
print("Watch Boat")
local IsFlyableArea = IsFlyableArea;
local GetMinimapZoneText = GetMinimapZoneText;
local EventListener = CreateFrame("Frame");
if campaignState == 0 then
EventListener:RegisterEvent("PLAYER_LEVEL_UP");
end
local function GetShipETA()
--requires to talk to Chrovo to get the buff "Waiting for the Rugged Dragonscale" during this game session 392634 C_UnitAuras.GetPlayerAuraBySpellID(392634)
--the buff will be gone once you board the ship, but the API can still obtain correct data
--there is also a range limit
local info = C_UIWidgetManager.GetStatusBarWidgetVisualizationInfo(4418);
if info then
--info.shownState 0/1
return info.barValue, info.barMax
end
end
local function UpdateCountdown()
local eta, total = GetShipETA();
if eta and total then
if total <= 0 or eta == 0 then
print("The ship has arrived");
else
print(string.format("The ship will arrive in %s seconds", eta));
end
else
print("No Data")
end
end
local function IsShipToDragonIsleArrived()
local eta = GetShipETA();
return eta and eta <= 15
end
local function IsPlayerOnShip()
local mapID = C_Map.GetBestMapForUnit("player");
local position, x, y;
if mapID == 84 then
position = C_Map.GetPlayerMapPosition(mapID, "player");
x, y = position:GetXY();
if x < 0.2260 and y < 0.5730 and x > 0.2090 and y > 0.5564 then
return true;
end
elseif mapID == 0 then
end
end
local function OnRightShipBoarded()
EventListener:UnregisterAllEvents();
EventListener:SetScript("OnUpdate", nil);
EventListener:SetScript("OnEvent", nil);
end
local function OnFlyableChanged_Callback(self, elapsed)
self.t = self.t + elapsed;
if self.t >= 0.5 then
self:SetScript("OnUpdate", nil);
self.t = nil;
if IsPlayerOnShip() then
if IsShipToDragonIsleArrived() then
print("Right Boat");
OnRightShipBoarded();
else
print("Wrong Boat");
end
else
print("Off Boat");
end
end
end
local function OnEnteringKeyQuestZone(state)
if state == EventListener.inQuestZone then
return
else
EventListener.inQuestZone = state;
end
if state then
EventListener:RegisterEvent("ACTIONBAR_UPDATE_USABLE"); --assume mount is on the ActionBar
EventListener:RegisterEvent("UPDATE_UI_WIDGET");
EventListener:RegisterUnitEvent("UNIT_AURA", "player");
UpdateCountdown();
print("inQuestZone");
else
EventListener:UnregisterEvent("ACTIONBAR_UPDATE_USABLE");
EventListener:UnregisterEvent("UPDATE_UI_WIDGET");
EventListener:UnregisterEvent("UNIT_AURA");
print("not inQuestZone");
end
end
local function OnKeyQuestAccepted()
EventListener:RegisterEvent("ZONE_CHANGED");
OnEnteringKeyQuestZone(GetMinimapZoneText() == keyZoneText);
print("Accepted")
end
if not C_QuestLog.IsOnQuest(keyQuestID) then
EventListener:RegisterEvent("QUEST_ACCEPTED");
else
OnKeyQuestAccepted();
end
EventListener:SetScript("OnEvent", function(self, event, ...)
print(event)
if event == "PLAYER_LEVEL_UP" then
local newLevel = ...
if newLevel >= 58 then
self:UnregisterEvent(event);
self:RegisterEvent("QUEST_ACCEPTED");
end
elseif event == "QUEST_ACCEPTED" then
local questID = ...
if questID == keyQuestID then
self:UnregisterEvent(event);
OnKeyQuestAccepted();
end
elseif event == "ACTIONBAR_UPDATE_USABLE" then
local flyable = IsFlyableArea();
if flyable ~= self.flyable then
self.flyable = flyable;
if flyable then
self.t = 0;
self:SetScript("OnUpdate", OnFlyableChanged_Callback);
else
self:SetScript("OnUpdate", nil);
end
end
elseif event == "UPDATE_UI_WIDGET" then
UpdateCountdown();
elseif event == "ZONE_CHANGED" then
local zoneText = GetMinimapZoneText();
OnEnteringKeyQuestZone(zoneText == keyZoneText);
elseif event == "UNIT_AURA" then
local unitTarget, isFullUpdate, updatedAuras = ...
UpdateCountdown();
end
end)
end
addon.AddInitializationCallback(CheckCampaignStatus);
end
if true then return end;
--DEVTOOLS_MAX_ENTRY_CUTOFF
--[[
campaignID 165, chapterIDs = {1289}
C_CampaignInfo.GetState(165); 0 invalid 1 complete 2 inProgress 3 Stalled
widgetID 4556, 4418(Alliance, before arrival)
widgetType 2
widgetSetID 729
/dump C_UIWidgetManager.GetStatusBarWidgetVisualizationInfo(4418)
-barMax 300(not arrived) 0(arrived)
--barValue
C_QuestLog.GetQuestObjectives(67700)
IsFlyableArea(); --not flyable near the dock
Alliance
Docketmaster Kultiras Aron Kyleson 142641 arrival ~ 214s leave ~ 154s
Captain Ironbridge of the Rugged Dragonscale 184288 --seems to only yell when you haven't complete the first criteria
local mapID = C_Map.GetBestMapForUnit("player"); --84
local position = C_Map.GetPlayerMapPosition(84, "player");
0.2247, 0.5636
--]]