promotional bannermobile promotional banner

MMO Skill Tree & Abilities

(Multiple Languages) MMO Skill Tree adds an RPG-style progression system where every action you take helps you grow stronger.

File Details

MMOSkillTree-0.4.7.jar

  • R
  • Jan 25, 2026
  • 226.57 KB
  • 1.5K
  • Early Access

File Name

MMOSkillTree-0.4.7.jar

Supported Versions

  • Early Access

Changelog

v0.4.7

Bug Fixes

  • Fixed leaderboard crash on multi-world servers - Leaderboard no longer crashes when players are in different world instances (e.g., dungeons, temples)
    • Error was: IllegalStateException: Assert not in thread! when accessing player data across world threads
    • Now uses cached leaderboard data instead of accessing live data from other world threads
    • Online/offline indicator still works correctly (based on player connection status)
    • Viewer's own data is still live (same thread)

Technical

  • LeaderboardPage.java - Refactored gatherPlayerData() to avoid cross-thread Store access
    • Only calls playerRef.getUsername() on other players (thread-safe)
    • Uses LeaderboardDataStore cache for all player XP/level data
    • Gets live data only for the viewer (who is on the current thread)

v0.4.6

Bug Fixes

  • Fixed command permissions blocking all players - Commands like /mmoxp, /skilltree, and /xpdisplay were requiring permission nodes even when permission system was disabled
    • Added enableCommandPermissions config option (default: false)
    • When disabled, all players can use all commands without needing mmoskilltree.command.* permissions
    • Enable via config file or future admin command to require permission nodes for commands
    • Matches the existing behavior of skill permissions (enableSkillPermissions)

Technical

  • SkillConfig.java - Added enableCommandPermissions field with getter/setter and JSON serialization
  • PermissionUtil.java - Updated hasCommandPermission() to check isCommandPermissionsEnabled() before requiring permissions
    • Added wildcard permission support (mmoskilltree.command.*) for command permissions

v0.4.5

New Features

  • Keb's Katanas Mod Support - Added default XP values for katanas from the Keb's Katanas mod

    • Legendary: Keb_Katana_Prisma (55 XP)
    • Epic: Keb_Katana_Mithril (48 XP), Keb_Katana_Onyxium (52 XP)
    • Rare: Keb_Katana_Cobalt (23 XP), Keb_Katana_Adamantite (28 XP), Keb_Katana_Thorium (28 XP)
    • Uncommon: Keb_Katana_Copper (8 XP), Keb_Katana_Steel (8 XP)
  • Configurable Permission System - Opt-in permission nodes for skill XP gain and commands

    • Permission checking is disabled by default for backwards compatibility
    • Enable via /mmoconfig permissions --args=true
    • When enabled, players need mmoskilltree.skill.<skillname> or mmoskilltree.skill.* to gain XP
  • Skill Permissions - Control which players can gain XP in specific skills

    • mmoskilltree.skill.* - Wildcard for all skills (default: granted)
    • mmoskilltree.skill.mining - Individual skill permissions
    • All 16 skills have their own permission node
    • Silent deny - players without permission simply don't gain XP (no error message)
  • Command Permissions - Control access to plugin commands

    • mmoskilltree.command.xp - /mmoxp command (default: granted)
    • mmoskilltree.command.skilltree - /skilltree command (default: granted)
    • mmoskilltree.command.xpdisplay - /xpdisplay command (default: granted)
    • mmoskilltree.command.setxp - /setmmoxp command (default: op)
    • mmoskilltree.command.config - /mmoconfig command (default: op)
  • New Admin Command - /mmoconfig permissions --args=<true|false>

    • Toggle skill permission checking on/off
    • Displays current state and usage help

Upgrade Notes

  • Config version bumped to 8 - Existing configs will be backed up automatically
  • Your old config is saved as skill-config_backup.json in mods/mmoskilltree/
  • Restore any custom XP values from the backup file after upgrading

Technical

  • ConfigVersionUtil.java - Bumped CURRENT_CONFIG_VERSION to 8
  • LongswordDefaults.java - Added 8 Keb's Katanas with tiered XP values
  • manifest.json - Added Permissions array with all skill and command permission nodes
  • SkillConfig.java - Added enableSkillPermissions field with getter/setter
  • PermissionUtil.java - New utility class for permission checking
    • canGainSkillXp(player, skill) - Checks skill permission (respects config toggle)
    • hasCommandPermission(player, command) - Checks command permission
  • SkillService.java - Added permission check in processTrigger() before awarding XP
  • Command classes - All 5 commands now check mmoskilltree.command.<name> permission
    • GetXpCommand, SkillTreeCommand, XpDisplayCommand, SetXpCommand, MMOConfigCommand
  • LocalizationConfig.java - Added cmd.no_permission key to all 7 languages

v0.4.4

New Features

  • Offline Player Leaderboard - Leaderboard now displays both online and offline players
    • Player data is cached when XP is gained and on server shutdown
    • Online players show live data; offline players show cached data
    • Visual indicator distinguishes online (green dot) from offline (gray dot) players
    • Player count now shows "X online / Y total" format

Technical

  • LeaderboardDataStore.java - New singleton service for persistent leaderboard caching
    • Stores player skill data in mods/mmoskilltree/leaderboard-cache.json
    • Thread-safe with ConcurrentHashMap
    • Automatically saves on JVM shutdown via shutdown hook
  • SkillService.java - Added leaderboard cache update on XP gain
  • LeaderboardPage.java - Merged online player data with cached offline data
    • Added isOnline field to PlayerLeaderboardEntry
    • Added createEntryFromCache() method for offline player entries
    • Online/offline visual styling in leaderboard rows
  • LeaderboardRow.ui - Added #OnlineStatus indicator element
  • MMOSkillTreePlugin.java - Added leaderboard cache initialization and shutdown hook
  • LocalizationConfig.java - Added ui.leaderboard.player_count_online key for all 7 languages

v0.4.3

New Features

  • Turkish Localization - Added Turkish (Türkçe) as a supported language

    • Full translation of all UI text, notifications, skill names, and reward types
  • German Localization - Added German (Deutsch) as a supported language

    • Full translation of all UI text, notifications, skill names, and reward types
  • Expanded Language Selector - Settings page now supports up to 15 languages

    • Increased from 2 rows of 3 buttons to 3 rows of 5 buttons
    • Ready for community-contributed translations

Bug Fixes

  • Fixed Wan's Wonder Weapons Battleaxe - Corrected typo in item ID
    • WanMine_God_Slayer_BatlleaxeWanMine_God_Slayer_Battleaxe

Technical

  • LocalizationConfig.java - Added getTurkishDefaults() and getGermanDefaults() with full translations
  • LocalizationConfig.java - Added ensureTurkishDefaults() and ensureGermanDefaults() methods
  • SettingsPage.java - Increased maxLangButtons from 6 to 15
  • SettingsPage.ui - Added #LangBtn3 through #LangBtn14 buttons in 3 rows of 5
  • SettingsPage.ui - Increased #LanguageSetting height from 160 to 204
  • SettingsPage.ui - Increased #LanguageButtons height from 80 to 124

v0.4.2

Bug Fixes

  • Disabled Luck for Crafting - Removed luck bonus from crafting due to critical item duplication bug
    • Luck bonuses were incorrectly duplicating crafted items
    • Will be re-enabled in a future update once the underlying issue is resolved

Technical

  • CraftRecipeEventSystem.java - Removed LuckUtil.tryLuckBonus() call

v0.4.1

New Features

  • Mighty Staffs Mod Support - Added default XP values for staffs from the Mighty Staffs mod

    • Weapon_Staff_Bo_Wood (6 XP)
  • Wan's Wonder Weapons Mod Support - Added default XP values for weapons from the Wan's Wonder Weapons mod

    • Swords: WanMine_Lethal_Leftovers_Sword, WanMine_Gaia's_Wrath_Sword, WanMine_Quasar_Cosmic_Sword (65-70 XP)
    • Longswords: WanMine_Soulblight_Longsword, WanMine_Soulblight_Longsword_v1 (65 XP)
    • Daggers: WanMine_Chromatic_Cleaver_Dagger, WanMine_Daybreak_Dagger, WanMine_Heartroot_Dagger, WanMine_Ashthorn_Dagger, WanMine_Nightshade_Dagger, WanMine_Frostburn_Dagger, WanMine_Nightfall_Dagger (58-68 XP)
    • Battleaxe: WanMine_God_Slayer_Battleaxe (70 XP)
    • Maces: WanMine_Helioram_Mace, WanMine_Maelstrom_Mace, WanMine_Mjollnir_Mace (65-70 XP)

Technical

  • StaffDefaults.java - Added Weapon_Staff_Bo_Wood
  • SwordDefaults.java - Added Legendary tier with 3 WanMine swords
  • LongswordDefaults.java - Added 2 WanMine longswords to Legendary tier
  • DaggerDefaults.java - Added Legendary tier with 7 WanMine daggers
  • BattleaxeDefaults.java - Added Legendary tier with WanMine_God_Slayer_Battleaxe
  • MaceDefaults.java - Added Legendary tier with 3 WanMine maces

v0.4.0

New Features

  • Skill Tree Scrolling - Skill tree UI now scrolls when there are many tiers
  • XP Progress Bar - Skill tree header shows progress bar to next level with "current / needed" XP format
  • STAT_MANA Reward - New reward type for increasing maximum mana
  • Complete 10-Tier Reward Redesign - All 16 skills now have 10 tiers of rewards (Lv 5, 10, 15, 20, 30, 40, 50, 65, 75, 100)

Mana System Design

Players start with 0 mana - it must be earned through skill tree choices. Each skill class has a distinct mana identity:

  • Staves - THE mana class (360+ max mana potential). Bo staff masters channel mystical energy
  • Archery - High mana (290+) for wand and spellbook users
  • Crafting - Moderate mana (305) for enchanting and magical item creation
  • Defense/Harvesting - Low mana (65-180) for survivability or nature attunement
  • Physical Combat (Swords, Daggers, Axes, Blunt, Polearms) - Minimal mana (15-38). Warriors rely on steel, not sorcery
  • Gathering (Mining, Woodcutting, Excavation) - Minimal mana (23-38). Laborers focus on physical prowess
  • Acrobatics/Building - Zero mana. Pure physical disciplines focused on stamina

Tier Structure

Tier Level Choices Required
0-1 5-10 2 1
2-3 15-20 3 1
4-5 30-40 4 2
6-7 50-65 5 2
8 80 5 3
9 100 6 3

Technical

  • SkillTreePage.ui: #TiersList LayoutMode changed to TopScrolling
  • SkillTreePage.ui: Added #SkillProgress ProgressBar in header
  • SkillTreePage.java: Added progress calculation using getLevelProgress()
  • SkillTreePage.java: Fixed ProgressBar.Value to use double instead of String
  • SkillTreePage.java: MAX_CHOICES increased from 5 to 6 for tier 9
  • RewardType.java: Added STAT_MANA enum
  • StatModifierUtil.java: Added applyManaBonus/removeManaBonus methods
  • StatManaEffect.java: New effect handler
  • RewardEffectRegistry.java: Registered StatManaEffect
  • LocalizationConfig.java: Added reward.stat_mana to all 5 languages
  • SkillTreeDefaults.java: Complete rewrite with 10 tiers for all 16 skills

v0.3.5

Bug Fixes

  • Leaderboard Combat Skill Filters - Fixed combat category only showing 6 of 10 skills in the filter bar

    • Added SkillFilter6-9 buttons to support all combat skills
    • All 10 combat skills now visible: Swords, Daggers, Polearms, Staves, Axes, Blunt, Archery, Unarmed, Defense, Acrobatics
  • Archery XP Defaults - Removed magic staves from Archery skill

    • Staves (magic/ranged) were incorrectly included in Archery defaults
    • Staves now correctly belong only to the STAVES skill (melee staves)

Technical

  • LeaderboardPage.ui - Added #SkillFilter6 through #SkillFilter9 buttons
  • LeaderboardPage.java:217 - Changed skill filter loop from i < 6 to i < 10
  • ArcheryDefaults.java - Removed StaffDefaults.getDefaults() call

v0.3.4

New Features

  • Leaderboard Page - View player rankings accessible from ViewXpPage
    • Shows all players ranked by total level and XP
    • Sort by category: Total Level, Gathering, Combat, Production
    • Drill down by individual skill within each category
    • Your rank displayed at the bottom with highlighting
    • Scrollable player list for large servers

Balance Changes

  • Leveling Curve Rebalanced - Adjusted baseXpPerLevel and levelScaleMultiplier defaults
    • Level 120 now requires approximately 1 million XP
    • Default levelScaleMultiplier changed from 1.0 to 1.1
    • Creates more meaningful late-game progression
    • Existing servers can adjust via /mmoconfig basexp and /mmoconfig scale commands

Technical

  • Scrollable UI Pattern - LayoutMode: TopScrolling enables vertical scrolling in UI containers
  • New Files:
    • LeaderboardPage.java - Leaderboard page logic with player data gathering and sorting
    • LeaderboardPage.ui - Layout with scrolling player list and filter buttons
    • LeaderboardRow.ui - Template for individual player rank rows
  • ViewXpPage.java - Added Leaderboard tab navigation
  • ViewXpPage.ui - Added Leaderboard tab button
  • LocalizationConfig.java - Added leaderboard localization keys for all 5 languages

v0.3.3

New Features

  • Hungarian Localization - Added Hungarian (Magyar) as a supported language
    • Full translation of all UI text, notifications, skill names, and reward types
  • More Crossbow Tiers Mod Support - Added default XP values for crossbows from the More Crossbow Tiers mod

Bug Fixes

  • Config Reload Command - Fixed /mmoconfig reload overwriting user config edits
    • Manual file edits are now preserved when using reload command
    • Version check only runs on server startup, not manual reloads

Technical

  • Config Version System - Replaced hash-based version tracking with simple version numbers
    • ConfigVersionUtil.CURRENT_CONFIG_VERSION - Bump this constant when defaults change
    • Configs now store configVersion field instead of computed hash
    • More reliable: user edits don't trigger false "defaults changed" detection
  • SkillConfig.java / SkillTreeConfig.java - load(false) skips version check for manual reloads

v0.3.2

New Features

  • Portuguese Localization - Added Portuguese (Português) as a supported language
    • Full translation of all UI text, notifications, skill names, and reward types
    • Select Portuguese in Settings page

Bug Fixes

  • Settings Language Selector - Fixed backup language files appearing in the language selector
    • Files like messages-en_backup.json no longer show as selectable languages
    • Only valid language files (messages-XX.json) are displayed

Technical

  • LocalizationConfig.java - Added filter to exclude _backup files from language scanning
  • LocalizationConfig.java - Added getPortugueseDefaults() with full Portuguese translations

v0.3.1

New Features

  • Tier 7 Rewards - Added Level 65 milestone rewards for all 16 skills
    • Master-tier bonuses: higher luck, health, damage, defense values
    • Each skill gets 5 new reward choices at this tier

Balance Changes

  • Stamina Rewards Rebalanced - Base stamina is 10, so rewards were scaled down
    • Early tiers (5-15): +1 stamina
    • Mid tiers (30-50): +2 stamina
    • Master tier (65): +3 stamina
    • Maximum stamina from all skill trees is now ~15-20 (was 100+)

Bug Fixes

  • Config Backup System - Fixed bug creating nested _backup_backup_backup... files
    • Backup files are now skipped when creating backups
    • Added automatic cleanup of malformed backup files on startup
  • Config Auto-Update - Configs now regenerate from new defaults when mod updates
    • Old configs are backed up to *_backup.json before regeneration
    • Ensures players get new tiers and balance changes automatically

Technical

  • ConfigVersionUtil.java - Added cleanupMalformedBackups() method
  • SkillConfig.java - Regenerates from defaults when hash changes instead of merging
  • SkillTreeConfig.java - Same auto-regeneration behavior
  • SkillTreeDefaults.java - Added tier 7 for all skills, fixed stamina values
  • MMOSkillTreePlugin.java - Calls cleanup on startup for both config dirs

v0.3.0

New Features

  • Luck System (renamed from Double Drop) - Complete overhaul of bonus drop mechanics

    • Renamed RewardType.DOUBLE_DROPRewardType.LUCK throughout codebase
    • New configurable luckLootTable - maps block patterns to specific item drops
    • Block breaks (Mining, Excavation): Only gives luck bonus if loot table match exists
    • Item pickups (Harvesting): Defaults to same item as bonus
    • Default loot table includes all ore tiers (Copper → Onyxium) → raw ore items
    • Default loot table includes all gems (Diamond, Emerald, Ruby, etc.) → gem items
  • Creative Mode XP Disable - XP gains are now disabled by default in creative mode

    • New config option disableXpInCreative (default: true)
    • Toggle via /mmoconfig creative --args=<true|false>
    • Players in creative mode will not gain XP unless this setting is changed

UI/Text Improvements

  • Luck Reward Text - Now specifies which skill the luck bonus applies to
    • Before: "+5% Double Drop" (generic)
    • After: "+5% Mining Luck" (skill-specific)
    • Uses localization system with new reward.luck_suffix key
  • Defense renamed to Block - Clarifies that this stat is different from Hytale's built-in defense
    • All reward text now shows "Block" instead of "Defense"
    • Updated in all three languages (EN: "Block", ES: "Bloqueo", FR: "Blocage")

Breaking Changes

  • Config field doubleDropLootTable renamed to luckLootTable
  • Existing configs will need to rename this field manually

Technical

  • New Files:
    • LuckUtil.java - Luck bonus logic (renamed from DoubleDropUtil)
    • LuckDefaults.java - Default loot table mappings (renamed from DoubleDropDefaults)
  • Renamed Methods:
    • SkillTreeService.getDoubleDropChance()getLuckChance()
    • SkillConfig.getDoubleDropLootTable()getLuckLootTable()
    • SkillConfig.getDoubleDropItem()getLuckItem()
  • SkillConfig.java - Added disableXpInCreative field, renamed loot table fields
  • SkillService.java - Added creative mode check in processTrigger()
  • MMOConfigCommand.java - Added creative subcommand for toggling the setting
  • Messages.java - Added LUCK handling in getRewardDisplayText() to include skill name
  • LocalizationConfig.java - Added reward.luck_suffix, renamed from reward.double_drop_suffix
  • SkillTreeDefaults.java - All DOUBLE_DROP rewards renamed to LUCK

v0.2.9

Bugfixes

  • Fixed critical hit notification - Now shows multiplier (x1.5) instead of total damage amount
  • Fixed lifesteal notification - Removed duplicate + sign that was appearing in heal messages

Technical

  • DoubleDropUtil.java - Extracted double drop logic to shared utility class for DRY
  • PickupItemEventSystem - Refactored to use DoubleDropUtil.tryDoubleDrop() instead of inline implementation

v0.2.8

New Features

  • 4 New Melee Combat Skills - Weapon types split from Swords/Axes for more focused progression:
    • DAGGERS - Daggers, claws, kunai (high crit chance, fast attacks)
    • POLEARMS - Spears, halberds (reach weapons, defensive bonuses)
    • STAVES - Bo staffs, melee staves (disciplined, stamina-focused)
    • BLUNT - Clubs, maces (heavy hitters, high damage and health)

Bugfixes

  • Combat Effect Notifications - Added missing notifications for critical hits, defense blocks, and fall damage reduction (previously only lifesteal had notifications)

Combat Skill Changes

  • SWORDS now covers only longswords and one-handed swords (bladed slashing weapons)
  • AXES now covers only axes and battleaxes (chopping weapons)
  • Daggers, spears, and melee staves moved to their own dedicated skills
  • Clubs and maces moved to new BLUNT skill

Skill Tree Additions

  • 4 New Skill Trees with thematic reward progressions:
    • DAGGERS: High crit scaling (up to +15%), strong lifesteal
    • POLEARMS: Balanced offense/defense, high defense bonuses
    • STAVES: Stamina-focused, good defense and fall reduction
    • BLUNT: Highest raw damage (+14%), highest health (+28%)

Technical

  • Config Version Hashing - Config files now track a defaultsHash to detect when mod defaults change
    • Automatically creates backup (e.g., skill-config_backup.json) before loading if defaults changed
    • Protects user customizations when updating the mod
  • New config files: DaggersDefaults.java, PolearmsDefaults.java, StavesDefaults.java, BluntDefaults.java
  • New utility: ConfigVersionUtil.java for hash generation and backup management
  • Updated SkillType.java with 4 new enum values
  • Updated SkillTreeDefaults.java with 4 new skill tree methods
  • Total implemented skills: 16 (was 12)

v0.2.7

Bugfixes

  • Fixed Archery skill not gaining XP - Archery now correctly awards XP when dealing damage with bows, crossbows, wands, and other ranged weapons
    • Changed Archery trigger type from DEAL_DAMAGE_PROJECTILE to DEAL_DAMAGE_PHYSICAL
    • Removed unused DEAL_DAMAGE_PROJECTILE trigger type

v0.2.6

New Features

  • /setmmoxp Command - Admin command to set player XP directly
    • /setmmoxp <skill> <value> - Set XP for a specific skill
    • /setmmoxp all <value> - Set XP for all skills at once
    • Alias: /setxp
    • Configurable permission via setXpRequiredGameMode in config

Bugfixes

  • Fixed torches giving Woodcutting XP - Torches no longer incorrectly award Woodcutting experience when broken

Configuration

  • setXpRequiredGameMode - New config option in config.json
    • Controls who can use /setmmoxp command
    • Values: "OP" (default), "Adventure", "Creative", etc.
    • Example: Set to "Creative" to allow creative mode players to use the command

v0.2.5

Bugfixes

  • Fixed BONUS_XP reward display - Now correctly shows the target skill name
    • Before: "+5% Bonus XP" (generic)
    • After: "+5% Mining XP" or "+5% Excavation XP" (skill-specific)
    • Extracts skill from reward ID (e.g., excavation_xp_1 → Excavation)
    • Works correctly when skill trees offer XP bonuses for related skills

Technical

  • Messages.extractSkillFromRewardId() - Parses reward ID to determine target skill
  • BONUS_XP rewards now display localized skill name + "XP" suffix

v0.2.4

New Features

  • Localization System - Full i18n support for all UI text

    • Players can select their preferred language in Settings
    • Language preference saved per-player in SkillComponent
    • Auto-generated English, Spanish, and French language files
    • Users can add custom messages-{lang}.json files for additional languages
  • Language Selector - New section in Settings page

    • 6 language button slots in 2 rows of 3
    • Currently selected language highlighted in green
    • Disabled style for unavailable language slots
    • Instant language switching without restart
  • Auto-Generated Language Files - Located in mods/mmoskilltree/localization/

    • messages-en.json - English (auto-generated)
    • messages-es.json - Spanish (auto-generated)
    • messages-fr.json - French (auto-generated)
    • Files auto-update with new keys on server start
  • Localized Reward Text - Skill tree rewards fully localized

    • Reward type names (e.g., "Max Health" → "Santé Max" in French)
    • Formatted values with localized patterns (+5%, +10, +3 blocks)
    • Reward claimed notifications use localized text
  • Hot-Reload Support - /mmoconfig reloadlang command

    • Reload language files without server restart
    • New translations take effect immediately

Technical

  • New i18n/ package:

    • LocalizationConfig.java - Singleton config manager for language files
      • Loads/saves JSON message files using GSON
      • Scans for available messages-*.json files
      • Placeholder substitution with {0}, {1} format
      • Merges file contents with defaults (preserves user customizations while adding new keys)
      • Always falls back to English defaults (never shows raw keys)
    • Messages.java - Static helper class for message access
      • get(skills, key) / get(skills, key, args...) - Get translated message
      • getSkillName(skills, skillType) - Get localized skill name
      • getRewardTypeName(skills, rewardType) - Get localized reward type name
      • getRewardFormattedValue(skills, reward) - Get localized formatted value
      • getRewardDisplayText(skills, reward) - Get full localized reward text
  • SkillComponent.java - Added language field (default: "en")

    • Codec entry for persistence
    • getLanguage() / setLanguage() methods
  • UI Localization - All UI text now uses Messages helper

    • ViewXpPage - Panel titles, tabs, labels, buttons
    • SkillTreePage - Tier labels, status text, buttons
    • SettingsPage - All setting labels and descriptions
    • SkillRow/TierRow templates - Dynamic text via indexed selectors
  • SettingsPage.ui - Added element IDs for dynamic localization

    • #SettingsTitle, #XpNotificationsLabel, #XpNotificationsDesc
    • #CombatEffectsLabel, #CombatEffectsDesc
    • #XpThresholdLabel, #XpThresholdDesc
    • #LanguageLabel, #LanguageDesc
    • #LangBtn0 through #LangBtn5 with @DisabledButtonStyle
  • ViewXpPage.ui - Added #SkillsHeader ID for localization

  • MMOConfigCommand.java - Added reloadlang subcommand

Message Key Structure

{
  "language.name": "English",
  "ui.button.close": "CLOSE",
  "ui.button.back": "< BACK",
  "ui.viewxp.title": "Skill Overview",
  "ui.viewxp.level_prefix": "Lv. {0}",
  "ui.settings.language": "Language",
  "notify.xp_gain": "+{0} {1} XP",
  "notify.level_up": "LEVEL UP! {0} is now Level {1}!",
  "skill.mining": "Mining",
  "reward.stat_health": "Max Health",
  "reward.bonus_xp": "Bonus XP",
  "reward.format.percent": "+{0}%",
  "reward.format.flat": "+{0}"
}

Adding Custom Languages

  1. Create mods/mmoskilltree/localization/messages-{code}.json
  2. Copy structure from messages-en.json
  3. Translate values (keys must remain the same)
  4. Run /mmoconfig reloadlang or restart server
  5. Language appears in Settings selector

v0.2.3

New Features

  • Dynamic Skill Tree Choices - Configurable number of choices per tier (up to 5)

    • New choicesRequired field on SkillTreeNode - how many rewards to pick per tier
    • Global defaultChoicesRequired in config (default: 1)
    • UI shows "Pick X of Y" when tier has multiple selections
    • Tier status shows completion progress (e.g., "1/2" when partially complete)
  • Multi-Select Rewards - Players can now pick multiple rewards per tier

    • Higher tiers offer more choices with multi-select (Pick 2 of 4)
    • Prevents claiming same reward twice
    • Tier only marked complete when all required choices made
  • Dynamic UI Rendering - Choice buttons rendered dynamically

    • New ChoiceButton.ui template appended per choice
    • Buttons use FlexWeight for automatic sizing
    • Supports 2-5 choices per tier
    • Removed hardcoded button limits
  • Expanded Reward Variety - Updated skill tree defaults

    • Tiers 0-1: 2 choices, pick 1
    • Tiers 2-3: 3 choices, pick 1
    • Tiers 4-5: 4 choices, pick 2
    • Tier 6 (Level 50): 5 choices, pick 2 - Elite rewards for all 12 skills
    • More diverse reward options per tier
  • Tier 6 Elite Rewards (Level 50) - All 12 skills now have elite tier rewards

    • Gathering: +20% XP, +15% Double Drops, +20 Health, +15 Stamina, synergy bonuses
    • Combat: +10% Damage, +12-15% Crit, +8-10% Lifesteal, +20 Health
    • Defense: +12% Defense, +30 Health, -40% Fall Damage, +5% Lifesteal
    • Acrobatics: -50% Fall Damage, +20 Health, +8% Defense, +20 Stamina
    • Crafting/Building: +20% XP, +20 Health/Stamina, synergy bonuses

Technical

  • SkillTreeNode.java - Added choicesRequired field with new constructor
  • SkillComponent.java - Multi-claim storage using comma-separated reward IDs per tier
    • getClaimedRewardIds(skill, tier) returns list of claimed IDs
    • getClaimedCount(skill, tier) returns count for tier
    • hasClaimedSpecificReward(skill, tier, rewardId) checks specific claim
  • SkillTreeConfig.java - Added defaultChoicesRequired global setting and JSON codec
  • SkillTreePage.java - Dynamic button rendering with FlexWeight layout
  • SkillTreeService.java - Updated claiming logic for multi-select validation
  • TierRow.ui - Removed hardcoded buttons, added #SelectionInfo label
  • ChoiceButton.ui - New template for dynamic choice buttons

Config Schema Update

{
  "defaultChoicesRequired": 1,
  "skillTrees": {
    "MINING": [{
      "tier": 4,
      "levelRequired": 30,
      "choicesRequired": 2,
      "choices": [...]
    }]
  }
}

Upgrade Notes

Run /mmoconfig reloaddefaults to load the new multi-choice tier defaults.


v0.2.2

Bugfixes

  • Fixed double drops not working - Double drops now actually add bonus items to inventory
    • Moved double drop logic from BreakBlockEventSystem to PickupItemEventSystem
    • When items are picked up, checks DOUBLE_DROP reward chance for the relevant skill
    • Bonus items are added directly to inventory (hotbar prioritized) via getCombinedHotbarFirst().addItemStack()
    • Notification now shows item count: "Double Drop! (+3)"

v0.2.1

Bugfixes

  • Fixed duplicate component error - Resolved IllegalArgumentException: Entity contains component type crash when multiple XP events fired in the same tick (e.g., breaking multiple blocks rapidly or combat with multiple hits)
    • Added pending component cache to prevent duplicate addComponent calls before CommandBuffer consumption

v0.2.0

New Features

  • Reward Effect Framework - Pluggable system for reward effects with handler registry

    • RewardEffectHandler interface for all effect types
    • RewardEffectRegistry singleton maps RewardType to handlers
    • RewardEffectContext provides store, ref, playerRef, skills to handlers
  • 9 Implemented Reward Types - Beyond XP bonuses:

    • STAT_HEALTH - Increases max health via Hytale's EntityStatMap
    • STAT_STAMINA - Increases max stamina via EntityStatMap
    • STAT_DAMAGE - Multiplies outgoing damage
    • STAT_DEFENSE - Reduces incoming damage (capped at 90%)
    • CRITICAL_CHANCE - Chance for 1.5x damage on attacks
    • LIFESTEAL - Heals attacker for percentage of damage dealt
    • DOUBLE_DROP - Chance for bonus resources when gathering
    • FALL_DAMAGE_REDUCTION - Reduces fall damage (capped at 90%)
    • BONUS_XP - Multiplies XP gain (existing)
  • Combat Effect Notifications - New settings toggle for lifesteal/crit feedback

    • Toggle via Settings > Combat Effect Notifications
    • Lifesteal shows green "+X.X" heal notification
    • Saved per-player in SkillComponent
  • Hytale EntityStatMap Integration - Direct stat modification

    • StatModifierUtil helper class for health/stamina modifiers
    • Uses DefaultEntityStatTypes.getHealth() and getStamina()
    • StaticModifier with Modifier.ModifierTarget.MAX for permanent bonuses
    • healEntity() for lifesteal healing
  • Expanded Skill Tree Defaults - 10 tiers with varied reward types

    • Gathering skills: BONUS_XP, DOUBLE_DROP, STAT_STAMINA, STAT_DEFENSE, STAT_HEALTH
    • Combat skills: BONUS_XP, STAT_DAMAGE, CRITICAL_CHANCE, LIFESTEAL, STAT_HEALTH
    • Defense: STAT_DEFENSE, STAT_HEALTH, FALL_DAMAGE_REDUCTION
    • Acrobatics: FALL_DAMAGE_REDUCTION (10%→40%), STAT_STAMINA, STAT_DEFENSE
  • Debug Starting Level - Config option for testing high-level gameplay

    • Set debugStartingLevel in config.json to initialize new players at that level
    • Set to 0 (default) for production

Technical

  • New reward/ package:

    • RewardEffectHandler.java - Interface for effect handlers
    • RewardEffectRegistry.java - Singleton registry
    • RewardEffectContext.java - Context holder
    • StatModifierUtil.java - Hytale stat integration
    • effects/PassiveEffect.java - Base for passive effects
    • effects/StatHealthEffect.java - STAT_HEALTH handler
    • effects/StatStaminaEffect.java - STAT_STAMINA handler
    • effects/NoOpEffect.java - Placeholder for deferred types
  • CombatDamageEventSystem enhancements:

    • Uses DamageModule.get().getFilterDamageGroup() to modify damage before health loss
    • applyAttackerEffects() - Damage bonus + critical chance
    • applyDefenseReduction() - Defense damage reduction
    • applyFallDamageReduction() - Fall damage reduction
    • applyLifesteal() - Heal on damage with optional notification
  • BreakBlockEventSystem enhancements:

    • checkDoubleDrops() - Random check for double drops
    • Notification when double drop triggers
  • SkillComponent additions:

    • showCombatEffects boolean for combat notification preference
    • Codec entry for persistence
  • SkillTreeService additions:

    • getTotalLifesteal(), getTotalHealthBonus(), getTotalStaminaBonus()
    • Effect application on claim/reset

Upgrade Notes

Run /mmoconfig reloaddefaults after upgrading to load the new 10-tier skill trees with varied reward types.


v0.1.1

New Features

  • Settings Page - New in-game settings UI accessible via the Settings tab on ViewXpPage

    • Toggle XP notifications on/off with a single click
    • Choose XP gain threshold from preset values (1, 5, 10, 25, 50, 100)
    • Visual feedback for current settings state
    • Back button to return to skill overview
  • Expanded Skill Tree Defaults - All 12 implemented skills now have 6 tiers of rewards

    • Previously some skills had only 2-4 tiers
    • Consistent progression across Mining, Woodcutting, Excavation, Harvesting, Swords, Axes, Archery, Unarmed, Defense, Acrobatics, Crafting, and Building
    • Updated skill pairings for meaningful choices (Harvesting now pairs with Excavation/Crafting instead of unimplemented Cooking/Alchemy)
  • Dynamic Skill Tree UI - Skill tree page now uses template-based dynamic rendering

    • Automatically scales to display any number of tiers
    • Improved visual styling with larger fonts and clearer status indicators

Upgrade Notes

Important: After upgrading to v0.1.1, run /mmoconfig reloaddefaults to load the new 6-tier defaults for all skills. This will reset your skill tree configuration to the new defaults.


v0.1.0

New Features

  • Skill Tree System - Unlock XP bonus rewards at level milestones

    • 6 tiers per skill, unlocked at levels 5, 10, 15, 20, 30, 40
    • Each tier offers a choice between XP bonus for the main skill OR a related skill
    • Example: Mining tier lets you choose +5% Mining XP OR +5% Excavation XP
    • Rewards persist across sessions via ECS component
  • Meaningful Reward Choices - Each skill pairs with thematically related skills: (TEMPORARY UNTIL MORE COMPLEX IMPLEMENTATION)

    • Mining ↔ Excavation, Smithing
    • Woodcutting ↔ Building, Crafting
    • Excavation ↔ Mining, Harvesting
    • Harvesting ↔ Cooking, Alchemy
    • Swords ↔ Defense, Axes
    • Axes ↔ Swords, Woodcutting
    • Archery ↔ Crafting, Acrobatics
    • Unarmed ↔ Acrobatics, Defense
    • Defense ↔ Acrobatics, Swords
    • Acrobatics ↔ Defense, Unarmed
    • Crafting ↔ Mining, Smithing
    • Building ↔ Woodcutting, Crafting
  • Skill Tree UI (SkillTreePage)

    • Navigate between skills with arrow buttons
    • Shows tier status: LOCKED (gray), AVAILABLE (white), or CLAIMED (green)
    • Color-coded buttons show selection state
    • Reset button to clear all selections for current skill
    • Opens via /skilltree command or Tree button on ViewXpPage
  • ViewXpPage Enhancement - Added "Tree" button next to each skill to jump directly to its skill tree

  • Bonus XP System - Claimed BONUS_XP rewards apply multiplicatively to XP gains

    • Stack bonuses from multiple tiers for compounding effect
  • Milestone Notifications - Players notified when new tiers unlock

    • Automatic detection when leveling up
    • Prompts players to use /skilltree to claim

New Commands

  • /skilltree [skill] - Open the skill tree UI
    • Aliases: /st, /rewards

Configuration

  • New config file: config/mmoskilltree/skilltree.json
    • Configurable level thresholds per tier
    • Per-skill reward choices with custom values
    • Currently supports BONUS_XP reward type (other types defined but not yet implemented)

Technical

  • New data classes:

    • RewardType.java - Enum of reward types (BONUS_XP implemented, others placeholder)
    • SkillReward.java - Configurable reward with id, type, value, display name
    • SkillTreeNode.java - Milestone with level threshold and reward choices
  • New config classes:

    • SkillTreeConfig.java - Singleton config for skill trees with JSON persistence
    • SkillTreeDefaults.java - Default rewards with meaningful skill pairings
  • New service:

    • SkillTreeService.java - Milestone checking, reward claiming, XP multiplier calculations
  • New UI:

    • SkillTreePage.java - Interactive page with claim/reset/navigate actions
    • SkillTreePage.ui - Layout with 6 tiers, 2 choices each, navigation and reset buttons
  • Extended SkillComponent:

    • claimedRewards - Map of skill → claimed reward IDs per tier
    • pendingRewards - Map of skill → pending milestone notifications
    • resetRewards(skill) / resetAllRewards() - Clear claimed rewards
    • String serialization for codec compatibility
  • Extended MMOSkillTreeAPI:

    • updateSkillComponent(PlayerRef, SkillComponent) - Explicit update hook
  • Modified SkillService:

    • Integrated milestone checks on XP gain
    • Applies bonus XP multiplier from claimed rewards

v0.0.11

New Features

  • Combat XP System - Full implementation of combat skills via CombatDamageEventSystem

    • SWORDS - XP for melee damage with longswords, daggers, spears, claws, staves
    • AXES - XP for melee damage with axes, clubs, maces, battleaxes
    • ARCHERY - XP for ranged damage with bows, crossbows, wands, spellbooks, guns, bombs
    • UNARMED - XP for dealing damage without weapons
    • DEFENSE - XP for taking damage from any source
    • ACROBATICS - XP for surviving fall damage
  • Material-Tiered XP Values - Rare weapons give more XP than common ones

    • Common (Crude, Copper, Tribal): 5-6 XP
    • Uncommon (Iron, Bronze, Scrap): 7-9 XP
    • Rare (Cobalt, Adamantite, Thorium): 20-32 XP
    • Epic (Mithril, Onyxium): 45-55 XP
    • Legendary (Flame, Void, Spectral): 55-70 XP
  • New Skills (in SkillType enum, not yet implemented)

    • FISHING, TAMING, REPAIR, ALCHEMY, ENCHANTING, COOKING, SMITHING

Technical

  • Separate defaults files for maintainability:
    • SwordsDefaults.java - Longswords, daggers, spears, staves (melee)
    • AxesDefaults.java - Axes, clubs, maces (blunt weapons)
    • ArcheryDefaults.java - Bows, crossbows, wands, spellbooks, guns, bombs
  • SkillDefaults.java now delegates to per-skill defaults files
  • New TriggerTypes: DEAL_DAMAGE_PHYSICAL, DEAL_DAMAGE_PROJECTILE (replaced DEAL_DAMAGE)
  • Weapon detection uses inventory.getActiveHotbarItem().getItemId() for pattern matching
  • Patterns match actual item IDs (e.g., Weapon_Longsword_Mithril, Weapon_Axe_Iron)

v0.0.10

New Features

  • Crafting XP - New CraftRecipeEventSystem awards XP when crafting items
  • Building XP - New PlaceBlockEventSystem awards XP when placing blocks
  • CRAFTING skill - New general crafting skill type (15 XP per craft by default)
  • BUILDING skill defaults - Placing blocks now awards XP at 50% of the breaking value (e.g., placing stone = 2 XP vs mining stone = 3 XP)

Technical

  • New event/CraftRecipeEventSystem.java - Handles CraftRecipeEvent for crafting XP
  • New event/PlaceBlockEventSystem.java - Handles PlaceBlockEvent for building XP
  • SkillDefaults.getBuildingDefaults() dynamically computes values from mining/woodcutting/excavation at 50%

v0.0.9

New Features

  • Quick threshold commands - Set XP display threshold with /xpd 10, /xpd 20, /xpd 0, etc.

Bugfixes

  • Progress bar display - Fixed progress bar rendering in skill UI

v0.0.8

Bugfixes

  • /mmoconfig reloaddefaults - Now properly saves config after reloading defaults (previously only applied in-memory)

Changes

  • Enhanced notifications - XP gain and level up messages now use the notification system instead of chat messages for better visibility

v0.0.7

New Features

  • ViewXpPage - New custom UI page for viewing skill stats
    • Shows total level, total XP, and number of active skills
    • Displays individual skill progress for all configured skills
    • Only shows skills with XP configuration data (unconfigured skills hidden)
    • Open via player.getPageManager().setPage(ref, store, new ViewXpPage(playerRef))

Technical

  • New pages/ package for custom UI pages
  • UI files in src/main/resources/Common/UI/Custom/Pages/
  • Updated CLAUDE.md with UI page documentation and naming conventions

v0.0.6

New Features

  • /mmoconfig reloaddefaults - New admin command to reset all XP values to built-in defaults from SkillDefaults.java

v0.0.5

New Features

  • Comprehensive default XP values for all Hytale blocks based on official item database
    • Mining: 10+ rock types, 9 ore tiers (Copper→Onyxium), 7 gem types
    • Woodcutting: 30+ tree types across 5 tiers (Common→Special)
    • Excavation: All soil types including grass, sand, mud, snow, ash
    • Harvesting: Grass, ferns, bushes, flowers, crops, fruits, coral, vines
  • PickupItemEventSystem - Awards XP when picking up items

Changes

  • Professional package structure - Reorganized codebase:
    • api/ - Public API for other plugins
    • command/ - Command handlers
    • config/ - Configuration and defaults
    • data/ - Data models (SkillComponent, SkillType)
    • event/ - Event system handlers
    • service/ - Business logic
    • util/ - Utility classes
  • SkillDefaults.java - Centralized default XP values (separated from config)
  • Updated import paths: com.ziggfreed.mmoskilltree.api.MMOSkillTreeAPI, com.ziggfreed.mmoskilltree.data.SkillType

v0.0.4

Bugfixes

  • Fixed issue with "harvesting" blocks not rewarding xp

v0.0.3

New Skills

New skills added for developers to access via API

New Features

  • Public API (MMOSkillTreeAPI) for other plugins to access player skill data
    • getSkillComponent(PlayerRef) - Get full skill data
    • getXp(PlayerRef, SkillType) / getLevel(PlayerRef, SkillType) - Get specific skill data
    • getTotalXp(PlayerRef) / getTotalLevel(PlayerRef) - Get combined stats
    • getAllXp(PlayerRef) / getAllLevels(PlayerRef) - Get all skills as maps
    • addXp(PlayerRef, SkillType, long) - Add XP (silent)
    • removeXp(PlayerRef, SkillType, long) / setXp(PlayerRef, SkillType, long) - Modify XP
    • getLevelProgress(PlayerRef, SkillType) - Get progress to next level (0.0-1.0)
    • calculateLevelFromXp(long) / getXpRequiredForLevel(int) - Utility methods
    • hasSkillData(PlayerRef) / getSkillTypes() - Helper methods
  • New skill category: Misc (for Building and future utility skills)
  • New trigger types: PLACE_BLOCK, FALL_DAMAGE, TAME_ENTITY, CATCH_FISH

Changes

  • /mmoxp now only shows skills with XP > 0 (cleaner display)
  • Plugin instance now accessed via MMOSkillTreePlugin.getInstance() (singleton pattern)
  • Commands now extend AbstractPlayerCommand with PlayerRef parameter
  • Internal services use API for cache access (DRY principle)
  • Consistent cache keying via PlayerRef.hashCode()

v0.0.2

Changes

  • Changed default XP gain threshold for message display from 0 to 10
  • Fixed permission issue with /xpdisplay command

v0.0.1 - Initial Release

Skills

  • Mining - Gain XP from breaking stone and ores
  • Woodcutting - Gain XP from chopping trees and logs
  • Excavation - Gain XP from digging soil and dirt
  • Harvesting - Gain XP from harvesting plants and crops

Features

  • Quadratic XP scaling formula for balanced progression
  • Per-player XP display preferences (toggle on/off, set minimum threshold)
  • Persistent player data via ECS component codec
  • JSON config file with hot-reload support
  • Pattern-based block matching for flexible XP configuration

Commands

  • /mmoxp - View your skill levels and XP progress
  • /xpdisplay - Configure personal XP notification settings
    • on / off - Toggle XP gain messages
    • threshold --value=<n> - Only show gains >= n XP
    • status - View current settings
  • /mmoconfig (OP only) - Server configuration
    • list --args=<skill|all> - View XP configurations
    • <skill> --args=<pattern|xp> - Set XP for block pattern
    • basexp --args=<value> - Set base XP per level
    • scale --args=<multiplier> - Set leveling speed
    • remove --args=<skill|pattern> - Remove block pattern
    • reload - Reload config from file

Technical

  • Dynamic skill system - adding new skills only requires enum entry + defaults
  • TriggerType system for future event handlers (combat, crafting, etc.)
  • Thread-safe skill caching for command access
  • Auto-generates config on first launch