File Details
MMOSkillTree-0.4.6.jar
- R
- Jan 25, 2026
- 226.60 KB
- 5.5K
- Early Access
File Name
MMOSkillTree-0.4.6.jar
Supported Versions
- Early Access
Changelog
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
- Defense/Harvesting - Low mana (65-180) for survivability or nature attunement
- Physical Combat (Swords, Daggers, Axes, Blunt, Polearms) - Minimal mana (15-38). Warriors rely on steel, not sorcery
- Gathering (Mining, Woodcutting, Excavation) - Minimal mana (23-38). Laborers focus on physical prowess
- Acrobatics/Building - Zero mana. Pure physical disciplines focused on stamina
Tier Structure
| Tier | Level | Choices | Required |
|---|---|---|---|
| 0-1 | 5-10 | 2 | 1 |
| 2-3 | 15-20 | 3 | 1 |
| 4-5 | 30-40 | 4 | 2 |
| 6-7 | 50-65 | 5 | 2 |
| 8 | 80 | 5 | 3 |
| 9 | 100 | 6 | 3 |
Technical
- SkillTreePage.ui:
#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, Defense, Acrobatics
Archery XP Defaults - Removed magic staves from Archery skill
- Staves (magic/ranged) were incorrectly included in Archery defaults
- Staves now correctly belong only to the STAVES skill (melee staves)
Technical
- LeaderboardPage.ui - Added
#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

