local myname, ns = ... local L = LibStub("AceLocale-3.0"):GetLocale(myname, false) local HandyNotes = LibStub("AceAddon-3.0"):GetAddon("HandyNotes") local HL = LibStub("AceAddon-3.0"):NewAddon(myname, "AceEvent-3.0") 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, Shrine_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.Shrine then return { icon = point.pathto, tCoordLeft = 0, tCoordRight = 1, tCoordTop = 0, tCoordBottom = 1, scale = 2.2, } 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 = "Shrine" -- if point.timeRift then -- category = "timeRift" -- end -- in case to add something else 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) if TomTom then for coord, v in pairs(ns.points[uiMapID]) do 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 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 = L["Create waypoint"] info.notCheckable = 1 info.func = createWaypoint info.arg1 = currentZone info.arg2 = currentCoord UIDropDownMenu_AddButton(info, level) wipe(info) end -- Hide menu item info.text = L["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 = L["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