Afk Plus

Afk Plus

离开或管理暂离玩家;并格式化其名称显示

AfkPlus Fabric Mod for Minecraft

workflow

Example

Join Sakura's RyokoCraft Discord

基本描述:

  • 一个基于 beabfc 的 AfkDisplay 的分支项目。他已允许我继续创建这个模组,请查看我的 Archived Issues 页面。
  • 在玩家列表中显示哪些玩家处于 AFK 状态,查看原因、时长和时间。
  • 完全可配置,并支持 Placeholder API,包含所有 Placeholder API 格式化节点,例如:原生黄色或粗体。(你甚至可以在 AFK 原因中包含 URL!)
  • 模组现在可以在单人游戏和集成服务器(对局域网开放)中使用。
  • [新] 截至 2024 年 12 月,模组已大部分重写为基于 Fallen-Breath 的模板模组架构的多版本项目。
  • [新] 模组现在是我新库模组 CoreLib 的依赖项,More Color 系统也被分支到我的 More Color API 模组中。
    • 它们都包含在 AfkPlus 的 JAR 文件中。

模组重写与新增功能

  • 整个模组生态系统已迁移到多版本架构,以便使用单个分支更快地同时将模组移植到 1.19.2-1.21.4+ 版本。
  • 配置不再使用 TOML,已转换为基于数据驱动的 CoreLib JSON 配置系统;其工作方式类似于 Pat 的模组生态系统。
  • 大多数玩家/服务器事件现在由 CoreLib 接口管理;仅有少数 AFK 特定的例外。
  • 所有命令现在由 CoreLib 接口注册和管理。
  • 所有抽象的文本 Placeholder API 格式化和额外颜色标签现在由 More Color API 管理。参见 /morecolors 命令。
  • 所有新的抽象时间日期/时长格式化接口由 CoreLib 管理。
  • 完全重写的 AfkPlayer / Afk 玩家列表系统基于抽象化;而不是通过 Mixin 类管理。这应有助于解决任何严格的模组兼容性问题;并避免丑陋的代码。
  • 从 CoreLib 到 AfkPlus 的整个模组生态系统都有 API / 事件系统,供其他模组在其模组中实现和兼容。
  • AfkPlus 添加了对 Vanish、Carpet Mod 和 Styled Player List 的 API 兼容处理。每个模组的集成根据任何兼容性需求而有所不同。
  • 添加了几个 message 选项,并将 afkKick 和 disableDamage 系统分支到它们自己的配置类别中。查看下面的配置以获取更多默认信息。
  • 根据请求添加了其他几个改进、错误修复和功能;例如通过各种配置选项完全配置 Gone for: XXX 消息的能力。

功能

  • 添加了一个占位符 %afkplus:afk%,让你可以为 AFK 的玩家提供一个非常基本的“[AFK]”标签。
  • 添加了一个占位符 %afkplus:name%/%afkplus:display_name%,这样你可以在其他模组(如 Styled Playerlist)下使用它作为“%player:displayname%”占位符的替代品。 请注意,此方法设计为在 Styled Playerlist 下完全兼容 LuckPerms 前缀,因为玩家列表更新的标准方法会失败,或者你可以直接使用 %afkplus:afk% 为你喜欢的现有名称添加格式。
  • 添加了一个占位符 %afkplus:duration%,这样你可以获取某人 AFK 以来的时间,并可配置格式前缀。
  • 添加了一个占位符 %afkplus:time%,这样你可以获取某人 AFK 的时间/日期,并可配置格式前缀。
  • 添加了一个占位符 %afkplus:reason%,这样你可以移植某人 AFK 的原因,并可配置格式前缀。
  • 添加了一个占位符 %afkplus:invulnerable%,这样你可以显示所有用户的“禁用伤害”状态,类似于“[AFK]”占位符标签,但或多或少是一个“附加项”。
  • 有一个特殊的配置选项 'prettyDuration',用于以更人性化的格式配置 AFK 时长,而不是默认的(HH:mm:ss.mss)格式。不过每种方法都有其优势。(想到 Styled Nicknames 或 Styled Chat)
  • 为管理员提供了几个模组/数据包冲突警告,以帮助他们更好地决定要安装哪些模组。
  • 添加了一个“disableDamage”配置,使 AFK 玩家在 15 秒冷却后免疫伤害。当发生这种情况时,默认会强制执行一个新的可配置的全服消息。
  • 添加了一个“disableDamageCooldown”配置,允许管理员调整玩家进入 AFK 后应用的默认“计时器”。我强烈建议不要将其设置为 '0',除非你认为你的玩家不会滥用此特权。
  • 添加了一个“whenDamageDisabled”配置,以便你可以自定义玩家被标记为无敌时显示的消息。
  • 添加了一个“whenDamageEnabled”配置,以便你可以自定义玩家被取消标记为无敌时显示的消息。
  • 现在还检查玩家是否处于旁观者模式,而不仅仅是创造模式,以管理你的 AFK/禁用伤害状态。
  • 添加了几个玩家可用于 AFK 原因的颜色节点。参见 /afkex 查看显示示例。
    • 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
  • 添加了一个“bypassSleepCount”配置,以便你可以允许被标记为 AFK 的玩家绕过睡眠要求。
  • 添加了一个“bypassInsomnia”配置,以便你可以允许被标记为 AFK 的玩家阻止幻翼生成。
  • 添加了一个“/noafk”命令,供玩家阻止自己被标记为 AFK。
  • 添加了一个“displayDuration”配置选项,以便你可以在 whenReturn 期间启用/禁用“Gone for XX minutes, XX seconds”。
  • 添加了额外的处理,允许将“afkTimeoutString”设置为“”,并将“defaultReason”传递为“”,以获得更多“原始”AfkDisplay 的感觉。
  • 添加了一个“AFK 踢出”系统,在配置的时间后自动从服务器踢出处于 AFK 状态的玩家。它有几个配置选项:
    • afkKickEnabled - (true/false)启用 AFK 自动踢出管理器。
    • afkKickNonSurvival - (true/false)允许踢出创造/旁观者模式玩家。
    • afkKickTimer - 玩家从服务器被移除时超过 timeoutSeconds 的时间(叠加),因此如果 timeoutSeconds 为 240,afkKickTimer 设置为 3600,实际被踢出的时间是 3840,即最长 64 分钟。
    • afkKickSafePermissions - (权限 3)被标记为“安全”免于自动踢出的默认权限级别。(Luck Perms:afkplus.kick.safe)
      • 注意;如果玩家拥有 afkPlusCommandPermissions(Luck Perms:afkplus.afkplus),他们也会被标记为安全免于自动踢出,但这个新配置允许你单独配置这些权限。
    • afkKickMessage - 发送给被踢出玩家的消息,作为其被移除的原因。(当 displayDuration 启用时添加时长)
    • whenKicked - 当玩家因 AFK 被踢出时向服务器广播的消息。(当 displayDuration 启用时添加时长)
    • 注意事项:此功能不会自动踢出 Carpet Mod 机器人,因为“假”玩家不会被服务器 tick。
      • 此功能不会在单人游戏/对局域网开放中工作,需要专用服务器环境才能正常运行。

命令(通过 Luck Permissions 或 afk_plus 配置设置权限)

  • '/afkplus',使用 AfkPlusCommandPermissions(默认:4)设置默认限制。(权限:afkplus.afkplus)
    • 显示模组版本信息。
  • '/afkplus reload' 命令。(权限:afkplus.afkplus.reload)
    • 这允许管理员在服务器运行时重新加载配置。
  • '/afkplus ex' 命令。(权限:afkplus.afkplus.ex)
    • 这会显示一个简单的“格式化测试”,向用户展示可用的基本文本节点,这也允许他们通过点击颜色/格式来进行复制/粘贴。
  • '/afkplus set [Player] [Reason]' 命令。(权限:afkplus.afkplus.set)
    • 这允许任何管理员设置玩家的 AFK 状态,这也会移除他们的 NoAFK 状态。
  • '/afkplus clear [Player]' 命令。(权限:afkplus.afkplus.clear)
    • 这允许任何管理员清除玩家的 AFK 状态。
  • '/afkplus damage enable [Player]' 命令。(权限:afkplus.afkplus.damage.enable)
    • 这允许管理员在 AFK 玩家连接期间强制启用其受到伤害的能力。
  • '/afkplus damage disable [Player]' 命令。(权限:afkplus.afkplus.damage.disable)
    • 这允许管理员在玩家的“禁用伤害”被强制移除后恢复其使用能力。
  • '/afkplus info [Player]' 命令。(权限:afkplus.afkplus.info)
    • 这允许任何管理员检查玩家的 AFK 状态,并显示自他们 AFK 以来的时间和时长。
  • '/afkplus update [Player]' 命令。(权限:afkplus.afkplus.update)
    • 这允许任何管理员强制为玩家更新玩家列表。
  • '/afkinfo [Player]',使用 AfkInfoCommandPermissions(默认:2)设置默认限制,(权限:afkplus.afkinfo)
    • 与 '/afkplus info [Player]' 功能相同,但可用于模组、玩家,或你喜欢的任何配置方式供人们查看。
  • '/afkex',使用 AfkExCommandPermissions(默认:0)设置默认限制。(权限:afkplus.afkex)
    • 这会显示一个简单的“格式化测试”,向用户展示可用的基本文本节点,这也允许他们通过点击颜色/格式来进行复制/粘贴。
  • '/afk [Reason]',使用 AfkCommandPermissions(默认:0)设置默认限制。(权限:afkplus.afk)
    • 这允许任何用户使用 [Reason] 同时设置他们的 AFK 状态。
  • [新] '/noafk',使用 noAfkCommandPermissions(默认:0)设置默认限制。(权限:afkplus.noafk)
    • 这允许任何用户将自身设置为根据配置的超时值不会进入 AFK 的状态。
  • [新] 'afkKickSafePermissions'(默认:3)设置默认权限,将 AFK 玩家标记为免于被踢出。(权限:afkplus.kick.safe)

潜在已知冲突(请自行选择)

  • afk display 数据包(Vanilla Tweaks 数据包,更改玩家列表显示)——模组检查名称中包含任何“afk”的数据包。
  • AfkDisplay —— 因为这是 AfkPlus 所基于的模组,且提供的功能较少。
  • AntiLogout(/afk 命令,超时处理)
  • Auto AFK(/afk 命令,超时处理)
  • Sessility(超时处理)
  • Playtime-Tracker(超时处理)
  • SvrUtil(/afk 命令,其余是安全的)

配置示例

配置文件位于服务器配置文件夹中的 afkplus.json。

{
  "___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: \"<i><gray>timeout<r>\")",
    "afkTimeoutString": "<i><gray>timeout<r>",
    "_comment09": "# The default AFK timeout message for the \"ignoreAttacks\" detection",
    "afkTimeoutIgnoreAttack": "<i><gray>only swinging their sword<r>"
  },
  "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% <yellow>is marked as <red>Invulnerable.<r>\")",
    "whenDamageDisabled": "%player:displayname% <yellow>is marked as <red>Invulnerable.<r>",
    "_comment08": "# The message content when an AFK player is no longer marked as Invulnerable.",
    "_comment09": "# (Default: \"%player:displayname% <yellow>is no longer <red>Invulnerable.<r>\")",
    "whenDamageEnabled": "%player:displayname% <yellow>is no longer <red>Invulnerable.<r>"
  },
  "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: \"<copper>AFK beyond the allowed time limit set by your Administrator.<r>\")",
    "_comment08": "# --note; that this message gets the AFK duration added to the end if `message.displayDuration` is set to true.",
    "afkKickMessage": "<copper>AFK beyond the allowed time limit set by your Administrator.<r>",
    "_comment09": "# The message content when an AFK player gets kicked from the server.",
    "_comment10": "# (Default: \"%player:displayname% <copper>was kicked for being AFK.<r>\")",
    "_comment11": "# --note; that this message gets the AFK duration added to the end if `message.displayDuration` is set to true.",
    "whenKicked": "%player:displayname% <copper>was kicked for being AFK.<r>",
    "_comment12": "# The default reason when a player is kicked",
    "_comment13": "# (Default: \"<copper>AFK timeout\")",
    "whenKickedDefaultReason": "<copper>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: \" <gray>(Gone for: <green>\")",
    "whenKickedDurationDefaultPrefix": " <gray>(Gone for: <green>",
    "_comment16": "# The AFK Player Named Duration Prefix used when a player is kicked.  The duration format used follows the message.duration configuration.",
    "_comment17": "# (Default: \" <gray>(%player:displayname% was gone for: <green\")",
    "whenKickedDurationNamedPrefix": " <gray>(%player:displayname% was gone for: <green>",
    "_comment18": "# The suffix for either kick Duration Prefix",
    "_comment19": "# (Default: \" <gray>)\"",
    "whenKickedDurationSuffix": "<gray>)"
  },
  "player_list": {
    "_comment01": "# Change the playerlist name for players who are AFK (Default: true)",
    "_comment02": "# -- note; This is for when you're NOT using a player list display mods.",
    "enableListDisplay": true,
    "_comment03": "# The name that is shown in the player list if a player is AFK, and accepts formatting nodes",
    "_comment04": "# (Default: \"<i><gray>[AFK%afkplus:invulnerable%] %player:displayname%<r>\")",
    "_comment05": "# -- note; This function works best when not using Player List mods!*",
    "afkPlayerName": "<i><gray>[AFK%afkplus:invulnerable%] %player:displayname%<r>",
    "_comment06": "# This option sets a default Player List update interval.  This config goes a long way fixing",
    "_comment07": "#  various Player list update issues; especially when other Player List management mods are installed.",
    "_comment08": "#  (Default: 10 seconds)",
    "updateInterval": 10
  },
  "place_holder": {
    "_comment01": "# This will be the value of the placeholder %afkplus: afk% if a player is AFK, option accepts full formatting nodes",
    "_comment02": "# (Default: \"<i><gray>[AFK%afkplus:invulnerable%]<r>\")",
    "_comment03": "# -- note; *DOES NOT* place an \"<r>\" at the end in the code (trying not to modify its default behavior)",
    "afkPlaceholder": "<i><gray>[AFK%afkplus:invulnerable%]<r>",
    "_comment04": "# Placeholder %afkplus:name% for backporting the entire %displayname% for use in other Mods, such as Styled Player List",
    "_comment05": "# (Default: \"<i><gray>[AFK%afkplus:invulnerable%] %player:displayname_unformatted%<r>\")",
    "_comment06": "# -- note; *DOES NOT* places an \"<r>\" at the end in the code (trying not to modify its default behavior)",
    "afkPlusNamePlaceholderAfk": "<i><gray>[AFK%afkplus:invulnerable%] %player:displayname_unformatted%<r>",
    "_comment07": "# Value for when a player is NOT AFK, (i.e., the default \"%player:displayname%\")",
    "_comment08": "# -- note; *DOES NOT* places an \"<r>\" at the end in the code (trying not to modify its default behavior)",
    "afkPlusNamePlaceholder": "%player:displayname%",
    "_comment09": "# Adds a formatting prefix node for %afkplus:duration% (default: <green>)",
    "_comment10": "# -- note; places an \"<r>\" at the end in the code, and this is used during /afkinfo",
    "afkDurationPlaceholderFormatting": "<green>",
    "_comment11": "# Adds a formatting prefix node for %afkplus: time% (default: <green>)",
    "_comment12": "# -- note; places an \"<r>\" at the end in the code, and this is used during /afkinfo",
    "afkTimePlaceholderFormatting": "<green>",
    "_comment13": "# Adds a formatting prefix node for %afkplus: reason%, I'm not sure why someone might want this enabled, because",
    "_comment14": "# formatting your [Reason] yourself is fun. (default: none)",
    "_comment15": "# -- note; places an \"<r>\" at the end of the code, and this is used during /afkinfo",
    "afkReasonPlaceholderFormatting": "",
    "_comment16": "# Adds an option to configure a basic \"Add-On\" placeholder for attaching to the \"[AFK]\" tag to mark when a player is",
    "_comment17": "# marked as Invulnerable using %afkplus: invulnerable% (Default: \":<red>I<r>\")",
    "afkInvulnerablePlaceholder": ":<red>I<r>",
    "_comment18": "# Adds an option for using custom formatters for the output of the %duration% placeholder.  The valid options are:",
    "_comment19": "# -- 'REGULAR' (HH:mm:ss.SSS) (Default: REGULAR)",
    "_comment20": "# -- 'PRETTY' (d' days 'H' hours 'm' minutes 's' seconds')",
    "_comment21": "# -- 'ISO_EXTENDED' ('P'yyyy'Y'M'M'd'DT'H'H'm'M's.SSS'S')",
    "_comment22": "# -- 'FORMATTED'; Same as ISO_EXTENDED, but this option allows you to set your own custom DurationFormatUtils Formatter,",
    "_comment23": "#     -->  SEE: \"org.apache.commons.lang3.time.DurationFormatUtils;\" for more information",
    "duration": {
      "option": "REGULAR",
      "customFormat": ""
    },
    "_comment24": "# Adds an option for using custom formatters for the output of the %afkTime% placeholder.  The valid options are:",
    "_comment25": "# -- 'REGULAR' (yyyy-MM-dd_HH.mm.ss); which is the same format that Minecraft uses and is the Default config. (Default: REGULAR)",
    "_comment26": "# -- 'ISO_LOCAL' (yyyy-MM-ddTHH:mm:ss.n)",
    "_comment27": "# -- 'ISO_OFFSET' (yyyy-MM-ddTHH:mm:ss.nZ)",
    "_comment28": "# -- 'RFC1123' (EEE, dd MMM yyyy HH:mm:ss +HHMM)",
    "_comment29": "# -- 'FORMATTED'; (yyyy-MM-dd_HH.mm.ss); This is the same as 'REGULAR', but this option allows you to set your own custom",
    "_comment30": "#     formatters based on the \"java.time.format.DateTimeFormatter\" formatter syntax; see that package for more information.",
    "timeDate": {
      "option": "REGULAR",
      "customFormat": ""
    }
  },
  "message": {
    "_comment01": "# Enables chat messages when a player goes AFk or returns. (Default: true)",
    "enableMessages": true,
    "_comment02": "# The message content when a player goes AFK, and accepts formatting nodes",
    "_comment03": "#  (Default: \"%player:displayname% <yellow>is now AFK<r>\")",
    "whenAfk": "%player:displayname% <yellow>is now AFK<r>",
    "_comment04": "# An optional configuration for the \"whenAfk\" punctuation in between that, and the Duration / Reason that follows.",
    "_comment05": "# (Default: \"<yellow>,<r> \")",
    "whenAfkPunctuation": "<yellow>,<r> ",
    "_comment06": "# The messages content when a player returns from AFK, and accepts formatting nodes.",
    "_comment07": "# (Default: \"%player:displayname% <yellow>is no longer AFK<r>\")",
    "_comment08": "# --note; that this message gets the AFK duration added to the end if `displayDuration` is set to true.",
    "whenReturn": "%player:displayname% <yellow>is no longer AFK<r>",
    "_comment09": "# The prefix formatting for the \"whenReturn\" duration formatting portion.",
    "_comment10": "# (Default: \" <gray>(Gone for: <green>\")",
    "whenReturnDurationPrefix": " <gray>(Gone for: <green>",
    "_comment11": "# The suffix formatting for the \"whenReturn\" duration formatting portion.",
    "_comment12": "# (Default: \"<gray>)\")",
    "whenReturnDurationSuffix": "<gray>)",
    "_comment13": "# Default reason for going AFK via the /afk command.  Leave in a poof of smoke without having to give a reason.",
    "_comment14": "# (Default: \"<gray>poof!<r>\")",
    "_comment15": "# --note; \"\" is a valid setting, and will disable the default /afk reason.",
    "defaultReason": "<gray>poof!<r>",
    "_comment16": "# A configurable greeting when players repeatedly type '/afk' and expect a broken result.",
    "_comment17": "# (Default: \"<yellow>Welcome back, <r>%player:display_name%<r>, <yellow>did you miss anything fun?\")",
    "afkCooldownGreeting": "<yellow>Welcome back, <r>%player:display_name%<r>, <yellow>did you miss anything fun?",
    "_comment18": "# An general error condition sent when a player is marked as Vanished by \"melius-vanish\" maintained by DrexHD",
    "_comment19": "# (Default: \"<red>You are vanished, and probably shouldn't be doing that.<r>\")",
    "whileYourVanished": "<red>You are vanished, and probably shouldn't be doing that.<r>",
    "_comment20": "# An general error condition in the third person sent when a player is marked as Vanished by \"melius-vanish\" maintained by DrexHD",
    "_comment21": "# (Default: \"<red> is vanished, and probably shouldn't be doing that.<r>\")",
    "whileVanished": "<red> is vanished, and probably shouldn't be doing that.<r>",
    "_comment22": "# This enables the duration display portion of the whenReturn message.  See the \"duration\" configuration below.",
    "_comment23": "# (Default: true)",
    "displayDuration": true,
    "_comment24": "# Re-Formats the \"duration\" in chat messages and /afkinfo and 'whenReturn', etc; to a more human-readable format.",
    "_comment25": "# -- 'REGULAR' (HH:mm:ss.SSS)",
    "_comment26": "# -- 'PRETTY' (d' days 'H' hours 'm' minutes 's' seconds') (Default: PRETTY)",
    "_comment27": "# -- 'ISO_EXTENDED' ('P'yyyy'Y'M'M'd'DT'H'H'm'M's.SSS'S')",
    "_comment28": "# -- 'FORMATTED'; Same as ISO_EXTENDED, but this option allows you to set your own custom DurationFormatUtils Formatter,",
    "_comment29": "#     -->  SEE: \"org.apache.commons.lang3.time.DurationFormatUtils;\" for more information",
    "duration": {
      "option": "PRETTY",
      "customFormat": ""
    },
    "_comment30": "# Adds an option for using custom formatters for the output of the /afkinfo command.  The valid options are:",
    "_comment31": "# -- 'REGULAR' (yyyy-MM-dd_HH.mm.ss); which is the same format that Minecraft uses and is the Default config. (Default: REGULAR)",
    "_comment32": "# -- 'ISO_LOCAL' (yyyy-MM-ddTHH:mm:ss.n)",
    "_comment33": "# -- 'ISO_OFFSET' (yyyy-MM-ddTHH:mm:ss.nZ)",
    "_comment34": "# -- 'RFC1123' (EEE, dd MMM yyyy HH:mm:ss +HHMM)",
    "_comment35": "# -- 'FORMATTED'; (yyyy-MM-dd_HH.mm.ss); This is the same as 'REGULAR', but this option allows you to set your own custom",
    "_comment36": "#     formatters based on the \"java.time.format.DateTimeFormatter\" formatter syntax; see that package for more information.",
    "timeDate": {
      "option": "REGULAR",
      "customFormat": ""
    }
  }
}