ZNMTracker - Organized ZNM Farming!

Language: JP EN DE FR
New Items
2026-01-06
users online
Forum » Windower » General » ZNMTracker - Organized ZNM farming!
ZNMTracker - Organized ZNM farming!
 Valefor.Keylesta
Offline
Server: Valefor
Game: FFXI
User: Keyser
Posts: 201
By Valefor.Keylesta 2026-04-08 18:11:23
Link | Quote | Reply
 
Presenting: ZNMTracker
Tracks all ZNM pop items, trophy items, and key items that your character has in easy to read window. Highlights which NMs are currently available to purchase depending on which Key Items you have. Updates as you go.





Download from GitHub repo

Features
  • Whole view for all NMs, or cut it down to a single Tier 3 path.

  • Print a list of exactly which pop and trophy items you have, which characters they're on, and where they are in your inventory.

  • Fancy tracker window.

  • Has like pretty colors and stuff.



Friend had an idea for an addon that simply printed out which ZNM pops, trophies, and key items you had. Finished that, and just kinda kept going with it. Hopefully this should help streamline a little bit any Mythics you may do. Happy ZNM'ing :)
[+]
Offline
Posts: 1272
By Tarage 2026-04-09 08:12:34
Link | Quote | Reply
 
It was brought up in a discord that I'm in so I figured I'd ask just to be safe: was AI used to write any of this? If the answer is no, please accept my apology for the insinuation. I just wanted to be safe, not sorry.
[+]
 Fenrir.Brimstonefox
Offline
Server: Fenrir
Game: FFXI
User: Brimstone
Posts: 455
By Fenrir.Brimstonefox 2026-04-09 09:49:08
Link | Quote | Reply
 
Could it search mules inv. too? (I know i can use findall to do it, but its a lot of manual searching, maybe some symbol to indicate its on another account? user could manually search for it at that point, I suppose if you multibox this gets more confusing because I think it just searches local cache which crosses all accounts)
[+]
 Valefor.Keylesta
Offline
Server: Valefor
Game: FFXI
User: Keyser
Posts: 201
By Valefor.Keylesta 2026-04-09 11:14:49
Link | Quote | Reply
 
Tarage said: »
It was brought up in a discord that I'm in so I figured I'd ask just to be safe: was AI used to write any of this? If the answer is no, please accept my apology for the insinuation. I just wanted to be safe, not sorry.
That's a fair question. The answer is.. sortof? But in the end no its my work. I was handed a non-working version that was only built to check your inventory for ZNM stuff, that was built by ChatGPT. I took that, gutted it and rebuilt it to actually work. I redid how it structured things, and added showing what bag the items were in. Then I decided to take it to the next step and add in the tracking window and all that. Everything once it hit my hands was from me. I made a mock-up first of what I wanted it to look like, then I sat there and copy/pasted sections for the lines in the tracker, filled in the names, and save/reloaded/tested over and over until I got it all right.

For funsies, here's the mock-up I first made of the tracker window since I still have it in the original file:
Code
--[[
√ = Have seal/NM trophy          ● = Can pop NM/get seal
                        Tier 1                            
[√]Vulpangue        [ ]Brass Borer      [ ]Velionis
[●]Chamrosh         [ ]Claret           [ ]Lil' Apkallu
[ ]Chs. H. Gigiroon [ ]Ob               [ ]Chigre
[●]Maroon           [ ]Cerise           [ ]Pine Green
                        Tier 2
[ ]Iriz Ima         [ ]Anantaboga       [ ]Zareehkl the Jb.
[ ]Iriri Samariri   [ ]Reacton          [●]Verdelet
[ ]Livid. Amooshah  [ ]Dextrose         [ ]Wulgaru
[ ]Apple Green      [ ]Salmon-Colored   [ ]Amber-Colored
                        Tier 3
[√]Armed Gears      [ ]Nosferatu        [ ]Mahjlaef the Pn.
[●]Ch. Grey         [ ]Purp. Gr.        [√]Fallow-Colored
[ ]Gotoh Z. the Rd. [√]Khromasoul Bblr. [√]Exp. Lamia
[√]Deep Purple      [●]Gold-Colored     [●]Taupe-Colored
[ ]Dea              [ ]Achamoth         [ ]Nuhn
[ ]Chestnut-Colored [ ]Copper-Colored   [√]Sienna-Colored
                        Tier 4
[√]Tinnin           [●]Sarameya         [√]Tyger
[ ]Lilac-Colored    [ ]Bright Blue      [ ]Lavender-Colored
                    	Tier 5
                     [ ]Pandemonium Warden
]]--


In fact actually, heres the original code from ChatGPT that I was handed if you want to compare it.
Code
_addon.name = 'ZNM_Checker'
_addon.author = 'Custom'
_addon.version = '4.0'
_addon.commands = {'znmcheck'}

-- Full authoritative ZNM item list (78 items)
local znm_items = {
    -- Pop items (31)
    [2572] = "Pandemonium Key",
    [2573] = "Monkey Wine",
    [2574] = "Ferrite",
    [2575] = "Sheep Botfly",
    [2576] = "Olzhiryan Cactus",
    [2577] = "Senorita Pamama",
    [2578] = "Oily Blood",
    [2579] = "Samariri Corpsehair",
    [2580] = "Hellcage Butterfly",
    [2581] = "Floral Nectar",
    [2582] = "Rodent Cheese",
    [2583] = "Buffalo Corpse",
    [2584] = "Pure Blood",
    [2585] = "Vinegar Pie",
    [2586] = "Rock Juice",
    [2587] = "Raw Buffalo",
    [2588] = "Bone Charcoal",
    [2589] = "Granulated Sugar",
    [2590] = "Shadeleaf",
    [2591] = "Pectin",
    [2592] = "Cog Lubricant",
    [2593] = "Singed Buffalo",
    [2594] = "Exorcism Treatise",
    [2595] = "Myrrh",
    [2596] = "Rose Scampi",
    [2597] = "Opalus Gem",
    [2598] = "M. No. 11 Molting",
    [2599] = "Mint Drop",
    [2600] = "Golden Teeth",
    [2601] = "Greenling",
    [2602] = "Spoilt Blood",

    -- Trophy items (30)
    [2609] = "Tinnin's Fang",
    [2610] = "A. Gears' Fragment",
    [2611] = "G. Zha's Necklace",
    [2612] = "Dea's Horn",
    [2613] = "Iriz Ima's Hide",
    [2614] = "Amoosh.'s Tendril",
    [2615] = "Iriri Samariri's Hat",
    [2616] = "Vulpangue's Wing",
    [2617] = "Chamrosh's Beak",
    [2618] = "Gigiroon's Cape",
    [2619] = "Sarameya's Hide",
    [2620] = "Nosferatu's Claw",
    [2621] = "Bblr.'s Vambrace",
    [2622] = "Acham.'s Antenna",
    [2623] = "Anantaboga's Heart",
    [2624] = "Reacton's Ashes",
    [2625] = "Dextrose's Blubber",
    [2626] = "B. Borer's Cocoon",
    [2627] = "Claret Globule",
    [2628] = "Ob's Arm",
    [2629] = "Tyger's Tail",
    [2630] = "Mahjlaef's Staff",
    [2631] = "Ex. Lamia Armband",
    [2632] = "Nuhn's Esca",
    [2633] = "Wulgaru's Head",
    [2634] = "Zrkl.'s Neckpiece",
    [2635] = "Verdelet's Wing",
    [2636] = "Velionis's Bone",
    [2637] = "Lil' Apkallu's Egg",
    [2638] = "Chigre",

    -- Key items (17 seals)
    [998]  = "Maroon Seal",
    [999]  = "Apple Green Seal",
    [1000] = "Charcoal Grey Seal",
    [1001] = "Deep Purple Seal",
    [1002] = "Chestnut-Colored Seal",
    [1003] = "Lilac-Colored Seal",
    [1004] = "Cerise Seal",
    [1005] = "Salmon-Colored Seal",
    [1006] = "Purplish Grey Seal",
    [1007] = "Gold-Colored Seal",
    [1008] = "Copper-Colored Seal",
    [1009] = "Bright Blue Seal",
    [1010] = "Pine Green Seal",
    [1011] = "Amber-Colored Seal",
    [1012] = "Fallow-Colored Seal",
    [1013] = "Taupe-Colored Seal",
    [1014] = "Sienna-Colored Seal",
    [1015] = "Lavender-Colored Seal",
}

-- Helper: count keys in a dictionary-style table
local function table_length(T)
    local c = 0
    for _ in pairs(T) do c = c + 1 end
    return c
end

-- Safe pcall wrapper for optional API
local function safe_call(func, ...)
    if type(func) ~= 'function' then return nil end
    local ok, res = pcall(func, ...)
    if ok then return res else return nil end
end

-- Main inventory + key item scan
local function check_inventory()
    local found = {}

    -- 1) Scan standard bags (0..11) via get_items(bag)
    for bag = 0, 11 do
        local bag_items = safe_call(windower.ffxi.get_items, bag)
        if bag_items then
            for i, item in pairs(bag_items) do
                if type(i) == "number" and item and item.id and znm_items[item.id] then
                    found[item.id] = true
                end
            end
        end
    end

    -- 2) Scan bag 8 explicitly (some builds put KIs here; item.name may be nil)
    local bag8 = safe_call(windower.ffxi.get_items, 8)
    if bag8 then
        for i, item in pairs(bag8) do
            if type(i) == "number" and item and item.id and znm_items[item.id] then
                found[item.id] = true
            end
        end
    end
	-- 3) Scan get_items().key_items table (if present; may map id->slot)
    local top = safe_call(windower.ffxi.get_items)
    if top and top.key_items then
        for k, v in pairs(top.key_items) do
            -- k is likely the KI id
            if type(k) == "number" and znm_items[k] then
                found[k] = true
            end
        end
    end

    -- 4) Some Windower builds expose a dedicated API: windower.ffxi.get_key_items()
    local key_items_api = safe_call(windower.ffxi.get_key_items)
    if key_items_api then
        -- If it returns table with numeric keys => mark them
        for k, v in pairs(key_items_api) do
            if type(k) == "number" and znm_items[k] then
                found[k] = true
            end
            if type(v) == "number" and znm_items[v] then
                found[v] = true
            end
        end
    end

    -- 5) Display results
    local count = 0
    windower.add_to_chat(207, "=== ZNM Items Present ===")
    for id, name in pairs(znm_items) do
        if found[id] then
            windower.add_to_chat(214, string.format("[✔️] %s (%d)", name, id))
            count = count + 1
        end
    end

    windower.add_to_chat(207, string.format("You have %d/%d ZNM items", count, table_length(znm_items)))
end

-- Register addon command
windower.register_event('addon command', function(cmd, ...)
    cmd = (cmd or ''):lower()
    if cmd == 'check' then
        check_inventory()
    else
        windower.add_to_chat(207, 'Usage: //znmcheck check')
    end
end)



Fenrir.Brimstonefox said: »
Could it search mules inv. too? (I know i can use findall to do it, but its a lot of manual searching, maybe some symbol to indicate its on another account? user could manually search for it at that point, I suppose if you multibox this gets more confusing because I think it just searches local cache which crosses all accounts)
I KNEW someone would ask about this lol. I did think about it briefly, I'm pretty sure I know how Findall is doing it (I assume its just building a list of all items and KIs on each character and saving it to a file that it then calls back up when you do the search across characters). I may get bored enough to add that but for now it only checks your current character.
[+]
 Valefor.Keylesta
Offline
Server: Valefor
Game: FFXI
User: Keyser
Posts: 201
By Valefor.Keylesta 2026-04-09 11:33:34
Link | Quote | Reply
 
I wanted to add, in case your concern is it doing funky things with packets, the only thing this does with packets is read the incoming packet for KI updates, This is around line 692:
Code
windower.register_event('incoming chunk', function(id)
    if box:visible() and id == 0x055 then
        updateBox()
    end
end)

Please do feel free to check the code that you have yourself (if you downloaded it), or check the github to confirm. I will never be upset/insulted at anyone checking my code (in fact if you have any suggestions or pointers I'm all ears as I'm always up for learning new things)
[+]
Offline
Posts: 1272
By Tarage 2026-04-09 22:22:06
Link | Quote | Reply
 
Valefor.Keylesta said: »
I wanted to add, in case your concern is it doing funky things with packets, the only thing this does with packets is read the incoming packet for KI updates, This is around line 692:
Code
windower.register_event('incoming chunk', function(id)
    if box:visible() and id == 0x055 then
        updateBox()
    end
end)

Please do feel free to check the code that you have yourself (if you downloaded it), or check the github to confirm. I will never be upset/insulted at anyone checking my code (in fact if you have any suggestions or pointers I'm all ears as I'm always up for learning new things)
Your candidness is very much appreciated. I think a lot of us are gun shy given how easy it is for an errant packet to get one banned. I don't think there's any risk here though.
[+]
 Valefor.Keylesta
Offline
Server: Valefor
Game: FFXI
User: Keyser
Posts: 201
By Valefor.Keylesta 2026-04-12 19:29:39
Link | Quote | Reply
 
Updated to Version 1.1
OK FINE... it will now save a characters ZNM data to an external file then pull that up when you use the check command on any character. You will, obviously, need to log into a character at least once for it to catalog that characters ZNM data.

Happy Hunting! :)


P.S. As an update to my previous statement about packets, it is now also watching incoming packets for loading inventory (it uses this to wait for inventory to load after logging into a character then doing an automatic search and save to file)
[+]
 Valefor.Keylesta
Offline
Server: Valefor
Game: FFXI
User: Keyser
Posts: 201
By Valefor.Keylesta 2026-04-14 21:20:59
Link | Quote | Reply
 
Updated to Version 1.3

  • Added items on other characters displaying on the tracker window. (v1.2)

  • Added tracking Zeni amount on tracker window.

  • Added hide tracker window on zoning.

  • Fixed a few incorrect trophy id's.

  • Fixed an issue where the tracker window would incorrectly display the colored icon that indicated another character had a pop item, after you used the pop item, if you reloaded the addon after obtaining the pop item.

[+]
Log in to post.