local Tinkr = ... local Draw = Tinkr.Util.Draw:New() local Builder = Tinkr.Util.GUIBuilder:New { config = "node_finder_config" } local nodes = { -- Mining nodes [413046] = {name = "Bismuth", type = "mining"}, [413902] = {name = "Weeping Ironclaw", type = "mining"}, [1733] = {name = "Silver Vein", type = "mining"}, [413881] = {name = "Aqirite Seam", type = "mining"}, [181557] = {name = "Khorium Vein", type = "mining"}, [2040] = {name = "Mithril Deposit", type = "mining"}, [1732] = {name = "Tin Vein", type = "mining"}, [1731] = {name = "Copper Vein", type = "mining"}, [1735] = {name = "Iron Deposit", type = "mining"}, [202736] = {name = "Obsidium Deposit", type = "mining"}, [175404] = {name = "Rich Thorium Vein", type = "mining"}, [413047] = {name = "Aqirite", type = "mining"}, [181555] = {name = "Fel Iron Deposit", type = "mining"}, [413049] = {name = "Ironclaw", type = "mining"}, [181556] = {name = "Adamantite Deposit", type = "mining"}, [413880] = {name = "Bismuth Seam", type = "mining"}, [413882] = {name = "Ironclaw Seam", type = "mining"}, [202738] = {name = "Elementium Vein", type = "mining"}, [1734] = {name = "Gold Vein", type = "mining"}, [413905] = {name = "EZ-Mine Ironclaw", type = "mining"}, [2047] = {name = "Truesilver Deposit", type = "mining"}, [413886] = {name = "EZ-Mine Bismuth", type = "mining"}, [324] = {name = "Small Thorium Vein", type = "mining"}, [413907] = {name = "Camouflaged Ironclaw", type = "mining"}, [191133] = {name = "Titanium Vein", type = "mining"}, [446351] = {name = "Loose Crystal Shard", type = "mining"}, [430351] = {name = "Webbed Ore Deposit", type = "mining"}, [202737] = {name = "Pyrite Deposit", type = "mining"}, [430335] = {name = "Webbed Ore Deposit", type = "mining"}, [189978] = {name = "Cobalt Deposit", type = "mining"}, [413897] = {name = "Camouflaged Aqirite", type = "mining"}, [446352] = {name = "Loose Crystal Shard", type = "mining"}, [181569] = {name = "Rich Adamantite Deposit", type = "mining"}, [165658] = {name = "Dark Iron Deposit", type = "mining"}, [413874] = {name = "Rich Bismuth", type = "mining"}, [209313] = {name = "Trillium Vein", type = "mining"}, [413884] = {name = "Weeping Bismuth", type = "mining"}, [413892] = {name = "Weeping Aqirite", type = "mining"}, [209330] = {name = "Rich Trillium Vein", type = "mining"}, [452079] = {name = "Bismuth", type = "mining"}, [413889] = {name = "Camouflaged Bismuth", type = "mining"}, [413895] = {name = "EZ-Mine Aqirite", type = "mining"}, [202741] = {name = "Rich Elementium Vein", type = "mining"}, [255344] = {name = "Felslate Seam", type = "mining"}, [434558] = {name = "Bismuth Chunk", type = "mining"}, [413883] = {name = "Crystallized Bismuth", type = "mining"}, [209311] = {name = "Ghost Iron Deposit", type = "mining"}, [413900] = {name = "Crystallized Ironclaw", type = "mining"}, [446349] = {name = "Loose Crystal Shard", type = "mining"}, [189980] = {name = "Saronite Deposit", type = "mining"}, [440211] = {name = "Bismuth", type = "mining"}, [452075] = {name = "Ironclaw", type = "mining"}, [413877] = {name = "Rich Ironclaw", type = "mining"}, [440214] = {name = "Ironclaw", type = "mining"}, [414113] = {name = "Sivstone Deposit", type = "mining"}, [181248] = {name = "Copper Vein", type = "mining"}, [452076] = {name = "Bismuth", type = "mining"}, [241726] = {name = "Leystone Deposit", type = "mining"}, [446347] = {name = "Loose Crystal Shard", type = "mining"}, [452060] = {name = "Ironclaw", type = "mining"}, [430352] = {name = "Webbed Ore Deposit", type = "mining"}, [253280] = {name = "Leystone Seam", type = "mining"}, [202739] = {name = "Rich Obsidium Deposit", type = "mining"}, [452083] = {name = "Ironclaw", type = "mining"}, [189979] = {name = "Rich Cobalt Deposit", type = "mining"}, [434556] = {name = "Aqirite Chunk", type = "mining"}, [446343] = {name = "Loose Crystal Shard", type = "mining"}, [349982] = {name = "Phaedrum Deposit", type = "mining"}, [195036] = {name = "Pure Saronite Deposit", type = "mining"}, [236169] = {name = "Harvestable Precious Crystal", type = "mining"}, [202740] = {name = "Rich Pyrite Deposit", type = "mining"}, [325874] = {name = "Osmenite Seam", type = "mining"}, [272768] = {name = "Empyrium Deposit", type = "mining"}, [272780] = {name = "Empyrium Seam", type = "mining"}, [247075] = {name = "Secreted Wax Glob", type = "mining"}, [452080] = {name = "Bismuth", type = "mining"}, [247967] = {name = "Brimstone Destroyer Core", type = "mining"}, [185877] = {name = "Nethercite Deposit", type = "mining"}, [123848] = {name = "Ooze Covered Thorium Vein", type = "mining"}, [189981] = {name = "Rich Saronite Deposit", type = "mining"}, [349900] = {name = "Elethium Deposit", type = "mining"}, [452081] = {name = "Bismuth", type = "mining"}, [452066] = {name = "Ironclaw", type = "mining"}, [276619] = {name = "Monelite Seam", type = "mining"}, [177388] = {name = "Ooze Covered Rich Thorium Vein", type = "mining"}, [413890] = {name = "Crystallized Aqirite", type = "mining"}, [181570] = {name = "Rich Adamantite Deposit", type = "mining"}, [185557] = {name = "Ancient Gem Vein", type = "mining"}, [241743] = {name = "Felslate Deposit", type = "mining"}, [349898] = {name = "Laestrite Deposit", type = "mining"}, [349981] = {name = "Oxxein Deposit", type = "mining"}, [413875] = {name = "Rich Aqirite", type = "mining"}, [276621] = {name = "Rich Monelite Deposit", type = "mining"}, [247370] = {name = "Brimstone Destroyer Core", type = "mining"}, [276618] = {name = "Platinum Deposit", type = "mining"}, [232543] = {name = "Rich Blackrock Deposit", type = "mining"}, [272778] = {name = "Rich Empyrium Deposit", type = "mining"}, [232545] = {name = "Rich True Iron Deposit", type = "mining"}, [276620] = {name = "Storm Silver Seam", type = "mining"}, [221541] = {name = "Trillium Vein", type = "mining"}, -- Herb nodes [454010] = {name = "Luredrop", type = "herb"}, [414319] = {name = "Arathor's Spear", type = "herb"}, [414317] = {name = "Orbinid", type = "herb"}, [142140] = {name = "Purple Lotus", type = "herb"}, [454055] = {name = "Luredrop", type = "herb"}, [414316] = {name = "Luredrop", type = "herb"}, [1621] = {name = "Briarthorn", type = "herb"}, [2046] = {name = "Goldthorn", type = "herb"}, [202747] = {name = "Cinderbloom", type = "herb"}, [452956] = {name = "Orbinid", type = "herb"}, [210537] = {name = "Eternal Blossom", type = "herb"}, [210539] = {name = "Eternal Blossom", type = "herb"}, [202751] = {name = "Twilight Jasmine", type = "herb"}, [210538] = {name = "Eternal Blossom", type = "herb"}, [186662] = {name = "Reagent Pouch", type = "herb"}, [202749] = {name = "Azshara's Veil", type = "herb"}, [414344] = {name = "Camouflaged Arathor's Spear", type = "herb"}, [202748] = {name = "Stormvine", type = "herb"}, [181279] = {name = "Netherbloom", type = "herb"}, [142145] = {name = "Gromsblood", type = "herb"}, [454071] = {name = "Mycobloom", type = "herb"}, [454008] = {name = "Irradiated Luredrop", type = "herb"}, [142144] = {name = "Ghost Mushroom", type = "herb"}, [202750] = {name = "Heartblossom", type = "herb"}, [2866] = {name = "Firebloom", type = "herb"}, [452979] = {name = "Luredrop", type = "herb"}, [202752] = {name = "Whiptail", type = "herb"}, [142143] = {name = "Blindweed", type = "herb"}, [2042] = {name = "Fadeleaf", type = "herb"}, [414331] = {name = "Altered Luredrop", type = "herb"}, [142142] = {name = "Sungrass", type = "herb"}, [181278] = {name = "Ancient Lichen", type = "herb"}, [1620] = {name = "Mageroyal", type = "herb"}, [414318] = {name = "Blessing Blossom", type = "herb"}, [181276] = {name = "Flame Cap", type = "herb"}, [414332] = {name = "Altered Orbinid", type = "herb"}, [414337] = {name = "Irradiated Orbinid", type = "herb"}, [2041] = {name = "Liferoot", type = "herb"}, [452973] = {name = "Luredrop", type = "herb"}, [414324] = {name = "Lush Arathor's Spear", type = "herb"}, [176589] = {name = "Black Lotus", type = "herb"}, [1623] = {name = "Wild Steelbloom", type = "herb"}, [209354] = {name = "Golden Lotus", type = "herb"}, [423363] = {name = "Sporefused Arathor's Spear", type = "herb"}, [181275] = {name = "Ragveil", type = "herb"}, [452977] = {name = "Luredrop", type = "herb"}, [176586] = {name = "Mountain Silversage", type = "herb"}, [176584] = {name = "Dreamfoil", type = "herb"}, [1624] = {name = "Kingsblood", type = "herb"} } local function GetNodeInfo(objectId) return nodes[objectId] end -- Define the crystal shape once, outside of the function local baseSize = 1.5 local height = 3 local halfHeight = height / 2 local crystal_shape = { -- Lines from v1 to v2, v3, v4, v5 {0, 0, 0, -baseSize, -baseSize, halfHeight}, {0, 0, 0, baseSize, -baseSize, halfHeight}, {0, 0, 0, baseSize, baseSize, halfHeight}, {0, 0, 0, -baseSize, baseSize, halfHeight}, -- Lines between v2-v3, v3-v4, v4-v5, v5-v2 {-baseSize, -baseSize, halfHeight, baseSize, -baseSize, halfHeight}, { baseSize, -baseSize, halfHeight, baseSize, baseSize, halfHeight}, { baseSize, baseSize, halfHeight, -baseSize, baseSize, halfHeight}, {-baseSize, baseSize, halfHeight, -baseSize, -baseSize, halfHeight}, -- Lines from v2, v3, v4, v5 to v6 {-baseSize, -baseSize, halfHeight, 0, 0, height}, { baseSize, -baseSize, halfHeight, 0, 0, height}, { baseSize, baseSize, halfHeight, 0, 0, height}, {-baseSize, baseSize, halfHeight, 0, 0, height}, } -- Modify the DrawCrystalNode function local function DrawCrystalNode(draw, nx, ny, nz, color) draw:SetColor(color) draw:SetWidth(2) draw:SetAlpha(200) local bobHeight = math.sin(GetTime() * 4) * 0.5 local baseZ = nz + 5 + bobHeight -- Use the pre-defined crystal_shape and position offsets draw:Array(crystal_shape, nx, ny, baseZ) -- Draw a small sphere at the top for emphasis draw:Circle(nx, ny, baseZ + height + 0.5, 0.3) end local function DrawNode(draw, nodeInfo, nx, ny, nz, objectId) local px, py, pz = ObjectRawPosition('player') local dist = FastDistance(px, py, pz, nx, ny, nz) local nodeType = nodeInfo.type local shouldDraw = false local color if nodeType == "mining" and Builder:GetConfig("show_mining") == "yes" and Builder:GetConfig("show_mining_" .. objectId) == "yes" then color = {0, 0, 255} shouldDraw = true elseif nodeType == "herb" and Builder:GetConfig("show_herbs") == "yes" and Builder:GetConfig("show_herb_" .. objectId) == "yes" then color = {0, 255, 0} shouldDraw = true end if shouldDraw then DrawCrystalNode(draw, nx, ny, nz, color) if Builder:GetConfig("draw_lines") == "yes" then draw:SetColor(color) draw:Line(px, py, pz, nx, ny, nz) end draw:SetColor(255, 255, 255) local displayText = string.format("%s [%dy]", nodeInfo.name, math.floor(dist)) draw:Text(displayText, "SourceCodePro", nx, ny, nz + 9) end end Draw:Sync(function(draw) for _, object in ipairs(Objects()) do if ObjectType(object) == 8 then local objectId = ObjectId(object) local nodeInfo = GetNodeInfo(objectId) if nodeInfo and ObjectLootable(object) then local nx, ny, nz = ObjectRawPosition(object) DrawNode(draw, nodeInfo, nx, ny, nz, objectId) end end end end) -- Modify the SavePreferences function local function SavePreferences() for id, node in pairs(nodes) do local key = "show_" .. node.type .. "_" .. id local value = Builder:GetConfig(key) Builder:SetConfig(key, value) end print("Node preferences saved!") end local MainSettingsTab = Builder:Tab { title = "Main Settings", content = { Builder:Checkbox { key = "show_mining", label = "Show Mining Nodes", -- description = "Toggle visibility of mining nodes.", default = "yes" }, Builder:Checkbox { key = "show_herbs", label = "Show Herb Nodes", -- description = "Toggle visibility of herb nodes.", default = "yes" }, Builder:Checkbox { key = "draw_lines", label = "Draw Lines to Nodes", description = "Draw lines between the player and visible nodes.", default = "yes" }, } } local DetailedFilterTab = Builder:Tab { title = "Detailed Filters", content = { Builder:Group { key = "mining_nodes_group", title = "Mining Nodes", content = (function() local elements = {} for id, node in pairs(nodes) do if node.type == "mining" then table.insert(elements, Builder:Checkbox { key = "show_mining_" .. id, label = node.name, -- description = "Toggle visibility of " .. node.name, default = "yes" }) end end return elements end)() }, Builder:Group { key = "herb_nodes_group", title = "Herb Nodes", content = (function() local elements = {} for id, node in pairs(nodes) do if node.type == "herb" then table.insert(elements, Builder:Checkbox { key = "show_herb_" .. id, label = node.name, -- description = "Toggle visibility of " .. node.name, default = "yes" }) end end return elements end)() }, Builder:Button { key = "save_preferences_button", text = "Save Preferences", onClick = function() SavePreferences() end } } } local MainWindow = Builder:Window { key = "node_finder_window", title = "Node Finder Settings", width = 400, -- Increased width to accommodate more content height = 600, -- Increased height to accommodate more content content = { Builder:TabGroup { key = "main_tabs", tabs = { MainSettingsTab, DetailedFilterTab, } } } } Builder:Build(MainWindow) Draw:Enable()