❗️ IMPORTANT: Update recommended for all servers to prevent playtime data inconsistency. ❗️
Bug Fixes
- Fixed playtime data not being saved when players disconnect from the server. This could result in up to 5 minutes of playtime loss per session. Thanks to @Cr4zyGeek for finding this critical bug.
❗️The plugin remains fully compatible with data from version 3.0.4 and earlier. Before making any modifications, a backup is automatically created, ensuring a seamless and secure migration to the latest version without data loss. ❗️
New Features & Improvements
New support for custom playtime formats
Introduced a comprehensive playtime format system enabling the possibility to create personalized time display formats through YAML configuration files stored in the Customization/PlaytimeFormats
directory.
The system supports both internal plugin placeholders and PlaceholderAPI (PAPI) placeholders by appending the custom format name after a colon (e.g., %PLAYTIME:custom%
or %PTM_playtime:custom%
) at the end of the placeholders.
The system features automatic zero-value hiding and singular/plural unit selection, it also provides configurable labels for all time units with advanced formatting options using time value and unit label placeholders. For more info, take a look at the new wiki page!
New /playtimereset subcommands
Enhanced the /playtime <target> reset
command with expanded reset options providing more granular control over player data management. The updated system replaces the previous limited parameters (all
, db
, stats
, joinstreak
) with a comprehensive set of specific reset types, allowing you to target exact data components without affecting unrelated information.
New reset types:
server_playtime
- Resets only server statistics (PLAY_ONE_MINUTE)playtime
- Resets database playtime records (artificial and actual)last_seen
/first_join
- Individual timestamp data managementjoinstreak
: Resets both absolute and relative join streak recordsjoinstreak_rewards
- Resets reward progress and tracking separately from streak countsgoals
- Targets completed goals data specificallyeverything
- Complete reset (replaces oldall
parameter) with clearer scope definition
New /playtimeattribute command
Added a new /playtimeattribute <attribute> [true|false]
command (alias: /ptattr
) for managing internal player attributes within PlayTimeManager.
- Requires the permission with
playtime.others.attributes
- Currenlty only 1 attribute supported as argument:
hidefromleaderboard
- Directly modifies a new config field:
placeholders.playtime-leaderboard-blacklist
Folders organization and configs updater
The "Translations" folder has been renamed to "Customizations" to better reflect its expanded purpose beyond just language files.
- Relocated command messages -
playtime-self-message
andplaytime-others-message
moved from main config toCustomizations/Commands/commands-config.yml
Completely rewritten config file versioning system for better performance and usability, now before updating the updater will create a complete backups of the entire PlayTimeManager folder instead of database-only entries.
More caching!
Enhanced performance through the implementation of a dedicated cache system for commands and GUIs configuration files. This optimization reduces file I/O operations by storing frequently accessed configuration data in memory, resulting in less server overhead.
Bug Fixes
- Fixed
not-in-leaderboard-message
: now if a player isn't in the leaderboard the correct config message is displayed whe usingPTM_rank
PAPI placeholder. - Fixed playtime leaderboard player hiding mechanism: replaced permission-based system with a config-based one. See
/playtimeattribute
command in the wiki for more info.
❗️The plugin remains fully compatible with data from version 3.0.4 and earlier. Before making any modifications, a backup is automatically created, ensuring a seamless and secure migration to the latest version without data loss. ❗️
New Features & Improvements
New leaderboard permission
Introduced the playtime.hidefromleaderboard
permission:
- Players with this permission will not be displayed on the playtime leaderboard
- Hidden players are automatically replaced by the next player in playtime ranking
- Note: Requires LuckPerms to be installed for this feature to function
New placeholders
Added new placeholders to enhance your server's information display:
%PTM_rank%
and%PTM_rank_<nickname>%
– Display the current leaderboard position of the specified player. If the player is not on the leaderboard, a customizable message will be shown instead, as defined in theplaceholder.not-in-leaderboard-message
field of the config.yml file.%PTM_firstjoin%
and%PTM_firstjoin_<nickname>%
– Show the first join date of the specified player. The date is formatted according to the date-time format configured in the config.yml.
New option to avoid the automatic plugin update check
Added a new configuration option to control automatic plugin update checking:
check-for-updates
– Toggle automatic update checks on server startup
Particularly useful for versions that can't be upgraded due to dropped support for older Minecraft versions
New wiki section for common issues
Created a troubleshooting section to help server administrator. It contains step-by-step solutions when the intended methods fail. Currently there's 1 issue:
- Chat-Based Input System Issues – Documented known compatibility problems with plugins that intercept chat events
New subcommand for /playtimegoal command
Enhanced the /playtimegoal
command with a new creation subcommand:
/playtimegoal create <goal_name>
– Create new goals directly via command line- Provides an alternative method for goal creation when GUI-based input systems are not functioning
- Files can be manually edited in the
plugins/PlayTimeManager/goals/
directory after creation
Plugin optimization and stability improvements
- Reduced file size by 50% – The JAR file has been significantly optimized and is now half the size of the previous version
- Improved dependency management – All dependencies are now correctly shaded into the plugin to prevent conflicts with other plugins on your server
❗️The plugin remains fully compatible with data from version 3.0.4 and earlier. Before making any modifications, a backup is automatically created, ensuring a seamless and secure migration to the latest version without data loss. ❗️
New Features & Improvements
New goals requirements
Goals can now have customizable requirements that must be met to achieve them. A new "Requirements" section in the goals settings GUI allows you to configure:
- Time requirement - Previously mandatory, now optional and can be set to none
- Permission requirements - Set group or single permissions (e.g., group.newbie) that players must have
- Placeholder conditions - Create boolean conditions using PAPI placeholders from this plugin or others, supporting operators:
==
,!=
,>
,<
,>=
,<=
. Includes specialPLAYER_NAME
placeholder for player-specific comparisons (e.g., %PTM_nickname_top_1% ==PLAYER_NAME
for leaderboard-based goals)
All configured requirements must be satisfied simultaneously to receive the reward.
New GUI sections for goals and join streaks rewards
Goals GUI has been redesigned with significant improvements:
- Removed Anvil-based GUIs - Replaced with more customizable chat-based input systems
- New goal creation method - Removed
/playtimegoal set
subcommand in favor of a "Create New Goal" button directly in the GUI for easier access
For both goals and join streak GUIs:
- Reorganized rewards section - Previous permissions and commands have been moved to a dedicated "Rewards" section within the goal/join streak reward settings GUI for better organization
Negative playtime values reverted
The restriction on negative playtime values has been removed. Players can now have their playtime reduced below 0 using the /playtime remove command, with values going as low as -Long.MAX()
value for maximum flexibility in playtime management.
New translation options
Added new customizable message configurations for playtimetop command, namely:
- Permission denied messages - Custom message when players lack command permissions
- Page navigation messages - Error messages for invalid page numbers and non-existent pages
- Argument validation - Custom message for invalid command arguments
- Player data messages - Messages for when no players have joined and data loading errors
These lines will be automatically added into your Translations/Commands/commands-config.yml
without interfering with previous values of other fields.
New playtimejoinstreak set subcommand
A new set
subcommand for /playtimejoinstreak
has been added, syntax:
/playtimejoinstreak set <playername>|* <value>
This will set the target player's relative join streak to the specified value.
Bug Fixes
- /playtime
remove
subcommand now removes playtime correctly - /playtime reset
all
subcommand now resets every database record as intended.
❗️The plugin remains fully compatible with data from version 3.0.4 and earlier. Before making any modifications, a backup is automatically created, ensuring a seamless and secure migration to the latest version without data loss. ❗️
New Features & Improvements
Rewards based on join streaks are here!
Players can now earn custom rewards by logging in across configurable time windows — whether daily, weekly, or any schedule you define using cron expressions. This join streak system supports looping reward cycles and lets you attach messages, commands, sounds, permission grants, and GUI icons to each reward milestone.
📘 Everything you need to get started — including setup instructions, configuration tips, and a ready-to-use 30-day template — can be found here.
New commands and permissions
-
/playtimejoinstreak
-> Opens the join streak rewards management GUI, requires the permissionplaytime.joinstreak
-
/playtimejoinstreak seeplayer <playername>
-> Opens the same visual GUI as/claimrewards
, but viewed from the perspective of the target player. This GUI is read-only when viewing another player’s rewards. Admins cannot claim or modify rewards through this interface. It requires the permissionplaytime.joinstreak.seeplayer
-
/claimrewards
-> Opens the GUI to claim available rewards, requires the permissionplaytime.joinstreak.claim
, which is enabled by default.
Alternatively, players with theplaytime.joinstreak.claim.automatic
permission will automatically receive their rewards without needing to use the command.
New Placeholders
-
%PTM_joinstreak%
-> Displays the current player's absolute join streak -
%PTM_joinstreak_<nickname>%
-> Displays the absolute join streak for a specific player
New aliases for commands
New aliases for commands are avalable:
/playtimeaverage
->/ptavg
/playtimepercentage
->/ptpercent
/playtimetop
->/pttop
/playtimegoal
->/ptgoal
/playtimereload
->/ptreload
/playtimebackup
->/ptbkp
/playtimejoinstreak
->/ptjsk
Both complete commands and relative aliases are present in tab completion.
New translations options
This is part of the full-customization process this plugin aims to achieve. A new folder has been created called Translations
this currently contains 2 sub folders:
Commands
-> This contains a config which will be used to translate commands output of the plugin.GUIs
-> This contains a config which will be used to to translate each player-facing GUIs of the plugin.
This is the first step, more will come in the future.
New option in playtime reset command
Now you can reset player's join streaks with:
playtime <playername>|* reset joinstreak
-> this will reset both absolute and relative join streak of the specified player.
New custom chat input system
A new system to get input from users in terms of messages sent has been put in place. This was necessary to setup certain parameters for join streak rewards and it also benefits goal as well!
Bug Fixes
- Fixed wrong visualization of refresh rate in console.
- Various wrong instructions corrected in config files.
- Fixed spam of errors when updating from 3.0.4 to newer versions.
❗️The plugin remains fully compatible with data from version 3.0.4 and earlier. Before making any modifications, a backup is automatically created, ensuring a seamless and secure migration to the latest version without data loss. ❗️
New Features & Improvements
New version supported
Added support for version 1.19!
Asynchronous optimizations
Database-related background tasks are now executed asynchronously to prevent potential server slowdowns caused by database delays.
Goals
- Sounds can now be played directly in-game by right-clicking the corresponding icon in the goal settings GUI.
- Goal renaming and deletion processes have been optimized using asynchronous methods.
- Players now receive dedicated chat feedback when renaming or deleting goals to confirm the operation's completion.
Recoded reset command
The /playtime <playername> reset
command has been completely rewritten and now includes three subcommands for more precise usage:
all
: Resets both the database records and the server's playtime statistics.db
: Resets only the database records, including:- Total playtime (both artificial and actual)
- Achieved goals
- First join and last seen data
stats
: Resets only the server'splay_one_minute
statistic, stored in the world’s stats folder.
A new permission, playtime.others.modify.all
, is required to use the wildcard *
, which resets playtime for all users in the database.
A safe-reset system has also been introduced—when using the *
wildcard for a reset, the plugin now prompts the user to confirm by sending the command a second time.
New backup command
A manual database backup can now be triggered with the command /playtime backup
, which requires the playtime.backup
permission.
Bug Fixes
- Fixed the sound-playing system to prevent errors when changing goal sounds in the config and reloading the plugin.
- Resolved an issue where verbose messages still appeared despite
goal-check-verbose
being set tofalse
. - Online players' achieved goals now update correctly during goal renaming or deletion.
Previously, renamed goals could not be uncompleted for players who were online during the renaming process.
- Fixed color formatting in the console.
- Adjusted the order of command property checks.
Permission checks now occur before verifying user existence.
Luck
New Features & Improvements
New placeholders
Added new placeholders for converting formatted playtime into a specific time unit:
%PTM_playtime_#_<nickname>%
%PTM_lastseen_elapsed_#_<nickname>%
%PTM_playtime_top_#_<rank>%
%PTM_lastseen_elapsed_top_#_<rank>%
And a new placeholder to display a player’s LuckPerms prefix in the leaderboard:
%PTM_lp_prefix_top_<rank>%
Available time units (#
): s (seconds), m (minutes), h (hours), d (days), y (years)
Hex colours
Support for hex colours has been added with the following format: &#rrggbb. Mixing legacy colours (e.g. &6), styles (e.g. &l) and hex colours is supported, an example:
&lὀFF[	B00E6M&#B200D9e&#C600CCm&#D900BFb&#EC00BFe&#FF00B3r]
→ Displays “[Member]” in bold and gradient hex colours.
New customization options in the config.yml
prefix
: This will set the custom prefix that will appear before all messages generated by the PlayTimeManager pluginplaytimetop.leaderboard-format
: This will set the format for each line in the chat leaderboard.- Available placeholders:
%POSITION%
- Player's position in the leaderboard (1, 2, 3, etc.)%PREFIX%
- Player's prefix from LuckPerms%PLAYER_NAME%
- Player's username%PLAYTIME%
- Player's total playtime formatted
placeholders.enable-errors
: If enabled, errors in placeholders will be displayed otherwise the text indefault-message
will be shown instead of error messagesplaceholders.default-message
: The default message to display whenenable-errors
is set to false.- A new placeholder
%PREFIX%
is available forplaytime-self-message
andplaytime-others-message
and, if used, will display the LuckPerms prefix of the specified player.
First join date
Added tracking of players' first server join dates. The system will now automatically record when new players join for the first time. For existing players in the database who joined before this update, their first join date will be set when they next connect to the server after the update is installed.
Playtime <playername> stats
/playtime <playername> lastseen
has been replaced with /playtime <playername> stats
and requires the permission playtime.others.stats
.
Now upon execution this command will display:
- Playtime
- Artificial playtime (modified with add/remove subcommands)
- Join date
- Last seen date
- Time elapsed since last seen date
- Goals achieved
of the specified player.
Playtimetop
Playtimetop is now completely customizable through config.yml, making it more adapt to be shown to players. Now it is no longer needed to specify the number of players to load, as 100 will be default.
Pages are optional and clickable (and hoverable) arrows have been added in chat to scroll the entire leaderboard.
The command has also been optimized.
Playtimepercentage
PlaytimePercentage now supports second and years, furthermore multiple time formats as input is now accepted (e.g. 1y,2m,3s).
Bug Fixes
Fixed the display of a text-wall of attributes when clicking on the barrier of /playtimegoal
’s GUI when no goals exist.
Fixed sound execution upon goal completion for version 1.20
Fixed /playtime * reset
command which was refusing to execute when specifying *
Fixed crash when resetting players data