File Details
MMOSkillTree-0.4.3.jar
- R
- Jan 24, 2026
- 216.67 KB
- 9.9K
- Early Access
File Name
MMOSkillTree-0.4.3.jar
Supported Versions
- Early Access
# Changelog
## 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()` and `getGermanDefaults()` with full translations
- **LocalizationConfig.java** - Added `ensureTurkishDefaults()` and `ensureGermanDefaults()` methods
- **SettingsPage.java** - Increased `maxLangButtons` from 6 to 15
- **SettingsPage.ui** - Added `#LangBtn3` through `#LangBtn14` buttons in 3 rows of 5
- **SettingsPage.ui** - Increased `#LanguageSetting` height from 160 to 204
- **SettingsPage.ui** - Increased `#LanguageButtons` height from 80 to 124
---
## v0.4.2
### Bug Fixes
- **Disabled Luck for Crafting** - Removed luck bonus from crafting due to critical item duplication bug
- Luck bonuses were incorrectly duplicating crafted items
- Will be re-enabled in a future update once the underlying issue is resolved
### Technical
- **CraftRecipeEventSystem.java** - Removed `LuckUtil.tryLuckBonus()` call
---
## v0.4.1
### New Features
- **Mighty Staffs Mod Support** - Added default XP values for staffs from the [Mighty Staffs](https://www.curseforge.com/hytale/mods/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](https://www.curseforge.com/hytale/mods/wans-wonder-weapons) mod
- **Swords**: WanMine_Lethal_Leftovers_Sword, WanMine_Gaia's_Wrath_Sword, WanMine_Quasar_Cosmic_Sword (65-70 XP)
- **Longswords**: WanMine_Soulblight_Longsword, WanMine_Soulblight_Longsword_v1 (65 XP)
- **Daggers**: WanMine_Chromatic_Cleaver_Dagger, WanMine_Daybreak_Dagger, WanMine_Heartroot_Dagger, WanMine_Ashthorn_Dagger, WanMine_Nightshade_Dagger, WanMine_Frostburn_Dagger, WanMine_Nightfall_Dagger (58-68 XP)
- **Battleaxe**: WanMine_God_Slayer_Battleaxe (70 XP)
- **Maces**: WanMine_Helioram_Mace, WanMine_Maelstrom_Mace, WanMine_Mjollnir_Mace (65-70 XP)
### Technical
- **StaffDefaults.java** - Added Weapon_Staff_Bo_Wood
- **SwordDefaults.java** - Added Legendary tier with 3 WanMine swords
- **LongswordDefaults.java** - Added 2 WanMine longswords to Legendary tier
- **DaggerDefaults.java** - Added Legendary tier with 7 WanMine daggers
- **BattleaxeDefaults.java** - Added Legendary tier with WanMine_God_Slayer_Battleaxe
- **MaceDefaults.java** - Added Legendary tier with 3 WanMine maces
---
## v0.4.0
### New Features
- **Skill Tree Scrolling** - Skill tree UI now scrolls when there are many tiers
- **XP Progress Bar** - Skill tree header shows progress bar to next level with "current / needed" XP format
- **STAT_MANA Reward** - New reward type for increasing maximum mana
- **Complete 10-Tier Reward Redesign** - All 16 skills now have 10 tiers of rewards (Lv 5, 10, 15, 20, 30, 40, 50, 65, 75, 100)
### Mana System Design
Players start with 0 mana - it must be earned through skill tree choices. Each skill class has a distinct mana identity:
- **Staves** - THE mana class (360+ max mana potential). Bo staff masters channel mystical energy
- **Archery** - High mana (290+) for wand and spellbook users
- **Crafting** - Moderate mana (305) for enchanting and magical item creation
- **Defense/Harvesting** - Low mana (65-180) for survivability or nature attunement
- **Physical Combat** (Swords, Daggers, Axes, Blunt, Polearms) - Minimal mana (15-38). Warriors rely on steel, not sorcery
- **Gathering** (Mining, Woodcutting, Excavation) - Minimal mana (23-38). Laborers focus on physical prowess
- **Acrobatics/Building** - Zero mana. Pure physical disciplines focused on stamina
### Tier Structure
| Tier | Level | Choices | Required |
| ---- | ----- | ------- | -------- |
| 0-1 | 5-10 | 2 | 1 |
| 2-3 | 15-20 | 3 | 1 |
| 4-5 | 30-40 | 4 | 2 |
| 6-7 | 50-65 | 5 | 2 |
| 8 | 80 | 5 | 3 |
| 9 | 100 | 6 | 3 |
### Technical
- SkillTreePage.ui: `#TiersList` LayoutMode changed to TopScrolling
- SkillTreePage.ui: Added `#SkillProgress` ProgressBar in header
- SkillTreePage.java: Added progress calculation using getLevelProgress()
- SkillTreePage.java: Fixed ProgressBar.Value to use double instead of String
- SkillTreePage.java: MAX_CHOICES increased from 5 to 6 for tier 9
- RewardType.java: Added STAT_MANA enum
- StatModifierUtil.java: Added applyManaBonus/removeManaBonus methods
- StatManaEffect.java: New effect handler
- RewardEffectRegistry.java: Registered StatManaEffect
- LocalizationConfig.java: Added reward.stat_mana to all 5 languages
- SkillTreeDefaults.java: Complete rewrite with 10 tiers for all 16 skills
---
## v0.3.5
### Bug Fixes
- **Leaderboard Combat Skill Filters** - Fixed combat category only showing 6 of 10 skills in the filter bar
- Added SkillFilter6-9 buttons to support all combat skills
- All 10 combat skills now visible: Swords, Daggers, Polearms, Staves, Axes, Blunt, Archery, Unarmed, Defense, Acrobatics
- **Archery XP Defaults** - Removed magic staves from Archery skill
- Staves (magic/ranged) were incorrectly included in Archery defaults
- Staves now correctly belong only to the STAVES skill (melee staves)
### Technical
- **LeaderboardPage.ui** - Added `#SkillFilter6` through `#SkillFilter9` buttons
- **LeaderboardPage.java:217** - Changed skill filter loop from `i < 6` to `i < 10`
- **ArcheryDefaults.java** - Removed `StaffDefaults.getDefaults()` call
---
## v0.3.4
### New Features
- **Leaderboard Page** - View player rankings accessible from ViewXpPage
- Shows all players ranked by total level and XP
- Sort by category: Total Level, Gathering, Combat, Production
- Drill down by individual skill within each category
- Your rank displayed at the bottom with highlighting
- Scrollable player list for large servers
### Balance Changes
- **Leveling Curve Rebalanced** - Adjusted `baseXpPerLevel` and `levelScaleMultiplier` defaults
- Level 120 now requires approximately 1 million XP
- Default `levelScaleMultiplier` changed from 1.0 to 1.1
- Creates more meaningful late-game progression
- Existing servers can adjust via `/mmoconfig basexp` and `/mmoconfig scale` commands
### Technical
- **Scrollable UI Pattern** - `LayoutMode: TopScrolling` enables vertical scrolling in UI containers
- **New Files:**
- `LeaderboardPage.java` - Leaderboard page logic with player data gathering and sorting
- `LeaderboardPage.ui` - Layout with scrolling player list and filter buttons
- `LeaderboardRow.ui` - Template for individual player rank rows
- **ViewXpPage.java** - Added Leaderboard tab navigation
- **ViewXpPage.ui** - Added Leaderboard tab button
- **LocalizationConfig.java** - Added leaderboard localization keys for all 5 languages
---
## v0.3.3
### New Features
- **Hungarian Localization** - Added Hungarian (Magyar) as a supported language
- Full translation of all UI text, notifications, skill names, and reward types
- **More Crossbow Tiers Mod Support** - Added default XP values for crossbows from the [More Crossbow Tiers](https://www.curseforge.com/hytale/mods/more-crossbow-tiers) mod
### Bug Fixes
- **Config Reload Command** - Fixed `/mmoconfig reload` overwriting user config edits
- Manual file edits are now preserved when using reload command
- Version check only runs on server startup, not manual reloads
### Technical
- **Config Version System** - Replaced hash-based version tracking with simple version numbers
- `ConfigVersionUtil.CURRENT_CONFIG_VERSION` - Bump this constant when defaults change
- Configs now store `configVersion` field instead of computed hash
- More reliable: user edits don't trigger false "defaults changed" detection
- **SkillConfig.java** / **SkillTreeConfig.java** - `load(false)` skips version check for manual reloads
---
## v0.3.2
### New Features
- **Portuguese Localization** - Added Portuguese (Português) as a supported language
- Full translation of all UI text, notifications, skill names, and reward types
- Select Portuguese in Settings page
### Bug Fixes
- **Settings Language Selector** - Fixed backup language files appearing in the language selector
- Files like `messages-en_backup.json` no longer show as selectable languages
- Only valid language files (`messages-XX.json`) are displayed
### Technical
- **LocalizationConfig.java** - Added filter to exclude `_backup` files from language scanning
- **LocalizationConfig.java** - Added `getPortugueseDefaults()` with full Portuguese translations
---
## v0.3.1
### New Features
- **Tier 7 Rewards** - Added Level 65 milestone rewards for all 16 skills
- Master-tier bonuses: higher luck, health, damage, defense values
- Each skill gets 5 new reward choices at this tier
### Balance Changes
- **Stamina Rewards Rebalanced** - Base stamina is 10, so rewards were scaled down
- Early tiers (5-15): +1 stamina
- Mid tiers (30-50): +2 stamina
- Master tier (65): +3 stamina
- Maximum stamina from all skill trees is now ~15-20 (was 100+)
### Bug Fixes
- **Config Backup System** - Fixed bug creating nested `_backup_backup_backup...` files
- Backup files are now skipped when creating backups
- Added automatic cleanup of malformed backup files on startup
- **Config Auto-Update** - Configs now regenerate from new defaults when mod updates
- Old configs are backed up to `*_backup.json` before regeneration
- Ensures players get new tiers and balance changes automatically
### Technical
- **ConfigVersionUtil.java** - Added `cleanupMalformedBackups()` method
- **SkillConfig.java** - Regenerates from defaults when hash changes instead of merging
- **SkillTreeConfig.java** - Same auto-regeneration behavior
- **SkillTreeDefaults.java** - Added tier 7 for all skills, fixed stamina values
- **MMOSkillTreePlugin.java** - Calls cleanup on startup for both config dirs
---
## v0.3.0
### New Features
- **Luck System** (renamed from Double Drop) - Complete overhaul of bonus drop mechanics
- Renamed `RewardType.DOUBLE_DROP` → `RewardType.LUCK` throughout codebase
- New configurable `luckLootTable` - maps block patterns to specific item drops
- **Block breaks** (Mining, Excavation): Only gives luck bonus if loot table match exists
- **Item pickups** (Harvesting): Defaults to same item as bonus
- Default loot table includes all ore tiers (Copper → Onyxium) → raw ore items
- Default loot table includes all gems (Diamond, Emerald, Ruby, etc.) → gem items
- **Creative Mode XP Disable** - XP gains are now disabled by default in creative mode
- New config option `disableXpInCreative` (default: true)
- Toggle via `/mmoconfig creative --args=<true|false>`
- Players in creative mode will not gain XP unless this setting is changed
### UI/Text Improvements
- **Luck Reward Text** - Now specifies which skill the luck bonus applies to
- Before: "+5% Double Drop" (generic)
- After: "+5% Mining Luck" (skill-specific)
- Uses localization system with new `reward.luck_suffix` key
- **Defense renamed to Block** - Clarifies that this stat is different from Hytale's built-in defense
- All reward text now shows "Block" instead of "Defense"
- Updated in all three languages (EN: "Block", ES: "Bloqueo", FR: "Blocage")
### Breaking Changes
- Config field `doubleDropLootTable` renamed to `luckLootTable`
- Existing configs will need to rename this field manually
### Technical
- **New Files:**
- `LuckUtil.java` - Luck bonus logic (renamed from DoubleDropUtil)
- `LuckDefaults.java` - Default loot table mappings (renamed from DoubleDropDefaults)
- **Renamed Methods:**
- `SkillTreeService.getDoubleDropChance()` → `getLuckChance()`
- `SkillConfig.getDoubleDropLootTable()` → `getLuckLootTable()`
- `SkillConfig.getDoubleDropItem()` → `getLuckItem()`
- **SkillConfig.java** - Added `disableXpInCreative` field, renamed loot table fields
- **SkillService.java** - Added creative mode check in `processTrigger()`
- **MMOConfigCommand.java** - Added `creative` subcommand for toggling the setting
- **Messages.java** - Added LUCK handling in `getRewardDisplayText()` to include skill name
- **LocalizationConfig.java** - Added `reward.luck_suffix`, renamed from `reward.double_drop_suffix`
- **SkillTreeDefaults.java** - All DOUBLE_DROP rewards renamed to LUCK
---
## v0.2.9
### Bugfixes
- **Fixed critical hit notification** - Now shows multiplier (x1.5) instead of total damage amount
- **Fixed lifesteal notification** - Removed duplicate `+` sign that was appearing in heal messages
### Technical
- **DoubleDropUtil.java** - Extracted double drop logic to shared utility class for DRY
- **PickupItemEventSystem** - Refactored to use `DoubleDropUtil.tryDoubleDrop()` instead of inline implementation
---
## v0.2.8
### New Features
- **4 New Melee Combat Skills** - Weapon types split from Swords/Axes for more focused progression:
- **DAGGERS** - Daggers, claws, kunai (high crit chance, fast attacks)
- **POLEARMS** - Spears, halberds (reach weapons, defensive bonuses)
- **STAVES** - Bo staffs, melee staves (disciplined, stamina-focused)
- **BLUNT** - Clubs, maces (heavy hitters, high damage and health)
### Bugfixes
- **Combat Effect Notifications** - Added missing notifications for critical hits, defense blocks, and fall damage reduction (previously only lifesteal had notifications)
### Combat Skill Changes
- **SWORDS** now covers only longswords and one-handed swords (bladed slashing weapons)
- **AXES** now covers only axes and battleaxes (chopping weapons)
- Daggers, spears, and melee staves moved to their own dedicated skills
- Clubs and maces moved to new BLUNT skill
### Skill Tree Additions
- **4 New Skill Trees** with thematic reward progressions:
- **DAGGERS**: High crit scaling (up to +15%), strong lifesteal
- **POLEARMS**: Balanced offense/defense, high defense bonuses
- **STAVES**: Stamina-focused, good defense and fall reduction
- **BLUNT**: Highest raw damage (+14%), highest health (+28%)
### Technical
- **Config Version Hashing** - Config files now track a `defaultsHash` to detect when mod defaults change
- Automatically creates backup (e.g., `skill-config_backup.json`) before loading if defaults changed
- Protects user customizations when updating the mod
- New config files: `DaggersDefaults.java`, `PolearmsDefaults.java`, `StavesDefaults.java`, `BluntDefaults.java`
- New utility: `ConfigVersionUtil.java` for hash generation and backup management
- Updated `SkillType.java` with 4 new enum values
- Updated `SkillTreeDefaults.java` with 4 new skill tree methods
- Total implemented skills: 16 (was 12)
---
## v0.2.7
### Bugfixes
- **Fixed Archery skill not gaining XP** - Archery now correctly awards XP when dealing damage with bows, crossbows, wands, and other ranged weapons
- Changed Archery trigger type from `DEAL_DAMAGE_PROJECTILE` to `DEAL_DAMAGE_PHYSICAL`
- Removed unused `DEAL_DAMAGE_PROJECTILE` trigger type
---
## v0.2.6
### New Features
- **`/setmmoxp` Command** - Admin command to set player XP directly
- `/setmmoxp <skill> <value>` - Set XP for a specific skill
- `/setmmoxp all <value>` - Set XP for all skills at once
- Alias: `/setxp`
- Configurable permission via `setXpRequiredGameMode` in config
### Bugfixes
- **Fixed torches giving Woodcutting XP** - Torches no longer incorrectly award Woodcutting experience when broken
### Configuration
- **`setXpRequiredGameMode`** - New config option in `config.json`
- Controls who can use `/setmmoxp` command
- Values: `"OP"` (default), `"Adventure"`, `"Creative"`, etc.
- Example: Set to `"Creative"` to allow creative mode players to use the command
---
## v0.2.5
### Bugfixes
- **Fixed BONUS_XP reward display** - Now correctly shows the target skill name
- Before: "+5% Bonus XP" (generic)
- After: "+5% Mining XP" or "+5% Excavation XP" (skill-specific)
- Extracts skill from reward ID (e.g., `excavation_xp_1` → Excavation)
- Works correctly when skill trees offer XP bonuses for related skills
### Technical
- `Messages.extractSkillFromRewardId()` - Parses reward ID to determine target skill
- BONUS_XP rewards now display localized skill name + "XP" suffix
---
## v0.2.4
### New Features
- **Localization System** - Full i18n support for all UI text
- Players can select their preferred language in Settings
- Language preference saved per-player in SkillComponent
- Auto-generated English, Spanish, and French language files
- Users can add custom `messages-{lang}.json` files for additional languages
- **Language Selector** - New section in Settings page
- 6 language button slots in 2 rows of 3
- Currently selected language highlighted in green
- Disabled style for unavailable language slots
- Instant language switching without restart
- **Auto-Generated Language Files** - Located in `mods/mmoskilltree/localization/`
- `messages-en.json` - English (auto-generated)
- `messages-es.json` - Spanish (auto-generated)
- `messages-fr.json` - French (auto-generated)
- Files auto-update with new keys on server start
- **Localized Reward Text** - Skill tree rewards fully localized
- Reward type names (e.g., "Max Health" → "Santé Max" in French)
- Formatted values with localized patterns (+5%, +10, +3 blocks)
- Reward claimed notifications use localized text
- **Hot-Reload Support** - `/mmoconfig reloadlang` command
- Reload language files without server restart
- New translations take effect immediately
### Technical
- **New `i18n/` package:**
- `LocalizationConfig.java` - Singleton config manager for language files
- Loads/saves JSON message files using GSON
- Scans for available `messages-*.json` files
- Placeholder substitution with `{0}`, `{1}` format
- Merges file contents with defaults (preserves user customizations while adding new keys)
- Always falls back to English defaults (never shows raw keys)
- `Messages.java` - Static helper class for message access
- `get(skills, key)` / `get(skills, key, args...)` - Get translated message
- `getSkillName(skills, skillType)` - Get localized skill name
- `getRewardTypeName(skills, rewardType)` - Get localized reward type name
- `getRewardFormattedValue(skills, reward)` - Get localized formatted value
- `getRewardDisplayText(skills, reward)` - Get full localized reward text
- **SkillComponent.java** - Added `language` field (default: "en")
- Codec entry for persistence
- `getLanguage()` / `setLanguage()` methods
- **UI Localization** - All UI text now uses Messages helper
- ViewXpPage - Panel titles, tabs, labels, buttons
- SkillTreePage - Tier labels, status text, buttons
- SettingsPage - All setting labels and descriptions
- SkillRow/TierRow templates - Dynamic text via indexed selectors
- **SettingsPage.ui** - Added element IDs for dynamic localization
- `#SettingsTitle`, `#XpNotificationsLabel`, `#XpNotificationsDesc`
- `#CombatEffectsLabel`, `#CombatEffectsDesc`
- `#XpThresholdLabel`, `#XpThresholdDesc`
- `#LanguageLabel`, `#LanguageDesc`
- `#LangBtn0` through `#LangBtn5` with `@DisabledButtonStyle`
- **ViewXpPage.ui** - Added `#SkillsHeader` ID for localization
- **MMOConfigCommand.java** - Added `reloadlang` subcommand
### Message Key Structure
```json
{
"language.name": "English",
"ui.button.close": "CLOSE",
"ui.button.back": "< BACK",
"ui.viewxp.title": "Skill Overview",
"ui.viewxp.level_prefix": "Lv. {0}",
"ui.settings.language": "Language",
"notify.xp_gain": "+{0} {1} XP",
"notify.level_up": "LEVEL UP! {0} is now Level {1}!",
"skill.mining": "Mining",
"reward.stat_health": "Max Health",
"reward.bonus_xp": "Bonus XP",
"reward.format.percent": "+{0}%",
"reward.format.flat": "+{0}"
}
```
### Adding Custom Languages
1. Create `mods/mmoskilltree/localization/messages-{code}.json`
2. Copy structure from `messages-en.json`
3. Translate values (keys must remain the same)
4. Run `/mmoconfig reloadlang` or restart server
5. Language appears in Settings selector
---
## v0.2.3
### New Features
- **Dynamic Skill Tree Choices** - Configurable number of choices per tier (up to 5)
- New `choicesRequired` field on `SkillTreeNode` - how many rewards to pick per tier
- Global `defaultChoicesRequired` in config (default: 1)
- UI shows "Pick X of Y" when tier has multiple selections
- Tier status shows completion progress (e.g., "1/2" when partially complete)
- **Multi-Select Rewards** - Players can now pick multiple rewards per tier
- Higher tiers offer more choices with multi-select (Pick 2 of 4)
- Prevents claiming same reward twice
- Tier only marked complete when all required choices made
- **Dynamic UI Rendering** - Choice buttons rendered dynamically
- New `ChoiceButton.ui` template appended per choice
- Buttons use FlexWeight for automatic sizing
- Supports 2-5 choices per tier
- Removed hardcoded button limits
- **Expanded Reward Variety** - Updated skill tree defaults
- Tiers 0-1: 2 choices, pick 1
- Tiers 2-3: 3 choices, pick 1
- Tiers 4-5: 4 choices, pick 2
- **Tier 6 (Level 50)**: 5 choices, pick 2 - Elite rewards for all 12 skills
- More diverse reward options per tier
- **Tier 6 Elite Rewards (Level 50)** - All 12 skills now have elite tier rewards
- Gathering: +20% XP, +15% Double Drops, +20 Health, +15 Stamina, synergy bonuses
- Combat: +10% Damage, +12-15% Crit, +8-10% Lifesteal, +20 Health
- Defense: +12% Defense, +30 Health, -40% Fall Damage, +5% Lifesteal
- Acrobatics: -50% Fall Damage, +20 Health, +8% Defense, +20 Stamina
- Crafting/Building: +20% XP, +20 Health/Stamina, synergy bonuses
### Technical
- **SkillTreeNode.java** - Added `choicesRequired` field with new constructor
- **SkillComponent.java** - Multi-claim storage using comma-separated reward IDs per tier
- `getClaimedRewardIds(skill, tier)` returns list of claimed IDs
- `getClaimedCount(skill, tier)` returns count for tier
- `hasClaimedSpecificReward(skill, tier, rewardId)` checks specific claim
- **SkillTreeConfig.java** - Added `defaultChoicesRequired` global setting and JSON codec
- **SkillTreePage.java** - Dynamic button rendering with FlexWeight layout
- **SkillTreeService.java** - Updated claiming logic for multi-select validation
- **TierRow.ui** - Removed hardcoded buttons, added `#SelectionInfo` label
- **ChoiceButton.ui** - New template for dynamic choice buttons
### Config Schema Update
```json
{
"defaultChoicesRequired": 1,
"skillTrees": {
"MINING": [{
"tier": 4,
"levelRequired": 30,
"choicesRequired": 2,
"choices": [...]
}]
}
}
```
### Upgrade Notes
Run `/mmoconfig reloaddefaults` to load the new multi-choice tier defaults.
---
## v0.2.2
### Bugfixes
- **Fixed double drops not working** - Double drops now actually add bonus items to inventory
- Moved double drop logic from `BreakBlockEventSystem` to `PickupItemEventSystem`
- When items are picked up, checks DOUBLE_DROP reward chance for the relevant skill
- Bonus items are added directly to inventory (hotbar prioritized) via `getCombinedHotbarFirst().addItemStack()`
- Notification now shows item count: "Double Drop! (+3)"
---
## v0.2.1
### Bugfixes
- **Fixed duplicate component error** - Resolved `IllegalArgumentException: Entity contains component type` crash when multiple XP events fired in the same tick (e.g., breaking multiple blocks rapidly or combat with multiple hits)
- Added pending component cache to prevent duplicate `addComponent` calls before CommandBuffer consumption
---
## v0.2.0
### New Features
- **Reward Effect Framework** - Pluggable system for reward effects with handler registry
- `RewardEffectHandler` interface for all effect types
- `RewardEffectRegistry` singleton maps RewardType to handlers
- `RewardEffectContext` provides store, ref, playerRef, skills to handlers
- **9 Implemented Reward Types** - Beyond XP bonuses:
- **STAT_HEALTH** - Increases max health via Hytale's EntityStatMap
- **STAT_STAMINA** - Increases max stamina via EntityStatMap
- **STAT_DAMAGE** - Multiplies outgoing damage
- **STAT_DEFENSE** - Reduces incoming damage (capped at 90%)
- **CRITICAL_CHANCE** - Chance for 1.5x damage on attacks
- **LIFESTEAL** - Heals attacker for percentage of damage dealt
- **DOUBLE_DROP** - Chance for bonus resources when gathering
- **FALL_DAMAGE_REDUCTION** - Reduces fall damage (capped at 90%)
- **BONUS_XP** - Multiplies XP gain (existing)
- **Combat Effect Notifications** - New settings toggle for lifesteal/crit feedback
- Toggle via Settings > Combat Effect Notifications
- Lifesteal shows green "+X.X" heal notification
- Saved per-player in SkillComponent
- **Hytale EntityStatMap Integration** - Direct stat modification
- `StatModifierUtil` helper class for health/stamina modifiers
- Uses `DefaultEntityStatTypes.getHealth()` and `getStamina()`
- `StaticModifier` with `Modifier.ModifierTarget.MAX` for permanent bonuses
- `healEntity()` for lifesteal healing
- **Expanded Skill Tree Defaults** - 10 tiers with varied reward types
- Gathering skills: BONUS_XP, DOUBLE_DROP, STAT_STAMINA, STAT_DEFENSE, STAT_HEALTH
- Combat skills: BONUS_XP, STAT_DAMAGE, CRITICAL_CHANCE, LIFESTEAL, STAT_HEALTH
- Defense: STAT_DEFENSE, STAT_HEALTH, FALL_DAMAGE_REDUCTION
- Acrobatics: FALL_DAMAGE_REDUCTION (10%→40%), STAT_STAMINA, STAT_DEFENSE
- **Debug Starting Level** - Config option for testing high-level gameplay
- Set `debugStartingLevel` in config.json to initialize new players at that level
- Set to 0 (default) for production
### Technical
- **New `reward/` package:**
- `RewardEffectHandler.java` - Interface for effect handlers
- `RewardEffectRegistry.java` - Singleton registry
- `RewardEffectContext.java` - Context holder
- `StatModifierUtil.java` - Hytale stat integration
- `effects/PassiveEffect.java` - Base for passive effects
- `effects/StatHealthEffect.java` - STAT_HEALTH handler
- `effects/StatStaminaEffect.java` - STAT_STAMINA handler
- `effects/NoOpEffect.java` - Placeholder for deferred types
- **CombatDamageEventSystem enhancements:**
- Uses `DamageModule.get().getFilterDamageGroup()` to modify damage before health loss
- `applyAttackerEffects()` - Damage bonus + critical chance
- `applyDefenseReduction()` - Defense damage reduction
- `applyFallDamageReduction()` - Fall damage reduction
- `applyLifesteal()` - Heal on damage with optional notification
- **BreakBlockEventSystem enhancements:**
- `checkDoubleDrops()` - Random check for double drops
- Notification when double drop triggers
- **SkillComponent additions:**
- `showCombatEffects` boolean for combat notification preference
- Codec entry for persistence
- **SkillTreeService additions:**
- `getTotalLifesteal()`, `getTotalHealthBonus()`, `getTotalStaminaBonus()`
- Effect application on claim/reset
### Upgrade Notes
Run `/mmoconfig reloaddefaults` after upgrading to load the new 10-tier skill trees with varied reward types.
---
## v0.1.1
### New Features
- **Settings Page** - New in-game settings UI accessible via the Settings tab on ViewXpPage
- Toggle XP notifications on/off with a single click
- Choose XP gain threshold from preset values (1, 5, 10, 25, 50, 100)
- Visual feedback for current settings state
- Back button to return to skill overview
- **Expanded Skill Tree Defaults** - All 12 implemented skills now have 6 tiers of rewards
- Previously some skills had only 2-4 tiers
- Consistent progression across Mining, Woodcutting, Excavation, Harvesting, Swords, Axes, Archery, Unarmed, Defense, Acrobatics, Crafting, and Building
- Updated skill pairings for meaningful choices (Harvesting now pairs with Excavation/Crafting instead of unimplemented Cooking/Alchemy)
- **Dynamic Skill Tree UI** - Skill tree page now uses template-based dynamic rendering
- Automatically scales to display any number of tiers
- Improved visual styling with larger fonts and clearer status indicators
### Upgrade Notes
**Important:** After upgrading to v0.1.1, run `/mmoconfig reloaddefaults` to load the new 6-tier defaults for all skills. This will reset your skill tree configuration to the new defaults.
---
## v0.1.0
### New Features
- **Skill Tree System** - Unlock XP bonus rewards at level milestones
- 6 tiers per skill, unlocked at levels 5, 10, 15, 20, 30, 40
- Each tier offers a choice between XP bonus for the main skill OR a related skill
- Example: Mining tier lets you choose +5% Mining XP OR +5% Excavation XP
- Rewards persist across sessions via ECS component
- **Meaningful Reward Choices** - Each skill pairs with thematically related skills:
_(TEMPORARY UNTIL MORE COMPLEX IMPLEMENTATION)_
- Mining ↔ Excavation, Smithing
- Woodcutting ↔ Building, Crafting
- Excavation ↔ Mining, Harvesting
- Harvesting ↔ Cooking, Alchemy
- Swords ↔ Defense, Axes
- Axes ↔ Swords, Woodcutting
- Archery ↔ Crafting, Acrobatics
- Unarmed ↔ Acrobatics, Defense
- Defense ↔ Acrobatics, Swords
- Acrobatics ↔ Defense, Unarmed
- Crafting ↔ Mining, Smithing
- Building ↔ Woodcutting, Crafting
- **Skill Tree UI** (`SkillTreePage`)
- Navigate between skills with arrow buttons
- Shows tier status: LOCKED (gray), AVAILABLE (white), or CLAIMED (green)
- Color-coded buttons show selection state
- Reset button to clear all selections for current skill
- Opens via `/skilltree` command or Tree button on ViewXpPage
- **ViewXpPage Enhancement** - Added "Tree" button next to each skill to jump directly to its skill tree
- **Bonus XP System** - Claimed BONUS_XP rewards apply multiplicatively to XP gains
- Stack bonuses from multiple tiers for compounding effect
- **Milestone Notifications** - Players notified when new tiers unlock
- Automatic detection when leveling up
- Prompts players to use `/skilltree` to claim
### New Commands
- `/skilltree [skill]` - Open the skill tree UI
- Aliases: `/st`, `/rewards`
### Configuration
- New config file: `config/mmoskilltree/skilltree.json`
- Configurable level thresholds per tier
- Per-skill reward choices with custom values
- Currently supports BONUS_XP reward type (other types defined but not yet implemented)
### Technical
- **New data classes:**
- `RewardType.java` - Enum of reward types (BONUS_XP implemented, others placeholder)
- `SkillReward.java` - Configurable reward with id, type, value, display name
- `SkillTreeNode.java` - Milestone with level threshold and reward choices
- **New config classes:**
- `SkillTreeConfig.java` - Singleton config for skill trees with JSON persistence
- `SkillTreeDefaults.java` - Default rewards with meaningful skill pairings
- **New service:**
- `SkillTreeService.java` - Milestone checking, reward claiming, XP multiplier calculations
- **New UI:**
- `SkillTreePage.java` - Interactive page with claim/reset/navigate actions
- `SkillTreePage.ui` - Layout with 6 tiers, 2 choices each, navigation and reset buttons
- **Extended SkillComponent:**
- `claimedRewards` - Map of skill → claimed reward IDs per tier
- `pendingRewards` - Map of skill → pending milestone notifications
- `resetRewards(skill)` / `resetAllRewards()` - Clear claimed rewards
- String serialization for codec compatibility
- **Extended MMOSkillTreeAPI:**
- `updateSkillComponent(PlayerRef, SkillComponent)` - Explicit update hook
- **Modified SkillService:**
- Integrated milestone checks on XP gain
- Applies bonus XP multiplier from claimed rewards
---
## v0.0.11
### New Features
- **Combat XP System** - Full implementation of combat skills via `CombatDamageEventSystem`
- **SWORDS** - XP for melee damage with longswords, daggers, spears, claws, staves
- **AXES** - XP for melee damage with axes, clubs, maces, battleaxes
- **ARCHERY** - XP for ranged damage with bows, crossbows, wands, spellbooks, guns, bombs
- **UNARMED** - XP for dealing damage without weapons
- **DEFENSE** - XP for taking damage from any source
- **ACROBATICS** - XP for surviving fall damage
- **Material-Tiered XP Values** - Rare weapons give more XP than common ones
- Common (Crude, Copper, Tribal): 5-6 XP
- Uncommon (Iron, Bronze, Scrap): 7-9 XP
- Rare (Cobalt, Adamantite, Thorium): 20-32 XP
- Epic (Mithril, Onyxium): 45-55 XP
- Legendary (Flame, Void, Spectral): 55-70 XP
- **New Skills** (in SkillType enum, not yet implemented)
- FISHING, TAMING, REPAIR, ALCHEMY, ENCHANTING, COOKING, SMITHING
### Technical
- **Separate defaults files** for maintainability:
- `SwordsDefaults.java` - Longswords, daggers, spears, staves (melee)
- `AxesDefaults.java` - Axes, clubs, maces (blunt weapons)
- `ArcheryDefaults.java` - Bows, crossbows, wands, spellbooks, guns, bombs
- **SkillDefaults.java** now delegates to per-skill defaults files
- **New TriggerTypes**: `DEAL_DAMAGE_PHYSICAL`, `DEAL_DAMAGE_PROJECTILE` (replaced `DEAL_DAMAGE`)
- Weapon detection uses `inventory.getActiveHotbarItem().getItemId()` for pattern matching
- Patterns match actual item IDs (e.g., `Weapon_Longsword_Mithril`, `Weapon_Axe_Iron`)
---
## v0.0.10
### New Features
- **Crafting XP** - New `CraftRecipeEventSystem` awards XP when crafting items
- **Building XP** - New `PlaceBlockEventSystem` awards XP when placing blocks
- **CRAFTING skill** - New general crafting skill type (15 XP per craft by default)
- **BUILDING skill defaults** - Placing blocks now awards XP at 50% of the breaking value (e.g., placing stone = 2 XP vs mining stone = 3 XP)
### Technical
- New `event/CraftRecipeEventSystem.java` - Handles `CraftRecipeEvent` for crafting XP
- New `event/PlaceBlockEventSystem.java` - Handles `PlaceBlockEvent` for building XP
- `SkillDefaults.getBuildingDefaults()` dynamically computes values from mining/woodcutting/excavation at 50%
---
## v0.0.9
### New Features
- **Quick threshold commands** - Set XP display threshold with `/xpd 10`, `/xpd 20`, `/xpd 0`, etc.
### Bugfixes
- **Progress bar display** - Fixed progress bar rendering in skill UI
---
## v0.0.8
### Bugfixes
- **`/mmoconfig reloaddefaults`** - Now properly saves config after reloading defaults (previously only applied in-memory)
### Changes
- **Enhanced notifications** - XP gain and level up messages now use the notification system instead of chat messages for better visibility
---
## v0.0.7
### New Features
- **ViewXpPage** - New custom UI page for viewing skill stats
- Shows total level, total XP, and number of active skills
- Displays individual skill progress for all configured skills
- Only shows skills with XP configuration data (unconfigured skills hidden)
- Open via `player.getPageManager().setPage(ref, store, new ViewXpPage(playerRef))`
### Technical
- New `pages/` package for custom UI pages
- UI files in `src/main/resources/Common/UI/Custom/Pages/`
- Updated CLAUDE.md with UI page documentation and naming conventions
---
## v0.0.6
### New Features
- **`/mmoconfig reloaddefaults`** - New admin command to reset all XP values to built-in defaults from `SkillDefaults.java`
---
## v0.0.5
### New Features
- **Comprehensive default XP values** for all Hytale blocks based on official item database
- Mining: 10+ rock types, 9 ore tiers (Copper→Onyxium), 7 gem types
- Woodcutting: 30+ tree types across 5 tiers (Common→Special)
- Excavation: All soil types including grass, sand, mud, snow, ash
- Harvesting: Grass, ferns, bushes, flowers, crops, fruits, coral, vines
- **PickupItemEventSystem** - Awards XP when picking up items
### Changes
- **Professional package structure** - Reorganized codebase:
- `api/` - Public API for other plugins
- `command/` - Command handlers
- `config/` - Configuration and defaults
- `data/` - Data models (SkillComponent, SkillType)
- `event/` - Event system handlers
- `service/` - Business logic
- `util/` - Utility classes
- **SkillDefaults.java** - Centralized default XP values (separated from config)
- Updated import paths: `com.ziggfreed.mmoskilltree.api.MMOSkillTreeAPI`, `com.ziggfreed.mmoskilltree.data.SkillType`
---
## v0.0.4
### Bugfixes
- Fixed issue with "harvesting" blocks not rewarding xp
## v0.0.3
### New Skills
New skills added for developers to access via API
### New Features
- **Public API** (`MMOSkillTreeAPI`) for other plugins to access player skill data
- `getSkillComponent(PlayerRef)` - Get full skill data
- `getXp(PlayerRef, SkillType)` / `getLevel(PlayerRef, SkillType)` - Get specific skill data
- `getTotalXp(PlayerRef)` / `getTotalLevel(PlayerRef)` - Get combined stats
- `getAllXp(PlayerRef)` / `getAllLevels(PlayerRef)` - Get all skills as maps
- `addXp(PlayerRef, SkillType, long)` - Add XP (silent)
- `removeXp(PlayerRef, SkillType, long)` / `setXp(PlayerRef, SkillType, long)` - Modify XP
- `getLevelProgress(PlayerRef, SkillType)` - Get progress to next level (0.0-1.0)
- `calculateLevelFromXp(long)` / `getXpRequiredForLevel(int)` - Utility methods
- `hasSkillData(PlayerRef)` / `getSkillTypes()` - Helper methods
- New skill category: **Misc** (for Building and future utility skills)
- New trigger types: `PLACE_BLOCK`, `FALL_DAMAGE`, `TAME_ENTITY`, `CATCH_FISH`
### Changes
- `/mmoxp` now only shows skills with XP > 0 (cleaner display)
- Plugin instance now accessed via `MMOSkillTreePlugin.getInstance()` (singleton pattern)
- Commands now extend `AbstractPlayerCommand` with `PlayerRef` parameter
- Internal services use API for cache access (DRY principle)
- Consistent cache keying via `PlayerRef.hashCode()`
---
## v0.0.2
### Changes
- Changed default XP gain threshold for message display from 0 to 10
- Fixed permission issue with `/xpdisplay` command
---
## v0.0.1 - Initial Release
### Skills
- **Mining** - Gain XP from breaking stone and ores
- **Woodcutting** - Gain XP from chopping trees and logs
- **Excavation** - Gain XP from digging soil and dirt
- **Harvesting** - Gain XP from harvesting plants and crops
### Features
- Quadratic XP scaling formula for balanced progression
- Per-player XP display preferences (toggle on/off, set minimum threshold)
- Persistent player data via ECS component codec
- JSON config file with hot-reload support
- Pattern-based block matching for flexible XP configuration
### Commands
- `/mmoxp` - View your skill levels and XP progress
- `/xpdisplay` - Configure personal XP notification settings
- `on` / `off` - Toggle XP gain messages
- `threshold --value=<n>` - Only show gains >= n XP
- `status` - View current settings
- `/mmoconfig` (OP only) - Server configuration
- `list --args=<skill|all>` - View XP configurations
- `<skill> --args=<pattern|xp>` - Set XP for block pattern
- `basexp --args=<value>` - Set base XP per level
- `scale --args=<multiplier>` - Set leveling speed
- `remove --args=<skill|pattern>` - Remove block pattern
- `reload` - Reload config from file
### Technical
- Dynamic skill system - adding new skills only requires enum entry + defaults
- TriggerType system for future event handlers (combat, crafting, etc.)
- Thread-safe skill caching for command access
- Auto-generates config on first launch

