view WhistleMaster.lua @ 21:63bf46cfbd3c

Added some validation behavior to nip a few annoying errors in the bud.
author Vynn <mischivin@gmail.com>
date Mon, 20 Feb 2017 00:02:29 -0500
parents 5be6dcc0f0cd
children 4bbd39b7df53
line wrap: on
line source

function WM_Debug() 
	print("debug text")
end

--indexes corrispond to map IDs that contain valid flight points for the Flight Masters Whistle
--Doesn't work in 1021 (Broken Shore)
WM_validIDs = { [1014] = true, [1015] = true, [1017] = true, [1018] = true, [1021] = false, [1024] = true, [1033] = true, [1096] = true }

local WhistleLoc = CreateFrame("FRAME", "WhistleLOC", WorldMapPOIFrame)
WhistleLoc:SetSize(64, 64)
WhistleLoc:SetPoint("CENTER", 0, 0)
WhistleLoc:Show()

WM_ClosestNode = nil

local function GetDistance(nX, nY)
	local pX, pY = GetPlayerMapPosition("player")
	local dX, dY
	if pX and pY then
		dX = pX - nX
    	dY = pY - nY
    else 
    	return nil
    end
 
	return math.sqrt( ( dX^2 ) + ( dY^2 ) )
end

local function GetNode()
	local node
	local distance
	local index
	for k = 1, GetNumMapLandmarks() do
		local n = {}
		n.type, n.name, n.description, n.textureIndex, n.x, n.y = GetMapLandmarkInfo(k)
		if n.type == LE_MAP_LANDMARK_TYPE_TAXINODE then --LE_MAP_LANDMARK_TYPE_TAXINODE is a constant defined by Blizzard
			local d = GetDistance(n.x, n.y)
			if distance == nil or d < distance then
				n.index = k
				distance = d
				node = n
			end
		end
	end
	return node
end

function UpdateWhistleMaster()
	if GetCurrentMapContinent() == 8 and WM_validIDs[ select(1, GetCurrentMapAreaID() ) ] and GetMapNameByID(GetCurrentMapAreaID()) == GetZoneText() and not GetNumDungeonMapLevels() then
		WM_ClosestNode = GetNode()
		if _G[("WorldMapFramePOI" .. WM_ClosestNode.index)] then
			WhistleLoc:SetPoint("CENTER", "WorldMapFramePOI" .. WM_ClosestNode.index, 0, 0)
			WhistleLoc:Show()
			WhistlePing.Ping:Play()
			return true
		else
			return false
		end
	else
		WhistleLoc:Hide()
		WhistlePing.Ping:Stop()
		return false
	end
end

local mapVisible = false

local function EventHandler(self, event, ...)
	if ( (event == "WORLD_MAP_UPDATE") and WorldMapFrame:IsVisible() ) then
		mapVisible = true
		UpdateWhistleMaster()
	end
	if ( (mapVisible) and not WorldMapFrame:IsVisible() ) then
 		mapVisible = false
 	end
 	if (event == "PLAYER_ENTERING_WORLD") then
		WorldMapFrame:Show()
		WorldMapFrame:Hide()
 		UpdateWhistleMaster()
 	end
end

local WhistleMaster = CreateFrame("FRAME", "WhistleMaster", WorldMapPOIFrame)
WhistleMaster:RegisterEvent("WORLD_MAP_UPDATE")
WhistleMaster:RegisterEvent("VARIABLES_LOADED")
WhistleMaster:RegisterEvent("PLAYER_ENTERING_WORLD")
WhistleMaster:SetScript("OnEvent", EventHandler)

local cleared = true
local function OnTooltipCleared(self)
   cleared = true   
end
 
local function OnTooltipSetItem(self)
	if cleared then
		local name, tooltipLink = self:GetItem()
		if tooltipLink then
			local item = tooltipLink:match("Hitem:(%d+)")
			if item == "141605" then
				if UpdateWhistleMaster() then
					self:AddLine("\nWhistle Destination:|cFFFFFFFF " .. WM_ClosestNode.name ,0.5,1,0.5, true)
				else
					self:AddLine("\nWhistle Destination:|cFFFFFFFF N/A",0.5,1,0.5, true)
				end
			end
			cleared = true
		end
	end
end
 
GameTooltip:HookScript("OnTooltipCleared", OnTooltipCleared)
GameTooltip:HookScript("OnTooltipSetItem", OnTooltipSetItem)
ItemRefTooltip:HookScript("OnTooltipCleared", OnTooltipCleared)
ItemRefTooltip:HookScript("OnTooltipSetItem", OnTooltipSetItem)