File Details
MMOSkillTree-0.2.9.jar
- R
- Jan 19, 2026
- 184.39 KB
- 1.7K
- Early Access
File Name
MMOSkillTree-0.2.9.jar
Supported Versions
- Early Access
Changelog
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

