A lightweight XP and AA session tracker overlay for EverQuest, built on MacroQuest with Lua and ImGui. Live progress bars, hourly rates, average per-kill XP, and predicted time/kills to the next level or AA point — all in a clean, always-on-top window.
- Live Level XP and AA XP progress bars with exact percentages
- Split-aware tracking: reads your in-game Level/AA split and displays it inline
- Two complementary rate views per channel: current-window (
XP%/hr,AA%/hr) and session-wide (Sess%/hr) - Predicted
Kills/Lvl,Time/Lvl,Kills/AA,Time/AAdriven by the session rate - Automatic proportional rescaling of historical data when you change your XP split mid-session — no reset required to get sensible predictions at the new ratio
- Graceful fallback to the session rate when the per-level/per-point window is too fresh to compute (e.g., immediately after leveling)
- One-click session reset
- MacroQuest with
MQ2Lua MQ2ImGui(ships with most modern MQ builds)- An EverQuest client compatible with your MQ build
Place the EQXPInfo folder inside your MQ installation's lua directory so the final path reads:
<MQ install>/lua/EQXPInfo/init.lua
Clone directly into lua:
cd <MQ install>/lua
git clone https://github.com/BeardedRepoWrangler/EQXPInfo.gitOr download a release zip from the releases page and extract it there.
In-game:
/lua run EQXPInfo
To stop, click Stop in the overlay or run /lua stop EQXPInfo.
This is the most common source of confusion, so it's worth understanding both.
XP%/hr and AA%/hr are current-window rates. XP%/hr measures level XP gained within your current level — when you ding, its baseline resets and it starts over. AA%/hr measures AA XP gained toward your current AA point — when you earn a point, its baseline resets. These are great for answering "how fast am I progressing right now?" because they respond quickly to changes in pull quality, group composition, or mob density.
Sess%/hr is the session-wide cumulative rate. It sums every XP gain since the session started (or since your last manual reset) and divides by total elapsed time. It does not reset on level-up or AA-point-earned events, because those aren't real slow-downs — they're just baseline shifts in a continuous grind.
Because it spans the whole session, Sess%/hr is stable (it won't drop to 0 every time you ding), predictive (this is the rate Time/Lvl and Time/AA are computed from, since a long-horizon average is more trustworthy for planning than a short-window snapshot), and immune to level boundaries (if you level three times in a session, XP%/hr resets three times but Sess%/hr keeps integrating the whole journey).
When the per-window rate hasn't had time to accumulate (right after a ding or point-earn), XP%/hr / AA%/hr fall back to Sess%/hr so you always see a meaningful number.
Rule of thumb: use the current-window rate to feel the tempo right now, use the session rate to plan.
The mean XP (or AA) percentage gained per detected XP event this session. The script counts each frame where your absolute XP% increases as one event, which is a good proxy for kills but can batch multi-kills landing in the same 100 ms frame.
Predictions for completing your current level (or earning your current AA point). Kills/Lvl is ceil(remaining% / Avg%/Kill). Time/Lvl is remaining% / Sess%/hr × 3600s. When there's no data yet, the field shows --- or --:--:--.
Cumulative fractional levels gained this session — unaffected by the session's own level-up boundaries. 0.50 means half a level past where you started, whether or not you dinged in between.
Current unspent AA pool pulled directly from the game. Highlighted in green with a (train!) hint when ≥1.
The in-game XP Split controls what percentage of each kill's XP goes to leveling vs. to AA. When you change it mid-session, historical rates no longer describe the new behavior — so the script proportionally rescales them. Level accumulators scale by newPctToLevel / oldPctToLevel; AA accumulators scale by newPctToAA / oldPctToAA. After a split change, Avg%/Kill, %/hr, Kills/*, and Time/* all read as if the new split had been active the whole session. No reset required.
Edge case: if one side was at 0% before the change (no observations to scale from), that side's accumulators reset cleanly instead of trying to divide by zero.
- Reset Session — wipes all accumulators and re-baselines every timer at the current XP/AA position. Use this when you move to a new camp, change group composition, or start a new session.
- Stop — closes the overlay (equivalent to
/lua stop EQXPInfo).
Follows Semantic Versioning. Current release: 1.0.0.
Major bumps indicate breaking changes to configuration, file layout, or display format. Minor bumps add features. Patch bumps fix bugs.
Pull requests welcome. For larger changes, open an issue first to discuss the direction. New users should start with ONBOARDING.md for a guided tour of the overlay.
See CHANGELOG.md for the release history.
MIT — free to use, modify, and redistribute with attribution.
