Compare commits

...
760 Commits
Author SHA1 Message Date
NEZNAMY bef190ddd7 6.0.2 2026-04-25 18:06:51 +02:00
NEZNAMY cf320b3fa2 [GitHub] Fix compilation 2026-04-25 16:47:32 +02:00
NEZNAMY 34c8745fa9 [Build] Add another shadow jar task for non-modded platforms to avoid error on Paper 1.20.5 - 1.21.4 2026-04-25 16:37:52 +02:00
NEZNAMY 8096ff7f98 Merge pull request #1646 from JT122406/master
Fabric and NeoForge for 26.1.2
2026-04-25 15:48:02 +02:00
NEZNAMY dad3006f84 Refactor TabListEntryTracker into an interface to avoid class loading error on Bukkit 1.7.10 2026-04-23 20:15:50 +02:00
NEZNAMY 0e35f15a86 [Bukkit] Change check to avoid false flag on modded servers 2026-04-23 17:29:08 +02:00
NEZNAMY d423740273 [Nametags] Prefer color codes for team color over magic codes if both are used 2026-04-22 18:11:07 +02:00
NEZNAMY 49f489c4dc [Teams] [Performance] Only send teams to players visible in the tablist, small refactor and a bug fix with disable-condition 2026-04-22 17:48:46 +02:00
NEZNAMY ac71bf2111 [Bossbar] Add more info to dump command output 2026-04-20 19:57:40 +02:00
Joseph T. McQuigg 6d40dd12fa Java 25 in fabric.mod.json 2026-04-19 15:11:46 -04:00
Joseph T. McQuigg a732abcdd6 Refresh 2026-04-19 14:42:25 -04:00
Joseph T. McQuigg c2f90f9daf Fix Credits, Fix Version Numbers 2026-04-19 14:37:29 -04:00
Joseph T. McQuigg 898f56c32a Forge for 26.1.2/1/0 (Non-Working) 2026-04-19 14:17:53 -04:00
Joseph T. McQuigg 2ebc4384f5 NeoForge for 26.1.2/1/0 2026-04-19 13:55:57 -04:00
Joseph T. McQuigg 687b8d5e29 Fabric for 26.1.2/1/0 2026-04-19 13:38:28 -04:00
NEZNAMY d09d95e069 6.0.2-SNAPSHOT 2026-04-19 17:57:05 +02:00
NEZNAMY 4dffc1ffe9 [Bukkit] Update supported version interval in error message 2026-04-16 19:01:30 +02:00
NEZNAMY f3b2cfbb87 [Description] Update badges 2026-04-13 17:02:47 +02:00
NEZNAMY 4af57308d3 6.0.1 2026-04-13 16:44:57 +02:00
NEZNAMY 28ecf8666c [Velocity] Update to VelocityScoreboardAPI 2.0.0 2026-04-13 16:43:08 +02:00
NEZNAMY 1f3d1beb8f Merge pull request #1643 from lokspel/master
26.1.2 is supported
2026-04-12 15:45:57 +02:00
MISHAandNEZNAMY 96d21bc544 Update bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/ServerVersionInfo.java
Co-authored-by: NEZNAMY <martinmiklovicmm@gmail.com>
2026-04-12 14:27:54 +04:00
MISHA f5cb2b5a1d Update ServerVersionInfo.java 2026-04-12 09:32:08 +04:00
MISHA d1d6e73bbc Update ProtocolVersion.java 2026-04-12 09:31:13 +04:00
NEZNAMY 2321ae1c0c [Dump] Include floodgate install status next to player's bedrock status 2026-04-09 19:01:48 +02:00
NEZNAMY 982ee5b6bf [MySQL] Do not relocate driver due to a startup error on NeoForge 2026-04-09 18:11:35 +02:00
NEZNAMY dbe699843b [Dump] Sort plugins/mods alphabetically 2026-04-09 18:09:59 +02:00
NEZNAMY fda19760bd [Bukkit] Compile v26_1 module with Java 21 instead of 25 (#1640) 2026-04-09 17:23:48 +02:00
NEZNAMY 97d42152cd [Configuration] Fix NPE in config conversion 2026-04-07 17:57:21 +02:00
NEZNAMY 5981607783 Fix memory leak 2026-04-06 13:14:58 +02:00
NEZNAMY 7b7927f328 [Code style] Separate methods from class to clean it up 2026-04-05 12:47:07 +02:00
NEZNAMY a8e2730f2f [Performance] Do not send plugin messages about placeholder values if tab expansion is disabled 2026-04-05 12:05:06 +02:00
NEZNAMY 7ae18187bc 6.0.1-SNAPSHOT 2026-04-05 12:03:38 +02:00
NEZNAMY 02634c531f [Wiki] Monthly wiki backup for changes made in March 2026 2026-04-04 16:55:16 +02:00
NEZNAMY 5e8ff89c43 [Description] Update badges 2026-04-04 14:04:35 +02:00
NEZNAMY 2f307c492f 6.0.0 2026-04-04 13:24:48 +02:00
NEZNAMY e4b3e17c14 [Bukkit] Update unsupported server version message 2026-04-04 13:24:32 +02:00
NEZNAMY 66d14a0754 [Bukkit] Refactor server version detection for new Paper format and mark 26.1(.1) as compatible 2026-04-04 13:21:01 +02:00
NEZNAMY cb47dcbe12 [Bukkit] [Code style] Create variable instead of repeatedly calculating it 2026-04-03 18:43:25 +02:00
NEZNAMY ea15b40e05 Acknowledge 26.1.1 2026-04-03 18:01:34 +02:00
NEZNAMY 93cfd74fc0 [Bukkit] Refactor NMS implementation finding 2026-04-03 16:17:09 +02:00
NEZNAMY 79eb6a9078 [Bukkit] Rename classes and add console print 2026-04-03 12:54:07 +02:00
NEZNAMY 2e9e5042e1 Improve handling of IO errors on startup 2026-04-03 12:34:59 +02:00
NEZNAMY bb520edd53 [Bukkit] Catch correct exception and improve error message 2026-03-31 19:13:57 +02:00
NEZNAMY 2beb9563bb [BossBar] Forward UUID to platforms to prepare for 26.1 changes 2026-03-31 17:02:28 +02:00
NEZNAMY 87c15f7611 Bump dependencies 2026-03-31 16:35:52 +02:00
NEZNAMY 655bc176fa [Scoreboard] Fix line score recalculate issue (#1632) 2026-03-30 19:43:59 +02:00
NEZNAMY 66cb30d235 [Commands] Register debug command back to inform users about dump command 2026-03-28 19:32:43 +01:00
NEZNAMY cbe0b25b5f Java 25 and Spigot 26.1 support 2026-03-28 18:22:08 +01:00
NEZNAMY a8ccf4e1c9 Properly initialize minor version for 26.1 2026-03-28 18:17:04 +01:00
NEZNAMY cce29c51e3 Add 26.1 protocol constant 2026-03-25 17:24:49 +01:00
NEZNAMY 242015b0cc [Per world playerlist] Further improve compatibility with vanish plugins (#1621) 2026-03-24 17:41:56 +01:00
NEZNAMY f209e1b0f9 [Per world playerlist] Add vanish check for better compatibility with other plugins (#1621) 2026-03-21 16:16:06 +01:00
NEZNAMY 8a1ab06585 [Bukkit] Update bStats chart 2026-03-21 15:33:21 +01:00
NEZNAMY 50e817a86d [Per world playerlist] Use modern showPlayer/hidePlayer methods with plugin argument for better compatibility with other plugins (#1621) 2026-03-21 10:45:14 +01:00
NEZNAMY dbd596f079 [Belowname / Playerlist objective] Improve parity between the features 2026-03-09 18:43:34 +01:00
NEZNAMY f8e3a07e6f [Belowname / Playerlist objective] Finish vanish support checks after #1629 2026-03-09 17:49:47 +01:00
NEZNAMY ccd4ac3271 Merge pull request #1629 from c0bl/fix/vanished_score_packets
Consider canSee in YellowNumber.java setScore
2026-03-09 17:46:54 +01:00
c m fce1925448 consider canSee when sending scoreboard score packets in yellownumber feature 2026-03-08 21:14:14 -04:00
NEZNAMY 335eb5ef4d [Wiki] Monthly wiki backup for changes made in February 2026 2026-03-08 08:37:45 +01:00
NEZNAMY 654c40b892 [MySQL] Include MySQL driver in the jar for it to work on Velocity and modded platforms (#1620) 2026-03-07 11:46:09 +01:00
NEZNAMY a937243cdf [Dump command] Add proxy players to nametag player table 2026-03-03 17:17:13 +01:00
NEZNAMY 665d6baf1c [Configuration] Add config conversion for the new option (#1626) 2026-03-02 18:41:53 +01:00
NEZNAMY b4d326b52c Merge pull request #1626 from BlvckBytes/placeholders_locale
[Placeholders] Added locale of date-/time-format to config.yml
2026-03-02 18:26:36 +01:00
BlvckBytes 3aacec826b [Placeholders] Added locale of date-/time-format to config.yml 2026-03-01 22:42:27 +01:00
NEZNAMY 3261856385 [Forge/NeoForge] Remove redundant content for easier backporting 2026-02-28 18:05:51 +01:00
NEZNAMY 8cf479bf3b [Forge/NeoForge] Workaround to fix tablist tracking not working properly caused by events being fired too late (#1623) 2026-02-28 11:21:34 +01:00
NEZNAMY 3c3ef636eb [Code style] Remove redundant calls 2026-02-21 21:49:06 +01:00
NEZNAMY 3bd0b13740 [Bukkit] Fix error on Folia 2026-02-15 13:48:34 +01:00
NEZNAMY 92349227a2 Merge pull request #1617 from Arava-0/feat/scoreboard-api-setLines
feat(scoreboard): add setLines method for dynamic line updates
2026-02-13 16:47:01 +01:00
Arava-0 4dfc2a638a feat(scoreboard): add setLines method for dynamic line updates
- Introduces a new method to replace all current scoreboard lines with a provided list.
- Prevents unnecessary updates if the new list is identical to the current one.
2026-02-13 14:58:36 +01:00
NEZNAMY d7c73a8072 [Tablist Formatting] Add information about proxy players to dump output 2026-02-10 17:44:55 +01:00
NEZNAMY 297acc0322 [Belowname & Playerlist objectives] Add information about proxy players to dump output 2026-02-10 17:14:44 +01:00
NEZNAMY 1126b3b471 [Global playerlist] Do not remove players from the same server on quit, let backend handle it (#1611) 2026-02-08 18:07:59 +01:00
NEZNAMY ac59973283 [Tablist] Use ConcurrentHashMap as WeakHashMap was not used the intended way anyway (also may have been causing an issue) 2026-02-08 16:00:15 +01:00
NEZNAMY 4b130ed71d Update Gradle 9.1.0 -> 9.3.1 2026-02-07 18:13:00 +01:00
NEZNAMY ce90a33ce9 [BossBar] Fix unfreezing issue on Velocity and rename some methods (#1610) 2026-02-07 10:09:42 +01:00
NEZNAMY 50fee32218 [Velocity] Bump minimum required Velocity build to 546 (after the bossbar bug was partially fixed) to avoid my head exploding when trying to fix the issue in TAB (and having to make it support the older versions as well) (#1610) 2026-02-06 20:02:51 +01:00
NEZNAMY 39334a4cd9 [Dump command] Add placeholders sent by bridge on proxy installation 2026-02-04 18:26:12 +01:00
NEZNAMY fec2131ba8 [Wiki] Monthly wiki backup for changes made in January 2026 2026-02-02 17:57:02 +01:00
NEZNAMY 7c63436da4 Fix error 2026-02-01 15:05:41 +01:00
NEZNAMY de8fe63bd0 [Components] Partially implement click event and use it in dump command to make the link clickable 2026-01-31 14:40:07 +01:00
NEZNAMY 1c22f2387b [Sorting] Remove redundant variable 2026-01-31 11:16:49 +01:00
NEZNAMY e1b277582a [Sorting] Remove team name note tracking as debug command was deleted and dump already contains this information in a better way 2026-01-31 10:44:11 +01:00
NEZNAMY 94acc4f356 [Placeholders] Create class for holding placeholders to fix issues with re-registering placeholders 2026-01-31 10:39:58 +01:00
NEZNAMY 9afb62a6a4 [Placeholders] Simplify internal placeholder refresh interval handling and make it technically closer to simply pretending they are in the config 2026-01-30 18:58:15 +01:00
NEZNAMY 95ed957d54 [Configuration] Remove comment from default config that is no longer true 2026-01-30 17:10:24 +01:00
NEZNAMY 58814bc2da [API] [Layout] Add method for fixed slot ping as string 2026-01-29 16:07:13 +01:00
NEZNAMY 9e7556c3c1 [Dump Command] Do not show anonymous conditions as they are ugly in the output 2026-01-27 17:42:43 +01:00
NEZNAMY abaf723fb7 [Tablist Formatting] Fix tracked name not being assigned if target player cannot be seen, breaking the feature on server switch 2026-01-26 20:18:51 +01:00
NEZNAMY f52e99c86e [Conditions] Fix conditions not refreshing 2026-01-26 19:05:06 +01:00
NEZNAMY d6e70c35d8 [Dump Command] [Nametags] Dump all display values for all players in a table 2026-01-26 17:55:11 +01:00
NEZNAMY 4c91e73f0e [API] [Layout] Add method for specifying slot count when creating a new layout 2026-01-26 17:16:38 +01:00
NEZNAMY d083fc6e43 [Dump Command] Add table of tablist formatting for all players into dump 2026-01-25 19:47:35 +01:00
NEZNAMY ff2df25e3b [Commands] Delete debug command and update references to dump command 2026-01-25 17:10:40 +01:00
NEZNAMY 86c2342097 Replace most minor version checks with protocol version to prepare for new versioning system. 2026-01-25 16:49:28 +01:00
NEZNAMY 6dbd176683 [Dump Command] Include bridge info about player on proxy installation 2026-01-25 16:06:36 +01:00
NEZNAMY 141aab1c22 [Dump Command] Include list of downloaded PlaceholderAPI expansions 2026-01-25 15:29:10 +01:00
NEZNAMY 126ea4f456 [Dump Command] Print values for all players in belowname and playerlist objectives instead of just the selected player 2026-01-25 15:14:43 +01:00
NEZNAMY a0e5a97594 [Dump Command] Add general config settings to output 2026-01-25 14:54:19 +01:00
NEZNAMY 0420c11937 [Dump Command] Add placeholder-related config sections 2026-01-25 13:46:57 +01:00
NEZNAMY 27472fd387 [Dump Command] Format placeholder values in a table 2026-01-25 12:31:19 +01:00
NEZNAMY 104bdc646f [Dump Command] Improve sorting feature output 2026-01-25 11:44:34 +01:00
NEZNAMY cbc4c275d1 [Description] Update badges 2026-01-24 14:18:17 +01:00
NEZNAMY 372d51f873 Merge branch 'master' of https://github.com/NEZNAMY/TAB
# Conflicts:
#	build.gradle.kts
2026-01-24 14:16:40 +01:00
NEZNAMY 0dfd404215 5.5.0 2026-01-24 11:31:27 +01:00
NEZNAMY 21b7393274 [Dump command] Add more features to output 2026-01-23 20:03:14 +01:00
NEZNAMY dcd5f5a3e6 [Dump command] Improve output and create a class for features with display condition to avoid code duplication 2026-01-23 19:42:29 +01:00
NEZNAMY bf313b3ba1 [Commands] Use better error logging than e.printStackTrace() 2026-01-21 19:50:57 +01:00
NEZNAMY 5b4e3c479c [Commands] Add player info to dump command 2026-01-21 19:40:56 +01:00
NEZNAMY 6dedb05c29 [Commands] Drastically improve the new dump command 2026-01-21 18:18:31 +01:00
NEZNAMY 5f78e01342 [Commands] Initial implementation of /tab dump command 2026-01-18 17:38:07 +01:00
NEZNAMY 881506a3d5 [Tab expansion] Refactor the way data is stored. 2026-01-18 13:59:27 +01:00
NEZNAMY e26fc661b2 [Scoreboard] Execute scoreboard commands in scoreboard thread to avoid error 2026-01-17 20:50:19 +01:00
NEZNAMY f921758ec0 [Placeholders] Small optimization to replacing 2026-01-17 13:21:42 +01:00
NEZNAMY 01d65ba780 [Placeholders] Start rework of placeholder retrieving for better performance and dynamic placeholders 2026-01-17 12:29:55 +01:00
NEZNAMY d77e2d6f45 [Belowname] Clean up and use a different check for vanished players 2026-01-11 18:49:18 +01:00
NEZNAMY 7c30f55f31 [Bukkit] Remove support for several old MC versions 2026-01-11 16:48:47 +01:00
NEZNAMY c2d63865d5 [Bukkit] Repackage paper classes 2026-01-11 15:09:17 +01:00
NEZNAMY f406b518c0 [Bukkit] Add bStats chart 2026-01-11 15:01:42 +01:00
NEZNAMY 78f8c99f11 6.0.0-SNAPSHOT 2026-01-11 14:03:24 +01:00
NEZNAMY f97b9a419f [Performance] Clean up after PR #1600 2026-01-11 12:56:18 +01:00
NEZNAMY f2b88b8cd6 Merge pull request #1600 from groundbreakingmc/master
perf: replace String.format with StringBuilder for faster placeholder…
2026-01-11 12:20:22 +01:00
GroundbreakingMC cd06700c82 perf: implement element-based text parsing for cleaner placeholder replacement 2026-01-11 12:03:50 +01:00
NEZNAMY fa69040e00 Increase thread shutdown timeout to 5000 2026-01-11 11:19:48 +01:00
GroundbreakingMC fd88c1c0bb perf: skip StringBuilder allocation when no placeholders present 2026-01-11 07:22:23 +01:00
GroundbreakingMC cae7d8d061 perf: replace String.format with StringBuilder for faster placeholder replacement 2026-01-11 06:56:11 +01:00
NEZNAMY 2e1e24c225 Merge pull request #1599 from byPixelTV/master
feat: better wildcard support and enhanced pettern matching w/ regex for global player list
2026-01-10 18:47:56 +01:00
Lukas da0307b14f docs(global player list): describe new regex support in the wiki +
old wildcard support
2026-01-10 18:13:26 +01:00
Lukas 082c94ac07 fix(dependencies): change libs disguises repo because the old one is returning a 404 when trying to access it 2026-01-10 18:08:25 +01:00
Lukas 2ed4b1b6fc feat(global player list): enhance wildcard support and add advanced pattern matching w/ regex 2026-01-10 18:06:40 +01:00
NEZNAMY 8c7c8042e5 Merge pull request #1598 from Mattrolol/master
Layout: allow placeholder-based ping values for fixed slots
2026-01-07 18:47:06 +01:00
Mattrolol cca15a2b04 Fix fixed-slot ping validation and warnings 2026-01-07 11:43:05 -06:00
NEZNAMY 5f40411be0 [Debug] Add more messages unload 2026-01-07 18:00:30 +01:00
NEZNAMY 191273a728 [Debug] Add more messages on load/unload 2026-01-07 17:09:05 +01:00
Mattrolol 9eb9e9589f Allow placeholder-based ping values for fixed slots 2026-01-07 02:05:59 -06:00
NEZNAMY fdd45952c7 [Placeholders] Make %online_<server>% work on backend as well 2026-01-06 13:16:52 +01:00
NEZNAMY 98378b222d [Bukkit] Add relational placeholders into tab expansion and parse nested placeholders in normal placeholders 2026-01-03 09:45:52 +01:00
NEZNAMY 15a0446d70 [Conditions] Add warning text if condition is used in the wrong rel / non-rel way 2026-01-02 17:55:12 +01:00
NEZNAMY 7bd1b7c670 [Wiki] Monthly wiki backup for changes made in December 2025 2026-01-01 11:46:28 +01:00
NEZNAMY 46aaa47fdd [Forge] Add hook into a random Vanish mod for checking vanish status 2025-12-31 20:29:04 +01:00
NEZNAMY 2027e9f58e [Forge] Add support for ForgePlaceholderAPI 2025-12-31 17:51:32 +01:00
NEZNAMY 162e4690e9 [Scoreboard] Remove old options from valid key list 2025-12-30 21:06:22 +01:00
NEZNAMY c360575dec [Commands] Support args in dynamic commands 2025-12-28 17:45:56 +01:00
NEZNAMY 5b0354c2c0 [Layout] Rename "condition" to "display-condition" for better consistency with other features 2025-12-27 18:41:13 +01:00
NEZNAMY 52b0f21bd9 [Layout] Small refactor to layout code 2025-12-27 13:39:46 +01:00
NEZNAMY 1e3cbde3b3 [Layout] Merge both fake player layout types due to how similar they are 2025-12-27 12:33:02 +01:00
NEZNAMY 267fb727c7 [Layout] Only mark relational condition as used if actually used as relational 2025-12-26 21:02:50 +01:00
NEZNAMY 68904f58ec [Configuration] Reorder config options for more consistency 2025-12-24 11:54:12 +01:00
NEZNAMY 5cbb1bb5dd [Commands] Return list of messages to send when plugin is disabled as components instead of strings, also fix error when printing them on BungeeCord 2025-12-23 15:21:26 +01:00
NEZNAMY 038d221206 [Performance] Fix conditions being parsed as relational placeholders when not needed 2025-12-23 10:13:55 +01:00
NEZNAMY 22d6ebd0d4 [Performance] Small optimization to condition parsing 2025-12-23 09:21:51 +01:00
NEZNAMY e8dd46c701 [Commands] Modify console vs player check to account for other types of command sender (#1594) 2025-12-22 17:49:54 +01:00
NEZNAMY 1150d07dbe [Configuration] Update config version in default config 2025-12-22 15:52:34 +01:00
NEZNAMY 5c294f4ad3 [Header/Footer] Fix condition update not being processed in feature's thread 2025-12-22 15:51:34 +01:00
NEZNAMY 1b5bf0aab7 [Proxy support] Make channel name partially configurable 2025-12-21 14:13:39 +01:00
NEZNAMY 8d8a03602e [Scoreboard] Make red numbers fully configurable and remove config options related to it as they are redundant now (#1592) 2025-12-21 09:59:23 +01:00
NEZNAMY df7bdb7a0c [Velocity] Change bossbar bug compensation code as it wasn't actually fully fixed yet (#1593) 2025-12-20 10:03:58 +01:00
NEZNAMY 00a5eb2588 [Velocity] Remove header/footer packet modifying since it doesn't work anyway (they are never decoded when coming from backend) 2025-12-19 16:08:39 +01:00
NEZNAMY 90631c66e0 [Velocity] Use internals to inject into pipeline and listen to and modify packets. 2025-12-19 12:52:53 +01:00
NEZNAMY c1ba692a79 Bump version to 5.5.0-SNAPSHOT considering the massive upcoming changes and additions 2025-12-19 12:50:06 +01:00
NEZNAMY 8f3324e0d8 [Layout] Add new slot-count option to default config 2025-12-18 16:01:37 +01:00
NEZNAMY 5a09a9ce78 [Layout] Add support for layouts with less than 4 columns for 1.19.3+ (does not work on Velocity (yet?)) 2025-12-18 15:36:45 +01:00
NEZNAMY 33fcee7641 [Layout] Add support for new relational conditions and relational placeholders 2025-12-17 12:22:45 +01:00
NEZNAMY 12b91940c7 [Conditions] Add support for relational conditions and specifying who to parse placeholders for using %viewer:placeholder% and %target:placeholder% (optional) 2025-12-17 11:57:20 +01:00
NEZNAMY 0e6246f044 [Forge] Update to 1.21.11 2025-12-12 19:01:27 +01:00
NEZNAMY 7f7cf97408 [Tablist] Avoid sending tablist packets of entries which are not in the tablist (yet, on join), which caused a warning message in the client. 2025-12-12 15:46:39 +01:00
NEZNAMY 090fe9ccb6 [Tablist] Start improved tracking of tablist entries 2025-12-10 20:40:54 +01:00
NEZNAMY ffae161282 5.4.1-SNAPSHOT 2025-12-10 18:00:47 +01:00
NEZNAMY 1443850344 [Description] Update badges 2025-12-10 16:58:58 +01:00
NEZNAMY 63f9daf334 5.4.0 2025-12-10 16:45:20 +01:00
NEZNAMY b277d0973a Update to 1.21.11 (except Forge, which is broken) 2025-12-10 16:44:56 +01:00
NEZNAMY 33c0f1672a [Fabric] Update to 1.21.11-rc2 2025-12-05 20:15:39 +01:00
NEZNAMY 4224922ebb [Bukkit] Fix HEARTS render type not working on 1.8 - 1.12 2025-12-04 19:10:40 +01:00
NEZNAMY 6eb30d84b4 [Fabric] Update to 1.21.11-pre4 2025-12-01 18:27:07 +01:00
NEZNAMY 592a75b53f [Wiki] Monthly wiki backup for December 2025 2025-12-01 18:12:35 +01:00
NEZNAMY 8e08ea4e44 [Tablist] Fix gamemode being changed in packets when it shouldn't be (#1568) 2025-11-29 16:19:34 +01:00
NEZNAMY cff1e831d0 [Components] Fix packet decoding error due to too many nested levels caused by disabling MM compacting + resetting magic codes before every color 2025-11-29 09:34:17 +01:00
NEZNAMY 83b5a0f88a [NameTags] Fix nametag being forcibly hidden when player is invisible, making them invisible even in spectator gamemode 2025-11-26 18:25:09 +01:00
NEZNAMY 2ba535111e [Fabric] Update to 1.21.11-pre3 2025-11-26 18:10:48 +01:00
NEZNAMY 4bbf0bb0f1 [Configuration] Change default config to use true/false instead of yes/no to avoid confusion (#1581) 2025-11-24 16:33:51 +01:00
NEZNAMY 1e80070d2d [Fabric] Update to 1.21.11-pre2 2025-11-22 10:59:53 +01:00
NEZNAMY 0afe0f28e1 [Fabric] Update to 1.21.11-pre1 (atlas sprites broke, probably a client bug that will be fixed) 2025-11-20 18:28:50 +01:00
NEZNAMY fbc04b1183 [Commands] Finish custom toggle command registration on Bukkit and remove old command preprocess code (#1578) 2025-11-16 10:58:23 +01:00
NEZNAMY bdd2a139e1 Remove sponge support and bump version to 5.4.0-SNAPSHOT 2025-11-15 18:14:29 +01:00
NEZNAMY e956e59888 [Commands] Turn custom toggle commands into real registered commands for most platforms (bukkit and sponge are left) (#1578) 2025-11-15 17:35:21 +01:00
NEZNAMY 1debc54db6 Update loom to 1.13-SNAPSHOT 2025-11-15 12:36:34 +01:00
NEZNAMY 37786935c3 [NameTags] Fix random error 2025-11-15 10:38:52 +01:00
NEZNAMY 425748af12 [Placeholders] Change int to long to fix overflow (#1576) 2025-11-11 20:19:55 +01:00
NEZNAMY c0deaa40ed [Components] Fix last component style detection, causing team color to not be decided correctly sometimes (again) (#1575) 2025-11-10 17:35:10 +01:00
NEZNAMY 70be098f8a [Components] Fix last component style detection, causing team color to not be decided correctly sometimes 2025-11-06 19:23:01 +01:00
NEZNAMY 838ef437d8 [Wiki] Monthly wiki backup for November 2025 2025-11-02 09:05:52 +01:00
NEZNAMY 44d7473c71 [Placeholders] Change player count related placeholders to check for proxy players and remove overriding attempt (which did not even work with %online_<server>% placeholders 2025-10-31 18:57:56 +01:00
NEZNAMY b8a7dfe543 [Placeholders] Change internal error value to avoid issues when a placeholder actually returned that value 2025-10-31 18:55:21 +01:00
NEZNAMY 4c4bf79371 Merge pull request #1563 from JT122406/master
Gradle 9
2025-10-19 13:54:37 +02:00
NEZNAMY a4b4bd0146 [Velocity] Make bossbar bug compensation dynamic, as it was fixed in build 546 2025-10-19 12:56:51 +02:00
Joseph T. McQuigg 9553e310e4 Disable ShadowJar tasks on Modded platforms 2025-10-18 16:40:44 -04:00
Joseph T. McQuigg e00caddb1e Gradle 9 2025-10-18 11:08:41 -04:00
NEZNAMY 898887225d [Commands] Add offline UUID of player to debug command 2025-10-18 12:28:02 +02:00
NEZNAMY 8eef805418 [Configuration] Avoid console warning during header/footer config conversion 2025-10-13 19:16:39 +02:00
NEZNAMY 8509718d32 [Header/Footer] Remove anti-override logging due to false positives when pipeline lags and fast animations are used 2025-10-11 20:46:40 +02:00
NEZNAMY f2cb7c564f [Adventure hook] Fix object component conversion missing "return" statement 2025-10-10 17:10:29 +02:00
NEZNAMY 9335e5af65 [Velocity] Disable header/footer anti-override, because it does not work properly due to velocity internal logic 2025-10-10 17:01:15 +02:00
NEZNAMY 5a5eadac1f [Bukkit] Use correct method to get gamemode by id to fix error <1.17 and generally avoid risks on all versions 2025-10-09 20:16:37 +02:00
NEZNAMY bcd015b6eb [Header/Footer] Add anti-override to the feature 2025-10-09 20:02:45 +02:00
NEZNAMY 91c6b8f08e 5.3.3-SNAPSHOT 2025-10-09 19:29:26 +02:00
NEZNAMY c7251295a1 [Description] Update badges 2025-10-08 18:47:28 +02:00
NEZNAMY db2110b11e 5.3.2 2025-10-08 18:33:02 +02:00
NEZNAMY be1122ce50 Update to 1.21.10 2025-10-08 17:08:59 +02:00
NEZNAMY cf265987db [Bukkit] Remove override for %player_ping%, since people have probably updated their expansion by now. 2025-10-07 17:54:05 +02:00
NEZNAMY cd82e75514 [Teams] Improve anti-override message to contain source of blocked team and how to fix it. 2025-10-07 17:13:38 +02:00
NEZNAMY 74d36f1ab5 [MySQL] Fix error on upload command and message saying success despite operation not being successful 2025-10-06 20:38:05 +02:00
NEZNAMY 67da0ff32b [GitHub] Add an item to CONTRIBUTING.md 2025-10-06 18:42:03 +02:00
NEZNAMY aabad04e28 [MySQL] Delete data in database on upload first, instead of just overwriting / adding new content 2025-10-05 15:05:20 +02:00
NEZNAMY 9236da40dd [Spectator fix] Rewrite packets to avoid the same packet identity from being sent to all players, causing wrong result from modifying it for another player 2025-10-05 14:51:29 +02:00
NEZNAMY 88ff78b7e3 [Commands] Fix debug command not displaying server name correctly 2025-10-05 11:44:25 +02:00
NEZNAMY 21ebd68607 [API] Restore TabPlayer#getWorld and TabPlayer#getServer 2025-10-05 11:39:31 +02:00
NEZNAMY 9adad40aa9 [Pipeline injection] Change return type of onPacketSend to Object to allow changing the packet 2025-10-05 11:17:46 +02:00
NEZNAMY f63b3de63a [Bukkit] Add Header/Footer sending on 1.7.10 if the method is available (modded server) (#1557) 2025-10-04 19:03:21 +02:00
NEZNAMY 767933e522 [Bukkit] Add craftbukkit package version into debug command output 2025-10-04 18:49:20 +02:00
NEZNAMY 0fb86ddf6c 5.3.2-SNAPSHOT 2025-10-04 17:36:02 +02:00
NEZNAMY d52969597f [Description] Update badges 2025-10-04 17:31:03 +02:00
NEZNAMY 70e1537bc0 5.3.1 2025-10-04 16:49:23 +02:00
NEZNAMY 605a09b290 [Bukkit] Fix error on 1.8 - 1.19.2 2025-10-04 16:11:51 +02:00
NEZNAMY 8e2f8d67f3 Use a separate field for player's version network id for better results on unknown versions 2025-10-04 13:31:58 +02:00
NEZNAMY d00764e548 [Commands] Add more info to debug command 2025-10-04 13:21:46 +02:00
NEZNAMY 953472a41a [Velocity] Add flag for compensating for a bossbar bug that might be fixed soon (and was fixed in a fork) 2025-10-04 11:43:26 +02:00
NEZNAMY 6be5bb4757 [Conditions] Fix anonymous conditions not refreshing 2025-10-03 20:17:50 +02:00
NEZNAMY b48a9e4f22 [Layout] Add support for per-layout default-skin (#1555) 2025-10-03 20:06:26 +02:00
NEZNAMY 6d42e252a1 [Teams] Remove old forgotten code causing nametag visibility to not refresh on proxies (also refresh it properly on join) 2025-10-03 16:22:51 +02:00
NEZNAMY ef98b15c86 5.3.1-SNAPSHOT 2025-10-02 19:59:52 +02:00
NEZNAMY 6945e8ee81 [Description] Update badges 2025-10-02 18:57:13 +02:00
NEZNAMY 9c9edbff75 5.3.0 2025-10-02 18:41:25 +02:00
NEZNAMY b8e3a07980 [Configuration] Change warning message in config conversion 2025-10-02 18:40:05 +02:00
NEZNAMY 06279e3708 [Forge] Update to 1.21.9 2025-10-02 18:39:00 +02:00
NEZNAMY 9812345f71 [MiniMessage support] Add component conversion for object components 2025-10-01 12:45:10 +02:00
NEZNAMY e1f667079a [MiniMessage support] Fix error when object components were used 2025-10-01 11:40:53 +02:00
NEZNAMY 6edc3babc8 Update Bukkit, Paper, BungeeCord, Fabric and NeoForge to 1.21.9 2025-10-01 11:03:15 +02:00
NEZNAMY 309c67969a [Wiki] Monthly wiki backup for October 2025 2025-10-01 09:05:32 +02:00
NEZNAMY bd681229db [Conditions] Recode conditions, add new types and add disable-condition conversion for header/footer 2025-10-01 08:54:41 +02:00
NEZNAMY 4f0a4feb03 [Components] Micro optimization 2025-09-28 19:31:08 +02:00
NEZNAMY 2d84a60c84 [NameTags] Rename caches 2025-09-28 19:29:22 +02:00
NEZNAMY 0f66bc7264 [NameTags] Split cache into prefix and suffix caches 2025-09-28 16:17:57 +02:00
NEZNAMY 9283f969c4 [Header/Footer] Fix display-condition updating and change way the feature is resent on server switch (to also prepare for a future improvement) 2025-09-28 11:05:17 +02:00
NEZNAMY dbcad7b11d [Multi-server support] Fix error on reload 2025-09-27 14:07:24 +02:00
NEZNAMY 8e96fc1595 [Multi-server support] Add debug message about current channel name 2025-09-27 11:37:15 +02:00
NEZNAMY fa46427b1f [Multi-server support] Change channel name to avoid errors when using mixed tab versions 2025-09-27 11:28:29 +02:00
NEZNAMY 5a112bff22 [Header/Footer] Correctly resend the feature on server switch 2025-09-26 20:14:42 +02:00
NEZNAMY 1a8bc5ee34 [Configuration] Change config conversion warning message 2025-09-25 19:05:04 +02:00
NEZNAMY 1001bcd507 [Error Logging] Fix warnings no longer having color 2025-09-25 18:48:47 +02:00
NEZNAMY 2f6f5f4958 [ProxySupport] Add compensation for packets being received in the wrong order 2025-09-25 18:42:37 +02:00
NEZNAMY 863cceb175 [Fabric] Update to 1.21.9-rc1 2025-09-25 18:24:25 +02:00
NEZNAMY d07d604f7c [Configuration] Fix per-server settings using * symbol not working anymore 2025-09-24 18:52:31 +02:00
NEZNAMY 9035f8b57f [Backend] Add %deaths% placeholder (default refresh 1000) 2025-09-23 16:33:57 +02:00
NEZNAMY 43bc22b8be [Fabric] Update to 1.21.9-pre3 2025-09-22 18:02:29 +02:00
NEZNAMY 1d59eb5787 Merge pull request #1550 from GG-MD/master
Packet Handling Safety Enhancement - Null Packet Protection
2025-09-21 18:28:44 +02:00
MGG 5383b87c3f Packet Handling Safety Enhancement - Null Packet Protection 2025-09-21 19:00:47 +03:00
NEZNAMY 5c3815aee0 [BungeeCord / Velocity] Add try/catch to RedisBungee hook 2025-09-21 09:09:27 +02:00
NEZNAMY 69b9acdc83 [Scoreboard] Do not actually unregister scoreboard if another plugin sends its own, just stop slotting it 2025-09-21 09:04:57 +02:00
NEZNAMY 3b68fe9bdd [Layout] Adapt to mineskin no longer supporting skins by id 2025-09-20 18:46:02 +02:00
NEZNAMY 4d9dd1cf83 [GitHub] Add new issue template 2025-09-20 13:48:22 +02:00
NEZNAMY 0854fd674f [Fabric] Update to 1.21.9-pre2 2025-09-20 13:26:36 +02:00
NEZNAMY 75478b59ae [Bukkit] Take advantage of new Java features and remove unnecessary reflection 2025-09-20 13:11:58 +02:00
NEZNAMY d39f6fd061 [Bukkit] [Code style] Use TYPE instead of Object for components 2025-09-17 20:30:34 +02:00
NEZNAMY a532cd4fc1 [Code style] Rename some component classes to avoid conflict with platform classes 2025-09-17 18:39:28 +02:00
NEZNAMY a6afd9de0a [Fabric] Update to 1.21.9-pre1 (thanks Mojang) 2025-09-16 19:43:59 +02:00
NEZNAMY 9a8df8c890 [Configuration] Add missing config conversion of "*" symbol in header/footer 2025-09-15 19:24:32 +02:00
NEZNAMY cd435cc716 [Code style] Remove pointless world/server instance creations 2025-09-15 19:10:56 +02:00
NEZNAMY b0bdc36b59 [Tablist formatting] [Performance] Only try to format players on the same server (or global playerlist group) 2025-09-15 18:58:53 +02:00
NEZNAMY 1971513acc Fix issue from previous commit 2025-09-15 18:56:09 +02:00
NEZNAMY 99646f2113 [Global playerlist] Refactor server groups for future use in other features 2025-09-15 18:07:14 +02:00
NEZNAMY 78349176d6 [Global playerlist] Optimize shouldSee method to reduce canSee calls to other plugins 2025-09-15 13:28:40 +02:00
NEZNAMY 92115ed493 [Global playerlist] Store "spy-server" attribute in Server class instead of player data 2025-09-15 13:04:11 +02:00
NEZNAMY 4ef8508c65 [Code style] Extract project variables from TabConstants class and move it back to source folder 2025-09-15 12:37:25 +02:00
NEZNAMY 1feafa884e [Code style] Create a class for holding servers and worlds and clear it on reload 2025-09-15 12:22:44 +02:00
NEZNAMY 02bff23b1f [Code style] Separate nested class into a regular class 2025-09-15 11:37:16 +02:00
NEZNAMY d80742bf20 [Code style] Separate nested class into a regular class 2025-09-15 11:28:57 +02:00
NEZNAMY 7bde3d9996 [Code style] Separate nested class into a regular class 2025-09-15 11:19:55 +02:00
NEZNAMY 4d86beb268 [Code style] Separate nested class into a regular class 2025-09-15 11:10:16 +02:00
NEZNAMY b039cbb7b6 [Code style] Separate nested class into a regular class 2025-09-15 11:00:29 +02:00
NEZNAMY 7d8af7efc9 [Code style] Separate nested class into a regular class 2025-09-15 10:51:48 +02:00
NEZNAMY 7019044837 [Nametags] Upgrade invisible-nametags option to support conditions 2025-09-14 18:09:17 +02:00
NEZNAMY 5916ec5d07 [Javadoc] Fix typo 2025-09-14 11:50:51 +02:00
NEZNAMY 4508fcf4b3 [Javadoc] Add some missing docs 2025-09-14 11:01:44 +02:00
NEZNAMY 2de69557d2 [Code style] Remove whitespace 2025-09-14 10:51:37 +02:00
NEZNAMY b01e793a26 [Javadoc] Add some missing docs 2025-09-14 10:49:40 +02:00
NEZNAMY 1f67ab7bdb [Code style] Rename variable to avoid shadowing outer scope variable 2025-09-14 10:45:39 +02:00
NEZNAMY 43ae5add60 [Code style] Remove redundant suppression 2025-09-14 10:43:14 +02:00
NEZNAMY 971620818b [Placeholders] No longer show last value of a placeholder when identifier was returned, it caused more harm than good (most notably on proxy installation when not all PAPI expansions are downloaded and therefore placeholders "freezing") 2025-09-13 18:53:55 +02:00
NEZNAMY c997b99935 [Bukkit] Add missing shadowColor implementation on spigot 2025-09-13 18:27:41 +02:00
NEZNAMY ae83ce1f42 [Code style] Remove unnecessary check 2025-09-13 17:38:28 +02:00
NEZNAMY 2410717510 [Code style] Remove no longer needed variable 2025-09-13 17:06:59 +02:00
NEZNAMY 5270a156b3 [Code style] Remove unused classes 2025-09-13 17:03:00 +02:00
NEZNAMY 07d807a7bd [Header/Footer] Rework the feature to allow conditional designs 2025-09-13 15:56:14 +02:00
NEZNAMY 5fb80f5661 5.3.0-SNAPSHOT 2025-09-13 15:47:23 +02:00
NEZNAMY ce6bef7f19 [Fabric] Update to 25w37a 2025-09-10 19:04:56 +02:00
NEZNAMY facedfdea7 [Components] Add config option to disable MiniMessage support (also introduce new config converter) 2025-09-07 12:44:14 +02:00
NEZNAMY e8fa66dac0 [Configuration] Removed forced lowercasing of server names 2025-09-06 19:08:54 +02:00
NEZNAMY 997d824d12 [Code style] Remove redundant call 2025-09-06 14:25:28 +02:00
NEZNAMY 86baf27ca0 [Nametags] Fix empty line being sent to player when toggle message is empty 2025-09-06 14:21:54 +02:00
NEZNAMY 2b8b5303c8 [Components] Properly set team color to used magic codes if both color and magic codes are used 2025-09-06 11:10:09 +02:00
NEZNAMY 24bd58130b [Components] Fix team color affecting prefix/suffix 2025-09-06 09:53:51 +02:00
NEZNAMY 907bbdb52b [Fabric] Update to 25w36b 2025-09-03 15:58:20 +02:00
NEZNAMY 26c491ce22 [Nick compatibility] Add debug message when an API request is made to change expected profile name 2025-09-01 17:26:43 +02:00
NEZNAMY 73def64743 [Wiki] Monthly wiki backup for September 2025 2025-09-01 17:14:40 +02:00
NEZNAMY d021d213f6 [Components] Extend player sprite object component to support player names the intended way and add UUID support 2025-08-30 19:29:44 +02:00
NEZNAMY dfd5ccf525 [Placeholders] Add %uuid% placeholder showing player's UUID 2025-08-30 18:48:07 +02:00
NEZNAMY a4cfe9f81b [Configuration] Replace \n with newline sooner, resulting in them being replaced even inside placeholders like animations 2025-08-30 15:52:56 +02:00
NEZNAMY 8402088cba [MiniMessage hook] Properly handle uppercased color codes and do not throw an error if text contains the § symbol 2025-08-27 20:50:25 +02:00
NEZNAMY 2adcc0d45b [Components] Allow player heads using <head:DEFINITION> using same definition syntax as layout 2025-08-27 19:52:58 +02:00
NEZNAMY da25752b73 [Configuration] Always load skin cache 2025-08-27 19:36:30 +02:00
NEZNAMY ac348cf207 [Components] Add a comment 2025-08-27 18:44:41 +02:00
NEZNAMY 6afe8f0081 [Components] Add PlayerSprite support 2025-08-27 18:24:41 +02:00
NEZNAMY 86c294592f Delete component module and move content to shared 2025-08-27 17:38:45 +02:00
NEZNAMY 3deba4a0f3 [Fabric] Fix error on 25w35a 2025-08-27 16:55:09 +02:00
NEZNAMY cfb3d10a7d [Bukkit] Remove unused dependency 2025-08-26 20:16:29 +02:00
NEZNAMY 458fa4e416 Update Fabric to 25w35a and prepare for new object components 2025-08-26 20:08:24 +02:00
NEZNAMY 6e7d2338a4 [Tablist] Remove unused class 2025-08-24 16:23:17 +02:00
NEZNAMY d0bd1b4b0b [Tablist] Fix possible issue from previous commit not applying forced display name 2025-08-24 12:35:28 +02:00
NEZNAMY 2076b589b4 [Tablist] Avoid sending tablist update packets of entries which are not present (currently the new check only works on BungeeCord, Velocity already worked) 2025-08-24 11:47:59 +02:00
NEZNAMY a4b8c2b730 [Components] Change sprite syntax to <sprite:ATLAS:SPRITE> to match MiniMessage 2025-08-24 09:43:29 +02:00
NEZNAMY 0cc83325bc [Components] Replace spaces with underscores in atlas and sprite 2025-08-23 19:10:31 +02:00
NEZNAMY f2fa63315e [Components] Remove toRawText method and replace its usage with the intended method 2025-08-23 18:58:43 +02:00
NEZNAMY 9631abf430 [Components] Force lowercase atlas and sprite 2025-08-23 18:35:51 +02:00
NEZNAMY 084123132a [Bukkit] Remove fallback using Bukkit API on unsupported versions (this also drops 1.5 - 1.6 support) 2025-08-23 18:18:55 +02:00
NEZNAMY 4e9d2df0b2 [Bukkit] Fix 1.9.4 and 1.10.x 2025-08-23 17:45:35 +02:00
NEZNAMY e3a3a65987 Revert unintended change 2025-08-23 16:39:03 +02:00
NEZNAMY 17feac0501 [Ping Spoof] Rework the feature for a faster check 2025-08-23 16:37:58 +02:00
NEZNAMY 84e280a562 [Bukkit] Include 1.7 in supported versions list 2025-08-23 10:40:02 +02:00
NEZNAMY 906e304018 [Bukkit] Add NMS Implementations for 1.7.x 2025-08-23 10:39:35 +02:00
NEZNAMY 48cdeb7283 [Bukkit] Add NMS Implementations for 1.8.x and 1.9.x 2025-08-23 09:43:24 +02:00
NEZNAMY 4efb55f685 [Code style] Add NMS Implementations for 1.10.x and 1.11.x 2025-08-21 18:08:32 +02:00
NEZNAMY 3ed6f8158d [Code style] Remove unused methods 2025-08-21 17:39:11 +02:00
NEZNAMY c89a38b0da [Bukkit] Add NMS Implementations for 1.13.x and 1.14.x 2025-08-20 18:55:14 +02:00
NEZNAMY eb40cf873f [Bukkit] Check for ObjectComponent in another method 2025-08-20 16:53:37 +02:00
NEZNAMY 892c626312 [Components] Add atlas-sprite support to text parsing 2025-08-20 16:28:47 +02:00
NEZNAMY 7e0d447e75 [Fabric] Update to 25w34b 2025-08-20 15:56:21 +02:00
NEZNAMY 49b2723c19 [Components] Introducing ObjectComponent for future 1.21.9 content 2025-08-20 14:54:55 +02:00
NEZNAMY 5140d912e1 [Bukkit] Add NMS Implementation for 1.15.x 2025-08-20 13:51:03 +02:00
NEZNAMY 0fa1165652 [Bukkit] Add NMS Implementation for 1.16 - 1.16.3 2025-08-20 13:42:57 +02:00
NEZNAMY 375d2297e7 [Bukkit] Remove unused code 2025-08-20 13:23:50 +02:00
NEZNAMY fbd089d87a [Bukkit] Add NMS Implementation for 1.18 - 1.18.1 2025-08-20 13:16:23 +02:00
NEZNAMY 5076c80e2c [Bukkit] Remove reflection entirely now that adapters cover everything reflection did 2025-08-20 13:13:50 +02:00
NEZNAMY 4fcbec7a4a [Spectator fix] Fix memory leak (introduced in fix for #1537) 2025-08-20 12:32:36 +02:00
NEZNAMY cb82d3ad13 [Bukkit] Add NMS Implementation for 1.21.6 - 1.21.8 2025-08-20 12:14:24 +02:00
NEZNAMY a6172c705d [Bukkit] Add NMS Implementation for 1.21.5 2025-08-20 11:44:54 +02:00
NEZNAMY 3c2c480c11 [Bukkit] Add NMS Implementation for 1.21.4 2025-08-20 11:23:00 +02:00
NEZNAMY da1a839014 [Bukkit] Add NMS Implementation for 1.21.2 - 1.21.3 2025-08-20 11:04:24 +02:00
NEZNAMY bf6628c6a2 [Bukkit] Add NMS Implementation for 1.21 - 1.21.1 2025-08-20 10:43:59 +02:00
NEZNAMY 42674bbfdd [Bukkit] Clean up implementation detection 2025-08-20 10:20:48 +02:00
NEZNAMY 225164b7b6 [Bukkit] Add NMS Implementation for 1.20.5 - 1.20.6 2025-08-20 10:16:32 +02:00
NEZNAMY 35ce37acf8 [Bukkit] Add NMS Implementation for 1.20.3 - 1.20.4 2025-08-20 09:48:42 +02:00
NEZNAMY 2df5b00e07 [Bukkit] Add NMS Implementation for 1.20.2 2025-08-20 09:35:40 +02:00
NEZNAMY 3fa25c0662 [Bukkit] Add NMS Implementation for 1.20 - 1.20.1 2025-08-20 09:00:06 +02:00
NEZNAMY b7e233834e [Bukkit] Add NMS Implementation for 1.19.4 2025-08-19 20:35:52 +02:00
NEZNAMY ff80a4807f [Bukkit] Add NMS Implementation for 1.19.3 2025-08-19 20:16:28 +02:00
NEZNAMY c56592c19a [Bukkit] Add constants for enums for better readability 2025-08-19 19:42:55 +02:00
NEZNAMY e93df8e38d [Fabric] Add Fabric API version for 25w33a 2025-08-19 18:57:50 +02:00
NEZNAMY 15664bc9fb Update loom to 1.11 2025-08-19 18:57:24 +02:00
NEZNAMY 9cedbabd75 [Nametags] Fix memory leak 2025-08-19 17:58:33 +02:00
NEZNAMY a98ecee8f3 [Spectator Fix] Force gamemode always, even if not currently in spectator (#1537) 2025-08-19 17:19:52 +02:00
NEZNAMY f64d0d7b41 Merge pull request #1539 from tooobiiii/master
Fix: Compilation errors showing generated src instead of actual src -> introducing blossom 2.1.0
2025-08-19 16:50:30 +02:00
TobisuchtetXD 7a1f1ed484 introducing new blossom version 2.1.0 fixes weird compilation behaviour 2025-08-19 12:32:43 +02:00
NEZNAMY 85ade0dd15 [Spectator Fix] Use packet / periodic detection to make the feature more reliable instead of delays (#1537) 2025-08-18 18:06:05 +02:00
NEZNAMY 9c70f5a187 [Code style] Rename "expectedDisplayName" to "forcedDisplayName" 2025-08-17 18:23:11 +02:00
NEZNAMY f622d0c8b3 [Scoreboard / Bossbar] Fix announce command syntax in docs 2025-08-07 17:09:29 +02:00
NEZNAMY a3c4362a90 [MiniMessage Support] Reset magic codes before every color code to match vanilla behavior 2025-08-03 19:20:54 +02:00
NEZNAMY 05609ca436 [Code style] Remove case insensitivity from spy-servers option for safety due to rewrite 2025-08-03 17:10:05 +02:00
NEZNAMY fde7fefe9f [Performance] Use Server object for storing player servers instead of Strings 2025-08-03 15:23:37 +02:00
NEZNAMY 19f45aeb4d [Code style] Use World object for storing player worlds instead of Strings 2025-08-03 14:43:34 +02:00
NEZNAMY 540eafc41b [Wiki] Monthly wiki backup for August 2025 2025-08-02 13:35:43 +02:00
NEZNAMY 1ba62e0ae9 [Descriptions] Update badges 2025-07-24 17:20:37 +02:00
NEZNAMY 07b213d0af [Playerlist Objective] [Configuration] Fix warning when setting value to 0 (without quotes, resulting in it being an Integer) 2025-07-24 17:18:34 +02:00
NEZNAMY 0528baaa64 [Belowname] [Configuration] Fix warning when setting value to 0 (without quotes, resulting in it being an Integer) 2025-07-22 18:42:29 +02:00
NEZNAMY 264b8e69d8 [Configuration] Add missing config conversion to add register-tab-expansion option (#1524) 2025-07-22 17:31:23 +02:00
NEZNAMY b4c6da418d [Configuration] Fix misinformation and missing link in default config.yml 2025-07-20 15:09:00 +02:00
NEZNAMY 3811f942a1 5.2.6-SNAPSHOT 2025-07-20 15:05:17 +02:00
NEZNAMY 6d295960d5 5.2.5 2025-07-19 17:53:04 +02:00
NEZNAMY 983d6a055b [Sponge] Fix 1.21.5+ error caused by a Sponge bug 2025-07-19 11:48:43 +02:00
NEZNAMY 9de3fc4bbb Update to 1.21.8 2025-07-19 11:31:29 +02:00
NEZNAMY f4c986f0de [Sponge] Set listed tablist entry value 2025-07-19 11:21:27 +02:00
NEZNAMY 434f629c0b [BungeeCord] Update to build 1990 and up 2025-07-15 19:10:35 +02:00
NEZNAMY dac32b6daf [bStats] Fix "1.99.x" version being sent for unknown server versions 2025-07-06 19:44:59 +02:00
NEZNAMY dd845013ce [Layout] [Performance] replace removeAll with removeIf for massively improved performance 2025-07-03 18:02:18 +02:00
NEZNAMY b9bad50dbd 5.2.5-SNAPSHOT 2025-07-03 18:00:59 +02:00
NEZNAMY 56540df419 [Wiki] Monthly wiki backup for July 2025 2025-07-02 17:44:18 +02:00
NEZNAMY d0b0c55ab8 [Description] Update badges 2025-07-01 20:49:11 +02:00
NEZNAMY 6f2b92e044 5.2.4 2025-07-01 20:38:47 +02:00
NEZNAMY 5da16e8055 Update to 1.21.7 2025-07-01 20:33:36 +02:00
NEZNAMY a522ea9902 [Proxy Support] Add try/catch for message decoding 2025-07-01 20:32:55 +02:00
NEZNAMY 36801184a5 5.2.4-SNAPSHOT 2025-06-30 16:39:37 +02:00
NEZNAMY d212eb108d [Bukkit] Remove unused empty lists from plugin.yml to avoid Polymart bug breaking them 2025-06-26 18:32:51 +02:00
NEZNAMY cbc1de0f33 [Description] Update badges 2025-06-23 18:49:25 +02:00
NEZNAMY fcdc04e228 5.2.3 2025-06-23 18:36:49 +02:00
NEZNAMY 890f1ee131 [Velocity] Improve message telling users to install VelocityScoreboardAPI 2025-06-23 18:36:37 +02:00
NEZNAMY f3aec47ac3 [BungeeCord] Send header/footer using API since it no longer throws an error 2025-06-22 10:48:31 +02:00
NEZNAMY bcf1c828b5 [BungeeCord] Update to build 1980 (older versions are no longer supported) 2025-06-22 10:40:34 +02:00
NEZNAMY 5fd319a152 [BossBar] Fix %tab_bossbar_visible% not loading on join when player has bossbar disabled and toggling is saved 2025-06-22 10:04:38 +02:00
NEZNAMY abecb58a8d [API] Add methods for removing bossbars and scoreboards (#1507) 2025-06-21 20:35:22 +02:00
NEZNAMY 135166b01e [Bukkit] Remove ViaVersion hook for sending packets due to many unfixable problems 2025-06-21 18:13:46 +02:00
NEZNAMY 0770293452 [Placeholders] Fix placeholder updating when placeholder returned its identifier not being skipped properly (#1502) 2025-06-21 13:57:16 +02:00
NEZNAMY f3c40ad582 [Bukkit] Disable ViaVersion hook for sending raw packets to newer players due to issues 2025-06-21 13:09:44 +02:00
NEZNAMY aacc115a36 [API] Add functions for getting original prefix/suffix values with placeholders parsed 2025-06-21 12:51:03 +02:00
NEZNAMY b7ba07b78d [Bukkit] Remove redundant SneakyThrows annotations 2025-06-21 10:45:27 +02:00
NEZNAMY e13445f55d [Bukkit] Fix skin writing in ViaVersion hook 2025-06-21 10:41:11 +02:00
NEZNAMY bd527d3868 [Configuration] Fix false positive in configuration checking (#1506) 2025-06-20 18:34:24 +02:00
NEZNAMY f288112eb2 [Bukkit] Fix error in ViaVersion hook 2025-06-20 16:18:03 +02:00
NEZNAMY 6b415e64a8 5.2.3-SNAPSHOT 2025-06-19 17:29:10 +02:00
NEZNAMY cfb2cb6b0a [Description] Update badges 2025-06-18 19:20:23 +02:00
NEZNAMY 622deb6fd7 5.2.2 2025-06-18 18:48:14 +02:00
NEZNAMY 7f41421d65 [Bukkit] Add 1.21.6 to supported versions 2025-06-18 17:34:51 +02:00
NEZNAMY 73e706465a Add 1.21.6 protocol constant 2025-06-18 17:31:54 +02:00
NEZNAMY a8c543ca9e [Paper] Update paperweight to 2.0.0-beta.17 2025-06-18 17:23:38 +02:00
NEZNAMY 9594ff452b Update Gradle to 8.14.2 2025-06-18 17:18:09 +02:00
NEZNAMY d5c81298dd [Modded platforms] Update to 1.21.6 2025-06-18 16:50:36 +02:00
NEZNAMY 88faacb240 [Proxy support] Properly handle out of order redis messages (#1465) 2025-06-17 21:00:49 +02:00
NEZNAMY 0d2a04b3a5 [Proxy support] Make method synchronized to try to avoid concurrent access 2025-06-17 18:06:38 +02:00
NEZNAMY f8a90b28b5 [Code style] Create static methods for initializing components 2025-06-16 19:57:58 +02:00
NEZNAMY a948febb18 [Belowname & Playerlist objective] Suggest a PlaceholderAPI expansion might be missing when a placeholder did not parse 2025-06-16 18:44:58 +02:00
NEZNAMY 8e33481b97 [Proxy support] Massive fixes to handling players who switch servers and temporarily cause the player to be loaded twice (#1465) 2025-06-15 19:03:50 +02:00
NEZNAMY f54be214f9 [Vanish compatibility] Assume a player can always see themselves 2025-06-15 15:03:14 +02:00
NEZNAMY d50b47acb5 [Configuration] Remove case sensitivity when checking for valid properties / configuration option names 2025-06-14 19:35:55 +02:00
NEZNAMY 31011c243a [Fabric] Update to 1.21.6-rc1 2025-06-12 18:52:20 +02:00
NEZNAMY f4aa03f20d [Conditions] Fix issue from recent commits 2025-06-12 18:51:56 +02:00
NEZNAMY 28aacaea45 [Fabric] Update to 1.21.6-pre4 2025-06-10 19:52:30 +02:00
NEZNAMY d4fd9a2b78 [Sorting] Fix PLACEHOLDER type not loading properly when ":" symbol is used in values (#1504) 2025-06-09 18:41:06 +02:00
NEZNAMY 663e0be357 [Tablist] Do not send update packets of vanished players, exposing them to players 2025-06-07 18:43:17 +02:00
NEZNAMY 14d29577c5 [Conditions] Fix condition compiling when delimiter is a part of used placeholder (#1503) 2025-06-07 15:22:48 +02:00
NEZNAMY 951f8072c1 [Placeholders] Add %luckperms-prefixes% and %luckperms-suffixes% placeholders listing all values instead of just the ones with the highest weight 2025-06-07 14:54:13 +02:00
NEZNAMY 05f042eda0 [Conditions] Improve condition type detection (#1503) 2025-06-07 11:37:32 +02:00
NEZNAMY b00c2fbcb4 [Fabric] Update to 1.21.6-pre3 2025-06-07 10:29:37 +02:00
NEZNAMY dde4866e50 [Belowname] Improve warning message 2025-06-05 19:17:42 +02:00
NEZNAMY 9fa6b21c08 [Code style] Extract code into a method 2025-06-03 19:51:04 +02:00
NEZNAMY e95e6fc20c Remove anti-override from config and make it permanently enabled 2025-06-03 17:14:18 +02:00
NEZNAMY c7a3b00c3c Merge pull request #1499 from R00tB33rMan/master
Remove printline when testing TPS & MSPT getter
2025-06-03 07:11:07 +02:00
R00tB33rMan 74bc0e0cb7 Remove printline when testing TPS & MSPT getter 2025-06-02 23:30:02 -04:00
NEZNAMY 6248008b4d [Fabric] Update to 1.21.6-pre2 2025-06-02 18:32:42 +02:00
NEZNAMY 2d91e165ce [Wiki] Monthly wiki backup for June 2025 2025-06-01 18:00:37 +02:00
NEZNAMY b1220550eb [Multi-server support] Code improvements for future issue debugging 2025-06-01 16:52:12 +02:00
NEZNAMY 680ff3412f [Bukkit] Fix wrong supported version range of a module 2025-06-01 16:09:45 +02:00
NEZNAMY 799f6b8215 [Folia] Implement %tps% and %mspt% (#1498) 2025-05-31 16:52:18 +02:00
NEZNAMY 1be224b7de [Fabric] Update to 1.21.6-pre1 2025-05-29 17:56:03 +02:00
NEZNAMY a32adfbfc7 [Bukkit] Add implementations for all paper versions with mojang mappings 2025-05-27 19:48:01 +02:00
NEZNAMY dda415351a Revert "[Fabric] Downgrade to 1.21.5 for release"
This reverts commit 6873c59505.
2025-05-23 17:08:57 +02:00
NEZNAMY 685e4b9faa 5.2.2-SNAPSHOT 2025-05-23 17:08:48 +02:00
NEZNAMY 1f842563b3 [Bukkit] Hotfix error 2025-05-22 21:45:09 +02:00
NEZNAMY f237b61065 [Description] Update badge to 5.2.1 2025-05-22 17:56:44 +02:00
NEZNAMY 19d6d06791 5.2.1 2025-05-22 17:38:48 +02:00
NEZNAMY 6873c59505 [Fabric] Downgrade to 1.21.5 for release 2025-05-22 17:35:43 +02:00
NEZNAMY e7ae62db7b [Playerlist objective] Change default title 2025-05-21 15:51:52 +02:00
NEZNAMY d4362f2ed2 [Bukkit] Only get methods declared by the class, not superclasses (#1492) 2025-05-20 17:21:49 +02:00
NEZNAMY 9247f3d4fb [Fabric] Update to 25w21a 2025-05-20 16:37:09 +02:00
NEZNAMY b4993b657e [Paper] Downgrade to 1.21.4 to fix compilation (code is the same) 2025-05-20 16:32:40 +02:00
NEZNAMY b73aa93d01 [Commands] Ignore cancelled command events 2025-05-20 16:28:50 +02:00
NEZNAMY bce689e672 [Modded platforms] Use reflection instead of access transforming which may fail 2025-05-15 20:10:32 +02:00
NEZNAMY f4468261cf [Fabric] Update to 25w20a 2025-05-13 16:50:24 +02:00
NEZNAMY cc926ff974 [Modded platforms] Decrease required Java version to 17 (where possible) 2025-05-07 17:39:33 +02:00
NEZNAMY 6c3831ded4 [Fabric] Update to 25w19a 2025-05-07 17:30:29 +02:00
NEZNAMY 3c55866d46 [Code style] Move 1.8+ check to avoid duplicating it everywhere 2025-05-01 18:26:56 +02:00
NEZNAMY dfc9359f04 [Plugin messages] Do not write protocol version anymore, since it is not used by bridge anymore 2025-05-01 18:18:09 +02:00
NEZNAMY ea0897db31 [Bukkit] Remove redundant client version usage 2025-05-01 18:12:53 +02:00
NEZNAMY 25cf6c95e8 [Configuration] Print exception class when a file fails to save 2025-05-01 14:49:33 +02:00
NEZNAMY f5e2910e0b [Bukkit] Remove forgotten field from previous commit 2025-05-01 14:36:50 +02:00
NEZNAMY fda35986a4 [Bukkit] Use getters instead of reflection where possible and fix wrong field on 1.16.5 2025-05-01 14:35:59 +02:00
NEZNAMY b97e86c2ed [Wiki] Monthly wiki backup for May 2025 2025-05-01 13:43:03 +02:00
NEZNAMY ebb02717b5 [Scoreboard internals] Fix duplicated team / objective register actually overwriting existing value, causing NPE later (#1481) 2025-05-01 13:16:22 +02:00
NEZNAMY 1b82ebfd25 [Paper] Update version to fix compilation error 2025-05-01 13:10:59 +02:00
NEZNAMY 3fb788ef6d [Fabric] Update to 25w18a 2025-04-29 18:53:55 +02:00
NEZNAMY 11bc06182c [Scoreboard] Use available getter instead of reflection / access transforming (which may not work) 2025-04-27 13:57:22 +02:00
NEZNAMY 2fe5dc833d [Proxy support] Add more debug messages (#1465) 2025-04-27 10:02:56 +02:00
NEZNAMY 317cb975ce [Threading] Avoid throwing error 2025-04-27 09:31:21 +02:00
NEZNAMY 9bb2a97e50 [Threading] Increase thread shutdown timeout from 500ms to 2000ms 2025-04-27 09:28:36 +02:00
NEZNAMY 53dcc60587 [Code style] Use java 21 switches in modded platforms 2025-04-26 17:51:57 +02:00
NEZNAMY db347bc192 [Modded platforms] Create component style with setters to avoid using access transforming 2025-04-26 13:13:38 +02:00
NEZNAMY 608b8307dd [Velocity] Fix error in compatibility check 2025-04-26 12:56:58 +02:00
NEZNAMY 4c027da093 [Modded platforms] Use reflection to access tablist entries field instead of direct access (since access transforming sometimes doesn't work) 2025-04-26 12:52:10 +02:00
NEZNAMY bef60e688c [Bukkit] Fix prefix used in suffix field 2025-04-24 16:56:34 +02:00
NEZNAMY b987ad99f4 [Fabric] Update to 25w17a 2025-04-22 20:56:17 +02:00
NEZNAMY 3036e2d523 [Bukkit] Fix anti-override not working when using a ViaVersion implementation instead of server (#1478) 2025-04-19 11:33:34 +02:00
NEZNAMY 1bab2d0025 [Fabric] Update to 25w16a 2025-04-15 16:56:27 +02:00
NEZNAMY 4cac6c659e [Bukkit] Add v1_19_R1 submodule and remove reflection support for <1.19.3 2025-04-13 20:08:45 +02:00
NEZNAMY c7c59238e1 [Bukkit] Refactor feature implementation loading 2025-04-13 18:16:05 +02:00
NEZNAMY f51e74c066 [Bukkit] Update supported version list 2025-04-13 11:37:08 +02:00
NEZNAMY 52f8801638 [Bukkit] Add 1.17.1 and 1.18.2 submodules and delete the respective NMS reflection 2025-04-13 11:20:18 +02:00
NEZNAMY 4e5c5a7073 [Bukkit] [Code style] Change bossbar presence check 2025-04-13 09:03:49 +02:00
NEZNAMY 436f3879c4 [Bukkit] Remove redundant check 2025-04-13 08:36:56 +02:00
NEZNAMY c1395e26d4 [Fabric] Update to 25w15a 2025-04-09 17:32:03 +02:00
NEZNAMY 3750d6ddb1 [Commands] Fix error when running a property command 2025-04-07 19:02:02 +02:00
NEZNAMY 45c3601b49 [Conditions] Add "!permission:<value>" condition type 2025-04-07 18:29:24 +02:00
NEZNAMY 957da1d040 [Code style] Convert some NotNull annotations to NonNull to throw errors sooner 2025-04-07 18:25:46 +02:00
NEZNAMY 43932eb6b3 [Compilation] More changes to make backporting of mod platforms easier 2025-04-06 19:07:54 +02:00
NEZNAMY 024ddeefb4 [Compilation] Create maps for mod platform versions for easier backporting 2025-04-06 12:30:37 +02:00
NEZNAMY 94190b5cd7 [Velocity] Use new setShowHat tablist feature (and bump minimum required build to 485) 2025-04-05 10:15:55 +02:00
NEZNAMY 5d72f90a0f [Code style] Remove redundant code 2025-04-04 17:36:37 +02:00
NEZNAMY 90c30023c2 [Code style] Simplify 2025-04-02 20:27:59 +02:00
NEZNAMY d39a89659b [Bukkit] Remove reflection NMS support for 1.16.x and use direct 1.16.5 NMS hook 2025-04-02 20:23:36 +02:00
NEZNAMY 79f4386b62 [Bukkit] Remove reflection NMS support for versions below 1.16 (1.8.8 and 1.12.2 are supported directly) 2025-04-02 18:47:09 +02:00
NEZNAMY 39c4d8ae96 [Bukkit] Only send compatibility error messages relevant to server version 2025-04-02 18:12:33 +02:00
NEZNAMY c8b2abbb3e Merge pull request #1470 from JT122406/master
add curseforge link
2025-04-02 18:10:57 +02:00
NEZNAMY 06b7bbd711 [Bukkit] Fix startup error on 1.7.10 2025-04-02 18:05:20 +02:00
NEZNAMY 11afd15610 [Placeholder output replacements] Remove color replacing in output (may not be wanted if used in tab expansion) 2025-04-02 18:04:30 +02:00
Joseph T. McQuigg 4951025e61 add curseforge link 2025-04-02 09:54:48 -04:00
NEZNAMY 2337a122da [Wiki] Monthly wiki backup for April 2025 2025-04-01 17:23:23 +02:00
NEZNAMY 072333bf48 [Description] Use .svg instead of .png 2025-04-01 16:01:38 +02:00
NEZNAMY 2bd8924df7 [Description] Save badges for easier modification in only one place (will be linked to in all descriptions) 2025-04-01 15:58:28 +02:00
NEZNAMY 23cdc3721d [Global playerlist] Fix offline players being added into tablist when disconnecting immediately after switching server 2025-03-31 20:17:35 +02:00
NEZNAMY 957e4ba0c0 5.2.1-SNAPSHOT 2025-03-31 20:16:28 +02:00
NEZNAMY 71a19c63d8 5.2.0 2025-03-31 17:45:05 +02:00
NEZNAMY 657327e7ee [Bukkit] Move viaversion presence check to fix class loader error when it's not present 2025-03-31 17:44:50 +02:00
NEZNAMY efeea7cf0f Merge pull request #1460 from JT122406/master
Forge and NeoForge Support
2025-03-31 17:20:48 +02:00
Joseph T. McQuigg 7a4637368d Hard Versions 2025-03-31 11:18:36 -04:00
NEZNAMY 2e6ccd078b 5.2.0-SNAPSHOT 2025-03-31 17:09:19 +02:00
NEZNAMY 827197f916 5.1.1 2025-03-31 16:52:47 +02:00
Joseph T. McQuigg c8454ec0c1 Add MC versions to mods.toml 2025-03-31 10:52:34 -04:00
Joseph T. McQuigg 7127a77d92 Remove Versions from mods.toml, Fix register 2025-03-31 10:30:31 -04:00
Joseph T. McQuigg b23912b52f Forge/NeoForge Luckperms Hook 2025-03-30 18:57:32 -04:00
Joseph T. McQuigg 4b21148a03 Adjust Scoreboard classes for setDisplaySlot 2025-03-30 15:06:37 -04:00
Joseph T. McQuigg 2d5ef95e54 Update Forge to 1.21.5 2025-03-30 14:52:00 -04:00
Joseph T. McQuigg b5e2d376dd Update NeoForge to 1.21.5 2025-03-30 14:52:00 -04:00
Joseph T. McQuigg c40b337edc Fix Credits 2025-03-30 14:52:00 -04:00
Joseph T. McQuigg f8583642a8 Correct License 2025-03-30 14:52:00 -04:00
Joseph T. McQuigg 707f28df16 Permission check 2025-03-30 14:52:00 -04:00
Joseph T. McQuigg dd78da089d Use Records for platform 2025-03-30 14:51:59 -04:00
Joseph T. McQuigg c4ea65ed70 Forge Port 2025-03-30 14:51:59 -04:00
Joseph T. McQuigg aabba806c4 Drop Parchment 2025-03-30 14:51:59 -04:00
Joseph T. McQuigg 88167fc42d Default to EmptyTabExpansion 2025-03-30 14:51:59 -04:00
Joseph T. McQuigg e4d7005e46 moddedPlatforms List 2025-03-30 14:51:59 -04:00
Joseph T. McQuigg 5ee27f7ed7 Add Credits 2025-03-30 14:51:59 -04:00
Joseph T. McQuigg 9a4492c401 Add Parchment to Fabric, Use LogUtils instead of AW 2025-03-30 14:51:59 -04:00
Joseph T. McQuigg 39a2aee5a0 NeoForge Port 2025-03-30 14:51:58 -04:00
Joseph T. McQuigg 5184ef170f Update to new com.gradleup.shadow plugin
Gradle 8.13, Fabric Loom 1.10
2025-03-30 14:51:56 -04:00
NEZNAMY 29a35cf1cc [ViaVersion hook] Decrease check interval from 100 to 50 2025-03-30 18:51:39 +02:00
NEZNAMY f26516ecae [Code style] Separate objective register and set display slot functions 2025-03-30 18:47:39 +02:00
NEZNAMY f26a7ad2b1 [Bukkit] Add direct NMS hook for v1_8_R3 and v1_12_R1 2025-03-30 17:46:23 +02:00
NEZNAMY 96e0a29573 Merge pull request #1464 from MineLAT/fix/viaversion-delay
Fix ViaVersion packets delay
2025-03-29 17:12:29 +01:00
NEZNAMY f30d667ca8 [Code style] Add return value annotations and remove unused methods in ConfigurationFile 2025-03-29 17:05:53 +01:00
Rubén 8db7a1d6d9 Fix ViaVersion packets delay 2025-03-29 10:04:46 -06:00
NEZNAMY d285a0512e [Multi-server support] Provide some feedback about connection status (success/fail) (doesn't work for redis) 2025-03-29 16:52:13 +01:00
NEZNAMY 256d0d5c84 Revert "[Placeholders] Parse nested PAPI placeholders using {}"
This reverts commit 6501480980.
2025-03-29 09:57:02 +01:00
NEZNAMY b808e1f9d1 [Bukkit] Refactor scoreboard / tablist implementation finding for players 2025-03-29 09:55:52 +01:00
NEZNAMY 07cd781ec1 [Sponge] Drop Sponge 7 module 2025-03-28 15:43:37 +01:00
NEZNAMY 9115b687f4 [Sponge] Drop support for sponge versions 1.16.5 - 1.20.5 2025-03-27 18:51:28 +01:00
NEZNAMY 7c51377203 [Bukkit] Update paper submodule for 1.21.5 and allow it there 2025-03-27 18:24:02 +01:00
NEZNAMY 193cd02072 [Configuration] Fix startup error when some config options were missing 2025-03-27 16:49:01 +01:00
NEZNAMY dbb6d91f0c [Configuration] Add missing playerlist-objective.render-type option to default config 2025-03-26 19:48:20 +01:00
NEZNAMY a82714e811 [BungeeCord] Fix error (#1462) 2025-03-26 19:00:53 +01:00
NEZNAMY bcd1bbac62 5.1.1-SNAPSHOT 2025-03-26 18:53:58 +01:00
NEZNAMY 2fde0e68ca 5.1.0 2025-03-26 17:53:56 +01:00
NEZNAMY e6e9b1c5ae Add 1.21.5 protocol constant 2025-03-25 18:46:53 +01:00
NEZNAMY 48b789c51d [Fabric] Update to 1.21.5 2025-03-25 18:36:41 +01:00
NEZNAMY 433b39209d [Fabric] Remove server version detection as it is no longer used 2025-03-24 18:26:56 +01:00
NEZNAMY b6df7a9f33 [Code style] Improve parity between Fabric and Paper Scoreboard implementations 2025-03-24 17:16:54 +01:00
NEZNAMY ad1d55537f [Code style] Improve parity between Fabric and Paper TabList implementations 2025-03-24 17:02:35 +01:00
NEZNAMY 9982d2c6ef [Fabric] Update to 1.21.5-rc2 2025-03-24 16:32:17 +01:00
NEZNAMY 1e3f622a98 Remove server version checks for new content as everything is now supported thanks to new ViaVersion hook 2025-03-24 16:26:31 +01:00
NEZNAMY ce05d5f6a6 Merge pull request #1443 from MineLAT/feat/viaversion-packets
Add ViaVersion packets support
2025-03-24 16:15:50 +01:00
NEZNAMY 19378e2095 [RGB] Fix gradient pattern for <#RRGGBB></#RRGGBB> to not capture a newer color used inside of it (caused by using one of MiniMessage's RGB syntaxes) 2025-03-23 18:47:57 +01:00
Rubén 0d992f1e50 Execute delayed tasks at once 2025-03-23 10:39:10 -06:00
Rubén de7cabfd54 Add missing method call 2025-03-23 09:31:10 -06:00
Rubén cfe73a00ee Fix early packet send on viaversion decoder 2025-03-23 09:06:11 -06:00
Rubén 35a7acbbd9 Merge remote-tracking branch 'origin/master' into feat/viaversion-packets
# Conflicts:
#	bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/BukkitTabPlayer.java
#	bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/BukkitPlatform.java
2025-03-23 08:53:00 -06:00
NEZNAMY 20eebca395 [Belowname & Playerlist objective] Add startup warn if configured "value" will never evaluate to a number 2025-03-23 15:47:32 +01:00
NEZNAMY 7c2a4deb1a [Code style] Move getSkin() method to TabList 2025-03-23 13:40:27 +01:00
NEZNAMY e227e6a0f4 [Bukkit] Add back Paper submodule, but only for the latest MC version instead of an actual supported range 2025-03-23 13:09:30 +01:00
NEZNAMY e015c29a3d [Code style] Move legacy color rgb codes to TextColor class 2025-03-23 11:26:13 +01:00
NEZNAMY a2859937e2 [Bukkit] [Performance] Avoid using reflection for getting online players on 1.8+ 2025-03-22 19:53:59 +01:00
NEZNAMY cd26252444 [Scoreboard] Fix error when more than 21 lines are defined (will now error at 100) 2025-03-22 10:42:03 +01:00
NEZNAMY 47894a6e74 [Performance] Tiny performance boost of %luckperms-prefix% and suffix placeholders 2025-03-20 18:37:37 +01:00
NEZNAMY bcf94180d5 [Fabric] Update Fabric to 1.21.5-rc1 2025-03-20 18:33:00 +01:00
NEZNAMY 6d2eeda28c Merge pull request #1457 from Radu-Voinea/master2
Added %luckperms-weight% as a built-in placeholder
2025-03-20 12:09:57 +01:00
Radu Voinea 049c768013 Moved player lookup from LP to TabPlayer 2025-03-20 13:05:53 +02:00
Radu Voinea ffae488d1e Removed auto-formatted text 2025-03-20 12:54:36 +02:00
NEZNAMY 3ea0ae6e5b [Performance] Create a constant for empty component to avoid recreating it over and over 2025-03-19 17:54:56 +01:00
NEZNAMY 530c25655c [Error logging] Add missing " into error message 2025-03-19 17:44:03 +01:00
NEZNAMY ca830fd64c [Playerlist Objective] Make render type explicitly configurable 2025-03-19 17:42:16 +01:00
NEZNAMY 4272476230 [Playerlist Objective] Make title configurable (#1454) 2025-03-19 17:05:26 +01:00
NEZNAMY b7e44246ce [Fabric] Update to 1.21.5-pre3 2025-03-18 16:54:18 +01:00
NEZNAMY 33b9578fd1 [BossBar] Add %bossbar_announce_time_left_<bossbar>% and %bossbar_announce_time_total_<bossbar>% placeholders 2025-03-16 15:03:59 +01:00
NEZNAMY df0a96843d [Error Logging] Fix typo 2025-03-16 15:00:32 +01:00
NEZNAMY 5b5f7dfc12 [Code style] Remove unused fields 2025-03-15 16:49:21 +01:00
NEZNAMY 8b094adcca [Nametags] Add a lot more subcommands for manipulating nametag visibility 2025-03-15 16:48:34 +01:00
NEZNAMY de9d9ab844 [Nametags] Refactor classes and create enum for nametag invisibility reason 2025-03-13 18:08:17 +01:00
NEZNAMY 2fd6d2f50b [Fabric] Update to 1.21.5-pre2 2025-03-13 16:35:37 +01:00
Rubén 349c9eca4b Rename classes for more consistency 2025-03-12 18:18:09 -06:00
Rubén 1f119233d7 Move via module into bukkit module 2025-03-11 18:47:46 -06:00
Rubén 17c2d63892 Use instance method 2025-03-11 14:06:13 -06:00
NEZNAMY 79c76e913d [Fabric] Update to 1.21.5-pre1 2025-03-11 17:06:48 +01:00
NEZNAMY 6501480980 [Placeholders] Parse nested PAPI placeholders using {} 2025-03-08 13:40:58 +01:00
NEZNAMY 5ad9bbba37 [Global playerlist] Simplify expression (servers are never equal) 2025-03-08 09:44:31 +01:00
NEZNAMY f012448758 [Description] Improve image generator script 2025-03-07 20:25:11 +01:00
Rubén 99b6d635d7 Remove unchecked object handling 2025-03-07 08:37:14 -06:00
Rubén 5f742627e9 Avoid component italic format being reset 2025-03-07 07:58:19 -06:00
Rubén a9e725002a Use simple text component 2025-03-07 07:51:16 -06:00
Rubén 49150f9b1e Remove ViaVersion configuration support 2025-03-06 22:43:49 -06:00
Rubén 89aa1ba94c Fix class cast 2025-03-06 22:32:14 -06:00
Rubén 6aca313bd8 Use dummy object 2025-03-06 22:31:49 -06:00
Rubén f76d5a958f Fix component writing on newer versions 2025-03-06 22:15:51 -06:00
NEZNAMY b833a10de4 [Fabric] Update to 25w10a 2025-03-05 17:14:38 +01:00
Rubén f3ce5632fb Add safe check for ViaVersion internals usage 2025-03-05 07:54:09 -06:00
Rubén f5bf4c3831 Merge component conversion methods 2025-03-04 07:27:01 -06:00
Rubén 08a3acc5e0 Use direct return for viaversion providers 2025-03-04 07:26:13 -06:00
Rubén 5b63034607 Apply component style on compatible components 2025-03-03 07:36:33 -06:00
Rubén d4543032d9 Use the correct annotation 2025-03-02 09:25:52 -06:00
Rubén 254a91c3bd Fix legacy text check 2025-03-02 09:18:46 -06:00
NEZNAMY 4c01ddaaef [Description] Remove now no longer used images 2025-03-02 14:10:06 +01:00
NEZNAMY 2993d1450a [Description] Change text into code-generated images 2025-03-02 13:49:37 +01:00
Rubén 582c3a4c1a Initial ViaVersion packets support 2025-03-01 16:31:24 -06:00
NEZNAMY dd6b964405 [Fabric] Remove support for all versions below 1.21.4 2025-03-01 18:31:50 +01:00
NEZNAMY 16827bfbac Update references to version 5.1.0 2025-03-01 18:05:53 +01:00
NEZNAMY 3c4d72bb71 Bump version to 5.1.0-SNAPSHOT 2025-03-01 17:26:30 +01:00
NEZNAMY 004036e019 [BungeeCord / Velocity] Read server list from configuration for %online_<server>% placeholders instead of dynamically registering them when used 2025-03-01 16:15:03 +01:00
NEZNAMY ba06f80baa [BungeeCord / Velocity] Block bridge communication messages from player to avoid exploits 2025-03-01 14:07:50 +01:00
NEZNAMY ee47428a80 [Floodgate hook] Remove warning when floodgate is not configured correctly 2025-03-01 09:10:23 +01:00
NEZNAMY 1e40cae27b [Wiki] Monthly wiki backup for March 2025 2025-03-01 08:46:19 +01:00
NEZNAMY f5b7bb5549 [Belowname] Rename messages to use belowname "value" instead of "number" 2025-02-28 16:58:57 +01:00
NEZNAMY 115883f8d0 [Fabric] Update to 25w09b 2025-02-28 16:57:37 +01:00
NEZNAMY a73446a1c5 [Placeholders] Make LP placeholders also use configured value instead of permission refresh interval 2025-02-27 18:45:37 +01:00
NEZNAMY 7501c4f76b [Commands] Make placeholder refresh interval color in cpu output different if it was overridden in config 2025-02-27 18:40:46 +01:00
NEZNAMY 9f038fae63 [Placeholders] Allow placeholder refresh intervals to define overrides for internal placeholders 2025-02-27 18:21:49 +01:00
NEZNAMY a61a520570 [Fabric] Update to 25w09a 2025-02-26 18:27:51 +01:00
NEZNAMY 885783cd9a [Bukkit] Refactor feature provider loaders 2025-02-25 17:16:54 +01:00
NEZNAMY 181f850c58 Fix compilation 2025-02-23 17:39:25 +01:00
NEZNAMY fe8742b580 Merge pull request #1435 from MineLAT/feat/proxy-support
Expand multi-server support
2025-02-23 17:11:33 +01:00
Rubén daeba7caa9 Remove unused belowname code 2025-02-23 10:01:29 -06:00
NEZNAMY 1340e6dc1b [Code style] [Bukkit] Refactor team packet data 2025-02-23 09:24:27 +01:00
NEZNAMY cba7655f0d [Code style] Move method into a different class 2025-02-22 18:32:31 +01:00
NEZNAMY ac7e2a9aef [RGB] Fully support magic codes inside gradients, they no longer must all be at the beginning 2025-02-22 18:27:33 +01:00
Rubén fcc0bfbf32 Optimize dependencies 2025-02-22 10:40:58 -06:00
NEZNAMY a7e86bdb64 [Fabric] Update to 25w08a 2025-02-19 17:57:19 +01:00
Rubén c3eecd8d14 Remove duplicated check 2025-02-18 10:39:48 -06:00
Rubén 25e6da3ac5 Add safe check for already connected players 2025-02-18 10:37:49 -06:00
Rubén a7e5786fee Use global player list instead 2025-02-18 09:56:48 -06:00
Rubén a6bccc3dd3 Add missing config values 2025-02-17 18:12:19 -06:00
Rubén d8cd39dc3e Remove duplicated yellow number send 2025-02-17 14:13:14 -06:00
Rubén 6eacf833f5 Remove duplicated name tag send 2025-02-17 14:11:54 -06:00
Rubén dbdd417e0d Avoid bad configuration update 2025-02-17 14:11:30 -06:00
Rubén 4c8dd52f28 Ignore same player 2025-02-17 13:56:46 -06:00
Rubén 31a2d8a02b Add supported types 2025-02-17 12:49:38 -06:00
Rubén f246d57a7e Add backend messaging 2025-02-17 12:37:15 -06:00
Rubén 4ae856630f Add proxy support via messenger 2025-02-17 12:02:27 -06:00
Rubén 8652baf2ae Rename redis feature 2025-02-17 11:50:18 -06:00
NEZNAMY 4a18853e8c [BungeeCord] Remove warning about a waterfall option as it is now long abandoned 2025-02-16 19:58:03 +01:00
NEZNAMY a60be9d8c1 [Spectator fix] Fix not updating on proxies (#1434) 2025-02-16 19:21:07 +01:00
NEZNAMY e16b47409c [Code style] Keep expected tablist display names as TabComponent instead of platform components 2025-02-16 17:45:57 +01:00
NEZNAMY 6f14cbe746 5.0.8-SNAPSHOT 2025-02-16 16:32:10 +01:00
NEZNAMY ea79c9c5dd 5.0.7 2025-02-16 11:27:35 +01:00
NEZNAMY 650d13ed71 [Reloading] Fix plugin messages being ignored on Velocity on reload due to a check not working correctly 2025-02-15 09:11:50 +01:00
NEZNAMY 169b8b8e94 [Scoreboard] Fix scoreboard chain misconfiguration detection not working correctly 2025-02-14 16:57:15 +01:00
NEZNAMY 8cef4a5bcb [Fabric] Update to 25w07a 2025-02-13 19:16:32 +01:00
NEZNAMY 70b40802cc [Fabric] Remove redundant function split based on server version 2025-02-11 17:45:53 +01:00
NEZNAMY 416e707cda Revert "[Code style] Create a separate module for bossbar API"
This reverts commit 042ab6850b.
2025-02-11 16:32:05 +01:00
NEZNAMY 12578293bc [Bukkit] Delete paper submodule as it was not worth it 2025-02-10 17:14:46 +01:00
NEZNAMY 042ab6850b [Code style] Create a separate module for bossbar API 2025-02-09 20:03:17 +01:00
NEZNAMY 09fc042630 [Chat components] Fix magic codes not being assigned correctly when converting from an adventure component 2025-02-09 14:55:58 +01:00
NEZNAMY c73d351bf1 [Configuration] Update default config to avoid unwanted bold text caused by MiniMessage 2025-02-09 12:42:52 +01:00
NEZNAMY 4d4e0a9c2a [BungeeCord & Velocity] Make compatibility error message more visible 2025-02-08 13:03:25 +01:00
NEZNAMY 2fd29b2347 [Configuration] Disable SnakeYAML's max file size limit (layout skincache can exceed the default 3MB) 2025-02-08 12:45:19 +01:00
NEZNAMY f332068318 [Fabric] Fix 1.16.5 support 2025-02-08 12:28:52 +01:00
NEZNAMY 186c79f93c [Bukkit] Split component converter into multiple classes based on server version interval for better maintainability 2025-02-08 10:19:06 +01:00
NEZNAMY 3770066485 [Code style] Move component folder into a new separate module 2025-02-07 16:19:48 +01:00
NEZNAMY 17b0ffe52b [Bukkit] Fix component style magic codes conversion 2025-02-07 15:35:23 +01:00
NEZNAMY d259b5bb78 5.0.7-SNAPSHOT 2025-02-06 18:05:23 +01:00
NEZNAMY f6c8d24177 5.0.6 2025-02-06 17:54:47 +01:00
NEZNAMY ab3bd61d3c [Bukkit] Fix error 2025-02-06 17:27:46 +01:00
NEZNAMY 6a5cee8f0e [Fabric] Update to 25w06a 2025-02-05 20:15:43 +01:00
NEZNAMY 549732fc8b [Chat components] No longer track modern/legacy converted components, only handle them internally in bungeecord module 2025-02-05 19:13:56 +01:00
NEZNAMY 09d400c6fb [GitHub] Bump version to fix actions 2025-02-05 18:33:49 +01:00
NEZNAMY 7e1cdafa78 [Bukkit] Only enable packetevents bug compensation <1.13 where it's actually needed to avoid scoreboard gradient bug due to forced splitting when the option is enabled and doesn't need to be 2025-02-04 18:39:25 +01:00
NEZNAMY 434c0216d5 [Adventure hook] Fix startup error when an older version of the library is present 2025-02-04 18:28:34 +01:00
NEZNAMY d5a0ae8e71 [Scoreboard] Fix memory leak 2025-02-03 16:56:04 +01:00
NEZNAMY 79e56c6a30 [Chat components] Implement shadowColor field (currently only used for converting components created using MiniMessage) 2025-02-02 17:54:57 +01:00
NEZNAMY 11cc1c3f25 [Code style] Remove unused constructor 2025-02-02 16:12:53 +01:00
NEZNAMY 8b343bcfb6 [Chat components] Fix NPE 2025-02-02 15:36:25 +01:00
NEZNAMY ecd83beb7d [Performance] Replace stream with for loop in vanish check 2025-02-02 14:14:57 +01:00
NEZNAMY 438f21fb11 [BungeeCord] Update to build 1899 (and require it) 2025-02-01 20:43:05 +01:00
NEZNAMY dd1524cf31 [Dependencies] Bump and remove unnecessary 2025-02-01 18:40:02 +01:00
NEZNAMY 0f85aa5384 Fix broken messages from previous commit 2025-02-01 18:23:04 +01:00
NEZNAMY 4644a0ae96 [Code style] Further reduce references to EnumChatFormat class 2025-02-01 18:18:38 +01:00
NEZNAMY 84b3efe0fc [Code style] Simplify some component creations 2025-02-01 17:07:48 +01:00
NEZNAMY 511acbd5ff [Chat components] Rework component creation and converters 2025-02-01 16:45:20 +01:00
NEZNAMY 8749b3b354 [Wiki] Monthly wiki backup for February 2025 2025-02-01 13:09:27 +01:00
NEZNAMY b66e63d242 [Fabric] Implement adventure component conversion to MC components (#1425) 2025-02-01 09:43:03 +01:00
NEZNAMY ba951238c3 [Fabric] Update to 25w05a 2025-01-29 20:08:49 +01:00
NEZNAMY a4eb76f1cf 5.0.6-SNAPSHOT 2025-01-29 20:08:17 +01:00
NEZNAMY c486899dcf 5.0.5 2025-01-29 17:37:10 +01:00
NEZNAMY b212f0d5be [Velocity] Fix some console messages not being colored correctly 2025-01-27 18:44:55 +01:00
NEZNAMY caa534ff7f [MySQL] Fix upload command using wrong file path 2025-01-26 12:15:41 +01:00
NEZNAMY 9c2fac6749 [MiniMessage] Fix critical error when an ancient MM version is present 2025-01-25 19:12:47 +01:00
NEZNAMY 2a4f918a10 [RGB] Convert all RGB/Gradients for MiniMessage parser (#1408, #1414, #1421) 2025-01-25 08:55:22 +01:00
NEZNAMY b45e2afe4c [Code style] Move classes to a different package 2025-01-24 19:16:07 +01:00
NEZNAMY 2c7237e5d9 [RGB] Remove early gradient conversion (for future commits) 2025-01-24 19:10:59 +01:00
NEZNAMY 26477e3150 5.0.5-SNAPSHOT 2025-01-23 18:27:20 +01:00
NEZNAMY cba8cb57d5 5.0.4 2025-01-23 17:24:16 +01:00
NEZNAMY 599b4822e5 [Fabric] Update to 25w04a 2025-01-22 18:31:03 +01:00
NEZNAMY fbd150b353 [API] Expose TabPlayer#getServer, TabPlayer#getWorld and TabPlayer#isBedrockPlayer 2025-01-21 17:33:10 +01:00
NEZNAMY 10b252e934 [Placeholders] Fix placeholders staying incorrectly marked as bridge placeholders under very specific conditions (#1416) 2025-01-19 21:36:27 +01:00
NEZNAMY e9dfcdeb10 [Layout] If trying to use skin of an online player in fixed slot, try to get it from the player's profile if online 2025-01-19 18:16:04 +01:00
NEZNAMY 9cb2f27754 [Error management] Do not print full stack traces when a skin fails to download 2025-01-19 17:41:48 +01:00
NEZNAMY a090a83b7d [Debug] Replace debug messages about downloading skin with downloaded and include time it took 2025-01-19 17:04:44 +01:00
NEZNAMY 992e661e4c [Placeholders] Fix bridge overriding placeholders if they did not exist before a reload (such as conditions) (#1416) 2025-01-19 15:59:51 +01:00
NEZNAMY 3b993d114e [Velocity] Fix errors when plugin is disabled due to a broken configuration file 2025-01-19 15:21:34 +01:00
NEZNAMY d181d62466 [Code style] Call EnumChatFormat#getFormat instead of toString 2025-01-19 14:55:46 +01:00
NEZNAMY 968cef7a12 [Scoreboard & Nametags] Add a config option to enforce <1.13 limits even for 1.13+ players (#1412, #1413) 2025-01-19 13:48:39 +01:00
NEZNAMY 390c2395eb Fix compilation error from previous commits 2025-01-19 13:34:18 +01:00
NEZNAMY adc9444794 [Code style] Make code more readable 2025-01-19 13:25:20 +01:00
NEZNAMY f086318082 [Chat components] Remove redundant checks for player's version 2025-01-19 13:21:18 +01:00
NEZNAMY 1cef4400b9 [Scoreboard] Fix ConcurrentModificationException when using API (#1410) 2025-01-18 14:23:13 +01:00
NEZNAMY 1f879ac91e [Scoreboard] Fix setText API method breaking a line if setting it to empty value (#1410) 2025-01-18 14:12:00 +01:00
NEZNAMY bec129d98e [Scoreboard & Bossbar] Save toggled players by UUID instead of names 2025-01-18 10:44:22 +01:00
NEZNAMY 152c04e68f [Configuration] Remove file header restoration on file modification 2025-01-18 10:41:13 +01:00
NEZNAMY d6cdacef43 [Layout] Fix skins not being saved into memory when downloaded 2025-01-16 19:02:38 +01:00
NEZNAMY 09891a075d [Layout] Add debug messages when a skin is about to be downloaded 2025-01-16 19:02:00 +01:00
NEZNAMY 9500bab5b7 [Scoreboard] Fix resetScoreboard not applying scoreboard correctly (#1411) 2025-01-16 18:15:31 +01:00
NEZNAMY 231edd4bd4 [Chat components] Fix magic code null values being converted to false 2025-01-15 18:55:03 +01:00
NEZNAMY 433572e759 [Fabric] Update to 25w03a 2025-01-15 18:06:51 +01:00
NEZNAMY 3ec772e87f [Feature management] Load all features in plugin's main thread to avoid API calls from load event before a feature actually loads (#1409) 2025-01-10 21:55:55 +01:00
NEZNAMY ae8287157c [Scoreboard] Do not add API scoreboards to the chain of scoreboards to go through (#1409) 2025-01-10 21:32:42 +01:00
NEZNAMY f005907b41 [Fabric] Update to 25w02a 2025-01-09 18:44:55 +01:00
NEZNAMY 8ea16044f1 [Debug] Send a correct message if player does not have any group permission 2025-01-08 18:34:06 +01:00
NEZNAMY e787a28353 [Tablist formatting] Fix formatting applying even if disabled with condition sometimes 2025-01-06 18:59:32 +01:00
NEZNAMY 6925d9564c [Code style] Create Platform#getCommand method instead of storing it in TabConstants 2025-01-04 18:43:37 +01:00
NEZNAMY ccd4ea785a [Logging] Fix outdated value in a message 2025-01-04 18:27:29 +01:00
NEZNAMY 63e88c09d4 [MySQL] Add a startup warn message if database is empty 2025-01-04 18:24:51 +01:00
NEZNAMY 296191b502 [Code style] Replace uses of EnumChatFormat for color codes with the codes directly 2025-01-02 19:20:49 +01:00
NEZNAMY af0151f446 [RGB] Remove now redundant check for modern/legacy colors (partially) 2025-01-02 16:26:06 +01:00
NEZNAMY 2bdfaa167e [RGB] Remove support for |L for manually defining legacy colors 2025-01-02 15:56:49 +01:00
NEZNAMY cd96476f9e [Belowname] Improve a warning message 2025-01-01 19:16:12 +01:00
NEZNAMY 9b0545aa1a [Layout] Fix players on top of tablist if team implementation is not available 2025-01-01 18:57:49 +01:00
NEZNAMY 63823123f8 [BungeeCord] Simplify code 2025-01-01 14:27:43 +01:00
NEZNAMY e91728be98 [Sponge 8] Update sponge gradle plugin to fix warning 2025-01-01 14:02:00 +01:00
NEZNAMY e7ecbf1245 [Velocity] Remove usage of deprecated API 2025-01-01 13:54:17 +01:00
NEZNAMY 28c2363b67 [Wiki] Monthly wiki backup for January 2025 2025-01-01 13:12:21 +01:00
NEZNAMY 21a3d4fb55 [Paper] Fix mistake in magic codes (#1404) 2024-12-30 14:10:52 +01:00
NEZNAMY 4b459a3ed1 [Commands] Add a red message to debug command if assigning groups by permissions and the player has all permissions 2024-12-29 20:09:31 +01:00
NEZNAMY ebc6a1b842 Fix paper compilation 2024-12-29 20:08:10 +01:00
NEZNAMY b72b0f269a [Code style] Remove redundant warning suppression 2024-12-21 17:54:06 +01:00
NEZNAMY 4cbcd69ed2 [Code style] Remove redundant constructor 2024-12-21 17:45:13 +01:00
NEZNAMY 6ef8b7748c [Code style] Remove redundant double coloring 2024-12-21 17:05:35 +01:00
NEZNAMY 8b567cb976 [Code style] Optimize last color of component calculation 2024-12-21 16:15:04 +01:00
NEZNAMY d8c231b9ce [Code style] Further reduce usage of EnumChatFormat class 2024-12-21 15:49:33 +01:00
NEZNAMY cc4347c881 [Code style] Make TabComponent#fetchLastColor Nullable 2024-12-21 13:19:20 +01:00
NEZNAMY 7cc572feb5 [Code style] Replace some references to EnumChatFormat with the actual color codes 2024-12-21 11:58:37 +01:00
NEZNAMY 96d1d1feb4 [Code style] Use TextColor as team color internally to prepare for a potential future MC update 2024-12-21 11:39:36 +01:00
NEZNAMY a7d9bd9ab5 [Code style] Simplify TabComponent#toRawText implementation 2024-12-21 11:15:47 +01:00
NEZNAMY 1cdfdf1d43 [Code style] Simplify 2024-12-18 17:32:54 +01:00
NEZNAMY 0762a5e689 [Code style] Remove redundant method call 2024-12-18 17:22:55 +01:00
NEZNAMY 3e2906ccf8 [Dependencies] Version bump and remove unused 2024-12-18 17:18:09 +01:00
NEZNAMY 13761e032c [Bukkit] Set shadowColor to null instead of 0 (no shadow) (#1400) 2024-12-16 18:51:02 +01:00
NEZNAMY fb8fa3fa54 [MiniMessage] Implement Keybind component support as well (on 1.19+) 2024-12-14 11:34:02 +01:00
NEZNAMY b89bf5933b [MiniMessage] Add support for its translatable components (paper / velocity only) (#1399) 2024-12-13 22:40:20 +01:00
NEZNAMY 1c4f404fd2 [Code style] Remove unused method 2024-12-13 22:22:51 +01:00
NEZNAMY 9fe1560f1a [Sorting] Remove runtime warn spam when configured sorting placeholder is invalid (only keep startup warn) 2024-12-12 18:58:49 +01:00
NEZNAMY 6a9cca37c6 [Scoreboard] Fix toggle command being completely ignored when another plugin has sent scoreboard instead of processing it (to some degree) 2024-12-10 21:30:20 +01:00
NEZNAMY bfde75d4b1 [Configuration] Fix startup error when group name is a number (#1398) 2024-12-09 18:12:03 +01:00
NEZNAMY a83f98580d [Bukkit] Update Paper submodule to 1.21.4 2024-12-07 13:58:47 +01:00
NEZNAMY 673542d8e4 [Code style] Move canSee method into TabPlayer 2024-12-07 12:23:51 +01:00
NEZNAMY 81c5d89a25 Fix broken PR 2024-12-07 12:08:26 +01:00
NEZNAMY bf0bcb0b96 Merge pull request #1394 from WheelerShigley/master
Fabric now has a getTPS() approximation.
2024-12-07 09:57:25 +01:00
WheelerShigley ac7a664303 Fabric now has a getTPS() approximation.
Added Fabric TPS approximation, based on mspt.
2024-12-06 19:58:38 -06:00
NEZNAMY 182dc67a49 5.0.4-SNAPSHOT 2024-12-03 20:27:24 +01:00
720 changed files with 37603 additions and 17030 deletions

No files matched your search

+29
View File
@@ -0,0 +1,29 @@
name: Backport
description: Backport to an older version of MC for modded platforms
labels: ["Type: Backport"]
body:
- type: input
attributes:
label: Server software and version
description: Server software and version to backport to
placeholder: Forge 1.5.2
validations:
required: true
- type: textarea
attributes:
label: Other
description: Anything else you may want to say
placeholder: Lots of servers want this and it's missing
validations:
required: false
- type: checkboxes
attributes:
label: Checklist
description: Let's make sure this request is valid
options:
- label: This is not a request to update to a new MC version that just came out
required: true
- label: This version is either not available on Modrinth, or is very outdated
required: false
+4 -2
View File
@@ -1,7 +1,9 @@
# About
This folder contains the plugin's description as advertised on various marketplaces which use various syntax's (bbcode, markdown).
This folder contains the plugin's description as advertised on various marketplaces where each one uses a different syntax.
(BBCode, Markdown).
While this is not accurate folder to have this stored in (".github"), it is the closest if we don't want to create a folder for this in the root.
While this is not an accurate folder to have this stored in (`.github`),
it is the closest if we don't want to create a folder for this in the root.
The file structure of this folder is as following:
+23 -173
View File
@@ -1,13 +1,13 @@
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_About.png[/IMG]
TAB is an all-in-one plugin for displaying information in various places, which aims to outperform all similar plugins in terms of features, compatibility and performance.
The compact configuration allows you to get the plugin to work the way you want regardless of how simple or complex you want it to be or how experienced you are. Default configuration already contains useful values and examples to give you a better understanding and get you started quickly with instant results. The extensive [URL='https://github.com/NEZNAMY/TAB/wiki']wiki[/URL] answers any and all of your questions.
The compact configuration allows you to get the plugin to work the way you want regardless of how simple or complex you want it to be or how experienced you are. The default configuration already contains useful values and examples to give you a better understanding and get you started quickly with instant results. The extensive [URL='https://github.com/NEZNAMY/TAB/wiki']wiki[/URL] answers any of your questions.
[IMG]https://img.shields.io/badge/Release-5.0.1-blue.svg[/IMG]
[IMG]https://img.shields.io/badge/Minecraft-1.5%20--%201.21.3-blue.svg[/IMG]
[IMG]https://img.shields.io/badge/Java-8+-blue.svg[/IMG]
[URL='https://github.com/NEZNAMY/TAB'][IMG]https://img.shields.io/badge/GitHub-Source%20code-yellow.svg[/IMG][/URL]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_Release.svg[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_Minecraft.svg[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_Java.svg[/IMG]
[URL='https://github.com/NEZNAMY/TAB'][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_SourceCode.svg[/IMG][/URL]
[URL='https://github.com/NEZNAMY/TAB/issues'][IMG]https://img.shields.io/github/issues/neznamy/tab?label=Issues[/IMG][/URL]
[URL='https://github.com/NEZNAMY/TAB/wiki'][IMG]https://img.shields.io/badge/Documentation-Wiki-yellow.svg[/IMG][/URL]
[URL='https://github.com/NEZNAMY/TAB/wiki'][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_Documentation.svg[/IMG][/URL]
[CENTER][B][SIZE=7]Discord?[/SIZE][/B][/CENTER]
Official support by me is no longer provided to free users due to limited time and extreme inefficiency (see [URL='https://github.com/NEZNAMY/TAB?tab=readme-ov-file#provided-services']provided services[/URL] for more info).
However, you can join this [URL='https://discord.gg/YPqXt63YQj']fresh new community discord[/URL] made by a nice person who promises to help everyone with all plugins, including TAB.
@@ -15,170 +15,20 @@ However, you can join this [URL='https://discord.gg/YPqXt63YQj']fresh new commun
Before you consider requiring assistance, check out the [URL='https://github.com/NEZNAMY/TAB/wiki']wiki[/URL] first. It will answer any questions you may have and is also constantly getting improved.
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Features.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_HeaderFooter.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_HeaderFooter.png[/IMG][/CENTER]
[LIST]
[*]Per-world / per-server support
[*]Per-group / per-player support
[*]Disable if a specified condition is met
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_NameTags.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_NameTags.png[/IMG][/CENTER]
[LIST]
[*]Configurable prefix and suffix
[*]Per-world / per-server support
[*]Per-group / per-player support
[*]Disable if a specified condition is met
[*]Make nametags completely invisible
[*]Control collision rule
[*]Automatic compensation for 1.8.x client sided bug making nametags of invisible players still visible
[*]Anti-override to prevent other plugins from overriding this one
[/LIST]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Sorting.png[/IMG]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_Sorting.png[/IMG][/CENTER]
[LIST]
[*]Sorting by primary permission group
[*]Sorting by permission nodes
[*]Sorting by a numeric placeholder from lowest to highest or highest to lowest
[*]Alphabetically by a placeholder (A-Z or Z-A)
[*]Sorting by pre-defined placeholder values
[*]Combination of multiple sorting types
[*]Enable / disable case-sensitive sorting
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_TablistFormatting.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_TablistFormatting.png[/IMG][/CENTER]
[LIST]
[*]Configurable prefix, name and suffix
[*]Per-world / per-server support
[*]Per-group / per-player support
[*]Disable if a specified condition is met
[*]Anti-override to prevent other plugins from overriding this one
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_PlayerlistObjective.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_PlayerlistObjectiveNumber.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_PlayerlistObjectiveHealth.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_PlayerlistObjectiveFancy.png[/IMG] [/CENTER]
[LIST]
[*]Display value of any numeric placeholder or hearts
[*]Display any text on 1.20.3+
[*]Disable if a specified condition is met
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Belowname.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_BelownameComparison.png[/IMG][/CENTER]
[LIST]
[*]Display value of any numeric placeholder (<1.20.3) or any text (1.20.3+)
[*]Configurable text
[*]Disable if a specified condition is met
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Bossbar.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_BossBar.png[/IMG][/CENTER]
[LIST]
[*]Configurable text, progress, color and style
[*]Define display condition to see a bossbar
[*]Announce defined bossbar for specified amount of time
[*]Configurable toggle command and message
[*]Option to remember toggle choice between logins
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_GlobalPlayerlist.png[/IMG][/CENTER]
[LIST]
[*]Display players from all servers on a proxy network in tablist
[*]Configurable server groups to share playerlist instead of with all servers
[*]Ability to create isolated servers
[*]Servers where people will see everyone
[*]Compatible with vanish plugins
[*]Option to display players from other servers as spectators
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Layout.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_Layout.png[/IMG][/CENTER]
[LIST]
[*]Customize all 80 tablist slots
[*]Create static slots with any text and skin
[*]Create player groups based on conditions
[*]Multiple layouts based on conditions
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Scoreboard.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_ScoreboardLegacy.png[/IMG][/CENTER]
[LIST]
[*]Display up to 15 lines
[*]Option to show 0 (or any other static number) in every line instead of 1-15
[*]Fully configurable text on right side of lines on 1.20.3+
[*]Displaying different scoreboards based on conditions (output of placeholder, permissions)
[*]Up to 64 characters per line for <1.13, unlimited for 1.13+ clients
[*]Customizable toggle command and message
[*]Option to remember toggle choice between logins
[*]Automatic detection of scoreboards from other plugins to hide own and show it again once other plugin hides its scoreboard
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_PerWorldPlayerlist.png[/IMG][/CENTER]
[LIST]
[*]Only display players from current world in tablist
[*]Group worlds which should share players
[*]Worlds where players see everyone
[*]Option to see all players in all worlds for players with permission
[/LIST]
[CENTER][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_API.png[/IMG][/CENTER]
[LIST]
[*]Change player prefix/name/suffix in tablist
[*]Change header/footer
[*]Change nametag prefix / suffix
[*]Change player collision rule and nametag visibility
[*]Change sorting priority
[*]Create custom scoreboards, show different scoreboard, toggle scoreboard
[*]Create custom placeholders
[*]Create custom boss bars, toggle bossbar visibility, announce bossbar
[*]... and more!
[/LIST]
[LIST]
[*]Placeholder support
[LIST]
[*]Internal placeholders with customizable output
[*]Create and use custom animations
[*]All placeholders and animations are supported in all features
[*]Full PlaceholderAPI support including relational placeholders
[*]PlaceholderAPI support on BungeeCord
[/LIST]
[*]Placeholder output replacements
[LIST]
[*]Modify output of any placeholder, including PlaceholderAPI placeholders
[*]Replace exact text with another text
[*]Change output if it's in a number interval
[*]Set value if none of the above is met
[*]Use original placeholder's output in new one
[*]Support for nested placeholders
[*]Can be used in other plugins as well
[/LIST]
[*]RGB Support
[LIST]
[*]5 supported RGB patterns
[*]4 supported gradient patterns
[*]Automatically display closest color to legacy clients
[*]Configurable color for legacy clients
[*]Supported in all features [B]where possible[/B]
[/LIST]
[*]Conditional placeholders
[LIST]
[*]Conditions based on placeholder output (comparing numeric value, exact output)
[*]Conditions based on permission node
[*]Combine conditions with AND or OR
[*]Configurable output of both cases when condition is and isn't met
[*]Placeholder support in condition output
[/LIST]
[*]High performance
[LIST]
[*]Full control of CPU usage by optimizing configuration and disabling unwanted features
[*]Fully asynchronous - no impact on TPS
[*]Check plugin's CPU usage using /tab cpu
[/LIST]
[*]RedisBungee support
[*]MySQL support
[*]Fully client-sided, server-side stays unaffected (scoreboards with their teams and objectives, bossbar entities, armor stands)
[*]Disable vanilla feature making players in spectator gamemode appear on the bottom of tablist
[*]Possible errors moved into a separate file to not spam your console
[*]Yaml error assistant for more user-friendly messages and fix suggestions
[*]Many misconfiguration checks to help solve issues much faster
[/LIST]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_HeaderFooter.png[/IMG][IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_NameTags.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Sorting.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_TablistFormatting.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_PlayerlistObjective.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Belowname.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Bossbar.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_GlobalPlayerlist.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Layout.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Scoreboard.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_PerWorldPlayerlist.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_API.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Placeholders.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_PlaceholderOutputReplacements.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_RGB.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_ConditionalPlaceholders.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_HighPerformance.png[/IMG]
[IMG]https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_More.png[/IMG][/CENTER]
+29 -157
View File
@@ -1,166 +1,38 @@
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_About.png)
TAB is an all-in-one plugin for displaying information in various places, which aims to outperform all similar plugins in terms of features, compatibility and performance.
The compact configuration allows you to get the plugin to work the way you want regardless of how simple or complex you want it to be or how experienced you are.
Default configuration already contains useful values and examples to give you a better understanding and get you started quickly with instant results.
The extensive [wiki](https://github.com/NEZNAMY/TAB/wiki) answers any and all of your questions.
The compact configuration allows you to get the plugin to work the way you want regardless of how simple or complex you want it to be or how experienced you are.
The default configuration already contains useful values and examples to give you a better understanding and get you started quickly with instant results.
The extensive [wiki](https://github.com/NEZNAMY/TAB/wiki) answers any of your questions.
![https://img.shields.io/badge/Release-5.0.1-blue.svg](https://img.shields.io/badge/Release-5.0.1-blue.svg)
![https://img.shields.io/badge/Minecraft-1.5%20--%201.21.3-blue.svg](https://img.shields.io/badge/Minecraft-1.5%20--%201.21.3-blue.svg)
![https://img.shields.io/badge/Java-8+-blue.svg](https://img.shields.io/badge/Java-8+-blue.svg)
[![https://img.shields.io/badge/GitHub-Source%20code-yellow.svg](https://img.shields.io/badge/GitHub-Source%20code-yellow.svg)](https://github.com/NEZNAMY/TAB)
[![https://img.shields.io/github/issues/neznamy/tab?label=Issues](https://img.shields.io/github/issues/neznamy/tab?label=Issues)](https://github.com/NEZNAMY/TAB/issues)
[![https://img.shields.io/badge/Documentation-Wiki-yellow.svg](https://img.shields.io/badge/Documentation-Wiki-yellow.svg)](https://github.com/NEZNAMY/TAB/wiki)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_Release.svg)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_Minecraft.svg)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_Java.svg)
[![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_SourceCode.svg)](https://github.com/NEZNAMY/TAB)
[![](https://img.shields.io/github/issues/neznamy/tab?label=Issues)](https://github.com/NEZNAMY/TAB/issues)
[![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Badge_Documentation.svg)](https://github.com/NEZNAMY/TAB/wiki)
# Discord?
Official support by me is no longer provided to free users due to limited time and extreme inefficiency (see [provided services]([https://github.com/NEZNAMY/TAB?tab=readme-ov-file#provided-services](https://github.com/NEZNAMY/TAB?tab=readme-ov-file#provided-services)) for more info).
However, you can join this [fresh new community discord]([https://discord.gg/YPqXt63YQj](https://discord.gg/YPqXt63YQj)) made by a nice person who promises to help everyone with all plugins, including TAB.
However, you can join this [fresh new community discord]([https://discord.gg/YPqXt63YQj](https://discord.gg/YPqXt63YQj)) made by a nice person who promises to help everyone with all plugins, including TAB.
Before you consider requiring assistance, check out the [wiki](https://github.com/NEZNAMY/TAB/wiki) first. It will answer any questions you may have and is also constantly getting improved.
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Features.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_HeaderFooter.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_HeaderFooter.png)
* Per-world / per-server support
* Per-group / per-player support
* Disable if a specified condition is met
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_NameTags.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_NameTags.png)
* Configurable prefix and suffix
* Per-world / per-server support
* Per-group / per-player support
* Disable if a specified condition is met
* Make nametags completely invisible
* Control collision rule
* Automatic compensation for 1.8.x client sided bug making nametags of invisible players still visible
* Anti-override to prevent other plugins from overriding this one
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Sorting.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_Sorting.png)
* Sorting by primary permission group
* Sorting by permission nodes
* Sorting by a numeric placeholder from lowest to highest or highest to lowest
* Alphabetically by a placeholder (A-Z or Z-A)
* Sorting by pre-defined placeholder values
* Combination of multiple sorting types
* Enable / disable case-sensitive sorting
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_TablistFormatting.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_TablistFormatting.png)
* Configurable prefix, name and suffix
* Per-world / per-server support
* Per-group / per-player support
* Disable if a specified condition is met
* Anti-override to prevent other plugins from overriding this one
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_PlayerlistObjective.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_PlayerlistObjectiveNumber.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_PlayerlistObjectiveHealth.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_PlayerlistObjectiveFancy.png)
* Display value of any numeric placeholder or hearts
* Display any text on 1.20.3+
* Disable if a specified condition is met
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Belowname.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_BelownameComparison.png)
* Display value of any numeric placeholder (<1.20.3) or any text (1.20.3+)
* Configurable text
* Disable if a specified condition is met
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Bossbar.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_BossBar.png)
* Configurable text, progress, color and style
* Define display condition to see a bossbar
* Announce defined bossbar for specified amount of time
* Configurable toggle command and message
* Option to remember toggle choice between logins
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_GlobalPlayerlist.png)
* Display players from all servers on a proxy network in tablist
* Configurable server groups to share playerlist instead of with all servers
* Ability to create isolated servers
* Servers where people will see everyone
* Compatible with vanish plugins
* Option to display players from other servers as spectators
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Layout.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_Layout.png)
* Customize all 80 tablist slots
* Create static slots with any text and skin
* Create player groups based on conditions
* Multiple layouts based on conditions
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_Scoreboard.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Example_ScoreboardComparison.png)
* Display up to 15 lines
* Option to show 0 (or any other static number) in every line instead of 1-15
* Fully configurable text on right side of lines on 1.20.3+
* Displaying different scoreboards based on conditions (output of placeholder, permissions)
* Up to 64 characters per line for <1.13, unlimited for 1.13+ clients
* Customizable toggle command and message
* Option to remember toggle choice between logins
* Automatic detection of scoreboards from other plugins to hide own and show it again once other plugin hides its scoreboard
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_PerWorldPlayerlist.png)
* Only display players from current world in tablist
* Group worlds which should share players
* Worlds where players see everyone
* Option to see all players in all worlds for players with permission
![](https://raw.githubusercontent.com/NEZNAMY/TAB/master/.github/description/images/Section_API.png)
* Change player prefix/name/suffix in tablist
* Change header/footer
* Change nametag prefix / suffix
* Change player collision rule and nametag visibility
* Change sorting priority
* Create custom scoreboards, show different scoreboard, toggle scoreboard
* Create custom placeholders
* Create custom boss bars, toggle bossbar visibility, announce bossbar
* ... and more!
.
.
.
.
.
Placeholder support
* Internal placeholders with customizable output
* Create and use custom animations
* All placeholders and animations are supported in all features
* Full [PlaceholderAPI]('https://www.spigotmc.org/resources/placeholderapi.6245/') support including [relational placeholders]('https://www.spigotmc.org/resources/placeholderapi.6245/update?update=167267')
* PlaceholderAPI support on BungeeCord / Velocity
Placeholder output replacements
* Modify output of any placeholder, including PlaceholderAPI placeholders
* Replace exact text with another text
* Change output if it's in a number interval
* Set value if none of the above is met
* Use original placeholder's output in new one
* Support for nested placeholders
* Can be used in other plugins as well
RGB Support
* 5 supported RGB patterns
* 3 supported gradient patterns
* Automatically display the closest color to legacy clients, can also be configured manually
* Supported in all features **where possible**
Conditional placeholders
* Conditions based on placeholder output (comparing numeric value, exact output)
* Conditions based on permission node
* Combine conditions with AND or OR
* Configurable output of both cases when condition is and isn't met
* Placeholder support in conditions
High performance
* Full control of CPU usage by optimizing configuration and disabling unwanted features
* Fully asynchronous - no impact on TPS
* Check plugin's CPU usage using /tab cpu
RedisBungee support
MySQL support
Fully client-sided, server-side stays unaffected
Disable vanilla feature making players in spectator gamemode appear on the bottom of tablist
Possible errors moved into a separate file to not spam your console
Yaml error assistant for more user-friendly messages and fix suggestions
Many misconfiguration checks to help solve issues much faster
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_HeaderFooter.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_NameTags.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Sorting.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_TablistFormatting.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_PlayerlistObjective.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Belowname.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Bossbar.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_GlobalPlayerlist.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Layout.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Scoreboard.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_PerWorldPlayerlist.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_API.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_Placeholders.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_PlaceholderOutputReplacements.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_RGB.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_ConditionalPlaceholders.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_HighPerformance.png)
![](https://raw.githubusercontent.com/NEZNAMY/TAB/refs/heads/master/.github/description/images/Generated_More.png)
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="126" height="20" role="img" aria-label="Documentation: Wiki"><title>Documentation: Wiki</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="126" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="93" height="20" fill="#555"/><rect x="93" width="33" height="20" fill="#dfb317"/><rect width="126" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="475" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="830">Documentation</text><text x="475" y="140" transform="scale(.1)" fill="#fff" textLength="830">Documentation</text><text aria-hidden="true" x="1085" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="230">Wiki</text><text x="1085" y="140" transform="scale(.1)" fill="#fff" textLength="230">Wiki</text></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="20" role="img" aria-label="Java: 8+"><title>Java: 8+</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="60" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="35" height="20" fill="#555"/><rect x="35" width="25" height="20" fill="#007ec6"/><rect width="60" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="185" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">Java</text><text x="185" y="140" transform="scale(.1)" fill="#fff" textLength="250">Java</text><text aria-hidden="true" x="465" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="150">8+</text><text x="465" y="140" transform="scale(.1)" fill="#fff" textLength="150">8+</text></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="92" height="20" role="img" aria-label="Release: 6.0.2"><title>Release: 6.0.2</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="92" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="53" height="20" fill="#555"/><rect x="53" width="39" height="20" fill="#007ec6"/><rect width="92" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="275" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">Release</text><text x="275" y="140" transform="scale(.1)" fill="#fff" textLength="430">Release</text><text aria-hidden="true" x="715" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="290">6.0.2</text><text x="715" y="140" transform="scale(.1)" fill="#fff" textLength="290">6.0.2</text></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="124" height="20" role="img" aria-label="GitHub: Source code"><title>GitHub: Source code</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="124" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="47" height="20" fill="#555"/><rect x="47" width="77" height="20" fill="#dfb317"/><rect width="124" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="245" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="370">GitHub</text><text x="245" y="140" transform="scale(.1)" fill="#fff" textLength="370">GitHub</text><text aria-hidden="true" x="845" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="670">Source code</text><text x="845" y="140" transform="scale(.1)" fill="#fff" textLength="670">Source code</text></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

@@ -0,0 +1,285 @@
from PIL import Image, ImageDraw, ImageFont
import requests
line_spacing = 10
padding = 10
class Text:
def __init__(self, text, color="black", font=ImageFont.truetype("arial.ttf", 20)):
self.text = text
self.color = color
self.font = font
class ImageGenerator:
def __init__(self, overlay_text, second_images, output_path, texts):
self.overlay_text = overlay_text
self.second_images = second_images
self.output_path = output_path
self.texts = texts
self.header_template = Image.open("Template_Small.png")
self.example_images = [Image.open(path) for path in second_images]
def calculate_total_height(self):
total_text_height = 0
for text in self.texts:
text_width, text_height = ImageDraw.Draw(self.header_template).textbbox((0, 0), text.text, font=text.font)[2:]
total_text_height += text_height + line_spacing
total_second_images_height = sum([img.height+padding for img in self.example_images])
return self.header_template.height + total_second_images_height + total_text_height + (3 * padding)
def draw_rounded_border(self, final_img, draw, radius, color, width):
draw.rounded_rectangle([(0, 0), (final_img.width - 1, final_img.height - 1)], radius=radius, outline=color, width=width)
def paste_top_image(self, final_img, font):
header_with_text = self.header_template.copy()
draw = ImageDraw.Draw(header_with_text)
text_width, text_height = draw.textbbox((0, 0), self.overlay_text, font=font)[2:]
text_x = (header_with_text.width - text_width) // 2 # Center text horizontally
text_y = 20 # Padding from the top
draw.text((text_x, text_y), self.overlay_text, fill="white", font=font)
final_img.paste(header_with_text, (padding, padding))
def paste_examples(self, final_img):
y_offset = self.header_template.height + 2 * padding
for img2 in self.example_images:
img2_x = (final_img.width - img2.width) // 2 # Center horizontally
final_img.paste(img2, (img2_x, y_offset))
y_offset += img2.height + padding
return y_offset
def paste_text(self, final_draw, y_offset):
y_offset += padding # Extra padding before text
for text in self.texts:
fancy_line = f"• {text.text}" # Add bullet point
final_draw.text((padding, y_offset), fancy_line, fill=text.color, font=text.font)
y_offset += ImageDraw.Draw(self.header_template).textbbox((0, 0), fancy_line, font=text.font)[3] + line_spacing # Add space between lines
def save(self, final_img):
final_img.save(self.output_path)
def create_image(overlay_text, second_images, output_path, texts):
generator = ImageGenerator(overlay_text, second_images, output_path, texts)
final_img = Image.new("RGB", (generator.header_template.width + 2 * padding, generator.calculate_total_height()), "white")
final_draw = ImageDraw.Draw(final_img)
# Rounded border
generator.draw_rounded_border(final_img, final_draw, 15, (39, 0, 114), 5)
# Template with text
generator.paste_top_image(final_img, ImageFont.truetype("arial.ttf", 60))
# Examples
y_offset = generator.paste_examples(final_img)
# Text
generator.paste_text(final_draw, y_offset)
# Save
generator.save(final_img)
def download_image(url, save_path):
try:
response = requests.get(url, stream=True)
response.raise_for_status()
with open(save_path, "wb") as file:
for chunk in response.iter_content(1024):
file.write(chunk)
except requests.RequestException as e:
print(f"Error downloading image: {e}")
if __name__ == "__main__":
create_image("Header & Footer", ["Example_HeaderFooter.png"], "Generated_HeaderFooter.png",
[
Text("Per-world / per-server support"),
Text("Per-group / per-player support"),
Text("Disable if a specified condition is met")
]
)
create_image("NameTags", ["Example_NameTags.png"], "Generated_NameTags.png",
[
Text("Configurable prefix and suffix"),
Text("Per-world / per-server support"),
Text("Per-group / per-player support"),
Text("Disable if a specified condition is met"),
Text("Make nametags completely invisible"),
Text("Control collision rule"),
Text("Automatic compensation for 1.8.x client sided bug making nametags of invisible players still visible"),
Text("Anti-override to prevent other plugins from overriding this one")
]
)
create_image("Sorting", ["Example_Sorting.png"], "Generated_Sorting.png",
[
Text("Sorting by primary permission group"),
Text("Sorting by permission nodes"),
Text("Sorting by a numeric placeholder from lowest to highest or highest to lowest"),
Text("Alphabetically by a placeholder (A-Z or Z-A)"),
Text("Sorting by pre-defined placeholder values"),
Text("Combination of multiple sorting types"),
Text("Enable / disable case-sensitive sorting")
]
)
create_image("Tablist Formatting", ["Example_TablistFormatting.png"], "Generated_TablistFormatting.png",
[
Text("Configurable prefix, name and suffix"),
Text("Per-world / per-server support"),
Text("Per-group / per-player support"),
Text("Disable if a specified condition is met"),
Text("Anti-override to prevent other plugins from overriding this one")
]
)
create_image("Playerlist Objective",
[
"Example_PlayerlistObjectiveNumber.png",
"Example_PlayerlistObjectiveHealth.png",
"Example_PlayerlistObjectiveFancy.png"
],
"Generated_PlayerlistObjective.png",
[
Text("Display value of any numeric placeholder or hearts"),
Text("Display any text on 1.20.3+"),
Text("Disable if a specified condition is met")
]
)
create_image("Belowname", ["Example_BelownameComparison.png"], "Generated_Belowname.png",
[
Text("Display value of any numeric placeholder (<1.20.3) or any text (1.20.3+)"),
Text("Configurable text"),
Text("Disable if a specified condition is met")
]
)
create_image("Bossbar", ["Example_BossBar.png"], "Generated_Bossbar.png",
[
Text("Configurable text, progress, color and style"),
Text("Define display condition to see a bossbar"),
Text("Announce defined bossbar for specified amount of time"),
Text("Configurable toggle command and message"),
Text("Option to remember toggle choice between logins")
]
)
create_image("Global Playerlist", [], "Generated_GlobalPlayerlist.png",
[
Text("Display players from all servers on a proxy network in tablist"),
Text("Configurable server groups to share playerlist instead of with all servers"),
Text("Ability to create isolated servers"),
Text("Servers where people will see everyone"),
Text("Compatible with vanish plugins"),
Text("Option to display players from other servers as spectators")
]
)
create_image("Layout", ["Example_Layout.png"], "Generated_Layout.png",
[
Text("Customize all 80 tablist slots"),
Text("Create static slots with any text and skin"),
Text("Create player groups based on conditions"),
Text("Multiple layouts based on conditions")
]
)
create_image("Scoreboard", ["Example_ScoreboardComparison.png"], "Generated_Scoreboard.png",
[
Text("Display up to 15 lines"),
Text("Option to show 0 (or any other static number) in every line instead of 1-15"),
Text("Fully configurable text on right side of lines on 1.20.3+"),
Text("Displaying different scoreboards based on conditions (output of placeholder, permissions)"),
Text("Up to 64 characters per line for <1.13, unlimited for 1.13+ clients"),
Text("Customizable toggle command and message"),
Text("Option to remember toggle choice between logins"),
Text("Automatic detection of scoreboards from other plugins to hide own and show it again once other plugin hides its scoreboard")
]
)
create_image("Per world Playerlist", [], "Generated_PerWorldPlayerlist.png",
[
Text("Only display players from current world in tablist"),
Text("Group worlds which should share players"),
Text("Worlds where players see everyone"),
Text("Option to see all players in all worlds for players with permission")
]
)
create_image("API", [], "Generated_API.png",
[
Text("Tablist formatting - Change player prefix/name/suffix"),
Text("Header / Footer - Change values"),
Text("Teams - Change nametag prefix / suffix, change visibility, collision rule"),
Text("Sorting - Change sorting priority"),
Text("Scoreboard - Create custom scoreboards, show different scoreboard, toggle scoreboard, announce scoreboard"),
Text("Bossbar - Create custom boss bars, toggle bossbar visibility, announce/send bossbar"),
Text("Layout - Create custom layouts, send existing layouts"),
Text("Placeholders - Create custom placeholders")
]
)
create_image("Placeholders", [], "Generated_Placeholders.png",
[
Text("Internal placeholders with customizable output"),
Text("Create and use custom animations"),
Text("All placeholders and animations are supported in all features"),
Text("Full PlaceholderAPI support including relational placeholders"),
Text("PlaceholderAPI support on BungeeCord / Velocity"),
Text("Conditional placeholders")
]
)
create_image("Conditional placeholders", [], "Generated_ConditionalPlaceholders.png",
[
Text("Conditions based on placeholder output (comparing numeric value, exact output)"),
Text("Conditions based on permission node"),
Text("Combine conditions with AND or OR"),
Text("Configurable output of both cases when condition is and isn't met"),
Text("Placeholder support in condition output")
]
)
create_image("Placeholder replacements", [], "Generated_PlaceholderOutputReplacements.png",
[
Text("Modify output of any placeholder, including PlaceholderAPI placeholders"),
Text("Replace exact text with another text"),
Text("Change output if it's in a number interval"),
Text("Set value if none of the above is met"),
Text("Use original placeholder's output in new one"),
Text("Support for nested placeholders"),
Text("Can be used in other plugins as well")
]
)
create_image("RGB Support", [], "Generated_RGB.png",
[
Text("5 supported RGB patterns"),
Text("3 supported gradient patterns"),
Text("Automatically display closest color to legacy clients"),
Text("Supported in all features where possible")
]
)
create_image("High Performance", [], "Generated_HighPerformance.png",
[
Text("Full control of CPU usage by optimizing configuration and disabling unwanted features"),
Text("Fully asynchronous - no impact on TPS"),
Text("Check plugin's CPU usage using /tab cpu"),
Text("Constant improvements to reduce usage"),
Text("Handle thousands of players")
]
)
create_image("And more!", [], "Generated_More.png",
[
Text("RedisBungee support for multiple proxies"),
Text("MySQL support to store groups/users"),
Text("Potential errors logged into a file instead of spamming the console"),
Text("Yaml error assistant for more user-friendly messages and fix suggestions"),
Text("Many misconfiguration checks to help solve issues much faster")
]
)
release = "6.0.2"
download_image(f"https://img.shields.io/badge/Release-{release}-blue.svg", "Badge_Release.svg")
java = "8+"
download_image(f"https://img.shields.io/badge/Java-{java}-blue.svg", "Badge_Java.svg")
download_image(f"https://img.shields.io/badge/GitHub-Source%20code-yellow.svg", "Badge_SourceCode.svg")
download_image(f"https://img.shields.io/badge/Documentation-Wiki-yellow.svg", "Badge_Documentation.svg")
Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

+10 -10
View File
@@ -14,11 +14,11 @@
* [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)
* [Multi server support](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Multi-server-support)
* [Nametags](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags)
* [Per world playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Per-world-playerlist)
* [Ping spoof](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Ping-Spoof)
* [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective)
* [RedisBungee support](https://github.com/NEZNAMY/TAB/wiki/Feature-info:-RedisBungee-support)
* [Scoreboard](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Scoreboard)
* [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)
@@ -26,21 +26,21 @@
## Functions
* [Animations](https://github.com/NEZNAMY/TAB/wiki/Animations)
* [Component usage (RGB, fonts, sprites)](https://github.com/NEZNAMY/TAB/wiki/How-to-use-Minecraft-components)
* [Conditional placeholders](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders)
* [Error logging](https://github.com/NEZNAMY/TAB/wiki/Error-logging)
* [MySQL](https://github.com/NEZNAMY/TAB/wiki/MySQL)
* [Placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements)
* [Placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders)
* [RGB/font usage](https://github.com/NEZNAMY/TAB/wiki/How-to-use-RGB-color-codes)
## 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 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)
* [Mini guides collection](https://github.com/NEZNAMY/TAB/wiki/Mini-guides-collection)
* [Additional information](https://github.com/NEZNAMY/TAB/wiki/Additional-information)
* [Bedrock compatibility](https://github.com/NEZNAMY/TAB/wiki/Bedrock-compatibility)
* [Client-sided mechanics](https://github.com/NEZNAMY/TAB/wiki/Client%E2%80%90sided-mechanics)
* [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API)
* [How to display name from nickname plugins](https://github.com/NEZNAMY/TAB/wiki/How-to-display-name-from-nickname-plugins)
* [How to save config in UTF-8 encoding](https://github.com/NEZNAMY/TAB/wiki/How-to-save-the-config-in-UTF8-encoding)
* [How to set up compatibility with glow plugins](https://github.com/NEZNAMY/TAB/wiki/How-to-make-TAB-compatible-with-glow-plugins)
* [Mini guides collection](https://github.com/NEZNAMY/TAB/wiki/Mini-guides-collection)
* [Optimizing plugin's CPU usage](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin)
* [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API)
* [Quick PlaceholderAPI startup guide](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide)
+34 -72
View File
@@ -2,73 +2,42 @@
This is a collection of random information about the plugin not necessarily limited to a single feature or function.
# Content
* [Bedrock compatibility](#bedrock-compatibility)
* [Detection](#detection)
* [Differences](#differences)
* [Issues with `.` in name](#issues-with--in-name)
* [Vanish detection](#vanish-detection)
* [Async player loading](#async-player-loading)
* [Scoreboard objective and team naming](#scoreboard-objective-and-team-naming)
* [Per-version experience](#per-version-experience)
* [Detection](#detection-1)
* [Differences](#differences-1)
* [Detection](#detection)
* [Differences](#differences)
* [Debug config option](#debug-config-option)
# Bedrock compatibility
## Detection
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 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 <player>`.
* Run `/tab parse <player> %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 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.
* 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 a section path.
This means that using `/tab player <playername containing .> ...` will not work.
There are three solutions available:
* Use player UUID if commands are executed via another plugin (`/tab player <uuid> ...`).
* Use `playeruuid` type, which accepts player name and saves the online player's UUID (`/tab playeruuid <player name> ...`).
* Use a different username prefix than `.`.
# Vanish detection
Although TAB does not manage player vanishing in any way,
it checks vanish status for features to be properly compatible.
TAB is not a vanish plugin and does not manage vanishing players in any way, therefore, is not responsible for removing vanished players from the tablist.
However, 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.
* Hide vanished players from [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout).
* Unregister teams of vanished players to players who cannot see them to prevent third party client exploits from seeing vanished players.
* [Unregister teams of vanished players](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags#additional-note-6---vanish-hook) to players who cannot see them to prevent third party client exploits from seeing vanished players.
Permission `tab.seevanished` allows players to:
* See vanished players in [Global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist).
* See vanished players in [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout).
* Not have teams of vanished players unregistered, which would make them not appear sorted properly and have no nametag prefix/suffix.
* Not have [teams of vanished players unregistered](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags#additional-note-6---vanish-hook), which would make them not appear sorted properly and have no nametag prefix/suffix.
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.
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 proxy,
[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 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.
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 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).
@@ -84,13 +53,13 @@ TAB's objective and team naming:
* `TAB-Scoreboard` for [Scoreboard](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Scoreboard)
* `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 sidebar scoreboard: `TAB-Sidebar-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).
# 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 the best possible experience on each minecraft version.
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's version.
@@ -102,42 +71,35 @@ You can check what version the plugin thinks player has by using any of the foll
* 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 the same version as the server in such cases.
* ViaVersion is installed on proxy 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` - This was an issue in the past and hasn't been reported in years now.
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):
* 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)
* 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+
To ensure the best possible experience, TAB is currently checking for player's version to alter its logic in some way.
If a player's version is not detected correctly, a side effect might occur instead, making the situation worse.
You will not experience all of these, only those that affect the version difference between the server and client.
When version detection fails, plugin's workarounds will be wrong and cause problems, such as:
* Nametag prefix/suffix being cut to 16 characters, even for 1.13+ clients
* 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 displayed as legacy colors for 1.16+ clients
* Layout being out of order for 1.19.3+ clients
| Change of logic | Negative side effect if version is not detected correctly |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Disabling [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) for 1.7 players | [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) entries being sent into the tablist of the player, breaking it as the layout is not designed support 1.7 |
| Use alternate way of sorting [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) entries for 1.19.3 - 1.21.1 as the optimal sorting way cannot be used | [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) entries being out of order for 1.19.3 - 1.21.1 <br />Layout entries appearing in chat complete for <1.19.3 even if they don't have to |
| Show 1.9+ bossbar on 1.8 servers for 1.9+ players using ViaVersion API | No 1.9+ bossbar for 1.9+ players on 1.8 server |
| Disabling [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) | Trying to fit the entire formatting into 16 characters, resulting in massive cutting and nametag feature not working |
| Play around <1.13 limitations of [Scoreboard](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Scoreboard) | Scoreboard lines limited to ~26 characters, even for 1.13+ clients <br />Scoreboard lines limited to 14 characters for < 1.13 clients |
| Cutting nametag prefix/suffix to 16 characters for <1.13, but keeping it full for 1.13+ | Nametag prefix/suffix being cut to 16 characters, even for 1.13+ clients |
# Debug config option
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.
* Makes plugin print 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 saying 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 another plugin sends a scoreboard (such as a mini-game 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 the 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, the 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.
* 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.
* 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 suggests something bad is going on, either bridge being overloaded or the server itself.
+3 -2
View File
@@ -44,6 +44,7 @@ That includes header/footer, prefix/suffix, belowname, playerlist objective, bos
# 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. You can do this by creating an animation with one frame.
* Adding to the previous point, animations can be used as a way to wrap a placeholder, having two different identifiers return the same value, allowing to use both original and replaced output from [Placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements).
# External tools
If you want an animation too complicated to be done manually, you can check out these websites:
@@ -56,5 +57,5 @@ If you want an animation too complicated to be done manually, you can check out
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.
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.
+33
View File
@@ -0,0 +1,33 @@
# Content
* [Detection](#detection)
* [Differences](#differences)
* [Issues with `.` in name](#issues-with--in-name)
# Detection
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 backend and floodgate is on both proxy and backend,
make sure [they are connected](https://geysermc.org/wiki/floodgate/setup/?platform=proxy-servers).
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 <player>`.
* Run `/tab parse <player> %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 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:
* Disabling [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) for bedrock players.
This is the only known change required on the TAB's 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 a section path.
This means that using `/tab player <playername containing .> ...` will not work.
There are three solutions available:
* Use player UUID if commands are executed via another plugin (`/tab player <uuid> ...`).
* Use `playeruuid` type, which accepts player name and saves the online player's UUID (`/tab playeruuid <player name> ...`).
* Use a different username prefix than `.`.
+4 -2
View File
@@ -5,10 +5,12 @@
* [Tablist entry widths](#tablist-entry-widths)
# About
This is a collection of mechanics related to the plugin explaining how does the minecraft client process information from the server and what you can and what you cannot impact.
This is a collection of mechanics related to the plugin explaining how does the Minecraft client process information from the server and what you can and what you cannot impact.
# Nametag format in tablist
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 names can be formatted in 2 ways. The main one, designed explicitly for tablist names was added into Minecraft in version 1.8 and can be controlled by TAB's [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting) feature.
If the feature is disabled or not applied properly (disabled with condition, some deeper compatibility issue ...), nametag prefix/suffix will be displayed in tablist instead. This mechanic is also used for <1.8 players due to 16-character tablist name limit there. You can also do this intentionally, for example for better performance.
If you don't want any prefixes in tablist, keep the feature enabled but don't set any prefix / suffix. Disabling this feature 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.
+30 -23
View File
@@ -2,28 +2,31 @@
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.
**Users who installed TAB on a proxy server:**
* 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 proxy, permission nodes are checked on the proxy, 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.
* Giving yourself OP on the backend server does not give you permissions on the proxy. It's a completely different server. You'll need to give yourself permissions using a permission plugin installed on the proxy (unless you enabled the option above).
* You are not able to execute proxy commands using a backend plugin (for example some menu plugin). If you want to achieve this, you'll need to find an updated plugin that allows you to send commands to the proxy.
# Content
* [Configuration](#configuration-commands)
* [/tab \<player/group/playeruuid\> \<name\> \<property\> [value] [options]](#tab-playergroupplayeruuid-name-property-value-options)
* [/tab \<player/group/playeruuid\> \<name\> \<property\> \[value\] \[options\]](#tab-playergroupplayeruuid-name-property-value-options)
* [/tab \<player/group/playeruuid\> \<name\> remove](#tab-playergroupplayeruuid-name-remove)
* [/tab reload](#tab-reload)
* [/tab debug [player]](#tab-debug-player)
* [/tab dump \[player\]](#tab-dump-player)
* [/tab group \<group\>](#tab-group-group)
* [/tab groups](#tab-groups)
* [Bossbar](#bossbar)
* [/tab bossbar send \<name\> \[player\]](#tab-bossbar-show-name-player)
* [/tab bossbar [on/off/toggle] [player] [options]](#tab-bossbar-onofftoggle-player-options)
* [/tab bossbar \[on/off/toggle\] \[player\] \[options\]](#tab-bossbar-onofftoggle-player-options)
* [/tab bossbar announce \<name\> \<length\>](#tab-bossbar-announce-name-duration)
* [Scoreboard](#scoreboard)
* [/tab scoreboard show \<name\> \[player\]](#tab-scoreboard-show-name-player)
* [/tab scoreboard [on/off/toggle] [player] [options]](#tab-scoreboard-onofftoggle-player-options)
* [/tab scoreboard \[on/off/toggle\] \[player\] \[options\]](#tab-scoreboard-onofftoggle-player-options)
* [/tab scoreboard announce \<name\> \<length\>](#tab-scoreboard-announce-name-duration)
* [Nametags / Teams](#nametags--teams)
* [/tab nametag toggle](#tab-nametag-toggle)
* [/tab nametag <show/hide/toggle> \[player\] \[viewer\] \[options\]](#tab-nametag-showhidetoggle-player-viewer-options)
* [/tab nametag <showview/hideview/toggleview> \[viewer\] \[options\]](#tab-nametag-showviewhideviewtoggleview-viewer-options)
* [/tab setcollision <player> <true/false>](#tab-setcollision-player-truefalse)
* [MySQL](#mysql)
* [/tab mysql upload](#tab-mysql-upload)
@@ -34,7 +37,7 @@ Commands have required permissions associated with them.
* [Additional permissions](#additional-permissions)
# Configuration commands
## /tab \<player/group/playeruuid\> \<name\> \<property\> [value] [options]
## /tab \<player/group/playeruuid\> \<name\> \<property\> \[value\] \[options\]
* **Permission:** `tab.change.<property>`
* **Description:** Changes a property of a group/player to the given value. No value argument will result in that property being deleted.
@@ -49,7 +52,7 @@ Commands have required permissions associated with them.
#### Names for each command type
* player: Supports both player name and raw uuid. Player doesn't need to be online.
* playeruuid: Requires name of an online player. Equal to using `player` with player's uuid.
* group: Uses group names from permission plugin. `_DEFAULT_` is used for default settings for all groups.
* group: Using group names from permission plugin. `_DEFAULT_` is used for default settings for all groups.
## /tab \<player/group/playeruuid\> \<name\> remove
* **Permission:** `tab.remove`
@@ -62,13 +65,9 @@ Commands have required permissions associated with them.
* **Permission:** `tab.reload`
* **Description:** Unloads the plugin, loads configuration files including changes and loads the plugin.
## /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:
* 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, their values and source.
## /tab dump \<player\>
* **Permission:** `tab.dump`
* **Description:** Creates a very detailed dump about the specified player to help with troubleshooting, uploads it to a paste site and shows the generated URL.
## /tab group \<group\>
* **Permission:** `tab.groupinfo`
@@ -83,7 +82,7 @@ Commands have required permissions associated with them.
* **Permission:** `tab.scoreboard.show` for showing to yourself, `tab.scoreboard.show.other` for showing to others.
* **Description:** Shows the scoreboard with the given `name`, either to yourself if no `player` was given, or to the given `player`.
## /tab scoreboard [on/off/toggle] [player] [options]
## /tab scoreboard \[on/off/toggle\] \[player\] \[options\]
* **Permission:** `tab.scoreboard.toggle` for toggling for yourself, `tab.scoreboard.toggle.other` for toggling for others.
* **Description:** Shows / hides / toggles scoreboard of specified player. If no player was given, command affects the sender.
* **Options:**
@@ -98,7 +97,7 @@ Commands have required permissions associated with them.
* **Permission:** `tab.bossbar.show` for showing to yourself, `tab.bossbar.show.other` for showing to others.
* **Description:** Shows the bossbar with the given `name`, either to yourself if no `player` was given, or to the given `player`.
## /tab bossbar [on/off/toggle] [player] [options]
## /tab bossbar \[on/off/toggle\] \[player\] \[options\]
* **Permission:** `tab.bossbar.toggle` for toggling for yourself, `tab.bossbar.toggle.other` for toggling for others.
* **Description:** Shows / hides / toggles bossbar of specified player. If no player was given, command affects the sender.
* **Options:**
@@ -109,9 +108,17 @@ Commands have required permissions associated with them.
* **Description:** Shows the bossbar with the given `name` to every player on the server for the given `duration`, in seconds.
# Nametags / Teams
## /tab nametag toggle
* **Permission:** `tab.nametag.toggle`
* **Description:** Toggles nametag visibility on all players for player who ran the command. Running the command again will make nametags visible again.
## /tab nametag <show/hide/toggle> \[player\] \[viewer\] \[options\]
* **Permission:** `tab.nametag.visibility` (`tab.nametag.visibility.other` for toggling for other players)
* **Description:** Shows / hides / toggles nametag of a specified player. If viewer is specified, view is only affected for the viewer.
* **Options:**
* `-s` for silent toggling (no chat message for affected player)
## /tab nametag <showview/hideview/toggleview> \[viewer\] \[options\]
* **Permission:** `tab.nametag.view` (`tab.nametag.view.other` for toggling for other players)
* **Description:** Shows / hides / toggles nametag VIEW a specified player.
* **Options:**
* `-s` for silent toggling (no chat message for affected player)
## /tab setcollision \<player\> \<true|false\>
* **Permission:** `tab.setcollision`
@@ -133,7 +140,7 @@ Commands have required permissions associated with them.
## /tab parse \<player\> \<text\>
* **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`. It 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 verify if a placeholder works as expected.
# Additional permissions
* `tab.admin` - Allows the player to execute all commands.
+56 -66
View File
@@ -1,19 +1,19 @@
# Content
* [Requirements](#requirements)
* [Java](#java)
* [Supported server software and versions](#supported-server-software-and-versions)
* [Supported features per platform](#supported-features-per-platform)
* [Plugin hooks](#plugin-hooks)
* [All platforms](#all-platforms)
* [Bukkit](#bukkit)
* [BungeeCord](#bungeecord)
* [Fabric](#fabric)
* [Sponge](#sponge)
* [Velocity](#velocity)
* [Plugin / mod hooks](#plugin--mod-hooks)
* [Compatibility issues](#compatibility-issues)
# Requirements
TAB does not depend on any other plugins.
It is compiled with Java 8 and therefore supports any version of 8 and above.
TAB does not depend on any other plugins. The experience can however be enhanced by installing other plugins, see below.
## Java
TAB's shared module is compiled with Java 8. For the platforms themselves, TAB does have a higher requirement, however, it does not require a Java version higher than the server software itself does. Specifically:
* Fabric, Forge and NeoForge require Java 21
* Velocity requires Java 17
* Bukkit and BungeeCord are ok with Java 8
# Supported server software and versions
<table>
@@ -28,40 +28,42 @@ It is compiled with Java 8 and therefore supports any version of 8 and above.
<tr>
<td rowspan=2>Vanilla</td>
<td rowspan=1><a href="https://getbukkit.org/">Bukkit</a> (+forge hybrids)</td>
<td>✔ (1.5 - 1.21.3)</td>
<td>✔ (1.7.10 ~ 26.1.1) (not all versions included)</td>
</tr>
<tr>
<td rowspan=1><a href="https://www.spongepowered.org/">Sponge</a></td>
<td>✔ (1.9<sup>1</sup> - 1.21.3)</td>
<td>❌</td>
</tr>
</tbody>
<tbody>
<tr>
<td rowspan=2>Modded</td>
<td rowspan=3>Modded</td>
<td rowspan=1><a href="https://fabricmc.net">Fabric</a></td>
<td>✔ (1.14 - 1.21.3)</td>
<td>✔ (1.21.11)<sup>1</sup></td>
</tr>
<tr>
<td rowspan=1><a href="https://minecraftforge.net">Forge</a></td>
<td>❌</td>
<td>✔ (1.21.11)<sup>1</sup></td>
</tr>
<tr>
<td rowspan=1><a href="https://neoforged.net/">NeoForge</a></td>
<td>✔ (1.21.11)<sup>1</sup></td>
</tr>
</tbody>
<tbody>
<tr>
<td rowspan=2>Proxies</td>
<td rowspan=1><a href="https://ci.md-5.net/job/BungeeCord/">BungeeCord</a></td>
<td>✔ (latest only<sup>2</sup>)</td>
<td>✔ (latest only)<sup>2</sup></td>
</tr>
<tr>
<td rowspan=1><a href="https://www.velocitypowered.com/">Velocity</a></td>
<td>✔ (latest only<sup>2</sup>)</td>
<td>✔ (latest only)<sup>2</sup></td>
</tr>
</tbody>
</table>
<sup>1</sup> Due to a bug in Sponge 7, it cannot coexist in the same jar with classes compiled with Java higher than 8, which is required by some other platforms. To get the plugin to run on Sponge 7, you will need to do one of the following:
* 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`.
<sup>1</sup> Modded platforms only support the latest MC version(s). For older MC versions try [Modrinth](https://modrinth.com/plugin/tab-was-taken)'s version download filter. If TAB is not available for your desired Minecraft version or is very outdated, you may [request a backport](https://github.com/NEZNAMY/TAB/issues/new?template=backport.yml).
<sup>2</sup> 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.
@@ -72,64 +74,52 @@ Since proxies support all client versions, there is never a reason to stay outda
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) | ✔ | ✔ | ✔ | ✔ | ✔ |
| [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) | ✔ | ✔ | ✔ | ✔ | ✔ |
| [Nametags](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags) & [Sorting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist) | ✔ |  ❗ | ✔ | ✔ | ✔ (via [VSAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/releases)) |
| [Per world playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Per-world-playerlist) | ✔ | ❌ | ❌ | ❌ | ❌ |
| [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective) | ✔ | ✔ | ✔ | ✔ | ✔ (via [VSAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/releases)) |
| [Scoreboard](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Scoreboard) | ✔ | ❗ | ✔ | ✔ | ✔ (via [VSAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/releases)) |
| [Spectator fix](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Spectator-fix) | ✔ | ✔ | ✔ | ✔ | ✔ |
| [Tablist names](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting) | ✔ | ✔ | ✔ | ✔ | ✔ |
| Feature          <sup>Platform</sup> | Bukkit / Hybrid | Fabric / Forge / NeoForge | 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) | ✔ | ✔ | ✔ | ✔ |
| [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) | ✔ | ✔ | ✔ | ✔ |
| [Nametags](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags) & [Sorting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist) | ✔ | ✔ | ✔ | ✔ (via [VSAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/releases)) |
| [Per world playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Per-world-playerlist) | ✔ | ❌ | ❌ | ❌ |
| [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective) | ✔ | ✔ | ✔ | ✔ (via [VSAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/releases)) |
| [Scoreboard](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Scoreboard) | ✔ | ✔ | ✔ | ✔ (via [VSAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/releases)) |
| [Spectator fix](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Spectator-fix) | ✔ | ✔ | ✔ | ✔ |
| [Tablist names](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting) | ✔ | ✔ | ✔ | ✔ |
✔ = Fully functional
 ❗ = NameTags: Anti-override missing, Scoreboard: [compatibility with other plugins](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Scoreboard#compatibility-with-other-plugins) missing.
❌ = Completely missing
# 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 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's version to adapt features for the best possible user experience.
# Plugin / mod hooks
To enhance user experience, TAB hooks into other plugins / mods for better experience.
This set of plugins / mods is different for each platform based on their availability.
Some are available on all platforms, some only in a few.
## 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 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 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
[**fabric-permissions-api**](https://github.com/lucko/fabric-permissions-api) - Supporting permission nodes instead of OP levels.
## Sponge
*None*
## Velocity
[**PremiumVanish**](https://www.spigotmc.org/resources/14404) - Supporting PV'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.
[**VelocityScoreboardAPI**](https://github.com/NEZNAMY/VelocityScoreboardAPI) - Sending scoreboard packets (scoreboard-teams, belowname-objective, playerlist-objective, scoreboard)
| Platform | Plugins / mods |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| All platforms | [**Floodgate**](https://github.com/GeyserMC/Floodgate) - For properly detecting bedrock players to adapt features for the best possible user experience. <br /> [**LuckPerms**](https://github.com/LuckPerms/LuckPerms) - Detecting permission groups of players for per-group settings. <br /> [**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. <br />[**PlaceholderAPI**](https://github.com/PlaceholderAPI/PlaceholderAPI) - Allows users to use its placeholders inside TAB. <br />[**PremiumVanish**](https://www.spigotmc.org/resources/14404) - Supporting PremiumVanish's vanishing levels instead of using a basic compatibility system. <br />[**Vault**](https://github.com/milkbowl/Vault) - Detecting permission groups of players for per-group settings. |
| BungeeCord | [**PremiumVanish**](https://www.spigotmc.org/resources/14404) - Supporting PremiumVanish's vanishing levels instead of using a basic compatibility system. <br />[**RedisBungee**](https://github.com/ProxioDev/RedisBungee) - Communicating with other proxies to properly display visuals on players on another proxy. |
| Fabric | [**fabric-permissions-api**](https://github.com/lucko/fabric-permissions-api) - Supporting permission nodes instead of OP levels. <br />[**placeholder-api**](https://modrinth.com/mod/placeholder-api) - Displaying placeholders from that mod and offering TAB's placeholders into it. |
| Forge | [**LuckPerms**](https://github.com/LuckPerms/LuckPerms) - Permission checks with a string instead of using vanilla OP levels. <br /> [**ForgePlaceholderAPI**](https://github.com/EnvyWare/ForgePlaceholderAPI) - Allows users to use its placeholders inside TAB. <br /> [**Vanishmod**](https://modrinth.com/mod/vanishmod) - Getting player's vanish status. |
| NeoForge | [**LuckPerms**](https://github.com/LuckPerms/LuckPerms) - Permission checks with a string instead of using vanilla OP levels. |
| Velocity | [**PremiumVanish**](https://www.spigotmc.org/resources/14404) - Supporting PremiumVanish's vanishing levels instead of using a basic compatibility system. <br />[**RedisBungee**](https://github.com/ProxioDev/RedisBungee) - Communicating with other proxies to properly display visuals on players on another proxy. <br />[**VelocityScoreboardAPI**](https://github.com/NEZNAMY/VelocityScoreboardAPI) - Sending scoreboard packets (scoreboard-teams, belowname-objective, playerlist-objective, scoreboard) |
# Compatibility issues
* **Glow plugins** will fail to apply glow color correctly. Check [How to make the plugin compatible with glow plugins](https://github.com/NEZNAMY/TAB/wiki/How-to-make-TAB-compatible-with-glow-plugins) for more information.
* **[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. 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:
* Some Skript addons may cause features to not work properly, such as sorting and scoreboard.
* **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 proxy 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 the proxy as well.
* **Nexo**'s `hide_scoreboard_numbers` config option (may apply to ItemsAdder and Oraxen as well) makes [Belowname](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Belowname)'s and [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective)'s `value` and `fancy-value` not visible. When using these features, you'll need to keep the option disabled.
* **LimboAuth** may prevent TAB from applying tablist formatting in a way that is not detectable using Velocity API, resulting in the feature not working properly on join.
* **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.
For example, 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 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.
* **XCord** - Has additional amazing optimizations that prevent TAB from being able to read outgoing packets and modify them if needed, resulting in some features not working properly, such as [tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting).
* **Random Spigot/BungeeCord forks** - All safe patches for improving security & performance are present in well-known public open-source 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 a 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.
+28 -15
View File
@@ -1,4 +1,5 @@
# Page content
* [About](#about)
* [Adding the dependency](#adding-the-dependency)
* [Getting started](#getting-started)
* [Lifespan of API calls](#lifespan-of-api-calls)
@@ -13,22 +14,31 @@
* [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting#api)
* [Placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders#api)
# About
This page explains how to import TAB's API into your project and together with other pages everything you can do with it.
Before starting please seriously reconsider if you really need this and cannot already achieve it using existing features (such as registering placeholders into PlaceholderAPI instead of TAB, using display conditions for scoreboards, ...). If not, consider making a request.
# Adding the dependency
For Maven users, you can add the API dependency like this:
```xml
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
<groupId>com.github.NEZNAMY</groupId>
<artifactId>TAB-API</artifactId>
<version>5.0.2</version>
<scope>provided</scope>
</dependency>
<dependencies>
<dependency>
<groupId>com.github.NEZNAMY</groupId>
<artifactId>TAB-API</artifactId>
<version>5.5.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
Or, for Gradle users, here are a few examples:
@@ -40,7 +50,7 @@ repositories {
}
dependencies {
compileOnly 'com.github.NEZNAMY:TAB-API:5.0.2'
compileOnly 'com.github.NEZNAMY:TAB-API:5.5.0'
}
```
@@ -51,15 +61,18 @@ repositories {
}
dependencies {
compileOnly("com.github.NEZNAMY", "TAB-API", "5.0.2")
compileOnly("com.github.NEZNAMY", "TAB-API", "5.5.0")
}
```
**WARNING: DO NOT SHADE THE API IN TO YOUR JAR! DO NOT RELOCATE THE API FROM ITS ORIGINAL PACKAGE!**
If you relocate, the API that you are calling will also get relocated in your code, meaning that you will be trying to call the relocated API. If you shade the API in, your code could load that bundled API, causing class path conflicts.
> [!WARNING]
> DO NOT SHADE THE API IN TO YOUR JAR! DO NOT RELOCATE THE API FROM ITS ORIGINAL PACKAGE!**
> If you relocate, the API that you are calling will also get relocated in your code, meaning that you will be trying to call the relocated API. If you shade the API in, your code could load that bundled API, causing class path conflicts.
Ensure that you are using **`<scope>provided</scope>` for Maven**, or **`compileOnly` for Gradle**.
> [!WARNING]
> If you are on Paper and your plugin is defined as a paper plugin (paper-plugin.yml), TAB's classes may not be visible to the class loader that loaded your plugin. To avoid this issue, do not use paper-plugin.yml in your plugin, just plugin.yml.
# Getting started
First, you need to get an instance of the API.
You can do this with `TabAPI.getInstance()`.
+111 -43
View File
@@ -1,45 +1,81 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Limitations](#limitations)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [Additional info](#additional-info)
* [Additional note 1 - Copying nametag visibility rule](#additional-note-1---copying-nametag-visibility-rule)
* [Additional note 2 - Hidden on sneak on 1.8](#additional-note-2---hidden-on-sneak-on-18)
* [Additional note 3 - Visible on NPCs](#additional-note-3---visible-on-npcs)
* [Tips & Tricks](#tips--tricks)
* [Tip 1 - Heart symbol](#tip-1---heart-symbol)
* [Tip 2 - Displaying health as 0-10 or in %](#tip-2---displaying-health-as-0-10-or-in-)
* [Limitations](#limitations)
* [[26.1] Visible on all entities](#261-visible-on-all-entities)
* [Additional note 4 - Compatibility with modified clients](#additional-note-4---compatibility-with-modified-clients)
* [Examples](#examples)
* [Example 1 - Per-world values](#example-1---per-world-values)
* [Example 2 - Hiding `title` for 1.20.3+ players](#example-2---hiding-title-for-1203-players)
* [Example 3 - Displaying health as 0-10 or in %](#example-3---displaying-health-as-0-10-or-in-)
* [Example 4 - Health bar using hearts](#example-4---health-bar-using-hearts)
* [Tips & Tricks](#tips--tricks)
* [Tip 1 - Heart symbol](#tip-1---heart-symbol)
# 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.
This features gives you control over Minecraft's scoreboard objective feature with BELOW_NAME slot.
This line is displayed below the nametags of all player entities in game. It is not possible to explicitly disable this feature for NPCs; however, this goal can be achieved (see below for more info).
It is only visible when within an 8-block range of the player (the range is hardcoded in the client and cannot be changed with a plugin).
Example visual effect:
![](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 displayed line is not one continuous configurable text. It consists of 2 parts (score and title) joined with a space.
The exact format is `[score]` + space + `title` (no, the space cannot be removed), where `[score]` is:
* `value` for 1.20.2- (will show `0` on NPCs), which only supports numbers (integers)
* `fancy-value` for 1.20.3+ (will show `fancy-value-default` on NPCs), which supports any text
The feature can be configured in **config.yml** under **belowname-objective** section.
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)
As you can see, the feature still has limits, even on 1.20.3+. If you are below this version or still don't like the forced space before title, you are out of luck and cannot use this feature the way you would like to. If you have seen this feature seemingly limitless, it could be a feature that was a part of TAB, but removed later. This feature hid the original nametag and placed invisible armor stands instead. If you are interested in this kind of solution, you'll need to look into other plugins.
# Configuration
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | true | Enables / Disables the feature |
| 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. <br/> **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. |
The feature can be configured in **config.yml** under **belowname-objective** section.
This is how the default configuration looks:
```
belowname-objective:
enabled: false
value: "%health%"
title: "&cHealth"
fancy-value: "&c%health%"
fancy-value-default: "NPC"
disable-condition: '%world%=disabledworld'
```
All the options are explained in the following table.
| Option name | Default value | Description |
|---------------------|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enabled | true | Enables / Disables the feature |
| 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. <br/> **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+, where it completely replaces `value`. |
| fancy-value-default | NPC | [1.20.3+] Default number format (`fancy-value`) for all player entities. `fancy-value` is displayed on 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 | Shared label shown after the score for every player entity. Player sees the same text on everyone (= placeholders are parsed for the viewer). Use the `value`/`fancy-value` fields for per‑player data; use `title` only for static labels like `Health` or placeholders which are supposed to be parsed for the viewing player. |
| disable-condition | %world%=disabledworld | A [condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) (either name of a condition or a conditional expression) that must be met for disabling the feature for players. Set to empty for not disabling the feature ever. <br/> **Note**: Disabling the feature for a player means sending objective unregister packet to them, which results in player not seeing belowname on anyone anymore. It doesn't work the other way around - you cannot disable this feature on target players, only for viewers. |
# Limitations
* [1.12.2-] Title length is limited to 32 characters (including color codes).
* [1.20.2-] `value` is limited to a white number.
* [Bedrock] Doesn't support 1.20.3+ features (`fancy-value`), `value` will be displayed instead, just like on <1.20.3.
* The format is a **[score] + space + shared title**. No, the space cannot be removed.
* The title is the same on all players, therefore, it cannot be personalized (such as player's faction). Only [score] can be per-player.
* It appears on all entities of player type. **This includes player NPCs.**
# Compatibility with other plugins
TAB does not contain any sort of compatibility functionality for this feature.
It will not try to prevent other plugins from applying the feature and neither will it detect it to re-add back once the other plugin removes it.
Therefore, if another plugin also sends belowname objective, TAB's may not show anymore (depending on who sends it first).
Make sure you do not have any other plugin sending it to ensure the feature works properly.
You can check the list of objectives registered by either commands or plugins using Bukkit API using `/scoreboard objectives list`.
If it contains one that could be the cause, you can unregister it by running `/scoreboard objectives remove <name>`. After doing so, reload TAB, so it resends its objectives again.
Note that if this was automatically generated by a plugin, it will probably be added back again.
# Additional Info
## Additional note 1 - Copying nametag visibility rule
The minecraft feature is programmed to be affected by nametag visibility rule.
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
@@ -60,27 +96,25 @@ This is how you can achieve it using the following popular NPC plugins:
* 1 - Select the NPC (`/npc select <ID>` or `/npc select` to select the nearest NPC)
* 2 - Hide its original nametag (which also hides belowname) using `/npc name`
* 3 - Display your desired text using `/npc hologram add <text>` ([more info](https://wiki.citizensnpcs.co/Commands#:~:text=the%20NPC%20hitbox-,/npc%20hologram,-add%20%5Btext%5D%20%7C%20set))
* **FancyNpcs with FancyHolograms**:
* 1 - Create a hologram with `/hologram create text <name>`.
* 2 - Link your newly created hologram with your NPC: `/hologram edit <hologram name> linkWithNpc <NPC name>`.
Its original name will be hidden automatically, so you don't need to manually do it.
* 3 - Change the NPC's name by editing your hologram's line(s): `/hologram edit hi setline 1 <text>`.
You can also add more lines if you want. See [FancyNpcs's wiki](https://docs.fancyinnovations.com/fancyholograms/commands/hologram/#text-hologram-modification) for more commands & info.
# 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.
### [26.1] Visible on all entities
In Minecraft version 26.1, Mojang "fixed" [MC-99647](https://bugs.mojang.com/browse/MC/issues/MC-99647), which reported that belowname is not visible on non-player entities. As a result, the belowname is now visible on all entities with a custom name (this even includes invisible armor stands, holograms and more). A new bug report was made for this: [MC-307012](https://bugs.mojang.com/browse/MC/issues/MC-307012).
**This is a client-sided bug. You will experience it on 26.1 regardless of the server version**.
If your server is on 26.1 or you support players with this version through ViaVersion, this might be a deal breaker for you. If that's the case, either disable this feature entirely, or set
```
belowname-objective:
title: "&4❤"
disable-condition: "%player-version-id%>=775"
```
which will make 26.1 players not see this feature on anyone (remember: disabling this feature disables it for the viewer, not target players).
## Tip 2 - Displaying health as 0-10 or in %
If you want health to display health as 0-10 instead of 0-20, you can achieve it with PlaceholderAPI:
* `%math_0_{player_health}/2%` for 0-10
* `%math_0_{player_health}*5%` for 0-100
# Limitations
* 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
## Additional note 4 - Compatibility with modified clients
Sadly, this feature is suffering from bugs introduced by third party clients such as Feather and Lunar. These two completely ignore `fancy-value` as if it was never added into the game, even on 1.20.3+. This is just an example, and it's not limited to these two clients and this one issue. If you experience issues with the feature and believe you configured it correctly, use vanilla client to make sure it's not caused by a broken client.
# Examples
## Example 1 - Per-world values
@@ -105,7 +139,10 @@ conditions:
true: "Text to display in world world2" # Player is in world world2, display the text
false: "Text to display in other worlds" # Player is not in any of the 2 worlds
```
**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!!!**
> [!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-value`:
```
@@ -115,7 +152,10 @@ belowname-objective:
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.*
> [!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 proxy, use %server% with server names.
> This works for any placeholder offered by TAB or by PlaceholderAPI.
## Example 2 - Hiding `title` for 1.20.3+ players
1.20.3 has replaced `value` field,
@@ -139,7 +179,10 @@ conditions:
true: "" # Show empty value for 1.20.3+
false: "Some text to display"
```
**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!!!**
> [!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:
title: "%condition:version%"
@@ -147,4 +190,29 @@ belowname-objective:
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.
You'll either need to live with it, or put some shared text there to avoid having a space at the end.
## Example 3 - Displaying health as 0-10 or in %
If you want health to display health as 0-10 instead of 0-20, you can achieve it with PlaceholderAPI:
* `%math_0_{player_health}/2%` for 0-10
* `%math_0_{player_health}*5%` for 0-100
## Example 4 - Health bar using hearts
You can achieve this on `1.20.3+` using `healthbar` expansion from PlaceholderAPI:
```
belowname-objective:
fancy-value: "%healthbar_healthbar%"
```
<img width="130" height="159" alt="image" src="https://github.com/user-attachments/assets/cef217ec-0a39-41ad-8457-f8f67a1e4b02" />
Sadly, there is no way to remove the forced space between `fancy-value` and `title`. You can only try to play around it by adding some static text after it, to make it look like the space is intended. Or you can just ignore the space and live with it.
# Tips & Tricks
## Tip 1 - Heart symbol
If you want to show health of players and display a heart symbol instead of text saying "Health", you can use this one: `❤`.
```
belowname-objective:
title: "&4❤"
```
> [!IMPORTANT]
> Make sure your config is [saved in UTF-8 encoding](https://github.com/NEZNAMY/TAB/wiki/How-to-save-the-config-in-UTF8-encoding) to properly read the heart symbol.
+135 -104
View File
@@ -1,131 +1,125 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Defining bossbars](#defining-bossbars)
* [style](#style)
* [color](#color)
* [progress](#progress)
* [text](#text)
* [announcement-bar](#announcement-bar)
* [display-condition](#display-condition)
* [Announce command](#announce-command)
* [Additional settings](#additional-settings)
* [Commands](#commands)
* [Placeholders](#placeholders)
* [Internal placeholders](#internal-placeholders)
* [PlaceholderAPI placeholders](#placeholderapi-placeholders)
* [Limitations](#limitations)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [Additional info](#additional-info)
* [Additional note 1 - Hiding bar itself](#additional-note-1---hiding-bar-itself)
* [Additional note 2 - Not hiding on server switch](#additional-note-2---not-hiding-on-server-switch)
* [Additional note 1 - Hiding bar itself](#additional-note-1---hiding-bar-itself)
* [API](#api)
* [Tips & Tricks](#tips--tricks)
* [Tip 1 - Animated bossbar color](#tip-1---animated-bossbar-color)
* [Tip 2 - Switching between bossbars with condition](#tip-2---switching-between-bossbars-with-condition)
* [Examples](#examples)
* [Example 1 - Changing text](#example-1---changing-text)
* [Example 2 - Switching between bossbars with condition](#example-2---switching-between-bossbars-with-condition)
* [Example 3 - Periodical appearing and disappearing](#example-3---periodical-appearing-and-disappearing)
* [Example 4 - Dynamic progress tracking a relative placeholder value](#example-4---dynamic-progress-tracking-a-relative-placeholder-value)
# 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 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.
This feature allows you to send modern bossbars to players, which appear on top of the screen.
Only works on Minecraft 1.9 and up.
Supporting 1.8 and lower would require an entity to be spawned (wither / dragon), which TAB no longer offers.
![](https://images-ext-2.discordapp.net/external/0H5v5gcK12jm-O_kljlx-iYdJ1Q3wBsY_Dch7Jr_aAk/https/image.prntscr.com/image/x4VewIuiRwO-XLGTvDxfWw.png)
# Configuration
## Defining bossbars
The feature can be configured in **config.yml** under **bossbar** section.
This is how the default configuration looks:
```
bossbar:
enabled: false
toggle-command: /bossbar
remember-toggle-choice: false
hidden-by-default: false
bars:
MyBossbar:
style: "PROGRESS"
color: "%animation:barcolors%"
progress: "100"
ServerInfo:
style: "PROGRESS" # for 1.9+: PROGRESS, NOTCHED_6, NOTCHED_10, NOTCHED_12, NOTCHED_20
color: "%animation:barcolors%" # for 1.9+: BLUE, GREEN, PINK, PURPLE, RED, WHITE, YELLOW
progress: "100" # in %
text: "&fWebsite: &bwww.domain.com"
```
Every bossbar line has 4 properties:
All the options are explained in the following table.
### style
Type of bossbar division.
You can choose from 5 styles: **PROGRESS**, **NOTCHED_6**, **NOTCHED_10**, **NOTCHED_12** and **NOTCHED_20**
![](https://images-ext-1.discordapp.net/external/yMuJNksnulOd_ZtI3yGw6CaQhon-ewVHsqaMzT8RcGk/https/image.prntscr.com/image/FzWSvsalTW6YVRPPK3oa9g.png)
These were defined by mojang, no other options are available. Other plugins may be using different names, but it's the same result in the end.
| Option name | Default value | Description |
|------------------------|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enabled | false | Enables / Disables the feature |
| toggle-command | /bossbar | A command to toggle bossbar visibility for player running the command. This command requires `tab.bossbar.toggle` permission. <br />**Note:** Commands are not supposed to be registered / unregistered dynamically at runtime. As such, you may run into small issues when changing the toggle command and reloading. After you modify the command to your liking, reconnect to properly see it in tabcomplete. If you don't use TAB on a proxy, consider restarting the server as well for the old command to actually be unregistered. |
| remember-toggle-choice | false | When enabled, disabling bossbar using `toggle-command` is remembered between reloads and restarts. |
| hidden-by-default | false | When enabled, bossbar will automatically be hidden until toggle command is used. |
| bars | *Map* | Map of defined bossbars, see below for more information. |
### color
Color of bossbar.
You can choose from 7 colors: **BLUE**, **GREEN**, **PINK**, **PURPLE**, **RED**, **WHITE** and **YELLOW**
![](https://images-ext-2.discordapp.net/external/MwNGvtNT0vspb_xiGUyx_WQNayvSmb8h0Sk4W7Vxfoc/https/image.prntscr.com/image/fM7kq5XIRCiTN5n-ffpNyA.png)
These were defined by mojang, no other options are available.
Bossbars can be defined in `bars` section. Bossbar name can be anything, but you cannot use the same name for 2 bossbars.
A bossbar consists of up to 6 properties:
| Option | Example | Description |
|-------------------|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| style | PROGRESS | Type of bossbar division. You can choose from 5 styles: **PROGRESS**, **NOTCHED_6**, **NOTCHED_10**, **NOTCHED_12** and **NOTCHED_20**. <br /> ![](https://images-ext-1.discordapp.net/external/yMuJNksnulOd_ZtI3yGw6CaQhon-ewVHsqaMzT8RcGk/https/image.prntscr.com/image/FzWSvsalTW6YVRPPK3oa9g.png) <br /> These were defined by mojang, no other options are available. Other plugins may be using different names, but it's the same result in the end. |
| color | BLUE | Color of bossbar. You can choose from 7 colors: **BLUE**, **GREEN**, **PINK**, **PURPLE**, **RED**, **WHITE** and **YELLOW**. <br /> ![](https://images-ext-2.discordapp.net/external/MwNGvtNT0vspb_xiGUyx_WQNayvSmb8h0Sk4W7Vxfoc/https/image.prntscr.com/image/fM7kq5XIRCiTN5n-ffpNyA.png) <br /> These were defined by mojang, no other options are available. |
| progress | 100 | A number between 0 and 100. Accepts decimals. <br /> ![image](https://user-images.githubusercontent.com/6338394/196031770-2208848c-8e38-44cc-aa49-c86427160cab.png) |
| text | "Hi" | Text of the bossbar. Length is not limited, supports RGB codes on 1.16+. Does not support newlines. |
| announcement-bar | false | When set to `true`, the bossbar will not appear by default, only when used in announce command. |
| display-condition | "%world%=world" | [Condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) that must be met for player to see the bossbar. Even when using announce command on a bossbar with display condition, players must meet it to see the bossbar. When condition is not defined, bossbar has no requirement to be displayed. |
### progress
A number from 0 to 100. Accepts decimals.
![image](https://user-images.githubusercontent.com/6338394/196031770-2208848c-8e38-44cc-aa49-c86427160cab.png)
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}/<max_value>*100%` if your max value is fixed.
Notes:
Replace the text in between the `{}` with the actual placeholder you want to use and `<max_value>` 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%`
### text
Text of the bossbar. Length is not limited, supports RGB codes on 1.16+. Does not support newlines.
### announcement-bar
When set to true, the bossbar will not appear by default, only when used in announce command.
Here is an example using all 6 properties:
```
bossbar:
bars:
MyBossbar:
style: "PROGRESS"
color: "BLUE"
ServerInfo:
style: "PROGRESS"
color: "PURPLE"
progress: "100"
text: "Text"
announcement-bar: true #false or undefined means it will be visible all the time
```
### display-condition
[Condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) that must be met for player to see the bossbar. Even when using announce command on a bossbar with display condition, players must meet it to see the bossbar. When condition is not defined, bossbar has no requirement to be displayed.
**Example**:
```
bossbar:
bars:
MyBossbar:
style: "PROGRESS"
color: "BLUE"
progress: "100"
text: "This bossbar is only visible in world 'world'"
display-condition: "%world%=world"
text: "Welcome to the nether!"
announcement-bar: false
display-condition: "%world%=world_nether"
```
## Announce command
`/tab bossbar announce <name> <time>`
`name` is name of bossbar defined in config.yml under **bossbar** section, `time` is length of display time in seconds.
# Commands
| Command | Permission | Description |
|-------------------------------------------------------|------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /tab bossbar show \<name\> \[player\] | `tab.bossbar.show` (for yourself) <br /> `tab.bossbar.show.other` (for others) | Shows the bossbar with the given `name`, either to yourself if no `player` was given, or to the given `player`. |
| /tab bossbar \[on/off/toggle\] \[player\] \[options\] | `tab.bossbar.toggle` (for yourself) <br /> `tab.bossbar.toggle.other` (for others) | Shows / hides / toggles bossbar of specified player. If no player was given, command affects the sender. You can use `-s` as option for silent toggling (no chat message for affected player) |
| /tab bossbar announce \<name\> \<duration\> | `tab.announce.bar` | Shows the bossbar with the given `name` to every player on the server for the given `duration`, in seconds. |
When using a bossbar announcement, you have a new placeholder available:
`%countdown%` that shows remaining time of the announcement in seconds.
You can further use this placeholder in progress, for example,
using Math expansion from PlaceholderAPI, such as `%math_{tab_placeholder_countdown}/<total time>*100%`.
# Placeholders
## Internal placeholders
Here are TAB's internal placeholders you can use when this feature is enabled:
| Placeholder | Description |
|-------------|-------------|
| `%bossbar_announce_time_left_<bossbar>%` | Returns remaining time of the announcement of specified bossbar (in seconds). |
| `%bossbar_announce_time_total_<bossbar>%` | Returns total time of the announcement of specified bossbar (in seconds) (the inputted number). |
## Additional settings
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | false | Enables / Disables the feature |
| toggle-command | /bossbar | A command to toggle bossbar visibility for player running the command. This command requires `tab.bossbar.toggle` permission. <br />**Note:** This command will not appear in command auto-complete, because it's not a real registered command. Registered commands must be defined in plugin jar directly and cannot be dynamic. If you want to solve this, you can try getting a dummy private plugin made which registers that command. |
| remember-toggle-choice | false | When enabled, disabling bossbar using `toggle-command` is remembered between reloads and restarts. |
| hidden-by-default | false | When enabled, bossbar will automatically be hidden until toggle command is used. |
You can further use these placeholders in progress, for example, using Math expansion from PlaceholderAPI, such as `%math_{tab_placeholder_bossbar_announce_time_left_<bossbar>}/{tab_placeholder_bossbar_announce_time_total_<bossbar>}*100%` (remember to replace `<bossbar>` with the actual name of the bossbar).
## PlaceholderAPI placeholders
Here are TAB's PlaceholderAPI placeholders you can use when this feature is enabled:
| Placeholder | Description |
|-------------|-------------|
| `%tab_bossbar_visible%` | "Enabled" if visible (not toggled with a command), "Disabled" if not (toggled with a command) |
# Limitations
* Does not support newlines. If you want to display more lines, you'll need to create multiple bossbars.
* The bar itself cannot be removed from the server side. However, it can be removed with a resource pack.
# Compatibility with other plugins
Bossbar is a feature that can have multiple instances sent and displayed, so there is no possible conflict like in scoreboard for example. Every plugin manages its own bossbars and doesn't care about others.
One thing to mention is the order of bossbars. They are ordered by the order they were received. This means the final order depends on which plugin is faster (or slower), which is something you can't really control. As such, there is no feasible way to control the order of bossbars across different plugins. TAB's own bossbars are sent in the order they are defined in the configuration, so that won't be a problem.
# Additional info
## Additional note 1 - Hiding bar itself
If you want to hide the bossbar itself and only show text, this is possible, but not from the plugin's side.
You'll need to create a custom resource pack where the bar doesn't show up and only the text does.
Then, you need to force your players to get the resource pack.
You'll need to create a custom resource pack where the bar is invisible and force your players to get the resource pack.
Here is how to do it:
**Minecraft 1.20+**:
* Navigate to `assets/minecraft/textures/gui/sprites/boss_bar`. You will need to create 2 files. In this example, we will use `WHITE` Bossbar color.
* Use GIMP or any other photo editing software and create a **1x1 px** image, that is fully transparent.
* Name the file **white_progress.png**. Now copy-paste the same file and name it **white_background.png**.
## Additional note 2 - Not hiding on server switch
When under a BungeeCord network and having TAB installed on backend server and switching to another server, the bossbar will not hide. This is because BungeeCord makes it look like a world switch to the client. To avoid this, the only way is to install TAB on BungeeCord and disable bossbar on that server.
**Minecraft 1.19.4-**:
* Navigate to `assets/minecraft/textures/gui/`. You will need to download the default `bars.png` file (https://github.com/Faithful-Pack/Default-Java/blob/1.19.4/assets/minecraft/textures/gui/bars.png).
* Use GIMP or any other Photo editing software and remove the White bars in the file. Save the file and move it to `assets/minecraft/textures/gui/`.
Finally, set your Bossbar color in TAB Config to `WHITE`. Now the line will be invisible!
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
@@ -170,30 +164,32 @@ Methods in `BossBar`:
* `BossBar#containsPlayer(TabPlayer)` - Returns `true` if player can see this bossbar, `false` if not.
* `BossBar#isAnnouncementBar()` - Returns `true` if this bossbar is defined as announcement bar in config, `false` if visible permanently.
# Tips & Tricks
## Tip 1 - Animated bossbar color
You can animate the color of a bossbar using [animations](https://github.com/NEZNAMY/TAB/wiki/Animations).
# Examples
## Example 1 - Changing text
You can make the change text periodically using [animations](https://github.com/NEZNAMY/TAB/wiki/Animations).
First, create an animation in **animations.yml**, such as
```
BossColor:
BossBarText:
change-interval: 1000
texts:
- "BLUE"
- "YELLOW"
- "Text1"
- "Text2"
```
Then, use the animation in bossbar configuration
```
bars:
ServerInfo:
style: "PROGRESS"
color: "%animation:BossColor%"
color: "PURPLE"
progress: "100"
text: "&fWebsite: &bwww.domain.com"
text: "%animation:BossBarText%"
```
This bossbar will change color every second between blue and yellow colors.
You can do the same with progress, style and text as well.
This bossbar will change text every second between `text1` and `text2`. You can make the change interval higher and add more texts to suit your needs.
## Tip 2 - Switching between bossbars with condition
> [!NOTE]
> This works for style, color and progress as well, not just text. Just make sure the animation returns a valid value accepted by the field (listed enum constants for style and color, number between 0 and 100 for progress).
## Example 2 - Switching between bossbars with condition
If you want the plugin to switch between bossbars based on a condition, first consider using condition for text itself
(or some other property).
If this is not an option (you want text, color, style and progress to be different, which would result in 4 conditions),
@@ -215,4 +211,39 @@ For number comparisons, negate `<` using `>=` and so on.
progress: "0"
text: "&cYou took damage"
display-condition: "%health%!=20"
```
```
## Example 3 - Periodical appearing and disappearing
This can be achieved using [animations](https://github.com/NEZNAMY/TAB/wiki/Animations) and [conditions](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders). We will create an animation with 2 frames and check if it's on the first one, then display the bossbar. Otherwise, don't display it.
To get started, create an animation in **animations.yml**:
```
animations:
bossbar-toggle:
change-interval: 10000
texts:
- "ON"
- "OFF"
```
Then, create a display condition that checks if the animation is on the first frame (`ON`):
```
bars:
ServerInfo:
display-condition: "%animation:bossbar-toggle%=ON" # Check for the first frame of the animation
style: "PROGRESS"
color: "PURPLE"
progress: "100"
text: "&fWebsite: &bwww.domain.com"
```
Now, the bossbar will appear and disappear every 10 seconds.
## Example 4 - Dynamic progress tracking a relative placeholder value
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}/<max_value>*100%` if your max value is fixed.
> [!NOTE]
> Replace the text in between the `{}` with the actual placeholder you want to use and `<max_value>` with a valid number (i.e., 20).
You cannot use the `%placeholder%` format inside the math placeholder.
Example for showing a player's health:
`progress: "%math_{player_health}/20*100%"`
or
`progress: "%math_{player_health}/{player_max_health}*100%"`
@@ -1,172 +1,161 @@
# Content
* [About](#about)
* [Condition types](#condition-types)
* [Number comparations](#number-comparations)
* [Number comparisons](#number-comparisons)
* [Text operations](#text-operations)
* [Permission](#permission)
* [Multiple condition requirements](#multiple-condition-requirements)
* [Condition output](#condition-output)
* [Configuration](#configuration)
* [Usage](#usage)
* [Displaying text](#displaying-text)
* [Display condition of a feature](#display-condition-of-a-feature)
* [Short format](#short-format)
* [Conditional text](#conditional-text)
* [Using in a field where condition is expected](#using-in-a-field-where-condition-is-expected)
* [Using in a field where condition is expected (short format)](#using-in-a-field-where-condition-is-expected-short-format)
* [Relational conditions](#relational-conditions)
* [Refresh interval](#refresh-interval)
* [Examples](#examples)
* [Example 1 - Chaining conditional placeholders](#example-1---chaining-conditional-placeholders)
* [Example 2 - Conditions in conditions](#example-2---conditions-in-conditions)
* [Example 2 - Combining AND and OR](#example-2---combining-and-and-or)
# About
Conditions / conditional placeholders allow you
to create output which depends on the output of other placeholders or permission requirement.
They have 2 main uses in the plugin:
* Display condition which must be met to be able to see something (bossbar, scoreboard, layout)
* Conditional placeholders which return defined outputs in both cases if the condition passes or fails
* `display-condition` which must be met to be able to see something (bossbar, scoreboard, layout) or `disable-condition` for disabling a feature (scoreboard-teams, tablist-name-formatting, ...)
* Conditional placeholders which return defined outputs based on if the condition passes or fails
# Condition types
## Number comparations
`>=`: greater than or equal to
Example: `%ping%>=100` will pass if the player's ping is greater than or equal to `100`.
`>`: greater than
Example: `%ping%>100` will pass if the player's ping is greater than `100`.
`<=`: less than or equal to
Example: `%ping%<=100` will pass if the player's ping is less than or equal to `100`.
`<`: less than
Example: `%ping%<100` will pass if the player's ping is less than `100`.
## Number comparisons
| Operation | Description | Example |
|-----------|--------------------------|--------------------------------------------------------------------------------|
| `>=` | Greater than or equal to | `%ping%>=100` will pass if the player's ping is greater than or equal to `100` |
| `>` | Greater than | `%ping%>100` will pass if the player's ping is greater than `100` |
| `<=` | Less than or equal to | `%ping%<=100` will pass if the player's ping is less than or equal to `100` |
| `<` | Less than | `%ping%<100` will pass if the player's ping is less than `100` |
## Text operations
`=`: equal to (must match exactly)
Example: `%world%=world` will pass if player is in world `world`.
| Operation | Description | Example |
|-----------|------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|
| `=` | Equal to | `%world%=world` will pass if player is in world `world` |
| `!=` | Not equal to | `%world%!=world` will pass if player is in any world except `world` |
| `<-` | Contains (left side for full text, right side text to contain) | `%world%<-lobby-` will pass if player is in any world that contains `lobby-` (such as `lobby-1` etc.) |
| `!<-` | Not Contains (left side for full text, right side text to not contain) | `%world%!<-lobby-` will pass if player is in any world that does not contain `lobby-` (such as `lobby-1` etc.) |
| `\|-` | Starts with (left side for full text, right side text to start with) | `%world%\|-lobby-` will pass if player is in any world that starts with `lobby-` (such as `lobby-1` etc.) |
| `!\|-` | Not Starts with (left side for full text, right side text to not start with) | `%world%!\|-lobby-` will pass if player is in any world that does not start with `lobby-` (such as `lobby-1` etc.) |
| `-\|` | Ends with (left side for full text, right side text to end with) | `%world%-\|nether` will pass if player is in any world that ends with `nether` (such as `world_nether` etc.) |
| `!-\|` | Not Ends with (left side for full text, right side text to not end with) | `%world%!-\|nether` will pass if player is in any world that does not end with `nether` (such as `world_nether` etc.) |
`!=`: not equal to (opposite of the above)
Example: `%world%!=world` will pass if player is in any world except `world`.
> [!NOTE]
> For `=` and `!=` you can check for empty output of a placeholder using `%my_placeholder%=` and `%my_placeholder%!=`.
**Note 1**: For `=` and `!=` you can check for empty output of a placeholder using `%my_placeholder%=` and `%my_placeholder%!=`.
`<-`: contains (left side for full text, right side text to contain)
Example: `%world%<-lobby-` will pass if player is in any world that contains `lobby-` (such as `lobby-1` etc.).
`|-`: starts with (left side for full text, right side text to start with)
Example: `%world%|-lobby-` will pass if player is in any world that starts with `lobby-` (such as `lobby-1` etc.).
`-|`: ends with (left side for full text, right side text to end with)
Example: `%world%-|nether` will pass if player is in any world that ends with `nether` (such as `world_nether` etc.).
**Note 2**: For string operators, the text must match placeholder's output exactly, including color codes.
> [!NOTE]
> For string operations, the text must match placeholder's output exactly, including color codes, as well as lower/UPPER case letters.
If you are using [Placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements),
condition must contain the altered output.
To see the exact output of a placeholder including color codes, use `/tab parse <player> <placeholder>`.
## Permission
`permission:<value>`: permission requirement
Example: `permission:my.permission` will pass if player has `my.permission` permission.
# Multiple condition requirements
Each condition has a `conditions` parameter, which a list of conditions. If you define more than 1 condition, you must specify the condition type.
This value can be found under `type` field. Types are:
* `AND` - all sub-conditions must be met for the final condition to pass
* `OR` - at least one sub-condition must be met for the final condition to pass
If you only defined one subcondition, you don't need to define the type at all, since it's not used for anything.
# Condition output
If using condition as a placeholder, you can specify output in both cases using `yes` and `no` values. `yes` is used when condition passes, `no` if not. If using condition only as a view requirement, you can leave these values empty / not specify them at all.
# Configuration
Open **config.yml** and find this section:
```
conditions:
health:
conditions:
- '%health%<21'
- '%health%>15'
type: AND
yes: Healthy!
no: Damaged!
```
`health` is name of our condition in this case.
`conditions` is a list of subconditions that must be met for this condition to pass.
`type` defines whether all subconditions must be met or at least one.
`yes` & `no` define output in both cases.
| Operation | Description | Example |
|-----------------------|---------------------------------|----------------------------------------------------------------------------------------------|
| `permission:<value>` | Permission requirement | `permission:my.permission` will pass if player has `my.permission` permission |
| `!permission:<value>` | Negative permission requirement | `!permission:my.permission` will pass if player **does not have** `my.permission` permission |
# Usage
You have 2 ways to use conditions.
There are multiple different ways you can use conditions, all of which are described below.
## Displaying text
The first way is to use conditions to display text.
Configure outputs in `yes` and `no` values and then use `%condition:<name>%`,
which will output text defined in `yes` or `no` depending on if condition is met or not.
<details>
<summary>Example</summary>
## Conditional text
This way allows you to create conditional text that depends on other placeholders.
First, find the `conditions` section in your config and create a new condition like this one:
```
conditions:
serverName:
lobby:
conditions:
- "%server%=lobby"
yes: "You are in the lobby"
no: "You are not in lobby"
- '%server%=lobby'
true: "You are in lobby"
false: "You are not in lobby"
```
This condition checks if player is in server `lobby` and if yes, displays `"You are in lobby"`, otherwise displays `"Your are not in lobby"`.
To check for more than just 1 condition, add more to the list. Additionally, you will now need to specify `type`, which is either `AND` or `OR`.
Use with `%condition:serverName%`
</details>
## Display condition of a feature
The second way is to use condition's name in places where a condition is accepted.
This includes display conditions for bossbar, scoreboard and layout.
In these cases, yes/no texts are unused; therefore, they do not need to be defined.
<details>
<summary>Example</summary>
For example,
```
conditions:
MyCondition:
lobby:
conditions:
- "permission:tab.admin"
- '%server%=lobby'
- '%server%=lobby2'
type: OR
true: "You are in lobby"
false: "You are not in lobby"
```
will return the lobby text if player is in server `lobby` **OR** in server `lobby2`. If you want both of those conditions to be required to display text, use `type: AND`.
It is not possible to combine both `AND` and `OR` in a single condition. To do that, create multiple conditions and use one inside another (see Example 2 below).
Now that the condition is created, we can use it using `%condition:lobby%`. This placeholder will return the texts configured in `true` and `false` values based on whether the condition was met or not.
## Using in a field where condition is expected
A lot of the features support either `display-condition` or `disable-condition`. The value configured is expected to be a condition. Let's say we want to use it as a display condition somewhere, for example when player is in server `lobby`. First, create the condition:
```
scoreboards:
MyScoreboard:
display-condition: MyCondition
conditions:
lobby:
conditions:
- '%server%=lobby'
```
As you can see, `true` and `false` were not configured. This is because we are not trying to display any text, we are passing the condition as an object to evaluate.
Then, use `display-condition: lobby` in the feature. This will evaluate the condition named `lobby` and either display or not display the visual based on player's server. To check for 2 servers, use
```
conditions:
lobby:
conditions:
- '%server%=lobby'
- '%server%=lobby2'
type: OR
```
Now, the condition `lobby` will pass if player is in server `lobby` **OR** in server `lobby2`. To require both of the conditions to be met instead of at least 1, use `type: AND`.
It is not possible to combine both `AND` and `OR` in a single condition. To do that, create multiple conditions and use one inside another (see Example 2 below).
In this example, scoreboard will only be displayed to players with `tab.admin` permission.
</details>
## Using in a field where condition is expected (short format)
When using condition as a `display-condition` or `disable-condition`, you don't need to specify `true` / `false` texts. In fact, you only need the list of conditions and separator (AND / OR).
For this purpose, short format was created. Instead of having to create a condition and using it, you can specify the expression directly.
### Short format
If trying to use a condition on place where it's available (bossbar display condition, scoreboard display condition) where you don't need the yes/no values, you can use a short format instead.
This can be used by simply creating all subconditions and separating them with `;` for `AND` condition type. For `OR` type, use `|`.
<details>
<summary>Example</summary>
Single condition:
**Single condition example**:
```
display-condition: "%server%=lobby"
```
Multiple conditions, all of them must be met:
**Multiple conditions, all of them must be met**:
```
display-condition: "%server%=lobby;%world%=world"
```
Multiple conditions, at least one of them must be met:
**Multiple conditions, at least one of them must be met**:
```
display-condition: "%server%=lobby|%server%=lobby2"
```
It is not possible to combine both `AND` (`;`) and `OR` (`|`) in a single condition. To do that, create multiple conditions and use one inside another (see Example 2 below).
</details>
## Relational conditions
> [!NOTE]
> This section only describes differences from standard conditions. For more information about those, see sections above.
Relational conditions allow you to check placeholder outputs for the player who is looking instead of only the target player.
To make placeholder check for viewer instead of the target player, use `%viewer:<placeholder>%` instead of just `%placeholder%`.
You can still check for target player using `%placeholder%` or `%target:<placeholder>%` (if you want to make it more clear for the reader).
Example: `%viewer:server%=%server%` will pass if viewer is in the same server as the target player.
There are 2 ways to use it:
* display-condition of layout player groups (which is currently the only feature supporting it as it would not make sense elsewhere)
* A placeholder using `%rel_condition:<condition>%` syntax
If trying to use relational condition in `%condition:name%` syntax, it will return a warning text instead of evaluating the condition.
Same the other way around, if trying to use standard condition in `%rel_condition:name%` syntax, it will return a warning text.
# Refresh interval
Conditions are just placeholders after all, and, as such, they must be refreshed periodically.
Refresh intervals of conditions are not directly configurable.
They are based on placeholders used inside (subconditions, yes/no values).
They are based on placeholders used inside (subconditions, true/false values).
Permission checks count as 1000ms.
To configure refresh intervals of placeholders,
check out the [Optimization guide](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin#2---placeholder-refresh-intervals).
check out the [Optimization guide](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin#2---all-platforms-placeholder-refresh-intervals).
# Examples
## Example 1 - Chaining conditional placeholders
@@ -196,9 +185,8 @@ conditions:
Finally, we can use this ping placeholder using `%condition:ping%`.
This example chained 2 conditions, but more can be used. There is no limit.
# Example 2 - Conditions in conditions
If you want to use a condition in another one,
for example, to use both "AND" and "OR" types, create 2 conditions and use one in the other one.
## Example 2 - Combining AND and OR
If you want to combine both "AND" and "OR" types, create 2 conditions and use first one in the second one.
For example, if we want to check that player is in server `lobby` **and** in worlds **either** `world1` or `world2`,
it can be achieved in the following way:
```
@@ -214,4 +202,4 @@ conditions:
- "%server%=lobby"
type: AND
```
Then, use condition `main` as the display condition. Note that `yes`/`no` values were not defined, as such, they default to `true` and `false`, respectively. Therefore, we use the placeholder from the condition and check if the result is `true`. Then, check if player is also in the specified server.
Then, use condition `main` as the display condition (or as a placeholder - `%condition:main%`). Note that `true`/`false` values were not defined, as such, they default to `true` and `false`, respectively. Therefore, we use the placeholder from the condition and check if the result is `true`. Then, check if player is also in the specified server.
+67 -15
View File
@@ -2,24 +2,46 @@
* [About](#about)
* [Configuration](#configuration)
* [Grouping players only from certain servers](#grouping-players-only-from-certain-servers)
* [Pattern Matching](#pattern-matching)
* [Configuring isolated servers](#configuring-isolated-servers)
* [Seeing all players on the network from some server](#seeing-all-players-on-the-network-from-some-server)
* [Compatibility with vanish plugins](#compatibility-with-vanish-plugins)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
# About
This feature allows you to see players from other servers under a bungeecord network, instead of only seeing players on the same server.
To use this feature, you need [TAB installed on bungeecord](https://github.com/NEZNAMY/TAB/wiki/Installation#bungeecord). This option is not available on bukkit and will not be added.
This feature allows you to see players from other servers, instead of only seeing players on the same server.
If TAB is installed on a backend server, you'll need to set up [Multi server support](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Multi-server-support) for proper linking of servers. On proxy installation, this is not required.
# Configuration
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | false | Enables / Disables the feature |
| server-groups | *Map* | See [Grouping players only from certain servers](#grouping-players-only-from-certain-servers) |
| spy-servers | *List* | See [Seeing all players on the network from some server](#seeing-all-players-on-the-network-from-some-server) |
| display-others-as-spectators | false | When enabled, players on different servers will appear as having spectator gamemode in tablist. |
| display-vanished-players-as-spectators | true | When enabled, vanished players will show as in spectator gamemode for those, who have permission to see vanished players (tab.seevanished) (others will obviously not see them at all). Vanished players will still see themselves in the gamemode they are actually in, since changing that would cause problems (client would think it's in spectator gamemode while it isn't). |
| isolate-unlisted-servers | false | When enabled, servers not listed in any group will not share playerlist with any other server, instead of sharing it with other unlisted servers. |
| update-latency | false | When **enabled**, plugin will send ping update to players on other servers, since backend servers only send ping updates of players on the same server. This is displayed as the green bar in tablist, unless altered by a mod / resource pack (?). <br /> <br />When **disabled**, ping of players on other servers will be set to 0 (5 bars). <br /> <br />Disabled by default, because it's not only not very useful, but also has a very high CPU usage to due spamming a large amount of packets (especially on large networks). |
The feature can be configured in **config.yml** under **global-playerlist** section.
This is how the default configuration looks:
```
global-playerlist:
enabled: false
display-others-as-spectators: false
display-vanished-players-as-spectators: true
isolate-unlisted-servers: false
update-latency: false
spy-servers:
- spyserver1
- spyserver2
server-groups:
lobbies:
- lobby1
- lobby2
group2:
- server1
- server2
```
All of the options are explained in the following table.
| Option name | Default value | Description |
|----------------------------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enabled | false | Enables / Disables the feature |
| display-others-as-spectators | false | When enabled, players on different servers will appear as having spectator gamemode in tablist. |
| display-vanished-players-as-spectators | true | When enabled, vanished players will show as in spectator gamemode for those, who have permission to see vanished players (tab.seevanished) (others will obviously not see them at all). Vanished players will still see themselves in the gamemode they are actually in, since changing that would cause problems (client would think it's in spectator gamemode while it isn't). |
| isolate-unlisted-servers | false | When enabled, servers not listed in any group will not share playerlist with any other server, instead of sharing it with other unlisted servers. |
| update-latency | false | When **enabled**, plugin will send ping update to players on other servers, since backend servers only send ping updates of players on the same server. This is displayed as the green bar in tablist, unless altered by a mod / resource pack (?). <br /> <br />When **disabled**, ping of players on other servers will be set to `0` (![image](https://user-images.githubusercontent.com/6338394/179717531-3c6409b6-6bf8-41c1-a150-ce0ed615e5a5.png)). <br /> <br />Disabled by default, because it's not only not very useful, but also has a very high CPU usage to due spamming a large amount of packets (especially on large networks). |
| spy-servers | *List* | See [Seeing all players on the network from some server](#seeing-all-players-on-the-network-from-some-server) |
| server-groups | *Map* | See [Grouping players only from certain servers](#grouping-players-only-from-certain-servers) |
## Grouping players only from certain servers
In case you want multiple servers to share playerlist,
@@ -37,7 +59,7 @@ global-playerlist:
```
Contains 2 groups, each of them consisting of 2 servers.
Server group name can be anything (in our case, they're called "lobbies" and "group2").
Under group name, list the actual server names defined in config.yml of bungeecord.
Under group name, list the actual server names defined in config.yml of the proxy server.
With this setup, "lobby1" and "lobby2" will share playerlist, as well as "server1" with "server2". All unlisted servers are automatically put into a hidden default group and share playerlist. This means that all other servers except these 4 will share playerlist.
@@ -46,6 +68,36 @@ To make all servers share the playerlist, simply clear server groups and set
server-groups: {}
```
### Pattern Matching
Server names in groups support multiple pattern types for flexible configuration:
**Exact Match** - Matches server name exactly:
```yaml
server-groups:
lobbies:
- lobby1
- lobby2
```
**Wildcard Patterns** - Use `*` for prefix or suffix matching:
```yaml
server-groups:
lobbies:
- "Lobby-*" # Matches: Lobby-1, Lobby-2, Lobby-Hub, etc.
- "*-lobby" # Matches: eu-lobby, us-lobby, etc.
```
**Regex Patterns** - Use `regex:` prefix for advanced pattern matching:
```yaml
server-groups:
lobbies:
- regex:Lobby-[0-9]+ # Matches: Lobby-1, Lobby-23, but not Lobby-Hub
smp:
- regex:SMP-(EU|US)-[0-9]+ # Matches: SMP-EU-1, SMP-US-2, etc.
```
Note: Wildcard patterns are case-insensitive, while regex patterns are case-sensitive by default (use `(?i)` flag for case-insensitive regex).
## Configuring isolated servers
If you want servers which are isolated (no one will see these players, and they will not see anyone on other servers),
create a new group and only put that 1 server there.
@@ -71,5 +123,5 @@ global-playerlist:
```
Now, players connected to "spyserver1" or "spyserver2" will see everyone on the network in tablist, but no one else (unless on another spy server / in the same server group) will see them.
# Compatibility with vanish plugins
For compatibility with vanish plugins, vanish status must be detected correctly. See [Additional information - Vanish detection](https://github.com/NEZNAMY/TAB/wiki/Additional-information#vanish-detection) for more info.
# Compatibility with other plugins
For compatibility with vanish plugins, vanish status must be detected correctly. See [Additional information - Vanish detection](https://github.com/NEZNAMY/TAB/wiki/Additional-information#vanish-detection) for more info.
+144 -74
View File
@@ -1,14 +1,16 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Global settings](#global-settings)
* [Per-world / per-server](#per-world--per-server)
* [Per-group / per-player](#per-group--per-player)
* [Design](#design)
* [Chaining designs](#chaining-designs)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [Additional info](#additional-info)
* [Additional note 1 - Not resetting on server switch](#additional-note-1---not-resetting-on-server-switch)
* [Tips & Tricks](#tips--tricks)
* [Tip 1 - Dynamic line count](#tip-1---dynamic-line-count)
* [Additional note 1 - [1.8 - 1.20.1] Not resetting on server switch](#additional-note-1---18---1201-not-resetting-on-server-switch)
* [API](#api)
* [Examples](#examples)
* [Example 1 - Per-version header/footer](#example-1---per-version-headerfooter)
* [Example 2 - Per-world header/footer](#example-2---per-world-headerfooter)
* [Example 3 - Dynamic line count](#example-3---dynamic-line-count)
# About
Minecraft feature **introduced in 1.8** showing text above and below playerlist. It cannot be displayed on 1.7 clients in any way.
@@ -16,81 +18,159 @@ Minecraft feature **introduced in 1.8** showing text above and below playerlist.
![](https://images-ext-2.discordapp.net/external/Jm9G7_fX8Rq4KU-Syj57W2a_leel380bZ4lmd6c0vBs/https/image.prntscr.com/image/qvuAdtgZTDeZ4IeABi8I3g.png)
# Configuration
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | true | Enables / Disables the feature |
| 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. |
## Global settings
The example above is using this configuration:
The feature can be configured in **config.yml** under **header-footer** section.
This is how the default configuration looks:
```
header-footer:
header:
- "This is the first line of header"
- "2nd line of header"
footer:
- "This is the first line of footer"
- "2nd line of footer"
```
It is the default header/footer for everyone, unless overridden in some way.
## Per-world / per-server
```
header-footer:
per-world:
<your world>:
enabled: true
designs:
world-test:
display-condition: "%world%=test"
header:
- "Header in specified world"
- "Test header in world 'test'"
footer:
- "Footer in specified world"
per-server:
<your server>:
- "Test footer in world 'test'"
default:
header:
- "Header in specified server"
- "<#FFFFFF>&m </#FFFF00>"
- "&3&lServer name"
- "&r&7&l>> %animation:Welcome%&3 &l%player%&7&l! &7&l<<"
- "&r&7Online players: &f%online%"
- "&6Online staff: &e%staffonline%"
- ""
footer:
- "Footer in specified server"
- "%animation:time%"
- "&2Ping: %ping%"
- "&7&l Used memory: %memory-used% MB / %memory-max% MB"
- ""
- "&r&7Visit our webpage %animation:web%"
- "<#FFFFFF>&m </#FFFF00>"
```
All the options are explained in the following table.
For multiple worlds/servers to share the same settings, separate them with `;`.
For worlds/servers starting with a specified text, use `*` after the shared part. For ending with a shared part, use `*` at the beginning.
Example:
| Option name | Default value | Description |
|-------------------|-----------------------|-------------------------------------------------------------------|
| enabled | true | Enables / Disables the feature |
| designs | *Map* | Designs to display based on conditions (see below for more info). |
## Design
A header/footer design consists of the following options:
| Option name | Description |
|-------------|------------------|
| `display-condition` (optional) | [Condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) (either condition name or a conditional expression) <br /> that must be met for the design to be displayed. <br />If not defined, design will be displayed without any required condition. <br />If player does not meet condition, another design may be displayed <br /> based on chaining (see below for more info). |
| `header` | List of lines to display in the header. |
| `footer` | List of lines to display in the footer. |
**Example**:
```
header-footer:
per-world:
world1;world2:
enabled: true
designs:
MyDesign: # Design name
display-condition: "%world%=world" # Delete the line for no condition requirement
header:
- "Shared header in worlds world1 and world2"
lobby-*:
header:
- "Header in all worlds starting with lobby-"
- "Header for world %world%"
footer:
- "Footer for world %world%"
```
**Note**: To make per-world work on BungeeCord, install the [TAB-Bridge](https://www.mc-market.org/resources/21641) plugin on your backend servers.
## Per-group / per-player
**groups.yml**
## Chaining designs
When defining more than 1 design in config, the plugin will display the correct design based on conditions.
The plugin goes through all defined designs, starting with the design on top.
If the design's condition is met or not set, it is displayed.
If not, the next defined design is checked and so on.
If no suitable design is found (the last one has a condition requirement which wasn't met), none is displayed.
**Example**:
```
MyGroup:
header:
- "This is a header for MyGroup group"
footer:
- "This is a footer for MyGroup group"
per-world:
MyWorld:
TestGroup:
header-footer:
enabled: true
designs:
per-world:
display-condition: "%world%=world"
header:
- "Header for group TestGroup in world MyWorld"
- "Header for world world"
footer:
- "Footer for world world"
default: # No display condition
header:
- "Header for every world except world"
footer:
- "Footer for every world except world"
```
Same for users, which can be configured in **users.yml**.
Design `per-world` is checked first. If condition is not met, `default` is displayed.
If a chaining 3 or more and player meets 2 or more conditions for 2 (or more) different designs, the first one defined in the config will be displayed. You can swap order of designs based on your priority needs.
# Compatibility with other plugins
Header/Footer is a feature that cannot be handled by multiple plugins at once.
To make sure no other plugin sends their own Header/Footer when not disabled in the plugin's config properly, TAB will block header/footer coming from all other plugins if this feature is enabled (and not disabled for a player with a condition).
An exception to this is Velocity installation, where this "anti-override" is not available.
# Additional info
## Additional note 1 - Not resetting on server switch
## Additional note 1 - [1.8 - 1.20.1] Not resetting on server switch
When under a BungeeCord network and having TAB installed on backend server and switching to another server, the header/footer will not reset. This is because BungeeCord makes it look like a world switch to the client. To avoid this, you have 2 options:
* Install TAB on BungeeCord and disable header/footer on the server.
* Install a plugin that sends some, or even empty header/footer on join.
# Tips & Tricks
## Tip 1 - Dynamic line count
Velocity sends reset packet, so it isn't a problem there.
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
To access this feature, you'll need to obtain `HeaderFooterManager` instance. Get it using `TabAPI.getInstance().getHeaderFooterManager()`. If this feature is disabled, the method will return `null`.
To set the header and/or footer for a player, use the following:
* `HeaderFooterManager#setHeader(TabPlayer, String)`
* `HeaderFooterManager#setFooter(TabPlayer, String)`
* `HeaderFooterManager#setHeaderAndFooter(TabPlayer, String, String)`
To reset the header and/or footer for a player back to their original values, use `null` as argument.
# Examples
## Example 1 - Per-version header/footer
Minecraft 1.21.9 has introduced [object components](https://github.com/NEZNAMY/TAB/wiki/How-to-use-Minecraft-components#object-components-1219), but these are not available for older versions. Let's make 2 designs, one for 1.21.9+ and second one for <1.21.9.
```
header-footer:
enabled: true
designs:
newer-client:
display-condition: "%player-version-id%>=773" # 1.21.9 uses 773
header:
- "Look, it's your head! <head:name:%player%>"
footer:
- "Cool, isn't it?"
older-client:
header:
- "Regular header for old clients"
footer:
- "Consider updating your game"
```
## Example 2 - Per-world header/footer
For this, we can use design chaining with conditions. There is no limit to how many worlds we can configure, but let's stick to 3 designs - one for `world`, one for `world2` and one for the rest.
```
header-footer:
enabled: true
designs:
world:
display-condition: "%world%=world" # Only show if player is in world "world"
header:
- "Header for world world"
footer:
- "Footer for world world"
world2:
display-condition: "%world%=world2" # Only show if player is in world "world2"
header:
- "Header for world world2"
footer:
- "Footer for world world2"
default:
header:
- "Header for all worlds except world and world2"
footer:
- "Footer for all worlds except world and world2"
```
## Example 3 - Dynamic line count
The entire header is just a single character sequence that allows newline symbol (`\n`) for new lines. It is only being split into multiple lines in config for convenience to make it readable when configuring and editing. Same for footer.
If using a placeholder that returns the newline symbol, it will create a new line. You can use this to your advantage and create a [conditional placeholder](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) or an [animation](https://github.com/NEZNAMY/TAB/wiki/Animations) that includes newline in some frames.
<details>
@@ -107,19 +187,9 @@ MyAnimation:
**config.yml**
```
header-footer:
header:
- "%animation:MyAnimation%"
designs:
DesignName:
header:
- "%animation:MyAnimation%"
```
</details>
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
To access this feature, you'll need to obtain `HeaderFooterManager` instance. Get it using `TabAPI.getInstance().getHeaderFooterManager()`. If this feature is disabled, the method will return `null`.
To set the header and/or footer for a player, use the following:
* `HeaderFooterManager#setHeader(TabPlayer, String)`
* `HeaderFooterManager#setFooter(TabPlayer, String)`
* `HeaderFooterManager#setHeaderAndFooter(TabPlayer, String, String)`
To reset the header and/or footer for a player back to their original values, use `null` as argument.
</details>
+206 -123
View File
@@ -1,54 +1,100 @@
# Content
* [About](#about)
* [Creating a layout](#creating-a-layout)
* [Display condition](#display-condition)
* [Fixed slots](#fixed-slots)
* [Player groups](#player-groups)
* [Managing multiple layouts with conditions](#managing-multiple-layouts-with-conditions)
* [Skins](#skins)
* [Format](#format)
* [Additional settings](#additional-settings)
* [Configuration](#configuration)
* [Layout](#layout)
* [Fixed slots](#fixed-slots)
* [Player groups](#player-groups)
* [Chaining layouts](#chaining-layouts)
* [Skins](#skins)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [Compatibility with other features](#compatibility-with-other-features)
* [Playerlist objective incompatibility](#playerlist-objective-incompatibility)
* [Global playerlist incompatibility](#global-playerlist-incompatibility)
* [Per world playerlist incompatibility](#per-world-playerlist-incompatibility)
* [Additional info](#additional-info)
* [Additional note 1 - Playerlist objective incompatibility](#additional-note-1---playerlist-objective-incompatibility)
* [Additional note 2 - Global playerlist incompatibility](#additional-note-2---global-playerlist-incompatibility)
* [Additional note 3 - Entries in chat complete [1.19.3 - 1.21.1]](#additional-note-3---entries-in-chat-complete-1193---1211)
* [Additional note 4 - Per world playerlist incompatibility](#additional-note-4---per-world-playerlist-incompatibility)
* [Additional note 5 - Second layer of skin missing](#additional-note-5---second-layer-of-skin-missing)
* [Additional note 1 - [1.19.3 - 1.21.1] Entries in chat complete](#additional-note-1---1193---1211-entries-in-chat-complete)
* [Additional note 2 - [1.8 - 1.21.3] Second layer of skin missing](#additional-note-2---18---1213-second-layer-of-skin-missing)
* [Additional note 3 - Entry overlap](#additional-note-3---entry-overlap)
* [Examples](#examples)
* [Example 1 - Per-server columns](#example-1---per-server-columns)
* [Example 2 - Per-world playerlist](#example-2---per-world-playerlist)
# About
This feature allows you to customize all 80 tablist slots. Displaying less than 4 columns is currently not supported. This feature can be enabled and configured in **config.yml** file under **layout** section.
This feature allows you to customize all 80 tablist slots. Displaying less than 4 columns is currently not supported ([here's why](https://gist.github.com/NEZNAMY/3dfcbf7d44283735d3c18266a2851651)). This feature can be enabled and configured in **config.yml** file under **layout** section.
This feature is only available for versions **1.8** and up due to massive tablist changes, which would make 1.7- compatibility require a complete rewrite of the functionality and could still cause all kinds of visual issues, including, but not limited to compatibility with other plugins adding/removing players from the tablist.
# Creating a layout
Layouts can be creating in config under `layout.layouts` section. Each layout contains 3 settings: Fixed slots, player groups and display condition (optional).
## Display condition
Condition that must be met for player to see the layout.
If player does not meet the condition, the next defined layout's condition is checked.
If a player does not meet any defined display condition, they will see the default tablist.
Display condition is optional and doesn't need to be set.
For list of possible condition types see [Conditions page](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders).
Example:
# Configuration
The feature can be configured in **config.yml** under **layout** section.
This is how the default configuration looks:
```
layouts:
staff:
condition: "permission:tab.staff"
layout:
enabled: false
direction: COLUMNS
default-skin: mineskin:37e93c8e12cd426cb28fce31969e0674
enable-remaining-players-text: true
remaining-players-text: '... and %s more'
empty-slot-ping-value: 1000
layouts:
default:
slot-count: 80
fixed-slots:
- '1|&3Website&f:'
- '2|&bmyserver.net'
- '3|&8&m '
- '4|&3Name&f:'
- '5|&b%player%'
- '7|&3Rank&f:'
- '8|Rank: %group%'
- '10|&3World&f:'
- '11|&b%world%'
- '13|&3Time&f:'
- '14|&b%time%'
- '21|&3Teamspeak&f:'
- '22|&bts.myserver.net'
- '23|&8&m '
- '41|&3Store&f:'
- '42|&bshop.myserver.net'
- '43|&8&m '
groups:
staff:
display-condition: permission:tab.staff
slots:
- 24-40
players:
slots:
- 44-80
```
This layout will only be visible to players with `tab.staff` permission.
All the options are explained in the following table.
## Fixed slots
| Option name | Default value | Description |
|-------------------------------|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enabled | true | Enables / Disables the feature |
| direction | COLUMNS | Defines direction of slots. Options are COLUMNS (top to bottom, left to right) and ROWS (left to right, top to bottom). This does not only change the slot numbers in configuration, but will also affect the way players are being filled into player groups. |
| default-skin | "mineskin:383747683" | Default skin to display for fixed slots that do not define a skin, empty slots and fixed slots with invalid skin. |
| enable-remaining-players-text | true | When enabled and there are more players in a player group than available slots, the last slot of player group will show how many more players there are, instead of using the last slot for one more player. |
| remaining-players-text | "... and %s more" | Text to show if option above is enabled. Use `%s` variable for defining how many more players there are. |
| empty-slot-ping-value | 1000 | Ping value to use for fixed slots and empty slots. The ping intervals for bars are client sided and are as following: <br />- Negative value: ✖ <br />- 0 - 149: 5 bars <br />- 150 - 299: 4 bars <br />- 300 - 599: 3 bars <br />- 600 - 999: 2 bars <br />- 1000+: 1 bar |
| layouts | *Map* | Layouts to display based on conditions (see below for more info). |
## Layout
A layout consists of the following options:
| Option name | Description |
|-------------|------------------|
| `display-condition` (optional) | [Condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) (either condition name or a conditional expression) that must be met for the layout to be displayed. If not defined, layout will be displayed without any required condition. If player does not meet condition, another layout may be displayed based on chaining (see below for more info). |
| `default-skin` (optional) | Overrides global `default-skin` setting for this layout. |
| `slot-count` (optional) | Amount of slots to show in this layout. If not specified, defaults to `80`. **Only works on 1.19.3+**. |
| `fixed-slots` | List of fixed slots, see below for more info. |
| `player-groups` | Map of player groups, see below for more info. |
### Fixed slots
These are slots with fixed position that contain configurable text and skin.
They can be configured under `fixed-slots` option of each layout. The definition syntax is `SLOT|TEXT|SKIN`. If you don't want to define custom skin for that slot, use `SLOT|TEXT`.
They can be configured under `fixed-slots` option of each layout. The definition syntax is `SLOT|TEXT[|SKIN]` (skin is optional). If you don't want to define custom skin for that slot, use `SLOT|TEXT`.
`SLOT` - The position of the fixed slot. It can be from 1 to 80. By default, the direction is set to columns, so the first column is 1-20.
`TEXT` - the text. It supports placeholders.
`SKIN` - layout's skin, see below for configuration.
Example:
```
layouts:
staff:
fixed-slots:
- '1|&3RAM&f:'
- '2|&b%memory-used%MB / %memory-max%MB'
@@ -56,11 +102,18 @@ layouts:
- '4|&3TPS&f:'
- '5|&b%tps%'
```
If you do not wish to use any fixed slots, make it an empty list (`[]`).
Example:
```
layouts:
staff:
fixed-slots: []
```
## Player groups
### Player groups
These are groups of players that meet the specified condition. They consist of 2 parts - condition and slots.
**1. Condition**
**1. Display Condition**
The condition players must meet to be displayed in the group.
If a player doesn't meet condition for a group, the next group's condition is checked
(groups are checked in the order they are defined in config).
@@ -71,30 +124,30 @@ Display condition is not required (can be used to make a "default" group with th
Slot intervals dedicated to the group. Interval `1-5` would mean all slots from 1 to 5. In case you want to define multiple intervals to exclude some slots, define another interval below the first one.
Example:
```
layouts:
myLayout:
groups:
staff:
condition: permission:tab.staff
slots:
- '24-40'
players:
slots:
- '44-80'
layouts:
myLayout:
groups:
staff:
display-condition: permission:tab.staff
slots:
- '24-40'
players:
slots:
- '44-80'
```
In this example, slots `24-40` will be reserved for players with `tab.staff` permission. Players without that permission will be in slots `44-80`.
# Managing multiple layouts with conditions
You can define multiple layouts and display them based on a condition.
To do so, define `condition` for layouts.
Conditions are checked in the order layouts are defined in config.
If layout doesn't specify condition, it is displayed with no requirement.
If a player does not meet display condition for any layout, they will see the classic tablist.
## Chaining layouts
When defining more than 1 layout in config, the plugin will display the correct design based on conditions.
The plugin goes through all defined layouts, starting with the design on top.
If the layout's condition is met or not set, it is displayed.
If not, the next defined layout is checked and so on.
If no suitable layout is found (the last one has a condition requirement which wasn't met), no layout is displayed (player will see the normal tablist).
Example:
```
layouts:
staff:
condition: "permission:tab.staff"
display-condition: "permission:tab.staff"
fixed-slots:
...
groups:
@@ -107,74 +160,33 @@ layouts:
```
In this example, players with `tab.staff` permission will see `staff` layout, others will see `default` layout.
# Skins
In slots where players are, their skin is displayed. For fixed slots, if their skin is defined, it is used, otherwise `default-skin` is used. It is also used if invalid skin is specified anywhere.
## Skins
*If you're wondering how to enable / disable heads in the tablist, see [FAQ](https://github.com/NEZNAMY/TAB/wiki/Frequently-Asked-Questions#6---how-to-make-player-heads-visible-in-tablist).*
## Format
Currently, TAB supports 3 skin formats:
* `mineskin:<ID>` - takes UUID from [MineSkin](https://mineskin.org). You can find some pre-uploaded skins at the bottom of this page.
* `player:<name>` - displays skin of player `name`
* `texture:<texture>` - uses literal skin texture. This lets you use heads from [Minecraft-Heads](https://minecraft-heads.com/custom-heads) by taking the texture in the `Minecraft-URL` field.
![](https://cdn.discordapp.com/attachments/817789229479624728/916373892237512715/unknown.png)
For players, their skin is displayed. For fixed slots and empty slots, you can specify which skin to show using the same skin syntax.
Currently, TAB supports these skin formats:
| Format | Example | Description |
|--------|---------|-------------|
| `mineskin:<UUID>` | `mineskin:37e93c8e12cd426cb28fce31969e0674` | Takes UUID from [MineSkin](https://mineskin.org). |
| `player:<name>` | `player:Notch` | Displays skin of specified player. |
| `texture:<texture>` | `texture:469b3bac406b51ba0e76c2c218aa4d45fde9ea7c101c85fbd8106c92c4aa36dd` | Uses skin texture from `textures.minecraft.net`. Skin browsing websites often show this value (for example `Texture URL` on mineskin.org). |
Some pre-uploaded Mineskin skins:
```yml
BTLP's balance.png: 510604280
BTLP's clock.png: 2053951237
BTLP's server.png: 604037953
BTLP's ping.png: 796704708
BTLP's players.png: 1160612233
BTLP's rank.png: 527763880
Aqua: 1749359849
Black: 1551047136
Blue: 1870064311
Dark Aqua: 1893783461
Dark Blue: 899643609
Dark Gray: 383747683
Dark Green: 588254656
Dark Purple: 2061328517
Dark Red: 924139093
Gold: 1074335506
Gray: 745109047
Green: 224445819
Pink: 1818936290
Red: 1160568696
White: 1105851698
Yellow: 1307755006
```
# Compatibility with other plugins
This feature does not have any compatibility issues with other plugins.
When it comes to compatibility with vanish plugins, see [Additional information - Vanish detection](https://github.com/NEZNAMY/TAB/wiki/Additional-information#vanish-detection).
# Additional settings
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| direction | COLUMNS | Defines direction of slots. Options are COLUMNS (top to bottom, left to right) and ROWS (left to right, top to bottom). This does not only change the slot numbers in configuration, but will also affect the way players are being filled into player groups. |
| enable-remaining-players-text | true | When enabled, the last slot of player group will show how many more players there are, instead of using the last slot for one more player. |
| remaining-players-text | "... and %s more" | Text to show if option above is enabled. |
| default-skin | "mineskin:383747683" | Default skin to display for fixed slots that do not define a skin, empty slots and fixed slots with invalid skin. |
| empty-slot-ping-value | 1000 | Ping value to use for fixed slots and empty slots. The ping intervals for bars are client sided and are as following: <br />- Negative value: ✖ <br />- 0 - 149: 5 bars <br />- 150 - 299: 4 bars <br />- 300 - 599: 3 bars <br />- 600 - 999: 2 bars <br />- 1000+: 1 bar |
![image](https://user-images.githubusercontent.com/6338394/179363352-40f815d4-fc37-4ca1-8056-298488e84a60.png)
![image](https://user-images.githubusercontent.com/6338394/179355373-3e50b8c5-95d7-4470-b93f-deb162ccc145.png)
# Additional info
## Additional note 1 - Playerlist objective incompatibility
# Compatibility with other features
## Playerlist objective incompatibility
To avoid showing fake players in tab-complete, TAB uses an empty string as the fake players' names.
Though Minecraft's scoreboard objectives (which help achieve the Playerlist objective feature) only use players' names and not players' UUIDs to define values.
As a result, it is impossible for TAB to assign a different value for each fake player since they all have the same name, making the [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective) feature incompatible.
## Additional note 2 - Global playerlist incompatibility
## Global playerlist incompatibility
The way this feature works is by pushing all real players out of the tablist and showing fake players instead.
As a result, enabling [Global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) feature won't make any difference, since real players aren't visible in the tablist.
Layout feature is capable of working with all online players connected to the server where TAB is installed, meaning it can show players from all servers when installed on BungeeCord. Because of this, if you use layout, you can disable global playerlist to reduce resource usage.
Layout feature is capable of working with all online players connected to the server where TAB is installed, meaning it can show players from all servers when installed on a proxy. Because of this, if you use layout, you can disable global playerlist to reduce resource usage.
## Additional note 3 - Entries in chat complete [1.19.3 - 1.21.1]
From 1.19.3 until 1.21.1 (inclusive), entries will also appear in chat complete.
The mechanic used to hide them on <1.19.3 can no longer be used since 1.19.3.
1.21.2 has added a new way of sorting players, which is being taken advantage of to restore empty chat complete.
**Note**: To hide entries from chat complete on 1.21.2+,
the server also has to be 1.21.2+ so TAB can send the new content to the players
(having TAB installed on proxy counts as using the latest version).
## Additional note 4 - Per world playerlist incompatibility
## Per world playerlist incompatibility
Layout works by adding 80 fake players into the tablist, pushing real player entries out of view.
Because of this,
when using [per world playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Per-world-playerlist),
@@ -191,19 +203,19 @@ Each layout only displays players in that world.
```
layouts:
layout1:
condition: "%world%=world1"
display-condition: "%world%=world1"
fixed-slots: []
groups:
players:
condition: "%world%=world1"
display-condition: "%world%=world1"
slots:
- 1-80
layout2:
condition: "%world%=world2"
display-condition: "%world%=world2"
fixed-slots: []
groups:
players:
condition: "%world%=world2"
display-condition: "%world%=world2"
slots:
- 1-80
```
@@ -211,11 +223,11 @@ You can also merge multiple worlds into a group.
```
layouts:
layout1:
condition: "%world%=world1|%world%=world2"
display-condition: "%world%=world1|%world%=world2"
fixed-slots: []
groups:
players:
condition: "%world%=world1|%world%=world2"
display-condition: "%world%=world1|%world%=world2"
slots:
- 1-80
```
@@ -223,7 +235,7 @@ You can also replicate "ignore-effect-in-worlds" by creating a layout with condi
```
layouts:
globalWorld:
condition: "%world%=globalWorld"
display-condition: "%world%=globalWorld"
fixed-slots: []
groups:
players: # No condition here to show all players
@@ -232,13 +244,40 @@ You can also replicate "ignore-effect-in-worlds" by creating a layout with condi
```
</details>
## Additional note 5 - Second layer of skin missing
# Additional info
## Additional note 1 - [1.19.3 - 1.21.1] Entries in chat complete
From 1.19.3 until 1.21.1 (inclusive), entries will also appear in chat complete.
The mechanic used to hide them on <1.19.3 can no longer be used since 1.19.3.
1.21.2 has added a new way of sorting players, which is being taken advantage of to restore empty chat complete.
## Additional note 2 - [1.8 - 1.21.3] Second layer of skin missing
Layout works by creating 80 fake entries, pushing real players out of the tablist.
Unfortunately, players must be spawned around the player viewing the tablist to see the second layer of their skin.
Since those fake entries you see are not the actual players and aren't spawned,
as a result, you won't see the second layers of skins.
This can only be fixed by actually letting the real entries display in the tablist,
which would require a rework of the feature, which is not planned.
which would require a rework of the feature, which is not planned.
**1.21.4 has added a new tablist option called "show hats", which layout sets to true.
They will be visible for 1.21.4+ players.**
## Additional note 3 - Entry overlap
Tablist entries automatically adapt their width based on the longest entry.
The final width is global for all columns, not just using the longest width in each respective column.
When the requested width is higher than the game window can handle, the text in entries will start to overlap.
This is how it looks with 1/4 screen size, which is the default window size when launching Minecraft.
<img width="855" height="519" alt="image" src="https://github.com/user-attachments/assets/2a256b25-c672-49ea-8c8f-d670aa9efd43" />
This can be solved by increasing window size either manually, or by pressing the expand button on the top left, next to the "X".
If it still looks the same for you even though you have the game in full screen, your GUI scale can be messed up.
To fix it, go to `Esc -> Options -> Video Settings...` and set `GUI Scale: ` to a lower value.
If you are looking for a more systematic solution that will automatically work for all of your players and not just you, the only way is to make the entries shorter.
Here are a few tips how to do that:
* Avoid using suffix altogether
* Do not use bold (`&l`) code
* Use a shorter alternative for your prefixes, such as `A` instead of `Admin`
* Remove unnecessary brackets from prefix
# Examples
## Example 1 - Per-server columns
@@ -259,21 +298,65 @@ layout:
- "61|&2&lSkyblock"
groups:
lobby:
condition: "%server%=lobby"
display-condition: "%server%=lobby"
slots:
- 2-20
survival:
condition: "%server%=survival"
display-condition: "%server%=survival"
slots:
- 22-40
creative:
condition: "%server%=creative"
display-condition: "%server%=creative"
slots:
- 42-60
skyblock:
condition: "%server%=skyblock"
display-condition: "%server%=skyblock"
slots:
- 62-80
```
You can also remove the last condition (in this case `condition: "%server=skyblock%"`) and the columns will be used for all other servers, instead of just a specified one.
You can also remove the last condition (in this case `display-condition: "%server=skyblock%"`) and the columns will be used for all other servers, instead of just a specified one.
![image](https://github.com/NEZNAMY/TAB/assets/6338394/81016b5a-9b40-445e-8bfc-58204f5457f5)
## Example 2 - Per-world playerlist
If you want to reproduce the per-world-playerlist feature but with layouts, you can use relational conditions to check the viewer's world (`%viewer:world%`) with the target player's world (`%world%`) like so:
```yml
layout:
enabled: true
direction: COLUMNS
default-skin: mineskin:383747683
enable-remaining-players-text: true
remaining-players-text: '... and %s more'
empty-slot-ping-value: 1000
layouts:
default:
slot-count: 80
fixed-slots:
- '1|&3Website&f:'
- '2|&bmyserver.net'
- '3|&8&m '
- '4|&3Name&f:'
- '5|&b%player%'
- '7|&3Rank&f:'
- '8|Rank: %group%'
- '10|&3World&f:'
- '11|&b%world%'
- '13|&3Time&f:'
- '14|&b%time%'
- '21|&3Teamspeak&f:'
- '22|&bts.myserver.net'
- '23|&8&m '
- '41|&3Store&f:'
- '42|&bshop.myserver.net'
- '43|&8&m '
groups:
players:
display-condition: "%viewer:world%=%world%"
slots:
- 24-40
- 44-80
```
> [!NOTE]
> This is just an example, relational conditions are not limited to displaying only players in your world.
> If you want players in your server on proxy, use `%viewer:server%=%server%` in `display-condition`.
> This works for any placeholder offered by TAB or by PlaceholderAPI.
@@ -0,0 +1,39 @@
# Enabling
Find this section in your config:
```
proxy-support:
enabled: true
# Supported types: PLUGIN, REDIS, RABBITMQ
type: PLUGIN
plugin:
# Compatible plugins: RedisBungee
# If enabled and compatible plugin is found, hook is enabled to work with proxied players
name: RedisBungee
redis:
url: 'redis://:password@localhost:6379/0'
rabbitmq:
exchange: 'plugin'
url: 'amqp://guest:guest@localhost:5672/%2F'
```
Pick your desired way and configure it. I don't know anything about redis or rabbitmq, so good luck.
> [!IMPORTANT]
> **BACKEND INSTALLATION ONLY**
> You should also add this into your **config.yml** and configure it:
> ```
> server-name: "server"
> ```
> Ideally, name it the same as servers in your proxy config. This value will be used for getting player's server name. Aside from %server% placeholder, it will be used for internal logic when checking for player's server. One of them is global playerlist not adding/removing players who are on the same server in the tablist, as backend servers already do this (and duplicating actions would cause problems).
> **As a result, not configuring this value will result in everyone's server being "N/A", therefore global playerlist will think everyone is on the same server and not add anyone into the tablist, effectively making the feature not work.**
Supported plugins:
* [RedisBungee](https://github.com/ProxioDev/RedisBungee)
# Supported features
* [Belowname](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Belowname)
* [Global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist)
* [Nametags](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags) & [Sorting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist)
* [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting)
* [Playerlist Objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective)
The hook does not and will never support [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout), which would require drastic changes to the feature itself and wouldn't be worth it, since the amount of visible players is usually even lower due to fixed slots and RedisBungee is used on networks with many players, so there will be enough players to work with anyway.
+145 -58
View File
@@ -1,24 +1,32 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Groups and users](#groups-and-users)
* [Per-world / per-server](#per-world--per-server)
* [Priority system](#priority-system)
* [Placeholder support](#placeholder-support)
* [Additional settings](#additional-settings)
* [Tips & Tricks](#tips--tricks)
* [config.yml](#configyml)
* [groups.yml and users.yml](#groupsyml-and-usersyml)
* [Global settings](#global-settings)
* [Per-world / per-server](#per-world--per-server)
* [Priorities](#priorities)
* [Name color](#name-color)
* [Commands](#commands)
* [Placeholders](#placeholders)
* [PlaceholderAPI placeholders](#placeholderapi-placeholders)
* [Limitations](#limitations)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [Additional info](#additional-info)
* [Additional note 1 - NPC (in)compatibility](#additional-note-1---npc-incompatibility)
* [Additional note 2 - Prefix/suffix on pets](#additional-note-2---prefixsuffix-on-pets)
* [Additional note 3 - Changing name itself](#additional-note-3---changing-name-itself)
* [Additional note 4 - F1 view](#additional-note-4---f1-view)
* [Additional note 5 - Transparent players](#additional-note-5---transparent-players)
* [Additional note 6 - Vanish hook](#additional-note-6---vanish-hook)
* [API](#api)
* [Changing prefix and suffix](#changing-prefix-and-suffix)
* [Collision](#collision)
* [Manipulating visibility](#manipulating-visibility)
* [Disabling team handling](#disabling-team-handling)
* [Examples](#examples)
* [Example 1 - Taking prefix/suffix from permission plugin](#example-1---taking-prefixsuffix-from-permission-plugin)
* [Example 2 - Making nametags invisible on a subserver](#example-2---making-nametags-invisible-on-a-subserver)
# About
Nametags are controlled by a feature called scoreboard teams. They offer 6 properties:
@@ -28,13 +36,37 @@ Nametags are controlled by a feature called scoreboard teams. They offer 6 prope
* Nametag visibility rule
* Collision rule
* Team color (1.13+) - used to set name and glow color (check out [How to make TAB compatible with glow plugins](https://github.com/NEZNAMY/TAB/wiki/How-to-make-TAB-compatible-with-glow-plugins)) (on 1.12- it uses last color of prefix).
* Options - AllowFriendlyFire and CanSeeFriendlyInvisibles
When enabling this feature, TAB will control all of these. It is not possible to take values from 2 different teams (plugins). Most of the compatibility problems with other plugins can be solved with placeholders. If you want sorting but not nametags, just don't configure any prefix/suffix. If you want another plugin to handle teams, configure sorting in that plugin.
This feature can be configured in **config.yml** under **scoreboard-teams** section.
# Configuration
## Groups and users
This feature is configured in 2 parts based on what you are configuring. Most settings are in the **config.yml**, but prefix/suffix is configured in **groups.yml** and **users.yml**.
## config.yml
The first part can be configured in **config.yml** under **scoreboard-teams** section. It controls everything except prefix and suffix.
This is how the default configuration looks (excluding sorting options):
```
scoreboard-teams:
enabled: true
enable-collision: true
invisible-nametags: false
can-see-friendly-invisibles: false
disable-condition: '%world%=disabledworld'
```
All of the options are explained in the following table.
| Option name | Default value | Description |
|-----------------------------|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enabled | true | Enables / Disables the feature |
| enable-collision | true | Controls collision rule. Available values are: <br />- `true` - Collision will be enabled permanently. <br />- `false` - Collision will be disabled permanently. <br /> - *Conditional expression* - Collision will be enabled if player meets the [short format](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders#short-format) conditional expression (for example `%world%=world` will result in collision only being enabled for players in world `world`). <br /> - *Condition name* - Uses name of a [defined condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) that must be met for a player to have collision enabled. |
| invisible-nametags | false | Controls nametags visibility rule. Available values are: <br />- `true` - Nametags will be invisible. <br />- `false` - Nametags will be visible. <br /> - *Conditional expression* - Nametags will be invisible if player meets the [short format](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders#short-format) conditional expression. <br /> - *Condition name* - Uses name of a [defined condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders). <br /> Option to hide nametags was added in Minecraft **1.8**, therefore it will not work on 1.7. |
| can-see-friendly-invisibles | false | Controls value of the team flag. It allows you to see invisible players in the same team as transparent instead of completely invisible. Since TAB places each player into an individual team, this option will only take effect in combination with plugins that spawn a dummy clone of the player (sit or disguise plugins). |
| 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. |
## groups.yml and users.yml
This part allows you to configure prefix and suffix. They are called `tagprefix` and `tagsuffix`, where "tag" refers to name tag, to allow separation from tablist settings.
### Global settings
Properties can be applied in 2 ways: groups and users. Users can be defined by both username and their UUID. Values applied to users take priority over groups.
**groups.yml**
@@ -42,8 +74,7 @@ Properties can be applied in 2 ways: groups and users. Users can be defined by b
admin:
tagprefix: "&4&lAdmin &r"
```
This can also be achieved with commands, in this case `/tab group admin tagprefix "&4&lAdmin &r"`.
Or with an in-game command `/tab group admin tagprefix "&4&lAdmin &r"`.
**users.yml**
```
@@ -54,11 +85,11 @@ _NEZNAMY_:
237d8b55-3f97-4749-aa60-e9fe97b45062:
tagprefix: "&6&lTAB &r"
```
This can also be achieved with commands, in this case `/tab player _NEZNAMY_ tagprefix "&4&lAdmin &r"` or `/tab playeruuid _NEZNAMY_ tagprefix "&4&lAdmin &r"`.
Or with in-game commands `/tab player _NEZNAMY_ tagprefix "&6&lTAB &r"` and `/tab playeruuid _NEZNAMY_ tagprefix "&6&lTAB &r"` (the player must be online for uuid option to work).
Properties can also be set as "default" for everyone who does not have them defined.
For that purpose, a group keyword `_DEFAULT_` was made.
Example:
For that purpose, a group keyword `_DEFAULT_` was made.
Example:
**groups.yml**
```
admin:
@@ -67,8 +98,8 @@ _DEFAULT_:
tagprefix: "&7" # This will be displayed on everyone except admin
```
## Per-world / per-server
Values can also be applied per-world (and per-server on bungeecord), where they can be defined per group/user. These values take priority over global settings. Example:
### Per-world / per-server
Values can also be applied per-world (and per-server on a proxy), where they can be defined per group/user. These values take priority over global settings. Example:
**groups.yml**
```
per-world:
@@ -94,8 +125,8 @@ per-world:
tagsuffix: "Suffix in all worlds starting with lobby-"
```
## Priority system
The full list of priorities looks like this:
### Priorities
The full list of priorities to choose correct prefix/suffix for a player looks like this:
1. value set using the [API](#api)
2. per-world / per-server applied to username
3. value applied to username
@@ -111,57 +142,68 @@ This list is browsed through until the first match is found. If no match is foun
Values are taken independently of each other.
This means you can set per-world tagprefix, but only keep one global tagsuffix, for example.
You can see the source of a value displayed on player by using `/tab debug <player>` and checking "source"
part of the value you are looking for.
You can see the source of a value displayed on player by using `/tab dump <player>`, opening the link and checking "source"
part of the value you are looking for (tagprefix / tagsuffix).
## Placeholder support
All values fully support [TAB's internal placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders#internal-placeholders) and [PlaceholderAPI placeholders](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders) including relational placeholders.
The number of placeholders is not limited, and they can be used in combination with static text as well.
## Name color
On versions 1.12.2 and below, name color follows the last color of prefix. This also includes magic codes. On 1.13+, this is no longer the case. Instead, a new field called "team color" was created. This is an enum constant, where we need to pick from 22 options - 16 colors, 5 magic codes and reset. **As you can see, it doesn't allow for RGB colors**. This also means name can no longer have color and magic codes simultaneously.
## Additional settings
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | true | Enables / Disables the feature |
| enable-collision | true | Controls collision rule. Available values are: <br />- `true` - Collision will be enabled permanently. <br />- `false` - Collision will be disabled permanently. <br /> - *Conditional expression* - Collision will be enabled if player meets the condition (for example `%world%=world` will result in collision only being enabled for players in world `world`). <br /> - *Condition name* - Uses name of a [defined condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) that must be met for a player to have collision enabled. |
| invisible-nametags | false| When enabled, everyone will have invisible nametag all the time. Option to hide nametags was added in minecraft **1.8**, therefore it will not work on 1.7 and lower. |
| anti-override | true | While enabled, prevents other plugins from assigning online players into teams and making TAB not work correctly. They should be configured to not use teams, however many users fail to disable features in other plugins that they don't want, making this option required. Some plugins don't even say they use teams to achieve their goals. Did you know even Paper uses teams? |
| can-see-friendly-invisibles | false | Controlling value of the team flag. It allows you to see invisible players in the same team as transparent instead of completely invisible. Since TAB places each player into an individual team, this option will only take effect in combination with plugins that spawn a dummy clone of the player (sit or disguise plugins). |
| 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. |
TAB does not have an option for configuring team color to avoid complexity, such as per-version configuration, or having to configure an additional field.
For that reason, TAB detects the last used color code and uses that for team color.
> [!CAUTION]
> An exception is when using MiniMessage syntax / using RGB codes on server which has MiniMessage library. In this scenario, it is not possible to detect reset (`&r`) as last used "color", because in Minecraft components it is not a color, rather, it resets formatting by setting all magic codes to false / color to null. If you use `&r` (`<reset>`) and notice it not working, replace it with `&f` (`<white>`) (or add it after the reset to be safe). There seems to be no difference between setting color to `WHITE` versus `RESET`.
# Tips & Tricks
If you want TAB to only take prefixes/suffixes from the permission plugin,
delete all groups from **groups.yml** and only keep this:
```
_DEFAULT_:
tagprefix: "%luckperms-prefix%"
tagsuffix: "%luckperms-suffix%"
```
# Commands
| Command | Permission | Description |
|--------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /tab nametag <show/hide/toggle> \[player\] \[viewer\] \[options\] | `tab.nametag.visibility` (for yourself) <br /> `tab.nametag.visibility.other` (for others) | Shows / hides / toggles nametag of a specified player. If viewer is specified, view is only affected for the viewer. You can use `-s` as option for silent toggling (no chat message for affected player). |
| /tab nametag <showview/hideview/toggleview> \[viewer\] \[options\] | `tab.nametag.view` (for yourself) <br /> `tab.nametag.view.other` (for others) | Shows / hides / toggles nametag VIEW a specified player. You can use `-s` as option for silent toggling (no chat message for affected player) |
| /tab setcollision \<player\> \<true\|false\> | `tab.setcollision` | Forces collision rule for specified player, overriding configuration. |
# Placeholders
This feature does not offer any internal placeholders, only PlaceholderAPI placeholders.
## PlaceholderAPI placeholders
Here are TAB's PlaceholderAPI placeholders you can use when this feature is enabled:
| Placeholder | Description |
|-------------|-------------|
| `%tab_tagprefix%` | Player's current tagprefix with placeholders parsed. |
| `%tab_tagsuffix%` | Player's current tagprefix with placeholders parsed. |
| `%tab_tagprefix_raw%` | Player's current raw tagprefix with placeholder identifiers. |
| `%tab_tagsuffix_raw%` | Player's current raw tagsuffix with placeholder identifiers. |
| `%tab_nametag_visibility%` | "Enabled" if player can see nametags, "Disabled" if disabled using `/tab nametag toggleview` |
# Limitations
* Prefix/suffix length is limited to 16 characters (including color codes) on <1.13. There is no reachable limit on 1.13+.
* The name cannot be effectively changed and the plugin doesn't offer it.
* Since 1.13, the name can only have one code. That is either color or magic code (such as &4 or &l), but not both.
* Name does not support RGB codes. Any used RGB colors will be rounded to the nearest legacy code.
* [1.12.2-] Prefix/suffix length is limited to 16 characters (including color codes). Any characters beyond that will be cut to prevent players getting disconnected.
* [1.13+] Name color is controlled by a chat format enum constant. This means:
* Name can only have one code. That is either color or magic code (such as &4 or &l), but not both.
* Name does not support RGB codes. Any used RGB colors will be rounded to the nearest legacy code.
* The same value manages name color and glow color, which means they cannot be different.
* The name cannot be effectively changed and the plugin doesn't offer it.
If you want to avoid these at all costs, the only way is to create entities (armor stands / display) and make them ride the player (or teleport). TAB no longer offers this functionality due to a large amount of unfixable issues (full thread [here](https://gist.github.com/NEZNAMY/f4cabf2fd9251a836b5eb877720dee5c/)). You can, however, check out these 3rd party plugins (**not affiliated with me in any way, use at your own risk**):
* [UnlimitedNameTags](https://www.spigotmc.org/resources/unlimitednametags.117526/)
* [DisplayNameTags](https://github.com/Matt-MX/DisplayNameTags)
* [NotJustNamePlates](https://github.com/YouHaveTrouble/NotJustNameplates)
* [CustomNameplates](https://polymart.org/product/2543/customnameplates)
# Compatibility with other plugins
Scoreboard teams is a feature that cannot be handled by multiple plugins at once.
To make sure no other plugin sends their own teams when not disabled in the plugin's config properly, TAB will block players being added into teams coming from all other plugins (if this feature is enabled and not disabled for a player with a condition).
# Additional info
## Additional note 1 - NPC (in)compatibility
Teams are bound to player names, not uuids or entity ids.
Teams are bound to player names, not UUIDs or entity ids.
Because of that, they will affect all player entities with that name.
This includes NPCs with the same names as online players, and prefixes/suffixes will be displayed on those as well.
To avoid it, make their names not match any online player and use holograms to display them instead
(Citizens plugin has an option for this).
## Additional note 2 - Prefix/suffix on pets
Since 1.9 teams affect tamed animals as well, displaying prefix/suffix on them as well and if nametags are set to be invisible, they will be completely invisible as well. If you want to avoid it, install [this plugin](https://www.spigotmc.org/resources/109466/).
Since Minecraft 1.9, teams affect tamed animals as well, displaying prefix/suffix on them as well and if nametags are set to be invisible, they will be completely invisible as well. If you want to avoid it, install [this plugin](https://www.spigotmc.org/resources/109466/).
## Additional note 3 - Changing name itself
Teams do not allow to change the nametag name itself.
Changing name is a complicated process which is slightly out of scope of the plugin as well,
this is what nick plugins are about.
On top of that, it's a pain
requiring a ton of different packets which change their structure every version and with how many versions the plugin supports,
it doesn't sound like fun doing.
Teams do not allow to change the nametag name itself and TAB does not offer this functionality in any (other) way. For more information, see [How to display name from nickname plugins - Nametag](https://github.com/NEZNAMY/TAB/wiki/How-to-display-name-from-nickname-plugins#nametag).
## Additional note 4 - F1 view
Using teams causes player nametags to remain visible when using F1 view.
@@ -183,6 +225,14 @@ scoreboard-teams:
```
In config.yml. Keep in mind, you'll not be able to use any team features if you do so.
## Additional note 6 - Vanish hook
When a player is [vanished](https://github.com/NEZNAMY/TAB/wiki/Additional-information#vanish-detection), their team is unregistered for all other players who do **not** have `tab.seevanished` permission.
The purpose of this is to avoid players figuring out a staff member is still online but just vanished by "checking" registered teams and their members.
An example of "exploiting" this is to have a 3rd party client spawn a player entity with name of a chosen player (staff member) and seeing if their name is formatted (= team is registered = player is online) or not (offline).
For this reason, make sure you give all of your staff members who can see vanished players the `tab.seevanished` permission, otherwise the vanished player will appear on top of the tablist (players without team are above players with team) and their nametag will not be formatted.
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
@@ -192,21 +242,28 @@ To access this feature, you'll need to obtain `NameTagManager` instance. Get it
To set the values for the respective formatting, use the following:
* `NameTagManager#setPrefix(TabPlayer, String)`
* `NameTagManager#setSuffix(TabPlayer, String)`
To reset them, set values to `null`.
To reset them, set values to `null`.
To get custom values previously set using the API (they will return `null` if no custom value is set):
* `NameTagManager#getCustomPrefix(TabPlayer)`
* `NameTagManager#getCustomSuffix(TabPlayer)`
To get the original value set by the plugin based on configuration:
* `NameTagManager#getOriginalPrefix(TabPlayer)`
* `NameTagManager#getOriginalSuffix(TabPlayer)`
* `NameTagManager#getOriginalRawPrefix(TabPlayer)` - Prefix with raw placeholder identifiers
* `NameTagManager#getOriginalRawSuffix(TabPlayer)` - Suffix with raw placeholder identifiers
* `NameTagManager#getOriginalReplacedPrefix(TabPlayer)` - Prefix with all placeholders parsed
* `NameTagManager#getOriginalReplacedSuffix(TabPlayer)` - Suffix with all placeholders parsed
**Note**: These values are only temporary, meaning they won't get saved anywhere and will get reset on player quit or plugin reload. If you wish to save these values into file, use [commands](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-playergroupplayeruuid-name-property-value-options).
> [!NOTE]
> These values are only temporary,
> meaning they won't get saved anywhere and will get reset on player quit or plugin reload.
> If you wish to save these values into file,
> use [commands](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-playergroupplayeruuid-name-property-value-options).
## Collision
* `NameTagManager#getCollisionRule(TabPlayer)` - Returns forced collision rule using the API, `null` if no value was forced and player follows the configuration.
* `NameTagManager#setCollisionRule(TabPlayer, Boolean)` - Forces collision rule to the player. Use `null` to reset value and make it follow configuration again.
* `NameTagManager#getCollisionRule(TabPlayer)` - Returns forced collision rule using the API, `null` if no value was forced and player follows the configuration.
## Manipulating visibility
* `NameTagManager#hideNametag(TabPlayer)` - Hides player's nametag from all players
@@ -219,4 +276,34 @@ To get the original value set by the plugin based on configuration:
## Disabling team handling
* `NameTagManager#pauseTeamHandling(TabPlayer)` - Pauses team handling for a specific player. This will unregister the player's team and disable anti-override for teams.
* `NameTagManager#resumeTeamHandling(TabPlayer)` - Resumes team handling for a specific player. This will register the player's team and enable anti-override for teams.
* `NameTagManager#hasTeamHandlingPaused(TabPlayer)` - Returns `true` if handling is disabled using methods above, `false` if not.
* `NameTagManager#hasTeamHandlingPaused(TabPlayer)` - Returns `true` if handling is disabled using methods above, `false` if not.
# Examples
## Example 1 - Taking prefix/suffix from permission plugin
If you want TAB to only take prefixes/suffixes from the permission plugin,
delete all groups from **groups.yml** and only keep this:
```
_DEFAULT_:
tagprefix: "%luckperms-prefix%"
tagsuffix: "%luckperms-suffix%"
```
Or a PlaceholderAPI placeholder from your permission plugin if you use a different one.
> [!NOTE]
> When doing this, make sure you don't delete something you didn't mean to delete, for example ta**b**prefix and ta**b**suffix from tablist name formatting feature.
## Example 2 - Making nametags invisible on a subserver
The config option `invisible-nametags` takes either a [condition or a conditional expression](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders).
We can use short format `%server%=<server name>`. If the server name is `server1`, it will look like this:
```
invisible-nametags: "%server%=server1"
```
If we want to disable it in 2 servers, we separate them with `|` (OR). Result:
```
invisible-nametags: "%server%=server1|%server%=server2"
```
> [!NOTE]
> This is just an example, the plugin is not limited to making nametags invisible only based on server.
> If you want to disable them in a world, use %world% with world name(s).
> This works for any placeholder offered by TAB or by PlaceholderAPI.
@@ -6,15 +6,15 @@
# About
This feature allows you to limit players you see in tablist to only players in your world, or in a group of worlds.
This feature can be configured in **config.yml** under **per-world-playerlist** section.
To use it, you need TAB installed on bukkit server. This feature is not available on BungeeCord.
To use it, you need TAB installed on Bukkit server. This feature is not available on any other platform.
# Configuration
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | false | Enables / Disables the feature. |
| allow-bypass-permission | false | If enabled, players with `tab.bypass` permission will see everyone in tablist despite this feature enabled. |
| ignore-effect-in-worlds | *List* | List of worlds where players will see everyone in tablist, not just players in the same world / world group |
| shared-playerlist-world-groups | *Map* | See [Grouping playerlist from multiple worlds](#grouping-playerlist-from-multiple-worlds) |
| Option name | Default value | Description |
|--------------------------------|---------------|-------------------------------------------------------------------------------------------------------------|
| enabled | false | Enables / Disables the feature. |
| allow-bypass-permission | false | If enabled, players with `tab.bypass` permission will see everyone in tablist despite this feature enabled. |
| ignore-effect-in-worlds | *List* | List of worlds where players will see everyone in tablist, not just players in the same world / world group |
| shared-playerlist-world-groups | *Map* | See [Grouping playerlist from multiple worlds](#grouping-playerlist-from-multiple-worlds) |
## Grouping playerlist from multiple worlds
In case you want multiple worlds to share playerlist despite this option enabled, create a group and put world names there. The default example
@@ -10,6 +10,7 @@
* [Examples](#examples)
* [Example 1 - Adding brackets to placeholder output if it returns non-empty value](#example-1---adding-brackets-to-placeholder-output-if-it-returns-non-empty-value)
* [Example 2 - Replicating PlaceholderAPI's %player_colored_ping%](#example-2---replicating-placeholderapis-player_colored_ping)
* [Example 3 - Using both original and replaced output](#example-3---using-both-original-and-replaced-output)
# About
Most placeholders don't have fully configurable output, making you unable to customize it as you'd like.
@@ -44,8 +45,14 @@ placeholder-output-replacements:
</details>
**Note 1:** If you want to replace empty output, use `""` or `''` on the left side.
**Note 2:** The text must match exactly, including color codes. To check color codes a placeholder returns use [`/tab parse <player> <placeholder>`](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-parse-text) and check "Without colors" part.
> [!NOTE]
> If you want to replace empty output, use `""` or `''` on the left side.
> [!NOTE]
> The text must match exactly, including color codes.
> To check the color codes a placeholder returns use
> [`/tab parse <player> <placeholder>`](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-parse-player-text)
> and check "Raw colors" part.
### Pattern 2: Number intervals
Output will be replaced if it's numeric and belongs in a configured interval.
@@ -61,7 +68,9 @@ placeholder-output-replacements:
```
</details>
**Note:** If a number is included in more than 1 interval (just like 5 and 15 from the example above), the one higher is used. In this case, 15 would give `Solid` and 5 would give `Bad`.
> [!NOTE]
> If a number is included in more than 1 interval (just like 5 and 15 from the example above), the one higher is used.
> In this case, 15 would give `Solid` and 5 would give `Bad`.
Intervals can be defined using both `-` and `~`.
If you need support for negative values, use `~` for an interval instead of `-`.
@@ -139,7 +148,9 @@ placeholder-output-replacements:
```
**Don't forget that parse command applies replacements, so when trying to see what placeholder returns, you should disable any previously configured replacements for that placeholder to see the correct raw output**.
## Example 2 - Replicating PlaceholderAPI's %player_colored_ping%
*Please note that this is just an example to demonstrate the plugin's functionality. It is not supposed to discourage anyone from using PlaceholderAPI or any of its placeholders.*
> [!NOTE]
> Please note that this is just an example to demonstrate the plugin's functionality.
> It is not supposed to discourage anyone from using PlaceholderAPI or any of its placeholders.*
The placeholder allows you to configure intervals in config.yml. Default values are <50 for good, <100 for medium and 100+ for high. We can achieve this using [Pattern 2: Number intervals](#pattern-2-number-intervals) and [Pattern 3: else](#pattern-3-else). When put together, it looks as following:
```
@@ -155,4 +166,31 @@ which require a numeric input (for versions prior to 1.20.3).
If you want that feature and ping to be displayed there, replacements won't work for you,
and you'll need
to use [Conditional placeholders](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) instead
to achieve colored ping.
to achieve colored ping.
## Example 3 - Using both original and replaced output
Once configured, replacements are applied as the placeholder output everywhere. It is not directly possible to use original output in one place and replaced in another.
If you need this, you should consider [conditional placeholders](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) instead.
If conditional placeholders are too complicated to use, there are alternate ways. The main point of the solution is to create different placeholder that eventually calls the same function and returns the same result. This can be done by "wrapping" the placeholder into another one. The easiest way using existing TAB's functions is using animations. Create an animation with a single frame that contains the placeholder and configure replacements for that placeholder instead.
<details>
<summary>Example for %ping%</summary>
**animations.yml**:
```
ping:
change-interval: 50 # Actual value doesn't matter
texts:
- "%ping%"
```
Then, configure replacements for the animation in **config.yml**:
```
placeholder-output-replacements:
"%animation:ping%":
"0-50": "&a%animation:ping%" # %ping% would work too
"51-100": "&e%animation:ping%"
"else": "&c%animation:ping%"
```
Now, you can use `%ping%` for original output and `%animation:ping%` for replaced.
</details>
@@ -2,11 +2,16 @@
* [About](#about)
* [Configuration](#configuration)
* [Limitations](#limitations)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [Additional info](#additional-info)
* [Additional note 1 - Spectator gamemode](#additional-note-1---spectator-gamemode)
* [Examples](#examples)
* [Example 1 - Per-world values](#example-1---per-world-values)
* [Example 2 - Displaying hearts](#example-2---displaying-hearts)
# About
The scoreboard objective with PLAYER_LIST display slot. On 1.20.2- it supports 2 display types:
This features gives you control over Minecraft's scoreboard objective feature with PLAYER_LIST slot.
On 1.20.2- it supports 2 display types:
* yellow number
![](https://images-ext-1.discordapp.net/external/ioDTFWFe9qUGg8ZgNFCPIoXN6B-EnbqHb0WXE9200a8/https/image.prntscr.com/image/w8sjR4y9QhuaEcnU5tGTmw.png)
* hearts
@@ -15,19 +20,94 @@ The scoreboard objective with PLAYER_LIST display slot. On 1.20.2- it supports 2
Since 1.20.3, it can display any text.
![image](https://github.com/NEZNAMY/TAB/assets/6338394/2300b73e-d0cb-4eec-8ff1-e16be60bba49)
This feature can be configured in **config.yml** under **playerlist-objective** section.
# Configuration
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | true | Enables / Disables the feature |
| value | "%ping%" | [1.20.2-] Defines value displayed. You can set this to any placeholder that outputs a number. Setting value to `%health%`, `%player_health%` or `%player_health_rounded%` will result in the display type being changed to hearts instead of number. If you want to display health but as a number and not hearts, set value to `0%health%` for example. Only visible on 1.20.2 and lower. <br/> **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 | "&7Ping: %ping%"| [1.20.3+] Value to display for 1.20.3+ clients. Supports any text. |
| 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. |
The feature can be configured in **config.yml** under **playerlist-objective** section.
This is how the default configuration looks:
```
playerlist-objective:
enabled: true
value: "%ping%"
fancy-value: "&7Ping: %ping%"
title: "TAB" # Only visible on Bedrock Edition
render-type: INTEGER
disable-condition: '%world%=disabledworld'
```
All of the options are explained in the following table.
| Option name | Default value | Description |
|-------------------|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enabled | true | Enables / Disables the feature |
| value | "%ping%" | [1.20.2-] An integer from -2147483648 to 2147483647, doesn't support decimal values. The number is always yellow. Supports placeholders with player-specific output, such as player health. Only visible on 1.20.2 and lower (unless you set `render-type` to `HEARTS`). <br/> **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 | "&7Ping: %ping%" | [1.20.3+] Any text, supports placeholders with per-player output. Only visible on 1.20.3+, where it completely replaces `value`, or if `render-type` is set to `HEARTS`. |
| title | "TAB" | Title to send. Only visible on Bedrock Edition. |
| render-type | INTEGER | Render type of the value. Supported values are `INTEGER` and `HEARTS`. <br />When set to `HEARTS`, the `value` is used displayed even on 1.20.3+, where `fancy-value` is ignored. |
| disable-condition | %world%=disabledworld | A [condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) (either name of a condition or a conditional expression) that must be met for disabling the feature for players. Set to empty for not disabling the feature ever. <br/> **Note**: Disabling the feature for a player means sending objective unregister packet to them, which results in player not seeing the feature on anyone anymore. It doesn't work the other way around - you cannot disable this feature on target players, only for viewers. |
# Limitations
At 1.20.2 and lower, only 2 display types are supported - number and hearts. The number's color is yellow and cannot be changed.
* [1.20.2-] Only 2 display types are supported - yellow number and hearts.
* [1.20.2-] A yellow 0 will appear on all tablist entries that aren't actual players (such as NPCs and [layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) entries) and it cannot be removed.
# Compatibility with other plugins
TAB does not contain any sort of compatibility functionality for this feature.
It will not try to prevent other plugins from applying the feature and neither will it detect it to re-add back once the other plugin removes it.
Therefore, if another plugin also sends playerlist objective, TAB's may not show anymore (depending on who sends it first).
Make sure you do not have any other plugin sending it to ensure the feature works properly.
You can check the list of objectives registered by either commands or plugins using Bukkit API using `/scoreboard objectives list`.
If it contains one that could be the cause, you can unregister it by running `/scoreboard objectives remove <name>`. After doing so, reload TAB, so it resends its objectives again.
Note that if this was automatically generated by a plugin, it will probably be added back again.
# Additional info
## Additional note 1 - Spectator gamemode
The feature will not be visible on players with spectator gamemode. To resolve this, check out [Spectator fix](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Spectator-fix) feature.
The feature will not be visible on players with spectator gamemode. To resolve this, check out [Spectator fix](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Spectator-fix) feature.
# 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-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:
playerlist1:
conditions:
- "%world%=world1"
true: "Text to display in world world1" # Player is in world world1, display the text
false: "%condition:playerlist2%" # Player is not in world world1, check another condition
playerlist2:
conditions:
- "%world%=world2"
true: "Text to display in world world2" # Player is in world world2, display the text
false: "Text to display in other worlds" # Player is not in any of the 2 worlds
```
> [!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-value`:
```
playerlist-objective:
fancy-value: "%condition:playerlist1%"
```
> [!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 proxy, use %server% with server names.
> This works for any placeholder offered by TAB or by PlaceholderAPI.
## Example 2 - Displaying hearts
In order to display the value as hearts, set `render-type` to `HEARTS`.
Then, set `value` to a placeholder that returns player's health. If you have TAB on a backend server, use `%health%`. If you have TAB on a proxy, use PlaceholderAPI's `%player_health_rounded%`.
Example configuration:
```
value: "%health%"
render-type: HEARTS
```
When using `HEARTS` render type, `fancy-value` is not displayed by the client, so it doesn't matter what it is set to.
Final result:
![](https://images-ext-2.discordapp.net/external/RxWu_5hBSLUWqS7vCvSPY9PnNxkYfAMQQXwkbi6GEyU/https/image.prntscr.com/image/edpM4XpOT1q3SsQ5vYNjzQ.png)
+235 -141
View File
@@ -1,129 +1,167 @@
# Content
* [About](#about)
* [Creating a scoreboard](#creating-a-scoreboard)
* [title](#title)
* [lines](#lines)
* [Alignment](#alignment)
* [Empty placeholder output](#empty-placeholder-output)
* [display-condition](#display-condition)
* [Chaining scoreboards](#chaining-scoreboards)
* [Announce command](#announce-command)
* [Additional settings](#additional-settings)
* [Configuration](#configuration)
* [Scoreboard](#scoreboard)
* [Line syntax](#line-syntax)
* [Hiding a line](#hiding-a-line)
* [Longer lines](#longer-lines)
* [Chaining scoreboards](#chaining-scoreboards)
* [Commands](#commands)
* [Placeholders](#placeholders)
* [PlaceholderAPI placeholders](#placeholderapi-placeholders)
* [Limitations](#limitations)
* [Longer lines](#longer-lines)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [Additional info](#additional-info)
* [Additional note 1 - Text alignment](#additional-note-1---text-alignment)
* [Additional note 2 - Geyser / Bedrock issues](#additional-note-2---geyser--bedrock-issues)
* [API](#api)
* [Creating custom scoreboards](#creating-custom-scoreboards)
* [Showing custom scoreboards](#showing-custom-scoreboards)
* [Toggling scoreboard visibility](#toggling-scoreboard-visibility)
* [Announcing a scoreboard](#announcing-a-scoreboard)
* [Examples](#examples)
* [Example 1 - per-world scoreboards](#example-1---per-world-scoreboards)
* [Example 1 - Per-world scoreboards](#example-1---per-world-scoreboards)
* [Example 2 - Periodical scoreboard switching](#example-2---periodical-scoreboard-switching)
* [Example 3 - Per-version scoreboards](#example-3---per-version-scoreboards)
* [Example 4 - Conditional lines](#example-4---conditional-lines)
# About
Scoreboard objective with SIDEBAR display slot.
This features gives you control over Minecraft's scoreboard objective feature with SIDEBAR slot.
This feature can be configured in **config.yml** under **scoreboard** section.
# Creating a scoreboard
Scoreboards can be created in `scoreboards` section. You can define as many scoreboards as you want. Each scoreboard can have a condition requirement, which must be met to display the scoreboard. If it's not met, the next defined scoreboard is checked and so on. If the last defined scoreboard has a condition requirement which isn't met, player won't see anything.
Each scoreboard defines up to 3 parameters:
## title
Title of the scoreboard.
Limited to 32 characters on MineCraft versions below 1.13 (including color codes).
It is automatically centered by the client.
## lines
Up to 15 lines of text. You can define more, but the client won't display them.
Since 1.20.3, you can also configure the value on the right side, which no longer has to be a red number. To set it, use `||` sequence and put right-side text after it. Example:
# Configuration
The feature can be configured in **config.yml** under **scoreboard** section.
This is how the default configuration looks:
```
scoreboard:
enabled: false
toggle-command: /sb
remember-toggle-choice: false
hidden-by-default: false
delay-on-join-milliseconds: 0
scoreboards:
scoreboard-1.20.3+:
title: "<#E0B11E>MyServer</#FF0000>"
display-condition: "%player-version-id%>=765;%bedrock%=false" # Only display it to players using 1.20.3+ AND NOT bedrock edition
lines:
- "Left side text 1||Right side text 1"
- "Left side text 2....||Right side text 2...."
- "Left side text 3.......||Right side text 3......."
- "&7%date%"
- "%animation:MyAnimation1%"
- "&6Online:"
- "* &eOnline&7:||%online%"
- "* &eCurrent World&7:||%worldonline%"
- "* &eStaff&7:||%staffonline%"
- ""
- "&6Personal Info:"
- "* &bRank&7:||%group%"
- "* &bPing&7:||%ping%&8ms"
- "* &bWorld&7:||%world%"
- "%animation:MyAnimation1%"
scoreboard:
title: "<#E0B11E>MyServer</#FF0000>"
lines:
- "&7%date%"
- "%animation:MyAnimation1%"
- "&6Online:"
- "* &eOnline&7: &f%online%"
- "* &eCurrent World&7: &f%worldonline%"
- "* &eStaff&7: &f%staffonline%"
- ""
- "&6Personal Info:"
- "* &bRank&7: &f%group%"
- "* &bPing&7: &f%ping%&8ms"
- "* &bWorld&7: &f%world%"
- "%animation:MyAnimation1%"
```
Will give you the following:
![image](https://github.com/NEZNAMY/TAB/assets/6338394/785e4e66-935c-4233-8a16-f3e34386cfd0)
All of the options are explained in the following table.
| Option name | Default value | Description |
|----------------------------|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enabled | false | Enables / Disables the feature |
| toggle-command | /sb | Command that can be used to toggle scoreboard for the player running the command. Players need `tab.scoreboard.toggle` permission to use it. <br />**Note:** Commands are not supposed to be registered / unregistered dynamically at runtime. As such, you may run into small issues when changing the toggle command and reloading. After you modify the command to your liking, reconnect to properly see it in tabcomplete. If you don't use TAB on a proxy, consider restarting the server as well for the old command to actually be unregistered. |
| remember-toggle-choice | false | When enabled, toggling decision is saved into a file to remember it even after reloads/restarts/reconnects |
| hidden-by-default | false | If enabled, scoreboard will automatically be hidden on join until toggle command is used to show it. |
| use-numbers | false | If enabled, numbers 1-15 will be used in the scoreboard. If disabled, `static-number` is shown everywhere. Will not be visible for 1.20.3+ players, instead, you can configure any text to show using `\|\|text` in the lines (scroll up for more info). |
| static-number | 0 | If `use-numbers` is disabled, this is number to be in all lines. |
| delay-on-join-milliseconds | 0 | Delay in milliseconds to send scoreboard after joining. |
| scoreboards | *Map* | Scoreboards to display based on conditions (see below for more info).
|
The right side text will not be visible at 1.20.2 and lower, and numbers will be displayed instead.
To properly see the right side, not only the client has to be 1.20.3+, but the server as well,
since the plugin cannot send a packet that does not exist (on older versions).
Proxies always include new content and therefore count as the latest version.
This can be used to send new content to new players while having an outdated server version.
## Scoreboard
A scoreboard consists of the following options:
### Alignment
The left side of the text is automatically aligned to the left,
while the right side is automatically aligned to the right.
This is done by the client and is out of plugin's control.
If you want to center a line, you'll need to do it manually.
If dynamic placeholder output length is preventing your from doing it,
you can try to bypass it by adding spaces before and after it to artificially increase and force the scoreboard width,
such as
`- " Centered text "` (or more spaces if needed).
| Option name | Description |
|--------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `display-condition` (optional) | [Condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) (either condition name or a conditional expression) <br /> that must be met for the design to be displayed. <br />If not defined, design will be displayed without any required condition. <br />If player does not meet condition, another design may be displayed <br /> based on chaining (see below for more info). |
| `title ` | Title of the scoreboard. Limited to 32 characters (including color codes) on Minecraft versions below 1.13. It is automatically centered by the client. |
| `lines` | List of lines to display. The client will only display up to 15 lines. See below for more information about syntax. |
### Empty placeholder output
When a line consists only of a placeholder that returned empty output, the line will be hidden completely. This is intentional to allow dynamic scoreboard size based on placeholder output. This is not the case if empty line is configured (`""`), to allow empty lines in configuration.
## display-condition
A [condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) that must be met to display this scoreboard. If it isn't met for the player, the next scoreboard's condition is checked.
# Chaining scoreboards
When defining more than 1 scoreboard in config, the plugin will display the correct scoreboard based on conditions.
The plugin goes through all defined scoreboards, starting with the scoreboard on top.
If the scoreboard's condition is met or not set, it is displayed.
If not, the next defined scoreboard is checked and so on.
If no suitable scoreboard is found (the last one has a condition requirement which wasn't met), none is displayed.
Example:
**Example**:
```
scoreboards:
scoreboard1:
display-condition: "permission:tab.scoreboard.admin"
title: "Title 1"
MyScoreboard:
display-condition: "%world%=world" # Only display it in world "world"
title: "Scoreboard for world %world%"
lines:
- "Scoreboard for admins"
scoreboard2:
display-condition: "%world%=myWorld"
title: "Title 2"
lines:
- "Scoreboard in world myWorld"
scoreboard3:
title: "Title 3"
lines:
- "Line 1"
- "Line1||Right side 1"
- "Line2||Right side 2"
- "Line3||Right side 3"
```
Scoreboard `scoreboard1` is checked first. If condition is not met, `scoreboard2` is checked. If that condition is not met, `scoreboard3` is displayed.
If a player meets both conditions (has defined permission and is in defined world), `scoreboard1` will be displayed, because it is defined first and therefore has the highest priority. You can switch scoreboards based on your priority needs.
# Announce command
This takes priority over the current scoreboard.
Once the announcement is over, the previous scoreboard is restored.
`/tab announce scoreboard <name> <time>`
name - name of scoreboard to be displayed
time - number of seconds to display the scoreboard for
### Line syntax
The lines are specified as a list of strings.
# Additional settings
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | false | Enables / Disables the feature |
| toggle-command | /sb | Command that can be used to toggle scoreboard for the player running the command. Players need `tab.scoreboard.toggle` permission to use it. <br />**Note:** This command will not appear in command auto-complete, because it's not a real registered command. Registered commands must be defined in plugin jar directly and cannot be dynamic. If you want to solve this, you can try getting a dummy private plugin made which registers that command. |
| remember-toggle-choice | false | When enabled, toggling decision is saved into a file to remember it even after reloads/restarts/reconnects |
| hidden-by-default | false | If enabled, scoreboard will automatically be hidden on join until toggle command is used to show it. |
| use-numbers | false | If enabled, numbers 1-15 will be used in the scoreboard. If disabled, `static-number` is shown everywhere. |
| static-number | 0 | If `use-numbers` is disabled, this is number to be in all lines. |
| delay-on-join-milliseconds | 0 | Delay in milliseconds to send scoreboard after joining. |
Since 1.20.3, you can also configure the value on the right side, which no longer has to be a red number.
On <1.20.3, you can configure red numbers with either a static number, or a placeholder that evaluates to a number.
# Limitations
* The title is limited to 32 characters (including color codes) on <1.13.
* Line length is limited to 28 characters (including color codes) on <1.13 (68 on lines with static text / [Longer lines](#longer-lines)).
* Only displays up to 15 lines.
* The red numbers on the right really cannot be removed from the plugin side (a client modification / resource pack is necessary) at 1.20.2 and lower. They no longer appear on 1.20.3+, and instead any text can be configured (see above).
The final syntax is `<text>||<number format>||<score>`, where:
* `<text>` is the main text displayed on the left side
* `<number format>` is the new 1.20.3+ feature that replaces `score` with any text, not just a number
* `<score>` is the value (red number), only visible on <1.20.3 and must be a number (or a placeholder evaluating to one)
The second and third part are optional. Example syntaxes that configure a line are:
* `<text>`
* `<text>||<number format>`
* `<text>||<number format>||<score>`
* `<text>||||<score>`
For example:
```
lines:
- "Left 1---"
- "||---Right 1"
- "Left 2------"
- "||------Right 2"
- "Left 3---------"
- "||---------Right 3"
- "Left 4------------"
- "||------------Right 4"
- "Left 5---------------"
- "||---------------Right 5"
- "Left 6------------------"
- "||------------------Right 6"
```
Will give you the following:
<img width="305" height="239" alt="image" src="https://github.com/user-attachments/assets/a712b5fb-21ea-4ee4-83ec-d962bd431a07" />
Additionally, the following configuration:
```
lines:
- "Left 1---||---Right 1"
- "Left 2------||------Right 2"
- "Left 3---------||---------Right 3"
- "Left 4------------||------------Right 4"
- "Left 5---------------||---------------Right 5"
- "Left 6------------------||------------------Right 6"
```
Will give you
<img width="583" height="131" alt="image" src="https://github.com/user-attachments/assets/15e809c6-4ecd-4234-a30e-744c2d413335" />
The `number format` will not be visible at 1.20.2 and lower, and `score` will be displayed instead.
### Hiding a line
When a line consists only of a placeholder that returned empty output, the line will be hidden completely. This is intentional to allow dynamic scoreboard size based on placeholder output. This is not the case if empty line is configured (`""`), to allow empty lines in configuration.
### Longer lines
*Since 1.13 the line length is unlimited, so you don't need to worry about this if you use 1.13+.*
# Longer lines
To make sure the scoreboard never flickers, it's only using prefix/suffix components to display text.
These can easily be changed without any visual issues.
The player name part, however, cannot be changed.
@@ -146,50 +184,78 @@ This bypass is automatically enabled for all lines that only use static text
(since there's nothing to refresh and cause flickering),
therefore doing it for such lines (like in the example above) has no effect.
## Chaining scoreboards
When defining more than 1 scoreboard in config, the plugin will display the correct scoreboard based on conditions.
The plugin goes through all defined scoreboards, starting with the scoreboard on top.
If the scoreboard's condition is met or not set, it is displayed.
If not, the next defined scoreboard is checked and so on.
If no suitable scoreboard is found (the last one has a condition requirement which wasn't met), none is displayed.
**Example**:
```
scoreboards:
scoreboard1:
display-condition: "permission:tab.scoreboard.admin"
title: "Title 1"
lines:
- "Scoreboard for admins"
scoreboard2:
display-condition: "%world%=myWorld"
title: "Title 2"
lines:
- "Scoreboard in world myWorld"
scoreboard3:
title: "Title 3"
lines:
- "Line 1"
```
Scoreboard `scoreboard1` is checked first. If condition is not met, `scoreboard2` is checked. If that condition is not met, `scoreboard3` is displayed.
If a player meets both conditions (has defined permission and is in defined world), `scoreboard1` will be displayed, because it is defined first and therefore has the highest priority. You can switch scoreboards based on your priority needs.
# Commands
| Command | Permission | Description |
|------------------------------------------------------|------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `/tab scoreboard show <name> [player]` | `tab.scoreboard.show` (for yourself) <br /> `tab.scoreboard.show.other` (for others) | Shows the scoreboard with the given `name`, either to yourself if no `player` was given, or to the given `player`. |
| `/tab scoreboard [on/off/toggle] [player] [options]` | `tab.scoreboard.toggle` (for yourself) <br /> `tab.scoreboard.toggle.other` (for others) | Shows / hides / toggles scoreboard of specified player. If no player was given, command affects the sender. You can use `-s` as option for silent toggling (no chat message for affected player) |
| `/tab scoreboard announce <name> <duration>` | `tab.announce.scoreboard` | Shows the scoreboard with the given `name` to every player on the server for the given `duration`, in seconds. |
# Placeholders
This feature does not offer any internal placeholders, only PlaceholderAPI placeholders.
## PlaceholderAPI placeholders
Here are TAB's PlaceholderAPI placeholders you can use when this feature is enabled:
| Placeholder | Description |
|-------------|-------------|
| `%tab_scoreboard_name%` | Returns name of player's currently displayed scoreboard or empty string if none is displayed due to no display condition being met. |
| `%tab_scoreboard_visible%` | "Enabled" if visible, "Disabled" if not (toggled with a command) |
# Limitations
* [1.12.2-] The title is limited to 32 characters (including color codes).
* [1.12.2-] Line length is limited to 28 characters (including color codes) (64 on lines with static text / [Longer lines](#longer-lines)).
* [1.20.2-] The red numbers on the right really cannot be removed from the plugin side (a client modification / resource pack is necessary).
* [Bedrock] Scoreboard lines may be cut off and show `...`, this can be bypassed by using [GeyserOptionalPack](https://github.com/GeyserMC/GeyserOptionalPack)
* The client only displays up to 15 lines. If a plugin sends more, only the top 15 scores will be displayed. Changing this would require a client modification (on versions below 1.8 the scoreboard won't appear at all if more than 15 lines are sent).
# Compatibility with other plugins
TAB automatically detects scoreboard coming from other plugins, and when one is sent, TAB hides its own scoreboard.
Later, when the other plugin hides its scoreboard, TAB will send its scoreboard back to the player.
This detection must be available on your platform.
For that,
see the Scoreboard section on [compatibility page](https://github.com/NEZNAMY/TAB/wiki/Compatibility#supported-features-per-platform).
If it says ✔, the detection is available.
If it says ❗, it means this detection is not available on your platform.
As a result, when the other plugin hides its scoreboard, TAB will not be able to resend its own.
# Additional info
## Additional note 1 - Text alignment
**Title**:
The title is always centered by the client. You cannot disable this. You can only pad it with spaces to move it towards your desired direction.
If you want this detection,
and it's not supported by your platform,
you can achieve it
using an alternate solution with conditions that will make TAB display no scoreboard if the condition is not met.
For this, you'll need to have more information about when exactly do plugins send scoreboards and how to detect it.
**Lines**:
The left side of the text is automatically aligned to the left,
while the right side is automatically aligned to the right.
This is done by the client and is out of plugin's control.
If you want to center a line, you'll need to do it manually.
If dynamic placeholder output length is preventing your from doing it,
you can try to bypass it by adding spaces before and after it to artificially increase and force the scoreboard width,
such as
`- " Centered text "`.
<details>
<summary>Example using PremiumVanish</summary>
When you are vanished using PremiumVanish plugin, placeholder `%premiumvanish_isvanished%` will return `Yes` instead of the usual `No`. You can put this as a display condition to all defined scoreboards.
An original
```
scoreboards:
scoreboard1:
title: Default
lines:
- 'Line of text'
```
would turn into
```
scoreboards:
scoreboard1:
display-condition: "%premiumvanish_isvanished%=No"
title: Default
lines:
- 'Line of text'
```
Remember to add this condition to all of your scoreboards if you have more than 1
(for those with an existing condition merge them using `;`).
Keep in mind [placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements) apply to placeholders here as well,
so if you configured a fancy output for that placeholder, you'll need to use it in the display condition as well.
To see what exactly has placeholder returned, use `/tab parse <player> <placeholder>`.
</details>
## Additional note 2 - Geyser / Bedrock issues
Currently, there is a great suspicion that there is a geyser bug causing scoreboard to not appear for Bedrock players ([Geyser #5304](https://github.com/GeyserMC/Geyser/issues/5304) and more). This affects other scoreboard plugins as well, not just TAB. If you are experiencing this issue, make sure it is not caused by TAB configuration (for example using %bedrock%=false as display condition). If that wasn't the case, consider making a high quality bug report on Geyser with steps to reproduce.
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
@@ -209,13 +275,13 @@ To change whether a player can see scoreboards, use `ScoreboardManager#setScoreb
To toggle whether a player can see scoreboards, use `ScoreboardManager#toggleScoreboard(TabPlayer, boolean)`. This will either make scoreboards visible if they are not already, or make them hidden if they are currently visible.
## Announcing a scoreboard
To announce a scoreboard to all players on the server for a given number of ticks,
To announce a scoreboard to all players on the server for a given number of milliseconds,
use `ScoreboardManager#announceScoreboard(String, int)`,
which will look up a scoreboard with the given `String` name,
and if one is found, send it to all players for the given `int` ticks.
and if one is found, send it to all players for the given `int` milliseconds.
# Examples
## Example 1 - per-world scoreboards
## Example 1 - Per-world scoreboards
We will be using a condition of "equals" (=) type and check for output of `%world%` placeholder.
If condition is met, it means player is in that world and the scoreboard is displayed.
If not, check for the next scoreboard's condition.
@@ -246,7 +312,10 @@ If none of the conditions are met, display the default scoreboard.
lines:
- 'You are not in any of the worlds listed above'
```
*Note: This is just an example, the plugin is not limited to displaying scoreboard only per world. If you want per server scoreboards 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.*
> [!NOTE]
> This is just an example, the plugin is not limited to displaying scoreboard only per world.
> If you want per server scoreboards on proxy, use %server% with server names.
> This works for any placeholder offered by TAB or by PlaceholderAPI.
## Example 2 - Periodical scoreboard switching
We can use [animations](https://github.com/NEZNAMY/TAB/wiki/Animations) to make the plugin switch between scoreboards using display condition. Let's say we want to switch between 2 scoreboards. First, we create an animation:
@@ -281,7 +350,7 @@ We don't need to define display condition for the second scoreboard,
since if animation is not on the first frame, it has to be on the second one.
If using more than 2, you will need to define display condition for all of them (except the last one).
# Example 3 - Per-version scoreboards
## Example 3 - Per-version scoreboards
1.20.3 has added new features to scoreboards, which are not visible to older clients. If you want to use new features for new players while still displaying things properly for older players, you'll need to create 2 different scoreboards.
You'll find 2 placeholders useful for this:
* `%player-version-id%` - Returns network ID of player's protocol version. Unlike with version names, you can perform numerical comparisons with these. You can find all version IDs [here](https://github.com/NEZNAMY/TAB/blob/master/shared/src/main/java/me/neznamy/tab/shared/ProtocolVersion.java). For example, 1.20.3 is 765.
@@ -311,4 +380,29 @@ Let's go ahead and set it up (with proper spacing):
- "* &bRank&7: &f%group%"
- "* &bPing&7: &f%ping%&8ms"
- "* &bWorld&7: &f%world%"
```
```
## Example 4 - Conditional lines
Sometimes you may want a dynamic line that only shows sometimes. TAB is already made to hide lines if they only consist of a placeholder that returned empty value. However, you may want to add more text around it, such as
```
- "Faction: %factionsuuid_faction_name%"
```
Now, even if the placeholder returns empty string, text `Faction: ` will remain, and as such, the line will stay. In order to avoid this, create a [conditional placeholder](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders). If the placeholder returned empty value, show empty value. Otherwise, show result of the placeholder with the static text:
```
conditions:
faction:
conditions:
- '%factionsuuid_faction_name%='
true: "" # No faction, return empty string to hide the line
false: "Faction: %factionsuuid_faction_name%" # Player has a faction, show the static text before it as well
```
> [!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!
Now, configure your scoreboard line as:
```
- "%condition:faction%"
```
and it will only display if the placeholder returned non-empty value.
+18 -31
View File
@@ -21,20 +21,15 @@
# Enabling
To enable sorting, you must have either [Nametags](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags) or [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) (or both) enabled.
To **verify** you enabled sorting, run `/tab debug`. It will say `Sorting type:` followed by anything except `DISABLED`.
# Methods of sorting
Below are all the different methods that you can use to sort players in TAB.
Below are all the different methods that you can use to sort players.
## GROUPS
This is the default and recommended method. Players will be sorted by their primary permission group, according to the configured group list.
First, put your players into groups in your permission plugin.
All the ways to do it can be found
at [How to assign players into groups](https://github.com/NEZNAMY/TAB/wiki/How-to-assign-players-into-groups).
**Verify** player's group using `/tab debug <player>`.
It should say `Primary permission group:` followed by group you configured.
If not, you did not assign players into groups correctly.
at [How to assign players into groups](https://github.com/NEZNAMY/TAB/wiki/How-to-assign-players-into-groups).
Second, place all of your groups in to a comma separated list **in order of priority** into `sorting-types`. Example:
```yaml
@@ -42,18 +37,14 @@ scoreboard-teams:
sorting-types:
- "GROUPS:owner,admin,mod,default"
```
**Verify** configured sorting priority of players using `/tab debug <player>`.
It should show a message like this:
![image](https://github.com/NEZNAMY/TAB/assets/6338394/095d8523-e8c0-4eff-8935-b0b8e6e0d5ff)
If a group is not in the list, you will get the following:
![image](https://github.com/NEZNAMY/TAB/assets/6338394/9c530873-87c9-4db7-8916-a6121dbeed37)
If that's the case, you forgot to add that group into the list.
## PERMISSIONS
**This method is not recommended, as many low quality servers give OP to every staff member and don't know how to negate permissions, making this option not function as intended. If you think you can pull it off, and sorting by primary group is not an option, you can give this a try.
This method is, however, handy when trying to sort specific players **without** assigning them into a group.**
> [!CAUTION]
> This method is not recommended,
> as many low quality servers give OP to every staff member and don't know how to negate permissions,
> making this option not function as intended.
> If you think you can pull it off, and sorting by primary group is not an option, you can give this a try.
This method is, however, handy when trying to sort specific players without assigning them into a group.
This method will sort players based on permission nodes they have.
Place all of your permissions in to a comma separated list **in order of priority**.
@@ -164,9 +155,9 @@ you will need to use outputs respectively when defining sorting as well.
Although you can theoretically use as many sorting types as you want, there are still strict limits set by mojang. See more about these limits and how to avoid them as much as possible at [Additional note 1 - Limitations](#additional-note-1---limitations).
# Additional settings
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| case-sensitive-sorting | true | When enabled, players will be sorted as A-Z a-z. When disabled, Aa-Zz. |
| Option name | Default value | Description |
|------------------------|---------------|------------------------------------------------------------------------|
| case-sensitive-sorting | true | When enabled, players will be sorted as A-Z a-z. When disabled, Aa-Zz. |
# Additional info
## Additional note 1 - Limitations
@@ -196,15 +187,12 @@ In other words, only one plugin can handle teams at a time.
Having multiple plugins handling teams is supposed to end in a disaster.
Fortunately, TAB contains a function that prevents other plugins from assigning players into teams.
This can be enabled/disabled by toggling `anti-override` setting under `scoreboard-teams`.
This is, however, highly recommended to keep enabled, unless all of your plugins are configured correctly.
When a plugin tries to override TAB's teams, this action is logged into `anti-override.log` file.
If your file is empty / does not exist, it means you have no conflicting plugins / settings and can disable this option,
slightly boosting performance.
If your file is empty / does not exist, it means you have no conflicting plugins / settings.
If the file exists, most of the time you can guess where the teams come from by their name.
Here are a few common teams and their sources (`xxxx` means any, usually random character sequence):
* `collideRule_xxxx` - this comes from Paper. Not going to explain why as that would be quite long, but the way you can avoid is by setting `enable-player-collisions: true` in paper config and `enable-collision: false` in TAB config (yes, collisions will be disabled).
* `CMINPxx` - CMI, set `DisableTeamManagement: true` in `plugins/CMI/config.yml`.
* `CMINPxx` - CMI, set `DisableTeamManagement: true` in `plugins/CMI/config.yml` (though CMI won't allow you to change glow color if you do, so keep that in mind).
* `CIT-xxxxxxxxxxxx` - Citizens NPC with the same name as some online player. Make NPC names not match real players and use holograms to display your desired text (/npc name or something).
* `PVP-xxxxxxxxxxxx` - Team coming from [PvPManager](https://www.spigotmc.org/resources/pvpmanager-lite.845/) plugin.
@@ -220,16 +208,15 @@ For that reason, let's call it list of mistakes made when following this page.
The most common mistakes include:
* Disabling both teams and layout, not realizing it disables sorting as well.
* Disabling anti-override without disabling teams in other plugins.
* Mistaking `primary-group-finding-list` for the sorting list, despite that list having nothing to do with sorting and by default even having a comment above it saying it has nothing to do with sorting.
* Not configuring primary groups correctly. This can have multiple reasons, such as
* Not configuring group weights in LuckPerms.
* Accidentally enabling `use-bukkit-permission-manager` option when on BungeeCord without knowing what it does.
* Installing TAB on BungeeCord without having any permission plugin on BungeeCord.
* Enabling `assign-groups-by-permissions` without giving those permissions.
* Accidentally enabling `use-bukkit-permission-manager` option when on a proxy without knowing what it does.
* Installing TAB on a proxy without having any permission plugin on the proxy.
* Enabling `assign-groups-by-permissions` without giving those permissions (or the opposite - giving away OP to users, resulting in the highest group being taken).
[Debug command](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-debug-player) will help you identify if this is your case.
* Using a plugin that causes TAB to fail to apply teams (such as Tablisknu). This includes installing TAB plugin on both bukkit and bungeecord, causing the installations to conflict.
* Using a plugin that causes TAB to fail to apply teams (such as Tablisknu). This includes installing TAB plugin on both backend and proxy, causing the installations to conflict.
* Using TAB on Velocity without installing [VelocityScoreboardAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/releases)
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
+4 -4
View File
@@ -8,7 +8,7 @@
# About
With the introduction of spectator gamemode in 1.8,
players having it automatically appear on the bottom of tablist with transparent name and missing [Playerlist Objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective).
This feature cancels gamemode change packets to spectator gamemode, cancelling this minecraft feature.
This feature cancels gamemode change packets to spectator gamemode, cancelling this Minecraft feature.
# Enabling
To enable this feature, open **config.yml** and set
@@ -18,9 +18,9 @@ prevent-spectator-effect:
```
# Permissions
| Permission | Description |
| ------------- | ------------- |
| `tab.spectatorbypass` | Players with this permission will see spectators the usual way despite this feature being enabled. If you don't want players (or even staff members) to bypass this feature, don't give them that permission. |
| Permission | Description |
|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `tab.spectatorbypass` | Players with this permission will see spectators the usual way despite this feature being enabled. If you don't want players (or even staff members) to bypass this feature, don't give them that permission. |
# Additional info
## Additional note 1 - Seeing yourself still as spectator
@@ -1,18 +1,22 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Introduction](#introduction)
* [Groups and users](#groups-and-users)
* [Per-world / per-server](#per-world--per-server)
* [Priority system](#priority-system)
* [Placeholder support](#placeholder-support)
* [Additional settings](#additional-settings)
* [Tips & Tricks](#tips--tricks)
* [config.yml](#configyml)
* [groups.yml and users.yml](#groupsyml-and-usersyml)
* [Format structure](#format-structure)
* [Global settings](#global-settings)
* [Per-world / per-server](#per-world--per-server)
* [Priorities](#priorities)
* [Placeholders](#placeholders)
* [PlaceholderAPI placeholders](#placeholderapi-placeholders)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [API](#api)
* [Examples](#examples)
* [Example 1 - Taking prefix/suffix from permission plugin](#example-1---taking-prefixsuffix-from-permission-plugin)
# About
This feature allows you to configure player name formats in the tablist.
It was added to minecraft in version 1.8.
It was added to Minecraft in version 1.8.
Versions 1.7 and lower only allow up to 16 characters including name,
which is too limiting and not supported by this plugin.
If you wish to have prefix/suffix for 1.7 and lower,
@@ -20,10 +24,25 @@ take advantage of [this client-sided mechanic](https://github.com/NEZNAMY/TAB/wi
which will appear in the tablist.
![image](https://user-images.githubusercontent.com/6338394/205877929-4df82c78-9773-4614-b4a3-93e1673d6046.png)
Settings of this feature can be configured in **config.yml** under **tablist-name-formatting** section.
# Configuration
## Introduction
This feature is configured in 2 parts based on what you are configuring. Some settings are in the **config.yml**, but prefix/suffix is configured in **groups.yml** and **users.yml**.
## config.yml
The first part can be configured in **config.yml** under **tablist-name-formatting** section. It controls everything except prefix and suffix.
This is how the default configuration looks:
```
tablist-name-formatting:
enabled: true
disable-condition: '%world%=disabledworld'
```
All of the options are explained in the following table.
| Option name | Default value | Description |
|-----------------------------|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enabled | true | Enables / Disables the feature |
| 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. |
## groups.yml and users.yml
### Format structure
The display name is split into 3 parts for convenience:
`tabprefix` - first part of the text, this is where prefix is usually configured
`customtabname` - second part of the text, it will be used as player name. If customtabname is not defined at all (not just setting empty value!), player's original name will be used instead
@@ -33,22 +52,20 @@ These values are then merged and displayed in the tablist.
![image](https://user-images.githubusercontent.com/6338394/205877510-e40f93ce-80df-46f2-84f0-c113e0e813e8.png)
You are free to use the 3 properties in any way you want since they are only split for convenience.
However, it is still a good idea to use them for their designed purpose to not get lost a poor configuration.
However, it is still a good idea to use them for their designed purpose to not get lost in a poor configuration.
This means that the text which should appear before player's name should be put into `tabprefix`,
any placeholder that is supposed to display player's name (such as from a nickname plugin)
should go into `customtabname` and any text that should appear after player's name should be put into `tabsuffix`.
## Groups and users
Properties can be applied in 2 ways: groups and users.
Users can be defined by both username and their UUID.
Values applied to users take priority over groups.
Example:
### Global settings
Properties can be applied in 2 ways: groups and users. Users can be defined by both username and their UUID. Values applied to users take priority over groups.
**groups.yml**
```
admin:
tabprefix: "&4&lAdmin &r"
```
This can also be achieved with commands, in this case `/tab group admin tabprefix "&4&lAdmin &r"`.
Or with an in-game command `/tab group admin tabprefix "&4&lAdmin &r"`.
**users.yml**
```
@@ -59,11 +76,11 @@ _NEZNAMY_:
237d8b55-3f97-4749-aa60-e9fe97b45062:
tabprefix: "&6&lTAB &r"
```
This can also be achieved with commands, in this case `/tab player _NEZNAMY_ tabprefix "&6&lTAB &r"` or `/tab playeruuid _NEZNAMY_ tabprefix "&6&lTAB &r"`.
Or with in-game commands `/tab player _NEZNAMY_ tabprefix "&6&lTAB &r"` and `/tab playeruuid _NEZNAMY_ tabprefix "&6&lTAB &r"` (the player must be online for uuid option to work).
Properties can also be set as "default" for everyone who does not have them defined.
For that purpose, a group keyword `_DEFAULT_` was made.
Example:
For that purpose, a group keyword `_DEFAULT_` was made.
Example:
**groups.yml**
```
admin:
@@ -72,8 +89,8 @@ _DEFAULT_:
tabprefix: "&7" # This will be displayed on everyone except admin
```
## Per-world / per-server
Values can also be applied per-world (and per-server on bungeecord), where they can be defined per group/user. These values take priority over global settings. Example:
### Per-world / per-server
Values can also be applied per-world (and per-server on a proxy), where they can be defined per group/user. These values take priority over global settings. Example:
**groups.yml**
```
per-world:
@@ -85,21 +102,22 @@ per-server:
_DEFAULT_:
tabprefix: "&a" # Everyone in server "server1" will have this prefix
```
For multiple worlds/servers to share the same settings, separate them with `;`.
For worlds/servers starting with a specified text, use `*` after shared part. For ending with a shared part, use `*` at the beginning.
For multiple worlds/servers to share the same settings, separate them with a`;`.
For worlds/server starting with a specified text, use `*` after shared part. For ending with a shared part, use `*` at the beginning.
Example:
```
per-world:
world1;world2:
_DEFAULT_:
tabsuffix: "Shared tabsuffix in worlds world1 and world2"
tabsuffix: "Shared tagsuffix in worlds world1 and world2"
lobby-*:
_DEFAULT_:
tabsuffix: "Suffix in all worlds starting with lobby-"
```
## Priority system
The full list of priorities looks like this:
### Priorities
The full list of priorities to choose correct prefix/name/suffix for a player looks like this:
1. value set using the [API](#api)
2. per-world / per-server applied to username
3. value applied to username
@@ -110,33 +128,31 @@ The full list of priorities looks like this:
8. value applied to player's group
9. value applied to group `_DEFAULT_`
This list is browsed through until the first match is found. If no match is found, empty value is used (except `customtabname`, which defaults to player's name).
This list is browsed through until the first match is found. If no match is found, empty value is used.
Values are taken independently of each other.
This means you can set per-world tabprefix, but only keep one global tabsuffix, for example.
You can see the source of a value displayed on player by using `/tab debug <player>` and checking "source"
part of the value you are looking for.
You can see the source of a value displayed on player by using `/tab dump <player>`, opening the link and checking "source"
part of the value you are looking for (tabprefix / customtabname / tabsuffix).
## Placeholder support
All values fully support [TAB's internal placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders#internal-placeholders) and [PlaceholderAPI placeholders](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders) including relational placeholders.
The number of placeholders is not limited, and they can be used in combination with static text as well.
# Placeholders
This feature does not offer any internal placeholders, only PlaceholderAPI placeholders.
## Additional settings
| Option name | Default value | Description |
| ------------- | ------------- | ------------- |
| enabled | true | Enables / Disables the feature |
| anti-override | true | When enabled, prevents other plugins from overriding TAB. This results in slightly higher CPU usage, but will make sure the function works as expected. <br />Unlike with teams, attempts to override TAB are not logged into anti-override.log file. This is due to high amount of false positives from TAB's own features, as well as bungeecord server switch, higher CPU usage and more. Whether you need this or not depends on how properly your plugins are configured. Some of them attempt to format tablist even if you'd not expect it from such plugin. Keep this enabled to stay safe. |
| 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. |
## PlaceholderAPI placeholders
Here are TAB's PlaceholderAPI placeholders you can use when this feature is enabled:
| Placeholder | Description |
|-------------|-------------|
| `%tab_tabprefix%` | Player's current tabprefix with placeholders parsed. |
| `%tab_customtabname%` | Player's current customtabname with placeholders parsed. |
| `%tab_tabsuffix%` | Player's current tabprefix with placeholders parsed. |
| `%tab_tabprefix_raw%` | Player's current raw tabprefix with placeholder identifiers. |
| `%tab_customtabname_raw%` | Player's current raw customtabname with placeholder identifiers. |
| `%tab_tabsuffix_raw%` | Player's current raw tabsuffix with placeholder identifiers. |
# Tips & Tricks
If you want TAB to only take prefixes/suffixes from your permission plugin,
delete all groups from **groups.yml** and only keep this:
```
_DEFAULT_:
tabprefix: "%luckperms-prefix%"
tabsuffix: "%luckperms-suffix%"
```
# Compatibility with other plugins
Tablist formatting is a feature that cannot be effectively handled by multiple plugins at once.
To make sure no other plugin sets tablist display names when not disabled in the plugin's config properly, TAB will block attempts to modify tablist display names coming from all other plugins (if this feature is enabled and not disabled for a player with a condition).
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
@@ -156,8 +172,25 @@ To get custom values previously set using the API (they will return `null` if no
* `TabListFormatManager#getCustomSuffix(TabPlayer)`
To get the original value set by the plugin based on configuration:
* `TabListFormatManager#getOriginalPrefix(TabPlayer)`
* `TabListFormatManager#getOriginalName(TabPlayer)`
* `TabListFormatManager#getOriginalSuffix(TabPlayer)`
* `TabListFormatManager#getOriginalRawPrefix(TabPlayer)` - Prefix with raw placeholder identifiers
* `TabListFormatManager#getOriginalRawName(TabPlayer)` - Name with raw placeholder identifiers
* `TabListFormatManager#getOriginalRawSuffix(TabPlayer)` - Suffix with raw placeholder identifiers
* `TabListFormatManager#getOriginalReplacedPrefix(TabPlayer)` - Prefix with all placeholders parsed
* `TabListFormatManager#getOriginalReplacedName(TabPlayer)` - Name with all placeholders parsed
* `TabListFormatManager#getOriginalReplacedSuffix(TabPlayer)` - Suffix with all placeholders parsed
**Note**: These values are only temporary, meaning they won't get saved anywhere and will get reset on player quit or plugin reload. If you wish to save these values into file, use [commands](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-playergroupplayeruuid-name-property-value-options).
**Note**: These values are only temporary, meaning they won't get saved anywhere and will get reset on player quit or plugin reload. If you wish to save these values into file, use [commands](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-playergroupplayeruuid-name-property-value-options).
# Examples
## Example 1 - Taking prefix/suffix from permission plugin
If you want TAB to only take prefixes/suffixes from the permission plugin,
delete all groups from **groups.yml** and only keep this:
```
_DEFAULT_:
tabprefix: "%luckperms-prefix%"
tabsuffix: "%luckperms-suffix%"
```
Or a PlaceholderAPI placeholder from your permission plugin if you use a different one.
> [!NOTE]
> When doing this, make sure you don't delete something you didn't mean to delete, for example ta**g**prefix and ta**g**suffix from nametag feature.
@@ -1,13 +0,0 @@
When a plugin for linking proxies is detected, TAB automatically enables its hook to add support for it.
No configuration is necessary.
Supported redis plugins:
* [RedisBungee](https://github.com/ProxioDev/RedisBungee)
Supported features:
* [Belowname](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Belowname)
* [Global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist)
* [Nametags](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags) & [Sorting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist)
* [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting)
* [Playerlist Objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective)
The hook does not and will never support [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout), which would require drastic changes to the feature itself and wouldn't be worth it, since the amount of visible players is usually even lower due to fixed slots and RedisBungee is used on networks with many players, so there will be enough players to work with anyway.
+5
View File
@@ -0,0 +1,5 @@
# About
A collection of things people have requested that I might look into implementing when I get extremely bored sometime next decade.
* Relational placeholder support in sorting
* 1.21.2+ sorting support
* disable-condition support in multi-server-support
+54 -30
View File
@@ -10,13 +10,15 @@
* [#9 - How to use space in prefix/suffix command?](#9---how-to-use-spaces-in-prefixsuffix-command)
* [#10 - Can I change/remove the green connection bar in tablist?](#10---can-i-changeremove-the-green-connection-bar-in-tablist)
* [#11 - Placeholder is not working](#11---placeholder-is-not-working)
* [#12 - How can I display ItemsAdder images?](#12---how-can-i-display-itemsadder-images)
* [#12 - How can I display images from resource pack plugin?](#12---how-can-i-display-images-from-resource-pack-plugin)
* [#13 - How can I use UTF characters in configuration?](#13---how-can-i-use-utf-characters-in-configuration)
* [#14 - Is there a way to remove all players from tablist?](#14---is-there-a-way-to-remove-all-players-from-tablist)
* [#15 - How to add images to tablist?](#15---how-to-add-images-to-tablist)
* [#16 - Is MiniMessage supported?](#16---is-minimessage-supported)
* [#17 - Is it possible to show the number of players in a specific group, similar to staffonline placeholder?](#17---is-it-possible-to-show-the-number-of-players-in-a-specific-group-similar-to-staffonline-placeholder)
* [#18 - Why is the plugin flagged as a virus by Windows defender?](#18---why-is-the-plugin-flagged-as-a-virus-by-windows-defender)
* [#19 - How can I show amount of online players on the entire network?](#19---how-can-i-show-amount-of-online-players-on-the-entire-network)
* [#20 - Why is LuckPerms prefix/suffix not updating on a network?](#20---why-is-luckperms-prefixsuffix-not-updating-on-a-network)
## #1 - Why are NPCs showing up in the tablist?
See [Citizens FAQ](https://wiki.citizensnpcs.co/Frequently_Asked_Questions#Why_are_NPCs_showing_up_in_the_tablist.3F).
@@ -24,7 +26,7 @@ See [Citizens FAQ](https://wiki.citizensnpcs.co/Frequently_Asked_Questions#Why_a
## #2 - How to make TAB work with LuckPerms?
* If you want to take prefixes/suffixes, check [this guide](https://github.com/NEZNAMY/TAB/wiki/Mini-guides-collection#taking-prefixessuffixes-from-permission-plugin) and use `%luckperms-prefix%` & `%luckperms-suffix%`.
* Sorting:
First, [Configure weights correctly in LuckPerms](https://github.com/NEZNAMY/TAB/wiki/How-to-setup-weights-priorities#luckperms). Then, you have 2 options:
First, configure weights correctly in LuckPerms. Then, you have 2 options:
* Configure [sorting by groups](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist#groups) (recommended).
* Sorting by weights directly: `PLACEHOLDER_HIGH_TO_LOW:%luckperms_highest_group_weight%`.
@@ -50,6 +52,8 @@ Most commonly used plugins for this are [FastLogin](https://www.spigotmc.org/res
which change connections of premium players who enabled it to online connections.
The same goes for disabling heads - you cannot disable them if you have online mode enabled.
Minecraft 1.21.9 has added [object components](https://github.com/NEZNAMY/TAB/wiki/How-to-use-Minecraft-components#object-components-1219), which allow you to display player heads. You can put for example `<head:name:%player%>` at the beginning of tabprefix to simulate this.
## #7 - Where can i find current default config files?
You can do any of the following:
* Check the [source code](https://github.com/NEZNAMY/TAB/tree/master/shared/src/main/resources/config).
@@ -68,25 +72,40 @@ Use "", for example `/tab group owner tabprefix "&2&lOwner&r "`
## #10 - Can I change/remove the green connection bar in tablist?
The connection bar is client sided and cannot be re-textured or removed by TAB.
You will need a custom minecraft client or a resource pack.
You will need a custom Minecraft client or a resource pack.
## #11 - Placeholder is not working
Most common reasons for a placeholder to not work include:
* Using % symbol by itself, which breaks placeholder starts and ends and therefore breaks all placeholders after it (use %% to display the symbol)
* Trying to use a PlaceholderAPI placeholder without downloading its expansion or not having PlaceholderAPI installed at all
* Trying to use [TAB's internal bukkit-only placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders#bukkit-only) on BungeeCord
* Trying to use [PlaceholderAPI placeholders on BungeeCord](https://github.com/NEZNAMY/TAB/wiki/How-to-set-up-PlaceholderAPI-support-on-bungeecord) without installing [bridge plugin](https://www.mc-market.org/resources/20631/)
* Trying to use [TAB's internal backend-only placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders#backend-only) on a proxy
* Trying to use PlaceholderAPI placeholders on proxy without installing [bridge plugin](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge)
The full list of reasons can be found on the [Placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders#placeholder-is-not-working) page.
## #12 - How can I display ItemsAdder images?
ItemsAdder offers placeholders, which return the respective symbol to which your desired image is bound to. You can get them using ItemsAdder's PlaceholderAPI expansion using their `%img_<name>%` placeholder. ItemsAdder's internal placeholders (`:something:`) will not work in TAB.
## #12 - How can I display images from resource pack plugin?
Images work by mapping a chosen character to an image in a resource pack.
When the game receives this character, it displays the image instead of the character.
What you need to do is send this character to the client.
Although resource pack plugins are not all the same, they all have things in common.
The first main functionality is offering placeholders.
You can use their PlaceholderAPI placeholders in TAB, and they will return the symbol, which then the client displays as an image.
The second main functionality is creating internal placeholders, which are different per plugin.
The plugin then listens to outgoing packets and replaces the internal placeholder with the symbol.
This can, however, fail.
Here are possible reasons why:
* You have TAB on proxy, so backend plugin cannot modify packets sent by the proxy
* TAB also listens to packets and modifies them to make sure no other plugin is overriding it. This mostly applies to [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting). TAB then ends up having the last shot, overriding the resource pack plugin.
In order to make sure images display properly, use PlaceholderAPI placeholders instead of internal placeholders of your resource pack plugins.
Here is some extra information for each resource pack plugin you might find useful:
* ItemsAdder:
* The PlaceholderAPI placeholders are formatted as `%img_<name>%`, internal placeholders (`:something:`) may not always work (see above).
* If you are unable to change the placeholder references from internal placeholders to PlaceholderAPI placeholders (for example, because they are defined in permission plugin and used elsewhere as well, where PlaceholderAPI isn't supported), you can use [PlaceholderAPI](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide)'s `imgfix` expansion that replaces format of given placeholders into the correct format.
Example: `%luckperms_prefix%` -> `%imgfix_{luckperms_prefix}%`
* Nexo:
* Here is a collection of tips from Nexo discord: <br /><img width="476" height="238" alt="image" src="https://github.com/user-attachments/assets/0eca8e9b-a73f-4e66-9c76-11a230e823b4" />
If you are unable to change the references
(for example, because they are defined in permission plugin and used elsewhere as well),
you can use [PlaceholderAPI](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide)'s `imgfix` expansion
that replaces format of given placeholders into the correct format.
Example: `%luckperms_prefix%` -> `%imgfix_{luckperms_prefix}%`
## #13 - How can I use UTF characters in configuration?
**Option 1**: [Save the file in UTF-8 encoding](https://github.com/NEZNAMY/TAB/wiki/How-to-save-the-config-in-UTF8-encoding) and use your desired symbol directly.
@@ -99,29 +118,23 @@ Using `''` will result in the text being display literally, not as a code.
**Note:** Minecraft does not support every single UTF symbol and displays unsupported symbols as a box. You can try sending your symbol into chat and see if it works or not. If not, it's not supported by MC.
## #14 - Is there a way to remove all players from tablist?
For a player to be visible in game, they must be in the tablist as well.
Remember the NPC in tablist issue?
If you don't mind players not appearing in the game, get a plugin that hides all players.
If you want to see them in the game, however, your only choice is to put a lot of empty lines into header,
In Minecraft, for a player to be visible in-game, they also need to appear in the tablist.
Remember the issue with NPCs showing up in the tablist? It's the same underlying mechanic.
If you're okay with players not being visible in the world, you can use a plugin that hides all players completely.
Since Minecraft 1.19.3, this limitation has been lifted — it's now possible to have entities in the game without showing them in the tablist.
However, the TAB plugin does **not** support removing all players from the tablist in any version of Minecraft.
An alternative solution using TAB is putting a lot of empty lines into header,
which will push all players out of the screen.
## #15 - How to add images to tablist?
You can check out [this reddit post](https://www.reddit.com/r/admincraft/comments/llrgty/comment/gnswdcz/?utm_source=share&utm_medium=web2x&context=3).
You can check out [this Reddit post](https://www.reddit.com/r/admincraft/comments/llrgty/comment/gnswdcz/?utm_source=share&utm_medium=web2x&context=3).
When using the symbol in configuration using \u format, remember to use `""` in config instead of `''`.
## #16 - Is MiniMessage supported?
Kind of.
MiniMessage support **is** included; however, this doesn't mean it is guaranteed to work.
Here are a few reasons why it may not work for you:
* MiniMessage library must be included in your server software. TAB does not include this library.
* It **is** included in Paper 1.16.5 and higher, Velocity and Sponge 8.
* It **is not** included in Spigot, any server software for 1.16.4 and lower, BungeeCord (and any of its forks), Sponge 7 and Fabric.
* You may not use any legacy color codes (&) in the text where you want MiniMessage support. If you use them, MiniMessage parser will throw an error. Therefore, if trying to use both legacy colors and MiniMessage syntax, MiniMessage syntax will not work.
* A plugin/mod might be shading an outdated/incomplete version of Adventure without relocating it, and java class loader might make TAB use the wrong source of the duplicated library.
This list is not final.
There might still be other reasons why MiniMessage won't work for you, which are not known yet.
If you believe MiniMessage should be supported on your server but doesn't work, open a bug report.
Yes, however, it must be included in your server software (it is only in Paper / Velocity). Read more about MiniMessage hook [here](https://github.com/NEZNAMY/TAB/wiki/How-to-use-Minecraft-components#minimessage).
## #17 - Is it possible to show the number of players in a specific group, similar to staffonline placeholder?
The plugin's internal placeholders are limited, and this kind of functionality is not included.
@@ -140,4 +153,15 @@ where plugin authors can see how many servers use their plugins (if they don't d
It also checks for CPU and OS types, which could be the reason for the false positive.
[Here](https://bstats.org/plugin/bukkit/TAB%20Reborn/5304) is one of TAB's pages as an example.
Windows defender could be flagging it for the same reason.
Windows defender could be flagging it for the same reason.
## #19 - How can I show amount of online players on the entire network?
If you have TAB installed on the proxy, use `%online%` placeholder.
If you have TAB installed on the backend servers, use `%bungee_total%` from [PlaceholderAPI](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide). This placeholder has an internal cooldown, which can be configured in `plugins/PlaceholderAPI/config.yml` under `expansions` -> `bungee` -> `check_interval`, default value is 30 (seconds).
## #20 - Why is LuckPerms prefix/suffix not updating on a network?
In order for LuckPerms instances to pick up the changes to player data in real time, it needs to communicate the changes between proxy ↔ backend.
If you notice changes not taking effect in TAB, try running `/lpb user <player> info` (or `/lpv` on velocity). If running the command updates it in TAB, that's the problem - LuckPerms instances not communicating in real time.
This is controlled by a LuckPerms setting called [messaging-service](https://luckperms.net/wiki/Syncing-data-between-servers#messaging-services). Set it to `pluginmsg` to make changes update immediately.
Additionally, make sure `auto-push-updates` is still `true` (it is by default already).
+10 -2
View File
@@ -1,5 +1,5 @@
# About the wiki
The wiki explains the functionality of the plugin as of version **5.0.2**.
The wiki explains the functionality of the plugin as of version **6.0.0**.
If your config looks different or is missing some features, you are using an old version of the plugin.
To get the latest version, check [releases](https://github.com/NEZNAMY/TAB/releases/).
Wiki for older plugin versions is not available.
@@ -10,8 +10,16 @@ This will give you knowledge to do things you had no idea were possible, giving
A lot of examples on the wiki use PlaceholderAPI placeholders without explaining its installation step by step. If you are going to use the examples and aren't familiar with the plugin, check out [Quick PlaceholderAPI startup guide](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide).
# Terminology
On order to not have to explain something every time it is mentioned, it will be explained here once.
| Name | Description |
|----------------|-----------------------|
| proxy server | Server running BungeeCord or Velocity software, which are used to connect multiple servers, allowing easy transfer between them. |
| modded server | Fabric, Forge and NeoForge. |
| backend server | Minecraft server that is actually being played on, not a proxy. This includes Bukkit (and its forks) and modded servers |
# Limitations of plugins
TAB is a plugin.
TAB is a plugin (even on modded platforms, it is only a server-sided mod).
It only modifies the server behavior to your liking.
It does not add anything into the game.
Because of that, you'll need
@@ -2,7 +2,7 @@
* [About](#about)
* [Option 1: Primary group from permission plugin](#option-1-primary-group-from-permission-plugin)
* [Option 2: Permission nodes](#option-2-permission-nodes)
* [Taking groups from backend servers when TAB is on BungeeCord](#taking-groups-from-backend-servers-when-tab-is-on-bungeecord)
* [Taking groups from backend servers when TAB is on proxy](#taking-groups-from-backend-servers-when-tab-is-on-proxy)
## About
TAB uses groups to assign properties (such as tabprefix) and sort players in tablist (if sorting by groups). You have 2 ways of configuring primary groups of players in TAB.
@@ -12,13 +12,17 @@ First option hooks into your permission plugin and takes groups from it. Therefo
If your permission plugin is not supported, you can use [Option 2](#option-2-permission-nodes).
## Option 1: Primary group from permission plugin
This is the default method and recommended. TAB will ask your permission plugin for player's primary group.
To use it, keep `assign-groups-by-permissions: false` in your config.
This is the default method and recommended.
TAB will ask your permission plugin for player's primary group.
There are 2 simple steps to this:
* Keep `assign-groups-by-permissions: false` in your config
* Put players into groups in your permission plugin
> [!CAUTION]
> If assigning players into multiple groups, make sure their weights are correct
> (for luckperms /lp group \<group\> setweight \<number\>).
Put players into groups in your permission plugin
(remember to configure weights - for luckperms /lp group \<group\> setweight \<number\>).
**Verify** group using `/tab debug <player>`. It should say `Primary permission group: <your group>`.
> [!TIP]
> Verify player's group using `/tab dump <player>`, opening the link and check "permissionGroup" in player info.
## Option 2: Permission nodes
Instead of taking whole groups, TAB will check for permission nodes and assign groups based on the highest permission.
@@ -31,13 +35,18 @@ Instead of taking whole groups, TAB will check for permission nodes and assign g
#2 - if a player has permission for more than one group, the list will be used to pick the correct one
(the one higher in the list).
**Remember that OP = all permissions!** That's the whole point of OP function. To grant all permissions. In that case, you need to negate permissions in your permission plugin for other groups which are higher than player's wanted group (depending on your permission plugin it can be achieved using `-tab.group.groupname` or setting the permission value to false).
> [!WARNING]
> Remember that OP = all permissions!
> That's the whole point of OP function.
> To grant all permissions.
> In that case,
> you need to negate permissions in your permission plugin for other groups which are higher than player's wanted group.
# Taking groups from backend servers when TAB is on BungeeCord
# Taking groups from backend servers when TAB is on proxy
By default, TAB takes groups from the permission plugin installed on the same server instance.
In the case of proxy installation, groups are by default taken from the proxy.
To see how is your proxy permission plugin configured, use its respective command
(for LuckPerms it's `/lpb user <player> info` instead of `/lp`).
(for LuckPerms it's `/lpb user <player> info` on BungeeCord and `/lpv user <player> info` on Velocity).
If you don't have your permission plugin synced using MySQL for sharing groups and don't wish to, and want groups to be taken from backend servers instead, enable the config option:
```
@@ -1,6 +1,7 @@
# Content
* [Tablist](#tablist)
* [Nametag](#nametag)
* [Proper compatibility with plugins that change profile name](#proper-compatibility-with-plugins-that-change-profile-name)
* [Tips & Tricks](#tips--tricks)
* [Tip 1 - Nickname prefix](#tip-1---nickname-prefix)
* [Tip 2 - Sorting nicked players with the lowest priority](#tip-2---sorting-nicked-players-with-the-lowest-priority)
@@ -22,15 +23,28 @@ or using in-game command `/tab group _DEFAULT_ customtabname %essentials_nicknam
This example uses `%essentials_nickname%` placeholder from Essentials. Giving it to `_DEFAULT_` group keyword makes it a default value for all groups that do not override this property.
**WARNING: Do NOT put nickname placeholder into tabprefix! You will end up with double names!**
> [!CAUTION]
> Do NOT put nickname placeholder into tabprefix!
> You will end up with double names!
> Put the nickname placeholder into customtabname instead.
# Nametag
Nametags are more complicated because they consist of player's username, team prefix and team suffix.
There is no intended way to do this.
The only way is changing it using a nickname plugin.
Some nickname plugins actually change name in game profile, which also changes it in nametag.
You will need to find one that offers this and then use it.
This is a complicated process with lots of side effects, so TAB does not offer it.
**TLDR: TAB does not offer this functionality**.
With that out of the way, let's learn more about this issue.
Unlike with tablist name formatting, which is a single component containing everything (and therefore fully customizable), nametags are different.
They consist of prefix and suffix components (coming from scoreboard teams) and name itself.
This name is contained in player info packet (coincidentally the same one that controls tablist format), along with player's skin and other things.
This name is limited to 16 characters (since Minecraft doesn't allow longer names) and since it's not a component, naturally it does not support RGB colors.
Strangely enough, legacy codes using `§` work, but they further limit the length of the rest of the name.
There are really only 2 ways to achieve this solution:
* **Change the profile name** - This requires sending player info packet that removes the old player and adds a new one with the same name. Then respawn the player. Additionally, it requires a lot of packets to be sent to the affected player, since you cannot just remove & add self, as well as a lot of other packets to restore previously sent data. These packets have been changing a lot with various MC versions. A lot of them cannot even be sent from a proxy server. As such, TAB does not offer this functionality, since it would be very limited anyway (see above) and require a lot of adapting for proper functionality.
If you decide to use a plugin with this functionality, keep in mind it breaks all name-bound features, such as scoreboard teams, belowname or playerlist objective. See below for compatibility information.
Example third party plugins that offer this: None?
* **Use an armor stand / text display to show any text** - TAB no longer offers this functionality ([here's why](https://gist.github.com/NEZNAMY/f4cabf2fd9251a836b5eb877720dee5c)), so you will need to look into other plugins.
If you decide to use a plugin with this functionality, just remember to make the vanilla nametag invisible, so you don't see both vanilla nametag and the entity (`invisible-nametags: true`).
Example third party plugins that offer this: [UnlimitedNameTags](https://www.spigotmc.org/resources/unlimitednametags.117526/), [DisplayNameTags](https://github.com/Matt-MX/DisplayNameTags), [NotJustNamePlates](https://github.com/YouHaveTrouble/NotJustNameplates), [CustomNameplates](https://polymart.org/product/2543/customnameplates)
# Proper compatibility with plugins that change profile name
If using a nickname plugin that changes player's profile name to change it in the name tag,
@@ -38,8 +52,12 @@ this has lots of side effects.
Most notably, it breaks all name-bound features,
especially [nametags](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags) and [sorting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist).
For that reason, TAB must detect name change.
This is done automatically on Bukkit, BungeeCord and Fabric.
This detection is not available on Sponge and Velocity.
> [!WARNING]
> If you have TAB installed on backend server and a proxy plugin changes nickname, TAB is not able to detect this change, since the modified packets never actually go through the backend server where TAB is installed.
> [!TIP]
> If automatic detection is not working for you (you use proxy plugin for changing names while TAB is on backend), you can use [this API method](https://github.com/NEZNAMY/TAB/blob/master/api/src/main/java/me/neznamy/tab/api/TabPlayer.java#L88) to let TAB know player's name changed.
In order for TAB to properly detect name change, player UUID must remain the same,
otherwise it's a random entry with a random uuid and random name, which TAB isn't able to match with actual players.
@@ -59,12 +77,12 @@ conditions:
nick:
conditions:
- '%essentials_nickname%=%player%'
yes: "%player%" # If nickname = player name -> player is not nicked
no: "~%essentials_nickname%" # If nickname != player name -> player is nicked
true: "%player%" # If nickname = player name -> player is not nicked
false: "~%essentials_nickname%" # If nickname != player name -> player is nicked
```
Then, use `%condition:nick%` in your `customtabname` instead of the placeholder directly.
# Tip 2 - Sorting nicked players with the lowest priority
## Tip 2 - Sorting nicked players with the lowest priority
Let's say your sorting list looks like this:
```
sorting-types:
@@ -77,8 +95,8 @@ conditions:
group:
conditions:
- '%haonick_isNicked%=true'
yes: "default"
no: "%group%"
true: "default"
false: "%group%"
```
When the condition is met, meaning player is nicked, it will return the group we want nicked players to be sorted as, in this case `default`. Otherwise, return player's actual group.
The condition check may differ with different nickname plugins. You will need to check documentation of your nickname plugin to see what kind of placeholders it offers and what they return (you can also use `/tab parse` to see what exactly did a placeholder return).
@@ -11,11 +11,10 @@ Glow color is managed by scoreboard teams, which also handle nametag formatting
## Solution
The solution to get around this issue is to use the glow plugin's placeholder (if it has any).
This placeholder has to be at the end of the player's `tagprefix` as it has to be the last color in the prefix.
**NOTE:
For Minecraft version 1.9 -
1.12 the prefix can't be longer than 14 characters due to [16-character limit](https://github.com/NEZNAMY/TAB/wiki/Limitations#name-tags) total
(glow placeholder adds 2 characters - `&` and the color code)**
This placeholder has to be at the end of the player's `tagprefix` as it has to be the last color in the prefix.
> [!WARNING]
> For Minecraft versions below 1.13 the prefix can't be longer than 14 characters due to [16-character limit](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags#limitations) total
(glow placeholder adds 2 characters - `&` and the color code)
**Example:**
This example uses the placeholder of the [eGlow](https://www.spigotmc.org/resources/63295/) plugin.
@@ -3,6 +3,7 @@
* [Notepad++](#notepad-1)
* [Sublime Text 3](#sublime-text-3)
* [WinSCP](#winscp)
* [VSCode](#vscode)
***
# Notepad
@@ -25,4 +26,9 @@ Open the file > Click encoding > Click UTF-8 (if that didn't work, use Convert t
# WinSCP
Open the file in WinSCP and check if it is in UTF-8 encoding already (1). If it is not, click on ENCODING at the top (2), select UTF-8 (3) and then save the file. You can now edit the file as you like and paste in characters.
![](https://i.ibb.co/nRxDmHk/Win-SCP-Xlxw-Qfft-Cb.png)
![](https://i.ibb.co/dP77yzp/Win-SCP-UXWc4-Xdp2-N.png)
![](https://i.ibb.co/dP77yzp/Win-SCP-UXWc4-Xdp2-N.png)
# VSCode
At the bottom right of VSCode, you can change the current file's encoding. It'll open a pop-up where you can select UTF-8
![](https://github.com/user-attachments/assets/3ca885ee-24fb-47a5-863b-46b69df42e3a)
![](https://github.com/user-attachments/assets/ceab40b0-d875-4292-9d75-414557c7d4f8)
@@ -0,0 +1,202 @@
# Content
* [About](#about)
* [RGB Colors (1.16+)](#rgb-colors-116)
* [Usage](#usage)
* [Magic codes](#magic-codes)
* [Invalid code handling](#invalid-code-handling)
* [Compatibility with <1.16](#compatibility-with-116)
* [Fonts (1.16+)](#fonts-116)
* [Usage](#usage-1)
* [Compatibility with RGB and gradients](#compatibility-with-rgb-and-gradients)
* [Shadow color (1.21.4+)](#shadow-color-1214)
* [Object components (1.21.9+)](#object-components-1219)
* [Atlas sprite](#atlas-sprite)
* [Player sprite](#player-sprite)
* [Compatibility with < 1.21.9](#compatibility-with--1219)
* [MiniMessage](#minimessage)
* [Config options](#config-options)
* [Tips & Tricks](#tips--tricks)
* [Tip 1 - Manually defining legacy color](#tip-1---manually-defining-legacy-color)
# About
In Minecraft 1.7, new feature called components was introduced. This is an upgrade from using legacy colors (using § symbol) into creating a JSON object where text, color, and magic codes (boolean values) are separated.
Additionally, it received new features called hover event and click event. The only place this affects is chat, which TAB does not handle, so these functions are not implemented by TAB at all.
Components have been receiving a lot of new functions since then, which are explained below.
There are also a few config options for components. You can find them in your **config.yml** under `components` section. They are explained [below](#config-options).
# RGB colors (1.16+)
As of 1.16, mojang introduced RGB color support.
This allows us to use 16,777,216 different colors instead of the original 16 ones.
This is not supported on <1.16 in any way.
## Usage
Supported RGB formats:
* `#RRGGBB`
* `&#RRGGBB`
* `{#RRGGBB}`
* `#<RRGGBB>`
* `&x&R&R&G&G&B&B`
Gradients:
* `<#RRGGBB>Text</#RRGGBB>`
* `{#RRGGBB>}Text{#RRGGBB<}`
* `<$#RRGGBB>Text<$#RRGGBB>`
TAB uses the first by default, but is able to accept the other types as well without leaving any characters (such as `{}`) behind.
**Gradients only support 2 colors, using more will result in an invalid syntax and won't work.**
> [!CAUTION]
> Remember to replace `RRGGBB` with actual hexadecimal numbers (0-9, a-f)!
You can use a tool like [this one](https://htmlcolorcodes.com/) to easily find suitable colors.
## Magic codes
Just like with legacy colors, use color first, then magic codes (in any order). For example with **bold**: `#00FFFF&lText`.
For gradients, put the magic codes inside the text. Example: `<#00FF00>&lBold gradient text</#FF00FF>`.
## Invalid code handling
In case you accidentally use invalid hex color code, the plugin will simply ignore it and keep it in raw format.
## Compatibility with <1.16
Since <1.16 clients do not understand these color codes, something else must be displayed instead.
TAB, server software or viaversion (depending on your setup)
will find the closest legacy color to the desired RGB combination and will use that color instead.
# Fonts (1.16+)
The plugin offers usage of the font feature introduced in Minecraft 1.16.
> [!IMPORTANT]
> This does NOT refer to different character sets!
> This refers to different fonts defined in resource packs or MC itself.
## Usage
The syntax is `<font:FONT_NAME>Text</font>` where `FONT_NAME` is name of your desired font.
**Example**
`<font:minecraft:alt>This is a text written in minecraft enchantment table language which no one understands</font>`
**Result**
![image](https://github.com/NEZNAMY/TAB/assets/6338394/9a19cb1b-2761-4500-b058-2e7a7cd68d14)
## Compatibility with RGB and gradients
When trying to use both font and RGB or gradients, font must be outside and RGB/gradients inside.
**Example**
`<font:minecraft:alt><#00FF00>This is a colorful text written in minecraft enchantment table language which no one understands, but it looks pretty</#FF0000></font>`
**Result**
![image](https://github.com/NEZNAMY/TAB/assets/6338394/81da5bc4-1920-4dad-bcf5-002b5de741f8)
# Shadow color (1.21.4+)
TAB (currently?) does not have any built-in way to convert text input into shadow color field. However, you can use [MiniMessage](#minimessage) for that. TAB will properly read this value from adventure components and convert it further into Minecraft components.
# Object components (1.21.9+)
A new component of "object" type was added into the game in 1.21.9. It currently has 2 implementations described below.
## Atlas sprite
This type allows you to display any item or block. The syntax is
```
<sprite:ATLAS:SPRITE>
```
where `ATLAS` is the atlas and `SPRITE` is the sprite. Note that atlas can contain the `:` symbol. In order to make TAB recognize it properly, wrap at least the first value into quotes.
Example:
```
header:
- '&bDiamond helmet: <sprite:"minecraft:items":"minecraft:item/diamond_helmet">'
- 'Diamond chestplate: <sprite:"minecraft:items":"minecraft:item/diamond_chestplate">'
- 'Diamond leggings: <sprite:"minecraft:items":"minecraft:item/diamond_leggings">'
- 'Diamond boots: <sprite:"minecraft:items":"minecraft:item/diamond_boots">'
```
<img width="386" height="101" alt="image" src="https://github.com/user-attachments/assets/e9a66305-2ae4-44f4-9d8e-a227fb7591e4" />
> [!IMPORTANT]
> These values change over MC versions (for example items were in `minecraft:blocks` atlas in 1.21.9 - 1.21.10, but got moved to `minecraft:items` in 1.21.11), so make sure you are using the correct values for your MC version. For proxy installations, you may need to use conditional placeholders and check for player's version. On backend, ViaVersion may or may not automatically translate these.
> [!TIP]
> For full list of available sprites you can check out https://www.gamergeeks.net/apps/minecraft/list-of-atlas-sprites. However, it doesn't contain any information regarding different Minecraft versions.
## Player sprite
> [!WARNING]
> In order to use these, you will need to disable MiniMessage support, because head components were not added to MiniMessage yet. Even when they are added, they will have a different syntax, so TAB will be updated to match the format to avoid complications. For now, use the existing syntax for prototyping and testing. To disable MiniMessage support, set:
> ```
> components:
> minimessage-support: false
> ```
> in **config.yml**.
This type allows you to display Minecraft heads. There are 3 ways to define a head:
| Type | Functionality |
|--------------------------|---------------------------------------------------------------------------|
| Player name | The client checks recently received profiles (players on current server) and shows skin of player with that name. If no such player was found, connects to Mojang and gets skin of player with specified name. <br />**Note**: This means using a plugin for changing skins will result in the skin being changed here too (the client has a cache, so it won't be visible immediately (restarting the client resets the cache)). If using offline mode and no skin plugin, head won't display correct skin even if such player is registered at Mojang. |
| Player UUID | The client checks recently received profiles (players on current server) and shows skin of player with that UUID. If no such player was found, connects to Mojang and gets skin of player with specified UUID. <br />**Note**: This means using a plugin for changing skins will result in the skin being changed here too (the client has a cache, so it won't be visible immediately (restarting the client resets the cache)). |
| Skin value and signature | The client displays skin from given value and signature |
Here are all the ways you can display player skins using TAB and their implementation (using `ALL CAPS` for "placeholder" text instead of `<>` to avoid confusion as `<>` is actual part of the syntax):
| Syntax | Explanation | Implementation |
|-----|-------------|------------|
| `<head:name:NAME>` | Shows head defined by player name | name |
| `<head:id:UUID>` | Shows head defined by player UUID | uuid |
| `<head:signed_texture:VALUE;SIGNATURE>` | Shows head defined by value and signature | value and signature |
| `<head:player:NAME` | Connects to Mojang and retrieves value and signature of defined player | value and signature |
| `<head:mineskin:ID>` | Connects to Mineskin and retrieves value and signature of specified upload ID | value and signature |
| `<head:texture:TEXTURE>` | Gets the texture from `http://textures.minecraft.net/texture/TEXTURE` | value and signature |
Here is an example for all types:
```
footer:
- 'Head by id: <head:id:%uuid%>' # This will obviously not work in offline mode
- 'Head by name: <head:name:%player%>' # May or may not work in offline mode (see above for full explanation)
- 'Head by raw texture: <head:signed_texture:ewogICJ0aW1lc3RhbXAiIDogMTc1NjMxNjc0OTk4MywKICAicHJvZmlsZUlkIiA6ICIyMzdkOGI1NTNmOTc0NzQ5YWE2MGU5ZmU5N2I0NTA2MiIsCiAgInByb2ZpbGVOYW1lIiA6ICJfTkVaTkFNWV8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmY1ZTNhNWRmODkxYzEzMTdhZjUzMmMzNmY4NDgxNDBhNDBmMGZhMGNlZGRmZmEwNWU5NGU1NzU1OGQxY2Q4YyIKICAgIH0KICB9Cn0=;YFVoqA0CqWgnZhme5s/M7xtadURyLkyLWVsh0vN8BqdfwzN32nqlBJb2pRjkxIs0V21EOeKbGFjgdKQKzPRQdf6sTFQ/x0KOjUg8A/neAiwCvDSDrsTQ2Yf7yoVP6M2PpuB7te19N+I139mGY5psxU100x6GiV/uFfpUfG3XBJog43JtXzRJ9fRtoSeIEzqLrkpCmt6o5Mzo6GZFZc4CtI76OU90Mg9ZvTZTYelvtjFtllxTtkNZCcglzvh5R19+qtzLOzEr+N8m4Ed+5yZyezEb3LeeSgmbSLIjuOKuUupE+2F6yVYP3eKhgGLZ2G+cg9TZZjTCsNMzHqewM/1+qStzTQCdNmggXCGcIfC8HcYsBfdv4SicxBq8ff+BDyveFZMFyREpQNqX/fLmlz16cmxHvBQ9qqA+IzIsBJ7i/mrG78jBhkJsvtcHMHvTviXascCSQP1TCn58D6HJ/Agww6HFTJe/B6sX0Utzm0URE4jZK7wnhrx0q2H8OkCXc5ZwuXALqtvk0uWmZo2RMnIGQNi4nb5AUsGV8pNirhS16MfqZeJ4q0HGaIVscRp4jazab6kMVKusbuqQB1cZNbaao7mP1HAUVCd5geWQL4CQQIc6gv0q3KT2E45d0YeYqpy/RppKMWmg1+aQ5wVGQW4/p2mqXos71FKy6vP0ur6txd8=>'
- 'Head by player: <head:player:%player%>'
- 'Head by mineskin: <head:mineskin:37e93c8e12cd426cb28fce31969e0674>'
- 'Head by texture: <head:texture:ff9bb9e56125c8227b94bbda9f6e0f862931c229255ba8f1205d13c44c1bb561>'
```
<img width="331" height="111" alt="image" src="https://github.com/user-attachments/assets/5912975a-a892-42c3-b9ab-7eab33ee42b6" />
## Compatibility with < 1.21.9
You may be wondering what happens when you try to use these and the client is below 1.21.9.
See table below for behavior based on your setup.
| Setup | Legacy text decider | Displayed text for <1.21.9 players |
|-----------------|---------------------|-----------------------------------------------------------------------|
| Backend <1.21.9 | TAB | `<Object components were added in 1.21.9>` (even for 1.21.9+ players) |
| Backend 1.21.9+ | ViaVersion | (empty text) |
| BungeeCord | TAB | `<Object components were added in 1.21.9>` |
| Velocity | (no one) | Client disconnects with a packet decoding error |
# MiniMessage
TAB has [MiniMessage](https://docs.advntr.dev/minimessage/format.html) hook, however, it does not include this library on its own. Including it would cause conflicts, so it has to be included in the server software.
* It **is** included in **Paper 1.18.2+**, **Velocity** and **Sponge**.
* It **is not** included in **Spigot**, any server software for **1.18.1-**, **BungeeCord**, **Fabric**, **Forge** and **NeoForge**.
When MiniMessage is detected on your server, it is automatically used. All codes are translated to MiniMessage syntax and then parsed by MiniMessage.
# Config options
| Option name | Default value | Description |
|--------------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------|
| minimessage-support | true | Enables / Disables MiniMessage support (if it's available). |
| disable-shadow-for-heads | true | Automatically disables shadows for head object components (1.21.9+) to match the appearance of online-mode heads, which don't use shadows. |
# Tips & Tricks
## Tip 1 - Manually defining legacy color
For features that don't depend on any other players (header/footer, bossbar, scoreboard), you can easily specify legacy color instead of automatic rounding for <1.16 players. This can be done using [conditional placeholders](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders).
Check for `%player-version-id%`, which returns network protocol id of the version, which can be easily compared to. 1.16's version is `735`. Final condition may look like this:
```
conditions:
rgb:
conditions:
- '%player-version-id%>=735'
true: "#00FF00 RGB text"
false: "&a Legacy text"
```
Then, use this condition with `%condition:rgb%`.
This will not work in nametags and tablist formatting, because this would parse the condition for target player, not the viewer. To achieve this, you'll need a custom-made [relational placeholder](https://github.com/NEZNAMY/TAB/wiki/Placeholders#relational-placeholders) that checks for viewer's version.
@@ -1,89 +0,0 @@
# Content
* [Introduction](#introduction)
* [Usage](#usage)
* [Magic codes](#magic-codes)
* [Invalid code handling](#invalid-code-handling)
* [Compatibility with <1.16](#compatibility-with-116)
* [Manually defining legacy color](#manually-defining-legacy-color)
* [Fonts](#fonts)
* [Usage](#usage-1)
* [Compatibility with RGB and gradients](#compatibility-with-rgb-and-gradients)
# Introduction
As of 1.16, mojang introduced RGB color support.
This allows us to use 256^3 different colors instead of the original 16 ones.
This is not supported on <1.16 in any way.
# Usage
Supported RGB formats:
* `#RRGGBB`
* `&#RRGGBB`
* `{#RRGGBB}`
* `#<RRGGBB>`
* `&x&R&R&G&G&B&B`
Gradients:
* `<#RRGGBB>Text</#RRGGBB>`
* `{#RRGGBB>}Text{#RRGGBB<}`
* `<$#RRGGBB>Text<$#RRGGBB>`
TAB uses the first by default, but is able to accept the other types as well without leaving any characters (such as `{}`) behind.
**Gradients only support 2 colors, using more will result in an invalid syntax and won't work.**
**Remember to replace `RRGGBB` with actual hexadecimal numbers, for example `FFAA00`** (yes, some people straight up copy "RRGGBB" and ask why it is not working):
This color code has 256 red, 170 green and 0 blue. It is equal to the legacy color `6` (gold/orange).
You can use a tool like [this one](https://htmlcolorcodes.com/) to easily find suitable colors.
## Magic codes
Just like with legacy colors, use color first, then magic codes (in any order). For example with **bold**: `#00FFFF&lText`.
For gradients, put the magic codes at the beginning of text. For example `<#00FF00>&lBold gradient text</#FF00FF>`.
# Invalid code handling
In case you accidentally use invalid hex color code, the plugin will simply ignore it and keep it in raw format.
# Compatibility with <1.16
Since <1.16 clients do not understand these color codes, something else must be displayed instead. The plugin will find the closest legacy color to the desired RGB combination and will use that color instead.
## Manually defining legacy color
If you want to specify a legacy color to use instead of plugin finding the closest one, you can define it by adding `|L` after RGB code, where `L` is a legacy color to use (0-9 a-f).
Usage for classic codes:
* `#RRGGBB|L`
* `&#RRGGBB|L`
* `{#RRGGBB|L}`
* `#<RRGGBB|L>`
* `<#RRGGBB|L>`
* `&x&R&R&G&G&B&B|L`
For gradients,
defining color will result in the whole text
having the same color instead of each character converting to the closest colors,
resulting in color groups.
To define it, put `|L` after the beginning color of gradient.
Usage:
* `<#RRGGBB|L>Text</#RRGGBB>`
* `{#RRGGBB|L>}Text{#RRGGBB<}`
* `<$#RRGGBB|L>Text<$#RRGGBB>`
# Fonts
The plugin offers usage of the font feature introduced in Minecraft 1.16.
**Warning!** This does NOT refer to different character sets! This refers to different fonts defined in resource packs or MC itself.
## Usage
The syntax is `<font:FONT_NAME>Text</font>` where `FONT_NAME` is name of your desired font.
**Example**
`<font:minecraft:alt>This is a text written in minecraft enchantment table language which no one understands</font>`
**Result**
![image](https://github.com/NEZNAMY/TAB/assets/6338394/9a19cb1b-2761-4500-b058-2e7a7cd68d14)
## Compatibility with RGB and gradients
When trying to use both font and RGB or gradients, font must be outside and RGB/gradients inside.
**Example**
`<font:minecraft:alt><#00FF00>This is a colorful text written in minecraft enchantment table language which no one understands, but it looks pretty</#FF0000></font>`
**Result**
![image](https://github.com/NEZNAMY/TAB/assets/6338394/81da5bc4-1920-4dad-bcf5-002b5de741f8)
+30 -21
View File
@@ -1,47 +1,56 @@
# Content
* [Bukkit/Spigot](#bukkitspigot)
* [BungeeCord](#bungeecord)
* [Backend](#backend)
* [Proxy](#proxy)
* [Proxy installation](#proxy-installation)
* [Backend installation](#backend-installation)
* [Mixed installation](#mixed-installation)
* [Updating the plugin](#updating-the-plugin)
# Bukkit/Spigot
Installation on Bukkit/Spigot/Paper is as simple as it can be.
Put the plugin into the plugins folder and restart the server.
Dynamic (re)loads at runtime such as `/plugman load tab` to load the plugin are fully supported.
However, plugins hooking into TAB may break when you use plugman to reload it.
# Backend
Installation on backend servers is as simple as it can be.
Put the plugin into the plugins folder and restart the server.
# Proxy
When running a network, you have 3 options:
* Installing TAB only on the proxy (recommended)
* Installing TAB on all backend servers instead
* Installing TAB everywhere and disabling features, so they don't conflict (not recommended)
See below for more information regarding each way.
# BungeeCord
## Proxy installation
This is the recommended setup.
Put the plugin into the plugins folder of the proxy server and restart it.
**Recommended**:
Install [TAB-Bridge](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) on your backend servers for PlaceholderAPI support and more.
Install [TAB-Bridge](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) on your **backend servers** for PlaceholderAPI support and more.
**Recommended**:
On **Velocity** installation install [VelocityScoreboardAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/) plugin for scoreboard-related features to work.
If you are using **Velocity**,
install [VelocityScoreboardAPI](https://github.com/NEZNAMY/VelocityScoreboardAPI/) plugin **on the proxy** for scoreboard-related features to work.
**Note**: With proxy installation use **/btab** command instead of **/tab**.
> [!NOTE]
> With proxy installation, use **/btab** command instead of **/tab**.
Advantages of proxy installation compared to installing on all backend servers instead:
* Can use the [Global player list](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist)
* Can use new content for new clients even if a backend server version is old (1.16+ RGB codes, 1.20.3+ scoreboard features)
* Can use the [Global player list](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) without requiring Redis set up
* [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) can work with all players connected to the proxy
* Avoid [header/footer](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Header-&-Footer#additional-note-1---not-resetting-on-server-switch) and [bossbar](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Bossbar#additional-note-2---not-hiding-on-server-switch) not disappearing on server switch
* Configuration files in a single place for easier editing / no need to use MySQL for syncing data
* Can use new features for new players even if backend is using an older version (RGB, 1.20.3+ NumberFormat and more).
Disadvantages compared to installing on all backend servers instead:
* No [per-world player list](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Per-world-playerlist) (can be achieved by installing the plugin on backend servers and disabling all features except the per-world player list)
## Backend installation
Just like when not using BungeeCord, install the plugin on all servers where you want the plugin. However, this setup is not recommended (see advantages of proxy installation).
Just like when not running a network, install the plugin on all servers where you want the plugin. However, this setup is not as good (see advantages of proxy installation).
## Mixed installation
Mixed installation is absolutely not recommended and should be avoided.
It requires you to disable features to make only 1 instance handle a single feature at a time,
which most people fail miserably to do,
resulting in issues such as header/footer flashing between proxy and backend configuration.
With bridge, you are able to achieve almost anything with proxy installation.
Mixed installation is absolutely not supported and should be avoided.
There is no sort of communication between backend and proxy TAB installations (this is only done by TAB-Bridge, which doesn't do anything on its own). Having TAB on both proxy and backend is effectively installing 2 plugins to do the same thing, which will naturally cause issues (although TAB's anti-override for key features should help with this).
If you really wish to proceed (for example having feature X handled by proxy and feature Y on backend), make sure to properly disable features (`enabled: false`) to avoid problems. However, the only case where this makes any sense is per world playerlist feature, which is not available on proxies. Everything else can be done from proxy side.
# Updating the plugin
Updating the plugin is always as simple as replacing old jar with the new one.
@@ -52,5 +61,5 @@ TAB will automatically convert your existing configuration files to the latest f
(most notably 2.9.2 → 3.0.0, but any other changes as well).
Downgrading is completely unsupported, as an old plugin version cannot know what the future config format is / will be.
Just like Minecraft itself.
There is no reason for downgrading anyway, as every version is superior to older versions released before it.
Just like Minecraft itself, although TAB won't fail with an error message like Minecraft does, but you will get warnings and / or features not working correctly.
There is no reason for downgrading anyway, since in general, every version is typically superior to older versions released before it.
+3 -7
View File
@@ -1,10 +1,10 @@
# About
This is collection if minecraft issues/bugs you may experience when using TAB, which are not TAB bugs and cannot be fixed with a plugin.
This is collection if Minecraft issues/bugs you may experience when using TAB, which are not TAB bugs and cannot be fixed with a plugin.
# 1.5.x - 1.12.x - Unwanted space
You may see unwanted space at the end of a line of text even if you didn't configure any.
This is a client sided bug.
To avoid it, add &r after ending bold segment (for example, prefix &4&lAdmin&r&6).
To avoid it, add `&r` after ending bold segment (for example, prefix `&4&lAdmin&r&6`).
# 1.15.x - Strikethrough and underline
Using &m (strikethrough) and &n (underline) does not work in header,
@@ -12,8 +12,4 @@ last line of the scoreboard and possibly other places
([MC-180110](https://bugs.mojang.com/browse/MC-180110)).
# 1.20 - 1.20.4 - Chat over tablist
Visual bug rendering chat over the tablist ([MC-263256](https://bugs.mojang.com/browse/MC-263256)).
# 1.20.3+ - Text not bold
Since 1.20.3 text configured to be bold (using &l) may not appear bold. Steps to reproduce are currently unknown, if you have any information that may help, let us know.
Clue #1 - It might be a BungeeCord bug breaking bold text. It may or may not have been fixed.
Visual bug rendering chat over the tablist ([MC-263256](https://bugs.mojang.com/browse/MC-263256)).
+44 -16
View File
@@ -9,6 +9,7 @@ Combine the knowledge gathered by reading the wiki to get interesting results, m
* [Showing combined online player count from multiple servers](#showing-combined-online-player-count-from-multiple-servers)
* [Option 1 - Using global playerlist](#option-1---using-global-playerlist)
* [Option 2 - Using PlaceholderAPI](#option-2---using-placeholderapi)
* [Showing head components only to 1.21.9+ players](#showing-head-components-only-to-1219-players)
# Displaying kill / death counter in tablist
This example uses PlaceholderAPI placeholders.
@@ -37,7 +38,7 @@ _DEFAULT_:
```
This requires Vault and a permission plugin to work.
If you have luckperms installed on the same server instance, you can use TAB's internal `%luckperms-prefix%` (and suffix) placeholders instead.
**Note:** If TAB is on bungeecord, and you want prefixes to be taken from backend servers, use `%vault_prefix%` (or `%luckperms_prefix%`) with [PlaceholderAPI support on bungeecord](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge).
**Note:** If TAB is on a proxy, and you want prefixes to be taken from backend servers, use `%vault_prefix%` (or `%luckperms_prefix%`) with [PlaceholderAPI support on proxy](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge).
# Showing player's version in tablist
Run `/tab group _DEFAULT_ tabsuffix " &8[&3%player-version%&8]"` or any other color combination you want. You can also include other placeholders with it. You can also modify it directly in **groups.yml** file instead. With the provided example command, you'll get the following result:
@@ -63,13 +64,13 @@ conditions:
tps:
conditions:
- "%tps%>=19"
yes: "<#55FF55>%tps%</#00AA00>"
no: "%condition:tps2%"
true: "<#55FF55>%tps%</#00AA00>"
false: "%condition:tps2%"
tps2:
conditions:
- "%tps%>=15"
yes: "<#FFFF55>%tps%</#FFAA00>"
no: "<#FF5555>%tps%</#AA0000>"
true: "<#FFFF55>%tps%</#FFAA00>"
false: "<#FF5555>%tps%</#AA0000>"
```
To use this, we will use `%condition:tps%`.
Now, repeat for mspt and ping. For mspt, purpur's intervals are <40, <50, 50+. For ping, it's <100, <200, 200+.
@@ -80,23 +81,23 @@ conditions:
mspt:
conditions:
- "%mspt%<40"
yes: "<#55FF55>%mspt%</#00AA00>"
no: "%condition:mspt2%"
true: "<#55FF55>%mspt%</#00AA00>"
false: "%condition:mspt2%"
mspt2:
conditions:
- "%mspt%<50"
yes: "<#FFFF55>%mspt%</#FFAA00>"
no: "<#FF5555>%mspt%</#AA0000>"
true: "<#FFFF55>%mspt%</#FFAA00>"
false: "<#FF5555>%mspt%</#AA0000>"
ping:
conditions:
- "%ping%<100"
yes: "<#55FF55>%ping%</#00AA00>"
no: "%condition:ping2%"
true: "<#55FF55>%ping%</#00AA00>"
false: "%condition:ping2%"
ping2:
conditions:
- "%ping%<200"
yes: "<#FFFF55>%ping%</#FFAA00>"
no: "<#FF5555>%ping%</#AA0000>"
true: "<#FFFF55>%ping%</#FFAA00>"
false: "<#FF5555>%ping%</#AA0000>"
```
To use them, we will use `%condition:mspt%` and `%condition:ping%`. Purpur's TPSBar is using mspt as bossbar progress with range from 0 to 50. This can be achieved with PlaceholderAPI's math expansion: `%math_0_{tab_placeholder_mspt}*2%`. It always uses `GREEN` color and `NOTCHED_20` style. Let's put all of this together:
```
@@ -137,8 +138,8 @@ conditions:
rankOrTeam:
conditions:
- "%bw1058_player_team%="
yes: "%luckperms-prefix%"
no: "%bw1058_player_team%"
true: "%luckperms-prefix%"
false: "%bw1058_player_team%"
```
And then do `/tab group _DEFAULT_ tabprefix %condition:rankOrTeam%` and `/tab group _DEFAULT_ tagprefix %condition:rankOrTeam%` so it shows in your nametag and in your tablist name.
@@ -203,4 +204,31 @@ Unlike the first option, this one offers much more freedom, but also requires an
First, you need placeholders for online count on specific servers. Bungee expansion does exactly that. The format is `%bungee_<server>%`. To merge the online counts, use math expansion. The syntax will be `%math_0_<expression>%`, where `expression` uses online counts from specific servers from bungee expansion. Finally, you'll end up with a placeholder like `%math_0_{bungee_lobby1}+{bungee_lobby2}%`. This placeholder will merge online counts from `lobby1` and `lobby2`.
Please note that by default, bungee expansion updates values only every 30 seconds. This can be changed in PlaceholderAPI's config. If the numbers still don't show correct value, check if the placeholder works correctly using `/papi parse me <placeholder>`. If not, this is not a TAB issue.
Advantage of this is no requirement for a specific TAB feature to be enabled, which also includes no need to have TAB installed on the proxy. The downside is relying on 3rd party software. If TAB is on proxy, you'll also need [bridge plugin](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge).
Advantage of this is no requirement for a specific TAB feature to be enabled, which also includes no need to have TAB installed on the proxy. The downside is relying on 3rd party software. If TAB is on proxy, you'll also need [bridge plugin](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge).
# Showing head components only to 1.21.9+ players
Object components were added in 1.21.9, which means they cannot be shown to 1.21.8- players. [If you try to do so, you'll either get an ugly text (BungeeCord / backend), or disconnect with a packet decode error (on Velocity)](https://github.com/NEZNAMY/TAB/wiki/How-to-use-Minecraft-components#compatibility-with--1219).
To achieve this goal, we will use [relational conditions](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders#relational-conditions) and check if viewer is 1.21.9+:
```
conditions:
head:
conditions:
- "%viewer:player-version-id%>=773"
true: "<head:name:%player%> "
false: "" # Show nothing
```
The `773` is the protocol version of 1.21.9, so we can use a simple math operation instead of comparing strings. You can check [TAB's source code](https://github.com/NEZNAMY/TAB/blob/master/shared/src/main/java/me/neznamy/tab/shared/ProtocolVersion.java) for the full list. This condition will return head component of the **target** player if the **viewer** is 1.21.9+, empty value otherwise.
[If you want to use this head syntax, you'll need to disable MiniMessage support](https://github.com/NEZNAMY/TAB/wiki/How-to-use-Minecraft-components#player-sprite), or use a syntax supported by MiniMessage (which is currently extremely limited).
Use this condition with `%rel_condition:head%`. The rel is important, so TAB knows the placeholder is a relational placeholder. If you forget to, the condition will return a warning message instead of configured value.
To showcase it, I have this in **groups.yml** (to show player versions as well):
```
_DEFAULT_:
tabprefix: "%rel_condition:head%"
tabsuffix: " %player-version% (%player-version-id%)"
```
1.21.11 player's view:
<img width="634" height="103" alt="image" src="https://github.com/user-attachments/assets/4c762fae-3166-4247-865f-c87d1916afd7" />
1.21.8 player's view:
<img width="581" height="106" alt="image" src="https://github.com/user-attachments/assets/cb7ab93d-0db5-4968-bcfe-60004125ddf1" />
+6 -7
View File
@@ -22,13 +22,12 @@ Before attempting to use the function, make sure your server software has an int
TAB does not contain it by itself.
See the compatibility table below for current information about compatibility:
| Platform | Available |
| ------------- | ------------- |
| Bukkit | ✔ |
| BungeeCord | ✔ |
| Fabric | ❌ |
| Sponge | ❌ |
| Velocity | ❌ |
| Platform | Available |
|------------|-----------|
| Bukkit | ✔ |
| BungeeCord | ✔ |
| Modded | ❌ |
| Velocity | ❌ |
# Enabling
Find this section in **config.yml**:
+16 -62
View File
@@ -5,13 +5,11 @@ The usage can be checked at any time using [**/tab cpu**](https://github.com/NEZ
* [#1 - [All platforms] Static text instead of placeholders](#1---all-platforms-static-text-instead-of-placeholders)
* [#2 - [All platforms] Placeholder refresh intervals](#2---all-platforms-placeholder-refresh-intervals)
* [#3 - [All platforms] Don't use RGB](#3---all-platforms-dont-use-rgb)
* [#4 - [All platforms] Disable anti-override](#4---all-platforms-disable-anti-override)
* [#4 - [All platforms] Don't use animations](#4---all-platforms-dont-use-animations)
* [#5 - [All platforms] Disable tablist name formatting](#5---all-platforms-disable-tablist-name-formatting)
* [#6 - [All platforms] Increase permission refresh interval](#6---all-platforms-increase-permission-refresh-interval)
* [#7 - [BungeeCord / Velocity] Disable TAB expansion](#7---bungeecord--velocity-disable-tab-expansion)
* [#8 - [BungeeCord / Velocity] Disable update-latency option in global playerlist](#8---bungeecord--velocity-disable-update-latency-option-in-global-playerlist)
* [#9 - [BungeeCord] Disable ByteBuf deserialization](#9---bungeecord-disable-bytebuf-deserialization)
* [#10 - [Velocity] Disable header/footer translation](#10---velocity-disable-headerfooter-translation)
* [#7 - [Proxies] Disable TAB expansion](#7---proxies-disable-tab-expansion)
* [#8 - [Proxies] Disable update-latency option in global playerlist](#8---proxies-disable-update-latency-option-in-global-playerlist)
# #1 - [All platforms] Static text instead of placeholders
Static text doesn't need to be refreshed periodically, resulting in better performance.
@@ -23,11 +21,11 @@ instead of using placeholders to take those values from your permission plugin.
# #2 - [All platforms] Placeholder refresh intervals
Some placeholders take a long time to process and result in high cpu usage. However, this can be optimized by configuring refresh interval of placeholders.
This only works for PlaceholderAPI placeholders. Internal ones have an interval hardcoded already with values I found the most appropriate.
Internal placeholders use a value hardcoded into the plugin by default. PlaceholderAPI placeholders use `default-refresh-interval`.
To begin, find this part in your config
```yml
placeholderapi-refresh-intervals:
placeholder-refresh-intervals:
default-refresh-interval: 500
"%server_uptime%": 1000
"%server_tps_1_colored%": 1000
@@ -50,25 +48,11 @@ Using a higher interval will help if needed, but may lead to misleading info in
# #3 - [All platforms] Don't use RGB
Though RGB colors look good, they require the text to be split into several components with `color` field used instead of the whole text pasted into the `text` field. This is a complicated process that takes quite some time. Sticking to legacy colors results in better performance.
# #4 - [All platforms] Disable anti-override
By default, TAB prevents other plugins from overriding it.
This is because many server owners are not competent enough to configure their plugins correctly,
such as disabling CMI collision handling which breaks nametags or even disabling team handling in paper.
This obviously causes higher CPU usage.
TAB logs all override attempts of teams into [anti-override.log](https://github.com/NEZNAMY/TAB/wiki/Action-logging#anti-overridelog) file.
If you didn't get the file, it looks like you configured your plugins correctly.
In that case, you can disable anti-override for teams in TAB.
```
scoreboard-teams:
anti-override: false
```
Tablist formatting is trickier, as override attempts are not logged because it would have a lot of false positives.
You will need to try and see.
```
tablist-name-formatting:
anti-override: false
```
# #4 - [All platforms] Don't use animations
While animations look cool, they also have a high resource usage.
This is because they work by spamming updates every time an animation switches to a new frame.
When animations are not used, no updates need to be sent (unless another placeholder changes value),
not causing extra CPU usage.
# #5 - [All platforms] Disable tablist name formatting
As we already know from [Client-sided mechanics](https://github.com/NEZNAMY/TAB/wiki/Client%E2%80%90sided-mechanics#nametag-format-in-tablist) page,
@@ -86,15 +70,16 @@ Plugin needs to constantly check permissions for:
* Permission checks in conditions
* Permission checks if sorting by permissions
* Group retrieving from permission plugin (for sorting / per-group properties)
* Prefix/suffix placeholders taking data from your permission plugin
default value
```
permission-refresh-interval: 1000
```
refreshes them every second. If you don't need any permission/group changes to take effect within a second, you can increase this value for better performance.
Refreshes them every second.
If you don't need any permission/group changes to take effect within a second,
you can increase this value for better performance.
# #7 - [BungeeCord / Velocity] Disable TAB expansion
# #7 - [Proxies] Disable TAB expansion
To maximize the performance of TAB's response to PlaceholderAPI request,
values are tracked in advance and then quickly returned.
This process takes resources and is especially heavy on proxy installation,
@@ -105,36 +90,5 @@ Disabling TAB's PlaceholderAPI expansion if you don't use it improves performanc
placeholders:
register-tab-expansion: false
```
# #8 - [BungeeCord / Velocity] Disable update-latency option in global playerlist
When [Global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) is enabled, you can enable / disable [update-latency](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist#:~:text=other%20unlisted%20servers.-,update%2Dlatency,-false) option (open the link for detailed description of the option). Disabling this option massively improves performance.
# #9 - [BungeeCord] Disable ByteBuf deserialization
In order for anti-override to work properly, some packets must be manually deserialized due to BungeeCord not doing it. If you don't need it, you can disable those functions, which will also disable the deserialization completely. To do so, you must disable 2 functions (only having 1 disabled is not enough):
#1 - Anti-override for teams
```
scoreboard-teams:
anti-override: false
```
Whether you need anti-override or not depends on the configuration of your plugins.
The easiest way is to have it enabled and see if you get `anti-override.log` file in TAB folder.
If you don't, you don't need it.
If you do, you'll need to do some configuring.
[Here](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist#additional-note-3---compatibility-issues-with-other-plugins)
are a few examples of software and their team names, which you may find helpful.
#2 - Scoreboard detection of other plugins
TAB checks for packets sent by other plugins, and if another plugin sends a scoreboard,
TAB hides its own and resends it after the other plugin removes it.
This check cannot be disabled if the scoreboard is enabled.
# #10 - [Velocity] Disable header/footer translation
Velocity offers header/footer translation of translatable components.
However, TAB does not use these.
Despite that, Velocity's attempt to "translate" the components is still there,
causing the whole feature to use up to 3x more CPU than it would without it.
There is no way to disable this inside Velocity itself,
however, there is a third party [fork](https://github.com/GemstoneGG/Velocity-CTD/) that offers it.
**Use at your own risk**.
After installing, default velocity.toml file will contain `translate-header-footer = true` option.
If just upgrading, you will need to add it there yourself.
Setting it to `false` will disable this function.
# #8 - [Proxies] Disable update-latency option in global playerlist
When [Global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) is enabled, you can enable / disable [update-latency](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist#:~:text=other%20unlisted%20servers.-,update%2Dlatency,-false) option (open the link for detailed description of the option). Disabling this option massively improves performance.
+134 -78
View File
@@ -3,7 +3,7 @@
* [Internal placeholders](#internal-placeholders)
* [Universal](#universal)
* [Backend only](#backend-only)
* [BungeeCord only](#bungeecord-only)
* [Proxy only](#proxy-only)
* [PlaceholderAPI](#placeholderapi)
* [Relational placeholders](#relational-placeholders)
* [About](#about-1)
@@ -26,88 +26,132 @@ TAB offers various placeholders to display the most common information. It also
Basic placeholders provided by the plugin. Most of these placeholders were added because they were requested by people who don't want to install another plugin just to show username. Some of them have configurable output in config.yml in `Placeholders` section. Unused placeholders do not affect performance in any way.
Placeholders must be refreshed. All internal placeholders have manually defined refresh interval, which I found the most optimal and cannot be changed. Time is in milliseconds. `-1` is used for placeholders which are in fact constants (such as %player%), or fire an event each time they change, which can be listened to (such as %world%) and value updated. Refresh interval for conditions is set to be equal to fastest refreshing placeholder used inside each condition.
Placeholders must be refreshed.
All internal placeholders have a manually defined refresh interval,
which I found the most optimal. You can [override the refresh intervals](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin#2---all-platforms-placeholder-refresh-intervals) if you want to.
Time is in milliseconds.
`-1` is used for placeholders which are in fact constants (such as %player%),
or fire an event each time they change, which can be listened to (such as %world%) and value updated.
Refresh interval for conditions is set to be equal to the fastest refreshing placeholder used inside each condition.
## Universal
These placeholders are available on all platforms.
| Identifier | Refresh interval | Description |
| ------------- | ------------- | ------------- |
| %online% | 1000 | Total online player count on server where plugin is installed (excluding [vanished players](https://github.com/NEZNAMY/TAB/wiki/Additional-information#vanish-detection)). If the plugin is installed on a proxy, it will show total player count on the whole network. |
| %world% | -1 | Name of world where player is |
| %worldonline% | 1000 | Amount of players in the same world (excluding [vanished players](https://github.com/NEZNAMY/TAB/wiki/Additional-information#vanish-detection)) as the player |
| %ping% | 500 | Player's ping to the server where TAB is installed. <br />**Note**: This value is measured by the server and TAB is only retrieving that value. If it's wrong, it's not a TAB issue. |
| %player% | -1 | Player's name |
| %time% | 500 | Current real time, output is configurable in **config.yml** in `time-format` option |
| %date% | 60000 | Current date, output is configurable in **config.yml** in `date-format` option |
| %staffonline% | 2000 | Amount of online players with `tab.staff` permission |
| %nonstaffonline% | 2000 | Amount of online players without `tab.staff` permission |
| %memory-used% | 200 | Used RAM of server in MB |
| %memory-max% | -1 | Total RAM of server in MB |
| %memory-used-gb% | 200 | Used RAM of server in GB |
| %memory-max-gb% | -1 | Total RAM of server in GB |
| %player-version% | -1 | User-friendly version of player, such as `1.14.4`. For versions that share the same protocol version number, the higher one is returned (for example 1.20 & 1.20.1 -> 1.20.1 is returned) |
| %player-version-id% | -1 | Network ID of player's version. You can see the full version map on [fan wiki](https://wiki.vg/Protocol_version_numbers) for all versions or [TAB's source code](https://github.com/NEZNAMY/TAB/blob/master/shared/src/main/java/me/neznamy/tab/shared/ProtocolVersion.java) for releases only. Useful for conditions to create per-version results. |
| %luckperms-prefix% | 1000 | Prefix from LuckPerms from the server where TAB is installed |
| %luckperms-suffix% | 1000 | Suffix from LuckPerms from the server where TAB is installed |
| %displayname% | 500 | Display name variable set by permission plugin, typically prefix + name + suffix |
| %group% | 1000 | Returns player's primary group name. Created for internal functionality, but can be used as a display placeholder as well. |
| %vanished% | 1000 | Returns `true`/`false` based on player's vanish status. Created for internal functionality, but can be used as a display placeholder as well. |
| %bedrock% | -1 | Returns `true`/`false` based on whether player is using Bedrock edition or not (Java) |
| %% | -1 | Returns the `%` symbol. Useful to display `%` symbol without breaking all placeholders after it |
| Identifier | Refresh interval | Description |
|-------------------------------------------|------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| %online% | 1000 | Total online player count on server where plugin is installed (excluding [vanished players](https://github.com/NEZNAMY/TAB/wiki/Additional-information#vanish-detection)). If the plugin is installed on a proxy, it will show total player count on the whole network. |
| %world% | -1 | Name of world where player is |
| %worldonline% | 1000 | Amount of players in the same world (excluding [vanished players](https://github.com/NEZNAMY/TAB/wiki/Additional-information#vanish-detection)) as the player |
| %ping% | 500 | Player's ping to the server where TAB is installed. <br />**Note**: This value is measured by the server and TAB is only retrieving that value. If it's wrong, it's not a TAB issue. |
| %player% | -1 | Player's name |
| %uuid% | -1 | Player's UUID |
| %time% | 500 | Current real time, output is configurable in **config.yml** in `time-format` option |
| %date% | 60000 | Current date, output is configurable in **config.yml** in `date-format` option |
| %staffonline% | 2000 | Amount of online players with `tab.staff` permission |
| %nonstaffonline% | 2000 | Amount of online players without `tab.staff` permission |
| %memory-used% | 200 | Used RAM of server in MB |
| %memory-max% | -1 | Total RAM of server in MB |
| %memory-used-gb% | 200 | Used RAM of server in GB |
| %memory-max-gb% | -1 | Total RAM of server in GB |
| %player-version% | -1 | User-friendly version of player, such as `1.14.4`. For versions that share the same protocol version number, the higher one is returned (for example 1.20 & 1.20.1 -> 1.20.1 is returned) |
| %player-version-id% | -1 | Network ID of player's version. You can see the full version list in [TAB's source code](https://github.com/NEZNAMY/TAB/blob/master/shared/src/main/java/me/neznamy/tab/shared/ProtocolVersion.java). Useful for conditions to create per-version results using numeric operations since version names cannot be effectively compared. |
| %luckperms-prefix% | 1000 | Prefix from LuckPerms from the server where TAB is installed |
| %luckperms-suffix% | 1000 | Suffix from LuckPerms from the server where TAB is installed |
| %luckperms-prefixes% | 1000 | All prefixes combined from LuckPerms from the server where TAB is installed |
| %luckperms-suffixes% | 1000 | All suffixes combined from LuckPerms from the server where TAB is installed |
| %displayname% | 500 | Display name variable set by permission plugin, typically prefix + name + suffix |
| %group% | 1000 | Returns player's primary group name. Created for internal functionality, but can be used as a display placeholder as well. |
| %vanished% | 1000 | Returns `true`/`false` based on player's vanish status. Created for internal functionality, but can be used as a display placeholder as well. |
| %bedrock% | -1 | Returns `true`/`false` based on whether player is using Bedrock edition or not (Java) |
| %bossbar_announce_time_total_\<bossbar\>% | -1 | Total time (inputted value) of an announced bossbar. |
| %bossbar_announce_time_left_\<bossbar\>% | 100 | Remaining time of an announced bossbar. |
| %online_\<server name\>% | 1000 | Amount of online players on specified server (excluding vanished players) |
| %% | -1 | Returns the `%` symbol. Useful to display `%` symbol without breaking all placeholders after it |
## Backend only
These placeholders only work when TAB is installed on a backend server (Bukkit / Sponge / Fabric), they don't work when TAB is on BungeeCord. If you have TAB installed on BungeeCord and wish to use these, use their [PlaceholderAPI](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide) alternative with [Bridge plugin](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) installed for PlaceholderAPI support on BungeeCord.
| Identifier | Refresh interval | Description | PlaceholderAPI alternative |
| ------------- | ------------- | ------------- | ------------- |
| %health% | 100 | Player's health, rounded up to match Minecraft's heart display. | %player_health_rounded% |
| %displayname% | 500 | Player's display name value set by permission plugin. | %player_displayname% |
| %tps% | 1000 | TPS of server from the last minute (measured by server, not available on Fabric as it doesn't measure the value) | %server_tps_1% |
| %mspt% | 1000 | Server's current milliseconds per tick (Paper / Sponge 8+ / Fabric only) | - |
These placeholders only work when TAB is installed on a backend server, they don't work when TAB is on a proxy. If you have TAB installed on proxy and wish to use these, use their [PlaceholderAPI](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide) alternative with [Bridge plugin](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) installed for PlaceholderAPI support on proxy.
| Identifier | Refresh interval | Description | PlaceholderAPI alternative |
|---------------|---------------| ------------- | ------------- |
| %health% | 100 | Player's health, rounded up to match Minecraft's heart display. | %player_health_rounded% |
| %displayname% | 500 | Player's display name value set by permission plugin. | %player_displayname% |
| %tps% | 1000 | TPS of server from the last minute. Measured by the server. Not directly available on modded platforms - primitive approximation using MSPT (TPS = 1000/MSPT, max 20) is used there. | %server_tps_1% |
| %mspt% | 1000 | Server's current milliseconds per tick (not available on Spigot) | - |
| %deaths% | 1000 | Player's death count | %statistic_deaths% |
## BungeeCord only
| Identifier | Refresh interval | Description |
| ------------- | ------------- | ------------- |
| %server% | -1 | Name of server where player is, defined in proxy's config. |
| %serveronline% | 1000 | Amount of online players on server where the player is (excluding vanished players) |
| %online_\<servername\>% | 1000 | Amount of online players on specified server (excluding vanished players) |
| %playerlist-group_\<group\>% | 1000 | Amount of online players in specified [global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) group (therefore the feature must be enabled) |
## Proxy only
| Identifier | Refresh interval | Description |
|------------------------------|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| %server% | -1 | Name of server where player is, defined in proxy's config. |
| %serveronline% | 1000 | Amount of online players on server where the player is (excluding vanished players) |
| %playerlist-group_\<group\>% | 1000 | Amount of online players in specified [global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) group (therefore the feature must be enabled) |
# PlaceholderAPI
PlaceholderAPI is supported and relational placeholders are supported too. When parsing relational placeholders, TAB puts viewer as the first player argument and target player as second argument.
PlaceholderAPI is supported and relational placeholders are supported too.
When parsing relational placeholders,
TAB puts viewer as the first player argument and target player as the second argument.
You can find most of placeholders that PlaceholderAPI offers on [PlaceholderAPI wiki](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders). Some plugins are not listed there, for those you'll need to check their own wiki for placeholders.
You can find most of the placeholders
that PlaceholderAPI offers on [PlaceholderAPI wiki](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders).
Some plugins are not listed there, for those you'll need to check their own wiki for placeholders.
TAB also offers its own placeholders into PlaceholderAPI. In order to enable TAB's expansion, set
TAB also offers its own placeholders into PlaceholderAPI. To enable TAB's expansion, set
```
placeholders:
register-tab-expansion: true
```
in **config.yml**.
Full list of placeholders:
| Identifier | Description |
| ------------- | ------------- |
| %tab_tabprefix% | Current tabprefix with replaced placeholders |
| %tab_tabsuffix% | Current tabsuffix with replaced placeholders |
| %tab_tagprefix% | Current tagprefix with replaced placeholders |
| %tab_tagsuffix% | Current tagsuffix with replaced placeholders |
| %tab_customtabname% | Current customtabname with replaced placeholders |
| %tab_tabprefix_raw% | Raw tabprefix containing unparsed placeholders |
| %tab_tabsuffix_raw% | Raw tabsuffix containing unparsed placeholders |
| %tab_tagprefix_raw% | Raw tagprefix containing unparsed placeholders |
| %tab_tagsuffix_raw% | Raw tagsuffix containing unparsed placeholders |
| %tab_customtabname_raw% | Raw customtabname containing unparsed placeholders |
| %tab_scoreboard_name% | Returns name of player's currently displayed scoreboard or empty string if none is displayed due to no display condition being met |
| %tab_scoreboard_visible% | "Enabled" if visible, "Disabled" if not |
| %tab_bossbar_visible% | "Enabled" if visible, "Disabled" if not |
| %tab_nametag_preview% | "Enabled" if previewing armor stands using /tab nametag preview, "Disabled" if not |
| %tab_nametag_visibility% | "Enabled" if player can see nametags, "Disabled" if disabled using /tab nametag toggle |
| %tab_replace_\<placeholder\>% | Applies [Placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements) to a PlaceholderAPI placeholder (for example %tab_replace_essentials_vanished%) |
| %tab_placeholder_\<placeholder\>% | returns value of tab's internal placeholder (such as %tab_placeholder_animation:name% for %animation:name%) |
Full list of placeholders (general + feature specific):
**General**:
| Identifier | Description |
|-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `%tab_replace_<placeholder>%` | Applies [Placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements) to a PlaceholderAPI placeholder (for example `%tab_replace_essentials_vanished%`) |
| `%tab_placeholder_<placeholder>%` | returns value of tab's internal placeholder (such as `%tab_placeholder_animation:name%` for `%animation:name%`) (this also applies [Placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements) to them if configured) |
**BossBar**:
| Identifier | Description |
|-------------------------|-----------------------------------------|
| `%tab_bossbar_visible%` | "Enabled" if visible, "Disabled" if not |
**NameTags**:
| Identifier | Description |
|----------------------------|----------------------------------------------------------------------------------------------|
| `%tab_tagprefix%` | Player's current tagprefix with placeholders parsed. |
| `%tab_tagsuffix%` | Player's current tagprefix with placeholders parsed. |
| `%tab_tagprefix_raw%` | Player's current raw tagprefix with placeholder identifiers. |
| `%tab_tagsuffix_raw%` | Player's current raw tagsuffix with placeholder identifiers. |
| `%tab_nametag_visibility%` | "Enabled" if player can see nametags, "Disabled" if disabled using `/tab nametag toggleview` |
**Scoreboard**:
| Identifier | Description |
|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------|
| `%tab_scoreboard_name%` | Returns name of player's currently displayed scoreboard or empty string if none is displayed due to no display condition being met. |
| `%tab_scoreboard_visible%` | "Enabled" if visible, "Disabled" if not (toggled with a command) |
**Tablist name formatting**:
| Identifier | Description |
|---------------------------|------------------------------------------------------------------|
| `%tab_tabprefix%` | Player's current tabprefix with placeholders parsed. |
| `%tab_customtabname%` | Player's current customtabname with placeholders parsed. |
| `%tab_tabsuffix%` | Player's current tabprefix with placeholders parsed. |
| `%tab_tabprefix_raw%` | Player's current raw tabprefix with placeholder identifiers. |
| `%tab_customtabname_raw%` | Player's current raw customtabname with placeholder identifiers. |
| `%tab_tabsuffix_raw%` | Player's current raw tabsuffix with placeholder identifiers. |
# Relational placeholders
## About
Unlike classic placeholders which take either 0 (placeholders with same output for all players) or 1 (per-player placeholders) players, relational placeholders take in 2 players. The first usage was to display relation between two players, specifically enemies / allies (red / green) for factions, allowing players to see faction names of other players colored based on relation. While the usage is not limited to this, the name of the 2-player placeholder type has been established as "relational" and will be called that everywhere.
Unlike classic placeholders which take either 0
(placeholders with the same output for all players) or 1 (per-player placeholders) players,
relational placeholders take in 2 players.
The first usage was to display relation between two players, specifically enemies / allies (red / green) for factions,
allowing players to see faction names of other players colored based on relation.
While the usage is not limited to this, the name of the 2-player placeholder type has been established as "relational"
and will be called that everywhere.
## Usage
TAB does not offer any internal relational placeholders. However, it has full support for PlaceholderAPI placeholders. You can also register your own relational placeholders using the [API](#relational-placeholders-1). In PlaceholderAPI, all relational placeholder identifiers must start with `%rel_`. This rule is adopted and used in TAB as well (including those registered via API).
@@ -120,31 +164,41 @@ public String onPlaceholderRequest(Player viewer, Player target, String identifi
where `viewer` is the player looking and `target` is the player the value is being displayed on.
When trying to use placeholders from other plugins, you will need to check their documentation and search for relational placeholders. If your plugin does not appear to offer any, you ran out of luck and TAB cannot do anything about it.
In order to properly distinguish viewer/target (if needed), your relational placeholder expansion must follow the same order as TAB does. Since PlaceholderAPI never created any convention regarding this and instead calls the players `one` and `two`, I had to decide and this is the decision.
To properly distinguish viewer/target (if needed), your relational placeholder expansion must follow the same order as TAB does. Since PlaceholderAPI never created any convention regarding this, and instead it calls the players `one` and `two`, I had to decide and this is the decision.
# Refreshing
## Refresh intervals
TAB is refreshing placeholders in intervals. For internal placeholders it's using values I found the most optimal and set directly in the plugin. Refresh intervals for PlaceholderAPI placeholders can be [configured](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin#2---placeholder-refresh-intervals).
## Sync refreshing
By default, all placeholders are refreshed asynchronously so they don't slow down the server, since reading should be a thread-safe operation. Some placeholders, however, require to be refreshed in the main thread, causing problems or throwing errors when refreshed asynchronously. For these, replace them with `%sync:<original placeholder>%` and they will be refreshed in the main thread, for example `%server_total_entities%` -> `%sync:server_total_entities%`.
Keep in mind that now you should configure reasonable refresh interval for these placeholders to not cause TPS drops (with async placeholders it doesn't really matter). Configured refresh intervals and CPU usage of placeholders can be checked using `/tab cpu`.
By default, all placeholders are refreshed asynchronously,
so they don't slow down the server, since reading should be a thread-safe operation.
Some placeholders, however, require to be refreshed in the main thread,
causing problems or throwing errors when refreshed asynchronously.
For these, replace them with `%sync:<original placeholder>%` and they will be refreshed in the main thread,
for example `%server_total_entities%` -> `%sync:server_total_entities%`.
Keep in mind that now you should configure a reasonable refresh interval for these placeholders to not cause TPS drops
(with async placeholders it doesn't really matter).
Configured refresh intervals and CPU usage of placeholders can be checked using `/tab cpu`.
# Placeholder is not working
When using a placeholder, you should know if it's a [TAB's internal placeholder](#internal-placeholders) or a [PlaceholderAPI placeholder](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders). If you don't, that's the problem.
**Note:** Don't forget that using `%` symbol will mess up placeholder starts and ends, breaking all placeholders after it. To make the symbol display correctly without messing up placeholders, use `%%` to display the symbol.
**Example:** `Sale 100% OFF! %some_placeholder%` -> `Sale 100%% OFF! %some_placeholder%`.
> [!CAUTION]
> Remember that using `%` symbol will mess up placeholder starts and ends, breaking all placeholders after it.
> To make the symbol display correctly without messing up placeholders, use `%%` to display the symbol.
> **Example:** `Sale 100% OFF! %some_placeholder%` -> `Sale 100%% OFF! %some_placeholder%`.
## Internal placeholder is not working
All TAB's internal placeholders are listed above. Some of them are bukkit only (meaning they won't work on bungeecord) and some are bungee only. **Trying to use a bukkit-only placeholder on bungeecord will not work.**
If you want to use those, [set up PlaceholderAPI support on bungeecord](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) and find their PlaceholderAPI equivalent. Large portion of those are included on [PlaceholderAPI's wiki](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders).
For example you can use %vault_prefix% instead of %vault-prefix%, %player_health% instead of %health% and so on.
Here are few possible reasons:
* You attempted to use a proxy-only placeholder on backend, or backend-only placeholder on proxy
* You used the `%` symbol before the placeholder, breaking placeholder starts and ends (see above).
## PlaceholderAPI placeholder is not working
If you have TAB installed on bungeecord, make sure you [set up PlaceholderAPI support on bungeecord](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) as there is no other way to retrieve data from technically a different server.
If you have TAB on bukkit or the previous step did not work, make sure it works when using `/papi parse me <placeholder>`. If it does not work, the issue is not on TAB's end.
Here are few possible reasons:
* The placeholder is not working in PlaceholderAPI. You can check this using `/papi parse me <placeholder>`. If it isn't working there, it's not a TAB issue. If the placeholder you used is advertised somewhere, make sure you have the adequate expansion downloaded.
* If you have TAB installed on a proxy, make sure [TAB-Bridge](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) is installed on backend servers to forward support to the proxy.
* You used the `%` symbol before the placeholder, breaking placeholder starts and ends (see above).
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
@@ -153,7 +207,7 @@ For working with placeholders, you will need the `PlaceholderManager`. Get it us
Placeholders have two attributes:
* An identifier, which is used to uniquely identify the placeholder. This is also what's usually used for replacement. For example, in `%uptime%`, the identifier is `%uptime%`.
* A refresh rate in milliseconds, which is how often the placeholder's refresh function will be called, to get a new value to display. Use `-1` to make the placeholder never refresh periodically. This can be used for either constants or placeholders that update on events and you wish to update their value manually using functions in respective placeholder interface.
* A refresh rate in milliseconds, which is how often the placeholder's refresh function will be called, to get a new value to display. Use `-1` to make the placeholder never refresh periodically. This can be used for either constants or placeholders that update on events, and you wish to update their value manually using functions in the respective placeholder interface.
## Server placeholders
Server placeholders are global to the entire plugin. Their values are not dependent on player.
@@ -172,7 +226,7 @@ This placeholder will show current system time and update every 50 milliseconds.
## Player placeholders
Player placeholders are calculated on a per-player basis. These depend on the player that we want to get the value for.
Examples of player placeholders would be nickname and prefix.
Examples of player placeholders would be username and prefix.
To register a new player placeholder, use `PlaceholderManager#registerPlayerPlaceholder(String, int, Function<TabPlayer, Object>)`. The first two parameters are explained above, and the last parameter is a function that will be called to refresh the value of the placeholder.
<details>
@@ -202,5 +256,7 @@ TabAPI.getInstance().getPlaceholderManager().registerRelationalPlaceholder("%rel
});
```
This placeholder will show version of players, but only to those, who have `tab.staff` permission. First player in the method is viewer, second player is target. Same order is applied when hooking into PlaceholderAPI as well.
This placeholder will show the version of players, but only to those, who have `tab.staff` permission.
The first player in the method is viewer, the second player is target.
The same order is applied when hooking into PlaceholderAPI as well.
</details>
@@ -2,13 +2,26 @@
This is a quick guide for [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/) plugin, which is often referred to on the wiki, and we also get many assistance requests with TAB which turn out to be asking for help with PlaceholderAPI. Whether its documentation is not clear enough, missing information or users just don't read it isn't the topic here to judge, instead, a quick guide with everything needed is provided.
# Installation
PlaceholderAPI is a standalone bukkit plugin which can be installed just like any other plugin. It does not support BungeeCord. If you have TAB on BungeeCord and wish to use PlaceholderAPI placeholders, you'll need to install [Bridge](https://www.spigotmc.org/resources/83966) plugin on backend servers. Alongside other features, it forwards PlaceholderAPI support to the proxy.
PlaceholderAPI is a standalone Bukkit plugin that can be installed just like any other plugin.
It does not support proxies.
If you have TAB on a proxy server and wish to use PlaceholderAPI placeholders,
you'll need to install [Bridge](https://www.spigotmc.org/resources/83966) plugin on backend servers.
Alongside other features, it forwards PlaceholderAPI support to the proxy.
# Expansions
In order to effectively scale and allow the level of modification it does, PlaceholderAPI is using placeholder packages called expansions. They are loaded into the plugin on startup. Each expansion can be created and modified independently of the main plugin's update frequency. Each expansion has a name, which is used to identify its placeholders.
The syntax is `%<expansion>_<placeholder>%`, where `<expansion>` is name of the expansion, for example `player` and `<placeholder>` is placeholder of the expansion, for example `health`, which returns player's health. The full placeholder syntax will then be `%player_health%`.
To effectively scale and allow the level of modification it does,
PlaceholderAPI is using placeholder packages called expansions.
They are loaded into the plugin on startup.
Each expansion can be created and modified independently of the main plugin's update frequency.
Each expansion has a name, which is used to identify its placeholders.
The syntax is `%<expansion>_<placeholder>%`, where `<expansion>` is name of the expansion,
for example `player` and `<placeholder>` is placeholder of the expansion, for example `health`,
which returns player's health.
The full placeholder syntax will then be `%player_health%`.
Some plugins offer their own expansions, which is either integrated into the plugin itself or external on PlaceholderAPI cloud. Integrated expansions are not downloaded, instead, plugins register them automatically.
Some plugins offer their own expansions,
which are either integrated into the plugin itself or external on PlaceholderAPI cloud.
Integrated expansions are not downloaded; instead, plugins register them automatically.
You can download / update external expansions using `/papi ecloud download <expansion>`. After downloading it, run `/papi reload` to enable it.
+18 -17
View File
@@ -1,27 +1,28 @@
# About
When TAB is installed on BungeeCord, the plugin has very limited access to information. It is unable to retrieve internal server data, as well as hook into backend plugins, because it's a different server.
Bridge is a backend plugin that sends this data to the proxy, allowing TAB to work better when installed on BungeeCord.
You can download it from [GitHub](https://github.com/NEZNAMY/TAB-Bridge/releases) or [Spigot](https://www.spigotmc.org/resources/83966).
When TAB is installed on a proxy, the plugin has very limited access to information. It is unable to retrieve internal server data, as well as hook into backend plugins, because it's a different server.
Bridge is a backend plugin that sends this data to the proxy, allowing TAB to work better when installed on a proxy.
You can download it from [GitHub](https://github.com/NEZNAMY/TAB-Bridge/releases), [Spigot](https://www.spigotmc.org/resources/83966) or [Modrinth](https://modrinth.com/plugin/tab-bridge).
# Installation
Installation is as simple as it can be. Put it into plugins folder of your backend servers. **Bridge is NOT a BungeeCord plugin!** Bridge itself has no config file, as everything is configured in the main plugin.
Installation is as simple as it can be.
Put it into the plugins folder of your backend servers.
Bridge is NOT a proxy plugin!
Bridge itself has no config file, as everything is configured in the main plugin.
# Features
* Forwarding PlaceholderAPI support to the proxy​
* Allow detection if player is invisible to make nametag invisible (compensation for 1.8.x client sided bug)​
* Allow detection if player is disguised to disable collision to prevent endless push​
* Forwarding permission groups of players if no permission plugin is installed on BungeeCord​
* Forwarding vanish status for compatibility with global playerlist / layout features​
* Forwarding PlaceholderAPI support to the proxy
* Allow detection if player is invisible to make their nametag invisible (compensation for 1.8.x client sided bug)
* Allow detection if a player is disguised to disable collision to prevent endless push
* Forwarding permission groups of players if no permission plugin is installed on the proxy
* Forwarding vanish status for compatibility with global playerlist / layout features
* Forward player's world for %world% and per-world settings
* Allow TAB's PlaceholderAPI expansion with TAB on BungeeCord​
* Allow TAB's PlaceholderAPI expansion with TAB on proxy
* Forward player's gamemode for spectator fix feature to work
# Compatibility
Just like with Minecraft, when there is a change in the communication protocol, older software will not be compatible with the new one. You should always be running latest versions of both TAB and Bridge.
Just like with Minecraft, when there is a change in the communication protocol between TAB ↔ TAB-Bridge,
older software will not be compatible with the new one.
You should always be running the latest versions of both TAB and Bridge.
# Confirming it works
You have many ways to verify TAB and Bridge are properly connected. Besides checking if the features above work, the easiest one is to run `/btab debug <player>`.
If it's properly connected, you'll get a message saying this:
![image](https://github.com/NEZNAMY/TAB/assets/6338394/3f8dd978-a8bd-4613-9ea1-a56340194859)
If it's not properly connected, you'll get this message:
![image](https://github.com/NEZNAMY/TAB/assets/6338394/a90018bc-2c3b-4bf5-b54c-56621178ce80)
If this is the case, it means Bridge is either not installed or versions are not compatible. Just update both to the latest version.
You have many ways to verify TAB and Bridge are properly connected. Besides checking if the features above work, the easiest one is to run `/btab dump <player>` and check if bridge connection says connected. If not, it means Bridge is either not installed or versions are not compatible. Update both to the latest version.
-147
View File
@@ -1,147 +0,0 @@
# ---------------------------------------
# THIS PAGE IS WORK IN PROGRESS
# ---------------------------------------
# About
This page compares TAB to other plugins offering similar features based on various parameters.
### Open issues
Amount of open issues on GitHub. Keep in mind this number shouldn't be taken 100% seriously, because:
* People often open issues to ask for help instead of reporting an issue.
* If nobody is using a plugin, nobody can find bugs. Bug not found doesn't mean it's not there.
* Some of the issues may be feature requests, which may not be present elsewhere as those are not accepted.
### Price
The price to obtain the jar. Most plugins are free, some are paid.
### Minecraft
Supported Minecraft versions by the plugin.
### Platforms
Supported platforms by the plugin. Full tracked list includes:
* Bukkit ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577)
* Sponge ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352)
* Fabric ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1)
* Forge ![image](https://github.com/NEZNAMY/TAB/assets/6338394/268c1571-0087-466b-b502-ec16017ac1d6)
* BungeeCord ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9)
* Velocity ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d)
### Async
Whether the plugin runs in server's main thread (sync) or in a different thread (async). If a plugin is running sync, it may slow down the server's TPS. All of these features can be done async.
# Belowname
| Attribute | [TAB](https://github.com/NEZNAMY/TAB) |
| ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Minecraft** | 1.5+ |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) |
| **Async** | ✔ |
| PlaceholderAPI support | ✔ |
| Configurable number | ✔ |
| Configurable text | ✔ |
| 1.20.3+ NumberFormat support | ✔ |
| Conditionally disable the feature | If any specified condition is met |
# Bossbar
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [UltraBar](https://github.com/ryandw11/UltraBar) | [AnimaBossBar](https://www.spigotmc.org/resources/bossbar-spigot-free-bossbar-plugin-1-9-1-18-1.59135/) |
| ------------- | ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/ryandw11/UltraBar) | - |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Minecraft** | 1.5+ | 1.12+ | 1.9 - 1.18.1 |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) |
| **Async** | ✔ | ❌ | ❌ |
| Announcements | ✔ (defined in config) | ✔ (defined at runtime) | ✔ (defined at runtime) |
| Toggle command | ✔ (customizable) | ❌ | ❌ |
| Display condition | Anything that has a placeholder | On join / death / command / in worldguard region | ❌ |
# Global Playerlist
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [BungeeTabListPlus](https://github.com/CodeCrafter47/BungeeTabListPlus) | [Velocitab](https://github.com/WiIIiam278/Velocitab) |
| ------------- | ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/CodeCrafter47/BungeeTabListPlus) | ![Issues](https://img.shields.io/github/issues/WiIIiam278/Velocitab) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) |
# Header/Footer
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [TabList](https://github.com/montlikadani/TabList) |
| ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/montlikadani/TabList) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) |
# Layout
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [BungeeTabListPlus](https://github.com/CodeCrafter47/BungeeTabListPlus) |
| ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/CodeCrafter47/BungeeTabListPlus) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) |
# Nametags
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [NametagEdit](https://github.com/sgtcaze/NametagEdit) |
| ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/sgtcaze/NametagEdit) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Minecraft** | 1.5+ | 1.7+ |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) |
| **Async** | ✔ | ❌ |
| Customization | Per-group<br />Per-player<br />Per-world<br />Per-server | Per-group<br />Per-player |
| PlaceholderAPI support | ✔ | ✔ |
| Configurable collision | ✔ | ✔ |
| Configurable nametag visibility | ✔ | ❌ |
| Conditionally disable the feature | If any specified condition is met | ❌ |
| Bonus | - Option to use armor stands to bypass<br />   all limits and support multiple lines<br />- Anti-override to avoid random plugins breaking it | - |
# Per world playerlist
# Playerlist objective
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [TabList](https://github.com/montlikadani/TabList) |
| ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/montlikadani/TabList) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) |
| Display any number | ✔ | ✔ |
| Supports hearts display type | ✔ | ✔ |
| 1.20.3+ NumberFormat support | ✔ | ❌ |
| Conditionally disable the feature | When any specified condition is met | Disable in worlds |
# Scoreboard
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [RealScoreboard](https://github.com/joserodpt/RealScoreboard) | [AnimatedScoreboard](https://www.spigotmc.org/resources/20848/) | [SternalBoard](https://github.com/ShieldCommunity/SternalBoard) | [KiteBoard](https://github.com/Niall7459/KiteBoard-Documentation) |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/joserodpt/RealScoreboard) | - | ![Issues](https://img.shields.io/github/issues/ShieldCommunity/SternalBoard) | ![Issues](https://img.shields.io/github/issues/Niall7459/KiteBoard-Documentation) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/1286a130-6173-4414-b5c6-43d79d75794d) |
| **Minecraft** | 1.5+ | 1.13+ | 1.8+ | 1.7+ | 1.8 - 1.20.1 |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) |
| **Async** | ✔ | ✔ | ✔ | ✔ | ✔ |
| Customizable toggle command | ✔ | ❌ | ❌ | ❌ | ❌ |
| 1.20.3+ NumberFormat support | ✔ | ❌ | ❌ | ❌ | ❌ |
| Max line length limit (<1.13 / 1.13+) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/b770a19b-9f1a-44c1-8164-394c788998b8) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/3c7c3e31-31e6-4bce-9453-b74b0cadd942) | - / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/3c7c3e31-31e6-4bce-9453-b74b0cadd942) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/98d0f411-5b2c-4ab2-a167-8189d5c32a02) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/3c7c3e31-31e6-4bce-9453-b74b0cadd942) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/98d0f411-5b2c-4ab2-a167-8189d5c32a02) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/3c7c3e31-31e6-4bce-9453-b74b0cadd942) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/98d0f411-5b2c-4ab2-a167-8189d5c32a02) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/3c7c3e31-31e6-4bce-9453-b74b0cadd942) |
| Attribute | [FeatherBoard](https://www.spigotmc.org/resources/featherboard.2691/) | [UltraScoreboards](https://www.spigotmc.org/resources/ultra-scoreboards.93726/) | [QuickBoard](https://github.com/tadeas-drab/QuickBoard) | [SimpleScore](https://github.com/r4g3baby/SimpleScore) | [InfiniteScoreboard](https://www.spigotmc.org/resources/infinite-scoreboard.87425/) |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| **Open issues** | - | - | ![Issues](https://img.shields.io/github/issues/tadeas-drab/QuickBoard) | ![Issues](https://img.shields.io/github/issues/r4g3baby/SimpleScore) | - |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/dd25c457-6b4e-4771-a366-3c5ec154f007) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f2a536e5-4a56-4b5c-9e3d-a86d8761876e) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Minecraft** | 1.7+ | 1.8+ | 1.8 - 1.16.1 | 1.8+ | 1.8 - 1.19 |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) |
| **Async** | ✔ | ❌ | ❌ | ❌ | ✔ |
| Customizable toggle command | ❌ | ❌ | ❌ | ❌ | ❌ |
| 1.20.3+ NumberFormat support | ❌ | ❌ | ❌ | ❌ | ❌ |
| Max line length limit (<1.13 / 1.13+) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/09e5314f-ac46-40ec-b8c8-3ba54a5bf8fc)-![image](https://github.com/NEZNAMY/TAB/assets/6338394/b770a19b-9f1a-44c1-8164-394c788998b8) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/3c7c3e31-31e6-4bce-9453-b74b0cadd942) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ed5c6f89-d700-41a2-b4dd-49ebc846d8c7) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/3c7c3e31-31e6-4bce-9453-b74b0cadd942) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/98d0f411-5b2c-4ab2-a167-8189d5c32a02) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/5db3ba81-3956-4b84-950f-6132d5a10c71) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/98d0f411-5b2c-4ab2-a167-8189d5c32a02) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/5db3ba81-3956-4b84-950f-6132d5a10c71) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/09e5314f-ac46-40ec-b8c8-3ba54a5bf8fc) / ![image](https://github.com/NEZNAMY/TAB/assets/6338394/5db3ba81-3956-4b84-950f-6132d5a10c71) |
# Sorting
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [NametagEdit](https://github.com/sgtcaze/NametagEdit) | [TabList](https://github.com/montlikadani/TabList) | [Velocitab](https://github.com/WiIIiam278/Velocitab) |
| ------------- | ------------- | ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/sgtcaze/NametagEdit) | ![Issues](https://img.shields.io/github/issues/montlikadani/TabList) | ![Issues](https://img.shields.io/github/issues/WiIIiam278/Velocitab) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Minecraft** | 1.8+ | 1.8+ | 1.8+ | 1.8+ |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) |
| **Async** | ✔ | ❌ | ✔ | ✔ |
| Sorting options | Groups<br />Permissions<br />Placeholder alphabetically<br />Placeholder numerically<br />Pre-defined placeholder values | Groups | Groups | Placeholder alphabetically<br />Placeholder numerically |
# Tablist name formatting
| Attribute | [TAB](https://github.com/NEZNAMY/TAB)| [TabList](https://github.com/montlikadani/TabList) | [BungeeTabListPlus](https://github.com/CodeCrafter47/BungeeTabListPlus) | [SimpleTabList](https://github.com/TheYIMIR/SimpleTabList) | [Velocitab](https://github.com/WiIIiam278/Velocitab) |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| **Open issues** | ![Issues](https://img.shields.io/github/issues/NEZNAMY/TAB) | ![Issues](https://img.shields.io/github/issues/montlikadani/TabList) | ![Issues](https://img.shields.io/github/issues/CodeCrafter47/BungeeTabListPlus) | ![Issues](https://img.shields.io/github/issues/TheYIMIR/SimpleTabList) | ![Issues](https://img.shields.io/github/issues/WiIIiam278/Velocitab) |
| **Price** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/9bfa85bd-771c-4d78-ab15-be76665bd84a) |
| **Minecraft** | 1.8+ | 1.8+ | 1.8+ | 1.16+ | 1.8+ |
| **Platforms** | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/ffbf8384-fff5-4a32-8fc5-0768246e91c1) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/f3cc3194-6dfc-4b15-8d46-52144a4a0352) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) ![image](https://github.com/NEZNAMY/TAB/assets/6338394/99ae3191-7b35-4883-91a9-4edbb1e88ac9) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/e39f160b-f2f4-4ccc-84ad-583092741577) | ![image](https://github.com/NEZNAMY/TAB/assets/6338394/53ad76a7-f61c-4b4f-8411-32ad5c473c4d) |
| **Async** | ✔ | ✔ | ✔ | ❌ | ✔ |
+29 -8
View File
@@ -1,20 +1,41 @@
## Easy to install
Support for all possible Minecraft versions containing features the plugin is able to take advantage of, support for multiple platforms (Bukkit, BungeeCord, Velocity, Fabric, Sponge), with everything contained in a single jar which you can download directly. No need to browse version history, ask what plugin version you need for your server version, visit random websites looking for the download button, or anything similar. The same jar supports all versions & platforms, and the latest plugin version will always work for you.
Support for all possible Minecraft versions containing features the plugin is able to take advantage of.
Support for multiple platforms (Bukkit, BungeeCord, Fabric, Forge, NeoForge, Velocity),
with everything contained in a single jar which you can download directly.
No need to browse version history, ask what plugin version you need for your server version,
visit random websites looking for the download button, or anything similar.
The same jar supports all versions & platforms, and the latest plugin version will always work for you.
## It works
The plugin doesn't spam your console with errors, doesn't have compatibility issues with half of the plugins, and doesn't just decide to randomly stop working for no reason. It just works. Bug reports are fixed with highest priority and preferred over adding new features. It's not unusual for a plugin of this size to have a 3-digit open issue count on github. Meanwhile TAB is usually at 1-digit count.
The plugin doesn't spam your console with errors, doesn't have compatibility issues with half of the plugins,
and doesn't just decide to randomly stop working for no reason.
It just works.
Bug reports are fixed with the highest priority and preferred over adding new features.
It's not unusual for a plugin of this size to have a 3-digit open issue count on GitHub.
Meanwhile, TAB is always at 1-digit count.
## Feature packed
All of the most requested features in a single plugin. No need to install many plugins, disable features so they don't conflict with each other, or be forced to run your server on a version that all of the plugins support in common. All features, all server versions in a single plugin.
## Beyond the limits
Mojang decided to put some kind of limitation on almost every feature TAB offers. Other developers simply say "Mojang limit, nothing we can do about it, goodbye". This is not the case here. With every limitation I find, I look for ways to bypass it, and I've found most of them. These bypasses require a ton of work involved, and it's much easier to say "not possible" than actually doing it.
All the most requested features in a single plugin.
No need to install many plugins, disable features, so they don't conflict with each other,
or be forced to run your server on a version that all the plugins support in common.
All features, all server versions in a single plugin.
## Up to date
The plugin is not abandoned. It is constantly getting updated to fix reported bugs, add support for new MC versions as they come out and get new optimizations that can help it run as smoothly as possible, whilst still working the way you want it to.
The plugin is not abandoned.
It is constantly getting updated to fix reported bugs,
add support for new MC versions as they come out and get new optimizations.
All that can help it run as smoothly as possible, whilst still working the way you want it to.
## High performance
Unlike with other plugins where "high performance" often means your CPU usage will be high, TAB has a very low CPU footprint. There is a [command](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-cpu) available that shows the entire plugin's CPU usage. Here you can see which part of TAB is occupying the most of your CPU, and there are [many ways to optimize TAB](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin) to get the most out of it, the most common being increasing refresh rates for individual placeholders if they're inefficient. This is done on a per-placeholder basis, instead of slowing down the refresh rate of an entire feature, which may break animations. Performance is also actively monitored on large servers, and observations show that it performs very well, meaning it will almost certainly perform even better on smaller servers.
Unlike with other plugins where "high performance"
often means your CPU usage will be high, TAB has a very low CPU footprint.
There is a [command](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-cpu) available
that shows the entire plugin's CPU usage.
Here you can see which part of TAB is occupying the most of your CPU.
There are [many ways to optimize TAB](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin)
to get the most out of it.
Performance is also actively monitored on large servers, and observations show that it performs very well,
meaning it will almost certainly perform even better on smaller servers.
## Simple yet powerful configuration
Compared to other plugins, each feature is easier to configure and actually offers more.
+13 -9
View File
@@ -8,16 +8,16 @@ jobs:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # https://github.com/actions/checkout/releases
- uses: actions/checkout@v6 # https://github.com/actions/checkout/releases
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Set up JDK 21
uses: actions/setup-java@v4 # https://github.com/actions/setup-java/releases
- name: Set up JDK 25
uses: actions/setup-java@v5 # https://github.com/actions/setup-java/releases
with:
distribution: 'temurin'
java-version: 21
java-version: 25
- name: Cache Gradle
uses: actions/cache@v4.0.2 # https://github.com/actions/cache/releases
uses: actions/cache@v4.2.0 # https://github.com/actions/cache/releases
with:
path: |
~/.gradle/caches
@@ -31,11 +31,15 @@ jobs:
run: ./gradlew clean build
- name: Rename JAR with Build Number
run: |
original_jar=$(find jar/build/libs -type f -name "TAB-*.jar")
new_name=$(echo "$original_jar" | sed "s/TAB-\(.*\)\.jar/TAB-\1+${{ github.run_number }}.jar/")
mv "$original_jar" "$new_name"
find jar/build/libs -type f -name "TAB v*.jar" -print0 | while IFS= read -r -d '' original; do
dir=$(dirname "$original")
base=$(basename "$original")
new_base="${base%.jar}+${{ github.run_number }}.jar"
new_path="$dir/$new_base"
mv "$original" "$new_path"
done
- name: Upload a Build Artifact
uses: actions/upload-artifact@v4.3.3 # https://github.com/actions/upload-artifact/releases
with:
name: Click here to download
path: jar/build/libs/TAB-*+${{ github.run_number }}.jar
path: "jar/build/libs/TAB v*+${{ github.run_number }}.jar"
+4 -1
View File
@@ -6,4 +6,7 @@ is in quality of the report (typically providing correct steps to reproduce that
* Test **experimental builds**, which can be found in [GitHub Actions](https://github.com/NEZNAMY/TAB/actions) for problems of any kind including bugs.
This way you will help make the actual releases more stable / help get stable releases sooner.
* Help improve the wiki by opening a [Wiki change issue](https://github.com/NEZNAMY/TAB/issues/new?assignees=&labels=Wiki&template=wiki_change.yml),
where you can improve existing descriptions, add information you found missing, fix typos / grammar mistakes or add more examples.
where you can improve existing descriptions, add information you found missing, fix typos / grammar mistakes or add more examples.
* Create spark reports and then send them to me. I will analyze them and try to find optimizations to make the plugin run faster. Commands:
* `/spark profiler start --timeout 300 --thread * --interval 0.1`
* `/spark profiler start --timeout 300 --thread * --interval 0.1 --alloc`
+2 -2
View File
@@ -6,7 +6,7 @@ More information can be found at [Why TAB?](https://github.com/NEZNAMY/TAB/wiki/
# Download
### Releases
You can download full releases from [GitHub releases](https://github.com/NEZNAMY/TAB/releases),
[SpigotMC](https://www.spigotmc.org/resources/57806/), [Modrinth](https://modrinth.com/plugin/tab-was-taken) or [BuiltByBit](https://builtbybit.com/resources/20631).
[SpigotMC](https://www.spigotmc.org/resources/57806/), [Modrinth](https://modrinth.com/plugin/tab-was-taken), [BuiltByBit](https://builtbybit.com/resources/20631) or [CurseForge](https://www.curseforge.com/minecraft/mc-mods/tab).
### Dev builds
Plugin's development is continuous and contains lots of small changes/fixes not worthy of being called a full
@@ -15,7 +15,7 @@ If you want to benefit from a recent change in the code before official release,
from [GitHub actions](https://github.com/NEZNAMY/TAB/actions) (you must be logged into GitHub to be able to download it).
# Compiling
Compilation requires JDK 21 and up.
Compilation requires JDK 25 and up.
To compile the plugin, run `./gradlew build` from the terminal.
Once the plugin compiles, grab the jar from `/jar/build/libs/` folder.
The universal jar contains all modules for all supported platforms.
+1 -1
View File
@@ -1,5 +1,5 @@
dependencies {
compileOnlyApi("org.jetbrains:annotations:24.1.0")
compileOnlyApi("org.jetbrains:annotations:26.0.2")
}
tasks.javadoc {
@@ -17,21 +17,24 @@ public interface TabPlayer {
*
* @return Player's name
*/
@NotNull String getName();
@NotNull
String getName();
/**
* Returns player's UUID
*
* @return Player's UUID
*/
@NotNull UUID getUniqueId();
@NotNull
UUID getUniqueId();
/**
* Returns platform-specific entity
*
* @return platform's player object
*/
@NotNull Object getPlayer();
@NotNull
Object getPlayer();
/**
* Returns true once the player is successfully loaded (onJoin method ran through all methods)
@@ -47,7 +50,8 @@ public interface TabPlayer {
*
* @return player's primary permission group
*/
@NotNull String getGroup();
@NotNull
String getGroup();
/**
* Temporarily overrides player's group and applies all changes coming from new group.
@@ -73,7 +77,7 @@ public interface TabPlayer {
* Changes expected profile name of the player. This adapts all name-bound features
* to use this new profile name if another plugin changed profile name of the player. <p>
* Automatic profile name change detection is available on Bukkit, BungeeCord and Fabric,
* therefore using this is redundant there. This function is only needed on Sponge and Velocity,
* therefore using this is redundant there. This function is only needed on Velocity,
* where the detection is not available. <p>
* Warning: This function does NOT change player's profile name, it only updates the tracked
* name inside the plugin.
@@ -91,4 +95,31 @@ public interface TabPlayer {
*/
@NotNull
String getExpectedProfileName();
/**
* Returns name of the server the player is connected to.
* This requires TAB on proxy.
* On backend installation, this method returns {@code "N/A"}.
*
* @return Player's server on proxy or {@code "N/A"} on backend installation
*/
@NotNull
String getServer();
/**
* Returns name of the world the player is in.
* On proxy installation, TAB-Bridge must be installed to forward this info to the proxy.
* Otherwise, it will return {@code "N/A"}.
*
* @return Player's world or {@code "N/A"} on proxy installation without TAB-Bridge installed
*/
@NotNull
String getWorld();
/**
* Returns {@code true} if this player is a bedrock player, {@code false} if not.
*
* @return {@code true} if this player is a bedrock player, {@code false} if not
*/
boolean isBedrockPlayer();
}
@@ -1,14 +1,14 @@
package me.neznamy.tab.api.bossbar;
import java.util.List;
import java.util.Map;
import lombok.NonNull;
import me.neznamy.tab.api.TabAPI;
import me.neznamy.tab.api.TabPlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Map;
/**
* An interface allowing work with BossBars such as creating, sending
* and toggling.
@@ -78,6 +78,28 @@ public interface BossBarManager {
*/
@NotNull Map<String, BossBar> getRegisteredBossBars();
/**
* Removes BossBar with specified name from the manager, making it no longer available.
* If BossBar was displayed to any players, it is removed.
*
* @param name
* Name of registered BossBar to remove
* @throws IllegalArgumentException
* if no BossBar with specified name exists
*/
void removeBossBar(@NonNull String name);
/**
* Removes BossBar from the manager, making it no longer available.
* If BossBar was displayed to any players, it is removed.
*
* @param bossBar
* BossBar to remove
* @throws IllegalArgumentException
* if specified BossBar is not registered
*/
void removeBossBar(@NonNull BossBar bossBar);
/**
* Toggles BossBar for this player and sends toggle message if {@code sendToggleMessage} is true.
*
@@ -1,48 +0,0 @@
package me.neznamy.tab.api.event.plugin;
import lombok.NonNull;
import me.neznamy.tab.api.TabPlayer;
import me.neznamy.tab.api.event.TabEvent;
import org.jetbrains.annotations.NotNull;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* Called when an unknown placeholder is about to be registered.
* It defaults to a PlaceholderAPI implementation, but can be overridden.
*/
public interface PlaceholderRegisterEvent extends TabEvent {
/**
* Returns placeholder identifier starting and ending with {@code %}
*
* @return placeholder identifier starting and ending with {@code %}
*/
@NotNull String getIdentifier();
/**
* Sets placeholder to specified server placeholder implementation.
*
* @param supplier
* Placeholder replacer
*/
void setServerPlaceholder(@NonNull Supplier<String> supplier);
/**
* Sets placeholder to specified player placeholder implementation.
*
* @param function
* Placeholder replacer
*/
void setPlayerPlaceholder(@NonNull Function<TabPlayer, String> function);
/**
* Sets placeholder to specified relational placeholder implementation.
*
* @param function
* Placeholder replacer
*/
void setRelationalPlaceholder(@NonNull BiFunction<TabPlayer, TabPlayer, String> function);
}
@@ -134,7 +134,7 @@ public interface NameTagManager {
* @param prefix
* new prefix value
* @see #getCustomPrefix(TabPlayer)
* @see #getOriginalPrefix(TabPlayer)
* @see #getOriginalRawPrefix(TabPlayer)
*/
void setPrefix(@NonNull TabPlayer player, @Nullable String prefix);
@@ -148,7 +148,7 @@ public interface NameTagManager {
* @param suffix
* new suffix value
* @see #getCustomSuffix(TabPlayer)
* @see #getOriginalSuffix(TabPlayer)
* @see #getOriginalRawSuffix(TabPlayer)
*/
void setSuffix(@NonNull TabPlayer player, @Nullable String suffix);
@@ -160,7 +160,7 @@ public interface NameTagManager {
* Player to get custom prefix of
* @return Custom prefix assigned using the API.
* @see #setPrefix(TabPlayer, String)
* @see #getOriginalPrefix(TabPlayer)
* @see #getOriginalRawPrefix(TabPlayer)
*/
@Nullable
String getCustomPrefix(@NonNull TabPlayer player);
@@ -173,7 +173,7 @@ public interface NameTagManager {
* Player to get custom suffix of
* @return Custom suffix assigned using the API.
* @see #setSuffix(TabPlayer, String)
* @see #getOriginalSuffix(TabPlayer)
* @see #getOriginalRawSuffix(TabPlayer)
*/
@Nullable
String getCustomSuffix(@NonNull TabPlayer player);
@@ -186,7 +186,7 @@ public interface NameTagManager {
* @see #getCustomPrefix(TabPlayer)
*/
@NotNull
String getOriginalPrefix(@NonNull TabPlayer player);
String getOriginalRawPrefix(@NonNull TabPlayer player);
/**
* Returns original suffix assigned by the plugin using internal logic.
@@ -196,20 +196,86 @@ public interface NameTagManager {
* @see #getCustomSuffix(TabPlayer)
*/
@NotNull
String getOriginalRawSuffix(@NonNull TabPlayer player);
/**
* Returns original prefix assigned by the plugin using internal logic with all placeholders replaced.
* @param player
* Player to get replaced original prefix of
* @return Original prefix assigned by the plugin's internal logic.
* @see #getCustomPrefix(TabPlayer)
*/
@NotNull
String getOriginalReplacedPrefix(@NonNull TabPlayer player);
/**
* Returns original suffix assigned by the plugin using internal logic with all placeholders replaced.
* @param player
* Player to get replaced original suffix of
* @return Original suffix assigned by the plugin's internal logic.
* @see #getCustomSuffix(TabPlayer)
*/
@NotNull
String getOriginalReplacedSuffix(@NonNull TabPlayer player);
/**
* Returns original suffix assigned by the plugin using internal logic.
* @param player
* Player to get replaced original prefix of
* @return Original prefix assigned by the plugin's internal logic.
* @see #getCustomPrefix(TabPlayer)
* @deprecated Use {@link #getOriginalRawPrefix(TabPlayer)} instead.
*/
@Deprecated
@NotNull
String getOriginalPrefix(@NonNull TabPlayer player);
/**
* Returns original suffix assigned by the plugin using internal logic.
* @param player
* Player to get replaced original suffix of
* @return Original suffix assigned by the plugin's internal logic.
* @see #getCustomSuffix(TabPlayer)
* @deprecated Use {@link #getOriginalRawSuffix(TabPlayer)} instead.
*/
@Deprecated
@NotNull
String getOriginalSuffix(@NonNull TabPlayer player);
/**
* Toggles name tag visibility view on all players for specified player.
* On first call, name tags of all players will become invisible for specified
* player. On second call, they will become visible again.
* player. On the second call, they will become visible again.
*
* @param player
* player to toggle name tag visibility view for
* @param sendToggleMessage
* {@code true} if configured toggle message should be sent, {@code false} if not
* {@code true} if the configured toggle message should be sent, {@code false} if not
*/
void toggleNameTagVisibilityView(@NonNull TabPlayer player, boolean sendToggleMessage);
/**
* Shows back name tag visibility view on all players for specified player.
* If the view is not hidden, nothing happens.
*
* @param player
* player to show name tag visibility view for
* @param sendToggleMessage
* {@code true} if the configured toggle message should be sent, {@code false} if not
*/
void showNameTagVisibilityView(@NonNull TabPlayer player, boolean sendToggleMessage);
/**
* Hides name tag visibility view on all players for specified player.
* If the view is already hidden, nothing happens.
*
* @param player
* player to show name tag visibility view for
* @param sendToggleMessage
* {@code true} if the configured toggle message should be sent, {@code false} if not
*/
void hideNameTagVisibilityView(@NonNull TabPlayer player, boolean sendToggleMessage);
/**
* Returns {@code true} if player has hidden name tags by either calling
* {@link #toggleNameTagVisibilityView(TabPlayer, boolean)} or using a command,
@@ -8,6 +8,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* An interface allowing placeholder registration. Instance can be
@@ -65,6 +67,14 @@ public interface PlaceholderManager {
*/
@NotNull RelationalPlaceholder registerRelationalPlaceholder(@NonNull String identifier, int refresh, @NonNull BiFunction<TabPlayer, TabPlayer, String> function);
void registerServerPlaceholder(@NonNull Pattern identifier, int refresh, @NonNull Function<Matcher, Supplier<String>> function);
void registerPlayerPlaceholder(@NonNull Pattern identifier, int refresh,
@NonNull Function<Matcher, Function<me.neznamy.tab.api.TabPlayer, String>> function);
void registerRelationalPlaceholder(@NonNull Pattern identifier, int refresh,
@NonNull Function<Matcher, BiFunction<me.neznamy.tab.api.TabPlayer, me.neznamy.tab.api.TabPlayer, String>> function);
/**
* Returns placeholder from specified identifier. If it does not exist, it is registered
* as a PlaceholderAPI placeholder and returned.
@@ -17,7 +17,7 @@ public interface Scoreboard {
/**
* Returns internal name of this scoreboard. Name is defined in registration,
* scoreboards from config use name they were defined with. This value is
* used internally and in /tab announce scoreboard command.
* used internally and in /tab scoreboard announce command.
*
* @return custom name of this scoreboard
*/
@@ -84,8 +84,24 @@ public interface Scoreboard {
*/
void removeLine(int index);
/**
* Replaces all current lines with the provided list.
* Supports placeholders, which will automatically be refreshed.
* Client can only see up to 15 lines at a time.
* If the new list is identical to the current one, nothing happens.
*
* @param lines
* New list of lines to display
* @throws NullPointerException
* if {@code lines} is {@code null}
* @see #getLines()
* @see #addLine(String)
* @see #removeLine(int)
*/
void setLines(@NonNull List<String> lines);
/**
* Unregisters this scoreboard from all players who can see it.
*/
void unregister();
}
}
@@ -1,13 +1,13 @@
package me.neznamy.tab.api.scoreboard;
import java.util.List;
import java.util.Map;
import lombok.NonNull;
import me.neznamy.tab.api.TabPlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Map;
/**
* Interface allowing work with scoreboards, such as creating,
* sending, toggling and modifying.
@@ -54,6 +54,29 @@ public interface ScoreboardManager {
* @return map of registered scoreboards
*/
@NotNull Map<String, Scoreboard> getRegisteredScoreboards();
/**
* Removes scoreboard with specified name from list of scoreboards. If it was displayed to anyone,
* it will be removed from their display as well. Then, those players will receive a new scoreboard based
* on configuration.
*
* @param name Name of scoreboard to remove
* @throws IllegalArgumentException
* if scoreboard with such name does not exist
*/
void removeScoreboard(@NonNull String name);
/**
* Removes scoreboard from list of scoreboards. If it was displayed to anyone,
* it will be removed from their display as well. Then, those players will receive a new scoreboard based
* on configuration.
*
* @param scoreboard
* Scoreboard to remove
* @throws IllegalArgumentException
* if specified scoreboard is not registered
*/
void removeScoreboard(@NonNull Scoreboard scoreboard);
/**
* Displays scoreboard to defined player. This will disable all display
@@ -27,7 +27,7 @@ public interface TabListFormatManager {
* @param prefix
* new prefix value
* @see #getCustomPrefix(TabPlayer)
* @see #getOriginalPrefix(TabPlayer)
* @see #getOriginalRawPrefix(TabPlayer)
*/
void setPrefix(@NonNull TabPlayer player, @Nullable String prefix);
@@ -41,7 +41,7 @@ public interface TabListFormatManager {
* @param customName
* new customName value
* @see #getCustomName(TabPlayer)
* @see #getOriginalName(TabPlayer)
* @see #getOriginalRawName(TabPlayer)
*/
void setName(@NonNull TabPlayer player, @Nullable String customName);
@@ -55,7 +55,7 @@ public interface TabListFormatManager {
* @param suffix
* new suffix value
* @see #getCustomSuffix(TabPlayer)
* @see #getOriginalSuffix(TabPlayer)
* @see #getOriginalRawSuffix(TabPlayer)
*/
void setSuffix(@NonNull TabPlayer player, @Nullable String suffix);
@@ -67,7 +67,7 @@ public interface TabListFormatManager {
* player to get custom prefix of
* @return player's custom prefix or {@code null} if not defined
* @see #setPrefix(TabPlayer, String)
* @see #getOriginalPrefix(TabPlayer)
* @see #getOriginalRawPrefix(TabPlayer)
*/
@Nullable String getCustomPrefix(@NonNull TabPlayer player);
@@ -104,8 +104,11 @@ public interface TabListFormatManager {
* @return player's original prefix
* @see #setPrefix(TabPlayer, String)
* @see #getCustomPrefix(TabPlayer)
* @deprecated Use {@link #getOriginalRawPrefix(TabPlayer)} instead.
*/
@NotNull String getOriginalPrefix(@NonNull TabPlayer player);
@NotNull
@Deprecated
String getOriginalPrefix(@NonNull TabPlayer player);
/**
* Returns player's original name applied using plugin's internal logic.
@@ -116,8 +119,11 @@ public interface TabListFormatManager {
* @return player's original name
* @see #setName(TabPlayer, String)
* @see #getCustomName(TabPlayer)
* @deprecated Use {@link #getOriginalRawName(TabPlayer)} instead.
*/
@NotNull String getOriginalName(@NonNull TabPlayer player);
@NotNull
@Deprecated
String getOriginalName(@NonNull TabPlayer player);
/**
* Returns player's original suffix applied using plugin's internal logic.
@@ -128,6 +134,69 @@ public interface TabListFormatManager {
* @return player's original suffix
* @see #setSuffix(TabPlayer, String)
* @see #getCustomSuffix(TabPlayer)
* @deprecated Use {@link #getOriginalRawSuffix(TabPlayer)} instead.
*/
@NotNull String getOriginalSuffix(@NonNull TabPlayer player);
@NotNull
@Deprecated
String getOriginalSuffix(@NonNull TabPlayer player);
/**
* Returns original prefix assigned by the plugin using internal logic.
* @param player
* Player to get original prefix of
* @return Original prefix assigned by the plugin's internal logic.
* @see #getCustomPrefix(TabPlayer)
*/
@NotNull
String getOriginalRawPrefix(@NonNull TabPlayer player);
/**
* Returns original name assigned by the plugin using internal logic.
* @param player
* Player to get original name of
* @return Original name assigned by the plugin's internal logic.
* @see #getCustomName(TabPlayer)
*/
@NotNull
String getOriginalRawName(@NonNull TabPlayer player);
/**
* Returns original suffix assigned by the plugin using internal logic.
* @param player
* Player to get original suffix of
* @return Original suffix assigned by the plugin's internal logic.
* @see #getCustomSuffix(TabPlayer)
*/
@NotNull
String getOriginalRawSuffix(@NonNull TabPlayer player);
/**
* Returns original prefix assigned by the plugin using internal logic with all placeholders replaced.
* @param player
* Player to get replaced original prefix of
* @return Original prefix assigned by the plugin's internal logic.
* @see #getCustomPrefix(TabPlayer)
*/
@NotNull
String getOriginalReplacedPrefix(@NonNull TabPlayer player);
/**
* Returns original name assigned by the plugin using internal logic with all placeholders replaced.
* @param player
* Player to get replaced original name of
* @return Original name assigned by the plugin's internal logic.
* @see #getCustomName(TabPlayer)
*/
@NotNull
String getOriginalReplacedName(@NonNull TabPlayer player);
/**
* Returns original suffix assigned by the plugin using internal logic with all placeholders replaced.
* @param player
* Player to get replaced original suffix of
* @return Original suffix assigned by the plugin's internal logic.
* @see #getCustomSuffix(TabPlayer)
*/
@NotNull
String getOriginalReplacedSuffix(@NonNull TabPlayer player);
}
@@ -65,6 +65,20 @@ public interface Layout {
*/
void addFixedSlot(int slot, @NonNull String text, @NonNull String skin, int ping);
/**
* Adds fixed slot with specified parameters
*
* @param slot
* Slot (1-80)
* @param text
* Text to display
* @param skin
* Skin definition like in config
* @param ping
* Slot's ping, accepts placeholders that evaluate to a number
*/
void addFixedSlot(int slot, @NonNull String text, @NonNull String skin, @NonNull String ping);
/**
* Adds a player group.
*
@@ -24,6 +24,18 @@ public interface LayoutManager {
@NotNull
Layout createNewLayout(@NonNull String name);
/**
* Creates new layout with given name and slot count (1.19.3+ only).
*
* @param name
* Unique layout name
* @param slotCount
* Amount of slots to use for 1.19.3+ players
* @return Created layout
*/
@NotNull
Layout createNewLayout(@NonNull String name, int slotCount);
/**
* Returns defined layout from config by name. If no such layout is defined in config,
* {@code null} is returned.
+3 -3
View File
@@ -3,7 +3,7 @@ plugins {
}
dependencies {
implementation("com.github.johnrengelman:shadow:8.1.1")
implementation("io.freefair.gradle:lombok-plugin:8.6")
implementation("fabric-loom:fabric-loom.gradle.plugin:1.8-SNAPSHOT")
implementation("com.gradleup.shadow:shadow-gradle-plugin:9.4.1")
implementation("io.freefair.gradle:lombok-plugin:9.2.0")
implementation("dev.architectury.loom-no-remap:dev.architectury.loom-no-remap.gradle.plugin:1.14-SNAPSHOT")
}
+3
View File
@@ -3,6 +3,9 @@ rootProject.name = "build-logic"
dependencyResolutionManagement {
repositories {
maven("https://maven.fabricmc.net/")
maven("https://maven.architectury.dev/")
maven("https://maven.minecraftforge.net/")
maven("https://maven.neoforged.net/releases/")
gradlePluginPortal()
mavenCentral()
}
@@ -13,7 +13,8 @@ tasks {
"version" to project.version,
"description" to project.description,
"website" to rootProject.ext.get("website")!!.toString(),
"author" to rootProject.ext.get("author")!!.toString()
"author" to rootProject.ext.get("author")!!.toString(),
"credits" to rootProject.ext.get("credits")!!.toString()
))
}
javadoc {
@@ -31,6 +32,6 @@ tasks {
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
languageVersion.set(JavaLanguageVersion.of(25))
}
}
Loaded 100 of 720 files, more files were not shown because too many files have changed in this diff. Show more