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

Release V2.0-beta

Choose a tag to compare

@gennro gennro released this 04 Sep 19:38
· 87 commits to main since this release

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

2026-09-04

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

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

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

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

    • Standalone Interactive Quest Guide Window (TAC/lua/triune_quest.lua): Introduced a fully standalone, era-aware ImGui quest browser runnable via /lua run triune_quest. Styled with the unified dark cyan/blue Triune theme tokens, complete with master-detail split layout, search bar, expansion dropdown, level slider, and hide-completed toggle.
    • Comprehensive Multi-Expansion Quest Catalog (Classic to Expansion 32): Precompiled 2,633 full quest walkthroughs spanning 32 expansions into partitioned, on-demand per-zone Lua packages (TAC/resources/triune_quest/zones/<shortname>.lua) and a lightweight search index (catalog.lua). Minimizes LuaJIT memory consumption by loading only active zone data on-demand.
    • Server Ground-Truth Integration (NMS Quests Repository): Cross-referenced with the exact server quest repository (Release-NMS-Quests/), indexing 6,647 NPCs across 220 zones to verify exact NPC locations, 100% accurate say dialogue prompts, hand-in item IDs, and quest rewards.
    • Live NPC Spawn Radar & One-Click Navigation: Detects if the quest giver is currently spawned in the zone via mq.TLO.Spawn, calculating real-time distance and cardinal heading. Provides [Target] and [Navigate to NPC] buttons executing /nav spawn npc or /nav loc.
    • Interactive Dialogue Prompts (Click-to-Hail): Automatically presents clickable prompt buttons for hails and bracketed responses that target the NPC and issue /say <prompt> in the main coroutine loop.
    • Live Inventory Turn-In Scanner: Scans character inventory in real-time (mq.TLO.FindItemCount), displaying collected vs required item counts ([OK] 4x Gnoll Fangs (In Bags: 4/4)) with intuitive color status cues.
    • Per-Character Quest Completion Persistence: Saves completed and tracked quests to mq.configDir/triune_quest_<Server>_<Char>.ini, allowing easy filtering of completed quests across multiple characters.
    • Automated Compilation Tool (TAC/tools/build_triune_quest.py): Built an automated build script to normalize zones, extract coordinates and dialogues, and emit syntax-verified Lua 5.1 safe tables.
    • Hardened ImGui Input Signatures & Render Stack Protection: Corrected InputTextWithHint return value order (newSearch, changedSearch) and checkbox tuple unpacks, guarded searchTerm with strict string type-checks in refreshActiveQuests, and wrapped inner window rendering in pcall within UI.drawQuestGuide to ensure ImGui.End() and popTheme() are unconditionally called on any rendering exception.
    • Server Era Limiting & Expansion Cap Filtering: Automatically detects the server's current expansion cap using mq.TLO.Me.HaveExpansion() or triune_data.lua (era_expansion). Added a dedicated [X] Server Era Limit toggle and interactive expansion cap selector in the toolbar, dynamically hiding future expansion quests and pruning the expansion dropdown to only show content available on the current server. Preferences are persisted to character INI.
    • Zone Directory Atlas & Global Quest Search Lookup Page (UI.drawLookupTab, UI.drawBrowseZonesView, UI.drawGlobalQuestSearchView):
      • Multi-Tab Architecture (QuestGuideMainTabBar): Introduced a tabbed interface hosting the active Zone Guide walkthrough tab and the new Zone & Quest Lookup exploration tab, with seamless programmatic tab switching via state.requestTab.
      • Norrath Zone Directory Browser (UI.drawBrowseZonesView): Built an interactive directory indexing all 169 zones across Norrath, sorted alphabetically with instant name/shortname filtering, expansion era markers, and total quest counts. Selecting any zone displays a complete quest list with levels, quest givers, completion status, and a one-click [Load in Zone Guide] button that disengages auto-sync to avoid unwanted snapping.
      • Global Norrath Quest Search (UI.drawGlobalQuestSearchView): Added a global query engine searching across all 2,633 quests simultaneously by title, NPC name, zone name, or zone shortname, with real-time era cap enforcement and hide-completed filtering.
      • One-Click Guide Jump: Clicking [Guide] next to any quest in the Lookup tabs immediately sets the target zone, selects the quest walkthrough, loads required turn-in inventory counts, and jumps directly to the Zone Guide tab.
    • Walkthrough Narrative Cleaner & Rich Formatter (UI.cleanPreambleAndTags, UI.parseWalkthrough, UI.drawFormattedWalkthrough):
      • Preamble & Metadata Stripping: Automatically removes raw wiki infobox preambles, rating tags, item/NPC bracket codes ([item=123]), and trailing footer junk, instantly exposing the real story narrative, instructions, and objectives.
      • Character Name Personalization: Replaces Allakhazam generic underscore placeholders (_____ / your name) with the player's active character name (mq.TLO.Me.CleanName()), creating an authentic and immersive quest dialog experience.
      • Semantic Tokenization & Rich Visual Styling: Parses narratives into structured tokens rendered with distinct UI treatments:
        • Section Headers (◆ Title): Highlighted in bright gold with subtle separators.
        • Player Speech (💬 You say:): Highlighted in emerald green with inline [Say] buttons to immediately target the NPC and speak the line in-game.
        • NPC Responses (👤 NPC Name says:): Speaker styled in bright cyan with indented quoted dialogue blocks.
        • Action Steps & Objectives (▶ Step): Highlighted with action bullets for clear readability.
        • Location & Directions (📍 Directions): Marked with location pins in cyan.
        • Faction & Rewards (▲ / ▼ Faction, ★ Reward): Color-coded green and red with delta badges.
        • Alerts & Warnings (⚠ Note): Highlighted in warning orange.
      • View Mode Toggle: Added [Formatted View] vs [Raw Text] radio selectors in the walkthrough header, allowing users to toggle between rich formatted presentation and the raw wiki text at any time.
    • Static Code Analysis Clean Pass (.luacheckrc, triune.lua, triune_quest.lua):
      • Registered ImGuiInputTextFlags in .luacheckrc globals.
      • Cleaned redundant nil declarations for targetNum and targetStr in runtime.removeAutoAcceptName.
      • Eliminated unused region width variables (availX) and loop indices across triune_quest.lua.
      • Achieved 0 warnings / 0 errors across 182 files in luacheck TAC/.
    • Automated Test Coverage (Suite 57): Added regression unit tests validating catalog loading, 33 expansion definitions (00 to 32), zone package schema verification, server era filtering logic, zone list directory building and sorting, global quest query filtering, and narrative preamble stripping and tokenization.
  • Code Audit, Logic Bug Fixes, Thread Safety & Headroom Optimization (triune.lua, tests/test_pure_logic.lua).

    • Fixed Slash Command /ac clear lockouts (triuneCommand): Corrected an undefined global variable access (arg == 'lockouts') to inspect args[2] (string.lower(args[2]) == 'lockouts'), ensuring the command correctly clears all active spell lockouts, target backoffs, and mob immunities as documented.
    • Fixed ImGui Thread Safety in AA Clear Cursor Button (UI.drawAAsTab): Replaced a direct synchronous clearCursor() call (which invoked mq.delay() inside the non-yieldable ImGui render callback) with an asynchronous queue via runtime.pendingCursorClearAt = os.clock(), eliminating runtime thread crashes and ensuring multi-item cursors drain properly in the main coroutine loop.
    • Fixed Missing Parameter in Mob Immunity Event Handler (TriuneImmuneSpell1): Updated the event handler to capture (_, sp) and pass sp into onFailureEvent('target immune', sp), ensuring the cast tracker records the exact immune spell rather than relying on heuristic fallbacks.
    • Hardened Zone Transition Triggering (runMainLoop, runtime.onZoned): Added an automated runtime.onZoned() dispatch with a 2.0s debounce timestamp when mq.TLO.Zone.ShortName() transitions in the main loop, guaranteeing complete state resets (stuck, pursuit, camp, lockouts, pause-on-zone) even if the "You have entered ..." chat line was delayed or missed (e.g. during evac, gate, or succor).
    • Deduplicated Autocombat Start/Stop Control (runtime.setRunning, runtime.triuneToggle): Unified start/pause execution, waypoint synchronization, pet hold management, and plugin status warnings into a single shared helper used across /ac run, /ac pause, and /triunerun.
    • Eliminated Dead & Unused Code: Removed unreferenced UI.drawEmblem() helper and dead state fields runtime.lastBreadcrumbAt and runtime.lastConReqAt.
    • Enhanced Lua 5.1 Main Chunk Register & Local Variable Headroom: Attached static tables (CRIT, LADDER_CLIMB, PET_SCOPE_LIST, NAV_CONST, ALIAS_CLASS_MAP) to their respective subsystems and scoped file-level loops (COMBO_OPTIONS, WP), dropping main-chunk local variable consumption from 188 down to 182 and slots from 172 to 168 (substantially expanding the safe buffer under Lua 5.1's 200 MAXVARS limit).
    • Resolved Shadowed Variable: Fixed shadowed local tid in combatTick's camp pull distance check.
    • Automated Test Coverage (Suite 53): Added unit tests in tests/test_pure_logic.lua validating command argument parsing for /ac clear lockouts and debounce timing for onZoned.
  • Auto-Accept Settings Page: Auto Group, Auto Trade, Auto DZAdd & Whitelist Management (triune.lua, README.md, tests/test_pure_logic.lua).

    • Dedicated Settings Sub-Page (UI.drawAutoAcceptSettings, UI.drawSettingsTab): Restructured the Settings tab with clean sub-navigation tabs (General Settings and Auto-Accept), providing an organized dedicated interface for social and group automation without cluttering general engine settings.
    • Automated Request Acceptance Toggles:
      • Auto-Accept Group Invites (ctrl.auto_group): Automatically accepts incoming group invites via /invite and dialog confirmation whenever received from an authorized player.
      • Auto-Accept Trades (ctrl.auto_trade): Automatically clicks the Trade button (TRDW_Trade_Button) when the trading partner has marked trade ready and is authorized.
      • Auto-Accept Dynamic Zone / Expedition Invites (DZAdd) (ctrl.auto_dzadd): Automatically accepts dynamic zone invites (/dzaccept), task adds, and expedition confirmation prompts from authorized players.
    • Flexible Authorization Filtering Rules:
      • Accept from Anyone (ctrl.auto_accept_anyone): Unconditionally accepts eligible group, trade, and expedition requests from any player.
      • Always accept from Group Members (ctrl.auto_accept_group): Automatically authorizes requests from characters currently in your group.
      • Accept from all Guild Members (ctrl.auto_accept_guild): Automatically authorizes requests from any player in the same guild as your character (Me.Guild()).
    • Player Whitelist Management with Player IDs & Dedicated Removal (ctrl.auto_accept_names, runtime.addAutoAcceptName, runtime.removeAutoAcceptName):
      • Dual Identification (Player Name & Player ID): Structured whitelist entries store both character name and numeric Player ID ({ name = ..., id = ... }), allowing resilient matching against either player names or spawn IDs with backwards compatibility for legacy string entries.
      • Interactive Input & Target Resolution: Text input field accepting player names or IDs with Enter key submission support, plus a one-click + Add Target button that extracts both clean name and spawn ID from the targeted player character (mq.TLO.Target).
      • Dedicated Remove Button: Added a dedicated [Remove] button in the top toolbar to instantly remove the selected player or the targeted player from the whitelist, alongside individual [Remove] action buttons on each row of the whitelist table and a [Clear All] button.
      • Structured Whitelist Table (autoAcceptWhitelistTable): Scrollable 3-column table displaying Player Name (selectable), Player ID, and per-row [Remove] button with selected player status badge.
      • Alphabetically sorted, case-insensitive whitelist with duplicate prevention by name and ID.
    • Continuous Pulse & Event Integration (runMainLoop, runtime.checkAutoAccept, mq.event):
      • Integrated throttled background evaluation in runMainLoop to monitor Me.Invited(), Window('TradeWnd') (matching target ID or name), and Window('ConfirmationDialogBox').
      • Added reactive chat event listeners (TriuneAutoGroupInvite1/2, TriuneAutoDZInvite1/2/3) for immediate instant response to invites.
    • Unit Test Coverage (Suite 55): Added unit tests verifying whitelist additions with Player IDs, case-insensitive duplicate prevention, alphabetical sorting, removal by ID/name/entry, clearing, and multi-rule authorization evaluation (anyone, group, guild, whitelist).
  • Multi-Target Extended Target Engine for 'All Enemies' Option (triune.lua, tests/test_pure_logic.lua).

    • Multi-Target Cast Distribution (runtime.resolveAllEnemiesTargetId): Refactored the E: All Enemies target selector across Spell Gems, Clickies, Combat Actions, AAs, and Disciplines so that it actively iterates and distributes casts across all hostile NPC candidates on your Extended Target (XTarget) list.
    • Debuff & DoT Multi-Targeting: Spells with a duration (DoTs, debuffs, snares, mes) evaluate whether each mob already has the effect active (runtime.isNpcSpellActive, checking both MQ target buffs and tracked applied durations). Triune sequentially casts the effect on Mob 1, Mob 2, Mob 3, etc., and cleanly yields to subsequent gems/actions once all mobs on XTarget have the effect active.
    • Direct Damage & Nuke Round-Robin: Spells with zero duration or unlimited casts round-robin evenly across all living enemies on XTarget based on fewest cast counts and least-recent cast timestamps.
    • Max Casts Enforcement per Mob: Honors max_casts on a per-mob basis across XTarget, casting up to the configured limit on each enemy before skipping that target.
    • Lockout & Resist Resiliency: Automatically skips mobs that are locked out or immune via castTracker, targeting other eligible mobs on XTarget without halting the rotation.
    • Applied Spell & Cast Tracking Lifecycle: Added runtime.npcSpellApplied and runtime.npcSpellLastCast tracking in castGem and useClickie, clearing applied timers on fizzles, interrupts, resists, and non-stacking debuff conflicts in castTracker.reportResult, and pruning dead mobs during combat ticks, death, and zone transitions.
    • Unit Test Coverage (Suite 56): Added comprehensive tests in tests/test_pure_logic.lua validating sequential DoT distribution across XTarget, yielding when all mobs are DoTed, recast upon expiration, round-robin direct damage nuking, max_casts gating, and lockout skipping.
  • Target Filters & Cast Conditions Reference in Help Tab (triune.lua).

    • In-Game Reference Section (UI.drawHelpTab): Added a dedicated Spell & Ability Target Filters collapsing header to the Help tab, providing comprehensive reference documentation directly in the UI.
    • Target Resolution Guide (##HelpTargetTable): Details behavior for all 11 target selectors across Enemy options (E: All Enemies, E: Current Target, E: Assist Target, E: Nearest Add, E: Unmezzed Add) and Friendly options (F: Myself, F: Main Assist, F: Tank, F: Lowest-HP Ally, F: Whole Group, F: Pet).
    • Cast Conditions Guide (##HelpWhenTable): Explains activation criteria and usage for all 16 "When" conditions (HP thresholds, mana checks, buff/debuff presence, cure counter checks, loose adds, aggro triggers, and continuous twisting).

📦 Installation & Updating Instructions

🆕 New Installation

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