v0.16.0 Patch Notes
What's new in v0.16.0
Achievements
- New Achievements system - A WoW-style long-term progression layer that complements quests. Achievements track silently in the background as you play — kill mobs, break blocks, craft items, reach skill levels, catch fish, and more — and unlock with no "accept" step. Unlocks grant XP, commands (like
/giveitem drops), and achievement points that themselves unlock point-milestone rewards at 100 / 500 / 1,500 / 5,000 points. Open the page with/achievementsor via the new Achievements tab on/xp - ~22 default achievements across 5 categories - Combat, Gathering, Crafting, Leveling, and Exploration. Examples: First Blood (any kill), Iron Rush (100 Iron Ore), Master Miner (5,000 ores — broadcasts server-wide), Legend (level 100 in any skill — hidden until unlocked), Fishmonger (250 fish). Every default is customisable via JSON overrides in
mods/mmoskilltree/achievements/ - Per-achievement broadcast command - Each achievement can specify an
announcementCommandthat runs on unlock (with{player}and{achievement}placeholders). Defaults useeventtitle @a {"text":"..."}for the difficult ones so the whole server sees major milestones. Silent by default — keep quiet achievements quiet - Hidden achievements - Set
hidden: trueon an achievement and it won't appear in the list until unlocked. Perfect for secret goals and lore rewards - Point milestones - Earn enough points and a milestone reward triggers: 100 pts (bronze — 3 Defense XP Shards), 500 pts (silver — 1.5× All XP for 1h), 1,500 pts (gold — 2× All XP for 2h), 5,000 pts (platinum — 3× All XP for 3h). Each milestone claims once per player; override the thresholds and rewards in
mods/mmoskilltree/achievements/point-milestones.json
Quests Can Now Require Achievements
- Achievement-gated quests - Quests can require specific achievements to be unlocked before becoming visible/acceptable. Use the new
requiredAchievements: ["ach_id"]shortcut on any quest, or nestachievementsinside a structuredprerequisitesblock for AND/OR logic alongside quest and permission prereqs. Locked quests display the requirement ("Unlock achievement: Master Miner") on their row
WoW-Style Depth
- Meta-achievements - A meta achievement (set
metaChildren: [...]on the definition) unlocks automatically once every listed child is unlocked. Cascades through meta-of-metas so your server's capstone rewards can be chained. Load-time validation warns and disables metas with missing, disabled, or cyclic references — bad config won't crash the server - Multi-criteria achievements - A single achievement can now require multiple conditions to be met — e.g. "Renaissance Warrior" (defeat 100 in melee AND 50 Skeletons with ranged AND reach Defense 25). Each criterion tracks its own progress independently; the achievement unlocks only when ALL are met. Describe each criterion with its own
displayTextso the UI can render each bar with a custom label - Server-First achievements - Set
serverFirst: trueand only the first player on the server to complete it gets the unlock. A persistentserver-first-claims.jsonrecords the claimant's UUID, username, and timestamp. Losers see a "Server First missed" notification; winners get the gold SERVER FIRST badge on their row. A single synchronizedtryClaim()deterministically picks one winner in a race - Feats of Strength - One-of-a-kind accomplishments that don't count toward your point total, don't drive milestone thresholds, and stay hidden until unlocked (appear in a separate "Feats of Strength" section at the bottom of the page, WoW style). Use these for event trophies, alpha-tester badges, or unrepeatable world events
- Pinning - Pin up to 5 achievements to your tracker. Click the pin button on any row to toggle. Pinned in-progress achievements surface in the Tracked side panel on
/xpand rise to the top of the achievement list. Your 5-slot cap is enforced; over-cap pins show a toast instead of silently replacing - Nested subcategories - Categories can be split into subcategories (Combat → Melee / Ranged / Bosses; Gathering → Mining / Woodcutting / Fishing / Harvesting). A second row of tabs appears when a main category has subs; pick one to narrow your browse further
- Search bar - Type any fragment of an achievement's name, description, or criterion text to filter the list. Case-insensitive; also searches child names within meta achievements. Hidden achievements stay hidden in search results — no spoilers
- Point totals ignore feats of strength - Your displayed achievement points + the thresholds that drive milestone rewards cleanly skip feats. A rare event reward feels special without skewing the steady long-term progression curve
Performance
- Achievement progress runs off the world thread - Every event (block break, mob kill, craft, etc.) already fires on the world thread with the quest system; achievements extend that hook with a single-thread worker that updates an in-memory progress cache off the tick, then hops back to the world thread only to persist and dispatch rewards. Means a busy server with many achievements and many players pays almost nothing in tick time for achievement checks
- Periodic flush + disconnect flush - Progress is flushed from the in-memory cache into the player's
AchievementComponentevery 30 seconds and on disconnect, so progress survives restarts even if players stay connected for long sessions
Statistics Tracking
- Persistent per-player statistics - Every player now accrues lifetime counters across 11 categories: mobs defeated, blocks broken, blocks placed, items crafted, items picked up, damage dealt, damage taken, deaths, fish caught, XP earned, and seconds played. Per-item maps (which mob types, which blocks, which skills) track breakdown for richer reporting. Updates inline on the world thread via
ConcurrentHashMap.merge— zero tick-time cost - Playtime tracking - Accumulated via the regen ticking system every frame; whole seconds commit to the component as they add up. Restart-safe, offline-safe
Achievement UI/UX Polish
- New Achievement Overview landing page -
/achievements(and every menu entry point that used to dump you into the raw list) now opens to a summary/overview view first. Shows your most recent unlocks with dates, achievements you're nearest to completing, a category-completion grid (e.g. Combat 12/34 with a mini progress bar), and your progress toward the next point milestone. Click Browse All to get the full filterable list — the previous list view is still one click away - Unlock dates on achievement rows - Every unlocked achievement now shows the date it was earned (ISO format,
YYYY-MM-DD). Historical unlocks from before this iteration show--since no timestamp was recorded at the time; new unlocks from now on get a real date - Reward previews on achievement rows - Each achievement row now shows a compact one-line preview of its rewards ("Rewards: Defense XP Shard, 2x All XP 1h, ..."), truncated at ~80 characters. No more mystery about what you'll get until after you unlock
- New Details view - Click "Details >" on any achievement row to open a full-detail page with the big header, long description, every criterion with its own progress bar, the complete reward list, and clickable meta children. The page also surfaces which meta achievements this one is part of, plus related achievements in the same category/subcategory. Admins additionally see the on-unlock announcement command as a diagnostic
- Filter-preserving back navigation - Opening a Details page from a filtered list and clicking Back returns you to the exact filters you had set (category, subcategory, search, sort, status). Opening from the Summary lands back on the Summary
UI/UX — Wider Menu Pages With Page-Specific Side Panel
- Three-column menu layout - The four main menu pages (
/xp,/achievements,/boosts,/quests) widen from 1200 to 1570 pixels and gain a new right-side panel whose contents are unique to each page. The left sidebar stays as cross-page navigation, the centre panel keeps its existing list/content, and the new side panel shows "at a glance" context you shouldn't have to click away to find - Achievements page side panel — Statistics - Lifetime stats render permanently alongside the achievement list. Five sections (Combat / Gathering / Crafting / Leveling / Playtime) show your counters for mob kills, blocks broken/placed, items crafted, damage dealt/taken, deaths, fish caught, XP earned, and total playtime. Top-3 breakdowns ("mushroom x128, pork x64, …") render underneath counters for mobs, blocks, fish, crafted items, and per-skill XP
- XP page side panel — Tracked Achievements - Up to 5 pinned in-progress achievements render as compact rows with live progress bars. Click any row to open the achievements page scrolled to that entry. When you've pinned nothing, an empty-state prompt nudges you to pin. Fully unlocked pins don't clutter the tracker — they drop out so only your current work shows
- Boosts page side panel — Active Boosts - The active-boost list moved into the side panel so it's always visible while you browse reusable boosts or tokens in the main content. The tokens list gets the reclaimed vertical space (height 170 → 340), fewer scrolls to find the token you want to redeem
- Quests page side panel — Tracked Quest detail - The first active quest's title, description, objectives (with live
x/yprogress), and reward summary render large in the side panel. Makes "what am I doing right now?" a passive glance instead of a scroll - Fixed pin button rendering as "?" - Old star glyphs (
★/☆) weren't in Hytale's UI font, so both pinned and unpinned buttons rendered as?. Swapped to ASCII-safe+/-glyphs with per-state background colours (gold fill when pinned, slate-grey when unpinned) so the state is obvious at a glance - Per-criterion rows now render inline - Multi-criteria achievements (e.g. Renaissance Warrior) show one row per criterion beneath the aggregate bar — each with its own
x/yprogress text and a "met" tick. Meta achievements render the list of child achievements as clickable chips that open the child's page
Quest Tracking + Menu Navigation Parity
- Track up to 5 quests - Active quests now have a track button in their row header. Tracked quests show in a new "Tracked Quests" section on the main XP page's right-side panel, just below the tracked-achievements list, with a progress bar showing completed / total objectives. Five tracked-quest slots, enforced the same way achievement pinning is, with a localized toast when you hit the cap. Tracked quests auto-hide when they complete or are abandoned
- Click through to the quest - Clicking a tracked-quest row on the XP page jumps straight to the Quests page
- Navigation parity across the four menu pages -
/achievementswas missing most of the left-panel tabs other pages carried; it now shows the full set (Overview, skill categories, Leaderboard, Boosts, Quests, Achievements, Settings, Admin) matching/xp,/boosts, and/quests - New Achievements tab on Boosts and Quests pages - The left-panel navigation on Boosts and Quests now exposes a direct Achievements tab so you're always one click away from the achievement list
Admin Tools
- New
/mmoconfig achievementsubcommand - Seven operations:award(force-unlocks with server-first handling),[--force] revoke(clears state + all criterion progress + cascades to meta parents),reset,[id|all] progress,[criterionIndex] reload(hot-reload config + server-first claims + re-hydrate online players),list [category|all], andpin/unpin. SharedapplySingleUnlockinternals keep the event path and admin path consistent
Public API
- New
MMOSkillTreeAPI.addAchievementListener(Consumer- External plugins can subscribe to achievement unlocks. The event carries the PlayerRef, achievement ID, points awarded, and running total. Listeners run on the world tick thread. Paired with) removeAchievementListener,fireAchievementEvent, and new gettersisAchievementUnlocked,getAchievementProgress,getAchievementPoints,getAchievementComponent. Guild plugins or leaderboards can plug in without touching plugin internals - New
MMOSkillTreeAPImethods -pinAchievement,unpinAchievement,getPinnedAchievements,getStatistics,getStatTotal,getServerFirstClaim. External plugins can read the full picture — pin state, stat totals, claim ownership — without touching plugin internals
Looking for technical details? View full developer changelog for v0.16.0