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.

467 lines
19 KiB

---------------------------------------------------------
-- Addon declaration
HandyNotes_LostAndFound = LibStub("AceAddon-3.0"):NewAddon("HandyNotes_LostAndFound", "AceEvent-3.0")
local HL = HandyNotes_LostAndFound
local HandyNotes = LibStub("AceAddon-3.0"):GetAddon("HandyNotes")
-- local L = LibStub("AceLocale-3.0"):GetLocale("HandyNotes_LostAndFound", true)
local debugf = tekDebug and tekDebug:GetFrame("LostAndFound")
local function Debug(...) if debugf then debugf:AddMessage(string.join(", ", tostringall(...))) end end
---------------------------------------------------------
-- Our db upvalue and db defaults
local db
local defaults = {
profile = {
show_lost = true,
show_riches = true,
show_junk = true,
found = false,
icon_scale = 1.0,
icon_alpha = 1.0,
icon_item = true,
},
}
---------------------------------------------------------
-- Localize some globals
local next = next
local GameTooltip = GameTooltip
local HandyNotes = HandyNotes
local GetItemInfo = GetItemInfo
local GetAchievementInfo = GetAchievementInfo
local GetAchievementCriteriaInfo = GetAchievementCriteriaInfo
---------------------------------------------------------
-- Constants
local points = {
-- [mapFile] = { [coord] = { type=[type], id=[id], junk=[bool], }, }
-- [] = { item=, }, --
[379] = { -- Kun Lai Summit
[52907140] = { item=86394, note="in the cave", quest=31413, }, -- Hozen Warrior Spear
[35207640] = { item=86125, quest=31304, npc=64227, }, -- Kafa Press
[73107350] = { label="Sprite's Cloth Chest", note="in the cave", quest=31412, },
[71206260] = { item=88723, note="in Stash of Yaungol Weapons", quest=31421, }, -- Sturdy Yaungol Spear
[44705240] = { item=86393, quest=31417, }, -- Tablet of Ren Yun
[64234513] = { item=86471, achievement=7997, quest=31420, note="in the cave" }, -- Ancient Mogu Tablet
[50366177] = { label="Hozen Treasure Cache", achievement=7997, note="in the cave", quest=31414, },
[36707970] = { label="Lost Adventurer's Belongings", achievement=7997, quest=31418, },
[47007300] = { label="Mo-Mo's Treasure Chest", junk=true, quest=31868, },
[52575154] = { item=86430, achievement=7997, note="in Rikktik's Tiny Chest", quest=31419, }, -- Rikktik's Tick Remover
[72013396] = { item=86422, achievement=7997, quest=31416, }, -- Statue of Xuen
[59405300] = { label="Stolen Sprite Treasure", achievement=7997, note="in the cave", quest=31415, },
[59247303] = { item=86427, achievement=7997, quest=31422, }, -- Terracotta Head
},
[382] = { -- KnucklethumpHole, cave in Kun-Lai
[52002750] = { label="Hozen Treasure Cache", achievement=7997, quest=31414, },
},
[383] = { -- TheDeeper, cave in Kun-Lai
[24106580] = { item=86394, level=12, quest=31413, }, -- Hozen Warrior Spear
},
[381] = { -- PrankstersHollow, cave in Kun-Lai
[54706980] = { label="Sprite's Cloth Chest", quest=31412, },
},
[380] = { -- HowlingwindCavern, cave in Kun-Lai
[41674412] = { label="Stolen Sprite Treasure", achievement=7997, quest=31415, },
},
[388] = { -- Townlong Steppes
[66304470] = { item=86518, quest=31425, }, -- Yaungol Fire Carrier
[66804800] = { item=86518, quest=31425, }, -- Yaungol Fire Carrier
[62823405] = { label="Abandoned Crate of Goods", achievement=7997, note="in a tent", quest=31427, },
[65838608] = { item=86472, achievement=7997, quest=31426, }, -- Amber Encased Moth
[52845617] = { item=86517, achievement=7997, quest=31424, }, -- Hardened Sap of Kri'vess
[57505850] = { item=86517, achievement=7997, quest=31424, }, -- Hardened Sap of Kri'vess
[32806160] = { item=86516, achievement=7997, note="in the cave", quest=31423, }, -- Fragment of Dread
},
[389] = { -- Niuzao Catacombs, cave in Townlong
[56406480] = { item=86516, achievement=7997, quest=31423, }, -- Fragment of Dread
[36908760] = { item=86516, achievement=7997, quest=31423, }, -- Fragment of Dread
[48408860] = { item=86516, achievement=7997, quest=31423, }, -- Fragment of Dread
[64502150] = { item=86516, achievement=7997, quest=31423, }, -- Fragment of Dread
},
[376] = { -- Valley of the Four Winds
[46802460] = { item=85973, npc=64004, quest=31284, }, -- Ancient Pandaren Fishing Charm
[45403820] = { item=86079, npc=64191, quest=31292, }, -- Ancient Pandaren Woodcutter
[15402920] = { item=86218, quest=31407, }, -- Staff of the Hidden Master
[14903360] = { item=86218, quest=31407, }, -- Staff of the Hidden Master
[17503570] = { item=86218, quest=31407, }, -- Staff of the Hidden Master
[19103780] = { item=86218, quest=31407, }, -- Staff of the Hidden Master
[19004250] = { item=86218, quest=31407, }, -- Staff of the Hidden Master
[43603740] = { label="Cache of Pilfered Goods", quest=31406, },
[92003900] = { item=87524, junk=true, quest=31869, }, -- Boat-Building Instructions
[23712833] = { label="Virmen Treasure Cache", achievement=7997, quest=31405, },
[75105510] = { item=86220, achievement=7997, quest=31408, } -- Saurok Stone Tablet
},
[422] = { -- Dread Wastes
[66306660] = { item=86522, quest=31433, }, -- Blade of the Prime
[25905030] = { item=86525, quest=31436, note="in the underwater cave", }, -- Bloodsoaked Chitin Fragment
[30209080] = { item=86524, quest=31435, }, -- Dissector's Staff of Mutation
[33003010] = { item=86521, quest=31431, }, -- Lucid Amulet of the Agile Mind
[48703000] = { item=86520, quest=31430, }, -- Malik's Stalwart Spear
[42206360] = { item=86529, npc=65552, quest=31432, }, -- Manipulator's Talisman on a Glinting Rapana Whelk (65552)
[56607780] = { item=86523, quest=31434, }, -- Swarming Cleaver of Ka'roz
[54305650] = { item=86526, quest=31437, }, -- Swarmkeeper's Medallion
[71803610] = { item=86519, quest=31429, }, -- Wind-Reaver's Dagger of Quick Strikes
[28804190] = { item=86527, quest=31438, }, -- Blade of the Poisoned Mind
},
[418] = { -- Krasarang Wilds
[43669232] = { item=86122, label="Equipment Locker", quest=31410, }, -- Plankwalking Greaves
[54488873] = { item=87266, note="in a barrel", quest=31411, }, -- Recipe: Banana Infused Rum
[52814644] = { item=86124, quest=31409, }, -- Pandaren Fishing Spear
[54267232] = { item=87798, junk=true, quest=31863, }, -- Stack of Papers
[71000920] = { item=86220, achievement=7997, note="in the cave", quest=31408, }, -- Saurok Stone Tablet
},
[390] = { -- Vale of Eternal Blossoms
-- nothing?
},
[371] = { -- The Jade Forest
[39400730] = { item=85776, note="in the well", quest=31397, }, -- Wodin's Mantid Shaker
[39264665] = { item=86199, npc=64272, quest=31307, }, -- Jade Infused Blade
[43001160] = { item=86198, quest=31403, }, -- Hammer of Ten Thunders
[41801760] = { item=86198, quest=31403, }, -- Hammer of Ten Thunders
[41201390] = { item=86198, quest=31403, }, -- Hammer of Ten Thunders
[46102920] = { item=85777, note="in the cave", quest=31399, }, -- Ancient Pandaren Mining Pick
[47106740] = { item=86196, quest=31402, }, --Ancient Jinyu Staff
[46207120] = { item=86196, quest=31402, }, --Ancient Jinyu Staff
[26223235] = { item=85780, achievement=7997, quest=31400, }, -- Ancient Pandaren Tea Pot
[31962775] = { item=85781, achievement=7997, quest=31401, }, -- Lucky Pandaren Coin
[23493505] = { item=86216, achievement=7997, quest=31404, }, -- Pandaren Ritual Stone
[24005300] = { label="Chest of Supplies", junk=true, quest=31864, },
[46308070] = { label="Offering of Rememberance", junk=true, quest=31865, },
[51229999] = { label="Ship's Locker", achievement=7997, quest=31396, },
[62452752] = { label="Stash of Gems", junk=true, quest=31866, },
},
[373] = { -- Greenstone Quarry, cave in Jade Forest
[33107800] = { item=85777, quest=31399, }, -- Ancient Pandaren Mining Pick
[44007050] = { item=85777, quest=31399, }, -- Ancient Pandaren Mining Pick
[43703850] = { item=85777, quest=31399, }, -- Ancient Pandaren Mining Pick
[38704750] = { item=85777, quest=31399, }, -- Ancient Pandaren Mining Pick
[32606270] = { item=85777, quest=31399, }, -- Ancient Pandaren Mining Pick
[38231394] = { item=85777, quest=31399, }, -- Ancient Pandaren Mining Pick
},
[433] = { -- Veiled Stair, TheHiddenPass
[74937648] = { item=86473, achievement=7997, quest=31428, }, -- The Hammer of Folly
[55107200] = { label="Forgotten Lockbox", junk=true, quest=31867, },
},
[554] = { -- Timeless Isle
-- [] = { label="", quest=, },
},
}
local cache_tooltip = CreateFrame("GameTooltip", "HNTreasureHunterTooltip")
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] = HNTreasureHunterTooltipTextLeft1:GetText()
end
end
return name_cache[id]
end
local default_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 function work_out_label(point)
local fallback
if point.label then
return point.label
end
if point.item then
local _, link, _, _, _, _, _, _, _, texture = GetItemInfo(point.item)
if link then
return link
end
fallback = 'item:'..point.item
end
if point.npc then
local name = mob_name(point.npc)
if name then
return name
end
fallback = 'npc:'..point.npc
end
return UNKNOWN
end
local function work_out_texture(point)
if point.item and db.icon_item then
local texture = select(10, GetItemInfo(point.item))
if texture then
return trimmed_icon(texture)
end
end
if point.achievement then
local texture = select(10, GetAchievementInfo(point.achievement))
if texture then
return trimmed_icon(texture)
end
end
-- if point.npc then
-- end
return trimmed_icon(default_texture)
end
local get_point_info = function(point)
if not default_texture then
default_texture = select(10, GetAchievementInfo(7284))
end
if point then
local label = work_out_label(point)
local icon = work_out_texture(point)
local category = "treasure"
if point.achievement == 7997 then
category = "riches"
-- elseif point.npc then
-- category = "npc"
elseif point.junk then
category = "junk"
end
return label, icon, category, point.quest
end
end
local get_point_info_by_coord = function(uiMapId, coord)
return get_point_info(points[uiMapId] and points[uiMapId][coord])
end
local function handle_tooltip(tooltip, point)
if point then
-- major:
if point.label then
tooltip:AddLine(point.label)
elseif point.item then
tooltip:SetHyperlink(("item:%d"):format(point.item))
elseif point.npc then
tooltip:SetHyperlink(("unit:Creature-0-0-0-0-%d"):format(point.npc))
end
if point.item and point.npc then
tooltip:AddDoubleLine(CREATURE, mob_name(point.npc) or point.npc)
end
if point.achievement then
local _, name = GetAchievementInfo(point.achievement)
tooltip:AddDoubleLine(BATTLE_PET_SOURCE_6, name or point.achievement)
end
if point.note then
tooltip:AddLine(point.note)
end
else
tooltip:SetText(UNKNOWN)
end
tooltip:Show()
end
local handle_tooltip_by_coord = function(tooltip, uiMapId, coord)
return handle_tooltip(tooltip, points[uiMapId] and 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 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
do
local currentZone, currentCoord
local function generateMenu(button, level)
if (not level) then return end
for k in pairs(info) do info[k] = nil end
if (level == 1) then
-- Create the title of the menu
info.isTitle = 1
info.text = "HandyNotes - LostAndFound"
info.notCheckable = 1
UIDropDownMenu_AddButton(info, level)
if TomTom then
-- Waypoint menu item
info.disabled = nil
info.isTitle = nil
info.notCheckable = nil
info.text = "Create waypoint"
info.icon = nil
info.func = createWaypoint
info.arg1 = currentZone
info.arg2 = currentCoord
UIDropDownMenu_AddButton(info, level);
end
-- Close menu item
info.text = "Close"
info.icon = nil
info.func = function() CloseDropDownMenus() end
info.arg1 = nil
info.notCheckable = 1
UIDropDownMenu_AddButton(info, level);
end
end
local HL_Dropdown = CreateFrame("Frame", "HandyNotes_LostAndFoundDropdownMenu")
HL_Dropdown.displayMode = "MENU"
HL_Dropdown.initialize = generateMenu
function HLHandler:OnClick(button, down, uiMapId, coord)
if button == "RightButton" and not down then
currentZone = uiMapId
currentCoord = coord
ToggleDropDownMenu(1, nil, HL_Dropdown, self, 0, 0)
end
end
end
function HLHandler:OnLeave(uiMapId, coord)
GameTooltip:Hide()
end
do
-- This is a custom iterator we use to iterate over every node in a given zone
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 then
local label, icon, category, quest = get_point_info(value)
-- Debug("iter step", state, icon, db.icon_scale, db.icon_alpha, category, quest)
if quest == 31865 then
Debug(label, category, quest)
Debug("SETTINGS", db.show_junk, db.show_riches, db.show_lost, db.found)
Debug("TEST",
(category ~= "junk" or db.show_junk),
(category ~= "riches" or db.show_riches),
(category ~= "lost" or db.show_lost),
(db.found or not (quest and C_QuestLog.IsQuestFlaggedCompleted(quest))),
(category ~= "junk" or db.show_junk)
and (category ~= "riches" or db.show_riches)
and (category ~= "lost" or db.show_lost)
and (db.found or not (quest and C_QuestLog.IsQuestFlaggedCompleted(quest)))
)
end
if (
(category ~= "junk" or db.show_junk)
and (category ~= "riches" or db.show_riches)
and (category ~= "lost" or db.show_lost)
and (db.found or not (quest and C_QuestLog.IsQuestFlaggedCompleted(quest)))
) then
return state, nil, icon, db.icon_scale, db.icon_alpha
end
end
state, value = next(t, state) -- Get next data
end
return nil, nil, nil, nil
end
function HLHandler:GetNodes2(uiMapId, minimap)
return iter, points[uiMapId], nil
end
end
---------------------------------------------------------
-- Options table
local options = {
type = "group",
name = "LostAndFound",
desc = "LostAndFound",
get = function(info) return db[info[#info]] end,
set = function(info, v)
db[info[#info]] = v
HL:SendMessage("HandyNotes_NotifyUpdate", "LostAndFound")
end,
args = {
desc = {
name = "These settings control the look and feel of the icon.",
type = "description",
order = 0,
},
icon_scale = {
type = "range",
name = "Icon Scale",
desc = "The scale of the icons",
min = 0.25, max = 2, step = 0.01,
order = 20,
},
icon_alpha = {
type = "range",
name = "Icon Alpha",
desc = "The alpha transparency of the icons",
min = 0, max = 1, step = 0.01,
order = 30,
},
icon_item = {
type = "toggle",
name = "Item icons",
desc = "Show the icons for items, if known; otherwise, the achievement icon will be used",
},
show_lost = {
type = "toggle",
name = "Lost and Found",
desc = "Show items that count for the Lost and Found achievement",
},
show_riches = {
type = "toggle",
name = "Riches of Pandaria",
desc = "Show items that count for the Riches of Pandaria achievement",
},
show_junk = {
type = "toggle",
name = "Junk",
desc = "Show items which don't count for any achievement",
},
found = {
type = "toggle",
name = "Show found",
desc = "Show waypoints for items you've already found?",
},
},
}
---------------------------------------------------------
-- Addon initialization, enabling and disabling
function HL:OnInitialize()
-- Set up our database
self.db = LibStub("AceDB-3.0"):New("HandyNotes_LostAndFoundDB", defaults)
db = self.db.profile
-- Initialize our database with HandyNotes
HandyNotes:RegisterPluginDB("LostAndFound", HLHandler, options)
end
function HL:Refresh()
self:SendMessage("HandyNotes_NotifyUpdate", "LostAndFound")
end