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.

328 lines
10 KiB

5 years ago
local myname, ns = ...
local HandyNotes = LibStub("AceAddon-3.0"):GetAddon("HandyNotes")
local HL = LibStub("AceAddon-3.0"):NewAddon(myname, "AceEvent-3.0")
-- local L = LibStub("AceLocale-3.0"):GetLocale(myname, true)
ns.HL = HL
local debugf = tekDebug and tekDebug:GetFrame(myname:gsub("HandyNotes_", ""))
local function Debug(...) if debugf then debugf:AddMessage(string.join(", ", tostringall(...))) end end
ns.Debug = Debug
local next = next
local GameTooltip = GameTooltip
local HandyNotes = HandyNotes
local ARTIFACT_LABEL = '|cffff8000' .. ARTIFACT_POWER .. '|r'
local cache_tooltip = CreateFrame("GameTooltip", "HNBattleTreasuresTooltip")
cache_tooltip:AddFontStrings(
cache_tooltip:CreateFontString("$parentTextLeft1", nil, "GameTooltipText"),
cache_tooltip:CreateFontString("$parentTextRight1", nil, "GameTooltipText")
)
local name_cache = {}
local function mob_name(id)
if not name_cache[id] then
-- this doesn't work with just clearlines and the setowner outside of this, and I'm not sure why
cache_tooltip:SetOwner(WorldFrame, "ANCHOR_NONE")
cache_tooltip:SetHyperlink(("unit:Creature-0-0-0-0-%d"):format(id))
if cache_tooltip:IsShown() then
name_cache[id] = HNBattleTreasuresTooltipTextLeft1:GetText()
end
end
return name_cache[id]
end
local default_texture, cauldron_texture--, junk_texture
local icon_cache = {}
local trimmed_icon = function(texture)
if not icon_cache[texture] then
icon_cache[texture] = {
icon = texture,
tCoordLeft = 0.1,
tCoordRight = 0.9,
tCoordTop = 0.1,
tCoordBottom = 0.9,
}
end
return icon_cache[texture]
end
local atlas_texture = function(atlas, scale)
local texture, _, _, left, right, top, bottom = GetAtlasInfo(atlas)
return {
icon = texture,
tCoordLeft = left,
tCoordRight = right,
tCoordTop = top,
tCoordBottom = bottom,
scale = scale or 1,
}
end
local function work_out_label(point)
local fallback
if point.label then
return point.label
end
return fallback or UNKNOWN
end
local function work_out_texture(point)
if point.atlas then
if not icon_cache[point.atlas] then
icon_cache[point.atlas] = atlas_texture(point.atlas, point.scale)
end
return icon_cache[point.atlas]
end
if point.cauldron then
if not cauldron_texture then
cauldron_texture = atlas_texture("PortalRed", 2.6)
end
return cauldron_texture
end
if point.timeRift then
if not timeRift_texture then
--timeRift_texture = atlas_texture("nameplate-WarlockShard-On", 1.2)
timeRift_texture = atlas_texture("worldquest-icon-tailoring", 1.2)
end
return timeRift_texture
end
if not default_texture then
default_texture = atlas_texture("Garr_TreasureIcon", 2.6)
return default_texture
end
return default_texture
end
local get_point_info = function(point)
if point then
local label = work_out_label(point)
local icon = work_out_texture(point)
local category = "cauldron"
if point.timeRift then
category = "timeRift"
end
return label, icon, category, point.quest, point.faction, point.scale, point.alpha or 1
end
end
local get_point_info_by_coord = function(uiMapID, coord)
return get_point_info(ns.points[uiMapID] and ns.points[uiMapID][coord])
end
local function handle_tooltip(tooltip, point)
if point then
-- major:
tooltip:AddLine(work_out_label(point))
if point.note then
tooltip:AddLine(point.note, nil, nil, nil, true)
end
else
tooltip:SetText(UNKNOWN)
end
tooltip:Show()
end
local handle_tooltip_by_coord = function(tooltip, uiMapID, coord)
return handle_tooltip(tooltip, ns.points[uiMapID] and ns.points[uiMapID][coord])
end
---------------------------------------------------------
-- Plugin Handlers to HandyNotes
local HLHandler = {}
local info = {}
function HLHandler:OnEnter(uiMapID, coord)
local tooltip = GameTooltip
if self:GetCenter() > UIParent:GetCenter() then -- compare X coordinate
tooltip:SetOwner(self, "ANCHOR_LEFT")
else
tooltip:SetOwner(self, "ANCHOR_RIGHT")
end
handle_tooltip_by_coord(tooltip, uiMapID, coord)
end
local function createWaypointBulk(button, uiMapID, pointtype)
if TomTom then
for coord, v in pairs(ns.points[uiMapID]) do
if((pointtype == 'timerift' and v.timeRift) or (pointtype == 'cauldron' and v.cauldron)) then
local x, y = HandyNotes:getXY(coord)
TomTom:AddWaypoint(uiMapID, x, y, {
title = get_point_info_by_coord(uiMapID, coord),
persistent = nil,
minimap = true,
world = true
})
end
end
end
end
local function createWaypoint(button, uiMapID, coord)
if TomTom then
local x, y = HandyNotes:getXY(coord)
TomTom:AddWaypoint(uiMapID, x, y, {
title = get_point_info_by_coord(uiMapID, coord),
persistent = nil,
minimap = true,
world = true
})
end
end
local function hideNode(button, uiMapID, coord)
ns.hidden[uiMapID][coord] = true
HL:Refresh()
end
local function closeAllDropdowns()
CloseDropDownMenus(1)
end
do
local currentZone, currentCoord
local function generateMenu(button, level)
if (not level) then return end
wipe(info)
if (level == 1) then
-- Create the title of the menu
info.isTitle = 1
info.text = "HandyNotes - " .. myname:gsub("HandyNotes_", "")
info.notCheckable = 1
UIDropDownMenu_AddButton(info, level)
wipe(info)
if TomTom then
-- Waypoint menu item
info.text = "Create waypoint"
info.notCheckable = 1
info.func = createWaypoint
info.arg1 = currentZone
info.arg2 = currentCoord
UIDropDownMenu_AddButton(info, level)
wipe(info)
if ns.db.show_cauldron then
info.text = "Create waypoint for all cauldrons in zone"
info.notCheckable = 1
info.func = createWaypointBulk
info.arg1 = currentZone
info.arg2 = 'cauldron'
UIDropDownMenu_AddButton(info, level)
wipe(info)
end
if ns.db.show_timeRift then
info.text = "Create waypoint for all time rifts in zone"
info.notCheckable = 1
info.func = createWaypointBulk
info.arg1 = currentZone
info.arg2 = 'timerift'
UIDropDownMenu_AddButton(info, level)
wipe(info)
end
end
-- Hide menu item
info.text = "Hide node"
info.notCheckable = 1
info.func = hideNode
info.arg1 = currentZone
info.arg2 = currentCoord
UIDropDownMenu_AddButton(info, level)
wipe(info)
-- Close menu item
info.text = "Close"
info.func = closeAllDropdowns
info.notCheckable = 1
UIDropDownMenu_AddButton(info, level)
wipe(info)
end
end
local HL_Dropdown = CreateFrame("Frame", myname.."DropdownMenu")
HL_Dropdown.displayMode = "MENU"
HL_Dropdown.initialize = generateMenu
function HLHandler:OnClick(button, down, uiMapID, coord)
currentZone = uiMapID
currentCoord = coord
-- given we're in a click handler, this really *should* exist, but just in case...
local point = ns.points[currentZone] and ns.points[currentZone][currentCoord]
if button == "RightButton" and not down then
ToggleDropDownMenu(1, nil, HL_Dropdown, self, 0, 0)
end
end
end
function HLHandler:OnLeave(uiMapID, coord)
GameTooltip:Hide()
ShoppingTooltip1:Hide()
end
do
-- This is a custom iterator we use to iterate over every node in a given zone
local currentZone, isMinimap
local function iter(t, prestate)
if not t then return nil end
local state, value = next(t, prestate)
while state do -- Have we reached the end of this zone?
if value and ns.should_show_point(state, value, currentZone, isMinimap) then
local label, icon, _, _, _, scale, alpha = get_point_info(value)
scale = (scale or 1) * (icon and icon.scale or 1) * ns.db.icon_scale
return state, nil, icon, scale, ns.db.icon_alpha * alpha
end
state, value = next(t, state) -- Get next data
end
return nil, nil, nil, nil
end
local function UnitHasBuff(unit, spellid)
local buffname = GetSpellInfo(spellid)
for i = 1, 40 do
local name = UnitBuff(unit, i)
if not name then
-- reached the end, probably
return
end
if buffname == name then
return UnitBuff(unit, i)
end
end
end
function HLHandler:GetNodes2(uiMapID, minimap)
Debug("GetNodes2", uiMapID, minimap)
currentZone = uiMapID
isMinimap = minimap
if minimap and ns.map_spellids[uiMapID] then
if ns.map_spellids[mapFile] == true then
return iter
end
if UnitHasBuff("player", ns.map_spellids[mapFile]) then
return iter
end
end
return iter, ns.points[uiMapID], nil
end
end
---------------------------------------------------------
-- Addon initialization, enabling and disabling
function HL:OnInitialize()
-- Set up our database
self.db = LibStub("AceDB-3.0"):New(myname.."DB", ns.defaults)
ns.db = self.db.profile
ns.hidden = self.db.char.hidden
-- Initialize our database with HandyNotes
HandyNotes:RegisterPluginDB(myname:gsub("HandyNotes_", ""), HLHandler, ns.options)
-- watch for LOOT_CLOSED
self:RegisterEvent("LOOT_CLOSED", "Refresh")
self:RegisterEvent("ZONE_CHANGED_INDOORS", "Refresh")
end
function HL:Refresh()
self:SendMessage("HandyNotes_NotifyUpdate", myname:gsub("HandyNotes_", ""))
end