Repository navigation
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 false (out of combat, stationary, and not casting). If auto-spend is disabled or paused, the flag is immediately cleared. - Removed Intrusive/Invalid Keypress & Notification Automation: Removed invalid
/nomodkey /keypress alt_advancementand non-existentAA_Subwindowsnotification attempts, ensuring the engine never issues unworkable MacroQuest commands or delays the game thread. Also removed unconditional startup queueing of the flag. - Automated Regression Suite (
Suite 62): Added unit test coverage verifying that failed Special tab reads are permanently marked as complete, subsequent reads return cached results without retrying, and main-loop gating strictly honors pause and feature toggles.
- Terminal Read State Marking (
-
In-Game LLM Test Runner & Autonomous QA Agent (
triune_test.lua,triune_llm_bridge.py,start_bridge.sh,start_bridge.bat,tests/check_theme_consistency.sh,README.md).- Standalone ImGui In-Game Test Harness (
triune_test.lua): Created a standalone ImGui testing interface (/lua run triune_test) designed to automate and evaluate in-game tests for TriuneAutocombat using local or cloud Large Language Models. Follows strict standalone architecture (no shared module dependencies, identical duplicated dark theme, non-blocking coroutine loop, safe TLO access viapcall). - Zero
eqgame.exeHalting via Asynchronous Python Bridge (triune_llm_bridge.py): Solved the game-freeze issue where synchronous HTTP orcurlexecution blocks the EverQuest game thread. All network calls, SSL handshakes, token streaming, and API retries run inside an external Python 3 daemon communicating with Lua via high-speed, non-blocking mailbox file IPC (req.json/res.ready). Game rendering stays at a smooth 60+ FPS with zero hitching. - Multi-Provider LLM Integration: Built-in support for LM Studio (
http://localhost:1234/v1), Google Gemini (via OpenAI-compatible endpoint), OpenCode / OpenRouter, and custom endpoints with masked API key persistence intriune_test_config.lua. - Telemetry Capture & In-Game Action Dispatcher: Captures live player stats (HP/mana, combat state, buffs), target stats, group, XTarget, and memorized spell gems into structured JSON context. Parses structured LLM actions (
COMMAND,QUERY,DELAY,ASSERT,FINISH) to execute slash commands, query TLOs, and reportPASS/FAILassertions with full reasoning in an interactive console log. - Authentic
/acCommand Cheatsheet & Strict Model Grounding: Embedded the complete, authentic Triune/accommand reference directly into the agent's system prompt (Execution, Modes & Submodes, Combat Styles & Ranges, Main Assist, Spells & Lockouts, Trio Pets, Hunter/Puller configuration, Waypoints, AA Auto-Spending, and Utilities). Explicitly prohibits models from hallucinating non-existent modes (such as/ac mode tankor/ac mode kite). - Expanded 14-Suite Pre-Built Test Matrix & Combo Dropdown UI: Expanded pre-built test suites from basic checks to 14 dedicated test suites covering all operational areas of TriuneAutocombat (Modes, Assist Trio Roles, Engine Execution/Burn, Styles/Range, Gem Import & Auto-Mem, Auto AA Spending, Pet Management, Main Assist & Defense, Puller Con Filters, Hunter Z-Planes, Waypoint Patrol, Loadout Presets, Target Telemetry, and Full Control Surface Regression). Replaced sprawling radio buttons with a sleek, compact
ImGui.BeginCombodropdown. - Multi-Turn Conversation History Preservation: Implemented
State.conversationHistorytracking across testing steps (QUERY,DELAY,ASSERT) so subsequent prompts preserve the agent's thoughts, action history, and system instructions instead of losing context mid-run. - Launcher Scripts & Theme Verification: Added
start_bridge.shandstart_bridge.batfor one-click daemon startup, integratedtriune_test.luaintotests/check_theme_consistency.shto ensure strict theme parity, and resolved allluacheckwarnings (0 warnings / 0 errors across 182 files).
- Standalone ImGui In-Game Test Harness (
-
Complete Removal of Retired Updater Scripts & References (
.github/workflows/ci.yml,.github/workflows/release.yml,triune.lua,README.md,.agents/AGENTS.md,tests/test_pure_logic.lua).- CI & Release Workflows (
ci.yml,release.yml): Removed the retiredtriune_updater.luagrep step from theversion-syncCI job, which was causing CI runs to fail on missing file. Updated release archive packaging inrelease.ymlto remove non-existenttriune_updater.py,update.bat, andupdate.shpaths. - Engine Slash Command Cleanup (
triune.lua): Fully excised/ac updateand its aliases (/ac updater,/ac checkupdate) from the command dispatcher, Help tab command reference, help chat printout, and/acerror usage summary string. - Documentation & Agent Rules Alignment (
README.md,.agents/AGENTS.md): Removed the Release Updater row and/ac updatecommand from the documentation tables and excised deleted updater files from the directory tree. Aligned.agents/AGENTS.mdFile Map and version consistency guidelines. - Test Suite Cleanup (
tests/test_pure_logic.lua): Completely deleted Suite 41 (triune_updater release parsing & JSON tokenizer), keeping unit test suites 100% focused on active codebase features.
- CI & Release Workflows (
-
Alternate Advancement Trailing Whitespace Cleanup & Defensive Sanitization (
triune_data.lua,triune.lua,triune_buttons.lua,tests/test_pure_logic.lua).- Database Whitespace Sanitization (
triune_data.lua): Removed accidental trailing spaces from 10 Alternate Advancement entries in the era database (Destructive Force,Infused by Rage,Warlord's Tenacity,Purification,Druzzil's Mystical Familiar,E'ci's Icy Familiar,Ro's Flaming Familiar,Ward of Destruction,Ice Core,Stone Core). - Defensive Name Sanitization & Lookup Resilience (
triune.lua,triune_buttons.lua): Added robust whitespace trimming acrosshasAA,loadout.aasdeserialization and key migration, AA list UI generation, HUD timer monitoring, healing AA scanning, combat action dispatch (runtime.fireAA), and button toolbar timer queries. This guarantees thatmq.TLO.Me.AltAbility()lookups, "Purchased Only" list filtering, and/alt actcombat execution function reliably even if external data or saved configurations contain trailing spaces. - Automated Whitespace Regression Suite (
test_pure_logic.lua): Added automated regression checks validating that every spell, disc, and AA name across all classes intriune_data.luacontains no leading or trailing whitespace, and verified key migration logic.
- Database Whitespace Sanitization (
-
Healing Priority System & Reliability Overhaul (
triune.lua,tests/test_pure_logic.lua).- Dedicated Pre-Combat Healing Priority Engine (
runtime.processHealPriority): Prioritizes reactive healing (Gems, AAs like Lay on Hands / Burst of Life, Actions like Mend, Clickies, Discs) over all navigation, targeting, auto-attack, and offensive actions. When an eligible heal is needed, it fires before entering target acquisition or damage loops. - Movement Interruption for Heals (
runtime.stopMovementForCast): Resolved an issue where characters actively navigating or chasing the Main Assist (isMoveActive()) completely suppressed healing. When an ally or self drops below heal threshold, non-Bard characters now immediately halt movement to execute the heal rather than running endlessly while allies die. - Offensive Gate Decoupling (
combatReady): Decoupled healing from offensive combat readiness. Previously, heals were trapped insideif combatReady, which prevented casting while approaching a mob, waiting for assist thresholds (e.g.assist_at = 95%), or between pulls. - Resting Mana Exemption for Heals (
runtime.castGem): Exempted healing spells fromctrl.min_mana_pct. As long as current mana is sufficient to cast the heal, it will not be suppressed by the resting mana floor. - Group Ally Range & Zone Filtering (
runtime.lowestHpAlly): Enhanced ally selection to strictly verify group members are online, in the same zone (m.Present() == true,not m.OtherZone(),not m.Offline()), and within spell range (distToId <= 200). Prevents infinite cast failure loops caused by targeting distant or cross-zone group members. - Beneficial Action Range Checks (
runtime.isTargetInRange): Fixed beneficial ability range calculations to default to 100 rather than 15 (melee) for actions without TLO spell definitions, and enforced target range checks before attempting single-target heals on allies. - Gem Dispatch Order Prioritization: Updated the regular gem evaluation loop to sort and evaluate heal gems ahead of damage, debuff, or DoT gems.
- Target/Condition UX Fallback (
runtime.conditionMet): Added automatic target fallback so that setting a friendly target (e.g.Lowest-HP Ally,Tank) while leaving the default condition onmy HP <=evaluates both the player and the target ally, preventing failed heals due to UI dropdown mismatch. - Automated Regression Suite (
Suite 61): Added 25 unit test assertions covering heal classification, out-of-zone/distant group member filtering,min_mana_pctbypass, emergency HP precedence sorting, and movement interruption.
- Dedicated Pre-Combat Healing Priority Engine (
-
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 (
-
Spell Gems Auto-Population Button & Slash Command (
triune.lua,README.md,tests/test_pure_logic.lua).- Toolbar "Import Bar" Button (
UI.drawGemTabHeader,runtime.importCurrentGems): Restored theImport Bartoolbar button on the Spell Gems tab right next toMem All. Clicking the button immediately reads all active in-game spell gems from the character's physical gem bar and auto-populates the Spell Gems page with era-accurate class mapping, beneficial/detrimental classification, and sensible default targets and conditions (target HP <= 95%for nukes,missing bufffor buffs,my HP <= 75%for heals). - Loadout Defaults & Safety: Automatically sets standard loadout attributes (
min_xtar = 1,max_casts = 0,burn_only = false), wraps MQ TLO access inpcallguards, preserves any extra user-configured spell rows beyond the physical gem bar count, and reports populated spell counts to chat. - UI Guidance & Help Integration: Updated empty-state text in
UI.drawGemListto guide players to click+ Add SpellorImport Bar, and documented the/ac importbar(aliases/ac import,/ac importgems) slash command intriuneCommandand the Help tab commands table. - Automated Regression Suite (
Suite 49): Added unit tests verifying gem bar simulation, default field population, downtime spell retention, and UI button presence.
- Toolbar "Import Bar" Button (
-
Melee Distance Slider & Combat Range Adherence Fix (
triune.lua,tests/test_pure_logic.lua).- Eliminated Hardcoded Downward Clamps (
desiredRange,maxMeleeDistance): Resolved an issue where configuring the Melee Distance slider (ctrl.melee_dist, 5-50) was effectively ignored during combat.desiredRange()previously clamped user-specified distance usingmath.min(userDist, spawnReach - 2), which capped all slider values >= 12 down to 12 on standard-sized NPCs (spawnReach ≈ 14), whilemaxMeleeDistance()clamped low distances up to 14, preventing tight melee positioning (< 14). - Prioritized User Distance with Oversized Hitbox Safety:
desiredRange()now directly targetsmath.max(4, userDist - 2)andmaxMeleeDistance()targetsuserDist, accurately honoring slider adjustments (e.g. 20, 25) and tight stick distances (e.g. 6, 8). For genuinely oversized mobs (dragons/giants withspawnReach > 18 and spawnReach > userDist), the engine automatically extends distance tospawnReach - 3to prevent players from clipping inside large geometry. - Behind & Stick Distance Synchronization (
runtime.getBehindLoc,runtime.positionBehindTarget,combatTick): Removed hardcodedmath.min(12, ...)ceiling fromgetBehindLoc()to usedesiredRange(targetId)directly. AddedlastBehindStickDistandlastFrontStickDiststate tracking inpursuitso live slider adjustments immediately re-issue/stickcommands with updated distances during active combat. - Automated Regression Suite (
Suite 60): Added unit tests verifying default (14), extended (25), tight (8), minimum (5), and giant dragon (45) distance calculations, as well as source-level verification that hardcoded clamps are eliminated.
- Eliminated Hardcoded Downward Clamps (
-
Standalone Universal Inventory & Bank Manager (
triune_inv.lua,README.md,tests/check_theme_consistency.sh,tests/test_pure_logic.lua).- Comprehensive Multi-Storage Item Scanning (
scanner.scanAll): Implemented a standalone ImGui utility tool that indexes all items across character equipment (worn slots 0–22), personal inventory bags (pack 1–10 containers and sub-slots), bank bags (1–24), shared bank slots (1–4), and active cursor item into a unified, high-speed searchable interface. - Instant Live Search & Multi-Criteria Filtering (
invLogic.matchesFilter): Real-time filtering by item name, location, category (Weapon, Armor, Jewelry, Bag, Consumable, Tradeskill, Spell, Gem, Aug, Misc), and item property flags (Lore, No-Drop, Tradeskill, Clicky) with instant clearing and category badges. - Offline Bank Cache Persistence (
scanner.saveBankCache,scanner.loadBankCache): EverQuest only exposes bank TLOs when standing near an active banker.triune_inv.luaautomatically snapshots and serializes bank contents to character-specific cache files (triune_inv_bank_<server>_<char>.lua) when banker windows are accessed, allowing players out in the field to search their bank storage, verify item availability, and identify exact container locations anywhere in Norrath. - Container Grid Visualizer (
UI.drawVisualizer): Added side-by-side visual representations of personal bags and bank storage with capacity indicators, space utilization progress bars, slot grids, and instant click-to-inspect item interaction.- Interactive Item Movement, Pickup, Placement & Drag-and-Drop (
UI.drawVisualizer,pendingAction): Implemented complete interactive item manipulation directly within the container visualizer. Left-clicking an occupied slot picks the item up onto the cursor via/nomodkey /itemnotify <cmd> leftmouseup, while clicking any destination slot (empty or filled) with an item on the cursor places, swaps, or stacks it into that slot. Integrated native ImGui Drag & Drop (BeginDragDropSource/BeginDragDropTarget/AcceptDragDropPayload) allowing players to drag items between any bag or live bank slots to execute a two-step coroutine-safe move action (pickup-> 120ms delay ->place-> 100ms delay -> auto-rescan). Added gold slot hover highlighting, a live cursor status banner with an instantAuto-Inventory Cursorbutton, right-click item inspection (/nomodkey /itemnotify <cmd> inspect), and context-sensitive tooltips. - Scan Engine Speedup & Static Item Definition Caching (
scanner.scanAll,extractItemData): Implemented persistent in-memory item definition caching (state.itemDefs[itemId]). Static item metadata (Name, Icon, Category, Stackable, MaxStack, Weight, Value, Clicky, Stats, Flags) is queried once per unique item ID on initial encounter and reused across all duplicate stacks and subsequent scans. This cuts over 95% of C++ TLO boundary crossings on every inventory update, reducing rescan latency from 2-3 seconds down to under 5 milliseconds. - One-Shot Texture Animation Probing & Zero-Overhead Slot Text (
probeIconMode,iconFor,textWidth): Replaced per-item unprobed animation loops (which executed up to 300,000 failedpcall(mq.FindTextureAnimation)queries per second when icons were missing) with a one-shot probe pipeline (dedicated,shared, ornone) matchingtriune_buttons.lua. Eliminated per-framepcall(ImGui.CalcTextSize)invocations across all container slots in favor of instant string-length arithmetic. - Table Virtualization & Filter/Sort Memoization (
UI.drawItemsTable,state.tableCache): Replaced per-frame table filtering and sorting (which previously sorted 1,000+ items every render frame) with dirty-flag memoization (state.tableCache). IntegratedImGuiListClippervirtualization so only the ~25 visible rows on screen are submitted to ImGui, restoring buttery-smooth 60+ FPS when opening or browsing large inventories. - EverQuest Item Icons & Badges: Integrated native MQ texture animations via
'A_DragItem'(mq.FindTextureAnimation('A_DragItem'),SetTextureCell(id - 500),ImGui.DrawTextureAnimationanddl:AddTextureAnimation) across both inventory bags and bank container grids. Resolved an issue where userdata member checking seticonIdto 0, ensuringitemObj.Icon()is cleanly extracted and displayed. Reconstructed container slots from offline bank cache files so icons render even when away from the banker. - Search Table Icon Integration: Added 18x18 item icons alongside item names in the main items search table (
UI.drawItemsTable).
- Interactive Item Movement, Pickup, Placement & Drag-and-Drop (
- Organization Assistant (
UI.drawOrganizer,invLogic.findDuplicateStacks,invLogic.findHeaviestItems):- Stack Consolidator: Detects fragmented partial stacks of the same stackable item scattered across bags or bank, displaying exact locations and merge counts to free up bag slots.
- Weight Watcher: Evaluates and ranks the heaviest items carried in bags to help Monks maintain weight thresholds and avoid encumbrance.
- Quick Controls: Instant toolbar actions to open all bags, close all bags, or auto-inventory items on the cursor.
- Thread Safety & MacroQuest Compliance: Strict separation of ImGui render callbacks and game actions. Item inspections, bag opening (
/itemnotify packX rightmouseup), item pickups, and auto-inventory commands are queued topendingActionand executed safely on the yieldable coroutine main thread. - ImGui Return Tuple Fix (
ImGui.SliderInt,ImGui.InputTextWithHint): Fixed a return tuple inversion in MacroQuest ImGui whereSliderIntandInputTextWithHintreturn(newValue, changed)rather than(changed, newValue). Previously, unpacking intochanged, intervalassigned booleanfalsetostate.autoScanInterval, causing a runtime error (attempt to compare boolean with number) during the background scan timer comparison. - Automated Verification & CI Integration: Added
triune_inv.luatotests/check_theme_consistency.sh(zero theme drift vstriune_buttons.lua), added pure-logic test suite (Suite 104) intests/test_pure_logic.lua, and passed Luacheck and bytecode syntax validation with 0 warnings/errors.
- Comprehensive Multi-Storage Item Scanning (
📦 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.
- If running windows add an exception to your MQ folder before running.
- 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