QuestHelper_File["collect_flight.lua"] = "4.0.1.$svnversion$" QuestHelper_Loadtime["collect_flight.lua"] = GetTime() local debug_output = false if QuestHelper_File["collect_flight.lua"] == "Development Version" then debug_output = true end local QHCFM local QHCFT local IsMonsterGUID local GetMonsterType local function GetRoute(currentname, endnode) local path = currentname .. "@@" .. TaxiNodeName(endnode) local links = GetNumRoutes(endnode) if links > 50 then -- links is apparently sometimes 999998. Why? I could not say. It is a mystery. Hopefully this will show up in the datafiles and I'll be able to debug it. if (TaxiNodeGetType(endnode) == "NONE") then return path, TaxiNodeName(endnode) .. " not currently in use." else return path, string.format("@@@ WACKYLAND %s %d @@@", TaxiNodeGetType(endnode), links) end end local route = "" for j = 1, links - 1 do -- Why only the first n-1 links? Why not all? Research. if #route > 0 then route = route .. "," end route = route .. string.format("(%f,%f)", TaxiGetDestX(endnode, j), TaxiGetDestY(endnode, j)) end return path, route end local function GetCurrentname() QuestHelper: Assert(NumTaxiNodes() < 150, tostring(NumTaxiNodes())) -- hmm what for i = 1, NumTaxiNodes() do if TaxiNodeGetType(i) == "CURRENT" then return TaxiNodeName(i) end end end local path, route local start_time local phase = "IDLE" local real_TakeTaxiNode = TakeTaxiNode TakeTaxiNode = function(id) path, route = GetRoute(GetCurrentname(), id) phase = "PENDING" start_time = GetTime() real_TakeTaxiNode(id) end local function TaximapOpened() -- Figure out who we have targeted and what our location name is local currentname = GetCurrentname() if not currentname then return end -- must not actually have opened the map QuestHelper: Assert(NumTaxiNodes() < 100) for i = 1, NumTaxiNodes() do local name, type = TaxiNodeName(i), TaxiNodeGetType(i) if not QHCFM[name] then QHCFM[name] = {} end QHCFM[name].x, QHCFM[name].y = TaxiNodePosition(i) if type == "CURRENT" then local guid = UnitGUID("target") if guid and IsMonsterGUID(guid) then QHCFM[name].master = GetMonsterType(guid) end end if type ~= "CURRENT" then local path, route = GetRoute(currentname, i) if not QHCFT[path] then QHCFT[path] = {} end if not QHCFT[path][route] then QHCFT[path][route] = {} end end end end local function OnUpdate() if UnitOnTaxi("player") then if phase == "PENDING" then start_time = GetTime() phase = "FLYING" end else if phase == "PENDING" then if GetTime() > start_time + 5 then -- something has gone wrong, abort phase = "IDLE" path, route, start_time = nil, nil, nil end elseif phase == "FLYING" then -- yaay QHCFT[path][route].time = (QHCFT[path][route].time or 0) + (GetTime() - start_time) QHCFT[path][route].count = (QHCFT[path][route].count or 0) + 1 phase = "IDLE" path, route, start_time = nil, nil, nil end end end function QH_Collect_Flight_Init(QHCData, API) if not QHCData.flight_master then QHCData.flight_master = {} end if not QHCData.flight_times then QHCData.flight_times = {} end QHCFM, QHCFT = QHCData.flight_master, QHCData.flight_times IsMonsterGUID = API.Utility_IsMonsterGUID GetMonsterType = API.Utility_GetMonsterType QuestHelper: Assert(IsMonsterGUID) QuestHelper: Assert(GetMonsterType) QH_Event("TAXIMAP_OPENED", TaximapOpened) API.Registrar_OnUpdateHook(OnUpdate) end