❗️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