From 1266d3417673bb13146567580a249222e4e9a587 Mon Sep 17 00:00:00 2001 From: NEZNAMY Date: Sun, 1 Dec 2024 20:05:59 +0100 Subject: [PATCH] [Wiki] Monthly wiki backup for December 2024 --- .github/wiki/_sidebar.md | 3 +- .github/wiki/additional_information.md | 74 +++++++----- .github/wiki/animations.md | 70 ++---------- .github/wiki/client_sided_mechanics.md | 2 +- .github/wiki/commands_permissions.md | 25 +++-- .github/wiki/compatibility.md | 26 +++-- .github/wiki/developer_api.md | 31 ++++-- .github/wiki/error_logging.md | 42 +++++-- .github/wiki/feature_guide_belowname.md | 94 ++++++++++------ .github/wiki/feature_guide_bossbar.md | 31 ++++-- .../feature_guide_conditional_placeholders.md | 38 ++++--- .../wiki/feature_guide_global_playerlist.md | 18 ++- .github/wiki/feature_guide_header_footer.md | 2 +- .github/wiki/feature_guide_layout.md | 51 +++++++-- .github/wiki/feature_guide_nametags.md | 56 +++++++--- .../feature_guide_per_world_playerlist.md | 4 +- .github/wiki/feature_guide_ping_spoof.md | 20 ++-- ...e_guide_placeholder_output_replacements.md | 35 ++++-- .../feature_guide_playerlist_objective.md | 2 +- .github/wiki/feature_guide_scoreboard.md | 105 +++++++++++++----- .github/wiki/feature_guide_sorting.md | 82 ++++++++++---- .github/wiki/feature_guide_spectator_fix.md | 10 +- .../feature_guide_tablist_name_formatting.md | 44 ++++++-- .../wiki/feature_info_redisbungee_support.md | 5 +- .github/wiki/frequently_asked_questions.md | 78 +++++++++---- .github/wiki/home.md | 33 ++++-- .../wiki/how_to_assign_players_into_groups.md | 24 ++-- ...w_to_display_name_from_nickname_plugins.md | 40 +++++-- ...o_make_tab_compatible_with_glow_plugins.md | 16 +-- .github/wiki/how_to_use_rgb_color_codes.md | 12 +- .github/wiki/installation.md | 35 ++++-- .github/wiki/known_issues.md | 8 +- .github/wiki/mini_guides_collection.md | 51 ++++++--- .github/wiki/mysql.md | 25 +++-- .github/wiki/optimizing_the_plugin.md | 61 ++++++++-- .../quick_placeholderapi_startup_guide.md | 2 +- 36 files changed, 849 insertions(+), 406 deletions(-) diff --git a/.github/wiki/_sidebar.md b/.github/wiki/_sidebar.md index f1505b59a..ed169d826 100644 --- a/.github/wiki/_sidebar.md +++ b/.github/wiki/_sidebar.md @@ -23,7 +23,6 @@ * [Sorting in tablist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist) * [Spectator fix](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Spectator-fix) * [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting) -* [Unlimited nametag mode](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Unlimited-nametag-mode) ## Functions * [Animations](https://github.com/NEZNAMY/TAB/wiki/Animations) @@ -37,7 +36,7 @@ ## Other * [Client-sided mechanics](https://github.com/NEZNAMY/TAB/wiki/Client%E2%80%90sided-mechanics) * [Quick PlaceholderAPI startup guide](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide) -* [How to setup compatibility with glow plugins](https://github.com/NEZNAMY/TAB/wiki/How-to-make-TAB-compatible-with-glow-plugins) +* [How to set up compatibility with glow plugins](https://github.com/NEZNAMY/TAB/wiki/How-to-make-TAB-compatible-with-glow-plugins) * [How to display name from nickname plugins](https://github.com/NEZNAMY/TAB/wiki/How-to-display-name-from-nickname-plugins) * [How to configure weights in LuckPerms](https://github.com/NEZNAMY/TAB/wiki/How-to-setup-weights-priorities) * [How to save config in UTF-8 encoding](https://github.com/NEZNAMY/TAB/wiki/How-to-save-the-config-in-UTF8-encoding) diff --git a/.github/wiki/additional_information.md b/.github/wiki/additional_information.md index 20b0886d6..197b8b6c9 100644 --- a/.github/wiki/additional_information.md +++ b/.github/wiki/additional_information.md @@ -16,33 +16,40 @@ This is a collection of random information about the plugin not necessarily limi # Bedrock compatibility ## Detection -For TAB to properly detect player as a bedrock player, floodgate and TAB must be installed on the same server instance and if TAB is on bukkit and floodgate is on both bungeecord and bukkit, make sure [they are connected](https://geysermc.org/wiki/floodgate/setup/?platform=proxy-servers). +For TAB to properly detect player as a bedrock player, floodgate and TAB must be installed on the same server instance. +If TAB is installed on bukkit and floodgate is on both bungeecord and bukkit, +make sure [they are connected](https://geysermc.org/wiki/floodgate/setup/?platform=proxy-servers). -To make sure floodgate is configured correctly you have 2 options: +To make sure floodgate is configured correctly, you have two options: * Set `debug: true` in TAB config and check console output on join/reload. It should say `Floodgate returned bedrock status TRUE for player `. * Run `/tab parse %bedrock%`. It should return `true`. If any of them say `false` for an actual bedrock player, you didn't connect floodgate correctly. ## Differences -It is job of plugin allowing bedrock clients to connect (probably Geyser) to correctly translate all packets. If you are experiencing an issue on bedrock but not java, it is most likely not an issue in TAB code. +It is a job of plugin allowing bedrock clients to connect (probably Geyser) to correctly translate all packets. +If you are experiencing an issue on bedrock but not java, it is most likely not an issue in TAB code. Currently, TAB does check for bedrock clients for: -* Displaying scoreboard numbers as 1-15 instead of all 0 even if it's set to all 0, because lines would not be ordered correctly. +* Displaying scoreboard numbers as 1–15 instead of all 0 even if it's set to all 0, because lines would not be ordered correctly. * Disabling [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) for bedrock players. * Disabling [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective) for bedrock players due to many issues with the feature on bedrock. These are the only 3 known changes that are required on TAB side. ## Issues with `.` in name -If you configured Geyser to prefix bedrock player names with `.`, it will mess up config loading, because `.` is used to split section path. This means that using `/tab player ...` will not work. -There are 3 solutions available: +If you configured Geyser to prefix bedrock player names with `.`, it will mess up config loading, +because `.` is used to split a section path. +This means that using `/tab player ...` will not work. +There are three solutions available: * Use player UUID if commands are executed via another plugin (`/tab player ...`). * Use `playeruuid` type, which accepts player name and saves the online player's UUID (`/tab playeruuid ...`). * Use a different username prefix than `.`. # Vanish detection -Although TAB does not manage player vanishing in any way, it checks for vanish status for features to be properly compatible. At the moment, vanishing detection is used for: +Although TAB does not manage player vanishing in any way, +it checks vanish status for features to be properly compatible. +At the moment, vanishing detection is used for: * `%vanished%` placeholder (used for internal functionality, but can be used to display vanish status if one wants to) * `%online%`, `%serveronline%`, `%worldonline%` and `%staffonline%` will not count vanished players * [Global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) makes vanish plugins unable to remove players on other servers from tablist, vanish check will make TAB remove vanished players. @@ -56,15 +63,20 @@ Permission `tab.seevanished` allows players to: For a player to be detected, player has to have `vanished` metadata flag set to `true`. Most, if not all vanish plugins do this, including, but not limited to CMI, Essentials, SuperVanish, PremiumVanish and probably more. If TAB is installed on BungeeCord, [Bridge](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) must be installed on backend servers to forward vanish status to the proxy. -Additionally, if PremiumVanish is installed and player's vanish status changes, it is asked if the vanished player can be seen by each player. Players who are marked as being able to see that vanished player by PV do not require `tab.seevaninished` permission. +Additionally, if PremiumVanish is installed and vanish status of a player changes, +it is asked if the vanished player can be seen by each player. +Players who are marked as being able to see that vanished player by PV do not require `tab.seevaninished` permission. # Async player loading -In order to not slow down the server, TAB loads players asynchronously on join. As a casual user this does not impact you, but there are some cases where you'll feel it: +In order to not slow down the server, TAB loads players asynchronously on join. +As a casual user, this does not impact you, but there are some cases where you'll feel it: * Players will not be accessible in the [API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) during PlayerJoinEvent -* [TAB's PlaceholderAPI expansion](https://github.com/NEZNAMY/TAB/wiki/Placeholders#placeholderapi) will not be accessible during join process, such as when trying to use it in plugins editing join messages (the exception is `replace_` placeholder, which doesn't directly use any TAB code). +* [TAB's PlaceholderAPI expansion](https://github.com/NEZNAMY/TAB/wiki/Placeholders#placeholderapi) will not be accessible during the join process, such as when trying to use it in plugins editing join messages (the exception is `replace_` placeholder, which doesn't directly use any TAB code). # Scoreboard objective and team naming -There's a well known BungeeCord bug that kicks players if a duplicate team or objective is registered. This message also shows the name of the objective/team. Before reporting this, make sure it actually comes from TAB. +There's a well-known BungeeCord bug that kicks players if a duplicate team or objective is registered. +This message also shows the name of the objective/team. +Before reporting this, make sure it actually comes from TAB. TAB's objective and team naming: * Objectives ("Objective ... already exists in this scoreboard") @@ -73,36 +85,38 @@ TAB's objective and team naming: * `TAB-PlayerList` for [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective) * Teams ("Team ... already exists in this scoreboard") * For sidebar scoreboard: `TAB-SB-TM-x` where `x` is a number from 1 to 15+ (for each line) - * For players: This is more complicated to use the 16 character limit to the max and heavily depends on configuration. If you are sorting by player names, part of player name will be there. It also often contains random non-alphanumeric symbols. The most reliable way is the team name (almost) always ending with `A` (or `B`, `C` etc if you tried to sort several players into the same slot). + * For players: This is more complicated to use the 16-character limit to the max and heavily depends on configuration. If you are sorting by player names, part of player name will be there. It also often contains random non-alphanumeric symbols. The most reliable way is the team name (almost) always ending with `A` (or `B`, `C` etc. if you tried to sort several players into the same slot). # Per-version experience -Minecraft has changed over the years - it had some limits removed, some added, some bugs fixed, but also some bugs added. TAB adapts code based on player's version for best possible experience on each minecraft version. +Minecraft has changed over the years. +It had some limits removed, some added, some bugs fixed, but also some bugs added. +TAB adapts code based on player's version for the best possible experience on each minecraft version. ## Detection -When TAB is installed on a proxy, the proxy's API is used to get player version. +When TAB is installed on a proxy, the proxy's API is used to get player's version. When TAB is installed on a backend server, ViaVersion's API is used to get player's version (as it's the only plugin allowing multiple versions, ProtocolSupport is abandoned). -You can check what version the plugin thinks player has using any of the following: -* `/tab parse %player-version%` - Returns version name, if multiple versions share the same protocol, the newer one is returned +You can check what version the plugin thinks player has by using any of the following: +* `/tab parse %player-version%` - Shows version name, if multiple versions share the same protocol, the newer one is returned * `/tab parse %player-version-id%` - Returns network id of player's version * Set `debug: true` in config and check console messages on player join, it will send a message containing game version ViaVersion API has returned Player game version detection may fail. Here are a few possible scenarios why: * ViaVersion is installed on BungeeCord * And TAB on BungeeCord as well - ViaVersion makes BungeeCord API return version of the backend server player is connected to instead of player's actual version - * And TAB is on backend servers - There is no ViaVersion to hook into, therefore there is no suspicion of player not using server's version and not having a way to verify it -* ViaVersion API returns `-1` - There is currently no known cause when or why this happens. However, when this happens, TAB prints a console warn notifying this has happened. Plugin will assume player is using same version as the server in such cases. + * And TAB is on backend servers - There is no ViaVersion to hook into, therefore, there is no suspicion of player not using server's version and not having a way to verify it +* ViaVersion API returns `-1` - There is currently no known cause when or why this happens. However, when this happens, TAB prints a console warn notifying this has happened. Plugin will assume player is using the same version as the server in such cases. -When game version is not detected correctly, player's experience will be very limited, see below. +When a player's game version is not detected correctly, player's experience will be very limited, see below. ## Differences To ensure the best possible experience, TAB is currently checking for player's version to: * [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout): - * Disable for 1.7 and lower due to massive tablist differences and plugin not being adapted to those + * Disabled for 1.7 and lower due to massive tablist differences and plugin not being adapted to those * Use alternate method of sorting the entries for 1.19.3+ using entry names, as the previous, better option was removed * Use RGB color codes for 1.16+ and use closest (or forced) legacy color for 1.15- * Use 1.9+ bossbar on 1.8 servers for 1.9+ players using ViaVersion API -* Disable [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting) for 1.7 and lower due to a 16 character limit total to take advantage of the mechanic where nametags are displayed in tablist, which extends the limit to up to 48 characters (16 prefix, 16 name, 16 suffix) +* Disable [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting) for 1.7 and lower due to a 16-character limit total to take advantage of the mechanic where nametags are displayed in tablist, which extends the limit to up to 48 characters (16 prefix, 16 name, 16 suffix) * Play around <1.13 limitations of [Scoreboard](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Scoreboard) * Cutting nametag prefix/suffix to 16 characters for <1.13, but keeping it full for 1.13+ @@ -111,17 +125,19 @@ When version detection fails, plugin's workarounds will be wrong and cause probl * Scoreboard lines limited to ~26 characters, even for 1.13+ clients * Scoreboard lines limited to 14 characters for < 1.13 clients * Scoreboard lines might be out of order -* RGB colors displaying as legacy colors for 1.16+ clients +* RGB colors displayed as legacy colors for 1.16+ clients * Layout being out of order for 1.19.3+ clients # Debug config option -You may have noticed `debug: false` in your config. Enabling it will unlock extra console messages beyond the usual miconfiguration / errors. They give a deeper information about what's going on in the plugin in case a more complex issue comes up. Currently, it offers the following: -* Prints thrown errors into console as well, instead of just errors.log file. They are printed into the console even if error log reaches 1MB limit. -* Sends a message how long each feature + total it took to process player join/quit or plugin reload. High values may suggest something is not optimized correctly. Originally added for myself when optimizing, but adding/removing it each time would be too much of a hassle, so it remains as a debug message. -* Sends a message when plugin detects player name change by a nick plugin. Since lots of things are bound to player names, having players change their name and plugin not detecting it would result in plugin not working correctly them. Therefore, every time a player changes nickname (or resets it), a message should pop up. -* Sends message whenever another plugin sends a scoreboard (such as a minigame plugin) and TAB hides it own. Then, when that other plugin removes its scoreboard, TAB sends its own back (and sends a console message). +You may have noticed `debug: false` in your config. +Enabling it will unlock extra console messages beyond the usual misconfiguration / errors. +They give deeper information about what's going on in the plugin in case a more complex issue comes up. +Currently, it offers the following: +* Prints thrown errors into console as well, instead of just errors.log file. They are printed into the console even if the error log reaches the 16MB limit. +* Sends a message about how long each feature + total it took to process player join/quit or plugin reload. High values may suggest something is not optimized correctly. Originally added for myself when optimizing, but adding/removing it each time would be too much of a hassle, so it remains as a debug message. +* Sends a message when plugin detects player name change by a nick plugin. Since lots of things are bound to player names, having players change their name and plugin not detecting it would result in plugin not working correctly them. Therefore, every time a player changes their nickname (or resets it), a message should pop up. +* Sends a message whenever another plugin sends a scoreboard (such as a minigame plugin) and TAB hides its own. Then, when that other plugin removes its scoreboard, TAB sends its own back (and sends a console message). * Sends a message regarding bedrock client status of players who join in using Floodgate API. This includes a message if floodgate is not enabled correctly (API instance is null), as well as true/false bedrock status of players. * Shows network id of protocol version of players who join when ViaVersion is installed. It should show the version players are actually using. If not, plugin may not work correctly for those players. This is usually caused by having ViaVersion on proxy and backend. * Sends a message whenever a placeholder takes more than 50 milliseconds to retrieve value. If it only happens once, it may be a random hiccup and can be ignored. In case of consistent problems, this may cause plugin overload. -* Sends a message if plugin attempted to send packet to a player who left already. On bungeecord 1.20.2+ this causes an error if not checked. This is completely the plugin's fault if it happens, but it cannot be shown to everyone, since it would require steps to reproduce and most users are not going to cooperate, resulting in stalling issues. -* On BungeeCord, shows how long did Bridge take to answer player join plugin message. This should be below 100ms. If it's continuously significantly higher, it means bridge is overloaded with the most likely cause being an inefficient placeholder. \ No newline at end of file +* On proxy installation, shows how long did Bridge take to answer player join plugin message. This should be below 100ms. If it's continuously significantly higher, it means bridge is overloaded with the most likely cause being an inefficient placeholder. \ No newline at end of file diff --git a/.github/wiki/animations.md b/.github/wiki/animations.md index 1a03c5472..2cb76a740 100644 --- a/.github/wiki/animations.md +++ b/.github/wiki/animations.md @@ -5,8 +5,6 @@ * [External tools](#external-tools) * [Additional info](#additional-info) * [Additional note 1 - Frame synchronization](#additional-note-1---frame-synchronization) -* [Examples](#examples) - * [Example 1](#example-1) # Creating an animation Animations can be created in **animations.yml** file. @@ -38,71 +36,25 @@ Welcome: #this is name of the animation This is an animation called `Welcome` with `change-interval` of `400` milliseconds, which is 2.5 refreshes per second. `Texts` are the actual frames of animation. # Using an animation -To use an animation, use `%animation:%` format. In the example above it's `%animation:Welcome%`. Animations are supported everywhere. That includes header/footer, prefix/suffix, belowname, yellow number, bossbar and more. +To use an animation, use `%animation:%` format. +In the example above it's `%animation:Welcome%`. +Animations are supported everywhere. +That includes header/footer, prefix/suffix, belowname, playerlist objective, bossbar and more. # Tips & Tricks * Animations don't need to be fast. You can use them as a changing text in general. -* Animations can also be used as a short alias to a long text. Just create an animation with one frame. +* Animations can also be used as a short alias to a long text. You can do this by creating an animation with one frame. # External tools -If you want an animation that's too complicated to be done manually, you can check out these websites: +If you want an animation too complicated to be done manually, you can check out these websites: * https://www.birdflop.com/resources/animtab/ * https://starve-l.github.io/tab-animation.html * https://srnyx.com/gradient # Additional info ## Additional note 1 - Frame synchronization -All animations start at the same time, which is time of plugin being (re)loaded. Thanks to this, all animations with the same amount of frames and same change interval will be synchronized. -If you want to synchronize 2 animations with different change interval and different amount of frames, you need to make sure `frame count`*`change interval` is same for both animations, for example one animation with 10 frames and 1000ms and second animation with 2 frames and 5000ms. - -# Examples -## Example 1 -Swichtes between green and red in an extra smooth way (could replace the default animation bar for a christmas theme). -Works on 1.16+ only due to RGB/Hex values being used. - -![](https://i.imgur.com/P9PN80H.png) -``` -MyAnimation1: - change-interval: 50 - texts: - - "bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m " - - "7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m " - - "ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m " - - "Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m " - - "Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m " - - "bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m " - - "Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m " - - "e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m " - - "ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m " - - "&#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m " - - "&#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m " - - "&#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m " - - "&#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m " - - "&#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m " - - "&#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m " - - "&#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m " - - "&#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m ed900&l&m " - - "&#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m 7e600&l&m " - - "&#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m bf200&l&m " - - "&#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m *ff00&l&m " - - "&#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m bf200&l&m " - - "&#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m 7e600&l&m " - - "&#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m ed900&l&m " - - "&#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m Dcc00&l&m " - - "&#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m Gbf00&l&m " - - "&#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m bb300&l&m " - - "&#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m Ta600&l&m " - - "&#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m e9900&l&m " - - "&#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m ϒc00&l&m " - - "&#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m &#a18000&l&m " - - "ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m &#aa7300&l&m " - - "e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m &#b36600&l&m " - - "Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m &#bd5900&l&m " - - "bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m &#c64d00&l&m " - - "Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m &#d04000&l&m " - - "Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m &#d93300&l&m " - - "ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m &#e32600&l&m " - - "7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m &#ec1a00&l&m " - - "bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m &#f60d00&l&m " - - "*ff00&l&m bf200&l&m 7e600&l&m ed900&l&m Dcc00&l&m Gbf00&l&m bb300&l&m Ta600&l&m e9900&l&m ϒc00&l&m &#a18000&l&m &#aa7300&l&m &#b36600&l&m &#bd5900&l&m &#c64d00&l&m &#d04000&l&m &#d93300&l&m &#e32600&l&m &#ec1a00&l&m &#f60d00&l&m &#ff0000&l&m " -``` \ No newline at end of file +All animations start at the same time, which is time of plugin being (re)loaded. +Thanks to this, all animations with the same number of frames and the same change interval will be synchronized. +If you want to synchronize multiple animations with a different change interval and different number of frames, +you need to make sure `frame count`*`change interval` is same for both animations, +for example one animation with 10 frames and 1000ms and second animation with 2 frames and 5000ms. diff --git a/.github/wiki/client_sided_mechanics.md b/.github/wiki/client_sided_mechanics.md index 19b709874..41af2f4d5 100644 --- a/.github/wiki/client_sided_mechanics.md +++ b/.github/wiki/client_sided_mechanics.md @@ -11,7 +11,7 @@ This is a collection of mechanics related to the plugin explaining how does the When disabling [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting), nametag prefix/suffix will be displayed in tablist instead. If you don't want any prefixes in tablist, keep the feature enabled but don't set any prefixes. Disabling this option is only useful to allow other plugins to use the feature or to intentionally display teams in tablist. # Tablist entry overlap -When having enough online players for 3-4 columns (or using [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout)) and their name formats are too long, they might overlap. This is caused by attempting to display text wider than the monitor can handle. +When having enough online players for 3–4 columns (or using [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout)) and their name formats are too long, they might overlap. This is caused by attempting to display text wider than the monitor can handle. There isn't really any ideal solution for this. Here are a few tips that might help: * Decrease GUI scale in client options to make text smaller * Make tablist entries shorter, such as avoiding using bold text (&l) or using short aliases for ranks instead of their full names (such as `A` instead of `Admin`). diff --git a/.github/wiki/commands_permissions.md b/.github/wiki/commands_permissions.md index e177ac439..8271bba78 100644 --- a/.github/wiki/commands_permissions.md +++ b/.github/wiki/commands_permissions.md @@ -1,9 +1,10 @@ # About -This page lists all of the commands and permissions that are available with TAB. Commands have required permissions associated with them. +This page lists all the commands and permissions that are available with TAB. +Commands have required permissions associated with them. **BungeeCord / Velocity users:** * If you have TAB installed **on the proxy**, use **/btab** instead of /tab. Permissions are the same. -* Permission nodes are checked on the server where the plugin is installed (by default). This means that with TAB on BungeeCord, permission nodes are checked on BungeeCord and therefore you'll need a permission plugin there as well. If you wish to take permission groups and checks from backend servers instead, set `use-bukkit-permissions-manager: true` in config. +* Permission nodes are checked on the server where the plugin is installed (by default). This means that with TAB on BungeeCord, permission nodes are checked on BungeeCord, and therefore you'll need a permission plugin there as well. If you wish to take permission groups and checks from backend servers instead, set `use-bukkit-permissions-manager: true` in config. # Content * [Configuration](#configuration-commands) @@ -35,7 +36,7 @@ This page lists all of the commands and permissions that are available with TAB. # Configuration commands ## /tab \ \ \ [value] [options] * **Permission:** `tab.change.` -* **Description:** Changes a property of a group/player to the given value. No value argument will result in that property being deleted. +* **Description:** Changes a property of a group/player to the given value. No value argument will result in that property being deleted. #### Properties * For tablist: `tabprefix`, `customtabname`, and `tabsuffix`. @@ -52,7 +53,7 @@ This page lists all of the commands and permissions that are available with TAB. ## /tab \ \ remove * **Permission:** `tab.remove` -* **Description:** Removes all direct data from the given player/group. +* **Description:** Removes all direct data from the given player/group. #### Notes * The `playeruuid` argument requires the name of an **online player** to remove data from. @@ -63,19 +64,19 @@ This page lists all of the commands and permissions that are available with TAB. ## /tab debug [player] * **Permission:** `tab.debug` -* **Description:** Shows the server version, plugin version, permission group choice logic, and sorting type. If player argument is filled, shows info about that player: +* **Description:** Shows the server version, plugin version, permission group choice logic, and sorting type. If player argument is filled, shows info about that player: * On BungeeCord, shows whether player is connected to the backend server with [Bridge](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) plugin or not. * Sorting value & explanation, useful to see what went wrong if players are not sorted correctly. * Primary group set using [How to assign players into groups](https://github.com/NEZNAMY/TAB/wiki/How-to-assign-players-into-groups) - * List of all configured properties of players, their values and source. + * List of all configured properties, their values and source. ## /tab group \ * **Permission:** `tab.groupinfo` -* **Description:** Shows all settings applied to the specified group, both global and per-world / per-server. Handly when plugin is connected to MySQL, where you have no other way to effectively check group settings. +* **Description:** Shows all settings applied to the specified group, both global and per-world / per-server. Handy when plugin is connected to MySQL, where you have no other way to effectively check group settings. ## /tab groups * **Permission:** `tab.grouplist` -* **Description:** Shows list of all groups that have anything assigned to them, either globally or per-world / per-server. Handy when plugin is connected to MySQL, where you have no other way to effectively check your groups. +* **Description:** Shows a list of all groups that have anything assigned to them, either globally or per-world / per-server. Handy when plugin is connected to MySQL, where you have no other way to effectively check your groups. # Scoreboard ## /tab scoreboard show \ \[player\] @@ -128,16 +129,16 @@ This page lists all of the commands and permissions that are available with TAB. # Other ## /tab cpu * **Permission:** `tab.cpu` -* **Description:** Shows approximate CPU usage of the plugin from the last 10 seconds. There are parts which are impossible to be measured, so this shows slighty less than the real value is. The content is self-explanatory. All ways to decrease CPU usage can be found at [Optimizing the plugin](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin). +* **Description:** Shows approximate CPU usage of the plugin from the last 10 seconds. There are parts that are impossible to be measured, so this shows slightly less than the real value is. The content is self-explanatory. All major ways to decrease CPU usage can be found at [Optimizing the plugin](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin). ## /tab parse \ \ * **Permission:** `tab.parse` -* **Description:** Replaces all placeholders (both the plugin's internal ones, and those from PlaceholderAPI if it is installed) in the given `text`. Can be used to test if a placeholder works as expected. +* **Description:** Replaces all placeholders (both the plugin's internal ones, and those from PlaceholderAPI if it is installed) in the given `text`. It can be used to test if a placeholder works as expected. # Additional permissions * `tab.admin` - Allows the player to execute all commands. -* `tab.bypass` - If per-world player list is enabled as well as this permission, it allows the player to see everyone on the server, regardless of what the per-world player list settings allow. For example, if your per-world player list is set up to isolate worlds A and B, players with this permission will see all players from both A and B on their player list, whereas players that don't will only see either players from world A or players from world B, depending on what world they are in. +* `tab.bypass` - If the per-world player list is enabled as well as this permission, it allows the player to see everyone on the server, regardless of what the per-world player list settings allow. For example, if your per-world player list is set up to isolate worlds A and B, players with this permission will see all players from both A and B on their player list, whereas players that don't have the permission will only see either players from world A or players from world B, depending on what world they are in. * `tab.staff` - Allows the player to be counted in the `%staffonline%` placeholder. * `tab.spectatorbypass` - If enabling bypass permission in [Spectator fix](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Spectator-fix), this is the permission. * `tab.tabcomplete` - Allows the player to auto-complete the `/tab` command. -* `tab.seevanished` - Allows the player to see other vanished players on the [Global Playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) and marks the player as able to see vanished players when using [Aligned suffix](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Aligned-Tabsuffix) feature to properly space out suffixes of players based on what the player can and cannot see. \ No newline at end of file +* `tab.seevanished` - Allows the player to see other vanished players on the [Global Playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) and [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout). \ No newline at end of file diff --git a/.github/wiki/compatibility.md b/.github/wiki/compatibility.md index 51f99813f..99587a32a 100644 --- a/.github/wiki/compatibility.md +++ b/.github/wiki/compatibility.md @@ -63,13 +63,19 @@ It is compiled with Java 8 and therefore supports any version of 8 and above. * Compile the plugin yourself and use the jar from `sponge7/build/libs`, which only contains sponge support instead of the universal jar from `jar/build/libs`. * Unzip the plugin jar, go to `me/neznamy/tab/platforms/` and delete everything except `sponge7`. -2 Latest only doesn't mean only the latest build will work, it means the plugin was made to be compatible with latest version/build. Since breaking changes don't happen too often, it means a wide range of versions is usually supported. When a breaking change occurs, plugin is updated to support new version, automatically making old versions incompatible. Since proxies support all client versions, there is never a reason to stay outdated, so you can always safely update to new version version/build of your proxy software if plugin requires it. +2 Latest only doesn't mean only the latest build will work, +it means the plugin was made to be compatible with the latest version/build. +Since breaking changes don't happen too often, it means a wide range of versions is usually supported. +When a breaking change occurs, the plugin is updated to support the new version, +automatically making old versions incompatible. +Since proxies support all client versions, there is never a reason to stay outdated, +so you can always safely update to new version/build of your proxy software if the plugin requires it. # Supported features per platform | Feature \ Platform | Bukkit / Hybrid | Sponge | Fabric | BungeeCord | Velocity | | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | | [Belowname](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Belowname) | ✔ | ✔ | ✔ | ✔ | ✔ (via [VSAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/releases)) | -| [BossBar](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Bossbar) | ✔ | ✔ | ✔ | ✔ (1.9+) | ✔ (1.9+) | +| [BossBar](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Bossbar) | ✔ | ✔ | ✔ | ✔ | ✔ | | [Global Playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) | ❌ | ❌ | ❌ | ✔ | ✔ | | [Header/Footer](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Header-&-Footer) | ✔ | ✔ | ✔ | ✔ | ✔ | | [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) | ✔ | ✔ | ✔ | ✔ | ✔ | @@ -87,18 +93,18 @@ It is compiled with Java 8 and therefore supports any version of 8 and above. # Plugin hooks In order to enhance user experience, TAB hooks into other plugins for better experience. This set of plugins is different for each platform based on their availability. Some are available on all platforms, some only in a few. ## All platforms -[**Floodgate**](https://github.com/GeyserMC/Floodgate) - For properly detecting bedrock players to adapt features for best possible user experience. +[**Floodgate**](https://github.com/GeyserMC/Floodgate) - For properly detecting bedrock players to adapt features for the best possible user experience. [**LuckPerms**](https://github.com/LuckPerms/LuckPerms) - Detecting permission groups of players for per-group settings. -[**ViaVersion**](https://github.com/ViaVersion/ViaVersion) - For properly detecting player version to adapt features for best possible user experience. +[**ViaVersion**](https://github.com/ViaVersion/ViaVersion) - For properly detecting player's version to adapt features for the best possible user experience. ## Bukkit [**LibsDisguises**](https://github.com/libraryaddict/LibsDisguises) - Detecting disguised players to disable collision to avoid endless push by colliding with own copy created by LibsDisguises. [**PlaceholderAPI**](https://github.com/PlaceholderAPI/PlaceholderAPI) - Allows users to use its placeholders inside TAB. -[**PremiumVanish**](https://www.spigotmc.org/resources/14404) - Supporting PV's vanish levels instead of using a basic vanish compatibility system. +[**PremiumVanish**](https://www.spigotmc.org/resources/14404) - Supporting PremiumVanish's vanish levels instead of using a basic vanish compatibility system. [**Vault**](https://github.com/milkbowl/Vault) - Detecting permission groups of players for per-group settings. ## BungeeCord -[**PremiumVanish**](https://www.spigotmc.org/resources/14404) - Supporting PV's vanish levels instead of using a basic vanish compatibility system. +[**PremiumVanish**](https://www.spigotmc.org/resources/14404) - Supporting PremiumVanish's vanish levels instead of using a basic vanish compatibility system. [**RedisBungee**](https://github.com/ProxioDev/RedisBungee) - Communicating with other proxies to properly display visuals on players on another proxy. ## Fabric @@ -117,13 +123,13 @@ In order to enhance user experience, TAB hooks into other plugins for better exp * **[Tablisknu](https://forums.skunity.com/resources/tablisknu.727/)** (skript addon) prevents TAB from assigning teams (sorting & nametags). * **SkBee** (skript addon) sends empty scoreboard, causing TAB's to not show sometimes. * **Waterfall**'s `disable_tab_list_rewrite: true` **may** cause tablist to use offline UUIDs while TAB expects online uuids, causing various problems (most notably tablist formatting not working). Checking for this option is not an option either, because tablist rewrite might still be enabled despite being disabled (don't ask how, I have no idea). Set the option to `false` if you are experiencing issues. -* **ViaVersion on BungeeCord and TAB on backend** acts like a client-sided protocol hack, making it impossible for TAB to know player's real version and causing issues related to it, see [Per-version experience](https://github.com/NEZNAMY/TAB/wiki/Additional-information#per-version-experience) for more info. Just avoid this combination - either install ViaVersion on all backend servers instead or install TAB on BungeeCord instead. -* **Custom clients / resource packs** - Unofficially modified minecraft clients often tend to break things. Just Lunar client has 3 bugs that can be reproduced with TAB. Resource packs may also contain modifications you are not aware of, making things not look the way you want them to. If you are experiencing any visual issue and are using a custom client or resource pack, try it with clean vanilla client. If it works there, it's an issue with the client / resource pack and TAB cannot do anything about it. Here are a few bugs in LunarClient / FeatherClient that you may run into when using TAB: +* **ViaVersion on BungeeCord and TAB on backend** acts like a client-sided protocol hack, making it impossible for TAB to know player's real version and causing issues related to it, see [Per-version experience](https://github.com/NEZNAMY/TAB/wiki/Additional-information#per-version-experience) for more info. Avoid this combination. Either install ViaVersion on all backend servers instead or install TAB on BungeeCord instead. +* **Custom clients / resource packs** - Unofficially modified minecraft clients often tend to break things. Just Lunar client has tons of bugs that can be reproduced with TAB. Resource packs may also contain modifications you are not aware of, making things not look the way you want them to. If you are experiencing any visual issue and are using a custom client or resource pack, try it with a clean vanilla client. If it works there, it's an issue with the client / resource pack and TAB cannot do anything about it. Here are a few bugs in LunarClient / FeatherClient that you may run into when using TAB: * They add their icon to players in tablist, but don't widen the entries. This results in player names overlapping with latency bar. You can avoid this by configuring some spaces in tabsuffix. * They don't support color field in chat components, which means they don't support RGB codes and will display bossbar without colors as well. * Bossbar is not visible on 1.8. * Rendering belowname 3 times. - * They don't respect nametag visibility rule, showing own nametag using F5 even if set to invisible by the plugin. - * When scoreboard is set to use all 0s, lines are rendered in opposite order on 1.20.3+. + * They don't respect nametag visibility rule, showing their own nametag using F5 even if set to invisible by the plugin. + * When the scoreboard is set to use all 0s, lines are rendered in opposite order on 1.20.3+. * They don't display 1.20.3+ NumberFormat feature in scoreboard objectives. * **Random Spigot/BungeeCord forks** - All safe patches for improving security & performance are present in well-known public opensource projects, such as Paper, Purpur or Waterfall. Using a random overpriced closed-source (and probably obfuscated) fork from BuiltByBit may not be safe, since they likely include unsafe patches that may break compatibility with plugins in an attempt to fix things that are not broken. Before spending your entire budget on such fork, reconsider it first. Paper (and its forks) is a performance-oriented fork used by 2/3 of all MC servers worldwide, while the rest is still stuck on Spigot. It is highly unlikely your needs are so specific you need every single "improvement" anyone can come up with. If you need a feature, Purpur is a feature-oriented fork. Together with plugins you should achieve what you are looking for. \ No newline at end of file diff --git a/.github/wiki/developer_api.md b/.github/wiki/developer_api.md index 4b55817e2..66eed15bb 100644 --- a/.github/wiki/developer_api.md +++ b/.github/wiki/developer_api.md @@ -12,7 +12,6 @@ * [Sorting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist#api) * [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting#api) * [Placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders#api) -* [Unlimited nametag mode](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Unlimited-nametag-mode#api) # Adding the dependency @@ -27,12 +26,12 @@ For Maven users, you can add the API dependency like this: com.github.NEZNAMY TAB-API - 5.0.0 + 5.0.2 provided ``` -Or, for Gradle users, here's a few examples: +Or, for Gradle users, here are a few examples: Groovy: ```groovy @@ -41,7 +40,7 @@ repositories { } dependencies { - compileOnly 'com.github.NEZNAMY:TAB-API:5.0.0' + compileOnly 'com.github.NEZNAMY:TAB-API:5.0.2' } ``` @@ -52,7 +51,7 @@ repositories { } dependencies { - compileOnly("com.github.NEZNAMY", "TAB-API", "5.0.0") + compileOnly("com.github.NEZNAMY", "TAB-API", "5.0.2") } ``` @@ -62,17 +61,27 @@ If you relocate, the API that you are calling will also get relocated in your co Ensure that you are using **`provided` for Maven**, or **`compileOnly` for Gradle**. # Getting started -First of all, you need to get an instance of the API. You can do this with `TabAPI.getInstance()`. -The `TabAPI` class that you want to import is located in the `me.neznamy.tab.api` package. If you do not see this imported, or it is imported but the package is not `me.neznamy.tab.api`, then you have the **wrong class**. +First, you need to get an instance of the API. +You can do this with `TabAPI.getInstance()`. +The `TabAPI` class that you want to import is located in the `me.neznamy.tab.api` package. +If you do not see this imported, +or it is imported but the package is not `me.neznamy.tab.api`, then you have the **wrong class**. Now you have the instance, you can get a `TabPlayer` with the methods `getPlayer(UUID)` and `getPlayer(String)`, to get players by UUID and name respectively. If no player was found with the UUID or the name that you gave, these methods will return `null`. It is important that you catch this, to avoid running in to a `NullPointerException`. You should **NOT** assume that just because a player has logged in that TAB will already have a player for them, as players are processed asynchronously. This will be especially true for join events like `PlayerJoinEvent`. -If you want to be 100% sure that the player you want is loaded when you want to process them, use `PlayerLoadEvent`. This will give you the `TabPlayer` that has been loaded, so that you can process that `TabPlayer`. See below for more details how to use the event. +If you want to be 100% sure that the player you want is loaded when you want to process them, use `PlayerLoadEvent`. +This will give you the `TabPlayer` that has been loaded, so that you can process that `TabPlayer`. +See below for more details on how to use the event. # Lifespan of API calls -All API calls result in temporary changes to the plugin's logic. When the plugin is reloaded or server restarted, all previous API calls will lose effect. This also applies for players after they reconnect - they are reset back. If you want to perform long-term changes to player's prefix or suffix, call TAB's [commands](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions) from your plugin. -If you want to re-apply your changes on plugin reload, listen to [events](#events) using plugin's own event system, specifically `TabLoadEvent`, which is called on plugin reload. +All API calls result in temporary changes to the plugin's logic. +When the plugin is reloaded or server restarted, all previous API calls will lose effect. +This also applies for players after they reconnect—they are reset back. +If you want to perform long-term changes to player's prefix or suffix, +call TAB's [commands](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions) from your plugin. +If you want to re-apply your changes on plugin reload, listen to [events](#events) using plugin's own event system, +specifically `TabLoadEvent`, which is called on plugin reload. # Events TAB is using a custom platform-independent event API. As such, the same event listener code will work on all supported platforms. Usage is also different, let's take a look at an example: @@ -82,7 +91,7 @@ TabAPI.getInstance().getEventBus().register(PlayerLoadEvent.class, event -> { //do something }); ``` -Currently, the plugin provides 3 events: +TAB plugin provides the following events: * `TabLoadEvent` - Called when the plugin has finished its load, either on startup or plugin reload. * `PlayerLoadEvent` - Called when the plugin has finished loading a player (either join or plugin reload). * `PlaceholderRegisterEvent` - Called when the plugin is about to register a parser for used PlaceholderAPI placeholder, allowing to override it. \ No newline at end of file diff --git a/.github/wiki/error_logging.md b/.github/wiki/error_logging.md index 1a8b06de2..0c96318b8 100644 --- a/.github/wiki/error_logging.md +++ b/.github/wiki/error_logging.md @@ -5,24 +5,48 @@ * [anti-override.log](#anti-overridelog) # About -TAB logs various events in up to 3 files to keep the console clean. All of these notifications are negative, so they should be looked at. +TAB logs various events in multiple files to keep the console clean. +All of these notifications are negative, so they should be looked at. -Files are only created when something is about to get logged. This means if you have none of these files in your folder, everything is good. Also, it is safe to delete the logs any time while server is running without needing to reload the plugin or anything. +Files are only created when something is about to get logged. +This means if you have none of these files in your folder, everything is good. +It is safe to delete the logs any time while the server is running without needing to reload the plugin or anything. -All files have their sizes limited to 16 MB to avoid giant files consisting of the same error repeating over and over. Don't forget these files are **logs**, therefore, after solving the problems you must delete them. These files will not delete themselves. -After deleting a file, there is no need to perform any other action. Every time an error is about to be logged, file is created if it doesn't exist. +All files have their sizes limited to 16 MB to avoid giant files consisting of the same error repeating over and over. +Remember these files are **logs**; therefore, after solving the problems you must delete them. +These files will not delete themselves. +After deleting a file, there is no need to perform any other action. +Every time an error is about to be logged, the file is created if it doesn't exist. -Java errors usually contain stack traces. If you got an error spamming with exception message but no stack trace, the most common cause is java not including it because too many errors were thrown already. To bypass this check, add `-XX:-OmitStackTraceInFastThrow` to your startup parameters. +Java errors usually contain stack traces. +If you got an error spamming with an error message but no stack trace, +the most common cause is java not including it because too many errors were thrown already. +To bypass this check, add `-XX:-OmitStackTraceInFastThrow` to your startup parameters. # errors.log -No one likes having their console spammed with errors. Fixing errors is the most reliable solution, however that takes time and you usually don't get an update fixing an error the second you report it. Because of that, all plugin errors are moved to this file instead. +No one likes having their console spammed with errors. +Fixing errors is the most reliable solution, however, that takes time, +and you usually don't get an update fixing an error the second you report it. +Because of that, all plugin errors are moved to this file instead. # placeholder-errors.log -This file is used to track errors thrown by PlaceholderAPI expansions when trying to retrieve value of a placeholder. These should be reported to the expansion author. First line(s) of error should give you a good idea which expansion it is, as well as the actual placeholder which threw the error (displayed on top of the error). +This file is used +to track errors thrown by PlaceholderAPI expansions when trying to retrieve the value of a placeholder. +These should be reported to the expansion author. +First line(s) of error should give you a good idea which expansion it is, +as well as the actual placeholder which threw the error +(displayed on top of the error). # anti-override.log -This file logs all attempts of other plugins to override TAB's visuals. This is checking for features that only 1 plugin can be displaying info in at once (such as nametag prefix/suffix, tablist prefix/suffix). This means that (at least) one of your plugins is not configured correctly and you didn't disable functions you don't want. If you want TAB to use a feature, disable it in other plugins. If you want a different plugin to display it, disable it in TAB (disabled features do not log this). +This file logs all attempts of other plugins to override TAB's visuals. +This is checking for features that only a single plugin can be displaying info in at once +(such as nametag prefix/suffix, tablist prefix/suffix). +This means that (at least) one of your plugins is not configured correctly, +and you didn't disable functions you don't want. +If you want TAB to use a feature, disable it in other plugins. +If you want a different plugin to display it, disable it in TAB (disabled features do not log this). It is unfortunately not possible to easily figure out which plugin is causing it, you can only guess from the message. -Although this is technically unnecessary since TAB automatically blocks other plugins from overriding it, it's good to have your plugins configured properly. This might come in handy when moving TAB from bukkit to bungeecord where anti-override does not work too well due to missing functions in bungeecord, so you won't suddenly experience half of the features to not work when moving to bungeecord. \ No newline at end of file +Although this is technically unnecessary since TAB automatically blocks other plugins from overriding it, +it's good to have your plugins configured properly. \ No newline at end of file diff --git a/.github/wiki/feature_guide_belowname.md b/.github/wiki/feature_guide_belowname.md index 6e47c16a6..cb2375da6 100644 --- a/.github/wiki/feature_guide_belowname.md +++ b/.github/wiki/feature_guide_belowname.md @@ -11,41 +11,49 @@ * [Limitations](#limitations) * [Examples](#examples) * [Example 1 - Per-world values](#example-1---per-world-values) - * [Example 2 - Hiding `text` for 1.20.3+ players](#example-2---hiding-text-for-1203-players) + * [Example 2 - Hiding `title` for 1.20.3+ players](#example-2---hiding-title-for-1203-players) # About -The scoreboard objective with BELOW_NAME display slot that adds another line of text below nametag of players. It is only visible on players within 8 block range. This value is client sided and cannot be changed by the plugin. +The scoreboard objective with BELOW_NAME display slot that adds another line of text below nametag of players. +It is only visible on players within 8-block range. +This value is client sided and cannot be changed by the plugin. ![](https://images-ext-1.discordapp.net/external/YlGPCRDJVeZZI0TPWmVBKyHszxSkjatmclyqUThvTz8/https/image.prntscr.com/image/jcETUzVQQYqectQ2aI4iqQ.png) This line automatically appears on all player entities when enabled. **Therefore, it is not possible to only display it on some players or not display it on NPCs**. The feature can be configured in **config.yml** under **belowname-objective** section. -The feature's properties are displayed as `[score]` + space + `text`, where `[score]` is: -* `number` for 1.20.2- (will show `0` on NPCs) -* `fancy-display-players` for 1.20.3+ (will show `fancy-display-default` on NPCs) +The feature's properties are displayed as `[score]` + space + `title`, where `[score]` is: +* `value` for 1.20.2- (will show `0` on NPCs) +* `fancy-value` for 1.20.3+ (will show `fancy-value-default` on NPCs) # Configuration | Option name | Default value | Description | | ------------- | ------------- | ------------- | | enabled | true | Enables / Disables the feature | -| number | %health% | [1.20.2-] An integer from -2147483648 to 2147483647, doesn't support decimal values. The number is always white. Supports placeholders with player-specific output, such as player health. Only visible on 1.20.2 and lower.
**Note**: Even if you only support 1.20.3+, you still need to configure this value to properly evaluate to a number, because the value is still sent to the client (just not displayed). You can set it to `0` for simiplicity. | -| fancy-display-players | &c%health% | [1.20.3+] Any text, supports placeholders with per-player output. Only visible on 1.20.3+. | -| fancy-display-default | NPC | [1.20.3+] Default display for all player entities. Plugin uses the value above for every real player, therefore this default value will only appear on player entities which are not actual players, a.k.a. NPCs. Only visible on 1.20.3+. | -| text | Health | Text displayed after number. It is formally called scoreboard title, which is displayed on all player entities and value is shared on all players and therefore not bound to specific players, which makes it unable to display the value per-player. It should only contain static text or placeholders which return same value for all players. All inserted placeholders are parsed for the player viewing the text. This is intentional to allow advanced configuration with conditions for per-world values for example. | +| value | %health% | [1.20.2-] An integer from -2147483648 to 2147483647, doesn't support decimal values. The number is always white. Supports placeholders with player-specific output, such as player health. Only visible on 1.20.2 and lower.
**Note**: Even if you only support 1.20.3+, you still need to configure this value to properly evaluate to a number, because the value is still sent to the client (just not displayed). You can set it to `0` for simplicity. | +| fancy-value | &c%health% | [1.20.3+] Any text, supports placeholders with per-player output. Only visible on 1.20.3+. | +| fancy-value-default | NPC | [1.20.3+] Default display for all player entities. Plugin uses the value above for every real player, therefore this default value will only appear on player entities which are not actual players, a.k.a. NPCs. Only visible on 1.20.3+. | +| title | Health | Text displayed after `value`. It is formally called scoreboard title, which is displayed on all player entities and value is shared on all players and therefore not bound to specific players, which makes it unable to display the value per-player. It should only contain static text or placeholders which return same value for all players. All inserted placeholders are parsed for the player viewing the text. This is intentional to allow advanced configuration with conditions for per-world values for example. | | disable-condition | %world%=disabledworld | A [condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) that must be met for disabling the feature for players. Set to empty for not disabling the feature ever. | # Additional Info ## Additional note 1 - Copying nametag visibility rule -The minecraft feature is programmed to be affected by nametag visibility rule. This means that when nametag is set to invisible, belowname will be invisible as well. +The minecraft feature is programmed to be affected by nametag visibility rule. +This means that when the nametag is set to invisible, belowname will be invisible as well. ## Additional note 2 - Hidden on sneak on 1.8 Belowname is not visible on 1.8.x clients when player is sneaking. This is client-sided behavior and cannot be changed by the server. ## Additional note 3 - Visible on NPCs -Belowname objective is automatically attached to all entities of player type with the default value of `0` (<1.20.3) or value configured as `fancy-display-default` (1.20.3+). This includes player NPCs. +Belowname objective is automatically attached to all entities of player type with the default value of +`0` (<1.20.3) or value configured as `fancy-value-default` (1.20.3+). +This includes player NPCs. -There is currently only 1 way to make them not visible on NPCs. From [Additional note 1 - Copying nametag visibility rule](#additional-note-1---copying-nametag-visibility-rule) we know that belowname is not visible if player's nametag is invisible. NPC plugin can take advantage of this by using teams to hide the original name and display a hologram instead. +There is currently only one way to make them not visible on NPCs. +From [Additional note 1 - Copying nametag visibility rule](#additional-note-1---copying-nametag-visibility-rule) we know +that belowname is not visible if player's nametag is invisible. +NPC plugin can take advantage of this by using teams to hide the original name and display a hologram instead. This is how you can achieve it using the following popular NPC plugins: * **Citizens**: @@ -55,10 +63,12 @@ This is how you can achieve it using the following popular NPC plugins: # Tips & Tricks ## Tip 1 - Heart symbol -If you want to show health of players and display a heart symbol as text, you can use this one: `❤`. Make sure you [save config in UTF-8 encoding](https://github.com/NEZNAMY/TAB/wiki/How-to-save-the-config-in-UTF8-encoding) so it's loaded correctly. +If you want to show health of players and display a heart symbol as text, you can use this one: `❤`. +Make sure you [save config in UTF-8 encoding](https://github.com/NEZNAMY/TAB/wiki/How-to-save-the-config-in-UTF8-encoding), +so it's loaded correctly. ``` belowname-objective: - text: "&4❤" + title: "&4❤" ``` ## Tip 2 - Displaying health as 0-10 or in % @@ -67,14 +77,21 @@ If you want health to display health as 0-10 instead of 0-20, you can achieve it * `%math_0_{player_health}*5%` for 0-100 # Limitations -* The format is a **[score] + space + shared text**, where [score] is either a white number (1.20.2-) or any text (1.20.3+). -* The text is same on all players, therefore cannot be personalized (such as player's faction). Only the [score] can be per-player. -* It appears on all entites of player type. **This includes player NPCs.** -* Text length is limited to 32 characters on <1.13 +* The format is a **[score] + space + shared title**, where [score] is either a white number (1.20.2-) or any text (1.20.3+). +* The title is the same on all players, therefore, it cannot be personalized (such as player's faction). Only the [score] can be per-player. +* It appears on all entities of player type. **This includes player NPCs.** +* Title length is limited to 32 characters on <1.13 # Examples ## Example 1 - Per-world values -This feature doesn't directly support per-world values or similar. However, this can be achieved with conditions. Let's make `fancy-display-players` conditional based on world. Let's make an example with 3 worlds. Check if player is in world `world1`, then show one text. If not, check if player is in world `world2`, then show another text. If not, show final text. This can be achieved by chaining 2 conditions: +This feature doesn't directly support per-world values or similar. +However, this can be achieved with conditions. +Let's make `fancy-value` conditional based on player's world. +Let's make an example with 3 worlds. +Check if player is in world `world1`, then show one text. +If not, check if player is in world `world2`, then show another text. +If not, show the final text. +This can be achieved by chaining 2 conditions: ``` conditions: belowname1: @@ -90,19 +107,31 @@ conditions: ``` **WARNING: DO NOT JUST RANDOMLY PASTE THIS ENTIRE "CONDITIONS" SECTION INTO YOUR CONFIG! INSTEAD, EDIT YOUR EXISTING CONDITIONS SECTION TO PREVENT HAVING THE SECTION TWICE, HAVING SECOND ONE COMPLETELY OVERRIDE THE FIRST ONE!!!** -Finally, use this condition as value in `fancy-display-players`: +Finally, use this condition as value in `fancy-value`: ``` belowname-objective: - fancy-display-players: "%condition:belowname1%" + fancy-value: "%condition:belowname1%" ``` -If you are under 1.20.3 and want to make `number` and `text` conditional, create 2 condition chains, one for each value and use them. - -*Note: This is just an example, the plugin is not limited to displaying different values only per world. If you want per server values on BungeeCord, use %server% with server names. If you want worldguard regions, use %worldguard_region_name% with region names. This works for any placeholder offered by the plugin or by PlaceholderAPI.* - -## Example 2 - Hiding `text` for 1.20.3+ players -1.20.3 has replaced `number` field, which is limited to a white number with value configurable as `fancy-display-players`, which has no limits. However, `text` field is still visible on 1.20.3+. If you support both version ranges and want to make the best out of the new functionality, you might want to not show `text` to 1.20.3+ players anymore, since you can fully customize the text you want to display in `fancy-display-players`. - -First, let's remind outselves what `text` *actually* is. It is actually called scoreboard title. Yes, just like the one on top of sidebar, just displayed elsewhere. This is why it displays on all players and placeholders are parsed for the viewing player. With this knowledge, all we need to do is check for player's version and only show something for <1.20.3. For this, we will use `%player-version-id%` placeholder, which returns network protocol version of player's game version, which can then be compared to. +If you are under 1.20.3 and want to make `value` and `title` conditional, +create two condition chains, one for each value and use them. + +*Note: This is just an example, the plugin is not limited to displaying different values only per world. If you want per server values on BungeeCord, use %server% with server names. If you want WorldGuard regions, use %worldguard_region_name% with region names. This works for any placeholder offered by the plugin or by PlaceholderAPI.* + +## Example 2 - Hiding `title` for 1.20.3+ players +1.20.3 has replaced `value` field, +which is limited to a white number with value configurable as `fancy-value`, which has no limits. +However, `title` field is still visible on 1.20.3+. +If you support both version ranges and want to make the best out of the new functionality, +you might want to not show `title` to 1.20.3+ players anymore, +since you can fully customize the text you want to display in `fancy-value`. + +First, let's remind ourselves what `title` *actually* is. +It is actually called scoreboard title. +Yes, just like the one on top of sidebar, just displayed elsewhere. +This is why it displays on all players and placeholders are parsed for the viewing player. +With this knowledge, all we need to do is check for player's version and only show something for <1.20.3. +For this, we will use `%player-version-id%` placeholder, +which returns the network protocol version of player's game version, which can then be compared to. ``` conditions: version: @@ -113,6 +142,9 @@ conditions: **WARNING: DO NOT JUST RANDOMLY PASTE THIS ENTIRE "CONDITIONS" SECTION INTO YOUR CONFIG! INSTEAD, EDIT YOUR EXISTING CONDITIONS SECTION TO PREVENT HAVING THE SECTION TWICE, HAVING SECOND ONE COMPLETELY OVERRIDE THE FIRST ONE!!!** ``` belowname-objective: - text: "%condition:version%" + title: "%condition:version%" ``` -Unfortunately, due to the limitations of this feature, there is a forced space between `number`/`fancy-display-players` and `text`, even if the `text` is empty. You'll either need to live with it, or put some shared text there to avoid having a space at the end. \ No newline at end of file +Unfortunately, due to the limitations of this feature, +there is a forced space between `value`/`fancy-value` and `title`, +even if the `title` is empty. +You'll either need to live with it, or put some shared text there to avoid having a space at the end. \ No newline at end of file diff --git a/.github/wiki/feature_guide_bossbar.md b/.github/wiki/feature_guide_bossbar.md index 27056329c..ffd364859 100644 --- a/.github/wiki/feature_guide_bossbar.md +++ b/.github/wiki/feature_guide_bossbar.md @@ -21,7 +21,11 @@ # About ![](https://images-ext-2.discordapp.net/external/0H5v5gcK12jm-O_kljlx-iYdJ1Q3wBsY_Dch7Jr_aAk/https/image.prntscr.com/image/x4VewIuiRwO-XLGTvDxfWw.png) -Bars with text on top of the screen originally designed to display health of ender dragon & wither, but plugins found another use for it. In 1.9 mojang added a packet dedicated to displaying text without requiring an entity and allowing customizable color and style as well. TAB only supports this new functionality and the feature does not support 1.8 and lower. +Bars with text on top of the screen originally designed to display the health of ender dragon & wither, +but plugins found another use for it. +In 1.9, mojang added a packet +dedicated to displaying text without requiring an entity and allowing customizable color and style as well. +TAB only supports this new functionality, and the feature does not support 1.8 and lower. This feature can be configured in **config.yml** under **bossbar** section. @@ -58,7 +62,8 @@ A number from 0 to 100. Accepts decimals. If you want to show the progress of a placeholder's value relative to a maximum one, you can use the [Math Expansion](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders#math) from PlaceholderAPI and use a placeholder like this one: `%math_{placeholder_current_value}/{placeholder_max_value}*100%` or `%math_{placeholder_current_value}/*100%` if your max value is fixed. Notes: -Replace the text in between the `{}` with the actual placeholder you want to use and `` with a valid number (i.e. 20). +Replace the text in between the `{}` with the actual placeholder you want to use and `` with a valid number +(i.e., 20). You cannot use the `%placeholder%` format inside the math placeholder. Example for showing a player's health: `%math_{player_health}/20*100%` or `%math_{player_health}/{player_max_health}*100%` @@ -96,7 +101,10 @@ bossbar: `/tab bossbar announce