File Details
MMOSkillTree-0.5.7.jar
- R
- Jan 27, 2026
- 389.23 KB
- 5.5K
- Early Access
File Name
MMOSkillTree-0.5.7.jar
Supported Versions
- Early Access
Changelog
v0.5.7
XP Boost System
Global and personal XP boosts - Players can activate boosts that multiply XP gains
- Global boosts affect all players on the server
- Personal boosts affect only the activator
- Boosts can target all skills, specific skills, or skill categories
- Multiple boosts stack additively (1.5x + 2x = 2.5x total)
Boost Tokens - One-time boost awards via commands
- Admins award tokens with
/mmoboost give|<player>|<target>|<multiplier>|<duration>|[scope] - Tokens can be personal (default) or global scope - global tokens activate server-wide when used!
- Tokens are stored until the player chooses to activate them
- Works for offline players - tokens delivered on next login
- No permission required to activate awarded tokens
- Players activate tokens from the Boost UI when ready
- Admins award tokens with
Permission-based boost activation - Server owners control who can activate repeatable boosts
- Permission format:
mmoskilltree.xpboosts.<target>.<scope>.<multiplier>.<duration>.<cooldown> - Target:
all, skill name, or category name - Scope:
self(personal) orall(global) - Multiplier uses underscore for decimal:
1_5= 1.5x - Duration and cooldown in minutes
- Example:
mmoskilltree.xpboosts.mining.self.2_0.30.60- 2x Mining, self, 30min, 1hr cooldown
- Permission format:
Boost UI Page - New "Boosts" tab in ViewXpPage with three sections:
- Active Boosts - Currently running boosts (global + personal) with time remaining
- Boost Tokens - One-time tokens awarded via commands, ready to activate
- Reusable Boosts - Repeatable boosts available from permissions (with cooldowns)
- Refresh button to update display
Admin
/mmoboostcommand - OPs can manage boosts directly (uses|separator for args)/mmoboost give|<player|*>|<target>|<mult>|<mins>|[scope]- Award boost token/mmoboost global|<target>|<multiplier>|<minutes>- Activate global boost immediately/mmoboost list- Show active global boosts/mmoboost clear|[player]- Clear boosts and tokens/mmoboost status|[player]- Show boost status including tokens
Persistence - Boosts and tokens persist across server restarts
- Global boosts saved to
mods/mmoskilltree/active-boosts.json - Pending tokens for offline players saved in the same file
- Personal boosts and tokens stored in player's SkillComponent
- Cooldowns track last activation timestamp
- Global boosts saved to
Other Changes
- Defense skill renamed to Block - Display name updated to "Block" across all code and UI
- Updated in all 8 languages (EN: Block, ES: Bloqueo, FR: Blocage, PT: Bloqueio, HU: Blokkolás, TR: Blok, DE: Blocken, IT: Blocco)
- Command UX improvement -
/mmoboostnow uses pipe-separated arguments for easier typing- Example:
/mmoboost give|Steve|mining|2|30instead of--arg1=Steve --arg2=mining...
- Example:
Technical
- New data classes: BoostScope, BoostTarget, ActiveBoost, BoostPermission, BoostToken
- XpBoostService - Singleton service for boost management with token support
- SkillComponent additions: personalBoosts, boostCooldowns, boostTokens maps with codec serialization
- SkillService integration - Boost multiplier applied additively with reward bonuses, token delivery on first action
- BoostPage.java - Interactive UI page for boost management (3 sections)
- BoostCommand.java - Admin command with pipe-separated args and token scope support
- Localization - Full boost UI translations for all 8 languages (EN, ES, FR, PT, HU, TR, DE, IT)
v0.5.6
Override-Based Config System (XpMapsConfig & LuckConfig)
Configs now store ONLY overrides - Customizations are preserved across mod updates
- File stores only values that differ from defaults
- Missing keys automatically use built-in defaults
- New defaults propagate without losing your changes
- XpMapsConfig: Use value
-1to explicitly disable a default XP pattern - LuckConfig: Use value
"__DISABLED__"to explicitly disable a default luck pattern
Reference file generation -
mods/mmoskilltree/_reference/defaults-xp-maps.json- All default XP values per skilldefaults-luck-loot.json- All default luck loot table entries- Auto-generated read-only files for server owner reference
- Updated on every config load
New commands:
/mmoconfig diff --args=<skill|all|luck>- Show only overrides (XP and luck)/mmoconfig trim- Remove redundant overrides from both XP and luck configs/mmoconfig disable --args=<skill|pattern>- Explicitly disable a default pattern
Improved
/mmoconfig list- Now shows override status for each pattern- Cyan text indicates overridden values (shows default in brackets)
- Green text indicates default values
- Header shows override count per skill
Schema versioning -
schemaVersionreplacesconfigVersionfor override-based configs- Schema version only bumps for structural changes (new fields)
- Default value changes no longer require version bump
- Old configs with
configVersionare read for backwards compatibility
Admin UI
New
/mmoadmincommand - Opens interactive admin configuration UI- TextField inputs for direct value entry (base XP, scale multiplier)
- Toggle settings: creative mode XP, skill permissions, leveling formula
- Real-time milestone preview updates as you type
- Formula description shows actual calculation being used
- Config override statistics and trim functionality
- Quick actions: reload configs, reload language, trim overrides, reset to defaults
- Aliases:
/mmoconfig-ui,/mmosettings
XP Overrides Page - Visual editor for skill XP values
- Access via "Edit XP Values" button in Admin Config page
- Category tabs: Gathering, Combat, Crafting, Misc
- Dynamic skill selector buttons per category
- Pattern list showing: name, default value, current value, status
- Status indicators: Default (green), Override (orange), Disabled (red)
- Add/Update patterns with text fields for pattern name and XP value
- Disable button to set patterns to -1 (disabled)
- Reset button per row to revert overrides to defaults
- Click pattern name to copy to text field for easy editing
Permissions toggle - Single toggle controls both skill and command permissions
- UI label simplified to "Enable Permissions"
- When enabled: skill XP gains and commands require permissions
- When disabled: all players can gain XP and use commands
Admin permission paradigm - Flexible OP/permission-based access
- OP players always have admin access regardless of permission settings
- When permissions enabled: non-OP players can get admin via
mmoskilltree.admin - Applied to both
/mmoconfigcommand and/mmoadminUI
Localization
- Config command messages fully localized - All 8 supported languages updated
- Override system messages (diff, trim, disable, reset, reload)
- Admin page labels and buttons (20 keys per language)
- Support for: English, Spanish, French, Portuguese, Hungarian, Turkish, German, Italian
- Falls back to English for players without skill data
Technical
XpMapsConfig.java - Complete rewrite for override-based system
userOverridesmap tracks only customizationsload()now merges file overrides on top of defaultssave()writes only overrides (smaller config files)DISABLED_VALUE = -1sentinel for explicit pattern removal- New methods:
getOverrides(),getAllOverrides(),isDefault(),getDefaultValue(),resetToDefault(),disablePattern(),trimRedundantOverrides()
LuckConfig.java - Complete rewrite for override-based system
- Same override-based architecture as XpMapsConfig
DISABLED_VALUE = "__DISABLED__"sentinel for explicit luck pattern removal- Reference file:
_reference/defaults-luck-loot.json
ConfigVersionUtil.java - Added
extractSchemaVersion()method- Checks for
schemaVersionfirst, falls back toconfigVersion
- Checks for
MMOConfigCommand.java - Added handlers for diff, trim, disable commands
- Updated list command to show override indicators
- Updated remove command to show revert-to-default behavior
- All config messages now use localization via Messages helper
- Added
getPlayerSkills()andmsg()helper methods
LocalizationConfig.java - Added 40+ new localization keys per language
cmd.config.*keys for all override system messagesui.admin.*keys for admin config page (20 keys per language)
New files:
CommandExecutor.java- Shared utility for executing commands as console or playerAdminConfigPage.java- Interactive admin configuration UI pageAdminConfigUICommand.java- Command to open the admin UIAdminConfigPage.ui- UI layout for admin configuration pageXpOverridesPage.java- XP pattern editor page with category/skill navigationXpOverridesPage.ui- UI layout for XP overrides pageXpPatternRow.ui- Template for pattern list rowsSkillButton.ui- Template for dynamic skill selector buttons
PermissionUtil.java - Added admin permission support
ADMIN_PERMISSION = "mmoskilltree.admin"constanthasAdminPermission(Player)- OP always has access; checks permission when enabledisOp(Player)- Helper for OP status checks
CommandRewardService.java - Refactored to use CommandExecutor utility
- Removed duplicate command execution methods (DRY)
- Uses shared
CommandExecutor.executeAsConsole()andCommandExecutor.executeAsPlayer()
MMOConfigCommand.java - Updated permission paradigm
- Removed hardcoded
setPermissionGroups("OP") - Uses
PermissionUtil.hasAdminPermission()for flexible access control
- Removed hardcoded
Bug Fixes
- Fixed combat XP exploit - Players can no longer gain XP from hitting projectiles (arrows, etc.)
CombatDamageEventSystemnow detectsProjectilecomponent in entity archetype- Projectiles are always blocked from giving XP (hardcoded, not config-dependent)
v0.5.5
UI Improvements
- Item Rewards Fully Disabled When Config Disabled - Complete protection when item rewards are turned off
- Rewards tab hidden in ViewXpPage
- ItemRewardsPage shows "Item Rewards Disabled" if somehow accessed directly
- All navigation (tabs, arrows) hidden on disabled page
- Event handlers check
isEnabled()before opening rewards page
Upgrade Safety
Stat Rewards Reapplied on Config Update - Existing players get correct stat values after mod updates
- When SkillTreeConfig version changes, all stat modifiers (Health, Stamina, Mana) are reapplied
- Online players: stats recalculated immediately on reload/reloaddefaults
- Offline players: stats recalculated on first XP action after login
- Prevents stale stat values from old config versions
Orphaned Reward Cleanup - Removes stat modifiers from rewards that no longer exist
- When skill tree config changes remove tiers or reward IDs, old stat modifiers are cleaned up
cleanupOrphanedRewards()now callsremoveOrphanedStatModifiers()for each removed reward- Tries removing all stat types (Health, Stamina, Mana) since original reward type is unknown
Balance Changes
Block (STAT_DEFENSE) Nerfed by 50% - Block reduction values were too powerful
- All STAT_DEFENSE skill tree rewards reduced by half
- Before: 4% → 20% range across tiers
- After: 2% → 10% range across tiers
- Maximum stacked Block from all skills now ~45% (was ~90%)
Item Reward Tiers Expanded - Added intermediate tiers for smoother progression with hybrid OSRS formula
- New Level 65 tier for all 16 skills (Expert-level materials)
- New Level 80 tier for all 16 skills (Advanced materials)
- Rewards include mid-to-late game materials like Mithril, Adamantite, Onyxium
- Legendary materials (Prisma, Voidheart, Elemental Essences) at Level 80+
- Total: 6 milestone tiers per skill (10, 25, 50, 65, 80, 100)
Technical
- SkillTreeService.java - Added
reapplyStatRewards()andremoveOrphanedStatModifiers()methods - SkillService.java - Added
setSkillTreeConfigChanged()flag for tracking skill tree config updates - SkillTreeConfig.java - Triggers stat reapplication when config version changes on load
- MMOConfigCommand.java -
validateAllOnlinePlayers()now also reapplies stat rewards - ViewXpPage.java - Added
CommandRewardsConfig.isEnabled()checks for tab visibility and event handling - ItemRewardsPage.java - Added disabled state check in
build()method - CommandRewardsDefaults.java - Added Level 65 and 80 reward entries for all skills
- SkillTreeDefaults.java - Reduced all STAT_DEFENSE values by 50%
- SkillTreeConfig.java - CONFIG_VERSION bumped to 3
- CommandRewardsConfig.java - CONFIG_VERSION bumped to 4
v0.5.4
Improvements
- Milestone XP display - When changing
formula,basexp, orscale, shows XP required for milestone levels- Format:
XP required: Lv10=14.3k | Lv25=95.6k | Lv50=446.2k | Lv80=2.3M | Lv100=10.0M - Helps server owners understand impact of config changes instantly
- Format:
Technical
- MMOConfigCommand.java - Added
showMilestoneXp()helper method with formatted output
v0.5.3
⚠️ BREAKING CHANGE: Leveling formula completely changed. XP requirements are higher at all levels, so existing players will have lower levels with the same XP. Use
/mmoconfig formula --args=legacyto restore the old formula.
Hybrid OSRS Leveling Formula
Complete formula overhaul - Combines OSRS exponential curve with quadratic floor
- Early/mid levels ~10% harder than previous quadratic formula
- Endgame scales exponentially (OSRS-style)
- Level 100 = ~10M XP (true endgame grind)
New XP requirements (with default settings):
- Level 10: ~14,270 XP
- Level 25: ~95,573 XP
- Level 50: ~446,222 XP
- Level 80: ~2,274,045 XP
- Level 100: ~10,000,000 XP
Config parameters:
baseXpPerLevel(default: 300) - Quadratic floor componentlevelScaleMultiplier(default: 200) - OSRS exponential factor- OSRS component uses
2^(level/7)- each level requires ~10% more XP than the last - Quadratic floor ensures early/mid levels aren't too easy
Improvements
/mmoconfig formula- Switch between hybrid (OSRS) and legacy (quadratic) leveling formulashybrid: OSRS exponential + quadratic floor (default, ~10M XP at level 100)legacy: Simple quadratic (~1.5M XP at level 100 with base=150, scale=2)
/mmoconfig reload- Now reloads ALL config files (was missing XpMaps, Luck, CommandRewards)/mmoconfig reloaddefaults- Now resets ALL configs to built-in defaults
Bug Fixes
- Item Rewards UI - Fixed crash when viewing Total Level rewards with more than 15 items per tier
- Now supports up to 30 items per tier (6 rows)
Technical
- SkillConfig.java - CONFIG_VERSION bumped to 8, defaults changed to hybrid values (base=300, scale=200)
- SkillComponent.java -
getXpForLevel()andcalculateLevel()use hybrid OSRS formula - ItemRewardsPage.java - Supports up to 30 items per tier (was 15)
- RewardTierRow.ui - Added ItemsRow4-6 for larger reward tiers
- CommandRewardsConfig.java - Added
reloadDefaults()method - MMOConfigCommand.java - Updated reload handlers to include all configs
v0.5.2
Bug Fixes
Harvest Exploit Prevention - Players can no longer gain XP by placing and harvesting items
- Previously, placing a fruit/crop and then harvesting it would award XP via PickupItemEvent
- Now tracks placed item IDs in addition to block positions
- When you pick up an item you recently placed, XP is skipped
- Separate expiration timer for items:
placedItemExpireMinutes(default: 5 minutes) - Other players CAN still get XP from items you placed (fair multiplayer)
Life Essence Crafting Exploit Prevention - Currency conversion recipes no longer give Crafting XP
Ingredient_Life_Essence_100_Recipe_→ 0 XPIngredient_Life_Essence_Concentrated_Recipe_→ 0 XP
No +0 XP Notifications - Actions that give 0 XP no longer show notifications
Configuration
placedItemExpireMinutes- New config option inskill-config.json- Minutes until placed items expire for harvest tracking (default: 5)
- Shorter than block expiration since items are typically harvested quickly
- Separate from
placedBlockExpireMinutes(which defaults to 0/never for blocks)
Technical
- SkillConfig.java - CONFIG_VERSION bumped to 5
- Added
placedItemExpireMinutesfield (default: 5) - Added getter/setter methods
- Added
- PlacedBlockTracker.java - Extended to track placed item IDs
- New
TrackedItemclass with atomic count and timestamp trackPlacedItem(playerHash, itemId)- Track when player places an itemconsumePlacedItem(playerHash, itemId)- Check and decrement on pickup (returns true if should skip XP)- Cleanup in
cleanupExpired()now uses separate expiration for blocks and items getTotalTrackedItems()- Stats method for debugging
- New
- PlaceBlockEventSystem.java - Now calls
trackPlacedItem()in addition to position tracking - PickupItemEventSystem.java - Checks
consumePlacedItem()before awarding XP - CraftingDefaults.java - Added 0 XP entries for Life Essence conversion recipes
- CraftRecipeEventSystem.java - Removed debug log statement
- SkillService.java - Skip XP processing when bestXp <= 0 (no notifications for 0 XP)
- MMOConfigCommand.java -
/mmoconfig reloadnow reloads ALL configs (was missing XpMaps, Luck, CommandRewards) - MMOConfigCommand.java -
/mmoconfig reloaddefaultsnow resets ALL configs to defaults - CommandRewardsConfig.java - Added
reloadDefaults()method
v0.5.1
New Features
Target Player XP Command - OPs can now set other players' XP directly
/setmmoxp <skill> <value> --target=<player>- Set XP for another player- Requires
mmoskilltree.command.setxp.otherspermission (default: OP) - Target must be online and in the same world
- Works with all skills or "all" for bulk changes
- Example:
/setmmoxp mining 1000 --target=PlayerName
Custom Reward Display Names - Configure display names for item rewards
- Add
displayNamefield to reward entries incommand-rewards.json - Value must be a localization key (e.g.,
"reward.mining.starter_kit") - Add the key to your
localization/messages-*.jsonfiles - Falls back to "Level X" if key not found or not configured
- Add
Localized SetXP Command Messages - All command messages now support localization
- Error messages (permission denied, player not found, invalid XP, unknown skill)
- Success messages (skill set, all skills set, with/without target)
- Localized in all 8 supported languages
Technical
SetXpCommand.java - Added
--targetoptional argument for targeting other players- Uses
world.getPlayers()to iterate players in the same world (deprecated but functional) findPlayerRefByUsername()method finds target player's entity ref- Uses
PermissionUtil.hasCommandPermission(player, "setxp.others")for permission check - Works with existing
MMOSkillTreeAPI.setXp()for data modification - All messages now localized via
Messages.get()helper
- Uses
manifest.json - Added new permission node
mmoskilltree.command.setxp.others- Set other players' XP with --target (default: OP)
LocalizationConfig.java - Added setxp command message keys for all 8 languages
cmd.setxp.no_permission_others,cmd.setxp.player_not_found,cmd.setxp.no_skill_datacmd.setxp.xp_negative,cmd.setxp.unknown_skill,cmd.setxp.available_skillscmd.setxp.success_all,cmd.setxp.success_all_target,cmd.setxp.success_skill,cmd.setxp.success_skill_targetcmd.setxp.rewards_revoked- Notification when rewards are revoked
SkillTreeService.java - Added reward validation methods
validateAndRevokeRewards()- Revokes rewards for a skill when level drops below tier requirementsvalidateAllRewards()- Validates all skills (used when setting all XP)- Uses RewardEffectRegistry to properly remove stat modifiers
SkillComponent.java - Added helper methods for reward management
clearClaimedRewardsForTier()- Clears all rewards for a specific tiergetAllClaimedRewards()- Returns map of tier -> list of reward IDs for a skill
SetXpCommand.java - Integrated reward validation after XP changes
- Calls
SkillTreeService.validateAndRevokeRewards()for single skill changes - Calls
SkillTreeService.validateAllRewards()for "all" skill changes - Shows revoked count to admin if any rewards were revoked
- Calls
CommandRewardEntry.java - Added
displayNamefield for custom reward namesCommandRewardsConfig.java - Parses and saves displayName from JSON config
Messages.java - Added
getCommandRewardDisplayName()helper for resolving display namesItemRewardsPage.java - Uses custom displayName if configured
CommandRewardService.java - Fixed ConsoleSender integration for console commands
Admin Commands
- Reset Item Rewards Command -
/mmoconfig resetrewards --args=<player>- Resets all claimed item rewards for an online player
- Player can re-claim rewards at their current level milestones
- Example:
/mmoconfig resetrewards --args=PlayerName
Balance Changes
Leveling Curve Rebalanced - Adjusted default leveling parameters for longer progression
baseXpPerLevelchanged from 100 to 150levelScaleMultiplierchanged from 1.1 to 1.35- Creates a steeper curve where high levels require significantly more XP
- Level 50 now requires ~127k XP (was ~69k), Level 100 requires ~1M XP (was ~297k)
- Existing servers can adjust via
/mmoconfig basexpand/mmoconfig scale
Item Rewards Scaling Improved - Default item rewards scaled up to match harder leveling curve
- All skill rewards increased 3-5x at higher tiers
- Life Essence added to all skills at every tier
- Level 100 rewards now include ~100 Life Essence, ~80 rare bars, ~10-15 Voidheart
- Total Level rewards scaled up significantly (e.g., Total 1000 now gives 1000 Life Essence)
- Elemental essences (Fire, Ice, Lightning) quantities increased proportionally
Reward Validation
- Automatic Reward Revocation - Rewards are validated and revoked when player no longer qualifies
- Triggers when XP is reduced via
/setmmoxp - Triggers when leveling config changes:
/mmoconfig basexp,/mmoconfig scale,/mmoconfig reload,/mmoconfig reloaddefaults - Offline players are validated on their first skill action after logging in
- Revokes all rewards from tiers where player level is now below requirement
- Removes stat modifiers (health, stamina, mana) via RewardEffectRegistry
- Displays count of revoked rewards to admin
- Triggers when XP is reduced via
Config Refactoring
Config File Split - Separated large SkillConfig into focused configs for easier management
skill-config.json- General settings only (leveling formula, permissions, placed blocks, entity blacklist)xp-maps.json(NEW) - XP values per skill (block patterns, weapon tiers, etc.)luck-loot.json(NEW) - Luck bonus loot tables (block pattern -> item ID)- Each config has its own version number for independent updates
XpMapsConfig.java - New singleton config for XP values per skill
LuckConfig.java - New singleton config for luck loot tables
SkillConfig.java - Slimmed down, delegates XP/luck methods to new configs (marked deprecated)
MMOSkillTreePlugin.java - Initializes all new configs on startup
v0.5.0
New Features
Item Rewards at Skill Milestones - Receive item rewards when reaching specific skill levels
- New config file:
mods/mmoskilltree/command-rewards.json - Supports individual skill milestones (e.g., Mining level 10, 25, 50, 100)
- Supports total level milestones (50, 100, 200, 350, 500, 750, 1000)
- Comprehensive defaults included - All 16 skills have pre-configured item rewards
- Items scale with progression:
- Level 10 (Starter): 2-3 basic items (copper tools, common ingredients)
- Level 25 (Progressing): 3-4 items (iron/cobalt gear, uncommon materials)
- Level 50 (Skilled): 5-6 items (rare materials, gems, better gear)
- Level 100 (Master): 6-10 items including legendary weapons (Flame, Void, Spectral)
- Example: Mining 100 rewards include Flame Pickaxe, Mithril bars, Voidstones
- Manual claiming required - Rewards are NOT auto-claimed; use the Rewards UI
- Commands can also be executed (see Command Rewards below)
- New config file:
Item Rewards UI Page - New page to view and claim your item rewards
- Access via "Rewards" tab on the Skill Overview page
- Shows all tiers with status: LOCKED (gray), READY (orange), CLAIMED (green)
- View reward contents before unlocking
- CLAIM button to receive items into your inventory
- Items wrap to new lines after 5 per row (supports up to 15 items per tier)
- Toggle between Skill Rewards and Total Level Rewards tabs
- Navigate between skills with arrow buttons
- Rewards tab highlights with orange color and
*when unclaimed rewards available
Item Reward Notifications - Get notified when new rewards become available
- On level-up: "Mining Lv.10 item rewards available! Open /xp > Rewards"
- On total level milestone: "Total Lv.100 item rewards available! Open /xp > Rewards"
- Localized in all 8 supported languages
Command Rewards - Server owners can also configure commands to run at milestones
- Placeholders:
{player},{level},{skill},{total_level} - RunAs modes:
CONSOLE(full permissions) orPLAYER(player's permissions) - One-time rewards - commands only execute once per milestone
- Example: Broadcast message at total level 100
- Placeholders:
Configuration
command-rewards.json- New config file for item and command rewards{ "configVersion": 3, "enabled": true, "rewards": { "MINING": [ {"level": 10, "displayName": "reward.mining.starter", "giveItems": ["Item_Pickaxe_Copper:1", "Ingredient_Bar_Copper:5"], "runAs": "CONSOLE"}, {"level": 100, "displayName": "reward.mining.master", "giveItems": ["Weapon_Pickaxe_Flame:1", "Rock_Gem_Voidstone:3"], "runAs": "CONSOLE"} ], "TOTAL": [ {"level": 100, "giveItems": ["Ingredient_Bar_Mithril:10", "Rock_Gem_Diamond:5"], "commands": ["say {player} reached total level 100!"], "runAs": "CONSOLE"} ] } }Per-Config Versioning - Each config file now has its own version number
- Previously: All configs shared a single
CURRENT_CONFIG_VERSION = 10 - Now:
SkillConfig.CONFIG_VERSION = 3,SkillTreeConfig.CONFIG_VERSION = 2,CommandRewardsConfig.CONFIG_VERSION = 3 - Only the changed config gets backed up when updating, not all configs
- Previously: All configs shared a single
Technical
- CommandRewardEntry.java - Data class for level/commands/giveItems/runAs
ItemRewardinner class for item ID and quantityItemReward.parse()static method to parse "ItemId:Quantity" format
- CommandRewardsConfig.java - Singleton config loader following SkillConfig pattern
- CommandRewardsDefaults.java - Comprehensive item reward defaults for all 16 skills
- All item IDs verified against Hytale's item database
- Rewards use actual game items (weapons, tools, ingredients, gems)
- CommandRewardService.java - Checks milestones, gives items, executes commands
checkAndExecuteRewards(playerRef, skills, skillType, newLevel)- For skill level-upscheckTotalLevelRewards(playerRef, skills)- For total level milestonesgiveItemToPlayer()- Adds items directly to player inventory- Placeholder processing:
{player},{level},{skill},{total_level}
- ItemRewardsPage.java - New UI page for viewing and claiming item rewards
populateSkillRewards()/populateTotalRewards()- Render reward tierspopulateItems()- Distribute items across rows (5 per row, up to 3 rows)handleClaimSkillReward()/handleClaimTotalReward()- Manual claim handlers
- ItemRewardsPage.ui - UI layout with skill/total tabs, tier list, navigation
- RewardTierRow.ui - Template for tier rows with claim button and 3 item rows
- RewardItem.ui - Template for individual item display (icon + quantity)
- SkillComponent.java - Added
claimedCommandRewardsfield for tracking claimed rewards- New codec entry for persistence
- New methods:
hasClaimedCommandReward(),claimCommandReward(),getClaimedCommandRewardIds(),resetCommandRewards() - New method:
getSummedTotalLevel()- Sum of individual skill levels (more intuitive than formula-based total)
- ViewXpPage.java - Added "Rewards" tab navigation to ItemRewardsPage
- ViewXpPage.ui - Added
#TabRewardsbutton - ConfigVersionUtil.java - Removed shared
CURRENT_CONFIG_VERSIONconstant- Updated
checkAndBackupIfNeeded(configPath, storedVersion, expectedVersion)to take expected version parameter
- Updated
- SkillService.java - Integrated CommandRewardService after level-up detection
- MMOSkillTreePlugin.java - Loads CommandRewardsConfig in setup()
- LocalizationConfig.java - Added ItemRewardsPage localization keys in all 8 languages
ui.rewards.title,ui.rewards.total_title,ui.rewards.level,ui.rewards.claimed,ui.rewards.available,ui.rewards.locked,ui.rewards.claim, etc.
v0.4.9
New Features
- Deployable XP Exploit Fix - Totems and turrets no longer give combat XP
- Prevents XP farming by repeatedly hitting player-deployed entities
- Lays groundwork for future entity blacklist customization
- New command:
/mmoconfig blacklist- view current blacklist (expansion planned) - Config:
combatXpEntityBlacklistarray inskill-config.json
UX Improvements
- Fractional XP Accumulator - Small XP bonuses (like +5%) now properly accumulate instead of being lost to rounding
- Previously: 10 XP with 5% bonus →
10 * 1.05 = 10.5→ truncated to 10 (bonus lost!) - Now: Fractional remainder (0.5) is saved and added to next XP gain
- Example: Gain 1: 10.5 → award 10, store 0.5 | Gain 2: 10.5 + 0.5 = 11.0 → award 11
- Players see the bonus manifest every few actions (deterministic, no RNG)
- Mathematically accurate over time - no XP is ever lost
- Previously: 10 XP with 5% bonus →
Technical
- SkillComponent.java - Added
fractionalXpMap(ConcurrentHashMap<SkillType, Double>)- New codec entry
{SKILL}FracXpfor persistence - New methods:
getFractionalXp(skill),setFractionalXp(skill, amount)
- New codec entry
- SkillService.java - Updated
addXp()to use fractional accumulator pattern- Calculates exact XP with bonus multiplier
- Adds accumulated fractional remainder from previous gains
- Awards integer portion, saves decimal remainder for next time
- SkillConfig.java - Added
combatXpEntityBlacklistfield with pattern matchingisEntityBlacklisted(entityType)- check if entity matches any blacklist patternaddEntityBlacklist(pattern)/removeEntityBlacklist(pattern)- manage entries
- CombatDamageEventSystem.java - Added entity blacklist check before awarding combat XP
getEntityType()- extracts entity archetype name from chunk- Blacklisted entities still take damage/trigger effects, just no XP awarded
- MMOConfigCommand.java - Added
/mmoconfig blacklistsubcommand - ConfigVersionUtil.java - Bumped to version 10
v0.4.8
New Features
- Placed Block XP Exploit Prevention - Players can no longer gain XP by breaking blocks they placed
- Tracks block positions when players place blocks
- Breaking a self-placed block awards no XP and removes tracking
- Other players CAN still get XP from blocks you placed (fair multiplayer)
- Applies to Mining, Woodcutting, Excavation block breaks (not item pickups)
- Configurable via
trackPlacedBlocks(default: true) - Optional expiration via
placedBlockExpireMinutes(0 = never expire)
Balance Changes
Building XP Simplified - Changed from dynamic 50% of gathering values to flat 4 XP per block
- All placed blocks now give 4 XP regardless of block type
- Previously calculated as 50% of the mining/woodcutting/excavation value
- Simpler and more predictable progression
Mushroom XP Reduced - Reduced mushroom harvesting XP from higher values to 1 XP
Plant_Crop_Mushroom_andPlant_Mushroom_now give 1 XP- Prevents easy XP farming from abundant mushrooms
Localization
- Italian Language Support - Full translation of all UI, notifications, skills, and rewards
- New language file:
messages-it.json - 8 languages now supported: English, Spanish, French, Portuguese, Hungarian, Turkish, German, Italian
- New language file:
Configuration
trackPlacedBlocks- Enable/disable placed block tracking (default: true)- When enabled, players cannot gain XP from breaking blocks they placed
- Set to false to allow the old behavior
placedBlockExpireMinutes- Minutes until placed blocks "become natural" (default: 0)- Set to 0 for blocks to never expire (only removed when broken)
- Set to a positive value (e.g., 30) to allow XP after that many minutes
Technical
- PlacedBlockTracker.java - New singleton service for tracking player-placed blocks
- Uses
ConcurrentHashMapwith player hash -> Set of tracked blocks BlockPositionrecord stores x, y, z coordinatesTrackedBlockrecord stores position and timestamp for expiration- Methods:
trackPlacement(),wasPlacedByPlayer(),removeTracking(),cleanupExpired()
- Uses
- PlaceBlockEventSystem.java - Now calls
PlacedBlockTracker.trackPlacement()on block place - BreakBlockEventSystem.java - Checks
PlacedBlockTracker.wasPlacedByPlayer()before awarding XP - PickupItemEventSystem.java - Same check for interactive pickups (harvesting)
- SkillConfig.java - Added
trackPlacedBlocksandplacedBlockExpireMinutesfields
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)
- Error was:
Technical
- LeaderboardPage.java - Refactored
gatherPlayerData()to avoid cross-thread Store access- Only calls
playerRef.getUsername()on other players (thread-safe) - Uses
LeaderboardDataStorecache for all player XP/level data - Gets live data only for the viewer (who is on the current thread)
- Only calls
v0.4.6
Bug Fixes
- Fixed command permissions blocking all players - Commands like
/mmoxp,/skilltree, and/xpdisplaywere requiring permission nodes even when permission system was disabled- Added
enableCommandPermissionsconfig 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)
- Added
Technical
- SkillConfig.java - Added
enableCommandPermissionsfield with getter/setter and JSON serialization - PermissionUtil.java - Updated
hasCommandPermission()to checkisCommandPermissionsEnabled()before requiring permissions- Added wildcard permission support (
mmoskilltree.command.*) for command permissions
- Added wildcard permission support (
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>ormmoskilltree.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.jsoninmods/mmoskilltree/ - Restore any custom XP values from the backup file after upgrading
Technical
- ConfigVersionUtil.java - Bumped
CURRENT_CONFIG_VERSIONto 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
enableSkillPermissionsfield 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_permissionkey 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
- Stores player skill data in
- SkillService.java - Added leaderboard cache update on XP gain
- LeaderboardPage.java - Merged online player data with cached offline data
- Added
isOnlinefield toPlayerLeaderboardEntry - Added
createEntryFromCache()method for offline player entries - Online/offline visual styling in leaderboard rows
- Added
- LeaderboardRow.ui - Added
#OnlineStatusindicator element - MMOSkillTreePlugin.java - Added leaderboard cache initialization and shutdown hook
- LocalizationConfig.java - Added
ui.leaderboard.player_count_onlinekey 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_Batlleaxe→WanMine_God_Slayer_Battleaxe
Technical
- LocalizationConfig.java - Added
getTurkishDefaults()andgetGermanDefaults()with full translations - LocalizationConfig.java - Added
ensureTurkishDefaults()andensureGermanDefaults()methods - SettingsPage.java - Increased
maxLangButtonsfrom 6 to 15 - SettingsPage.ui - Added
#LangBtn3through#LangBtn14buttons in 3 rows of 5 - SettingsPage.ui - Increased
#LanguageSettingheight from 160 to 204 - SettingsPage.ui - Increased
#LanguageButtonsheight 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
- Block/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:
#TiersListLayoutMode changed to TopScrolling - SkillTreePage.ui: Added
#SkillProgressProgressBar 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, Block, 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
#SkillFilter6through#SkillFilter9buttons - LeaderboardPage.java:217 - Changed skill filter loop from
i < 6toi < 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
baseXpPerLevelandlevelScaleMultiplierdefaults- Level 120 now requires approximately 1 million XP
- Default
levelScaleMultiplierchanged from 1.0 to 1.1 - Creates more meaningful late-game progression
- Existing servers can adjust via
/mmoconfig basexpand/mmoconfig scalecommands
Technical
- Scrollable UI Pattern -
LayoutMode: TopScrollingenables vertical scrolling in UI containers - New Files:
LeaderboardPage.java- Leaderboard page logic with player data gathering and sortingLeaderboardPage.ui- Layout with scrolling player list and filter buttonsLeaderboardRow.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 reloadoverwriting 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
configVersionfield 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.jsonno longer show as selectable languages - Only valid language files (
messages-XX.json) are displayed
- Files like
Technical
- LocalizationConfig.java - Added filter to exclude
_backupfiles 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.jsonbefore regeneration - Ensures players get new tiers and balance changes automatically
- Old configs are backed up to
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_DROP→RewardType.LUCKthroughout 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
- Renamed
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
- New config option
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_suffixkey
- 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
doubleDropLootTablerenamed toluckLootTable - 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
disableXpInCreativefield, renamed loot table fields - SkillService.java - Added creative mode check in
processTrigger() - MMOConfigCommand.java - Added
creativesubcommand for toggling the setting - Messages.java - Added LUCK handling in
getRewardDisplayText()to include skill name - LocalizationConfig.java - Added
reward.luck_suffix, renamed fromreward.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
defaultsHashto 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
- Automatically creates backup (e.g.,
- New config files:
DaggersDefaults.java,PolearmsDefaults.java,StavesDefaults.java,BluntDefaults.java - New utility:
ConfigVersionUtil.javafor hash generation and backup management - Updated
SkillType.javawith 4 new enum values - Updated
SkillTreeDefaults.javawith 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_PROJECTILEtoDEAL_DAMAGE_PHYSICAL - Removed unused
DEAL_DAMAGE_PROJECTILEtrigger type
- Changed Archery trigger type from
v0.2.6
New Features
/setmmoxpCommand - 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
setXpRequiredGameModein config
Bugfixes
- Fixed torches giving Woodcutting XP - Torches no longer incorrectly award Woodcutting experience when broken
Configuration
setXpRequiredGameMode- New config option inconfig.json- Controls who can use
/setmmoxpcommand - Values:
"OP"(default),"Adventure","Creative", etc. - Example: Set to
"Creative"to allow creative mode players to use the command
- Controls who can use
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}.jsonfiles 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 reloadlangcommand- 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-*.jsonfiles - 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 accessget(skills, key)/get(skills, key, args...)- Get translated messagegetSkillName(skills, skillType)- Get localized skill namegetRewardTypeName(skills, rewardType)- Get localized reward type namegetRewardFormattedValue(skills, reward)- Get localized formatted valuegetRewardDisplayText(skills, reward)- Get full localized reward text
SkillComponent.java - Added
languagefield (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#LangBtn0through#LangBtn5with@DisabledButtonStyle
ViewXpPage.ui - Added
#SkillsHeaderID for localizationMMOConfigCommand.java - Added
reloadlangsubcommand
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
- Create
mods/mmoskilltree/localization/messages-{code}.json - Copy structure from
messages-en.json - Translate values (keys must remain the same)
- Run
/mmoconfig reloadlangor restart server - Language appears in Settings selector
v0.2.3
New Features
Dynamic Skill Tree Choices - Configurable number of choices per tier (up to 5)
- New
choicesRequiredfield onSkillTreeNode- how many rewards to pick per tier - Global
defaultChoicesRequiredin 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)
- New
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.uitemplate appended per choice - Buttons use FlexWeight for automatic sizing
- Supports 2-5 choices per tier
- Removed hardcoded button limits
- New
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
choicesRequiredfield with new constructor - SkillComponent.java - Multi-claim storage using comma-separated reward IDs per tier
getClaimedRewardIds(skill, tier)returns list of claimed IDsgetClaimedCount(skill, tier)returns count for tierhasClaimedSpecificReward(skill, tier, rewardId)checks specific claim
- SkillTreeConfig.java - Added
defaultChoicesRequiredglobal 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
#SelectionInfolabel - 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
BreakBlockEventSystemtoPickupItemEventSystem - 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)"
- Moved double drop logic from
v0.2.1
Bugfixes
- Fixed duplicate component error - Resolved
IllegalArgumentException: Entity contains component typecrash 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
addComponentcalls before CommandBuffer consumption
- Added pending component cache to prevent duplicate
v0.2.0
New Features
Reward Effect Framework - Pluggable system for reward effects with handler registry
RewardEffectHandlerinterface for all effect typesRewardEffectRegistrysingleton maps RewardType to handlersRewardEffectContextprovides 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
StatModifierUtilhelper class for health/stamina modifiers- Uses
DefaultEntityStatTypes.getHealth()andgetStamina() StaticModifierwithModifier.ModifierTarget.MAXfor permanent bonuseshealEntity()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
debugStartingLevelin config.json to initialize new players at that level - Set to 0 (default) for production
- Set
Technical
New
reward/package:RewardEffectHandler.java- Interface for effect handlersRewardEffectRegistry.java- Singleton registryRewardEffectContext.java- Context holderStatModifierUtil.java- Hytale stat integrationeffects/PassiveEffect.java- Base for passive effectseffects/StatHealthEffect.java- STAT_HEALTH handlereffects/StatStaminaEffect.java- STAT_STAMINA handlereffects/NoOpEffect.java- Placeholder for deferred types
CombatDamageEventSystem enhancements:
- Uses
DamageModule.get().getFilterDamageGroup()to modify damage before health loss applyAttackerEffects()- Damage bonus + critical chanceapplyDefenseReduction()- Defense damage reductionapplyFallDamageReduction()- Fall damage reductionapplyLifesteal()- Heal on damage with optional notification
- Uses
BreakBlockEventSystem enhancements:
checkDoubleDrops()- Random check for double drops- Notification when double drop triggers
SkillComponent additions:
showCombatEffectsboolean 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
/skilltreecommand 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
/skilltreeto claim
New Commands
/skilltree [skill]- Open the skill tree UI- Aliases:
/st,/rewards
- Aliases:
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 nameSkillTreeNode.java- Milestone with level threshold and reward choices
New config classes:
SkillTreeConfig.java- Singleton config for skill trees with JSON persistenceSkillTreeDefaults.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 actionsSkillTreePage.ui- Layout with 6 tiers, 2 choices each, navigation and reset buttons
Extended SkillComponent:
claimedRewards- Map of skill → claimed reward IDs per tierpendingRewards- Map of skill → pending milestone notificationsresetRewards(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(replacedDEAL_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
CraftRecipeEventSystemawards XP when crafting items - Building XP - New
PlaceBlockEventSystemawards 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- HandlesCraftRecipeEventfor crafting XP - New
event/PlaceBlockEventSystem.java- HandlesPlaceBlockEventfor 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 fromSkillDefaults.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 pluginscommand/- Command handlersconfig/- Configuration and defaultsdata/- Data models (SkillComponent, SkillType)event/- Event system handlersservice/- Business logicutil/- 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 datagetSkillComponent(PlayerRef)- Get full skill datagetXp(PlayerRef, SkillType)/getLevel(PlayerRef, SkillType)- Get specific skill datagetTotalXp(PlayerRef)/getTotalLevel(PlayerRef)- Get combined statsgetAllXp(PlayerRef)/getAllLevels(PlayerRef)- Get all skills as mapsaddXp(PlayerRef, SkillType, long)- Add XP (silent)removeXp(PlayerRef, SkillType, long)/setXp(PlayerRef, SkillType, long)- Modify XPgetLevelProgress(PlayerRef, SkillType)- Get progress to next level (0.0-1.0)calculateLevelFromXp(long)/getXpRequiredForLevel(int)- Utility methodshasSkillData(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
/mmoxpnow only shows skills with XP > 0 (cleaner display)- Plugin instance now accessed via
MMOSkillTreePlugin.getInstance()(singleton pattern) - Commands now extend
AbstractPlayerCommandwithPlayerRefparameter - 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
/xpdisplaycommand
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 settingson/off- Toggle XP gain messagesthreshold --value=<n>- Only show gains >= n XPstatus- View current settings
/mmoconfig(OP only) - Server configurationlist --args=<skill|all>- View XP configurations<skill> --args=<pattern|xp>- Set XP for block patternbasexp --args=<value>- Set base XP per levelscale --args=<multiplier>- Set leveling speedremove --args=<skill|pattern>- Remove block patternreload- 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

