New Features
- Blacklist for BREAK/PLACE actions - Filter out specific materials with wildcard support
- *_CARPET - blocks ending with _CARPET
- STONE_* - blocks starting with STONE_
- Required-tool filtering - Restrict actions to specific tool types
- Supported: PICKAXE, SHOVEL, AXE, HOE, SWORD, SHEARS
Fixes
- Fixed getMaxLevel permission not working correctly
- Fixed HexColor parsing in help messages
- Fixed player head skin loading issues
Improvements
- Optimized player head caching using Paper's PlayerProfile API
- Uses Paper's internal cache before making network requests
- Supports Paper 1.16.5+ and compatible forks
- Falls back to Bukkit API for non-Paper servers
- Future-proof - no updates needed for new MC versions
- Reduced unnecessary Mojang API calls for faster player head loading
UniverseJobs v0.6.1 Patch Notes
New Features
- Added equipped job placeholders:
%universejobs_equipped_X%%universejobs_equipped_X_level%%universejobs_equipped_X_xp%%universejobs_equipped_X_id%
- Support for decimal values in action menus (e.g.,
xp: 0.04) - Added
{max_level}placeholder in message processing
Bug Fixes
- Fixed XP calculation bug
- Fixed formatted join message
- Fixed CraftItemEvent handling
- Fixed task scheduling in ActionLimitManager for versions > 1.20.4
- Fixed Spigot compatibility for task scheduling
- Fixed leaderboard data not persisting after server restart
- Fixed player skins not displaying for ranks other than #1 in rankings menu
- Fixed "inventory is null" error on menu click
- Fixed GlobalRankingsMenu to load from LeaderboardDao instead of memory
Improvements
- Refactored task scheduling to use FoliaManager for better Paper/Folia compatibility
- Added missing messages
- Updated block-protection blacklist with additional plant materials
Quality of Life & Stability Update
New Features
- Customizable Main Command: Main plugin command can now be changed from
/jobsto any command viamain-commandin config.yml - Current Jobs Placeholder: Added
%universejobs_currentjobs%PlaceholderAPI placeholder to display player's active jobs - Customizable Boost Notifications: Boost notification messages are now fully customizable in language file with placeholders for type, boost_id, multiplier, duration, and job
Bug Fixes
- Fixed job icons with
PLAYER_HEAD:textureformat not displaying in main menu (now requires separatematerialandplayer-headfields) - Fixed admin boost console messages displaying broken color codes (
&€l&e) by using MessageUtils for proper color conversion - Fixed join command error message not formatting colors when max jobs limit is reached
- Fixed missing
{xp_required}placeholder in main jobs menu - Fixed
{current_xp}placeholder showing "0/0" XP display by using current level progress instead of total XP - Fixed level 1 XP calculation treating level 1 threshold as starting point instead of 0, causing immediate level jump
- Fixed "JobManager is shutdown" error when using plugin reload/unload commands by resetting shutdown flag on reload
- Fixed "Plugin attempted to register task while disabled" error on reload by checking plugin enabled state before task creation
- Fixed "Initial delay ticks may not be <= 0" error in boost manager GUI by removing incorrect milliseconds-to-ticks conversion
- Fixed "Index -999 out of bounds" error when clicking outside boost GUI by adding slot bounds validation
- Fixed boost GUI messages (refresh, remove, no-permission) displaying broken color codes by using MessageUtils
- Fixed boost GUI auto-refresh using invalid interval values by validating config and defaulting to 20 ticks if invalid
- Fixed boost GUI not updating after removing a boost by calling updateGuiContent() after removal
Configuration Changes
- Added
main-command: "jobs"to config.yml for customizable command - Job icon format changed: use
material: "PLAYER_HEAD"withplayer-head: "texture"instead ofmaterial: "PLAYER_HEAD:texture" - Added
boost-notificationsection to en_US.yml withreceived,received-with-job, andglobal-startedmessages - Changed XP display in main-menu.yml from
{player_xp}to{current_xp}for accurate level progress
Need Help?
Report issues in the discord
Added
- Support for XP and money ranges in admin job commands
- Placeholder
{reward_description}for reward lore/description - Spawner mob payment with permission-based percentage
- Payment for stacked blocks (e.g., cactus, sugar cane, etc.)
- Config option to redefine command name
- Added gray color in
%universejobs_<job>_player_progress%placeholder
Changed
- Rankings Menu now uses the same job slots as the main menu (
job-slots) for consistent placement job-selection.default-format.slotssection inrankings-menu.ymlis no longer needed (auto-uses main-menu slots)- Small internal code improvements
Fixed
- Permission
universejobs.maxjobs.Xnot working - Placeholder
{player}in limits and reward messages - Message prefix not being applied correctly
- Error in XP curve calculation
- Click menu issues and disabled item interactions
[+] Menu optimization
[+] Fix click slot ranking menu
[+] Fix hunter.yml wrong examples
[+] Remove debug messages
[+] Fix customfishing support
[+] Add action menu priority for sorting list
actions:
BREAK:
# Oak wood
break_oak_log:
target: "OAK_LOG"
display-name: "Oak log"
action-menu-priority: 1 #<---- NEW the smaller the number, the more priority it will have in sorting
lore:
- "<gray>Chop down oak logs"
xp: 2.0
money: 1.5
IMPORTANT FIX BUG PERFORMANCE
[+] Remove debug message
{+] Improve all ranking functionnality
Please recreate your file rankings menu to have all the new features
{+] Fix N/A placeholder for rank
[+} Fix {max_jobs}
[+] MCMMO support
[+] universejobs.job.<job>.maxlevel.<level> – Overrides job’s natural cap max level
[+] Add rewards based on how many players use each job relative to other jobs config.yml
# Usage-based multiplier system
# Adjusts rewards based on how many players use each job relative to other jobs
usage-multiplier:
enabled: false
# Default settings for all jobs
default:
min: 0.5 # Minimum multiplier (for most popular job - 100% usage)
max: 2.0 # Maximum multiplier (for least popular job - lowest % usage)
# Per-job specific settings (overrides default)
jobs:
miner:
min: 0.3
max: 2.5
farmer:
min: 0.6
max: 1.8```
`%universejobs_equippedjobs%` - Total number of job used.
`%universejobs_equippedjobs_<job>%` - Total number of players in this job.
`%universejobs_multiplier_<job>%` - multiplier based on the usage of jobs.
[+] Feature for Automatically reduce/delete levels/xp for inactive players
```yml
# Inactivity Decay Settings
# Automatically reduce levels/xp for inactive players
inactivity-decay:
# Enable or disable inactivity decay globally
enabled: false
# Number of days before a player is considered inactive
days-before-inactive: 30
# Number of days before completely removing player data (0 = never remove)
days-before-removal: 90
# Default decay settings (can be overridden per job)
default:
# Decay type: "level" or "xp" or "percentage"
# level: lose X levels per day
# xp: lose X xp per day
# percentage: lose X% of current level per day
type: "percentage"
# Amount to lose per day of inactivity
# For "percentage" type: 0.01 = 1%, 0.05 = 5%
# For "level" type: number of levels to lose
# For "xp" type: amount of xp to lose
amount: 0.01
# Minimum level to keep (players won't go below this level)
min-level: 1
# Per-job specific decay settings (overrides default)
jobs:
miner:
type: "percentage"
amount: 0.015
min-level: 1
farmer:
type: "level"
amount: 1
min-level: 5
[+] Add Per-job specific penalty settings
# Job Leave Penalty Settings
leave-penalty:
# Enable or disable penalties when leaving jobs globally
enabled: false
# Default penalty settings (can be overridden per job)
default:
# Penalty type: "level" or "xp"
# level: lose a percentage of current level
# xp: lose a percentage of current xp
type: "level"
# Percentage to lose (0.0 to 1.0)
# Example: 0.1 = 10%, 0.25 = 25%, 0.5 = 50%
percentage: 0.1
# Per-job specific penalty settings (overrides default)
jobs:
miner:
type: "xp"
percentage: 0.15
farmer:
type: "level"
percentage: 0.05
[+] JobsReborn migration now possible with /jobs admin migrate JobsReborn <jobs/data/all> [job] (EXPERIMENTAL)
[+] More flexible on the name of materials target like (HONEY_BOTTLE, honeyBottle ..)
Examples files and rewards rework
New Features
- {max_jobs} Placeholder: Shows maximum jobs allowed in main menu and job menus
- Back Button: Added navigation back button in reward GUIs to return to job menu
- Player Head Support: Custom Base64 skull textures support in GUI configurations
- Reward Templates: Status-specific display names and lore (retrievable/blocked/retrieved)
- Page-Specific Slots:
reward-slots-by-pagefor custom layouts per reward page
# Page-specific reward slots (optional)
# If not defined, uses default reward-slots for all pages
reward-slots-by-page:
0: # Page 1 (0-indexed) - farming pattern
- 11
- 20
1: # Page 2 - grid pattern
- 11
- 20
...
2: # Page 3 - compact layout
- 11
- 20
...
- Complete Job Setup: Added 4 fully configured default jobs (Miner, Farmer, Hunter, Lumberjack)
- Complete Reward GUIs: Added dedicated reward GUI files for all 4 default jobs
- GUI Default Settings: All GUI items now inherit from
gui-default-settingsin config.yml
Major Changes
- Reward System: Complete refactoring to use YAML configurations without hardcoding
- Job System: Updated from placeholder example jobs to 4 complete, production-ready jobs
- Update Checker: Switched from GitHub API to Spiget API for plugin updates
- Menu Navigation: Fixed page 2+ interactions and improved click detection
- Material Grouping: Actions with identical display-material are now properly grouped
- Hunter Job: Added spawn eggs for all mobs with proper display materials
- Farmer Job: Enhanced with crop harvesting and seed planting actions
- Auto-Restore: Disabled by default in miner.yml for better action limit control
Removals
- Example Files: Removed example.yml job and example_rewards.yml files
- Example GUI: Removed example_rewards_gui.yml in favor of job-specific GUIs
- Debug Spam: Reduced startup and shutdown console messages
- Unused Code: Cleaned up imports and unused variables across multiple classes
Bug Fixes
- NPE Crashes: Fixed NullPointerException when display-material returns null
- Reward Pages: Fixed reward menus not working on pages 2, 3, 4+
- Fill Items: Fixed background items not loading at server startup
- Placeholder Loading: Fixed {max_jobs} not displaying in main menu
- Item Grouping: Fixed duplicate actions not being grouped in action menus
- Menu Updates: Fixed menus not refreshing properly after changes
- Default Settings: Fixed GUI items not using gui-default-settings fallback
- Hide Attributes: Fixed custom GUI items not hiding item attributes and enchants
- Add CraftEngine support
- Fix all oraxen implementation
- Fix various internal problems
- Add "display-material" option
break_cobblestone:
target: "COBBLESTONE"
display-name: "Cobblestone"
display-material: "COBBLESTONE:1001" # Custom diamond with model data 1001 for the action menu
lore:
- "<gray>Mine cobblestone blocks"
xp: 0.8
money: 0.3
- Fix "/jobs admin give custom" command
- New option "silent" for "give custom" command
- Fix "age" settings
- Add blacklist protection block
block-protection:
enabled: true
# List of block materials that are exempt from protection (always give XP)
blacklist:
- "WHEAT"
- "Fix executed command in GUI ([console] [player])
- Fix "confirm message" when repeating command
- Remove "/jobs admin debug" command
- Add others missing message
[+] Oraxen item/block support (oraxen:id)
[+] Important fix because it fixes a gain duplication with IgnoreCancelled
[+] Add "age" settings for crops
BREAK:
simple_wheat:
target: "WHEAT" # Block to break
age: 7 #5-7 or 7 etc..
display-name: "harvest a wheat"
lore: []
xp: 2.0
money: 3.0
[+] Improve performance
- Fix ItemsAdder/Nexo NoClassDefFoundError
- Fix error Cannot save player data when shutdown
Improve Performance & UX
Multi-line Job Descriptions
- Jobs now support beautiful multi-line descriptions that automatically expand in menus
- Enhanced readability with proper line breaks in job lore
Configuration Example:
# Single line (old method)
description: "Mine valuable ores and materials"
# Multi-line (new method)
description:
- "Extract valuable resources from"
- "the depths of the earth!"
- "Discover rare minerals and gems"
Configurable Job Status System
- Complete customization of job status display in
config.yml - Personalize colors, icons, and text for "Active" vs "Available" states
Configuration Example:
placeholders:
# Action placeholders - customize how action information is displayed
action_type:
# Default format for all action types
default: "<white>{value}"
# Specific formats per action type
EAT: "<red><bold>EAT"
BREAK: "<#b5b5b5><bold>BREAK"
KILL: "<dark_red><bold>KILL"
PLACE: "<#cbe8a5><bold>PLACE"
ENCHANT: "<purple><bold>ENCHANT"
BREW: "<yellow><bold>BREW"
CRAFT: "<blue><bold>CRAFT"
SMELT: "<orange><bold>SMELT"
BLOCK_INTERACT: "<cyan><bold>INTERACT"
ENTITY_INTERACT: "<pink><bold>INTERACT"
HARVEST: "<pink><bold>HARVEST"
action_target: "<white>{value}"
action_name: "<white>{value}"
action_display_name: "<white>{value}"
action_lore: "<gray>{value}"
action_xp_base: "<#abffb3>{value}"
action_xp: "<#abffb3>{value}"
action_xp_multiplier: "<gray>(<white>x{value}<gray>)"
action_money_base: "<#FFD700>{value}"
action_money: "<#FFD700>{value}"
action_money_multiplier: "<gray>(<white>x{value}<gray>)"
action_cooldown: "<gray>Cooldown: {value}s"
# Job status placeholders - customize how job status is displayed in menus
job_status:
joined: "<#abffb3>Active"
not_joined: "<#ff6b6b>Not Joined"
Persistent Player Statistics
- Stat persistence - players can see progress even after leaving jobs
Example: A player leaves the "Miner" job at level 25 with 50,000 XP. When viewing the jobs menu, they still see:
Level: 25/100 (75.5%)
XP: 50,000
Status: Not Joined
Batched Reward Processing
- New
BatchedRewardManagerfor ultra-efficient reward distribution - Configurable batching intervals for optimal performance
- Massive performance boost for high-activity servers
Configuration Example:
performance:
batching-xp: 40 # XP batched every 40 ticks (2 seconds)
batching-money: 60 # Money batched every 60 ticks (3 seconds)
batching-others: 40 # Commands every 40 ticks (2 seconds)
User Experience Overhaul
Intuitive Controls
- Left-click: Open detailed job menu
- Right-click: Quick join/leave (goodbye Shift+click!)
- Accessible and natural for all players
Before vs After:
Old: Shift+Left-click to join/leave jobs
New: Right-click to join/leave jobs
Modern Menu Design
- Stunning hex color scheme with mint, gold, and emerald tones
- Professional Unicode symbols for better visual hierarchy
- Clean
else:syntax for menu configurations
Menu Configuration Example:
job-item-format:
display-name: "<bold>{job_name}</bold>"
lore:
- "<gray>{job_description}"
- "<gray>├ Level: <#abffb3>{player_level}<gray>/<#abffb3>{job_max_level}"
- "<gray>├ XP: <#62de6e>{player_xp}"
- "<gray>└ {progress_bar}"
# Configuration for players without the job
else:
lore:
- "<gray>{job_description}"
- "<gray>Status: {job_status}"
- "<#FFD700>▶ Right-click to join"
glow: true
Performance Revolution
Message System Optimization
- 60-80% reduction in color conversion processing time
- Ultra-fast pre-compiled pattern matching for common XP messages
- Advanced multi-level caching system for components, colors, and legacy conversions
Technical Details:
Before: Every message converted from scratch (slow)
After: Common patterns pre-compiled + 3-tier cache system (ultra-fast)
BossBar Engine Rewrite
- Eliminated all
CancellationExceptionlogging spam - Smooth timestamp-based cleanup system
- Zero-overhead XP progress notifications
Configuration System Enhancement
- Fixed critical reload issues with block protection settings
- All configuration changes apply instantly with
/jobs admin reload - No more server restarts required for config updates
Critical Fixes
Stability Improvements
- Fixed: Missing
reload-failedlanguage messages causing errors - Enhanced: BossBar management with proper synchronization
Menu System Fixes
- Improved: Job placeholder system with
{job_description_lines}support - Optimized: Menu configuration loading and validation
- Streamlined: Reward GUI and command processing
- Simplified: Navigation slots configuration
Technical Architecture
Code Quality Improvements
- Optimized action processing and caching mechanisms
📈 Performance Metrics
- Message Processing: 60-80% faster color conversion
- Memory Usage: Reduced with efficient caching strategies and object pooling
- Server Load: Significantly decreased during high XP activity
- Error Rate: Nearly eliminated configuration-related errors
- Cache Hit Rate: Improved with multi-level caching system
Migration Guide
Optional Upgrades
- Update menu configs to use new
else:syntax for cleaner organization - Customize job status messages in
config.yml - Enable multi-line descriptions for better job presentation
✨ Major Features
🎮 GUI System for Boost Management
- Interactive GUI for
/jobs admin boost inforeplacing text display - Auto-refresh functionality
- Right-click to remove boosts directly from GUI
- Automatic sorting by boost launch order
- 100% configurable via
menus/boost-manager.yml
🔢 Bonus Calculation Mode System
Three calculation modes available in config.yml:
- ADDITIVE:
2.5x + 2.5x = 5.0x(addition) - MULTIPLICATIVE:
2.5x × 2.5x = 6.25x(multiplication - default) - HIGHEST:
3.0x, 2.5x = 3.0x(only the best boost)
🏆 Complete Reward System Overhaul
- 100% customizable reward GUIs via YAML configuration
- PlaceholderAPI integration throughout reward system
- Nexo/ItemsAdder integration for custom items
- Advanced reward conditions with feedback messages and sounds
- GUI positioning system with configurable slots
🗄️ Database Storage System
- MySQL and SQLite support with HikariCP connection pooling
- Database migration system with admin commands
🔄 Auto-Update System
- GitHub integration for automatic update checking
- Version comparison with semantic versioning support
📊 Enhanced Menu System
- Customizable job menus with
menus/configuration - Display name and lore support for job actions
- Menu configuration reload via admin commands
🎮 Reward GUI System
⚙️ Configuration
# gui/example_rewards_gui.yml
title: "<#FFD700><bold>{job} Rewards</bold>"
size: 54
reward-item:
materials:
retrievable: LIME_SHULKER_BOX
blocked: RED_SHULKER_BOX
retrieved: GRAY_SHULKER_BOX
status-indicators:
retrievable: "<#32CD32>✓"
blocked: "<#FF6B6B>✗"
retrieved: "<#808080>✓"
lore-format:
- "{description}"
- "<gray>Required Level: <#FFD700>{level}"
- "{reward_items}"
- "{economy_reward}"
- "{click_instruction}"
🎯 Available Placeholders
{name},{description},{level},{status_description}{repeatable_info},{cooldown},{reward_items},{economy_reward}{commands},{click_instruction}
🎯 Boost Manager GUI
📋 User Interface
- Experience bottles for XP boosts
- Gold ingots for Money boosts
- Navigation items: close, refresh, information
- Configurable sound effects
⚙️ Configuration
# menus/boost-manager.yml
title: "<gold><b>Boost Manager</b></gold>"
size: 54
xp-boosts:
slots: [10, 11, 12, 13, 14, 15, 16]
item:
material: EXPERIENCE_BOTTLE
display-name: "<white>XP Boost <gold>{boost_id}</gold></white>"
money-boosts:
slots: [28, 29, 30, 31, 32, 33, 34]
item:
material: GOLD_INGOT
display-name: "<white>Money Boost <gold>{boost_id}</gold></white>"
sounds:
open:
sound: ENTITY_EXPERIENCE_ORB_PICKUP
volume: 0.5
remove-boost:
sound: ENTITY_EXPERIENCE_ORB_PICKUP
volume: 0.7
🎨 Available Variables
{boost_id},{player_name},{job_info},{action_info}{multiplier},{remaining_time},{xp_count},{money_count},{total_count}
💰 Enhanced Reward Configuration
# rewards/example_rewards.yml
rewards:
milestone_100:
name: "<gradient:#FFD700:#FFA500>Century Milestone</gradient>"
required-level: 100
gui-slot: 4
requirements:
logic: "AND"
level_check:
placeholder: "%universejobs_player_level%"
operator: "greater_equal"
value: "100"
deny:
message: "<#FF6B6B>❌ Requirements not met"
sound: "BLOCK_ANVIL_LAND"
accept:
message: "<gradient:#32CD32:#FFD700>🎉 ACHIEVED! 🎉</gradient>"
sound: "UI_TOAST_CHALLENGE_COMPLETE"
items:
nexo_item:
nexo-id: "custom_hammer"
itemsadder_item:
itemsadder-id: "magic_sword"
economy-reward: 10000
commands:
- "lp user %player_name% permission set jobs.master true"
🛠️ Boost Calculation Configuration
📝 In config.yml
jobs:
# Boost Calculation Mode
# ADDITIVE: Multipliers are added together (2.5x + 2.5x = 5.0x)
# MULTIPLICATIVE: Multipliers are multiplied (2.5x * 2.5x = 6.25x)
# HIGHEST: Only the highest multiplier is used (3.0x, 2.5x = 3.0x)
boost-calculation-mode: MULTIPLICATIVE
💡 Calculation Examples
ADDITIVE Mode
Boost 1: 1.5x (+0.5)
Boost 2: 2.0x (+1.0)
Total: 1.0 + 0.5 + 1.0 = 2.5x
MULTIPLICATIVE Mode (default)
Boost 1: 1.5x
Boost 2: 2.0x
Total: 1.5 × 2.0 = 3.0x
HIGHEST Mode
Boost 1: 1.5x
Boost 2: 2.0x ← Used
Total: 2.0x (highest)
🔑 Permission-based Bonus Multipliers
- Hierarchical permission system for bonus multipliers
- Automatic calculation based on player permissions
- Configurable multiplier values per permission level
🔧 Database Configuration
# config.yml
database:
enabled: true
type: "mysql" # or "sqlite"
mysql:
host: "localhost"
database: "universejobs"
username: "user"
password: "password"
connection-pool:
maximum-pool-size: 10
connection-timeout: 30000
🐛 Bug Fixes
🔒 Security Fixes
- Eliminated all regex DoS vulnerabilities
- Enhanced input sanitization for commands
- NBT-based tracking for improved data integrity
🔧 Technical Fixes
- Fixed shutdown race conditions preventing data saving
- Resolved BossBar duplication and freezing problems
- Fixed placeholder processing in reward commands
- Corrected GUI navigation and status display
- Missing messages
⚡ Performance Improvements
- Optimized BossBar management with synchronization
- Enhanced connection pooling for database operations
🌍 Language Files
Added missing reward messages in languages/en_US.yml:
rewards.claim.success/failed/already-claimed/requirements-not-met/cooldownrewards.gui.job-not-found/no-rewards/no-available-rewards
🗂️ New Files
gui/example_rewards_gui.yml- Customizable reward GUI templaterewards/example_rewards.yml- Comprehensive reward examples- Enhanced database configuration in
config.yml
🚪 Usage
🎮 For Players
# View rewards GUI
/jobs rewards open [job_name]
# Check job info
/jobs info
👑 For Administrators
Boost Management
# Open boost management GUI
/jobs admin boost info
# Give boosts
/jobs admin boost give xp * * * 2.0 3600
/jobs admin boost give money Player123 miner * 1.5 1800
# Remove boosts via command
/jobs admin boost remove boost_id_001
# Or right-click in GUI to remove
Database Management
# Migrate to database
/jobs admin database migrate
/jobs admin database status
Configuration
# Reload configurations
/jobs admin reload
/jobs admin reload menus
Job Configuration
# jobs/example.yml
rewards: "example_rewards"
gui-reward: "example_rewards_gui"
# config.yml
jobs:
boost-calculation-mode: MULTIPLICATIVE
🔒 Permissions
| Permission | Description |
|---|---|
universejobs.admin.boost |
Full access to boost system (GUI + commands) |
universejobs.admin.boost.* |
Access to all admin boost features |
universejobs.admin.reload |
Reload configurations |
universejobs.multiplier.<exp/money/others>.<number> |
Bonus multiplier permissions (hierarchical) |
Thank you for using UniverseJobs!
Block Protection System
- Added
block-protection.enabledin config.yml to prevent XP farming from player-placed blocks
Language Files
- Added missing reward messages in fr_FR.yml and en_US.yml:
rewards.claim.already-claimedrewards.claim.no-jobrewards.claim.level-requirementrewards.claim.no-permissionrewards.claim.requirements-not-metrewards.claim.cooldownrewards.gui.job-not-foundrewards.gui.no-rewardsrewards.gui.no-available-rewards
Placeholders
- Added BoostPlaceholder for PlaceholderAPI
- Standardized placeholder identifier to "universejobs"
🐛 Bug Fixes
- Removed unused furnace blacklist check in JobActionListener
✨ Major Features
🎮 GUI System for Boost Management
- Interactive GUI for
/jobs admin boost inforeplacing text display - Auto-refresh every second
- Right-click to remove boosts directly from GUI
- Automatic sorting by boost launch order
- 100% configurable via
menus/boost-manager.yml
🔢 Bonus Calculation Mode System
Three calculation modes available in config.yml:
- ADDITIVE:
2.5x + 2.5x = 5.0x(addition) - MULTIPLICATIVE:
2.5x × 2.5x = 6.25x(multiplication - current default) - HIGHEST:
3.0x, 2.5x = 3.0x(only the best boost)
🎯 Boost Manager GUI Features
📋 User Interface
- Experience bottles for XP boosts
- Gold ingots for Money boosts
- Navigation items: close, refresh, information
- Customizable decorative items
- Configurable sound effects
⚙️ Complete Configuration
# Example configuration in menus/boost-manager.yml
title: "<gold><b>Boost Manager</b></gold>"
size: 54
xp-boosts:
slots: [10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25]
item:
material: EXPERIENCE_BOTTLE
display-name: "<white>XP Boost <gold>{boost_id}</gold></white>"
glow: false
money-boosts:
slots: [28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43]
item:
material: GOLD_INGOT
display-name: "<white>Money Boost <gold>{boost_id}</gold></white>"
🎨 Available Variables
{boost_id}: Unique boost ID{player_name}: Player name or "All Players"{job_info}: Targeted job or "All Jobs"{action_info}: Targeted action or "All Actions"{multiplier}: Multiplier (e.g., 2.5){remaining_time}: Formatted remaining time{xp_count}: Number of active XP boosts{money_count}: Number of active Money boosts{total_count}: Total active boosts
🛠️ Calculation Mode Configuration
📝 In config.yml
jobs:
# Boost Calculation Mode
# ADDITIVE: Multipliers are added together (2.5x + 2.5x = 5.0x)
# MULTIPLICATIVE: Multipliers are multiplied (2.5x * 2.5x = 6.25x)
# HIGHEST: Only the highest multiplier is used (3.0x, 2.5x = 3.0x)
boost-calculation-mode: MULTIPLICATIVE
💡 Calculation Examples
ADDITIVE Mode
Boost 1: 1.5x (+0.5)
Boost 2: 2.0x (+1.0)
Boost 3: 1.3x (+0.3)
Total: 1.0 + 0.5 + 1.0 + 0.3 = 2.8x
MULTIPLICATIVE Mode (default)
Boost 1: 1.5x
Boost 2: 2.0x
Boost 3: 1.3x
Total: 1.5 × 2.0 × 1.3 = 3.9x
HIGHEST Mode
Boost 1: 1.5x
Boost 2: 2.0x ← Used
Boost 3: 1.3x
Total: 2.0x (highest)
🎵 Configurable Sound System
sounds:
open:
enabled: true
sound: ENTITY_EXPERIENCE_ORB_PICKUP
volume: 0.5
pitch: 1.0
remove-boost:
enabled: true
sound: ENTITY_EXPERIENCE_ORB_PICKUP
volume: 0.7
pitch: 1.5
close:
enabled: true
sound: UI_BUTTON_CLICK
volume: 0.5
pitch: 1.0
🌍 Integrated Language System
📁 Messages in languages/en_US.yml
# Boost GUI messages
boost-gui:
removed: "<green>Removed {type} boost: <gold>{boost_id}</gold></green>"
no-permission: "<red>You don't have permission to do that!</red>"
refresh-clicked: "<aqua>Refreshing boost list...</aqua>"
🚪 Usage Examples
🎮 For Players
# Open boost management GUI (admin)
/jobs admin boost info
👑 For Administrators
Give boosts
# Global XP boost for all players
/jobs admin boost give xp * * * 2.0 3600
# Specific Money boost for a player and job
/jobs admin boost give money Player123 miner * 1.5 1800
# XP boost for specific action
/jobs admin boost give xp * * BREAK stone 2.5 7200
Remove boosts
# Via command
/jobs admin boost remove xp_boost_001
# Via GUI: Right-click on boost item
Change calculation mode
# In config.yml
jobs:
boost-calculation-mode: ADDITIVE # or MULTIPLICATIVE or HIGHEST
🔧 Advanced Customization
🎨 Custom Navigation Items
navigation:
close:
enabled: true
slots: [49]
material: BARRIER
display-name: "<red>Close</red>"
glow: false
refresh:
enabled: true
slots: [45]
material: CLOCK
display-name: "<aqua>Refresh</aqua>"
glow: true
info:
enabled: true
slots: [53]
material: BOOK
display-name: "<yellow>Information</yellow>"
lore:
- "<gray>Active XP Boosts: <green>{xp_count}</green>"
- "<gray>Active Money Boosts: <gold>{money_count}</gold>"
- "<gray>Total Boosts: <white>{total_count}</white>"
🎭 Decorative Items
custom-items:
separator-xp:
enabled: true
slots: [9, 18, 27, 36]
material: BLACK_STAINED_GLASS_PANE
display-name: "<dark_gray>▼ XP Boosts ▼</dark_gray>"
separator-money:
enabled: true
slots: [17, 26, 35, 44]
material: BLACK_STAINED_GLASS_PANE
display-name: "<dark_gray>▼ Money Boosts ▼</dark_gray>"
🔒 Permissions
| Permission | Description |
|---|---|
universejobs.admin.boost |
Full access to boost system (GUI + commands) |
universejobs.admin.boost.* |
Access to all admin features |
🐛 Technical Fixes and Improvements
🔒 Critical Security Fixes
- Complete elimination of regex DoS vulnerabilities in XpMessageSettings
- Replaced
replaceFirst()with secure loops - Protection against regex backtracking attacks
- Replaced
- AdminJobCommandHandler refactoring to eliminate security flaws
- Extracted common logic
handleForceJobAction() - Fixed regex vulnerabilities in number formatting
- Extracted common logic
⚡ Performance Optimizations
- Complete furnace tracking refactor (commit
54ea607)- Persistent NBT replaces in-memory Map system
- 60% reduction in memory usage for tracking
- Automatic cleanup of expired NBT data
- Utility methods for furnace type detection
- Improved memory management for GUIs with automatic cleanup
🛡️ Secure Architecture
- InventoryHolder pattern for anti-exploit protection
- Centralized management of GUIs in MenuManager
- Secure validation of click interactions
🎯 UX Improvements
- Intuitive graphical interface with specialized visual icons
- Configurable sound feedback for each action
- Contextual multilingual messages
- Configurable auto-refresh for GUI
⚙️ Optional Manual Configuration
- Modify calculation mode in
config.yml - Customize GUI in
menus/boost-manager.yml - Adapt messages in
languages/
Thank you for using UniverseJobs!
🎉 Major New Features
🎮 New Job Actions
MILK Action (Milking cows/goats)
- New action to reward milking cows and goats
- Automatic bucket detection in player's hand
- Priority over ENTITY_INTERACT to avoid conflicts
MILK:
milk_cow:
target: "COW"
xp: 5
money: 2.5
milk_goat:
target: "GOAT"
xp: 3
money: 1.5
BREW Action (Brewing)
- Full support for brewed potions
- Brewing stand tracking per player
- Custom and vanilla potion detection
BREW:
brew_strength_potion:
target: "POTION"
potion-type: "STRENGTH:1"
xp: 15
money: 10
brew_any_potion:
target: "POTION"
xp: 10
money: 5
TAME Action (Animal Taming)
- Rewards for taming animals
- Support for all tameable animal types
TAME:
tame_wolf:
target: "WOLF"
xp: 20
money: 15
tame_horse:
target: "HORSE"
xp: 30
money: 25
🔥 Extended SMELT Support
Blast Furnace and Smoker
- Full support for blast furnaces and smokers
- Configurable blacklist system per action
- Separate tracking for each furnace type
SMELT:
iron_smelting:
target: "IRON_INGOT"
xp: 10
money: 5
blacklisted-furnaces:
- "BLAST_FURNACE" # Prevents XP from blast furnaces
- "SMOKER" # Prevents XP from smokers
food_cooking:
target: "COOKED_BEEF"
xp: 5
money: 2
# No blacklist = all furnace types accepted
⚔️ Enhanced ENCHANT Actions
Enchantment Level Validation
- Support for specific levels and ranges
- Silent cumulative messages to avoid spam
- Flexible required level configuration
ENCHANT:
low_level_enchant:
target: "sharpness"
enchant-level: "1-3" # Levels 1 to 3
xp: 10
money: 5
high_level_enchant:
target: "sharpness"
enchant-level: "4-5" # Levels 4 and 5
xp: 30
money: 20
suppress_message: true # Avoids message spam
specific_level:
target: "protection"
enchant-level: "5" # Exactly level 5
xp: 50
money: 35
🎨 Modernized GUI
New Green-Yellow Design
- Consistent color palette (#FFD700 for gold, #abffb3 for green)
- Full MiniMessage support with HEX colors
- Clean and modern design
Actions/Rewards Separation
- Separate menus for actions and rewards
- Intuitive navigation with dedicated buttons
- Flexible slot configuration
# job-menu.yml
menu-items:
actions-button:
material: DIAMOND_SWORD
display-name: "<#32CD32><bold>View Actions</bold>"
hideToolTip: true
action: "menu:job-actions"
slots: [12]
rewards-button:
material: GOLD_INGOT
display-name: "<#FFD700><bold>View Rewards</bold>"
action: "menu:job-rewards"
slots: [14]
fill-items:
glass:
material: GREEN_STAINED_GLASS_PANE
display-name: " "
hideToolTip: true
slots: [0, 1, 2, 6, 7, 8, 9, 17, 18, 26, 27, 35]
📊 Customizable Progress Bar System
# config.yml
progress-bar:
length: 20
characters:
completed: "█"
remaining: "░"
colors:
completed: "<#32CD32>"
remaining: "<#404040>"
percentage: "<#FFD700>"
format:
with-percentage: "{completed_bar}{remaining_bar} {percentage_color}{percentage}%"
💬 Advanced XP Messages
Decimal Support
- Correct display of decimal values (0.5 XP, 2.75 money)
- Smart formatting without unnecessary zeros
Custom Messages per Job
xp-message:
type: "ACTIONBAR"
text: "{message_xp} {message_money} <gray>({job})"
xp: "<#abffb3>+{xp} XP"
money: "<#FFD700>+{money}$"
options:
duration: 60
tick: 20
🛠️ New Admin Commands
/jobs admin givecustom
Give XP and money with custom message display
/jobs admin givecustom <player> <job> <exp> <money>
🐛 Bug Fixes
Major Fixes
- Fix ENTITY_INTERACT vs MILK: MILK now has priority over ENTITY_INTERACT
- Fix Debug Mode: Perfect synchronization between debug and fast mode
- Fix Action Cache: Cache separation by ActionType to avoid mixing
- Fix Enchantment Messages: Silent accumulation to avoid spam
- Fix XP Decimals: Correct display of decimal values
Optimizations
- Performance: 40% faster action processing
- Cache: Smart caching system by ActionType
- Validation: Ultra-fast condition validation
📝 Complete Configuration Examples
Modern Farmer Job
farmer:
name: "Farmer"
description: "Farm and breed to earn XP"
enabled: true
actions:
HARVEST:
wheat_harvest:
target: "WHEAT"
xp: 5
money: 2.5
BREED:
breed_cow:
target: "COW"
xp: 10
money: 5
MILK:
milk_cow:
target: "COW"
xp: 3
money: 1.5
SHEAR:
shear_sheep:
target: "SHEEP"
color: ["WHITE", "BLACK", "GRAY"]
xp: 5
money: 2
Enchanter Job
enchanter:
name: "Enchanter"
description: "Master the art of enchantments"
actions:
ENCHANT:
beginner_enchant:
target: "sharpness"
enchant-level: "1-2"
xp: 10
money: 5
expert_enchant:
target: "sharpness"
enchant-level: "3-5"
xp: 25
money: 15
suppress_message: true
BREW:
brew_strength:
target: "POTION"
potion-type: "STRENGTH:2"
xp: 20
money: 10
Blacksmith Job with Blacklist
blacksmith:
name: "Blacksmith"
description: "Smelt and forge metals"
actions:
SMELT:
iron_traditional:
target: "IRON_INGOT"
xp: 10
money: 5
blacklisted-furnaces:
- "BLAST_FURNACE" # Traditional furnace only
gold_modern:
target: "GOLD_INGOT"
xp: 15
money: 8
blacklisted-furnaces:
- "FURNACE" # Blast furnace only
- "SMOKER"
🔧 Migration from v0.2.x
Actions to Update
- Check your ENCHANT actions to add
enchant-levelif needed - Add
suppress_message: trueto avoid spam on multiple enchantments - Configure
blacklisted-furnacesfor your SMELT actions if needed - Update your colors to MiniMessage HEX format
New Permissions
universejobs.admin.givecustom- For givecustom commanduniversejobs.admin.validateconfig- To validate configuration
📋 Important Notes
- Compatibility: Bukkit/Spigot/Paper/Folia 1.20+
- Optional Dependencies: Vault (economy), MythicMobs, CustomCrops, ItemsAdder, Nexo
- Performance: Significant improvement, recommended for 100+ player servers
🚀 Coming Soon
- More Detailed docs
- Developer API
- Extended PlaceholderAPI support
Thank you for using UniverseJobs!
New Features & Improvements
Refactored Job Icon Handling
- Replaced the old
iconfield with iconMaterial and customModelData for clearer, more flexible job icons. - Menus now use these new fields for consistent item representation.
- Backward compatibility maintained with the old
getIconmethod (butgetIconMaterialis recommended). - Example configurations updated to include custom model data support.
Menu Configuration Reload
- Added the ability to reload menu configurations via the admin command.
- No server restart required – changes apply instantly.
- Clear feedback for successful reloads or error messages.
Job Item Configuration & Display
- Introduced a new JobItemFormat system for item appearance (name, lore, attributes).
SingleMenuConfignow loads job item formats from config for full customization.JobsMainMenuupdated to use this system, making job items more clear and customizable.- Added placeholders for progress and job information for a richer experience.
Job Actions Customization
- Added displayName and lore fields to
JobActionfor improved action display. SingleMenuConfignow supports action item format.JobActionsMenuuses these fields for dynamic display in menus.- Example configurations updated with new customization options.
MaterialUtils Enhancements
- Improved case-insensitive handling for materials and entities.
- Updated methods ensure robust input handling (trimming whitespace, safe splits).
- Better documentation and clearer handling of target/entity names.
Configuration Examples
actions-menu.yml
action-item-format:
lore_bonus:
- ""
- "&7Rewards:"
- "&8├ &7XP: &a+{action_xp}"
- "&8└ &7Money: &6${action_money}"
- ""
- "&7Requirements: {action_requirements}"
# Item settings
amount: 1
glow: false
hide-attributes: true
hide-enchants: true
your job file.yml
icon:
material: "DIAMOND_PICKAXE"
custom-model-data: ""
actions:
BREAK:
simple_stone:
target: "STONE" # Block to break
display-name: "Break a stone" # Display name in actions menu
lore:
- "Break a stone to earn a reward" # Lore shown in actions menu
xp: 1.0 # XP earned
money: 3.0 # Money earned (optional)
New Features
- Added an interactive menu system for jobs
- Four new menus:
- Main job browser
- Detailed job view
- Job actions & rewards
- Global rankings
- Fully customizable via YAML
- Support for MiniMessage and PlaceholderAPI for dynamic display
Fixes
- Adjusted XP calculation for better consistency



