Описание
# AfkPlus Fabric Mod for Minecraft
[](https://github.com/sakura-ryoko/afkplus/actions/workflows/gradle.yml)

[](https://discord.gg/ryokocraftmc)
## Basic Description:
- A forked project based upon AfkDisplay by beabfc. He has given me his blessing with proceeding to create this mod, look under my Archived Issues pane.
- Show which players are AFK in the player list, see the Reasons, Durations, and Times.
- Fully configurable and with [Placeholder API](https://placeholders.pb4.eu/user/general/), which includes all Placeholder API formatting nodes such as: yellow or bold natively. (You can even include a URL in your AFK Reason!)
- Mod can now be used on Single Player, and Integrated Servers (Open to LAN).
- [**NEW**] Mod has now been mostly rewritten as of December 2024; as a MultiVersion project based on [Fallen-Breath's Template Mod](https://github.com/Fallen-Breath/fabric-mod-template) architecture.
- [**NEW**] Mod Now is a dependency of my new library mod, [CoreLib](https://github.com/sakura-ryoko/corelib), and the More Color system has also been forked into my [More Color API](https://github.com/sakura-ryoko/more-color-api) mod.
- They are both included in the AfkPlus JAR file.
## MOD ReWrite & NEW Features
- Entire mod ecosystem has been migrated to a multi-version architecture to more quickly port the mod to versions 1.19.2-1.21.4+ at the same time, using a single branch.
- Config no longer uses TOML, and has been converted to the Data Driven [CoreLib](https://github.com/sakura-ryoko/corelib) based JSON config system; which works similar to how Pat's Mod ecosystem works.
- Most Player / Server Events are now managed by [CoreLib](https://github.com/sakura-ryoko/corelib) interfaces; with a few AFK Specific exceptions.
- All Commands are now registered and managed by a [CoreLib](https://github.com/sakura-ryoko/corelib) interface.
- All abstract Text Placeholder API formatting, and extra color tags are now managed by [More Color API](https://github.com/sakura-ryoko/more-color-api). See the `/morecolors` command.
- All new abstract TimeDate / Duration formatting interfaces are managed by [CoreLib](https://github.com/sakura-ryoko/corelib).
- Entirely rewritten AfkPlayer / Afk Player List system based on abstraction; instead of being managed via Mixin classes. This should help with any strict mod compatibility issues; and fight off ugly code.
- Entire mod EcoSystem from CoreLib to AfkPlus each has an API / Event system for other mods to implement and make compatible in their own mods.
- AfkPlus adds API compat handling for `Vanish`, `Carpet Mod`, and `Styled Player List`. Each mod's integration varies based on any compatibility needs.
- Added several `message` options, and forked the `afkKick` and `disableDamage` systems into their own configuration categories. See the config below for more defaulted information.
- Several other annoyances, bugs, and features have been added as requested; such as the ability to fully configure the `Gone for: XXX` messages by various config options.
## Features
- Added a placeholder `%afkplus:afk%` for you to offer a very basic '**[AFK]**' tag to players who are AFK.
- Added a placeholder `%afkplus:name%`/`%afkplus:display_name%` so that you can use this as a replacement for the '**%player:displayname%**' placeholder under other Mods, such as [Styled Playerlist](https://modrinth.com/mod/styledplayerlist "Styled Playerlist").
***NOTE that this method was designed to be fully compliant with LuckPerms Prefixes under Styled Playerlist, because the standard method for playerlist updating fails, or you can simply use %afkplus:afk% to add formatting to existing names if you like.***
- Added a placeholder `%afkplus:duration%` so that you can get the time since someone went AFK, with configuration for a format prefix.
- Added a placeholder `%afkplus:time%` so that you can get the Time/Date when someone went AFK, with configuration for a format prefix.
- Added a placeholder `%afkplus:reason%` so that you can port the Afk Reason for why someone went AFK, with configuration for a format prefix.
- Added a placeholder `%afkplus:invulnerable%` so that you can display the "Disable Damage" status for all users, similar to the "[AFK]" placeholder tag, but more or less an "add on".
- There is a special configuration option 'prettyDuration' to configure the AFK Duration in a more human-readable format, instead of the default (HH:mm:ss.mss) format. Each method has its advantages though. ([Styled Nicknames](https://modrinth.com/mod/styled-nicknames) or [Styled Chat](https://modrinth.com/mod/styled-chat) comes to mind here)
- There are several mod / data pack conflict warnings for administrators to help them make better decisions on what mods they want to install.
- Added a "disableDamage" configuration to make AFK players immune to damage after a 15-second cool down. A new configurable server-wide message is now enforced by default when this occurs.
- Added a "disableDamageCooldown" configuration to allow Administrators to adjust the default "timer" that is applied after a player goes AFK. I highly recommend not setting this to '0', unless you don't think your players will abuse this privilege.
- Added a "whenDamageDisabled" configuration so that you can customize the message displayed when your players are marked as invulnerable.
- Added a "whenDamageEnabled" configuration so that you can customize the message displayed when your players are unmarked as invulnerable.
- Now also checks for if players are in Spectator Mode, and not only Creative for managing your AFK/Disable Damage status.
- ~~Adds several color nodes that players can use for AFK Reasons. See /afkex for a display example.~~
- ~~brown, cyan, dark_brown, dark_pink, light_blue, light_brown, light_gray, light_pink, lime, magenta, purple, salmon,~~
- ~~bluetiful, burnt_orange, canary, cool_mint, copper, powder_blue, royal_purple, shamrock, tickle_me_pink, ultramarine_blue~~
- Added a "bypassSleepCount" configuration so that you can allow players marked as Afk to bypass the Sleeping Requirements.
- Added a "bypassInsomnia" configuration so that you can allow players marked as Afk to block Phantom spawning.
- Added a "/noafk" command for players to stop themselves from being marked as Afk.
- Added a "displayDuration" configuration option so that you can enable/disable the "Gone for XX minutes, XX seconds" during whenReturn.
- Added additional handling to allow "afkTimeoutString" to be set to "", and passing the "defaultReason" as "" to have more of the "Original" AfkDisplay feel.
- Added a "AFK Kick" system to automatically kick players from the server who are AFK after a configured amount of time. It has several configuration options:
- `afkKickEnabled` - (true/false) Enables the AFK Auto Kick manager.
- `afkKickNonSurvival` - (true/false) Allows Kicking Creative / Spectator players.
- `afkKickTimer` - The time beyond `timeoutSeconds` (Additive) when a player gets removed from the server, so if `timeoutSeconds` is 240, and `afkKickTimer` is set to 3600, the actual time they get kicked is at **3840**, or 64 minutes at the longest.
- `afkKickSafePermissions` - (Permission 3) The default Permissions level that is marked "safe" from being automatically kicked. (Luck Perms: afkplus.kick.safe)
- Note; that if a player has `afkPlusCommandPermissions` (Luck Perms: afkplus.afkplus), they will also be marked as safe from being automatically kicked, but this new configuration allows you to configure these permissions separately.
- `afkKickMessage` - The message sent to Players that get kicked as the reason for their removal. (Adds the Duration when `displayDuration` is enabled)
- `whenKicked` - The message broadcast to the server when a player gets kicked for being AFK. (Adds the Duration when `displayDuration` is enabled)
- NOTES: This feature *DOES NOT* automatically kick Carpet Mod Bots, because the 'fake' players do not get ticked by the server.
- This feature *DOES NOT* work in Single Player/Open To Lan, and requires a Dedicated Server Environment to function properly.
## Commands (Permissions via [Luck Permissions](https://luckperms.net/) or the afk_plus configurations)
- '**/afkplus**' with the AfkPlusCommandPermissions (Default: 4) setting the default restrictions. (Permission: afkplus.afkplus)
- Displays the Mod Version information.
- '**/afkplus reload**' command. (Permission: afkplus.afkplus.reload)
- This allows an Administrator to reload the configuration while the server is running.
- ~~'**/afkplus ex**' command. (Permission: afkplus.afkplus.ex)~~
- ~~This displays a simple "formatting test" to show the user what basic text nodes are available to use, and this also allows them to use this for Copy/Paste by clicking on colors/formats.~~
- '**/afkplus set [Player] [Reason]**' command. (Permission: afkplus.afkplus.set)
- This allows any administrator to set the AFK status of a player, and this also removes their NoAFK status.
- '**/afkplus clear [Player]**' command. (Permission: afkplus.afkplus.clear)
- This allows any administrator to clear the AFK status of a player.
- '**/afkplus damage enable [Player]**' command. (Permission: afkplus.afkplus.damage.enable)
- This allows an Administrator to force-enable an AFK player's ability to be damaged as long as they are connected.
- '**/afkplus damage disable [Player]**' command. (Permission: afkplus.afkplus.damage.disable)
- This allows an Administrator to revert a player's ability to use "Disable Damage" after it was forcefully removed.
- '**/afkplus info [Player]**' command. (Permission: afkplus.afkplus.info)
- This allows any administrator to check the AFK status of a player, and display the time and duration since they went AFK.
- '**/afkplus update [Player]**' command. (Permission: afkplus.afkplus.update)
- This allows any administrator to force a player list update for a player.
- '**/afkinfo [Player]**' with the AfkInfoCommandPermissions (Default: 2) setting the default restrictions, (Permission: afkplus.afkinfo)
- Does the same thing as '**/afkplus info [Player]**', but can be used for Mods, or players, or however you like to configure it for people to see.
- ~~'**/afkex**' with the AfkExCommandPermissions (Default: 0) setting the default restrictions. (Permission: afkplus.afkex)~~
- ~~This displays a simple "formatting test" to show the user what basic text nodes are available to use, and this also allows them to use this for Copy/Paste by clicking on colors/formats.~~
- '**/afk [Reason]**' with the AfkCommandPermissions (Default: 0) setting the default restrictions. (Permission: afkplus.afk)
- This allows any user to use a [Reason] along with setting their AFK status.
- [NEW] '**/noafk**' with the noAfkCommandPermissions (Default: 0) setting the default restrictions. (Permission: afkplus.noafk)
- This allows any user to set themselves in a state where they will not go Afk based on the configured timeout value.
- [NEW] 'afkKickSafePermissions' (Default: 3) sets the default permissions to mark an AFK player as safe from being kicked. (Permission: afkplus.kick.safe)
## Potential known conflicts (Make your choice)
- [afk display Data pack](https://vanillatweaks.net/picker/datapacks/) (Vanilla Tweaks Data pack, changes the player list display) -- Mod checks for any "afk" containing data packs in the name.
- [AfkDisplay](https://modrinth.com/mod/afkdisplay) -- because this is the mod that AfkPlus is based upon, and offers fewer features.
- [AntiLogout](https://modrinth.com/mod/noexits) (/afk command, timeout handling)
- [Auto AFK](https://modrinth.com/mod/auto-afk) (/afk command, timeout handling)
- [Sessility](https://modrinth.com/mod/sessility) (timeout handling)
- [Playtime-Tracker](https://modrinth.com/mod/playtime-tracker) (timeout handling)
- [SvrUtil](https://modrinth.com/mod/svrutil) (/afk command, the rest is safe)
## Example Configuration
The configuration is located in `afkplus.json` inside your servers config folder.
```json lines
{
"___comment": "AfkPlus-1.21.4-1.7.4-SNAPSHOT Config",
"config_date": "Fri, 3 Jan 2025 00:05:08 -0500",
"afk_plus": {
"_comment01": "# Allows you to disable the /afk command to mark yourself as AFK, with an optional [Reason] (Default: true)",
"enableAfkCommand": true,
"_comment02": "# Allows you to disable the /noafk command to mark yourself as NoAFK, which disables the timeout (Default: true)",
"enableNoAfkCommand": true,
"_comment03": "# Allows you to disable the /afkinfo command to allow players to see someone's AFK status (Time, Duration, Reason). (Default: true)",
"enableAfkInfoCommand": true,
"_comment04": "# The /afk default command permissions, configurable with Luck Perms (afkplus.afk) node (Default: 0)",
"afkCommandPermissions": 0,
"_comment05": "# The /noafk default command permissions, configurable with Luck Perms (afkplus.noafk) node (Default: 0)",
"noAfkCommandPermissions": 0,
"_comment06": "# The /afkinfo default command permissions, configurable with Luck Perms (afkplus.afkinfo) node (Usually for Mods) (Default: 2)",
"afkInfoCommandPermissions": 2,
"_comment07": "# The /afkplus default command permissions, configurable with Luck Perms (afkplus.afkplus with .subcommands) node (Default: 3)",
"afkPlusCommandPermissions": 3,
"_comment08": "# A Basic Cooldown configurable to help prevent people from spamming the /afk command (Default: 5 seconds)",
"afkCommandCooldown": 5,
"_comment09": "# A boolean toggle to enable / disable debug logger messages in the mod",
"debugMode": false
},
"packet": {
"_comment01": "# The time without actions after which a player is considered AFK. Set to -1 to disable automatic AFK detection. (Default: 240)",
"_comment02": "# --note; the Original AfkDisplay's default timeout was set to 180 seconds.",
"timeoutSeconds": 240,
"_comment03": "# Consider players that moved no longer AFK (enables easy bypass methods like AFK pools) (Default: false)",
"resetOnMovement": false,
"_comment04": "# Consider players which looked around no longer AFK (Default: false)",
"resetOnLook": false,
"_comment05": "# Consider players who are only swinging their sword as AFK (Default: false)",
"ignoreAttacks": false,
"_comment06": "# Makes it so that Afk players are not counted in the Sleep Percentage check (Default: true)",
"bypassSleepCount": true,
"_comment07": "# Makes it so that Afk Players block Phantom Spawning attempts. (Default: true)",
"bypassInsomnia": true,
"_comment08": "# The default \"timeout\" AFK reason (Default: \"timeout\")",
"afkTimeoutString": "timeout",
"_comment09": "# The default AFK timeout message for the \"ignoreAttacks\" detection",
"afkTimeoutIgnoreAttack": "only swinging their sword"
},
"disable_damage": {
"_comment01": "# Disable damage after disableDamageCooldown seconds since a player went AFK (Default: false)",
"disableDamage": false,
"_comment02": "# Cooldown timer for enabling the \"DisableDamage\" feature. (Default: 15 seconds)",
"_comment03": "# - WARNING! Be advised that settings this too low can encourage poor player behavior.",
"disableDamageCooldown": 15,
"_comment04": "# The message content when an AFK player is marked as Invulnerable.",
"_comment06": "# (Default: \"%player:displayname% is marked as Invulnerable.\")",
"whenDamageDisabled": "%player:displayname% is marked as Invulnerable.",
"_comment08": "# The message content when an AFK player is no longer marked as Invulnerable.",
"_comment09": "# (Default: \"%player:displayname% is no longer Invulnerable.\")",
"whenDamageEnabled": "%player:displayname% is no longer Invulnerable."
},
"afk_kick": {
"_comment01": "# Enables the AFK Auto-Kick system. (Default: false)",
"afkKickEnabled": false,
"_comment02": "# Allows Non-Survival players to be kicked (Creative, Spectator, etc) (Default: false)",
"afkKickNonSurvival": false,
"_comment03": "# The time after `timeoutSeconds` to automatically kick an AFK player (Default: 3600, aka. 1 hour)",
"_comment04": "# --note; that this value is \"Additive\" to the `timeoutSeconds` value, so the actual time will be 3840, aka. 64 minutes.",
"afkKickTimer": 3000,
"_comment05": "# Default permission level to mark players as \"safe\" from being automatically kicked, i.e., Server Admins (Default: 3)",
"afkKickSafePermissions": 3,
"_comment06": "# The Kick Reason message sent to players that are removed. Can be set to \"\" to get a basic \"AFK timeout\" reason.",
"_comment07": "# (Default: \"AFK beyond the allowed time limit set by your Administrator.\")",
"_comment08": "# --note; that this message gets the AFK duration added to the end if `message.displayDuration` is set to true.",
"afkKickMessage": "AFK beyond the allowed time limit set by your Administrator.",
"_comment09": "# The message content when an AFK player gets kicked from the server.",
"_comment10": "# (Default: \"%player:displayname% was kicked for being AFK.\")",
"_comment11": "# --note; that this message gets the AFK duration added to the end if `message.displayDuration` is set to true.",
"whenKicked": "%player:displayname% was kicked for being AFK.",
"_comment12": "# The default reason when a player is kicked",
"_comment13": "# (Default: \"AFK timeout\")",
"whenKickedDefaultReason": "AFK timeout",
"_comment14": "# The AFK default Duration Prefix used when a player is kicked. The duration format used follows the message.duration configuration.",
"_comment15": "# (Default: \" (Gone for: \")",
"whenKickedDurationDefaultPrefix": " (Gone for: ",
"_comment16": "# The AFK Player Named Duration Prefix used when a player is kicked. The duration format used follows the message.duration configuration.",
"_comment17": "# (Default: \" (%player:displayname% was gone for: