Skip to content
This repository was archived by the owner on Oct 11, 2026. It is now read-only.

Releases

V3.2

Choose a tag to compare

@github-actions github-actions released this 11 Oct 19:55

LAST RELEASE FROM ME.

A fix-and-hardening release from a full code review, plus one new (opt-in)
plugin. Drop-in update from 3.1. A few behaviours changed on purpose; they are
listed under Changed.

New

  • GM Commands plugin (/ac gm, off by default). A searchable reference and
    runner for the server's # GM commands with argument boxes, a quick bar,
    history and favourites. Destructive commands ask first; password and
    login-server commands are never saved or echoed.
  • NMS Looter Handoff plugin (off by default): hands the active-looter role
    between your boxes by priority, in all zones or dynamic zones only.
  • High Priority spells. Mark emergency heals, lifetaps or other Spell Gems
    to be checked right after Abilities, before clickies.
  • Boss option for Spell Gems and AAs: fire only on named mobs.
  • Ordered self/group targets (Me, then Group / Group, then Me) for spells,
    discs and clickies.
  • Puller: Universal and per-zone Pull / Ignore lists with a zone NPC
    picker.
  • Waypoint patrol combat anchors and redesigned node settings.
  • Med Break can ignore group combat.

Fixed

  • Targeting an NPC no longer counts as combat. Clicking a merchant or
    conning a distant mob used to fire in-combat rules and repositioning.
  • "You have entered an area where levitation..." no longer acts like a zone
    change
    (it paused the bot and cleared the camp and lockouts).
  • Heals no longer freeze movement or stand you up when the chosen heal
    cannot fire; the next eligible heal is tried.
  • Buffs on groupmates and pets are recast when they wear off (non-bard
    "missing buff" entries were cast once per life).
  • Puller (Hunt) closes on XTargets out to the Hunt radius instead of
    marking them unreachable.
  • Player chat can no longer trigger the "too far away", "can't see your
    target", line-of-sight, crit DoT / heal floaters or DPS melee parsing.
  • Settings that did not save: Clickies-tab edits, Min XT on Disciplines /
    Abilities. The Pull Spell no longer resets to gem 1.
  • Memorizing an unscribed spell no longer empties the gem first.
  • Switching characters saves the old character first and no longer copies
    its data into the new one.
  • Swarm pets and familiars are not mistaken for your main pet.
  • Map NPC tracker no longer re-targets the selected mob every frame, and a
    click on the map no longer turns Follow off.
  • Game Database prefix search no longer skips names.
  • Hot Buttons: a set named end, for, etc. no longer wipes the button
    library.
    A library that fails to load is kept as .corrupt and saving is
    paused until you reload or /ac btn reset confirm.
  • Cursor Manager only destroys the exact item you confirmed.
  • Inventory give never trades equipped gear unless you picked that slot, a
    cancelled trade is reported as failed, and drag-and-drop onto an occupied
    slot completes the swap.
  • DPS meter counts only your damage (not other players' damage shields,
    nukes or pets).
  • Auto AA stops reopening the AA window for rows that are maxed or
    unaffordable.
  • Chat Windows: mute / unmute apply to lines already shown, history is never
    wiped by Clear notifications, and native item-link clicks are no longer
    hijacked while the chat is hidden.
  • One error in a chat event no longer stops the script.
  • Self-targeted cures during combat no longer drop your hostile target.

Changed

  • Auto-Accept trusts exact names only (stored IDs no longer authorize), and
    expedition invites are accepted only when the dialog's own sender is
    whitelisted.
  • Box Network trust now gates inventory snapshots, remote trade-accept and
    group-scoped Camp Here; a remote NMS Destroy needs Arm Destroy on the
    receiving box.
  • Entering a zone with no saved waypoint route clears the live route.
  • Buffbot caps queued tells and answers thank-yous / bans at most once per
    few minutes per player.
  • Cursor Manager: tick Confirm Destroy again for each destroy.

Full change log: CHANGELOG.md

📦 Installation & Updating

🆕 New installation

  1. Download the latest RoF2 MacroQuest from https://github.com/macroquest/macroquest/releases and extract it somewhere like C:\MacroQuest.
  2. Download TriuneAutocombat-full.zip from the Assets below. It has everything: the Lua scripts, config, the offline game database (resources/gamedb/) and the MQ2Nav zone navmeshes (resources/MQ2Nav/).
  3. Extract the zip into the root of your MacroQuest folder. It merges lua/, config/ and resources/ into place.
  4. Windows users: add your MacroQuest folder as an antivirus exception before running it.
  5. Start MacroQuest.exe, then log into Project Triune. Triune opens by itself when you log in - if you close it, type /ac or /lua run triune.

🔄 Updating an existing installation

  1. Download TriuneAutocombat-Update.zip from the Assets below. It has everything except the MQ2Nav navmeshes (they rarely change) - grab the full zip if you also need those.
  2. Extract it into the root of your MacroQuest folder and overwrite files if asked.
  3. If Triune was running, type /ac restart (or relog) to load the new version.

Your own settings and saved loadouts (config/triune_loadout_<server>_<char>.lua, config/triune_chat_<Name>.lua) are never overwritten.

Release V3.1

Choose a tag to compare

@gennro gennro released this 18 Sep 22:49

A bug-fix release for 3.0. No new plugins; if you are on 3.0 this is a
straight drop-in update.

Fixed

  • Box Network: crash in mq2lua.dll. Pressing a group- or single-box Box
    Control button more than once (or any /ac net group ... / /ac net Bob ...
    command, ping, buffme) could crash the client. The RPC reply was read after
    MacroQuest had already freed it; it is now read immediately.
  • Box Network: /ac net all /camp runs /camp. A full slash command sent
    over the network now runs on the boxes exactly as typed instead of being
    mangled into an /ac command.
  • Effects & Songs / Spell Gems: wrong buff totals and missing rows. Buff
    durations were read through a string fallback that mistook ticks for
    seconds, so a 60-minute buff showed as 600 s and a 2h30 buff as 1.5 s with
    the bar pinned full; disc reuse timers past 50 minutes had the same hole.
    The Effects window also walks all 42 buff slots and shows the running
    discipline, and the Spell Gem bar no longer trusts Me.NumGems alone.
  • Auto AA: priorities are bought first. Checked priority abilities are
    trained before the fireworks cap spender gets to spend anything; the spender
    no longer runs while a priority is still saving up.
  • Puller (Hunt): the Combat Radius Anchor is a hard limit. XTarget adds and
    chases no longer drag the character outside the anchor circle.
  • Manual mode: with Stick to Target off, a selected hostile in reach is
    fought
    instead of being ignored until something else engaged it.
  • Floating Damage: melee, ranged and skill crits float. Only spell and heal
    crits used to show.
  • Chat Windows: NPC dialogue links answer the NPC ([ready],
    [Non-Respawning] and other EQEmu saylinks) instead of searching for an
    item.
  • Chat Windows: every tab keeps its own history, so guild / ooc lines are
    no longer pushed out by one fight's combat spam.
  • Parcels: Collect All works on UIs where Parcels is not the third tab, and
    the parcel list shows Item / Qty / From / Sent / Note in the right columns.
  • Navigation: a character stranded on a navmesh island no longer waits
    forever.

Improved

  • Hot Buttons: custom Box Network commands and a single-box scope on the
    Box Control tab of the Add From Game browser.
  • Chat Windows: NMS loot lines get their own channel.

Full change log: CHANGELOG.md

📦 Installation & Updating

🆕 New installation

  1. Download the latest RoF2 MacroQuest from https://github.com/macroquest/macroquest/releases and extract it somewhere like C:\MacroQuest.
  2. Download TriuneAutocombat-full.zip from the Assets below. It has everything: the Lua scripts, config, the offline game database (resources/gamedb/) and the MQ2Nav zone navmeshes (resources/MQ2Nav/).
  3. Extract the zip into the root of your MacroQuest folder. It merges lua/, config/ and resources/ into place.
  4. Windows users: add your MacroQuest folder as an antivirus exception before running it.
  5. Start MacroQuest.exe, then log into Project Triune. Triune opens by itself when you log in - if you close it, type /ac or /lua run triune.

🔄 Updating an existing installation

  1. Download TriuneAutocombat-Update.zip from the Assets below. It has everything except the MQ2Nav navmeshes (they rarely change) - grab the full zip if you also need those.
  2. Extract it into the root of your MacroQuest folder and overwrite files if asked.
  3. If Triune was running, type /ac restart (or relog) to load the new version.

Your own settings and saved loadouts (config/triune_loadout_<server>_<char>.lua, config/triune_chat_<Name>.lua) are never overwritten.

Release V3.0

Choose a tag to compare

@gennro gennro released this 17 Sep 23:35

The biggest update yet. Triune is now a plugin system: every window and tool is
its own file in lua/tac/, can be turned on or off under Settings -> Plugins,
and a broken plugin no longer takes the bot down with it.

New

  • Box Network - your Triune instances on one PC now talk to each other over
    MacroQuest Actors (nothing extra to install). Assist boxes follow the main
    assist's real target, pullers stay off each other's mobs, boxes count as
    allies for cures and buff requests, and /ac net all <command> runs a command
    on every box.
  • Chat Windows (/tacchat) - a full chat window replacement: tabs, filters,
    colours, highlights, a Tells window, @Name completion, input history,
    clickable item / spell / NPC links, and tells that survive a crash.
  • Game Database (/ac db) - an offline copy of the server's items, NPCs and
    spells with search, item filters and a Spell Info replacement window. Ships in
    resources/gamedb/ (included in the update zip).
  • Hot Buttons (/ac btn) - Button Master-style hotbars with cooldown
    overlays, share strings and Group / Zone / All box-control buttons.
  • NMS Loot (/ac nms) - the server's #nms personal loot system as a
    window, shared across your boxes.
  • Inventory & Bank: Box Inventories - see every box's bags and hand items
    between characters from one window.
  • Parcels (/ac parcels) - tells you when parcels arrive and collects them
    all at a parcel merchant.
  • Update Checker (/ac update) - tells you when a newer release is out.
    Nothing is downloaded automatically.
  • Group DPS meter in the DPS Parser, fed by the Box Network.
  • Floating Damage 2.0 - impact pops, damage tiers, combos and records.
  • Diagnostic logging - /ac log on writes to a file in Logs/, /ac dump
    saves a one-shot state dump for bug reports.

Improved

  • Every window: one right-click menu, hide title bar, ghost fade, and a
    global UI scale (/ac scale 1.25).
  • Target & Player HUD: cast bars, every pet you own, and the target frame
    as its own popout window.
  • Extended Target: per-spawn Force / Ignore toggles; pets and friendly
    players are hidden.
  • Manual mode: stick-to-target and auto-nav are optional, and another
    character's fights no longer count as your combat.
  • Ranged and Spell combat styles are back (/ac style melee|ranged|spell).
  • Multi-pet tracking: one pet per class, no duplicates, no re-summon loops.
  • Auto AA no longer needs MQ2AAspend - every purchase goes through the AA
    window - and fireworks are summoned only after the AA is actually bought.
  • Navigation: a character stranded on a navmesh island no longer waits
    forever; the map draws player movement smoothly.
  • Compact Mini HUD reworked, with Ghost mode as its own option.
  • Only heals cast through a hostile target; everything else selects the caster.
  • Separate has Poison and has Disease triggers.

Removed

  • The popout Character Stats / Inventory / Currency window (the Inventory &
    Bank plugin replaces it).
  • The standalone companion scripts (triune_spellbook.lua, map, DPS, inventory,
    buffbot, cursor) - they are all plugins now and open from the header buttons.
  • The MQ2AAspend dependency for Auto AA.

Full change log: CHANGELOG.md

📦 Installation & Updating

🆕 New installation

  1. Download the latest RoF2 MacroQuest from https://github.com/macroquest/macroquest/releases and extract it somewhere like C:\MacroQuest.
  2. Download TriuneAutocombat-full.zip from the Assets below. It has everything: the Lua scripts, config, the offline game database (resources/gamedb/) and the MQ2Nav zone navmeshes (resources/MQ2Nav/).
  3. Extract the zip into the root of your MacroQuest folder. It merges lua/, config/ and resources/ into place.
  4. Windows users: add your MacroQuest folder as an antivirus exception before running it.
  5. Start MacroQuest.exe, then log into Project Triune. Triune opens by itself when you log in - if you close it, type /ac or /lua run triune.

🔄 Updating an existing installation

  1. Download TriuneAutocombat-Update.zip from the Assets below. It has everything except the MQ2Nav navmeshes (they rarely change) - grab the full zip if you also need those.
  2. Extract it into the root of your MacroQuest folder and overwrite files if asked.
  3. If Triune was running, type /ac restart (or relog) to load the new version.

Your own settings and saved loadouts (config/triune_loadout_<server>_<char>.lua, config/triune_chat_<Name>.lua) are never overwritten.

Release V2.14

Choose a tag to compare

@gennro gennro released this 12 Sep 13:51

2026-09-12

  • Canonical Version Bump to 2.14 (TAC/lua/triune.lua, README.md, tests/test_pure_logic.lua).

    • Bumped canonical suite version to 2.14 across TAC/lua/triune.lua and README.md.
    • Updated test assertions across Suites 77, 78, 79, and 81 in tests/test_pure_logic.lua (2,432 tests passing).
  • Release Archive Packaging at Archive Root (.github/workflows/release.yml, README.md).

    • Flatten Archive Directory Structure: Changed git archive packaging in .github/workflows/release.yml to target tree HEAD:TAC instead of repository root paths, placing lua/, config/, and resources/ directly at the root of TriuneAutocombat-full.zip and TriuneAutocombat-Update.zip.
    • Root Documentation Inclusion: Included README.md and CHANGELOG.md at the root of the generated release archives using --add-file.
    • Purged Deprecated Bridge Paths: Removed deleted bridge scripts (TAC/triune_llm_bridge.py, start_bridge.*) from the release archive file list, resolving CI archive generation failures.
    • Updated Installation & Update Instructions: Updated release notes and README.md Quick Start instructions to direct users to extract the archive directly into the MacroQuest folder without navigating or dragging out of a subfolder.
  • Auto AA Minimum 5 AA Bank Slider & Auto-Purchase Reliability (TAC/lua/triune.lua, tests/test_pure_logic.lua).

    • Enforce 5 AA Minimum on Bank Slider: Updated the Auto AA bank reserve slider in UI.drawAutoAATab (##autoAaThresh) to enforce a minimum of 5 AA (range 5 to 100), updated tooltips accordingly, and sanitized ctrl.auto_spend_aa_threshold to a minimum of 5, preventing rapid continuous re-evaluation that caused micro-pauses in the main script loop.
    • Early Low-Point Evaluation Bypass (checkAutoSpendAA): Added an early check (if unspent < 5 then return false end) to immediately exit evaluation when points are below 5, eliminating unnecessary AA window querying and evaluation pauses.
    • Multi-Character Repeatable Spender Reliability (Alternately Advanced Fireworks): Resolved an issue where Alternately Advanced Fireworks auto-spent on one character but stalled on another by whitelisting Special tab abilities (runtime.isSpecialTabAA) and ctrl.auto_spend_aa_name from cross-class stub rejection in isAAAllowedForPlayer, assigning synthetic maxRank = 1 in recordScannedAA, and persisting Special tab abilities once discovered.
    • Window Trainer Substring Matching Safety: Removed dangerous substring overmatching in findAAInWindowLists (cleanTarget:find(cleanRow)), preventing unintended shorter abilities from incorrectly intercepting selection of longer target abilities.
    • Class AA Tab Routing: Added class abbreviation detection and ability database cross-referencing in startAATrainWorkflow to route Class-specific AAs directly to Tab 3 (Class) rather than falling back to Tab 1 (General).
    • Search Box Filter Cleanup: Added automatic clearance of leftover in-game search filter text in AAW_SearchBox during window preparation to prevent search filter interference during list selection.
    • Added Unit Test Suite 84: Added comprehensive tests in tests/test_pure_logic.lua validating the 5 AA minimum slider, low-point evaluation gating, Special tab repeatability, and safe window list matching (2,447 tests passing).
  • Remove Popout Character Stats, Inventory & Currency Window (TAC/lua/triune.lua, README.md, tests/test_pure_logic.lua).

    • Eliminated Popout Character Window (TriuneCharacterWindow): Removed the embedded Character Stats, Inventory & Currency popout window and its rendering routine UI.drawCharacterWindow(), streamlining the main engine codebase while preserving the dedicated standalone triune_inv.lua module.
    • Removed Associated Configuration & State: Purged character window configuration keys (show_character_window, char_lock, char_alpha, char_show_zerocur, char_alt_filter, char_slots_per_row) from defaultCtrl, and removed transient cache fields (cachedInvStats, statSyncRequested) from runtime.
    • Removed Toolbar Buttons & Commands: Removed the Character button from the main header toolbar, the Char button from the Compact Mini-Window toolbar, window manager entry (character), and the /ac char slash command and help documentation.
    • Pruned Redundant Background Loops: Eliminated background equipment changes polling (runtime.checkWornItemsChanged), inventory stats window scraping (runtime.scanStatsFromInventoryWindow), and the pending currency action loop from the main combat coroutine.
    • Preserved Shared Vector Primitives: Retained UI.col32 and UI.toVec vector drawing primitives required by the Popout Spellbook and Popout Spell Gem Bar windows.
    • Canonical Version Bump: Bumped version to 2.13 across TAC/lua/triune.lua, README.md, and test suites (2,438 pure logic tests passing).
  • Hours Formatting for Effects & Songs Popout Window and Buff/Ability Timers (TAC/lua/triune.lua, tests/test_pure_logic.lua).

    • Updated fmtSec to format durations of 3600 seconds or greater using hours and minutes (e.g. 45h, 45h 5m, 1h 30m, 1h), preventing long-duration buffs, GM auras, and potion effects from cluttering progress bars and hover tooltips with unwieldy minute counts like 2700m.
    • Added unit test coverage in tests/test_pure_logic.lua across both the fmtSec core logic suite and Suite 77 (Popout Effects & Songs Window) validating exact hour/minute formatting and long duration buff edge cases.
  • Fix Spell Recast Timer Countdown in Popout Spell Gem Bar (TAC/lua/triune.lua, tests/test_pure_logic.lua).

    • Smooth Real-Time Recast Interpolation: Fixed a bug where math.abs((nowClock + querySec) - endAt) > 1.2 repeatedly re-anchored runtime.gemCooldownEnd against static or 6-second discrete tick query values, causing the recast countdown to freeze and continuously display the initial recast delay instead of counting down.
    • Cast Completion & GCD Alignment: Recast countdowns are now primed during active casting and begin immediately upon cast completion. While cooling down (rem > 0), the timer decrements continuously frame-by-frame (10 -> 9 -> ... -> 1 -> 0) without periodic mid-cooldown resets.
    • Gem Swap & Memorization Invalidation (runtime.gemCooldownSpell): Tracks the scribed spell name for each slot, immediately invalidating stale cooldown anchors if a gem is memorized with a different spell.
    • Enhanced Query Parser & Overlay Formatting: Upgraded UI.getGemCooldownSec to leverage parseDurationSec and proper MQ property extraction, and added hours support (%dh) to gem button overlay text for extreme recast abilities.
    • Automated Verification: Added discrete tick anti-freeze and continuous countdown simulation assertions to Suite 79 in tests/test_pure_logic.lua (2,496 tests passing).
    • Static Analysis Fixes: Fixed undefined isCastingThis variable scoping within the gem cooldown calculation block and removed redundant timer = 0 reassignments, achieving 0 warnings across all files in Luacheck.
  • CI Test Suite & Satellite Theme Check Updates (tests/test_pure_logic.lua, tests/check_theme_consistency.sh).

    • Guarded Quest Database File Loading: Updated Suite 57 in tests/test_pure_logic.lua to only assert and load quest catalog, expansion, and zone data files when present on disk, resolving unit test failures following the removal of TAC/resources/triune_quest/.
    • Updated Theme Consistency Canonical & Satellites: Set triune_cursor.lua as the canonical satellite module and pruned deleted modules (triune_buttons.lua, triune_test.lua) from tests/check_theme_consistency.sh, bringing the theme consistency check to 100% passing.

📦 Installation & Updating Instructions

🆕 New Installation

  1. Go here and grab the latest macroquest release https://github.com/macroquest/macroquest/releases and extract under your user folder.
  2. Download TriuneAutocombat-full.zip below and extract directly into the root of your MacroQuest folder.
  3. If running windows add an exception to your MQ folder before running.
  4. Start MacroQuest.exe before launching EverQuest.

🔄 Updating an Existing Installation

  1. Download TriuneAutocombat-Update.zip from the Assets below.
  2. Extract directly into the root of your MacroQuest folder (overwrite files if prompted).
    Note: Your personal settings and saved loadouts in triune_loadout.lua are preserved and will never be overwritten.

Release V2.03

Choose a tag to compare

@gennro gennro released this 07 Sep 20:34

2026-09-07

  • "Ignore Distant XTargets When Pulling" now defaults ON (triune.lua). ctrl.ignore_distant_xtargets defaults to true so the shown toggle state matches the new pull-time behavior out of the box; existing saved loadouts with an explicit value keep their stored setting.

  • Per-character loadout files (triune.lua, triune_map.lua). When multiple MQ clients share one MQ install folder, every client wrote to the same triune_loadout.lua — and since the ignore/pull lists, zone hazards, and zone-waypoint presets live at the top level of that file (under __ignore / __pullList / __zoneHazards / __zoneWaypoints / __zoneWaypointPresets), settings and lists were bleeding between different characters across clients. Triune now writes triune_loadout_<server>_<char>.lua (per-character file), and loadAll prefers that file, re-loading it when the character is first detected in the main loop (migrating from the legacy shared file on first save). The map syncs this character's file first (mq.configDir/triune_loadout_<server>_<char>.lua), then falls back to discovery/legacy names so pre-migration setups keep working; candidates now pair every directory with both the per-character name and the legacy name. On a transient parse failure the map now keeps the previous overlay state instead of blanking the triune overlays for a sync cycle (guards against reading mid-write).

  • Search/Pull radius read live from the triune loadout; slider removed (triune_map.lua, triune.lua). Triune's own control table only contains camp_radius (default 100, the "Camp/Pull Radius"), hunter_radius (default 1500, the "Search Radius" — the one true hunt/pull search range triune uses at lines 13878/19881/19996/20029), and hunter_combat_radius (default 250, the anchor roam radius) — there is no pull_radius or combat_radius field, so the old map "Search / Pull Radius" slider (seeded from those phantom fields, clamped to 25–600) was driving a circle radius that brave triune never used. The slider is gone; the search/pull/roam circle now renders td.hunterRadius straight from triune_loadout.lua and the map defaults now match triune exactly (camp 100, search 1500). The map no longer invents its own radius. On triune's side, the three radius sliders (Camp Radius, Search Radius, Combat Radius, Pull Radius) previously assigned ctrl.* without persisting — the circumference setting only hit the loadout file on some unrelated later save. Each slider now calls runtime.saveLoadout(true) on change (plus updateMapRadiusVisuals for the native-map visuals), so moving the slider in triune is immediately visible on the custom map at next sync.

  • Triune camp / pull / anchor / waypoint map overlays restored & expanded (triune_map.lua). The map already synced camp, pull/search, and patrol-waypoint overlays from triune_loadout.lua (saved by triune.lua into the MQ config dir) — camp anchor pin + camp radius, waypoint nodes/arrival & scan radii with connecting patrol lines, the pull/search roam circle, and hazard hotspots. This change adds the missing Hunter/Puller combat anchor (hunter_combat_loc + hunter_combat_radius, the "Anchor / Roam Point"): syncTriuneLoadout now populates state.triuneData.hunterAnchor / hunterCombatRadius, the canvas draws a magenta anchor pin with its max-roam radius circle and label, and the pull/search roam circle now anchors at anchor > camp > player (previously camp > player). New persistent "Show Anchor / Roam Point" toggle in Settings & Layers, and the Triune status line reports anchor set/none plus the resolved loadout path. To make the overlays resilient across install layouts, triune_loadout.lua discovery now mirrors the multi-path search triune itself uses for triune_data.lua (mq.configDir, mq.luaDir, script-relative TAC/config / config, cwd), and the manual "Sync Triune Data" button prints the exact searched locations and a hint to run /lua run triune when the file cannot be found. The triune overlays now draw from a dedicated drawTriuneOverlays helper invoked under pcall (with a throttled one-per-5s chat error report), so a single malformed overlay datum can never abort the rest of the canvas frame — previously the whole frame after the overlay section (circles and NPC markers) silently vanished whenever anything in that block errored, which read as "circles not maintained while the map updates." The pull/search roam circle disappeared every update because syncTriuneLoadout re-seeded ctrl.customSearchRadius from the loadout on every 2.5s re-sync (clobbering the slider), while the circle itself was anchored at the camp/anchor — so enlarging the radius via the slider would push the circle's edge into view and the next sync would shrink it back off-screen. The circle is now anchored at the player and always visible around the toon, the slider value is respected for the session (state.searchRadiusTouched) and never re-clobbered by periodic re-syncs, and it no longer issues per-frame mq.TLO.Me.X/Y() fetches (it reuses the cached/interpolated player position passed into drawTriuneOverlays). The manual sync also prints a load summary (loadout path, waypoint/camp/anchor/hazard counts). Note: TAC/config/triune_data.lua holds spell/AA data only; camp/pull/anchor/waypoints live in triune_loadout.lua under the MQ config dir. Verification: luac -p clean, main chunk 116 locals (limit 200), all 2,092 unit tests pass, luacheck 0 warnings / 0 errors.

  • Smooth player marker & camera-follow update path (triune_map.lua). Player X/Y/Z/Heading are now re-read from TLO every main-loop pass (~40ms / ~25Hz) instead of on a 100ms gate, so player motion is decoupled from the slower NPC scan cadence (500ms). The render callback additionally linearly interpolates the player position between cache writes (lastPlayer.prevX/Y/Z + interpAt, seeded on first write so the marker never lerps from the world origin), and the interpolated position feeds the player arrow, auto-follow camera center, nav-line origin, and smart-floor bounds — giving fluid map movement/pan even though NPC markers refresh every 500ms. Target ID still rides its 100ms gate.

  • Smooth incremental spawn scanning (triune_map.lua). The periodic scanZoneSpawns() rebuilt the full NPC list (up to 120 NearestSpawn fetches plus up to 16 LineOfSight raycasts) in one synchronous main-loop pass, blocking the ImGui draw callback and making the map visibly chop every scan cycle. The scanner is now an incremental state machine (state.scanChunk): the fetch is drained in slices of 12 spawns per frame and the throttled LoS budget in slices of 4 raycasts per frame, with an atomic finalize (filter/sort/group) that swaps filteredNPCs only when the cycle completes — so the map keeps rendering the previous valid frame throughout. Init and zone changes pass forceComplete for an immediate full pass since they are one-shot events.

  • Fix: Map tool startup lag regression (triune_map.lua). The previously-added color precompute ran ImGui.GetColorU32 once per map segment/label at parse time. A typical map file holds tens of thousands of segment records, so this added tens of thousands of Lua→C++ marshal calls to every zone/map load — delaying window display by 30+ seconds (the draw callback is what actually renders, so the window appeared "missing" until parse finished). Color caching is now computed lazily on a segment's first frame and cached, so parse/load runs zero ImGui calls and renders identically.

  • Map & NPC Tracker Performance Hardening (triune_map.lua).

    • Navmesh batch cost collapse (processNavBatch, hover tooltip): The throttled background path verifier no longer computes a full PathLength for every NPC in the zone every 6 seconds (two synchronous mq2nav queries per mob, ~100 navmesh calls/sec sustained). It now runs PathExists only; the expensive exact path length is resolved on demand for the hovered mob only (throttled to ~1 refresh/sec) and cached so tooltips stay accurate. Cache freshness raised from 6s to 15s (navState.cacheFreshMs).
    • Path verification limited to the visible/needed set (scanZoneSpawns): Navmesh checks are now enqueued only for mobs that actually pass the current filters (and skipped entirely for remote ATLAS zones), instead of every scanned NPC up to the 120 cap. Mobs still awaiting their first path check are enqueued before the Pathable-Only gate so that filter can't starve itself. checkQueue compacts its nil-hole floor.
    • Spawn scan TLO storm cut (scanZoneSpawns, tracker tab): Removed the per-mob LineOfSight() raycast from every scan — LoS is now resolved lazily through a throttled losCache (≤16 raycasts per scan, nearest-first, refreshed on hover) instead of a full raycast per NPC every 300ms. Default scan cadence raised from 300ms to 500ms with a new "Spawn Scan Interval (ms)" slider in Settings & Layers (250–3000ms). Removed six redundant on-keystroke/on-filter scanZoneSpawns() calls in the NPC Tracker filter bar (the periodic scan now recomputes filters).
    • Per-frame TLO churn removed from render callback (DrawMapCanvas, DrawTriuneMapUI): Player X/Y/Z/Heading and target ID are refreshed once per ~100ms from the main loop into state.lastPlayer/state.lastTargetId; the render callback reads the cache (with a one-time pcall fallback) instead of issuing ~10 cross-language marshals every frame. Navigation.Active() reads the scan-populated navState.navActive.
    • Big-zone color precompute (DrawMapCanvas): Segment and label base colors are computed lazily on first render and cached (seg.colBase, lb.colBase90), then reused every frame when the Z-filter alpha is 1.0, eliminating a per-segment ImGui.GetColorU32(float) conversion every frame on large map files (fallback preserved when alpha is non-opaque). Computed at draw time rather than parse time so map/zone lo...
Read more

Release V2.02

Choose a tag to compare

@gennro gennro released this 06 Sep 15:57

2026-09-05

  • Out-of-Combat Self-Healing & Beneficial Target Selection Fix (triune.lua, tests/test_pure_logic.lua).

    • Differentiated In-Combat vs. Out-of-Combat Beneficial Targeting (castGem, fireAA, useClickie): In EverQuest, casting beneficial spells on yourself while actively fighting an enemy mob (hostileTarget) automatically directs the spell to yourself without dropping your combat target. However, out of combat (or when no hostile mob is selected, such as idle with no target or targeting a neutral NPC/player), EverQuest strictly requires you to explicitly select yourself (orig == mq.TLO.Me.ID()) to cast the spell.
    • Fixed needsTarget Condition: Resolved an issue where needsTarget = (not selfCast) or (not hostileTarget and orig > 0 and orig ~= id) failed to target the player when out of combat with no active target (orig == 0), causing self-heals, self-buffs, and clickies to fail with "You must target someone to cast this spell!". Unified the targeting requirement across spells, AAs, and clickies to needsTarget = (orig ~= id) and not (selfCast and hostileTarget).
    • Cast Target Retention (castTracker.targetRequired): Updated castTracker.targetRequired in castGem, fireAA, and useClickie to properly flag single-target beneficial spells as target-required when casting out of combat (not (selfCast and hostileTarget)), allowing getActiveTargetRequiredCastingId() to protect target lock on self during the cast duration.
    • Target Restoration (restoreTargetId): Preserved previous non-hostile targets (orig > 0 and not (selfCast and hostileTarget)) via restoreTargetId so that casting out-of-combat self-heals or buffs seamlessly restores the player's previous target (e.g. an NPC vendor, quest giver, or group member) upon cast completion.
    • Automated Regression Suite (Section 46): Added unit test assertions in tests/test_pure_logic.lua covering out-of-combat self-heals with no target, self-heals with non-hostile targets, and in-combat hostile target retention.
  • Unreachable Target Abandonment & Pursuit Stall Watchdog Fix (triune.lua, tests/test_pure_logic.lua).

    • Comprehensive Pursuit Stall Give-Up (moveToward): Expanded pursuit stall give-up (PURSUIT_STALL_TIMEOUT of 8s or 3 navigation stalls) beyond Puller mode to all combat modes (when not followOnly). When stalling, Triune now immediately executes clearTarget(), sets runtime.pullState = 'IDLE' and runtime.pullTargetId = 0, and clears navigation caches, preventing the target ring from holding the unreachable mob and endlessly resetting the stall timer on the very next tick.
    • Direct Navmesh Path Pre-Validation & Failure Handling (moveToward): In Stage 1 MQ2Nav navigation, when the zone navmesh is confirmed loaded and mq.TLO.Navigation.PathExists('id ' .. id)() returns false for a distant/non-LoS target, Triune no longer falls through to blind /keypress forward hold or /stick straight into walls. If a path fails for 3 consecutive checks, it marks the target unreachable, stops movement, and clears target immediately.
    • Fixed 15-Second Pursuit / Approach Watchdog (combatTick): Resolved a critical bug where the 15-second unreachable timeout in combatTick required engage or Me.Combat() or Me.AutoFire(), which was always false while running toward an unreached mob and reset the timer every tick. Replaced it with an active approach watchdog (pursuit.approachStartedAt) that resets when within striking reach or actively engaged with LoS, and times out after 15s of failing to close the gap.
    • Repositioning & Cannot-Hit Event State Preservation (repositionCloser, handleCantHitFromHere): Removed destructive pursuit.id = 0 resets from repositioning event handlers that previously wiped stall detection whenever chat reported "too far away" or "cannot hit from here". Added 4-attempt abandonment logic to handleCantHitFromHere to abandon obstructed targets after repeated failed reposition maneuvers.
    • Close-Range Roam Path Checking (findRoamTarget): Removed the hardcoded dist > 25 bypass in findRoamTarget, enforcing navmesh path validation whenever a target is outside immediate close reach or lacks line of sight.
    • Automated Regression Suite (Suite 65): Added 17 unit test assertions validating unreachable TTL, XTarget filtering, approach watchdog timing, and source logic token integrity.
  • Special Tab Alternate Advancement Native Training & MQ2AAspend Routing Fix (triune.lua, tests/test_pure_logic.lua).

    • Special Tab Detection (runtime.isSpecialTabAA): Added explicit detection for Special tab abilities (including Alternately Advanced Fireworks, glyphs, and abilities cataloged under category 'Special').
    • Bypassed MQ2AAspend for Special Tab Abilities (runtime.checkAutoSpendAA, runtime.manualSpendAA): Resolved an issue where delegating auto-spend to MQ2AAspend caused Special tab abilities to never purchase. MQ2AAspend only supports General, Archetype, and Class tabs and reports Special tab abilities as unavailable. When a prioritized or cap-dumping ability is located on the Special tab, Triune now automatically routes it directly to its native window training workflow (runtime.startAATrainWorkflow), leaving standard progression AAs to MQ2AAspend.
    • Direct Manual [Train] Button Execution (UI.drawAutoAATab, runtime.manualSpendAA): Clicking the [Train] button on a specific ability row in the AA browser table now directly and unconditionally invokes runtime.startAATrainWorkflow(targetName) to purchase that specific ability natively, rather than executing a generic /aaspend auto now command that fails on Special tab items.
    • INI Exclusions for Unsupported Abilities (runtime.syncAAsToMQ2AASpendIni): Excluded Special tab abilities from being written to [MQ2AASpend_AAList] in the character's .ini file, preventing MQ2AAspend from getting blocked or reporting invalid format errors on abilities it cannot purchase.
    • Robust UI Tab & Control Selection (runtime.processAATrainWorkflow): Enhanced the prepare_tab step to issue tab selection notifications to both AAW_Subwindows and Subwindows controls (/notify AAWindow AAW_Subwindows tabselect 4 and /notify AAWindow Subwindows tabselect 4), ensuring reliable activation of Tab 4 (Special tab) across custom UI skins.
    • Automated Regression Suite (Suite 64): Expanded test assertions to 27, validating Special tab identification, INI filtering, and native purchase routing.
  • Auto AA Ability Discovery & Accurate Cost Resolution Overhaul (triune.lua, tests/test_pure_logic.lua).

    • Comprehensive Untrained Ability Discovery (runtime.recordScannedAA, runtime.scanPlayerAAs): Fixed an issue where unpurchased/untrained character Alternate Advancements (rank 0) were discarded from the Auto AA tab because mq.TLO.Me.AltAbility(name) returns nil for unowned abilities. Added multi-tiered discovery scanning across character classes in DATA.aas, standard Archetype/General ability catalogs (COMMON_AAS), class-specific catalogs (CLASS_AAS), and AAWindow UI listboxes.
    • Recursive AAWindow Inspection (runtime.findChildRecursive, runtime.scanPlayerAAs): Replaced shallow window control searches with recursive descendant searching across all standard client listboxes (AAW_GeneralList, AAW_ArchList, AAW_ClassList, and AAW_SpecialList). Fixed incorrect window control identifier (AAW_ArchList was previously queried as AAW_ArchetypeList).
    • Accurate Cost & Rank Extraction: Extracted columns 2 (Cur/Max, e.g. 0/3) and 3 (Cost, e.g. 3) directly from client listboxes, queried global mq.TLO.AltAbility(name).Cost() and MaxRank(), and guaranteed that untrained abilities display accurate costs and ranks (0/3) rather than - or 0 costs.
    • Persistent AA Cache (runtime.cachedAAData): Implemented persistent memory across scans so that abilities discovered via UI or database retain their cost, max rank, and category even when closed or not currently selected in the client.
    • Automated & Manual Purchasing Fixes (runtime.checkAutoSpendAA, runtime.manualSpendAA): Enhanced auto-spending and manual train buttons to resolve actual costs for unpurchased abilities from cache and global TLO, allowing players to purchase rank 1 of unowned abilities rather than failing on nil checks or falling back to a 25 AA threshold.
    • Client Keypress Safety (runtime.processAATrainWorkflow): Replaced invalid /keypress alt_advancement with standard EverQuest /keypress V when opening the Alternate Advancement window during automated training.
    • Automated Regression Suite (Suite 63): Added 14 unit test assertions validating untrained ability preservation, cache persistence across scans, rank/cost updating, maxed status resolution, and non-zero fallback cost guarantees.
  • AA Special Tab Scan Infinite Loop Prevention (triune.lua, tests/test_pure_logic.lua).

    • Terminal Read State Marking (runtime.readSpecialTabOnce): Fixed an issue where failing to read the Alternate Advancement Special tab (e.g. empty ability list or unsupported window hierarchy) was treated identically to "not yet tried", causing the engine to re-attempt the read on every main-loop frame. Now sets runtime.specialTabReadDone = true unconditionally upon attempt completion, returning {} and preventing endless retries.
    • Eliminated Recursive Loop Re-Arming (runtime.scanPlayerAAs): Removed the fallback runtime.pendingReadSpecialTab = true branch inside scanPlayerAAs(), which previously re-armed the pending flag every single time a scan ran without finding Special tab abilities.
    • State-Aware Execution Gate: Restricted pendingReadSpecialTab execution in the main loop to only trigger when ctrl.auto_spend_aa is active and ctrl.paused is fal...
Read more

Release V2.0.1

Choose a tag to compare

@gennro gennro released this 05 Sep 14:47

2026-09-05

  • Project Version Bump (v2.01) (triune.lua, triune_updater.lua, README.md, tests/test_pure_logic.lua).

    • Synchronized version bump to 2.01 across the main suite (triune.lua), the standalone release updater (triune_updater.lua), repository documentation (README.md), and regression test suites.
  • Hostile Target Self-Healing & Beneficial Spell Target Correction (triune.lua, tests/test_pure_logic.lua).

    • Hostile NPC Targeting Retention for Self-Directed Heals (runtime.castGem, runtime.useClickie, runtime.fireAA): When casting single-target heals or beneficial spells on oneself (id == mq.TLO.Me.ID()) while currently attacking or targeting a hostile NPC (isHostileTarget(Target.ID())), Triune no longer changes target to the player. In EverQuest, casting a beneficial spell while targeting a hostile entity automatically redirects the spell onto the player without losing target on the enemy.
    • Target Lock Override Prevention (getActiveTargetRequiredCastingId): Updated active casting target resolution to return nil instead of Me.ID() whenever the player has a hostile NPC targeted during a self-cast heal or buff. This prevents combatTick's mid-cast target lock from dispatching /target id <Me.ID>, which previously broke auto-attack melee combat, cleared target from the engaged mob, and left the character idling on itself post-cast.
    • Context-Aware Beneficial Ally Targeting: Retained explicit target switching to Me.ID() only when the active target is a friendly ally or pet, ensuring self-heals do not accidentally land on group members while idle or between pulls.
    • Post-Cast Target Restoration Safety: Ensured post-cast restoration logic preserves the hostile mob target throughout the cast, keeping auto-attack active without interruption.
    • Automated Regression Prevention (Suite 46): Added unit test assertions verifying that self-healing while targeting an enemy NPC sets targetRequired = false, returns nil from getActiveTargetRequiredCastingId(), and retains target lock on the hostile mob throughout the cast.
  • Plugin Command Guards for MQ2Map & MQ2FOV (triune.lua).

    • MQ2Map Plugin Gate (runtime.mapLoaded, runtime.clearMapRadiusVisuals, runtime.updateMapRadiusVisuals): Added runtime.mapLoaded() probe checking mq.TLO.Map and mq.TLO.Plugin('mq2map') before executing map drawing commands. If MQ2Map is not loaded, Triune gracefully suppresses /mapfilter and /maploc execution, eliminating DoCommand - Couldn't parse '/maploc remove' and /mapfilter red chat errors when running without the map plugin.
    • MQ2FOV Plugin Gate (runtime.fovLoaded, runtime.applyFov): Added runtime.fovLoaded() probe checking mq.TLO.Plugin('mq2fov') before dispatching /fov <val> commands. Prevents DoCommand - Couldn't parse '/fov 150' red errors on MacroQuest installations that do not have the legacy FOV plugin loaded.
    • Settings UI Status Indicators: Added telemetry notices in the Settings tab indicating when MQ2Map or MQ2FOV are not loaded, providing clear feedback on feature availability.

📦 Installation & Updating Instructions

🆕 New Installation

  1. Go here and grab the latest macroquest release https://github.com/macroquest/macroquest/releases and extract under your user folder.
  2. Download TriuneAutocombat-full.zip below and extract contents of TAC into the root of your macroquest folder.
  3. Start MacroQuest.exe before launching EverQuest.
  • **Existing install
    • Download TriuneAutocombat-Update.zip from the Assets below.
    • Extract the TAC folder to the root of your macroquest folder.
    • Note: Your personal settings and saved loadouts in triune_loadout.lua are preserved and will never be overwritten.

Release V2.0-beta

Choose a tag to compare

@gennro gennro released this 04 Sep 19:38

This is a beta release, if you submit a bug report make sure you identify it is for V2.0-beta.
Do not use the built in updater from an older version cause it will not work, you have to manually update each time now.

2026-09-04

  • Project Version Bump (v2.0-beta) (triune.lua, triune_updater.lua, README.md, tests/test_pure_logic.lua).

    • Synchronized major version bump to 2.0-beta across the main suite (triune.lua), the standalone release updater (triune_updater.lua), repository documentation (README.md), and regression test suites.
  • Camera Field of View (/fov) Slider & Automatic Zoning Persistence (triune.lua, README.md, tests/test_pure_logic.lua).

    • Custom FOV Slider (50-150 units): Added a /fov slider under the Settings tab (General Settings -> Interface, Overlays & Diagnostics -> Camera & Viewport) enabling players to customize their camera viewport between 50 and 150 units (EverQuest default: ~75). Adjusting the slider or clicking the dedicated [Apply] button immediately issues /fov <value> in-game and saves the preference to triune_loadout.lua.
    • Automatic Zoning Re-Application (runtime.onZoned, runtime.pendingFovAt): EverQuest natively resets camera FOV back to default whenever zoning occurs. Triune now automatically tracks the user's desired FOV and re-applies /fov <value> immediately upon zone entry and again 1.5 seconds later to ensure the 3D rendering context and camera matrices are properly overridden after zone geometry loads.
    • Character Startup & Switch Hook (runtime.onCharacterChanged, runtime.loadAll): Enforces the configured FOV automatically when the script starts or when switching characters.
    • Maintain FOV Checkbox & Slash Commands:
      • Added Maintain Field of View (/fov) checkbox (ctrl.fov_enabled, default: false, auto-enabled on slider drag or Apply).
      • Added /ac fov [50-150|on|off] (aliases /ac setfov, /ac camfov) chat commands for quick toggling, inspection, or value adjustment.
    • Automated Test Coverage (Suite 59): Added 25 unit test assertions covering default ctrl shape, slider value clamping (50-150), slash command parsing, mock execution, and simulated zone re-application.
  • Assist Mode Combat Positioning: Position Behind NPC with Aggro Safety & Toggle (triune.lua, README.md, tests/test_pure_logic.lua).

    • Automated Flank/Rear Positioning (runtime.positionBehindTarget, combatTick): In Assist mode, characters engaging in melee combat automatically maneuver behind the attacked NPC so only the Main Assist tanks the front arc, completely mitigating frontal ripostes, parries, blocks, and frontal area-of-effect abilities while enabling Rogue backstabs.
    • Aggro Safety Gate (runtime.playerHasAggro): If the assistant character pulls aggro or is being attacked directly, behind-positioning is immediately suspended and switches to direct target facing, preventing infinite circling/spinning while tanking. Behind positioning automatically resumes the moment the Main Assist or another group member regains aggro.
    • MQ2MoveUtils & Geometric Vector Dual Stack (runtime.isBehindTarget, runtime.getBehindLoc):
      • Leverages MQ2MoveUtils (/stick id <tid> <dist> behind) when loaded for continuous, smooth orbital rear tracking.
      • Implements an autonomous trigonometry fallback calculating real-time rear coordinates based on the NPC's compass heading vector ($x_{behind} = x_{target} - dist \cdot \sin(\theta_{rad})$, $y_{behind} = y_{target} - dist \cdot \cos(\theta_{rad})$) and dot-product rear-arc detection ($\le 0$ dot product).
      • Extends moveToward fallback, repositionCloser(), and handleCantHitFromHere() with the behind modifier for seamless repositioning.
      • Cleans up active stick commands (/stick off) whenever targets die or auto-attack disengages.
    • User Configurable Opt-Out Checkbox & Slash Command:
      • Added Position Behind NPC checkbox (ctrl.assist_behind, default: true) to the Assist mode controls tab with a descriptive tooltip explaining the MA vs assistant group mechanics.
      • Added live status feedback in the Assist Operations summary (Behind: Enabled/Disabled).
      • Added /ac assistbehind [on|off] (and /ac behind [on|off]) slash command support for convenient macro and chat toggling.
    • Automated Test Coverage (Suite 58): Added 14 unit tests validating default and sanitized state initialization, pure geometric rear-arc detection across all 4 cardinal headings ($0^\circ, 90^\circ, 180^\circ, 270^\circ$), rear coordinate calculations, aggro behavior branching, and slash command toggle logic.
  • New Subsystem: Triune Quest Guide & Server-Ground-Truth Quest Database (triune_quest.lua, triune_quest/, build_triune_quest.py, tests/test_pure_logic.lua).

    • Standalone Interactive Quest Guide Window (TAC/lua/triune_quest.lua): Introduced a fully standalone, era-aware ImGui quest browser runnable via /lua run triune_quest. Styled with the unified dark cyan/blue Triune theme tokens, complete with master-detail split layout, search bar, expansion dropdown, level slider, and hide-completed toggle.
    • Comprehensive Multi-Expansion Quest Catalog (Classic to Expansion 32): Precompiled 2,633 full quest walkthroughs spanning 32 expansions into partitioned, on-demand per-zone Lua packages (TAC/resources/triune_quest/zones/<shortname>.lua) and a lightweight search index (catalog.lua). Minimizes LuaJIT memory consumption by loading only active zone data on-demand.
    • Server Ground-Truth Integration (NMS Quests Repository): Cross-referenced with the exact server quest repository (Release-NMS-Quests/), indexing 6,647 NPCs across 220 zones to verify exact NPC locations, 100% accurate say dialogue prompts, hand-in item IDs, and quest rewards.
    • Live NPC Spawn Radar & One-Click Navigation: Detects if the quest giver is currently spawned in the zone via mq.TLO.Spawn, calculating real-time distance and cardinal heading. Provides [Target] and [Navigate to NPC] buttons executing /nav spawn npc or /nav loc.
    • Interactive Dialogue Prompts (Click-to-Hail): Automatically presents clickable prompt buttons for hails and bracketed responses that target the NPC and issue /say <prompt> in the main coroutine loop.
    • Live Inventory Turn-In Scanner: Scans character inventory in real-time (mq.TLO.FindItemCount), displaying collected vs required item counts ([OK] 4x Gnoll Fangs (In Bags: 4/4)) with intuitive color status cues.
    • Per-Character Quest Completion Persistence: Saves completed and tracked quests to mq.configDir/triune_quest_<Server>_<Char>.ini, allowing easy filtering of completed quests across multiple characters.
    • Automated Compilation Tool (TAC/tools/build_triune_quest.py): Built an automated build script to normalize zones, extract coordinates and dialogues, and emit syntax-verified Lua 5.1 safe tables.
    • Hardened ImGui Input Signatures & Render Stack Protection: Corrected InputTextWithHint return value order (newSearch, changedSearch) and checkbox tuple unpacks, guarded searchTerm with strict string type-checks in refreshActiveQuests, and wrapped inner window rendering in pcall within UI.drawQuestGuide to ensure ImGui.End() and popTheme() are unconditionally called on any rendering exception.
    • Server Era Limiting & Expansion Cap Filtering: Automatically detects the server's current expansion cap using mq.TLO.Me.HaveExpansion() or triune_data.lua (era_expansion). Added a dedicated [X] Server Era Limit toggle and interactive expansion cap selector in the toolbar, dynamically hiding future expansion quests and pruning the expansion dropdown to only show content available on the current server. Preferences are persisted to character INI.
    • Zone Directory Atlas & Global Quest Search Lookup Page (UI.drawLookupTab, UI.drawBrowseZonesView, UI.drawGlobalQuestSearchView):
      • Multi-Tab Architecture (QuestGuideMainTabBar): Introduced a tabbed interface hosting the active Zone Guide walkthrough tab and the new Zone & Quest Lookup exploration tab, with seamless programmatic tab switching via state.requestTab.
      • Norrath Zone Directory Browser (UI.drawBrowseZonesView): Built an interactive directory indexing all 169 zones across Norrath, sorted alphabetically with instant name/shortname filtering, expansion era markers, and total quest counts. Selecting any zone displays a complete quest list with levels, quest givers, completion status, and a one-click [Load in Zone Guide] button that disengages auto-sync to avoid unwanted snapping.
      • Global Norrath Quest Search (UI.drawGlobalQuestSearchView): Added a global query engine searching across all 2,633 quests simultaneously by title, NPC name, zone name, or zone shortname, with real-time era cap enforcement and hide-completed filtering.
      • One-Click Guide Jump: Clicking [Guide] next to any quest in the Lookup tabs immediately sets the target zone, selects the quest walkthrough, loads required turn-in inventory counts, and jumps directly to the Zone Guide tab.
    • Walkthrough Narrative Cleaner & Rich Formatter (UI.cleanPreambleAndTags, UI.parseWalkthrough, UI.drawFormattedWalkthrough):
      • Preamble & Metadata Stripping: Automatically removes raw wiki infobox preambles, rating tags, item/NPC bracket codes ([item=123]), and trailing footer junk, instantly exposing the real story narrative, instructions, and objectives.
      • Character Name Personalization: Replaces Allakhazam generic underscore placeholders (_____ / your name) with the player's active character name (mq.TLO.Me.CleanName()), creating an authentic and immersive quest dialog experience.
      • Semantic Tokenization & Rich Visual Styling: Parses narratives into ...
Read more

Release V1.7.8

Choose a tag to compare

@gennro gennro released this 31 Aug 23:51

2026-08-31

  • ImDrawList Function Signature Fix (triune_map.lua).
    • MacroQuest Sol3 Argument Compatibility: Added explicit numSegments (0) parameter to all 13 AddCircleFilled calls and explicit rounding (0.0) to AddRectFilled in DrawMapCanvas, preventing sol runtime errors ("no matching function call takes this number of arguments and the specified types") on Dear ImGui canvas rendering.
    • New "Auto AA" Tab (UI.drawAutoAATab): Added a dedicated top-level Auto AA tab to Triune (Status -> Control -> Settings -> Spell Gems -> Abilities -> AAs -> Auto AA -> Cooldowns -> Disciplines -> Clickies -> Help) dedicated to server AA point cap management and automated fireworks summoning.
    • Live AA Point Pool Telemetry: Renders live unspent AA points with color-coded status badges ([CAP REACHED!] in red when at 100/100, [THRESHOLD MET] in yellow, or normal status in green) alongside total spent and overall earned points.
    • Automated AAWindow UI Interaction & Training Workflow (findAAInWindowLists, runtime.startAATrainWorkflow, runtime.processAATrainWorkflow): Fully automated the in-game AA window training workflow via guarded MacroQuest /notify commands (TrainButton) for progression servers where /alt buy is disabled. Triune opens the AA window (/keypress V / /window open AAWindow), scans tabs 1-5 and UI lists (AAW_List, AAW_GeneralList, AAW_ArchetypeList, etc.) for the ability, selects the matching item (/nomodkey /notify AAWindow <list> listselect <index>), triggers the Train button (/nomodkey /notify AAWindow TrainButton leftmouseup), and cleanly closes the window when finished.
    • Streamlined Notify-Based Auto AA Tab: Simplified the Auto AA tab to eliminate redundant manual /alt buy inputs and method radio buttons, focusing purely on automated window-based training, live AA pool diagnostics, and fireworks summoning.
    • Auto-Summon Fireworks Engine (runtime.checkAutoSummonFireworks): Optionally monitors the fireworks summoning ability (ID 17788: Alternately Advanced Fireworks) and activates /alt activate <id> whenever ready (out of combat and stationary), automatically clearing the summoned firework into inventory bags (/autoinventory).
    • Interactive Actions: Added instant action buttons in the UI for Train AA Now (/notify AAWindow), Summon Fireworks Now (/alt activate 17788), and Clear Cursor (/autoinv).
    • Slash Commands: Added slash command control with /ac autoaa [on|off], /ac autofw [on|off], /ac aatrain / /ac spendnow, /ac summonnow, /ac aathreshold [25-100], /ac aacost [1-50], and /ac aaid [id].
  • Class Detection Zoning Reset & Parsing Fix (triune.lua, triune_spellbook.lua).
    • Eliminated Erroneous Zoning Class Reset: Removed destructive classesFromInventoryWindow() calls from runtime.onZoned(). Player classes are loaded on character login/switch or configured via the Class Picker UI and should not be re-scanned or overwritten during zone changes.
    • Fixed UI Text Substring False Positives (parseClassLine): Removed prefix-slice checks (sub(1, 3) and sub(1, 2)) that erroneously matched arbitrary Inventory Window UI labels and buttons to classes (such as "Skills" matching "SK" and "Magic Resist" matching "Mag", which caused myClasses to reset to {"SK", "Mag"}). parseClassLine now strictly validates entire cleaned strings or whole-word tokens against the canonical MQSHORT table.
    • Standalone Parity & Unit Tests: Synchronized MQSHORT and parseClassLine across triune.lua and triune_spellbook.lua per the Standalone File Rule, and added test coverage in tests/test_pure_logic.lua ensuring UI strings (Skills, Magic, Magic Resist, Warhammer, Stats, Inventory) correctly return nil.

📦 Installation & Updating Instructions

🆕 New Installation

  1. Go here and grab the latest macroquest release https://github.com/macroquest/macroquest/releases and extract under your user folder.
  2. Download TriuneAutocombat-full.zip below and extract contents to the same folder you extract macroquest to.
  3. Start MacroQuest.exe before launching EverQuest.

🔄 Updating an Existing Install

  • Option 1 (Recommended — Easiest): In-Game Updater
    • Click the [Updater] button on the top window header or type /ac update in chat.
    • Click Check for Updates, then Update Now to update and reload all scripts automatically without leaving the game.
    • Alternatively, run update.bat (Windows) or update.sh (Linux) from your TAC/ folder.
  • Option 2 (Manual Update):
    • Download TriuneAutocombat-Update.zip from the Assets below.
    • Extract and overwrite the files into your existing MacroQuest directory.
    • Note: Your personal settings and saved loadouts in triune_loadout.lua are preserved and will never be overwritten.

Release V1.7.7

Choose a tag to compare

@gennro gennro released this 31 Aug 11:30

2026-08-30

  • Luacheck Warning Elimination (triune.lua).

    • Direct Discipline Metric Initialization (UI.getTrackedCooldownItems): Initialized totalSec, endCost, activeTotalSec, timerGroupId, and discIdx directly from discInfo instead of pre-initializing with dummy zeroes/nil, resolving all luacheck overwritten variable warnings and ensuring clean CI passes (0 warnings / 0 errors in 10 files).
  • LuaLS Type Warnings & Nil Check Hardening (triune_buttons.lua).

    • Type-Safe Timer Key Assignment (saveEdit): Decoupled buffer string reading from tk variable declaration, eliminating LuaLS static type conversion warnings when assigning numeric gem indices, integer second delays, or nil.
    • Button Edit State Nil Guard (drawEditWindow): Added an explicit edit.tmp nil check and early close fallback before rendering the button edit controls, preventing nil index warnings across all button attribute inputs.
  • Project Version Bump (v1.7.7): Synchronized version 1.7.7 across triune.lua, triune_updater.lua, and README.md.

  • Cooldown & Active Duration Accuracy Overhaul (triune.lua, triune_buttons.lua).

    • Accurate Active Duration Calculation (parseDurationSec): Fixed active duration parsing across Alternate Advancements, Disciplines, Buffs, and Songs. MacroQuest's Me.Buff.Duration timestamp object is now parsed directly via .TotalSeconds(), .Raw() (/ 1000.0), or standard string conversion, eliminating previous tick-multiplication bugs (duration * 6 on millisecond timestamps) that erroneously multiplied milliseconds by 6.
    • Discipline Reuse & Base Cooldown Engine (getDiscCooldownAndDuration, DISC_BASE_COOLDOWNS, DISC_BASE_DURATIONS): Added a comprehensive database of era-accurate discipline cooldowns and durations across all melee/hybrid classes (War, Pal, SK, Mnk, Rog, Rng, Ber, Bst). Discipline recast lookups now seamlessly merge spell data with DISC_BASE_COOLDOWNS fallbacks when MacroQuest Spell.RecastTime returns 0 for classic EQ combat abilities.
    • Discipline Timer Parsing (parseCombatAbilityTimer): Fixed CombatAbilityTimer lookups by supporting dual-path query (both by discipline name and integer combat ability index) and properly converting raw tick values (1 tick = 6s) to seconds while safely handling millisecond returns.
    • Eliminated Phantom Cooldown Loops: Removed destructive fallback blocks in UI.getTrackedCooldownItems() that falsely set full artificial cooldowns and stamped lastDiscFiredAt = now on every frame for ready abilities gated by resource/combat checks (LOW END, BLOCKED, NEED BURN, NEED BOSS, MIN XTAR).
    • Cyan Active Progress Bar Scaling (activeTotalSec): Connected each ability's true baseline active duration (activeTotalSec) to both Table and HUD Card progress bars, ensuring active stances and buffs render a full 100% -> 0% countdown rather than a thin 2% sliver.
    • Toolbar Buttons Cooldown Sync (triune_buttons.lua): Updated getCooldown(btn) to use the shared parseTloTimer logic, properly converting CombatAbilityTimer ticks to seconds rather than misinterpreting ticks as milliseconds.
  • Control Tab UI Streamlining (triune.lua).

    • Removed Redundant Closer-Mobs Checkboxes: Removed the duplicate Check for Closer NPCs while Traveling checkboxes from the Hunter and Camp submode sections on the Control tab, consolidating closer-target movement configuration onto the dedicated Closer-NPC Retargeting During Movement section on the Settings tab.
  • Dedicated Cooldowns Tab & Shared Popout Integration (triune.lua).

    • New Cooldowns Tab (UI.drawCooldownsTab): Added a dedicated Cooldowns tab directly in the main Triune window positioned right after the AAs tab (Status -> Control -> Settings -> Spell Gems -> Abilities -> AAs -> Cooldowns -> Disciplines -> Clickies -> Help).
    • Shared Collision-Free Cooldown UI (UI.renderCooldownContent): Refactored the live ability, AA, discipline, spell, and clickie cooldown monitoring view into a unified renderer accepting unique ImGui ID suffixes (_tab vs _win), preventing ID collisions and input freezing when both the main window tab and the floating popout window are active simultaneously.
    • Popout Window Option Inside Tab: Added a dedicated Popout Window button directly inside the Cooldowns tab header, allowing users to pop out the monitor into a standalone floating window at any time while retaining full in-tab functionality.
    • Unit Tests: Added test cases in tests/test_pure_logic.lua validating the presence and exact tab sequence ordering of UI.drawCooldownsTab() right after UI.drawAATab().
  • Lua Variable Shadowing Fix (triune_map.lua).

    • Luacheck Warning Elimination: Renamed shadowed childFlags variables within DrawMapCanvas to unique identifiers (canvasChildFlags, floorNavFlags, overlayFlags), resolving all luacheck shadowing warnings and ensuring clean CI passes.
  • Map Loading Time & Anti-Stutter Performance Engine Overhaul (triune_map.lua).

    • High-Speed Stream Map Parser (parseMapFile): Replaced line-by-line regex parsing (gmatch('[^\r\n]+') + line:match(...)) with direct single-pass stream tokenizers for lines and labels, eliminating hundreds of thousands of intermediate string allocations and reducing zone map parse times by over 80%.
    • Eliminated Blocking Process Spawns (io.popen): Removed all blocking subshell child process spawns (cmd /c dir / find) from folder and file scanning routines, substituting them with instant C-level non-blocking direct file probes (<1ms total probe time across all 300+ Atlas zones) to eliminate game hitching on scan/init.
    • O(1) Navmesh Background Queue (processNavBatch): Replaced $O(N)$ table.remove(queue, 1) array shifts with an $O(1)$ amortized queueHead pointer, preventing frame drops during background navmesh path verification.
    • Optimized Radar Spawn Scans (scanZoneSpawns): Throttled maximum nearby NPC radar queries to 120 closest spawns, eliminating $O(N^2)$ NearestSpawn iteration freezes in densely populated zones.
  • Compact Map UI & Floating Bottom Control Dock (triune_map.lua).

    • Removed Redundant Top Toolbar: Eliminated the top text bar and metrics header above the tab bar so the tabs start flush at the top of the window, maximizing vertical map canvas viewing area.
    • Unified Floating Canvas Control Dock (##MapControlOverlayChild): Relocated the Follow checkbox, Center Me / Center Map, POIs drawer toggle, Stop Nav, and Live Zone return buttons down into a sleek floating 2-row bottom-right overlay dock alongside +, -, ⟲, and AZ controls.
    • Larger Button Hitboxes & Double-Click Exclusion: Increased button dimensions from 24px to 28px/26px and expanded the hitbox exclusion barrier so double-clicking on or near on-canvas control buttons never triggers accidental ground navigation or mob targeting on the underlying map canvas.
    • ImGui Style Stack Balance Guard: Fixed a state-flip condition on the POIs button where toggling state.showPoiDrawer during the click callback caused PopStyleColor to be called without a preceding push, eliminating the Calling PopStyleColor() too many times! crash.
  • Left-Click Only Map Panning (triune_map.lua).

    • Restricted Viewport Drag Panning: Updated viewport drag panning to trigger strictly when holding down the primary Left Mouse Button (isItemActive and ImGui.IsMouseDown(0) without Ctrl held), removing right-click panning initiation and right-click drag tracking.
  • Interactive Mouse Wheel Zoom Fix (triune_map.lua).

    • Scrollable Child Window Region (##MapCanvasScrollRegion): Enclosed the 2D map canvas in a dedicated child window container with virtual scroll content height (SetNextWindowContentSize) and baseline scroll midpoint tracking (ImGui.GetScrollY), replacing the unsupported io.MouseWheel query (which is not bound on MacroQuest's ImGuiIO Lua usertype) with native ImGui scroll delta capture.
    • Window Scroll Flag Unlocking: Removed ImGuiWindowFlags.NoScrollWithMouse from the top-level main window flags so mouse wheel scroll events cleanly reach the canvas viewport and inner scrollable list panes.
    • Cursor-Centered Smooth Zooming: Restored smooth zooming in (wheel up) and zooming out (wheel down) centered on the active mouse cursor coordinate.
  • ImGui Window Layout Streamlining & Spacing Cleanup (triune.lua).

    • Removed Extraneous Dummy Spacing: Removed 77 redundant ImGui.Dummy(0, N) and ImGui.Dummy(N, 0) spacers across all tabs (Status, Control, Settings, Gems, Clickies, Abilities, AAs, Discs, Help, and Class Picker), relying on natural theme item spacing for consistent, uncluttered padding.
    • Streamlined Action Controls Bar (UI.drawActionControls): Compacted START/PAUSE and BURN buttons to sleek 130x24 standard dimensions with direct ImGui.SameLine() alignment right above the tab bar.
    • Mini HUD Mode Spacing Refinement (drawMiniGui): Replaced double-spaced separator blocks (Spacing(); Separator(); Spacing()) with clean single separators and removed empty spacing lines, keeping the compact mini-window tightly fitted.
    • Tighter Tab Layouts & Metric Overview: Compacted vertical padding in the Status tab overview table, Target Threat card, Navigation diagnostics, and Settings tabs so key combat telemetry and controls fit naturally on screen without excessive scrolling.
  • Popout Cooldown & Ability Monitor Window (triune.lua).

    • Standalone Popout ImGui Window (TriuneCooldownWindow): Registered an independent, top-level ImGui window (TriuneCooldownWindow) providing real-time live monitoring of all enabled Innate Combat Abilities, Alternate Advancements (AAs), Disciplines, Spells (Gems), and Clickie items across all three...
Read more