Repository navigation
Releases
V3.2
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.corruptand 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
- Download the latest RoF2 MacroQuest from https://github.com/macroquest/macroquest/releases and extract it somewhere like
C:\MacroQuest. - Download
TriuneAutocombat-full.zipfrom the Assets below. It has everything: the Lua scripts, config, the offline game database (resources/gamedb/) and the MQ2Nav zone navmeshes (resources/MQ2Nav/). - Extract the zip into the root of your MacroQuest folder. It merges
lua/,config/andresources/into place. - Windows users: add your MacroQuest folder as an antivirus exception before running it.
- Start
MacroQuest.exe, then log into Project Triune. Triune opens by itself when you log in - if you close it, type/acor/lua run triune.
🔄 Updating an existing installation
- Download
TriuneAutocombat-Update.zipfrom the Assets below. It has everything except the MQ2Nav navmeshes (they rarely change) - grab the full zip if you also need those. - Extract it into the root of your MacroQuest folder and overwrite files if asked.
- 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
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 /campruns/camp. A full slash command sent
over the network now runs on the boxes exactly as typed instead of being
mangled into an/accommand. - 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 trustsMe.NumGemsalone. - 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
- Download the latest RoF2 MacroQuest from https://github.com/macroquest/macroquest/releases and extract it somewhere like
C:\MacroQuest. - Download
TriuneAutocombat-full.zipfrom the Assets below. It has everything: the Lua scripts, config, the offline game database (resources/gamedb/) and the MQ2Nav zone navmeshes (resources/MQ2Nav/). - Extract the zip into the root of your MacroQuest folder. It merges
lua/,config/andresources/into place. - Windows users: add your MacroQuest folder as an antivirus exception before running it.
- Start
MacroQuest.exe, then log into Project Triune. Triune opens by itself when you log in - if you close it, type/acor/lua run triune.
🔄 Updating an existing installation
- Download
TriuneAutocombat-Update.zipfrom the Assets below. It has everything except the MQ2Nav navmeshes (they rarely change) - grab the full zip if you also need those. - Extract it into the root of your MacroQuest folder and overwrite files if asked.
- 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
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,@Namecompletion, 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#nmspersonal 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 onwrites to a file inLogs/,/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
- Download the latest RoF2 MacroQuest from https://github.com/macroquest/macroquest/releases and extract it somewhere like
C:\MacroQuest. - Download
TriuneAutocombat-full.zipfrom the Assets below. It has everything: the Lua scripts, config, the offline game database (resources/gamedb/) and the MQ2Nav zone navmeshes (resources/MQ2Nav/). - Extract the zip into the root of your MacroQuest folder. It merges
lua/,config/andresources/into place. - Windows users: add your MacroQuest folder as an antivirus exception before running it.
- Start
MacroQuest.exe, then log into Project Triune. Triune opens by itself when you log in - if you close it, type/acor/lua run triune.
🔄 Updating an existing installation
- Download
TriuneAutocombat-Update.zipfrom the Assets below. It has everything except the MQ2Nav navmeshes (they rarely change) - grab the full zip if you also need those. - Extract it into the root of your MacroQuest folder and overwrite files if asked.
- 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
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.luaandREADME.md. - Updated test assertions across Suites 77, 78, 79, and 81 in
tests/test_pure_logic.lua(2,432 tests passing).
- Bumped canonical suite version to 2.14 across
-
Release Archive Packaging at Archive Root (
.github/workflows/release.yml,README.md).- Flatten Archive Directory Structure: Changed
git archivepackaging in.github/workflows/release.ymlto target treeHEAD:TACinstead of repository root paths, placinglua/,config/, andresources/directly at the root ofTriuneAutocombat-full.zipandTriuneAutocombat-Update.zip. - Root Documentation Inclusion: Included
README.mdandCHANGELOG.mdat 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.mdQuick Start instructions to direct users to extract the archive directly into the MacroQuest folder without navigating or dragging out of a subfolder.
- Flatten Archive Directory Structure: Changed
-
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 sanitizedctrl.auto_spend_aa_thresholdto 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) andctrl.auto_spend_aa_namefrom cross-class stub rejection inisAAAllowedForPlayer, assigning syntheticmaxRank = 1inrecordScannedAA, 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
startAATrainWorkflowto 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_SearchBoxduring window preparation to prevent search filter interference during list selection. - Added Unit Test Suite 84: Added comprehensive tests in
tests/test_pure_logic.luavalidating the 5 AA minimum slider, low-point evaluation gating, Special tab repeatability, and safe window list matching (2,447 tests passing).
- Enforce 5 AA Minimum on Bank Slider: Updated the Auto AA bank reserve slider in
-
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 routineUI.drawCharacterWindow(), streamlining the main engine codebase while preserving the dedicated standalonetriune_inv.luamodule. - 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) fromdefaultCtrl, and removed transient cache fields (cachedInvStats,statSyncRequested) fromruntime. - Removed Toolbar Buttons & Commands: Removed the
Characterbutton from the main header toolbar, theCharbutton from the Compact Mini-Window toolbar, window manager entry (character), and the/ac charslash 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.col32andUI.toVecvector 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).
- Eliminated Popout Character Window (
-
Hours Formatting for Effects & Songs Popout Window and Buff/Ability Timers (
TAC/lua/triune.lua,tests/test_pure_logic.lua).- Updated
fmtSecto 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 like2700m. - Added unit test coverage in
tests/test_pure_logic.luaacross both thefmtSeccore logic suite and Suite 77 (Popout Effects & Songs Window) validating exact hour/minute formatting and long duration buff edge cases.
- Updated
-
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.2repeatedly re-anchoredruntime.gemCooldownEndagainst 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.getGemCooldownSecto leverageparseDurationSecand 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
isCastingThisvariable scoping within the gem cooldown calculation block and removed redundanttimer = 0reassignments, achieving 0 warnings across all files in Luacheck.
- Smooth Real-Time Recast Interpolation: Fixed a bug where
-
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.luato only assert and load quest catalog, expansion, and zone data files when present on disk, resolving unit test failures following the removal ofTAC/resources/triune_quest/. - Updated Theme Consistency Canonical & Satellites: Set
triune_cursor.luaas the canonical satellite module and pruned deleted modules (triune_buttons.lua,triune_test.lua) fromtests/check_theme_consistency.sh, bringing the theme consistency check to 100% passing.
- Guarded Quest Database File Loading: Updated Suite 57 in
📦 Installation & Updating Instructions
🆕 New Installation
- Go here and grab the latest macroquest release https://github.com/macroquest/macroquest/releases and extract under your user folder.
- Download TriuneAutocombat-full.zip below and extract directly into the root of your MacroQuest folder.
- If running windows add an exception to your MQ folder before running.
- Start
MacroQuest.exebefore launching EverQuest.
🔄 Updating an Existing Installation
- Download
TriuneAutocombat-Update.zipfrom the Assets below. - Extract directly into the root of your MacroQuest folder (overwrite files if prompted).
Note: Your personal settings and saved loadouts intriune_loadout.luaare preserved and will never be overwritten.
Release V2.03
2026-09-07
-
"Ignore Distant XTargets When Pulling" now defaults ON (
triune.lua).ctrl.ignore_distant_xtargetsdefaults totrueso 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 sametriune_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 writestriune_loadout_<server>_<char>.lua(per-character file), andloadAllprefers 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 containscamp_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), andhunter_combat_radius(default 250, the anchor roam radius) — there is nopull_radiusorcombat_radiusfield, 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 renderstd.hunterRadiusstraight fromtriune_loadout.luaand 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 assignedctrl.*without persisting — the circumference setting only hit the loadout file on some unrelated later save. Each slider now callsruntime.saveLoadout(true)on change (plusupdateMapRadiusVisualsfor 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 fromtriune_loadout.lua(saved bytriune.luainto 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"):syncTriuneLoadoutnow populatesstate.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.luadiscovery now mirrors the multi-path search triune itself uses fortriune_data.lua(mq.configDir, mq.luaDir, script-relativeTAC/config/config, cwd), and the manual "Sync Triune Data" button prints the exact searched locations and a hint to run/lua run triunewhen the file cannot be found. The triune overlays now draw from a dedicateddrawTriuneOverlayshelper invoked underpcall(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 becausesyncTriuneLoadoutre-seededctrl.customSearchRadiusfrom 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-framemq.TLO.Me.X/Y()fetches (it reuses the cached/interpolated player position passed intodrawTriuneOverlays). The manual sync also prints a load summary (loadout path, waypoint/camp/anchor/hazard counts). Note:TAC/config/triune_data.luaholds spell/AA data only; camp/pull/anchor/waypoints live intriune_loadout.luaunder the MQ config dir. Verification:luac -pclean, main chunk 116 locals (limit 200), all 2,092 unit tests pass,luacheck0 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 periodicscanZoneSpawns()rebuilt the full NPC list (up to 120NearestSpawnfetches plus up to 16LineOfSightraycasts) 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 swapsfilteredNPCsonly when the cycle completes — so the map keeps rendering the previous valid frame throughout. Init and zone changes passforceCompletefor an immediate full pass since they are one-shot events. -
Fix: Map tool startup lag regression (
triune_map.lua). The previously-added color precompute ranImGui.GetColorU32once 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 fullPathLengthfor every NPC in the zone every 6 seconds (two synchronous mq2nav queries per mob, ~100 navmesh calls/sec sustained). It now runsPathExistsonly; 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.checkQueuecompacts its nil-hole floor. - Spawn scan TLO storm cut (
scanZoneSpawns, tracker tab): Removed the per-mobLineOfSight()raycast from every scan — LoS is now resolved lazily through a throttledlosCache(≤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-filterscanZoneSpawns()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 intostate.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-populatednavState.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-segmentImGui.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...
- Navmesh batch cost collapse (
Release V2.02
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
needsTargetCondition: Resolved an issue whereneedsTarget = (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 toneedsTarget = (orig ~= id) and not (selfCast and hostileTarget). - Cast Target Retention (
castTracker.targetRequired): UpdatedcastTracker.targetRequiredincastGem,fireAA, anduseClickieto properly flag single-target beneficial spells as target-required when casting out of combat (not (selfCast and hostileTarget)), allowinggetActiveTargetRequiredCastingId()to protect target lock on self during the cast duration. - Target Restoration (
restoreTargetId): Preserved previous non-hostile targets (orig > 0andnot (selfCast and hostileTarget)) viarestoreTargetIdso 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 intests/test_pure_logic.luacovering out-of-combat self-heals with no target, self-heals with non-hostile targets, and in-combat hostile target retention.
- Differentiated In-Combat vs. Out-of-Combat Beneficial Targeting (
-
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_TIMEOUTof 8s or 3 navigation stalls) beyondPullermode to all combat modes (whennot followOnly). When stalling, Triune now immediately executesclearTarget(), setsruntime.pullState = 'IDLE'andruntime.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 andmq.TLO.Navigation.PathExists('id ' .. id)()returns false for a distant/non-LoS target, Triune no longer falls through to blind/keypress forward holdor/stickstraight 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 incombatTickrequiredengage 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 destructivepursuit.id = 0resets 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 tohandleCantHitFromHereto abandon obstructed targets after repeated failed reposition maneuvers. - Close-Range Roam Path Checking (
findRoamTarget): Removed the hardcodeddist > 25bypass infindRoamTarget, 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.
- Comprehensive Pursuit Stall Give-Up (
-
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 toMQ2AAspendcaused Special tab abilities to never purchase.MQ2AAspendonly 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 toMQ2AAspend. - 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 invokesruntime.startAATrainWorkflow(targetName)to purchase that specific ability natively, rather than executing a generic/aaspend auto nowcommand 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.inifile, preventingMQ2AAspendfrom getting blocked or reporting invalid format errors on abilities it cannot purchase. - Robust UI Tab & Control Selection (
runtime.processAATrainWorkflow): Enhanced theprepare_tabstep to issue tab selection notifications to bothAAW_SubwindowsandSubwindowscontrols (/notify AAWindow AAW_Subwindows tabselect 4and/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.
- Special Tab Detection (
-
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 becausemq.TLO.Me.AltAbility(name)returns nil for unowned abilities. Added multi-tiered discovery scanning across character classes inDATA.aas, standard Archetype/General ability catalogs (COMMON_AAS), class-specific catalogs (CLASS_AAS), andAAWindowUI listboxes. - Recursive
AAWindowInspection (runtime.findChildRecursive,runtime.scanPlayerAAs): Replaced shallow window control searches with recursive descendant searching across all standard client listboxes (AAW_GeneralList,AAW_ArchList,AAW_ClassList, andAAW_SpecialList). Fixed incorrect window control identifier (AAW_ArchListwas previously queried asAAW_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 globalmq.TLO.AltAbility(name).Cost()andMaxRank(), 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_advancementwith standard EverQuest/keypress Vwhen 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.
- Comprehensive Untrained Ability Discovery (
-
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 setsruntime.specialTabReadDone = trueunconditionally upon attempt completion, returning{}and preventing endless retries. - Eliminated Recursive Loop Re-Arming (
runtime.scanPlayerAAs): Removed the fallbackruntime.pendingReadSpecialTab = truebranch insidescanPlayerAAs(), which previously re-armed the pending flag every single time a scan ran without finding Special tab abilities. - State-Aware Execution Gate: Restricted
pendingReadSpecialTabexecution in the main loop to only trigger whenctrl.auto_spend_aais active andctrl.pausedis fal...
- Terminal Read State Marking (
Release V2.0.1
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.01across the main suite (triune.lua), the standalone release updater (triune_updater.lua), repository documentation (README.md), and regression test suites.
- Synchronized version bump to
-
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 returnnilinstead ofMe.ID()whenever the player has a hostile NPC targeted during a self-cast heal or buff. This preventscombatTick'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 setstargetRequired = false, returnsnilfromgetActiveTargetRequiredCastingId(), and retains target lock on the hostile mob throughout the cast.
- Hostile NPC Targeting Retention for Self-Directed Heals (
-
Plugin Command Guards for MQ2Map & MQ2FOV (
triune.lua).- MQ2Map Plugin Gate (
runtime.mapLoaded,runtime.clearMapRadiusVisuals,runtime.updateMapRadiusVisuals): Addedruntime.mapLoaded()probe checkingmq.TLO.Mapandmq.TLO.Plugin('mq2map')before executing map drawing commands. IfMQ2Mapis not loaded, Triune gracefully suppresses/mapfilterand/maplocexecution, eliminatingDoCommand - Couldn't parse '/maploc remove'and/mapfilterred chat errors when running without the map plugin. - MQ2FOV Plugin Gate (
runtime.fovLoaded,runtime.applyFov): Addedruntime.fovLoaded()probe checkingmq.TLO.Plugin('mq2fov')before dispatching/fov <val>commands. PreventsDoCommand - 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
MQ2MaporMQ2FOVare not loaded, providing clear feedback on feature availability.
- MQ2Map Plugin Gate (
📦 Installation & Updating Instructions
🆕 New Installation
- Go here and grab the latest macroquest release https://github.com/macroquest/macroquest/releases and extract under your user folder.
- Download TriuneAutocombat-full.zip below and extract contents of TAC into the root of your macroquest folder.
- Start
MacroQuest.exebefore launching EverQuest.
- **Existing install
- Download
TriuneAutocombat-Update.zipfrom the Assets below. - Extract the TAC folder to the root of your macroquest folder.
- Note: Your personal settings and saved loadouts in
triune_loadout.luaare preserved and will never be overwritten.
- Download
Release V2.0-beta
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-betaacross the main suite (triune.lua), the standalone release updater (triune_updater.lua), repository documentation (README.md), and regression test suites.
- Synchronized major version bump to
-
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/fovslider 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 totriune_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.
- Added
-
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.
-
Custom FOV Slider (
-
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
moveTowardfallback,repositionCloser(), andhandleCantHitFromHere()with thebehindmodifier for seamless repositioning. - Cleans up active stick commands (
/stick off) whenever targets die or auto-attack disengages.
- Leverages MQ2MoveUtils (
-
User Configurable Opt-Out Checkbox & Slash Command:
- Added
Position Behind NPCcheckbox (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.
- Added
-
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.
-
Automated Flank/Rear Positioning (
-
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 npcor/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
InputTextWithHintreturn value order (newSearch, changedSearch) and checkbox tuple unpacks, guardedsearchTermwith strict string type-checks inrefreshActiveQuests, and wrapped inner window rendering inpcallwithinUI.drawQuestGuideto ensureImGui.End()andpopTheme()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()ortriune_data.lua(era_expansion). Added a dedicated[X] Server Era Limittoggle 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 activeZone Guidewalkthrough tab and the newZone & Quest Lookupexploration tab, with seamless programmatic tab switching viastate.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.
-
Multi-Tab Architecture (
-
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 ...
-
Preamble & Metadata Stripping: Automatically removes raw wiki infobox preambles, rating tags, item/NPC bracket codes (
-
Standalone Interactive Quest Guide Window (
Release V1.7.8
2026-08-31
- ImDrawList Function Signature Fix (
triune_map.lua).- MacroQuest Sol3 Argument Compatibility: Added explicit
numSegments(0) parameter to all 13AddCircleFilledcalls and explicit rounding (0.0) toAddRectFilledinDrawMapCanvas, 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-levelAuto AAtab 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/notifycommands (TrainButton) for progression servers where/alt buyis 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 AAtab to eliminate redundant manual/alt buyinputs 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), andClear 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].
- MacroQuest Sol3 Argument Compatibility: Added explicit
- Class Detection Zoning Reset & Parsing Fix (
triune.lua,triune_spellbook.lua).- Eliminated Erroneous Zoning Class Reset: Removed destructive
classesFromInventoryWindow()calls fromruntime.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)andsub(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 causedmyClassesto reset to{"SK", "Mag"}).parseClassLinenow strictly validates entire cleaned strings or whole-word tokens against the canonicalMQSHORTtable. - Standalone Parity & Unit Tests: Synchronized
MQSHORTandparseClassLineacrosstriune.luaandtriune_spellbook.luaper the Standalone File Rule, and added test coverage intests/test_pure_logic.luaensuring UI strings (Skills,Magic,Magic Resist,Warhammer,Stats,Inventory) correctly returnnil.
- Eliminated Erroneous Zoning Class Reset: Removed destructive
📦 Installation & Updating Instructions
🆕 New Installation
- Go here and grab the latest macroquest release https://github.com/macroquest/macroquest/releases and extract under your user folder.
- Download TriuneAutocombat-full.zip below and extract contents to the same folder you extract macroquest to.
- Start
MacroQuest.exebefore 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 updatein chat. - Click Check for Updates, then Update Now to update and reload all scripts automatically without leaving the game.
- Alternatively, run
update.bat(Windows) orupdate.sh(Linux) from yourTAC/folder.
- Click the [Updater] button on the top window header or type
- Option 2 (Manual Update):
- Download
TriuneAutocombat-Update.zipfrom the Assets below. - Extract and overwrite the files into your existing MacroQuest directory.
- Note: Your personal settings and saved loadouts in
triune_loadout.luaare preserved and will never be overwritten.
- Download
Release V1.7.7
2026-08-30
-
Luacheck Warning Elimination (
triune.lua).-
Direct Discipline Metric Initialization (
UI.getTrackedCooldownItems): InitializedtotalSec,endCost,activeTotalSec,timerGroupId, anddiscIdxdirectly fromdiscInfoinstead 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).
-
Direct Discipline Metric Initialization (
-
LuaLS Type Warnings & Nil Check Hardening (
triune_buttons.lua).-
Type-Safe Timer Key Assignment (
saveEdit): Decoupled buffer string reading fromtkvariable 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 explicitedit.tmpnil check and early close fallback before rendering the button edit controls, preventing nil index warnings across all button attribute inputs.
-
Type-Safe Timer Key Assignment (
-
Project Version Bump (v1.7.7): Synchronized version 1.7.7 across
triune.lua,triune_updater.lua, andREADME.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'sMe.Buff.Durationtimestamp object is now parsed directly via.TotalSeconds(),.Raw()(/ 1000.0), or standard string conversion, eliminating previous tick-multiplication bugs (duration * 6on 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 withDISC_BASE_COOLDOWNSfallbacks when MacroQuestSpell.RecastTimereturns 0 for classic EQ combat abilities. -
Discipline Timer Parsing (
parseCombatAbilityTimer): FixedCombatAbilityTimerlookups 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 stampedlastDiscFiredAt = nowon 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): UpdatedgetCooldown(btn)to use the sharedparseTloTimerlogic, properly convertingCombatAbilityTimerticks to seconds rather than misinterpreting ticks as milliseconds.
-
Accurate Active Duration Calculation (
-
Control Tab UI Streamlining (
triune.lua).-
Removed Redundant Closer-Mobs Checkboxes: Removed the duplicate
Check for Closer NPCs while Travelingcheckboxes from theHunterandCampsubmode sections on the Control tab, consolidating closer-target movement configuration onto the dedicatedCloser-NPC Retargeting During Movementsection on the Settings tab.
-
Removed Redundant Closer-Mobs Checkboxes: Removed the duplicate
-
Dedicated Cooldowns Tab & Shared Popout Integration (
triune.lua).-
New Cooldowns Tab (
UI.drawCooldownsTab): Added a dedicatedCooldownstab directly in the main Triune window positioned right after theAAstab (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 (_tabvs_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 Windowbutton 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.luavalidating the presence and exact tab sequence ordering ofUI.drawCooldownsTab()right afterUI.drawAATab().
-
New Cooldowns Tab (
-
Lua Variable Shadowing Fix (
triune_map.lua).-
Luacheck Warning Elimination: Renamed shadowed
childFlagsvariables withinDrawMapCanvasto unique identifiers (canvasChildFlags,floorNavFlags,overlayFlags), resolving all luacheck shadowing warnings and ensuring clean CI passes.
-
Luacheck Warning Elimination: Renamed shadowed
-
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 (<1mstotal 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)$ amortizedqueueHeadpointer, 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)$ NearestSpawniteration freezes in densely populated zones.
-
High-Speed Stream Map Parser (
-
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 theFollowcheckbox,Center Me/Center Map,POIsdrawer toggle,Stop Nav, andLive Zonereturn buttons down into a sleek floating 2-row bottom-right overlay dock alongside+,-,⟲, andAZcontrols. - 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.showPoiDrawerduring the click callback causedPopStyleColorto be called without a preceding push, eliminating theCalling 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.
-
Restricted Viewport Drag Panning: Updated viewport drag panning to trigger strictly when holding down the primary Left Mouse Button (
-
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 unsupportedio.MouseWheelquery (which is not bound on MacroQuest'sImGuiIOLua usertype) with native ImGui scroll delta capture. -
Window Scroll Flag Unlocking: Removed
ImGuiWindowFlags.NoScrollWithMousefrom 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.
-
Scrollable Child Window Region (
-
ImGui Window Layout Streamlining & Spacing Cleanup (
triune.lua).-
Removed Extraneous Dummy Spacing: Removed 77 redundant
ImGui.Dummy(0, N)andImGui.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): CompactedSTART/PAUSEandBURNbuttons to sleek 130x24 standard dimensions with directImGui.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.
-
Removed Extraneous Dummy Spacing: Removed 77 redundant
-
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...
-
Standalone Popout ImGui Window (