Skip to main content

Changelog

Version 2.6.0 - LevelingCore, ShowcaseCompat & Objective Expansion

New Features

Per-Player Language (Full Implementation)

All achievement notifications, gallery UI, title display, and admin popups now respect each player's individual language setting (via /kslang). Supported languages: en-US, de-DE, fr-FR, es-ES, pt-BR, it-IT, pl-PL, ru-RU, ja-JP.

LevelingCore Integration

Replaced the direct RPGLeveling dependency with the new LevelingCore abstraction layer. This allows the achievement system to work with any leveling plugin that implements the LevelingCore API.

9-Language Admin Popup

The admin achievement management popup now renders in all 9 supported languages based on the admin's language setting.

ShowcaseCompat

Added compatibility layer for the Showcase mod. Achievements can now be displayed in Showcase displays and interacted with through the Showcase UI.

10 New Objective Types

Added the following missing objective trigger types:

  • items_consumed — Track food/potion consumption
  • items_dropped — Track items dropped
  • items_picked_up — Track items picked up
  • deaths — Track player deaths
  • damage_dealt — Track total damage dealt
  • damage_taken — Track total damage taken
  • jumps — Track player jumps
  • sprinting_distance — Track sprinting distance
  • swimming_distance — Track swimming distance
  • fishing_catches — Track fishing catches

Bug Fixes

  • Memory Leak Fix — Additional cleanup pass for cached UI state that was not being released on player disconnect
  • Custom Achievement Persistence Fix — Custom achievements defined in custom/*.json are now correctly preserved across server restarts when using MySQL storage
  • Localization After Save Fix — Language strings are now correctly resolved after a player data save/reload cycle (previously fell back to en-US after save)

Version 2.5.0 - Per-Player Language & Memory Fixes

New Features

Per-Player Language Support

Players can now set their preferred language with /kslang. Achievement notifications, gallery UI, and title display all respect the player's language setting.

Bug Fixes

  • Memory Leak Fix — Player achievement data is now properly cleaned up on disconnect. Prevents memory growth on long-running servers.
  • Endless Level Tracker — Fixed cumulative XP threshold tracking for Endless leveling integration.

Version 2.4.0 - Endless Leveling Integration

New Features

Endless Leveling Support

Full integration with the Endless leveling system. New trigger type endless_xp tracks cumulative XP thresholds. New reward type endless_xp grants Endless XP from achievement rewards.

Improvements

  • Announcement Padding Fix — Info Hub announcement display padding corrected.

Version 2.3.0 - MySQL Storage, Tracker Config & Performance

New Features

Tracker HUD Toggle

The Achievement Tracker HUD can now be globally disabled via configuration.

"trackerHud": {
"enabled": true,
"position": "right"
}

Set enabled to false to completely disable the tracker for all players.

MySQL Storage Backend

Player achievement data can optionally be stored in MySQL for cross-server setups. Requires Core v1.4.0+ with MySQL storage configured.

  • Automatic legacy file migration on first load
  • Table: ks_achievement_players (UUID, Username, JSON-Blob, Timestamp)
  • Fully backwards compatible — file storage remains the default

Improvements

Debug Gate (Performance)

Over 20 files updated to gate detail-level logging behind CoreAPI.isDebug(). This massively reduces console spam in production. Only startup summaries, shutdown messages, and achievement unlock notifications remain ungated.

Bug Fixes

  • RPG Level Chat Display — Player level now shows correctly in chat (cache was not populated on join)
  • Nameplate Cleanup — Achievement titles are cleared from nameplates on plugin shutdown (no more orphaned titles)
  • Language Propagation — Language changes in the admin panel now correctly propagate to all mods
  • WARN Spam — Playtime tick warnings and toast HUD conflict warnings downgraded to FINE level

Version 1.8.7 - UI Fix

Bug Fixes

  • Fixed UI crash when MMO Skill Tree or RPG Leveling mods are not installed
    • Filter buttons now correctly check if the mod is actually available
    • Fixed incorrect UI visibility property usage

Documentation

  • Documented Hytale nameplate limitations
    • Nameplates only support plain text (no colors)
    • Multiline text is not supported in nameplates
    • titlePosition options "above" and "below" behave like "prefix" and "suffix"
    • Color settings (titleColor, rpgLevelColor) only work in chat

Version 1.8.6 - Custom Localization Support

New Features

Custom Translation Files

Server admins can now add their own translations without losing them during updates.

  • New template files: custom_en-US.json.example, custom_de-DE.json.example
  • Copy to custom_en-US.json and add your translations
  • Custom translations are NEVER overwritten by plugin updates
  • Keys starting with _ are treated as comments and ignored

Example:

{
"lootbag.name.my_server_reward": "Server Reward",
"lootbag.desc.my_server_reward": "A special gift from our server!",
"achievements.name.custom_quest": "Custom Quest",
"achievements.desc.custom_quest": "Complete the server quest"
}

See Localization for complete documentation.


Version 1.8.5 - Lootbag Localization

New Features

Lootbag i18n Support

All lootbag names, descriptions, and rarities are now fully localizable.

Translation Keys:

Key PatternDescription
lootbag.name.<id>Lootbag name
lootbag.desc.<id>Lootbag description
lootbag.rarity.<rarity>Rarity label (common, uncommon, rare, epic, legendary)

If no translation exists, the plugin falls back to the value from lootbags.json.

Technical Changes

  • Localization version bumped to v4 (auto-updates existing installations)
  • Lootbag translations moved from .lang files to JSON (localization/*.json)

Version 1.8.3 - French Language Support

New Features

  • Added French language support (fr-FR)
  • All three languages (en-US, de-DE, fr-FR) are now auto-extracted on first start

Version 1.8.2 - Multi-Target & Filter Improvements

New Features

Multi-Target Support

Achievement triggers now support comma-separated targets for matching multiple entities or items:

{
"trigger": {
"type": "kills",
"target": "Spider,Spider_Cave,Spider_Frost",
"count": 100
}
}

Smart Filter Visibility

  • MMO Skills filter auto-hides when MMO SkillTree plugin is not installed
  • RPG Leveling filter auto-hides when RPG Leveling plugin is not installed

Bug Fixes

  • Fixed Config Migration - Version constants updated to trigger auto-updates correctly
  • Fixed 16+ Invalid Item IDs - All items validated against server item list

Version 1.8.1 - Config Migration Fix

Bug Fixes

  • Config version fix (migration now works correctly)

Version 1.8.0 - API & UI Updates

Summary

This version adds three major features: Unlock dates are now displayed in the achievement gallery UI, a public API allows external plugins to interact with the achievement system, and player levels from RPGLeveling can optionally be shown in nametags and chat.

New Features

Unlock Date Display

Completed achievements now show the unlock date in the achievement gallery.

  • German (de-DE): dd.MM.yyyy (e.g., "02.02.2026")
  • English (en-US): MM/dd/yyyy (e.g., "02/02/2026")

Public API

External plugins can now interact with the Achievement System through a stable API.

import com.hytale.achievements.api.AchievementAPI;

// Get API instance
AchievementAPI api = AchievementAPI.getInstance();

// Check availability
if (AchievementAPI.isAvailable()) {
// Use API methods
}

Available API Features:

  • Query achievement status, progress, and statistics
  • Grant/revoke achievements programmatically
  • Listen for unlock and progress events
  • Access player statistics (blocks mined, mob kills, playtime)

See API Reference for complete documentation.

RPG Level Display

Player levels from the RPGLeveling plugin can optionally be displayed in nametags and chat.

Configuration:

{
"display": {
"showRpgLevel": true,
"rpgLevelFormat": "Lv.{level}",
"rpgLevelColor": "#55FFFF",
"rpgLevelPosition": "after_name"
}
}

Available Positions:

PositionExample
before_name[Title] [Lv.15] Username
after_name[Title] Username [Lv.15]
after_title[Title] [Lv.15] Username

Requirements:

  • RPGLeveling plugin must be installed
  • showRpgLevel must be set to true

File Changes

FileChanges
AchievementGallery.uiAdded #UnlockedDate label to all entry elements
AchievementGalleryPage.javaAdded formatUnlockDate() method and display logic
api/AchievementAPI.javaNEW - Complete public API class
AchievementPlugin.javaAPI initialization in setup(), RPGLevelingIntegration passed to TitleDisplayManager
AchievementService.javaUnlock notifications to API listeners
AchievementConfig.javaNew display options for RPG Level
TitleDisplayManager.javaLevel display integrated in nametag and chat

Migration

For Server Admins:

  • No action required
  • UI update loads automatically
  • API is immediately available for other plugins

For Plugin Developers:

  • API available via AchievementAPI.getInstance()
  • Always check isAvailable() before calling API methods
  • Listeners are automatically called when achievements unlock

Version 1.7.0 - Item Validation & Bug Fixes

Summary

Comprehensive overhaul of all Item IDs in configuration files. All Minecraft-style Item IDs have been replaced with valid Hytale Item IDs. Additionally, two important bugs were fixed.

Bug Fixes

Weekend Warrior Achievement Not Unlocking - FIXED

  • Root Cause: Trigger was set to "type": "manual" - no automatic detection
  • Solution: New trigger type weekend_login implemented
  • Weekend check on player login in AchievementPlugin.java
  • Achievement now automatically unlocks when player logs in on Saturday or Sunday

Chat Broadcasts for All Achievements - FIXED

  • Problem: broadcastToChat was sending broadcasts for ALL unlocked achievements
  • Desired Behavior: Broadcasts only for achievements with title unlocks
  • Solution: Added condition in AchievementService.java to check for title presence

Item ID Corrections

Corrected 150+ invalid item IDs across all configuration files.

Global Naming Conventions (Minecraft → Hytale)

Minecraft-StyleHytale-StyleDescription
Tool_Axe_*Tool_Hatchet_*Axes are called Hatchets
Food_ApplePlant_Fruit_AppleFruits under Plant_
Food_BreadConsumable_Food_BreadFood under Consumable_
Armor_Chestplate_*Armor_*_ChestArmor pieces named differently
Armor_Helmet_*Armor_*_Head
Shield_*Weapon_Shield_*Shields under Weapon_
Weapon_Bow_*Weapon_Shortbow_*Bows called Shortbow
Weapon_Dagger_*Weapon_Daggers_*Daggers are plural
Potion_*Consumable_Potion_*Potions under Consumable_
Material_*Ingredient_*Materials called Ingredients
Diamond TierAdamantite TierNo Diamond in Hytale

Specific Corrections

Materials → Ingredients:

  • Material_StringIngredient_Fibre
  • Material_PoisonIngredient_Venom
  • Material_FurIngredient_Hide_Thick
  • Material_LeatherIngredient_Hide_Medium
  • Material_BoneIngredient_Bone_Fragment
  • Ingredient_FeatherIngredient_Feathers_Light

Gems:

  • Gem_RubyRock_Gem_Ruby
  • Gem_EmeraldRock_Gem_Emerald
  • Gem_SapphireRock_Gem_Sapphire

Workstations:

  • Bench_CarpenterBench_WorkBench
  • Bench_StonecutterBench_Builders
  • Bench_AnvilBench_Armory

Potions:

  • Consumable_Potion_Health_WeakPotion_Health_Lesser
  • Consumable_Potion_Health_StrongPotion_Health_Greater
  • Consumable_Potion_HealthPotion_Health

Wood:

  • Wood_Oak_LogWood_Oak_Trunk
  • Wood_Birch_LogWood_Birch_Trunk

File Changes

FileChanges
lootbags.json~45 Item IDs corrected
achievements.jsoniconItems corrected, weekend trigger fixed
mmo_skills_achievements.jsonWeapon/Tool/Bench corrections
rpg_leveling_achievements.jsonMaterial→Ingredient corrections
AchievementPlugin.javaWeekend-login trigger added
AchievementService.javaBroadcast condition for title-only

New Trigger Type

{
"trigger": {
"type": "weekend_login",
"count": 1
}
}

Triggers when a player logs in on Saturday or Sunday.

Migration

For Server Admins:

  • Configs are automatically updated on server start
  • Old configs backed up as .backup-vX
  • Check your custom/ files for the same item errors

For Players:

  • No action required
  • Existing achievements are preserved
  • Weekend Warrior now unlocks automatically on weekend login

Known Limitations

  • Material_Orb_Experience doesn't exist → Replaced with Rock_Gem_Sapphire
  • Material_Orb_Time doesn't exist → Replaced with Rock_Gem_Sapphire
  • No Flesh_Rotten item → Replaced with Food_Wildmeat_Raw
  • No Paper item → Replaced with Deco_Book_Pile_Small

Version 1.6.1 - Event-Based RPG Leveling & Filter Icon Fixes

Summary

Critical update that completely rewrites the RPG Leveling integration from polling-based to event-based, fixing achievements not triggering on level-up. Also fixes missing filter icons in the Achievement Gallery.

Breaking Changes

RPG Leveling Plugin Version Requirement:

  • Minimum: v0.2.0-beta-5 (or newer)
  • Older versions (e.g., 0.1.10) do NOT have the required event API
  • The event-based integration requires LevelUpListener and ExperienceGainedListener interfaces

Bug Fixes

RPG Leveling Achievements Not Triggering - FIXED

  • Root Cause: Previous implementation used wrong API class paths
  • Old (broken): org.zuxaw.plugin.api.events.LevelUpEvent
  • New (correct): org.zuxaw.plugin.api.LevelUpEvent
  • Old (broken): Used Consumer<T> for listener registration
  • New (correct): Uses LevelUpListener and ExperienceGainedListener interfaces
  • Solution: Complete rewrite using Java Dynamic Proxy for interface implementation
  • Root Cause: Invalid ItemIds for filter icons
  • Old (broken): Material_Experience_Orb, Weapon_Sword_Adamantite, Greenscreen
  • New (correct): Tool_Pickaxe_Cobalt, Weapon_Sword_Cobalt, Ore_Prisma
  • Affected filters: MMO Skills, RPG Leveling, Completed

Localization JSON Parse Failure - FIXED

  • Root Cause: Duplicate key bug_squasher in localization files
  • Renamed conflicting title to bug_squasher_title
  • Added localization versioning system (now v3) with auto-update and backup

Technical Changes

RPGLevelingIntegration.java - COMPLETE REWRITE

AspectOld (v1.6.0)New (v1.6.1)
ApproachPolling (every 5s)Event-based (real-time)
API VersionUnknown0.2.0-beta-5
Event Classes.api.events.LevelUpEvent.api.LevelUpEvent
Listener TypeConsumer<T>LevelUpListener interface
PlayerLevelInfo.api.PlayerLevelInfo.api.RPGLevelingAPI$PlayerLevelInfo
RegistrationDirect ConsumerJava Dynamic Proxy

New Implementation Details:

// Java Dynamic Proxy for interface implementation
InvocationHandler levelUpHandler = (proxy, method, args) -> {
if ("onLevelUp".equals(method.getName())) {
handleLevelUpEvent(args[0]);
}
return null;
};
levelUpListenerProxy = Proxy.newProxyInstance(
levelUpListenerClass.getClassLoader(),
new Class<?>[] { levelUpListenerClass },
levelUpHandler
);
registerLevelUpListenerMethod.invoke(apiInstance, levelUpListenerProxy);

File Changes

FileChangeDescription
RPGLevelingIntegration.javaREWRITTENEvent-based API, Dynamic Proxy
RPGLevelTracker.javaMODIFIEDRemoved polling, added event handlers
AchievementPlugin.javaMODIFIEDRemoved scheduler, added listener registration
AchievementGalleryPage.javaMODIFIEDFixed filter icon ItemIds
PluginI18n.javaMODIFIEDAdded versioning system
en-US.jsonMODIFIEDFixed duplicate key, added version
de-DE.jsonMODIFIEDFixed duplicate key, added version

Server Log Examples

Successful Initialization:

[KyuubiSoft Achievements] RPGLevelingAPI class loaded successfully
[KyuubiSoft Achievements] Loading event and listener classes...
[KyuubiSoft Achievements] Caching listener methods...
[KyuubiSoft Achievements] RPGLeveling API integration enabled!
[KyuubiSoft Achievements] Registered LevelUp listener with RPGLevelingAPI (dynamic proxy)
[KyuubiSoft Achievements] Registered ExperienceGained listener with RPGLevelingAPI (dynamic proxy)

Level-Up Achievement Trigger:

[KyuubiSoft Achievements] [RPGLeveling] LevelUp event: PlayerName leveled up from 1 to 2
[KyuubiSoft Achievements] [RPGLevelTracker] LevelUp: PlayerName from 1 to 2
[KyuubiSoft Achievements] Unlocking achievement test_rpg_level_2 for PlayerName
[KyuubiSoft Achievements] PlayerName reached RPG Level 2!

Upgrade Notes

  1. Update RPGLeveling Plugin to v0.2.0-beta-5 or newer
  2. Delete old localization/ folder (will be regenerated with v3)
  3. Restart server
  4. Verify in logs: "Registered LevelUp listener with RPGLevelingAPI (dynamic proxy)"

Version 1.6.0 - Config Folder Structure & RPG Leveling Integration

Summary

Major update introducing a new organized folder structure for configurations and full RPG Leveling plugin integration with 35 new achievements.

New Features

New Config Folder Structure

  • Separated Standard and Custom Configs - Clear distinction between plugin defaults and server customizations
  • configs/ Folder - Standard configs that ship with the plugin (DO NOT MODIFY!)
    • achievements.json - Core achievements
    • mmo_achievements.json - MMO Skill Tree achievements
    • rpg_leveling_achievements.json - RPG Leveling achievements
  • custom/ Folder - Server admin customizations (NEVER overwritten!)
    • custom_achievements.json - General custom achievements
    • custom_mmo_achievements.json - Custom MMO skill achievements
    • custom_rpg_leveling_achievements.json - Custom RPG leveling achievements
    • .example template files for each type
  • Automatic Folder Creation - Folders are created automatically on first start
  • Safe Updates - Standard configs can be updated without losing custom achievements
  • Individual Config Toggle - Each standard config can be disabled individually:
    • loadDefaultAchievements - Toggle core achievements
    • loadMmoAchievements - Toggle MMO Skill Tree achievements
    • loadRpgLevelingAchievements - Toggle RPG Leveling achievements
  • Config Versioning - All standard configs have version numbers for automatic updates

RPG Leveling Integration

  • Soft Dependency - Works without RPGLeveling installed (achievements just won't trigger)
  • Reflection-Based API - No hard dependency, graceful fallback
  • Polling-Based Tracker - Checks player level/XP every 5 seconds
  • 35 New Achievements:
    • 6 Level Milestones (5, 10, 25, 50, 75, 100)
    • 3 XP Milestones (1,000 / 10,000 / 100,000)
    • 26 Mob Kill Achievements (Trork, Skeleton, Zombie, Scarak, Goblin chains)

New Trigger Types

  • rpg_level - Triggers when reaching a specific character level
  • rpg_xp - Triggers when accumulating total XP

Custom MMO Achievements

  • New File: custom_mmo_achievements.json - Server admins can now add custom MMO skill achievements
  • Template Included - .example file with usage examples
  • Override Support - Custom achievements can override default MMO achievements

New Files

FileLocationDescription
RPGLevelingIntegration.javaintegration/Reflection-based API wrapper
RPGLevelTracker.javatracking/Polling tracker for level/XP changes
rpg_leveling_achievements.jsondefaults/35 default RPG Leveling achievements
custom_rpg_leveling_achievements.json.exampledefaults/Template for custom RPG achievements
custom_mmo_achievements.json.exampledefaults/Template for custom MMO achievements

Configuration

New Folder Structure

KyuubiAchievements/
├── config.json # Main config (root)
├── README.md
├── configs/ # Standard configs (DO NOT MODIFY!)
│ ├── achievements.json
│ ├── mmo_achievements.json
│ └── rpg_leveling_achievements.json
└── custom/ # Custom configs (safe from updates)
├── custom_achievements.json
├── custom_achievements.json.example
├── custom_mmo_achievements.json
├── custom_mmo_achievements.json.example
├── custom_rpg_leveling_achievements.json
└── custom_rpg_leveling_achievements.json.example

Custom RPG Leveling Achievement Example

{
"configVersion": 3,
"achievements": [
{
"id": "rpg_level_150",
"category": "rpg_leveling",
"iconItem": "Weapon_Sword_Adamantite",
"difficulty": "epic",
"requires": "rpg_level_100",
"title": { "id": "transcendent", "color": "#FF00FF" },
"trigger": { "type": "rpg_level", "target": "150", "count": 1 },
"rewards": [
{ "type": "item", "itemId": "Currency_Coin_Gold", "amount": 100 }
]
}
]
}

Default RPG Leveling Achievements

Level Milestones

IDLevelTitleDifficulty
rpg_level_55-Easy
rpg_level_1010AdventurerNormal
rpg_level_2525VeteranNormal
rpg_level_5050EliteHard
rpg_level_7575ChampionHard
rpg_level_100100LegendEpic

XP Milestones

IDXP RequiredTitleDifficulty
rpg_xp_10001,000-Easy
rpg_xp_1000010,000-Normal
rpg_xp_100000100,000XP HunterHard

Mob Kill Chains (10 → 50 → 100 → 500 → 1000)

  • Trork Chain - Titles: Trork Hunter, Trork Slayer, Trork Bane
  • Skeleton Chain - Titles: Bone Collector, Undead Hunter, Skeleton Bane
  • Zombie Chain - Titles: Zombie Hunter, Zombie Slayer, Zombie Bane
  • Scarak Chain - Titles: Bug Squasher, Scarak Slayer, Scarak Bane
  • Goblin Chain - Titles: Goblin Hunter, Goblin Slayer, Goblin Bane

Migration from v1.5.x

  1. The plugin will automatically create the new folder structure on first start
  2. Existing configs in root folder should be manually moved:
    • achievements.jsonconfigs/achievements.json
    • mmo_achievements.jsonconfigs/mmo_achievements.json
    • custom_achievements.jsoncustom/custom_achievements.json
  3. Or simply delete old configs and let the plugin regenerate them

Version 1.5.2 - Lootbag & Pending Rewards System

Summary

Major update introducing the Lootbag Reward System and Pending Rewards UI. Players can now receive lootbags from achievements and collect rewards manually via the new /rewards command.

New Features

Lootbag Reward System

  • New Reward Type: Lootbag - Achievements can now reward lootbags instead of direct items
  • Lootbag Templates - Reusable lootbag definitions in lootbags.json
  • Three Lootbag Types:
    • Fixed Items: Player receives all defined items
    • Random Pool: Player receives X weighted random items
    • Hybrid: Guaranteed items + random picks
  • Weighted Random Algorithm - Each pool item has a weight for probability control
  • 14 Default Templates - Ready-to-use lootbags (starter packs, ore bundles, food crates, etc.)
  • Auto-Export - lootbags.json is auto-generated in server config on first start

Pending Rewards UI (/rewards)

  • New Rewards Command - View and collect all pending rewards
  • Support for All Reward Types - Items, Lootbags, Commands
  • Interactive Buttons:
    • "Collect" for items and commands
    • "Open" for lootbags (reveals contents, then collect)
    • "Collect All" to grab everything at once
  • Visual Feedback - Item icons, rarity colors, source achievement display
  • Chat Notifications - When opening a lootbag, contents are shown in chat

Achievement Toast Improvements

  • Lootbag Display - Toast now shows "Lootbag" in rewards line when achievement grants a lootbag

Block Tracking Fix

  • Grass Block Fix - Soil_Grass_Full and similar soil blocks now correctly count for mining achievements
  • Previous filter was too aggressive, excluding all blocks containing "grass"

Creative Mode Ignore

  • New Config Option - tracking.ignoreCreativeMode (default: true)
  • Players in Creative mode don't earn achievement progress
  • Prevents "cheating" achievements via Creative mode

Configuration

New File: lootbags.json

{
"lootbags": {
"welcome_gift": {
"name": "Willkommensgeschenk",
"description": "Ein kleines Startpaket für neue Spieler",
"icon": "Chest_Wood",
"rarity": "common",
"items": [
{ "itemId": "Food_Bread", "amount": 10 },
{ "itemId": "Torch", "amount": 16 }
]
},
"random_gems": {
"name": "Gem Lottery",
"rarity": "rare",
"pickCount": 2,
"allowDuplicates": false,
"pool": [
{ "itemId": "Gem_Ruby", "amount": 1, "weight": 20 },
{ "itemId": "Gem_Emerald", "amount": 1, "weight": 30 }
]
}
}
}

Achievement Reward Example

{
"id": "welcome_achievement",
"rewards": [
{ "type": "lootbag", "lootbagId": "welcome_gift" }
]
}

Config Option

"tracking": {
"ignoreCreativeMode": true
}

Default Lootbag Templates

IDNameRarityType
starter_packStarter PackCommonFixed
welcome_giftWillkommensgeschenkCommonFixed
copper_bundleKupfer-ErzbündelUncommonFixed
iron_toolsEisen-WerkzeugsetRareFixed
miner_rewardMiner's TreasureUncommonFixed
ore_bundle_commonErzbündel (Basis)CommonFixed
ore_bundle_rareErzbündel (Selten)RareFixed
ore_bundle_epicErzbündel (Episch)EpicFixed
food_crateProviantkisteCommonRandom Pool
combat_lootWarrior's CacheRareHybrid
explorer_chestExplorer's ChestEpicRandom Pool
legendary_hoardDragon's HoardLegendaryHybrid
playtime_bronzeBronze-TreuebelohnungCommonFixed
playtime_silverSilber-TreuebelohnungUncommonFixed
playtime_goldGold-TreuebelohnungRareHybrid

Version 1.5.1 - Gradient & Rainbow Support

New Feature

  • Gradient & Rainbow on Username - Trailing <gradient:...> or <rainbow> tags from LuckPerms prefix now apply to the username
  • Gradient & Rainbow on Chat Message - Trailing <gradient:...> or <rainbow> tags from LuckPerms suffix now apply to the chat message
  • Each character gets individually colored for smooth gradient/rainbow effects
  • Example: Prefix <gradient:#ff85fb:#85fbff> → Username appears with pink-to-cyan gradient
  • Example: Prefix <rainbow> → Username appears with rainbow colors

Technical

  • New AdventureConverter.TrailingGradient class for extracting gradient/rainbow info
  • New AdventureConverter.applyGradient() method for per-character color interpolation
  • New AdventureConverter.applyRainbow() method for HSV-based rainbow coloring
  • HSV to RGB conversion for smooth color transitions

Version 1.5.0 - LuckPerms & MHUD Release

Summary

This is a major release consolidating all 1.4.x improvements into a stable version.

New Features

LuckPerms Integration (since 1.4.0)

  • Automatic Prefix Retrieval - LuckPerms prefixes are fetched automatically from the API
  • Full Color Support - Rainbow, gradients, legacy codes (&a, &b), hex colors
  • Trailing Style Support - Active styles at the end of prefix apply to username (color, bold, italic, underlined, strikethrough)
  • Separate Prefix/Suffix Styling - Prefix styles → Username, Suffix styles → Message color
  • Combined Chat Format - [LuckPerms-Prefix] [Achievement-Title] Username: message
  • Lazy Initialization - Works regardless of plugin load order

MHUD Integration (since 1.4.7)

  • Multiple HUD Support - Full integration with MHUD plugin
  • Conflict Prevention - No more crashes when multiple plugins use Custom HUDs
  • Graceful Fallback - Works with or without MHUD installed
  • Smart Detection - Automatically detects and uses MHUD when available

Technical

  • Adventure MiniMessage library for color parsing (same as LuckPerms uses)
  • AdventureConverter utility class for MiniMessage → Hytale Message conversion
  • MHUDIntegration class for MHUD communication via reflection
  • Shadow JAR includes relocated Adventure libraries

Bug Fixes

  • Fixed color inheritance for complex LuckPerms prefixes
  • Fixed LuckPerms load order issues with lazy initialization
  • Fixed "Failed to apply CustomUI HUD commands" crash with MHUD
  • Fixed crash when multiple plugins use Custom HUD without MHUD
  • Removed debug logging (now uses FINE level)

Dependencies

Optional:

  • LuckPerms (for prefix/suffix integration)
  • MHUD (for multiple HUD support)

Version 1.4.9 - MHUD Double-Show Fix

Bugfix

  • Fixed "Failed to apply CustomUI HUD commands" crash when using MHUD - Removed duplicate show() call
  • MHUD internally calls build() and update() when adding a HUD
  • Calling show() after that caused conflicting UI commands and client crash
  • Now: When using MHUD, only setCustomHud() is called, no additional show()

Version 1.4.8 - HUD Crash Prevention

Bugfix

  • Fixed crash when multiple plugins use Custom HUD without MHUD - Toasts are now completely skipped if another plugin's HUD is active
  • Early detection: Toast queue is not even started if conflict is detected
  • Clear warning in server log recommending MHUD installation
  • No more retry loops that could cause crashes
  • Chat notifications still work (from AchievementService) when toast is skipped

Version 1.4.7 - MHUD Integration

New Feature

  • MHUD Integration - Full support for MHUD (Multiple HUD) plugin
  • When MHUD is installed, toast notifications use the MHUD system allowing multiple HUDs simultaneously
  • No more conflicts with other plugins that use Custom HUDs
  • Automatic detection and lazy initialization of MHUD at runtime
  • Falls back to standard HUD system if MHUD is not available
  • Added MHUD as optional dependency in manifest.json

Technical

  • New MHUDIntegration class handles MHUD communication via reflection
  • ToastManager now prefers MHUD when available, with graceful fallback
  • HUD identifier: KyuubiSoft_Achievements

Version 1.4.6 - HUD Conflict Prevention & Debug Logging

Bugfix

  • Fixed HUD conflict with other plugins - Toast notifications now check if another plugin's HUD is active
  • If another plugin has a Custom HUD active, our toast waits and retries after 2 seconds
  • Prevents server crashes when multiple plugins try to use Custom HUD simultaneously
  • Only our own HUDs (AchievementToastHud, EmptyHud) are replaced - other plugins' HUDs are respected

Debug

  • Added detailed logging for suffix color extraction - Helps debug <#ffffff> format parsing
  • Logs now show step-by-step extraction: input, positions, intermediate values

Version 1.4.5 - Separate Prefix/Suffix Styling

Change

  • Prefix styles → Username - Trailing styles from LuckPerms Prefix are applied to the username
  • Suffix styles → Message color - Trailing color from LuckPerms Suffix is applied to the chat message
  • Style inheritance - Unclosed styles (bold, italic) from Prefix carry over to the message
  • Example: Prefix <bold>[Mythic] <#be8fff> → Username purple + bold, Message also bold
  • Example: Suffix <#aaaaaa> → Message appears in gray

Version 1.4.4 - LuckPerms Load Order Fix

Bugfix

  • Fixed LuckPerms load order - Added OptionalDependencies in manifest.json
  • Plugin now always loads AFTER LuckPerms (if installed)
  • Works with --accept-early-plugins flag
  • Combined with lazy initialization from 1.4.3 for maximum compatibility

Version 1.4.3 - Lazy LuckPerms Initialization

Bugfix

  • Fixed LuckPerms loading order issue - LuckPerms integration now uses lazy initialization
  • Previously: LuckPerms found but not yet loaded - prefix integration disabled
  • Now: LuckPerms API is initialized on first use (when player sends first chat message)
  • Works regardless of plugin load order - no more --accept-early-plugins needed

Version 1.4.2 - Trailing Styles for Username

New Feature

  • Trailing Style Support - All active styles at the end of the LuckPerms prefix are applied to the username
  • Supported styles: color, bold, italic, underlined, strikethrough
  • Example: <bold><#2b2b2b>[<gradient:#ff85fb:#85fbff>Mythic</gradient><#2b2b2b>] <#be8fff> → Username appears in #be8fff (purple) and bold
  • New AdventureConverter.TrailingStyle class contains all trailing formatting info
  • New AdventureConverter.getTrailingStyle() method extracts color + styles from formatted text

Version 1.4.1 - Color Inheritance Fix

Bugfix

  • Fixed color inheritance for complex LuckPerms prefixes - Colors now properly inherit to child elements
  • Example: <bold><#2b2b2b>[<gradient>Mythic</gradient><#2b2b2b>] now correctly colors the closing bracket
  • Adventure Component styles (color, bold, italic) are now properly passed down to children

Version 1.4.0 - LuckPerms Integration

New: LuckPerms Chat Prefix Integration

  • Automatic Prefix Retrieval - LuckPerms prefixes are now automatically fetched from the API
  • Full Color Support - All LuckPerms color formats are supported:
    • <rainbow>Text</rainbow> - Rainbow effect
    • <gradient:#FF0000:#00FF00>Text</gradient> - Color gradients
    • &a, &b, &c, etc. - Legacy Minecraft color codes
    • <color:#FF5555>Text</color> - Hex colors
  • Combined Chat Format - LuckPerms prefix + Achievement title in one line:
    [LuckPerms-Prefix] [Achievement-Title] Username: message
  • Soft-Dependency - Works with or without LuckPerms installed
  • No Manual Config Required - Prefixes are pulled directly from LuckPerms groups

Technical Changes

  • Added Adventure MiniMessage library for color parsing (same as LuckPerms uses)
  • New AdventureConverter utility class for MiniMessage → Hytale Message conversion
  • LuckPermsIntegration now retrieves prefixes via multiple fallback methods:
    1. User cached metadata (contextual)
    2. User cached metadata (non-contextual)
    3. Primary group cached metadata
    4. Direct group node parsing (meta.prefix.* format)
  • Shadow JAR now includes relocated Adventure libraries (com.hytale.achievements.lib.kyori)

Version 1.3.0 - Display Options & Localization

New Features

Achievement Toast Banner

  • Display Mode Config - Choose how achievement unlocks are displayed:
    • chat - Classic chat message (default)
    • banner - Toast notification in the top-right corner
    • both - Both chat and banner
  • Toast Features:
    • Shows achievement name, title reward, item rewards
    • Achievement icon on the left
    • Auto-hides after configurable duration
    • New toast cancels previous one (no stacking)
    • Fixed width (300px), dynamic height

Default Achievements Toggle

  • loadDefaultAchievements config option
  • Set to false to use only custom achievements
  • Perfect for servers with fully custom achievement sets

Localization Improvements

  • Chat messages now localized ("Achievement Unlocked", "Title Unlocked")
  • All notification messages support DE/EN

Version 1.2.0 - Complete Overhaul

Custom Achievements System

  • Custom Achievements File - Server operators can define custom achievements in custom_achievements.json
  • Custom achievements can override default achievements (same ID)
  • Automatically merged with default achievements on load
  • Template file custom_achievements.json.example is auto-generated

New Field: additionalInfo

  • Displays additional information below the reward line in the gallery
  • Ideal for event hints, special conditions, etc.
  • Configurable with text and color
{
"id": "summer_event_special",
"additionalInfo": {
"text": "Only available during the summer event!",
"color": "#FF9900"
}
}

Session-Based Playtime Tracking

Before (Scheduler-based)

  • Playtime was incremented every minute via scheduler
  • On server crash: Loss of entire session since last save

Now (Session-based)

  • Session start time is saved on player connect
  • Playtime is calculated on player disconnect
  • 15-minute checkpoints: Automatic intermediate saves every 15 minutes
  • Live calculation: UI always shows current playtime in real-time
  • Maximum data loss: 15 minutes instead of entire session

New Features

  • Search Field - Search achievements by name, description, ID, and category
  • "Completed" Filter Tab - New filter shows all unlocked achievements
  • Smart Chain Display - For achievement chains, only the next incomplete achievement is shown (completed ones appear in the "Completed" tab)
  • Chain Progress Counter - Shows progress like [2/5] for chains
  • Progress with Units - Progress now shows units (e.g., "162 / 300 Minutes", "25 / 50 Messages")
  • Live Playtime - Playtime achievements always show current session time
  • AdditionalInfo Display - Shows extra info for custom achievements (highlighted in orange)
  • Hover Effects - All filter buttons and pagination buttons

Chain Detection

  • Now supports both naming patterns:
    • Numeric: spider_hunter_1 -> spider_hunter_2 -> spider_hunter_3
    • Requires-based: first_hour -> five_hours -> ten_hours
  • Chain counter now correctly increases (1/4, 2/4, 3/4) when completing achievements

UI Improvements

  • Entry height increased to 85px for better readability
  • Status column widened to 95px (no text truncation)
  • Chain display shows "Current:" instead of "Next:" label
  • Trigger descriptions now show actual progress (e.g., "0 / 50 Messages" instead of "0/4 completed")

Title Selection (/title)

Full Localization (DE/EN)

  • Title, current label, no title, clear button
  • Pagination: Prev, Next, Page
  • Statistics: "Titles: X/Y unlocked"
  • Origin: "From: {Achievement}"
  • Select button, active indicator

UI Improvements

  • Pagination buttons widened to 180px (no text truncation)
  • Proper spacing from top border

Bug Fixes

  • Fixed double-colon in reward display ("Reward:: Title" -> "Reward: Title")
  • Fixed chain counter going down instead of up when completing achievements
  • Fixed various German translation issues (umlauts, numbers)

Version 1.1.0 - Initial Release

Features

  • 487 built-in achievements across 6 categories
  • Achievement Gallery UI
  • Title Selection UI
  • Player commands (/achievements, /titles)
  • Admin commands (/achievementadmin)
  • Progress tracking for all trigger types
  • Item and command rewards
  • Multi-language support (EN, DE)
  • Statistics export

Categories

  • Combat (49 achievements)
  • Progression (102 achievements)
  • Exploration (32 achievements)
  • Social (20 achievements)
  • Husbandry (29 achievements)
  • Secret (37 achievements)

Upgrade Notes

Upgrading to 2.6.0

  • LevelingCore replaces the direct RPGLeveling dependency. If you use RPGLeveling, ensure LevelingCore is also installed.
  • 10 new trigger types are available — no migration needed, they are additive.
  • ShowcaseCompat is automatic if the Showcase mod is present.

Upgrading to 2.3.0

  • MySQL Storage is optional. File storage remains the default. To enable MySQL, configure the Core plugin's MySQL settings first.
  • Tracker HUD can be disabled via trackerHud.enabled: false in config.json.

Upgrading to 1.6.1

  1. Update RPGLeveling Plugin to v0.2.0-beta-5 or newer (required for event API)
  2. Delete old localization/ folder (will be regenerated with v3)
  3. Restart server
  4. Verify in logs: "Registered LevelUp listener with RPGLevelingAPI (dynamic proxy)"

Upgrading to 1.6.0

Automatic Migration: The plugin will automatically:

  1. Create the new folder structure (configs/, custom/)
  2. Generate default achievement files
  3. Create template files for custom achievements

Manual Steps:

  • Move existing custom achievements to custom/custom_achievements.json
  • Review new config options (loadMmoAchievements, loadRpgLevelingAchievements)

Upgrading to 1.5.0

No breaking changes. The plugin is fully backwards compatible.

Optional: Install MHUD for better HUD compatibility with other plugins.

Upgrading to 1.2.0

Recommendation: When updating from 1.1.x, we recommend deleting the existing achievements.json file and restarting the server. The plugin will automatically generate a new default file. Custom achievements should be moved to the custom_achievements.json file so they are not overwritten by future updates.

Fresh Install

  1. Place the JAR in your plugins folder
  2. Start the server
  3. Configure config.json as needed
  4. Add custom achievements to custom/custom_achievements.json