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

Release V2.02

Choose a tag to compare

@gennro gennro released this 06 Sep 15:57
· 77 commits to main since this release

2026-09-05

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

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

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

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

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

    • Terminal Read State Marking (runtime.readSpecialTabOnce): Fixed an issue where failing to read the Alternate Advancement Special tab (e.g. empty ability list or unsupported window hierarchy) was treated identically to "not yet tried", causing the engine to re-attempt the read on every main-loop frame. Now sets runtime.specialTabReadDone = true unconditionally upon attempt completion, returning {} and preventing endless retries.
    • Eliminated Recursive Loop Re-Arming (runtime.scanPlayerAAs): Removed the fallback runtime.pendingReadSpecialTab = true branch inside scanPlayerAAs(), which previously re-armed the pending flag every single time a scan ran without finding Special tab abilities.
    • State-Aware Execution Gate: Restricted pendingReadSpecialTab execution in the main loop to only trigger when ctrl.auto_spend_aa is active and ctrl.paused is 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_advancement and non-existent AA_Subwindows notification 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.
  • 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 via pcall).
    • Zero eqgame.exe Halting via Asynchronous Python Bridge (triune_llm_bridge.py): Solved the game-freeze issue where synchronous HTTP or curl execution 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 in triune_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 report PASS/FAIL assertions with full reasoning in an interactive console log.
    • Authentic /ac Command Cheatsheet & Strict Model Grounding: Embedded the complete, authentic Triune /ac command 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 tank or /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.BeginCombo dropdown.
    • Multi-Turn Conversation History Preservation: Implemented State.conversationHistory tracking 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.sh and start_bridge.bat for one-click daemon startup, integrated triune_test.lua into tests/check_theme_consistency.sh to ensure strict theme parity, and resolved all luacheck warnings (0 warnings / 0 errors across 182 files).
  • 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 retired triune_updater.lua grep step from the version-sync CI job, which was causing CI runs to fail on missing file. Updated release archive packaging in release.yml to remove non-existent triune_updater.py, update.bat, and update.sh paths.
    • Engine Slash Command Cleanup (triune.lua): Fully excised /ac update and its aliases (/ac updater, /ac checkupdate) from the command dispatcher, Help tab command reference, help chat printout, and /ac error usage summary string.
    • Documentation & Agent Rules Alignment (README.md, .agents/AGENTS.md): Removed the Release Updater row and /ac update command from the documentation tables and excised deleted updater files from the directory tree. Aligned .agents/AGENTS.md File 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.
  • 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 across hasAA, loadout.aas deserialization 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 that mq.TLO.Me.AltAbility() lookups, "Purchased Only" list filtering, and /alt act combat 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 in triune_data.lua contains no leading or trailing whitespace, and verified key migration logic.
  • 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 inside if 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 from ctrl.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 on my 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_pct bypass, emergency HP precedence sorting, and movement interruption.
  • Project Version Bump (v2.01) (triune.lua, triune_updater.lua, README.md, tests/test_pure_logic.lua).

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

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

    • MQ2Map Plugin Gate (runtime.mapLoaded, runtime.clearMapRadiusVisuals, runtime.updateMapRadiusVisuals): Added runtime.mapLoaded() probe checking mq.TLO.Map and mq.TLO.Plugin('mq2map') before executing map drawing commands. If MQ2Map is not loaded, Triune gracefully suppresses /mapfilter and /maploc execution, eliminating DoCommand - Couldn't parse '/maploc remove' and /mapfilter red chat errors when running without the map plugin.
    • MQ2FOV Plugin Gate (runtime.fovLoaded, runtime.applyFov): Added runtime.fovLoaded() probe checking mq.TLO.Plugin('mq2fov') before dispatching /fov <val> commands. Prevents DoCommand - Couldn't parse '/fov 150' red errors on MacroQuest installations that do not have the legacy FOV plugin loaded.
    • Settings UI Status Indicators: Added telemetry notices in the Settings tab indicating when MQ2Map or MQ2FOV are not loaded, providing clear feedback on feature availability.
  • 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 the Import Bar toolbar button on the Spell Gems tab right next to Mem 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 buff for 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 in pcall guards, 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.drawGemList to guide players to click + Add Spell or Import Bar, and documented the /ac importbar (aliases /ac import, /ac importgems) slash command in triuneCommand and 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.
  • 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 using math.min(userDist, spawnReach - 2), which capped all slider values >= 12 down to 12 on standard-sized NPCs (spawnReach ≈ 14), while maxMeleeDistance() clamped low distances up to 14, preventing tight melee positioning (< 14).
    • Prioritized User Distance with Oversized Hitbox Safety: desiredRange() now directly targets math.max(4, userDist - 2) and maxMeleeDistance() targets userDist, accurately honoring slider adjustments (e.g. 20, 25) and tight stick distances (e.g. 6, 8). For genuinely oversized mobs (dragons/giants with spawnReach > 18 and spawnReach > userDist), the engine automatically extends distance to spawnReach - 3 to prevent players from clipping inside large geometry.
    • Behind & Stick Distance Synchronization (runtime.getBehindLoc, runtime.positionBehindTarget, combatTick): Removed hardcoded math.min(12, ...) ceiling from getBehindLoc() to use desiredRange(targetId) directly. Added lastBehindStickDist and lastFrontStickDist state tracking in pursuit so live slider adjustments immediately re-issue /stick commands 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.
  • 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.lua automatically 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 instant Auto-Inventory Cursor button, 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 failed pcall(mq.FindTextureAnimation) queries per second when icons were missing) with a one-shot probe pipeline (dedicated, shared, or none) matching triune_buttons.lua. Eliminated per-frame pcall(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). Integrated ImGuiListClipper virtualization 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.DrawTextureAnimation and dl:AddTextureAnimation) across both inventory bags and bank container grids. Resolved an issue where userdata member checking set iconId to 0, ensuring itemObj.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).
    • 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 to pendingAction and executed safely on the yieldable coroutine main thread.
    • ImGui Return Tuple Fix (ImGui.SliderInt, ImGui.InputTextWithHint): Fixed a return tuple inversion in MacroQuest ImGui where SliderInt and InputTextWithHint return (newValue, changed) rather than (changed, newValue). Previously, unpacking into changed, interval assigned boolean false to state.autoScanInterval, causing a runtime error (attempt to compare boolean with number) during the background scan timer comparison.
    • Automated Verification & CI Integration: Added triune_inv.lua to tests/check_theme_consistency.sh (zero theme drift vs triune_buttons.lua), added pure-logic test suite (Suite 104) in tests/test_pure_logic.lua, and passed Luacheck and bytecode syntax validation with 0 warnings/errors.

📦 Installation & Updating Instructions

🆕 New Installation

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