Compare commits

...
1495 Commits
Author SHA1 Message Date
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
NEZNAMY 27ee82d17c 5.0.3 2024-12-03 20:11:13 +01:00
NEZNAMY 9405e4e45d [Bukkit] Add 1.21.4 support 2024-12-03 20:06:48 +01:00
NEZNAMY 8616769e32 [Bukkit] Print component converter initialization error if print flag is enabled 2024-12-03 19:12:37 +01:00
NEZNAMY 5d85c4697b [Bukkit] Fix error when a plugin shades adventure library without relocating it 2024-12-03 19:09:55 +01:00
NEZNAMY c54a2b7353 Mark 1.21.4 as the latest supported version 2024-12-03 18:24:17 +01:00
NEZNAMY 35075e88e3 [Fabric] Update to 1.21.4 2024-12-03 18:18:09 +01:00
NEZNAMY 1266d34176 [Wiki] Monthly wiki backup for December 2024 2024-12-01 20:05:59 +01:00
NEZNAMY 66ddf0e3ca [Fabric] Update to 1.21.4-rc3 2024-11-30 14:37:59 +01:00
NEZNAMY 88ab129737 [Fabric] Update to 1.21.4-rc2 2024-11-29 17:18:43 +01:00
NEZNAMY bcd293a255 [Fabric] Update to 1.21.4-rc1 2024-11-28 17:50:24 +01:00
NEZNAMY 4a5ebe6dbd [Fabric] Mark 1.21.4-pre3 as compatible 2024-11-26 18:23:13 +01:00
NEZNAMY ef1c3b1b3b [BungeeCord] Use new features added in build 1885 (no longer supports older builds) 2024-11-26 18:16:04 +01:00
NEZNAMY f7e68ffb6b [Fabric] Update to 1.21.4-pre3 2024-11-26 18:06:10 +01:00
NEZNAMY 2cf2153c4d 5.0.3-SNAPSHOT 2024-11-26 17:43:19 +01:00
NEZNAMY 7e7d0025fa 5.0.2 2024-11-26 17:27:16 +01:00
NEZNAMY 8252b6486e [Fabric] Update to 1.21.4-pre2 2024-11-25 20:03:28 +01:00
NEZNAMY 378041cb16 Merge pull request #1388 from Syrent/master
fix: avoid using TAB's internal vanish checks when a registered vanish integration is available
2024-11-24 19:57:41 +01:00
syrent ee5ff07565 chore: move pv try/catch inside vanish integration if statement 2024-11-24 20:48:02 +03:30
syrent 80c63dd414 chore: don't check for vanished meta if there's a registered vanish integration 2024-11-24 19:55:57 +03:30
NEZNAMY e182366566 [Scoreboard] Fix detection of scoreboards from other plugins not resetting on server switch 2024-11-23 21:18:31 +01:00
NEZNAMY acee89cce3 [BungeeCord] Add TODO 2024-11-23 20:59:45 +01:00
NEZNAMY 3ef3d14c10 [Vanish detection] Properly hook into vanish plugins on Velocity just like on BungeeCord 2024-11-23 20:58:15 +01:00
NEZNAMY 74365780a7 [Code style] Minor fixes from PR 2024-11-23 14:27:26 +01:00
NEZNAMY f6ad80370f Merge pull request #1387 from Syrent/master
feat: add VanishIntegration api
2024-11-23 11:13:12 +01:00
syrent 87eb544936 feat: add VanishIntegration api 2024-11-23 09:20:39 +03:30
NEZNAMY cde0389380 [Fabric] Update to 1.21.4-pre1 2024-11-20 17:46:25 +01:00
NEZNAMY 9e46ffc4e1 [Nametags] Process API calls in feature's thread instead of caller thread 2024-11-17 10:53:42 +01:00
NEZNAMY f3c35de780 [Configuration] Fix startup error if an element in a list is not a String 2024-11-14 20:20:11 +01:00
NEZNAMY 75f5378c8c [Belowname] Do not send updates of vanished players to those who cannot see them 2024-11-14 18:07:07 +01:00
NEZNAMY 19d32127e8 [Fabric] Update to 24w46a 2024-11-13 16:49:59 +01:00
NEZNAMY 2f00aa7750 [Conditions] Fix mistake from past commits not loading true/false values if not wrapped in "" 2024-11-10 18:24:12 +01:00
NEZNAMY 07f5dc68b5 [Velocity] Use new listOrder API (and bump required velocity build number to 450) 2024-11-10 10:08:35 +01:00
NEZNAMY 96a39d7037 [Configuration] Fix unknown key detection not working 2024-11-09 17:40:54 +01:00
NEZNAMY 409f1c4230 [Fabric] Update to 24w45a 2024-11-06 19:19:51 +01:00
NEZNAMY c3d2f9aeea [Commands] Reuse the same list of valid properties 2024-11-05 17:35:17 +01:00
NEZNAMY 380b3dd1f6 [Scoreboard] Add startup warn if trying to use NumberFormat on <1.20.3 server and runtime warn when trying to send it to <1.20.3 player 2024-11-03 16:52:10 +01:00
NEZNAMY c15a6009a2 [MySQL] Execute MySQL queries in a separate thread 2024-11-03 10:04:45 +01:00
NEZNAMY e4e7c364fd [Code style] Make list mutable 2024-11-03 09:46:14 +01:00
NEZNAMY 438361eed2 [Code style] Make fields final 2024-11-03 09:31:50 +01:00
NEZNAMY 684b35f2df [Code style] Refactor config options loading and add a few more misconfiguration checks 2024-11-03 09:13:41 +01:00
NEZNAMY 1d603ae76f [Conditions] Fix warning from previous commit 2024-11-02 16:18:46 +01:00
NEZNAMY a342b23890 [Conditions] Fix conditions without true/false defined not refreshing correctly 2024-11-02 15:49:37 +01:00
NEZNAMY c0dde2eaa7 [Config] Change default default-skin value in layout as the old one contains extra layer (which will be visible on 1.21.4) 2024-11-01 11:25:35 +01:00
NEZNAMY 6245fe9553 [Wiki] Monthly wiki backup for November 2024 2024-11-01 10:19:39 +01:00
NEZNAMY fb5be9e2aa [Paper] Update direct NMS to 1.21.3 2024-10-31 21:11:40 +01:00
NEZNAMY 918620a7dc [Bukkit & Fabric] Update to 24w44a (predicted on Bukkit) 2024-10-31 20:46:51 +01:00
NEZNAMY d2855449f0 [Layout] Add misconfiguration checks if slot is out of range 2024-10-30 20:56:59 +01:00
NEZNAMY f59326c0ae [Configuration] Add console warning if using invalid property for groups / users 2024-10-30 19:58:12 +01:00
NEZNAMY 033b9ed035 [Configuration] Improve warning messages 2024-10-29 20:37:27 +01:00
NEZNAMY 5c299767ec [Vanish detection] Disable Bukkit canSee support due to issues with vanish plugins 2024-10-29 20:16:30 +01:00
NEZNAMY 818701cd07 [RedisSupport] Register messages for features in constructors instead of load to make sure they run immediately and sync in the main thread 2024-10-29 20:08:58 +01:00
NEZNAMY 9b5e63aa25 [RedisSupport] Slightly improve debug message 2024-10-29 20:04:56 +01:00
NEZNAMY 1ad285bd79 [RedisSupport] Queue incoming messages to avoid tasks running before plugin is fully enabled, causing errors 2024-10-28 18:06:57 +01:00
NEZNAMY 4507bb179a Merge pull request #1374 from Tanguygab/master
Added Text PlaceholderAPI support on Fabric
2024-10-27 18:00:39 +01:00
Tanguygab 2dd79295a9 Fixed spacing 2024-10-27 17:56:25 +01:00
Tanguygab b21d840e60 [Fabric] Added FabricTabExpansion 2024-10-27 17:44:24 +01:00
NEZNAMY f3fa40bb0a [GitHub] Store plugin description in source code as backup (phase 4) 2024-10-27 17:11:38 +01:00
Tanguygab d8e14de0cf Fixed error with Text PAPI placeholder 2024-10-26 21:34:25 +02:00
Tanguygab f7b96eceeb Added support for Text PlaceholderAPI on Fabric 2024-10-26 21:26:22 +02:00
NEZNAMY 6f760939f3 [Placeholders] Add validation check to PlaceholderManagerImpl#getPlaceholder 2024-10-26 21:23:17 +02:00
NEZNAMY 5273ad0c5f [Gradle] Update to 8.10.2 2024-10-26 20:22:51 +02:00
NEZNAMY ac12abfb8b [GitHub] Store plugin description in source code as backup (phase 3) 2024-10-26 19:19:04 +02:00
NEZNAMY e5146e7f53 [Misconfiguration] Fix color codes being parsed in warning messages when they should not be. 2024-10-26 19:09:53 +02:00
NEZNAMY 62d1210872 [RGB] Fix using "<" symbol inside gradient breaking it 2024-10-26 18:59:49 +02:00
NEZNAMY 0d0177cd40 Bump bStats to 3.1.0 (this also somehow magically fixes false positives of anti-viruses) 2024-10-26 14:07:38 +02:00
NEZNAMY 227ecf9c9d [Placeholders] Fix error when registering custom server placeholder on proxy 2024-10-26 11:03:09 +02:00
NEZNAMY 562cd50762 [Belowname] Rename config options to hopefully be more clear 2024-10-26 10:29:21 +02:00
NEZNAMY ec56d530a6 [Scoreboard] Fix startup error when a line is configured to be null 2024-10-25 20:57:39 +02:00
NEZNAMY 6350714508 [GitHub] Store plugin description in source code as backup (phase 2) 2024-10-25 20:42:13 +02:00
NEZNAMY 1b251dad6a [GitHub] Store plugin description in source code as backup (phase 1) 2024-10-24 17:12:04 +02:00
NEZNAMY 7765b51a55 5.0.2-SNAPSHOT 2024-10-23 21:16:18 +02:00
NEZNAMY ff6ba6a8e9 5.0.1 2024-10-23 21:04:39 +02:00
NEZNAMY ce3485c823 [Layout] Fix player group condition not getting refreshed properly 2024-10-23 21:04:09 +02:00
NEZNAMY 90a99d3a79 [Fabric] Update to 1.21.3 2024-10-23 20:08:52 +02:00
NEZNAMY 7248dc4fef [Layout] Make check for 1.21.2+ listOrder support better (and work correctly) 2024-10-23 18:36:15 +02:00
NEZNAMY d704db55fa [Code style] Simplify 2024-10-23 16:26:43 +02:00
NEZNAMY 0f581e47b1 5.0.1-SNAPSHOT 2024-10-23 16:25:29 +02:00
NEZNAMY 48013f9b3c 5.0.0 2024-10-22 19:29:31 +02:00
NEZNAMY 258c8ce989 [Velocity] Use proper API method for creating TabListEntry 2024-10-22 19:29:13 +02:00
NEZNAMY c56a703028 Confirm 1.21.2 protocol version 2024-10-22 18:51:17 +02:00
NEZNAMY 4b9ce1b067 [Fabric] Update to 1.21.2 2024-10-22 18:50:56 +02:00
NEZNAMY 39b56725dd [Fabric] Update to 1.21.2-rc1 2024-10-18 21:44:54 +02:00
NEZNAMY b281b18a4e [Code style] Properly implement Platform#getServerVersion on proxies to avoid incorrect results 2024-10-17 17:30:04 +02:00
NEZNAMY b85487375d [Configuration] Rename version in config conversion 2024-10-16 18:27:03 +02:00
NEZNAMY 9ccdc0cf7e [Fabric] Update to 1.20.2-pre5 2024-10-16 17:58:40 +02:00
NEZNAMY 51b1bcf507 [Fabric] Update to 1.20.2-pre4 2024-10-15 18:59:00 +02:00
NEZNAMY 0afe598f3c [Bukkit] Small NMS cleanup 2024-10-13 11:10:38 +02:00
NEZNAMY 4227b0c702 [Nametags] Fix double team register due to concurrency 2024-10-12 19:19:30 +02:00
NEZNAMY 2a4e4a4e2e [Nametags] Fix team register/unregister duplications in combination of (un)vanishing and disable condition change 2024-10-12 19:18:03 +02:00
NEZNAMY a9fa8291de [Velocity] Avoid new object instantiation 2024-10-12 12:39:58 +02:00
NEZNAMY 007c0abc95 [Plugin messages] Protocol break - Identify packets by their ID instead of name 2024-10-12 11:20:18 +02:00
NEZNAMY f9752b7090 [Performance] Disable CPU tracking in netty because getting system time on every packet send was causing high CPU usage by itself 2024-10-12 10:11:32 +02:00
NEZNAMY b44b91f8cc [GitHub] Update branch name in actions 2024-10-11 21:04:51 +02:00
NEZNAMY 352721540a [Fabric] Update to 1.21.2-pre3 2024-10-11 20:25:31 +02:00
NEZNAMY 1ab5f49c3b [Velocity] Remove TAB-Bridge support for scoreboard packet encoding 2024-10-11 19:27:35 +02:00
NEZNAMY 976e6e397a [Bedrock] Update warning message 2024-10-11 17:15:04 +02:00
NEZNAMY e95139b79e [Placeholders] Fix nested placeholders in relational placeholders updating not triggering the main placeholder refresh 2024-10-09 17:16:25 +02:00
NEZNAMY a75f50dcf6 [Bedrock] No longer disable a feature and implement sidebar workaround as new Geyser build resolves these issues on their side. 2024-10-09 14:13:42 +02:00
NEZNAMY 87334c586c I just love Velocity 2024-10-06 18:20:19 +02:00
NEZNAMY eddec70a99 [Nametags] Fix attempts to send team packets when disabled for player 2024-10-06 16:44:47 +02:00
NEZNAMY d1d3279c8e [Fabric] Update to 24w40a 2024-10-03 18:50:58 +02:00
NEZNAMY 13ff1dfb18 [Velocity] Fix exploit (not specifying more to keep users safe) 2024-10-02 20:36:38 +02:00
NEZNAMY e0d09132dd [Wiki] Monthly wiki backup for October 2024 2024-10-01 20:03:45 +02:00
NEZNAMY 99478e7f33 [Build] Remove publishing script 2024-09-28 13:35:01 +02:00
NEZNAMY 02087c735a [Conditions] Automatically trim all spaces 2024-09-27 17:50:12 +02:00
NEZNAMY cd13d588d6 [Layout] Fix ROWS direction not working on 1.21.2 from previous commit 2024-09-26 21:21:04 +02:00
NEZNAMY 6efc23cc15 [Fabric] ACTUALLY update to 24w39a (while keeping older version support) 2024-09-26 21:10:58 +02:00
NEZNAMY 5c28711b26 [Layout] Take advantage of the new 1.21.2 listOrder tablist sorting field to remove entries from chat complete 2024-09-26 20:05:58 +02:00
NEZNAMY e9ae57aff5 [Fabric] Update to 24w39a 2024-09-25 18:16:12 +02:00
NEZNAMY 92e4b1749e [Velocity] Improve error messages 2024-09-24 18:29:46 +02:00
NEZNAMY 854eed74d7 [Code style] Clean up method 2024-09-22 13:45:17 +02:00
NEZNAMY 7c5ef3aa8a [Bukkit] Bump dependency 2024-09-21 15:11:12 +02:00
NEZNAMY 78670b5d90 [Code style] Simplify code 2024-09-20 21:12:03 +02:00
NEZNAMY f43d54b6f6 [Bukkit] Fix team packet creation issue in a past commit 2024-09-20 20:51:24 +02:00
NEZNAMY db0dd75e27 [Fabric] Update to 24w38a 2024-09-19 18:49:06 +02:00
NEZNAMY d6d1649975 [Performance] Speed up TAB#getPlayer function 2024-09-15 14:04:07 +02:00
NEZNAMY f0f0e40897 [Velocity] Cache team display name objects 2024-09-14 18:11:53 +02:00
NEZNAMY 43c1116ac7 [Code style] Call shorter method 2024-09-14 12:02:08 +02:00
NEZNAMY 225f30a257 [Performance] Add check to speed up function 2024-09-13 22:38:43 +02:00
NEZNAMY ae03436592 [Performance] Fix Bridge response placeholder processing calling RefreshableFeature#refresh for every placeholder that changed instead of just once. 2024-09-13 13:09:00 +02:00
NEZNAMY 8a6014fd02 [Configuration] Add global-playerlist.update-latency adding to config converter 2024-09-13 12:33:09 +02:00
NEZNAMY dcc0fafe66 [Layout] Store properties separately and per layout and drop global properties map. This also fixes a theoretical memory leak if mass-switching to new layouts using the API. 2024-09-13 09:49:14 +02:00
NEZNAMY bc33679a1f [Velocity] Cache TextHolder instances for better performance 2024-09-11 19:22:07 +02:00
NEZNAMY d69efe76e5 [Fabric] Update to 24w37a 2024-09-11 18:26:37 +02:00
NEZNAMY 11babe4293 [BelowName] Fix text refresher not running in belowname thread 2024-09-10 20:55:34 +02:00
NEZNAMY 2ba7492f24 [Performance] Skip redundant check if team exists 2024-09-10 17:40:24 +02:00
NEZNAMY 6c65ffb701 [Error logging] Increase log size limit to 16MB from 1MB 2024-09-09 19:49:30 +02:00
NEZNAMY 864e30b3db [Bukkit] Fix direct NMS code check and split it per function (supported versions will start varying since 1.21.2) 2024-09-09 18:42:48 +02:00
NEZNAMY b9124ef873 [Performance] Micro optimization on Bukkit in Team packet 2024-09-09 18:03:33 +02:00
NEZNAMY 77165a5ffb [Performance] Micro optimization on Bukkit 2024-09-08 20:26:28 +02:00
NEZNAMY 54a519de0b [Layout] Use randomly generated property names for fixes slots instead of building them deterministically 2024-09-07 21:23:08 +02:00
NEZNAMY 462d38373f [Layout] Add API method for getting layout from config by name 2024-09-07 18:19:41 +02:00
NEZNAMY 44234422d0 [Performance] Use saved team/objective pointers instead of getting them from maps 2024-09-06 17:23:48 +02:00
NEZNAMY c71fcf51c1 [Velocity] Change checks for Scoreboard API access for better performance 2024-09-06 16:57:08 +02:00
NEZNAMY 33cc4b2aad [Fabric] Update to 24w36a 2024-09-04 17:59:30 +02:00
NEZNAMY 6485356c74 [Scoreboard] Use separate maps for scoreboard-related properties for faster access (also fix a theoretical memory leak if sending too many custom scoreboards with API) 2024-09-01 16:11:36 +02:00
NEZNAMY d0476a93ba [Wiki] Monthly wiki backup for September 2024 2024-09-01 10:07:12 +02:00
NEZNAMY 2eb3548008 [Performance] [BossBar] Store properties in a separate structure instead of using shared properties map 2024-08-31 15:51:13 +02:00
NEZNAMY 028a58c2ae [BungeeCord] Update to builds 1860+ (no longer works on older versions) 2024-08-29 19:10:25 +02:00
NEZNAMY 7675fc11b6 [Fabric] Fix wrong server version check 2024-08-29 19:08:03 +02:00
NEZNAMY 7a10a9e8f2 [Fabric] Remove redundant SneakyThrows annotations 2024-08-29 17:16:49 +02:00
NEZNAMY 8ee869830b [Fabric] Mark all recent supported snapshots as compatible 2024-08-29 16:53:58 +02:00
NEZNAMY 63ecd7b2a2 [Fabric] Move method to different module to reduce reflection usage 2024-08-29 16:44:24 +02:00
NEZNAMY a125076033 [Fabric] Update to 24w35a 2024-08-29 15:15:43 +02:00
NEZNAMY 12153f5783 [Wiki] Create wiki folder containing a backup of all wiki pages 2024-08-28 19:02:32 +02:00
NEZNAMY fdcec16181 [BungeeCord] Avoid sending UPDATE_LIST_ORDER tablist action to <1.21.2 players (#1359) 2024-08-25 20:09:25 +02:00
NEZNAMY 0c4d653921 [Fabric + Bukkit] Update to 24w34a (not tested) 2024-08-25 10:31:25 +02:00
NEZNAMY f488f18a55 Merge #1357 into v5 (Get skin from profile properties by property name) 2024-08-20 16:07:33 +02:00
NEZNAMY 6164dd8f5f [Performance] Change recursion to while loop 2024-08-18 15:14:33 +02:00
NEZNAMY 270062cfe4 [Code style] Remove redundant tablist tracking code 2024-08-16 16:34:33 +02:00
NEZNAMY 014e197a41 [Code style] Remove some redundancies 2024-08-14 19:25:03 +02:00
NEZNAMY bed587d6ba [Fabric] Split PermissionsAPI hook into a separate class 2024-08-14 19:10:02 +02:00
NEZNAMY c15934fdea [Configuration] Rework config loading (part 2) 2024-08-13 19:45:28 +02:00
NEZNAMY 385516f373 [Configuration] Fix bossbar order not being preserved 2024-08-12 18:29:29 +02:00
NEZNAMY c50f5e7728 [Configuration] Fix bossbar progress config loading 2024-08-12 18:25:50 +02:00
NEZNAMY 494bd7368d [Configuration] Fix config loading running before conversion 2024-08-11 08:38:36 +02:00
NEZNAMY b6e8f4c1a7 [Code style] Store TabList, BossBar and Scoreboard instances in TabPlayer object instead of each implementation 2024-08-10 21:15:06 +02:00
NEZNAMY 392e97df2c [Configuration] Fix global playerlist config loading 2024-08-10 21:07:13 +02:00
NEZNAMY 45dbd8c4b2 [Bukkit] Add 1.21.1 to list of versions supported by paper hook 2024-08-10 19:08:38 +02:00
NEZNAMY a0ac7d3324 [Code style] Change fields in TabFeature into getters and fix some annotations 2024-08-10 18:03:27 +02:00
NEZNAMY 4dd7ce5b98 [Configuration] Rework config loading and add a lot more checks (part 1) 2024-08-10 17:11:01 +02:00
NEZNAMY 1a96101672 Update to 1.21.1 2024-08-10 09:57:50 +02:00
NEZNAMY 88f40ab457 [BossBar] Fix ConcurrentModificationException (#1350) 2024-08-08 16:21:53 +02:00
NEZNAMY 70403042d2 [Layout] Fix API usage causing placeholders to not refresh 2024-08-06 17:56:58 +02:00
NEZNAMY ff5a9fa3a9 [Bukkit] Add null check for non-null field because other plugins can make it null 2024-07-28 11:14:36 +02:00
NEZNAMY 5ead664cf9 Update README.md 2024-07-27 23:02:01 +02:00
NEZNAMY bba2b6f2e8 [Code style] Remove redundant check that will never pass 2024-07-27 17:40:31 +02:00
NEZNAMY 4b25571e1a [Code style] Clean up property loading 2024-07-27 16:47:18 +02:00
NEZNAMY 407d0eaeac [Velocity] Ask people to install VelocityScoreboardAPI 2024-07-27 14:53:50 +02:00
NEZNAMY 05bb3a5fa9 [Code style] Make skin downloading return Skin instead of List<String> 2024-07-27 12:16:36 +02:00
NEZNAMY 714a72c849 Merge pull request #1335 from qdpy/v5
Add a signed_texture skin parameter to avoid an API call
2024-07-27 12:00:34 +02:00
NEZNAMY 9ba8f149f7 [Code style] Remove unused method 2024-07-27 10:23:29 +02:00
NEZNAMY c9bb38c036 [Scoreboard] Add misconfiguration check if scoreboard has more than 15 lines defined 2024-07-26 19:01:19 +02:00
NEZNAMY 3241f1cf41 [Sorting] Fix sorting placeholder using old instance when a placeholder is overridden 2024-07-25 21:01:47 +02:00
NEZNAMY 8a7099a6ab [BungeeCord] Add try/catch for yet another NPE in BungeeCord code 2024-07-25 15:57:25 +02:00
NEZNAMY 65c6adcdb2 [Bukkit] Fix compatibility with random modded server 2024-07-22 19:27:42 +02:00
evlad f3f2e69bcf prevent AIOOB exeception 2024-07-16 06:19:29 +03:00
qdpy 335f0a3d6f Add skin signed texture 2024-07-16 03:52:26 +02:00
NEZNAMY a7e711850c [Performance] Use Map#put return type to get rid of Map#get 2024-07-14 12:28:20 +02:00
NEZNAMY 6fb2a7ce76 [Performance] Switch to ConcurrentHashMap instead of synchronizing a map 2024-07-14 11:59:17 +02:00
NEZNAMY 56a6e34847 [Fix] Wrong boolean value from previous commit 2024-07-11 17:23:48 +02:00
NEZNAMY cfa4c869ca [Code style] Clean up task executing and fix mistakes from previous recodes 2024-07-10 21:38:51 +02:00
NEZNAMY d548fbcb74 [Technical] Remove a layer of task wrapping 2024-07-08 19:20:56 +02:00
NEZNAMY d40fbced1a [Performance] [NameTags] Skip containsTeam call 2024-07-08 19:05:39 +02:00
NEZNAMY 21c251b40b [Performance] Avoid redundant StructuredComponent creation when converting RGB colors to legacy in scoreboard 2024-07-07 21:30:51 +02:00
NEZNAMY ec3371085b [Performance] Avoid double map access on team/objective register 2024-07-07 15:56:49 +02:00
NEZNAMY 3779f38c5d [Playerlist Objective] [Performance] Avoid performing unnecessary operations on disable condition change 2024-07-07 15:46:58 +02:00
NEZNAMY 5b62fe2be7 [BelowName] [Performance] Avoid performing unnecessary operations on disable condition change 2024-07-07 15:40:42 +02:00
NEZNAMY ea223bbcb4 [Performance] Avoid double access to placeholder map 2024-07-07 11:17:09 +02:00
NEZNAMY 7f4a56149a [Placeholders] Make one more method synchronized to prevent incorrect re-register that breaks the placeholder on concurrent access 2024-07-06 21:51:02 +02:00
NEZNAMY 52a620c479 [Placeholders] Make methods synchronized to fix concurrent access potentially breaking some placeholders 2024-07-06 21:38:05 +02:00
NEZNAMY 593aaf8039 [Conditions] Avoid re-registering the same placeholder multiple times 2024-07-06 21:11:04 +02:00
NEZNAMY cebb6ea626 [NameTags] Register visibility refresher subfeature in constructor to prevent issues in placeholder updating when registering the placeholder 2024-07-06 21:02:30 +02:00
NEZNAMY 337dc1c4d5 [Technical] Decode plugin messages in a new separate thread 2024-07-06 19:30:20 +02:00
NEZNAMY e110f942e8 [Scoreboard] Add misconfiguration check for invalid scoreboard properties and improve code for existing features 2024-07-06 16:49:24 +02:00
NEZNAMY 6bd5f9dab1 [Error logging] Print warns when receiving redis message of unknown player and add some debug messages 2024-07-03 21:22:45 +02:00
NEZNAMY 09149c559d [Code style] Add missing NotNull annotation 2024-06-30 21:28:42 +02:00
NEZNAMY f9a1130e4b [Performance] Make some placeholders on proxy trigger-based instead of periodic refreshing 2024-06-29 15:43:44 +02:00
NEZNAMY 91304233aa [Code style] Finish getting rid of global component cache 2024-06-29 14:07:52 +02:00
NEZNAMY 99286578c1 [Code style] Create separate component cache for layout fixed slots 2024-06-29 13:43:07 +02:00
NEZNAMY 81888d9aa5 [Code style] Avoid creating simple components in some cases 2024-06-28 21:50:23 +02:00
NEZNAMY f2e4b1b94a [Debug] Add message showing how long it took to unregister teams, objectives and bossbars on unload 2024-06-28 11:26:36 +02:00
NEZNAMY ab269ad740 [Code style] Dynamically remove player boss bars on unload instead of calculating them inside the feature 2024-06-28 10:44:36 +02:00
NEZNAMY 5a1df75526 [Fix] Forcefully shutdown thread executor after it failed to shut down softly 2024-06-27 21:28:12 +02:00
NEZNAMY b74ed1d14e [Code style] Unregister all teams and objectives dynamically instead of in every feature separately and calculating all logic. Can't believe it took me years to come up with this. 2024-06-27 21:24:33 +02:00
NEZNAMY d087db38e3 [Bug fix] Update disable condition status in feature's thread 2024-06-27 21:08:21 +02:00
NEZNAMY ff8c406823 [Velocity] Avoid errors in VelocityScoreboardAPI hook by handling unexpected situations 2024-06-27 15:33:13 +02:00
NEZNAMY 7e12a75bea [Technical] Include thread name in error message if it failed to shut down 2024-06-27 15:27:40 +02:00
NEZNAMY aa7fb09399 [Teams] Fix vanish status change processing not respecting disable condition 2024-06-27 14:40:07 +02:00
NEZNAMY a805b3fe90 [Bukkit] Mark Paper 1.21 as compatible with direct NMS code 2024-06-27 11:06:13 +02:00
NEZNAMY 63d9122440 [Bossbar] Fix bars being resent on server switch even for <1.20.2 players 2024-06-27 10:54:38 +02:00
NEZNAMY f9293c9c92 [Bug fix] Unregister teams of redis players on unload 2024-06-26 16:11:44 +02:00
NEZNAMY 4892fd5817 [Error fix] Fix async features sometimes still using global onlinePlayers array 2024-06-26 14:37:25 +02:00
NEZNAMY cf4a8ae98d [Error fix] Add check for null team name for redis players (temporarily?) 2024-06-26 14:32:24 +02:00
NEZNAMY f0edfeeebf [Error fix] Add try/catch for RedisBungee message sending 2024-06-26 14:28:50 +02:00
NEZNAMY 4d54ad35ff [Bug fix] Colors not displaying correctly in Fabric and Velocity console 2024-06-26 14:13:46 +02:00
NEZNAMY b6b512f788 Merge pull request #1324 from Miyli/v5
[GitHub] Add build number to artifact
2024-06-25 18:02:00 +02:00
Miyli a6076eb6ac [GitHub] Add build number to artifact 2024-06-25 17:40:20 +02:00
NEZNAMY 01b74f0a6e [Bug fix] Unload features in main thread and wait for tasks to shut down to prevent unloading and loading at the same time on reloads 2024-06-25 15:37:40 +02:00
NEZNAMY 6c6752c348 [Velocity] Introducing: Velocity Scoreboard API 2024-06-25 15:10:40 +02:00
NEZNAMY 73873ac193 [Performance] Remove synchronized modifier from method 2024-06-25 14:20:23 +02:00
NEZNAMY 6542dad7bd [Bug fix] Fix synchronized deadlock in placeholder refreshing 2024-06-24 14:16:16 +02:00
NEZNAMY 9bf4a2b555 [Code style] Add and use Scoreboard#renameTeam method 2024-06-21 13:53:06 +02:00
NEZNAMY 66d18a4469 [Code style] Expose Scoreboard#containsTeam method in interface 2024-06-21 13:40:23 +02:00
NEZNAMY 7a489067e6 [NameTags] Fix unregistering and registering team on rename even for players who should not see the team because player is vanished 2024-06-20 22:27:37 +02:00
NEZNAMY 600d6de132 [Code style] Reduce access level of methods 2024-06-20 19:11:02 +02:00
NEZNAMY 48e35e7abd [Performance] Split Header and Footer caches as the values are practically never the same 2024-06-20 14:30:09 +02:00
NEZNAMY 8613e9d734 [Error fix] Add try/catch for PremiumVanish hook 2024-06-20 14:25:50 +02:00
NEZNAMY 9ed277d80d [Error fix] Make methods synchronized to avoid ConcurrentModificationException 2024-06-20 13:44:16 +02:00
NEZNAMY 26345d00a3 [Code style] Clean up method calls 2024-06-20 13:00:57 +02:00
NEZNAMY be70eea0f8 [Performance] [Global playerlist] Add option to disable latency refreshing and disable it by default 2024-06-20 12:14:06 +02:00
NEZNAMY 01357d9ce4 [Sorting] Fix NPE 2024-06-19 17:40:06 +02:00
NEZNAMY 05afafbc45 [Performance] [Global playerlist] Create object for server groups to compare identity instead of having to do heavy checks (also save spy-server status for fast access) 2024-06-18 19:25:55 +02:00
NEZNAMY 68f7272128 [Bug fix] Make plugin message encoding thread shared and don't shut it down, which caused scoreboard packets to not get sent fully on reload, resulting in "Network Protocol Error" on 1.20.5+ 2024-06-18 17:28:40 +02:00
NEZNAMY caa0ab723a [Code style] Reduce calls to "refresh" method in features 2024-06-18 16:40:47 +02:00
NEZNAMY ee0d6002c8 [Code style] Forward group change into features with a new method specifically for that purpose instead of refresh method 2024-06-18 16:30:03 +02:00
NEZNAMY 48f0d04305 [Performance] Only send tablist update packet once for connected player 2024-06-18 15:24:12 +02:00
NEZNAMY 6516b80bf0 Fix error from previous commit 2024-06-18 14:30:45 +02:00
NEZNAMY b0403ff94b [GitHub] Update build.yml dependencies 2024-06-18 14:23:07 +02:00
NEZNAMY 77f88edf08 [Performance] Submit feature refresh task only once instead of once for every player 2024-06-18 14:10:07 +02:00
NEZNAMY be70664c84 [Performance] Use method reference to avoid new lambda instantiation each time 2024-06-18 12:55:27 +02:00
NEZNAMY 37ca992233 [Performance] Store component flat text instead of calculating it each time 2024-06-18 12:42:57 +02:00
NEZNAMY 620904de1c [Performance] Store last placeholder values inside player with placeholder key instead of placeholder with player key 2024-06-18 12:19:33 +02:00
NEZNAMY 9c0fac5c44 [Performance] [BossBar] Store visible boss bars of a player for fast access 2024-06-18 11:48:36 +02:00
NEZNAMY 8846c5a9fe [Performance] [NameTags] Only initialize set if used 2024-06-18 11:14:18 +02:00
NEZNAMY 880d2a8570 [PremiumVanish hook] Make methods synchronized to fix ConcurrentModificationException 2024-06-18 10:18:02 +02:00
NEZNAMY 45b6591518 [API Break] Require placeholders to return String instead of Object 2024-06-17 20:48:09 +02:00
NEZNAMY c6ce99d527 [Code style] Remove redundant SneakyThrows 2024-06-17 20:45:13 +02:00
NEZNAMY 7a7861fd9c [Performance] [Bukkit] Only set field if value actually changed 2024-06-17 20:10:00 +02:00
NEZNAMY 3c11630a6c [Code style] Simplify 2024-06-17 15:50:51 +02:00
NEZNAMY 3b9f4c9884 [RedisBungee] Recode handling of sub-features and small fixes (#1317?) 2024-06-17 15:00:08 +02:00
NEZNAMY 0757fc4352 [RedisBungee] Fix error (#1317) 2024-06-17 10:54:27 +02:00
NEZNAMY c1af721ad2 [NameTags] Properly update online players 2024-06-16 21:17:29 +02:00
NEZNAMY 0ea04394f9 [RedisBungee] Override %serveronline% to count redis players as well (#1316) 2024-06-16 20:09:34 +02:00
NEZNAMY 576c178b4f [NameTags] Move the feature handling to a new custom thread 2024-06-16 19:05:58 +02:00
NEZNAMY 674708cea6 [Playerlist objective] Fix error 2024-06-16 16:54:45 +02:00
NEZNAMY 179b05f992 [Belowname] Fix error 2024-06-16 16:53:26 +02:00
NEZNAMY e2c768bb56 [Performance] Speed up all placeholders returning int by caching string values 2024-06-16 15:10:57 +02:00
NEZNAMY 79e492b230 [Performance] Speed up %gamemode% placeholder 2024-06-16 14:40:07 +02:00
NEZNAMY 708bc5c302 [Global playerlist] Fix error in placeholder before it's loaded 2024-06-16 13:44:19 +02:00
NEZNAMY 9543cd5b5f [Performance] Access player's world and server variables directly instead of via getter 2024-06-16 12:49:56 +02:00
NEZNAMY 0bc8313897 [Technical] Move global playerlist feature handling to a new custom thread 2024-06-16 12:22:30 +02:00
NEZNAMY 91986926cb [Performance] Avoid redundant text color attempt 2024-06-15 17:34:07 +02:00
NEZNAMY ac638add7a [Performance] [Paper] Only rewrite packet if something changed 2024-06-15 15:58:30 +02:00
NEZNAMY 9551783d49 [Performance] [NameTags] Avoid calculating other team properties when changing visibility rule 2024-06-15 15:00:22 +02:00
NEZNAMY 85cf2b3e91 [Performance] [NameTags] Avoid calculating other team properties when changing collision rule 2024-06-15 14:25:05 +02:00
NEZNAMY f98ccb9e44 [Performance] [NameTags] Avoid calculating nametag visibility when only updating prefix/suffix 2024-06-15 13:54:56 +02:00
NEZNAMY 066d50e492 [Performance] Save LuckPerms User object instead of getting it on every request 2024-06-15 12:58:21 +02:00
NEZNAMY 6c823e86fe [Performance] [Scoreboard] Check player's active scoreboard instead of set of players who can see the scoreboard 2024-06-15 12:16:13 +02:00
NEZNAMY 6d3ea577d5 [Error fix] Make method synchronized to avoid ConcurrentModificationException 2024-06-15 11:29:21 +02:00
NEZNAMY 2826e39ea2 [Code style] Make paper a submodule of bukkit 2024-06-15 09:58:48 +02:00
NEZNAMY d855f04612 [Performance] [Fabric] Save enum values in an array for fast access 2024-06-14 23:27:25 +02:00
NEZNAMY 99eb93e66f [Performance] [Bukkit] Add native NMS implementations on 1.20.5+ Paper (where mojang mappings are used) 2024-06-14 23:24:52 +02:00
NEZNAMY e91110d049 [Performance] Avoid double map access 2024-06-14 19:45:44 +02:00
NEZNAMY 8e1bb8519c [Performance] [Bukkit] Save PlayerConnection for sending packets instead of getting it using reflection each time 2024-06-14 19:12:09 +02:00
NEZNAMY 61df01ed1c [Performance] Massively boost last color of prefix getting, also remove cache and save it inside the component 2024-06-14 18:38:15 +02:00
NEZNAMY c219aa83b1 [Code style] Remove unused imports 2024-06-14 15:26:03 +02:00
NEZNAMY 71109b397d [Code style] Remove redundant initialization 2024-06-14 15:23:42 +02:00
NEZNAMY 4fe4c2981d [Code style] Add NotNull annotation 2024-06-14 15:15:16 +02:00
NEZNAMY 2f9f2f722c [Code style] Add NotNull annotation 2024-06-14 15:06:33 +02:00
NEZNAMY 40009d018c [Code style] Clean up code by passing Objective parameter instead of its values 2024-06-14 15:03:29 +02:00
NEZNAMY 251480fd4a [MiniMessage] Add dummy character to parsed text to disable color compacting (#1312) 2024-06-14 14:23:42 +02:00
NEZNAMY 6295145d5b [Scoreboard] Disable check to fix error on reload 2024-06-14 12:09:26 +02:00
NEZNAMY 17f2e67334 [Code style] Construct platform's team immediately to avoid nullability warn 2024-06-14 11:50:39 +02:00
NEZNAMY fe4130a846 [Bukkit] Fix text cutting not considering client version (#1313) 2024-06-14 10:52:57 +02:00
NEZNAMY 141201b7aa [Sponge 7] Add missing text cutting to 32 characters 2024-06-13 21:39:50 +02:00
NEZNAMY 3b3c511572 Change build.yml to use v5 branch 2024-06-13 21:15:10 +02:00
NEZNAMY 8c6cf8ee22 Add 1.21 support 2024-06-13 21:14:05 +02:00
NEZNAMY 231fd36ce9 [Performance] Save FixedFormat across all platforms and store it inside TabComponent class to reduce need for a cache 2024-06-12 20:50:13 +02:00
NEZNAMY fb9dd0a899 [Code style] Extend class to avoid code duplication 2024-06-12 20:02:50 +02:00
NEZNAMY d98bcdb4e8 [Fix] Concurrent access to online players causing features to try to work with players before loading them 2024-06-12 19:15:33 +02:00
NEZNAMY f94a87e6d5 [Performance] Use more efficient caching of last team prefix color 2024-06-12 17:39:30 +02:00
NEZNAMY 1501d5e71e [Performance] Store serialized json of a component inside of it instead of using a cache 2024-06-12 17:24:16 +02:00
NEZNAMY a7d955266d [Code style] Make cache efficiency calculation more accurate 2024-06-12 17:08:01 +02:00
NEZNAMY 9633a6c176 [Code style] Make cache efficiency calculation more accurate 2024-06-12 17:04:33 +02:00
NEZNAMY 9d50090dbd [Performance] Create separate component caches for scoreboard and nametags 2024-06-12 17:02:50 +02:00
NEZNAMY 8b96a8e654 [Performance] Add missing caching for Redis sub-features 2024-06-12 14:15:54 +02:00
NEZNAMY 453288bf77 [Performance] Convert text to TabComponent in BossBar immediately and cache it 2024-06-12 14:08:59 +02:00
NEZNAMY 26fb0ec2e9 [Performance] Split component caches for some features as they usually never share the same inputs across features, reducing efficiency 2024-06-12 13:53:03 +02:00
NEZNAMY 2671052cad [Code style] Remove redundant SneakyThrows 2024-06-11 22:08:20 +02:00
NEZNAMY 7f1bcd69c8 [Code style] Save platform's scoreboard teams and objectives inside TAB's classes for fast access 2024-06-11 21:23:18 +02:00
NEZNAMY 5fe83af514 [Fix] Make scoreboard methods synchronized to prevent values not getting saved when accessing from multiple threads (despite being concurrent) 2024-06-11 21:12:54 +02:00
NEZNAMY 89dc2f09fc [Fix] Make player properties ConcurrentHashMap to fix issues with parallel access 2024-06-11 20:53:15 +02:00
NEZNAMY 7ce564409a [Fix] Disable instance activity check as internals were accidentally triggering it, especially with parallel processing 2024-06-11 18:32:05 +02:00
NEZNAMY 2e34069d14 [Fix] Add "synchronized" to method to fix concurrent access error 2024-06-11 18:27:21 +02:00
NEZNAMY e435501501 [Sorting] Fix sorting by pre-defined values space trimming inconsistency 2024-06-11 15:38:38 +02:00
NEZNAMY 51402637c6 [Fabric] Update to 1.21-rc1 2024-06-10 16:29:25 +02:00
NEZNAMY 44593f7a75 [Code style] Create custom thread executor class for easier usage 2024-06-10 14:10:27 +02:00
NEZNAMY 48596efa77 [Technical] Process Belowname and Playerlist Objective feature in a separate custom thread 2024-06-10 13:10:11 +02:00
NEZNAMY 3e323df70d [Fix] Process Header/Footer disable condition change in its own thread 2024-06-10 11:01:50 +02:00
NEZNAMY 0d89cef519 [Technical] Process SpectatorFix feature in a separate custom thread 2024-06-09 13:00:03 +02:00
NEZNAMY f758fdf8f3 [Code style] Create runnables instead of using lambdas for cleaner stack traces 2024-06-09 12:43:15 +02:00
NEZNAMY 44b9f06087 [Technical] Process Scoreboard feature in a separate custom thread 2024-06-09 12:12:22 +02:00
NEZNAMY d1155d5e7a [Fabric] Update to 1.21-pre4 2024-06-07 18:39:15 +02:00
NEZNAMY 51ccd029ca [Layout] Fix feature attempting to format tablist names of players who have them disabled with condition 2024-06-07 15:26:48 +02:00
NEZNAMY 1df83dac91 [Fix] RejectedExecutionException in feature threads on reload 2024-06-07 14:49:21 +02:00
NEZNAMY a3c1d643fd [Fix] Refresh call not being called in feature's thread 2024-06-07 14:05:21 +02:00
NEZNAMY 4350e311e7 [Fix] Throwables not being logged when thrown thrown in new threads 2024-06-07 13:48:39 +02:00
NEZNAMY 89ec9355bd [Technical] Process PingSpoof feature in a separate custom thread 2024-06-07 12:15:58 +02:00
NEZNAMY f2be7220f3 [Layout] Send fake ping if ping spoof is enabled immediately instead of having to rewrite it 2024-06-07 12:05:08 +02:00
NEZNAMY 0cbac252a5 [Technical] Process BossBar feature in a separate custom thread 2024-06-07 11:43:16 +02:00
NEZNAMY 3ea60971be [Fix] ConcurrentModificationException on high player counts 2024-06-06 22:09:48 +02:00
NEZNAMY 8ea76e2016 [Technical] Create Runnables instead of using lambdas for cleaner stack traces 2024-06-06 22:01:02 +02:00
NEZNAMY 86d2d732eb [BungeeCord] Fix NPE in packet reader 2024-06-06 18:15:08 +02:00
NEZNAMY 55ce84a5ae [Technical] Process Header/Footer in a separate custom thread (and prepare other features) 2024-06-06 18:07:40 +02:00
NEZNAMY 0f0e4de682 [Code style] Replace forEach with for loop for shorter stack traces 2024-06-06 14:54:20 +02:00
NEZNAMY ad60372cf2 [Error handling] Properly print errors if thrown in recently added threads 2024-06-06 14:29:42 +02:00
NEZNAMY 3cf5fd7cbd [Technical] Run plugin message encode and send in a new custom thread 2024-06-06 13:48:18 +02:00
NEZNAMY ce090566cc [Technical] Run tablist entry anti-override task in a new custom thread 2024-06-05 22:19:58 +02:00
NEZNAMY 866f645eed [Code style] Replace forEach with for loop for shorter stack traces 2024-06-05 22:17:35 +02:00
NEZNAMY 64f3bebd3d [Fabric] Update to 1.21-pre3 2024-06-05 15:50:49 +02:00
NEZNAMY 239cc461d5 [Code style] Use shorter alternative 2024-06-05 11:28:57 +02:00
NEZNAMY b832784977 [Code style] Refactor pipeline injection on BungeeCord 2024-06-05 11:09:59 +02:00
NEZNAMY 0f37b0be54 [RedisBungee] Add config option for disabling RedisBungee hook 2024-06-03 17:10:11 +02:00
NEZNAMY bb428af3af [Configuration] Add another misconfiguration check 2024-06-03 11:37:03 +02:00
NEZNAMY 1c4d9704f2 [Commands] Fix error when setting property value to ' or " 2024-06-01 16:48:24 +02:00
NEZNAMY 53a5eae721 [Fabric] Update to 1.21-pre2 2024-05-31 20:45:42 +02:00
NEZNAMY 049ab257e2 [Placeholders] Fix server placeholders not returning proper value on request sometimes 2024-05-30 16:28:38 +02:00
NEZNAMY 0ece5319ea [Fabric] Update to 1.21-pre1 2024-05-29 20:32:10 +02:00
NEZNAMY b847cc1178 [Teams] [Bukkit] Fix team action not being taken correctly on 1.8 - 1.12, causing issues with previous commit 2024-05-29 13:36:22 +02:00
NEZNAMY 422da3e1ba [Commands] Fix error in debug command 2024-05-28 14:52:40 +02:00
NEZNAMY 868c6baebf [Teams] Fix another instance of "Network Protocol Error" disconnect on 1.20.5+ 2024-05-28 14:27:47 +02:00
NEZNAMY 9a3cf167ed [Performance] Change way placeholder values are stored in plugin's PlaceholderAPI expansion for better performance 2024-05-27 22:46:10 +02:00
NEZNAMY cdf47ebab0 [Visuals] Refresh permission groups in another thread (also split its CPU usage tracking to 2 parts) 2024-05-27 22:06:00 +02:00
NEZNAMY 929d1f945b [Code style] Replace try/catch with SneakyThrows 2024-05-27 15:46:01 +02:00
NEZNAMY 2671242d2c [Code style] Remove duplicate class mapping 2024-05-27 14:25:34 +02:00
NEZNAMY 78cff8dea8 [Bukkit] Add support for latest 1.21 snapshot 2024-05-27 13:43:32 +02:00
NEZNAMY 7ac3840831 [Javadoc] Fix typo 2024-05-27 13:42:51 +02:00
NEZNAMY 556ee6df01 [Sorting] Make number padding correct (may rarely only insert 1 character) 2024-05-26 12:48:28 +02:00
NEZNAMY 2eca28e497 [Sorting] Fix number compression bug (#1297) 2024-05-26 12:37:35 +02:00
NEZNAMY 76ff5d49e2 [Code style] Simplify array creation 2024-05-25 21:50:43 +02:00
NEZNAMY 2a919aa6b7 [Performance] Fix Header/Footer components not being cached on some platforms from recent commits 2024-05-25 14:21:12 +02:00
NEZNAMY c83f806e4c [Code style] Store expected TabList display names by UUID instead of TabPlayer 2024-05-25 14:07:50 +02:00
NEZNAMY afbfd38dfd [Bukkit] Add back fallback solutions for Scoreboards using Paper API and Bukkit API 2024-05-23 13:51:11 +02:00
NEZNAMY 6874916ce0 [Javadoc] Update class description 2024-05-23 13:10:39 +02:00
NEZNAMY 143c4fc7e4 [Code style] Remove expected header/footer tracking, since it's not used anyway (for now) 2024-05-23 13:04:49 +02:00
NEZNAMY f85e945a32 [Bukkit] Fix compatibility wih Mojang mapped servers jars 2024-05-22 21:21:24 +02:00
NEZNAMY d0110c9a4f [Fabric] Update to 24w21b 2024-05-22 20:54:15 +02:00
NEZNAMY 4307768bee [Code style] Split TabList class into an interface and abstract class 2024-05-22 20:24:59 +02:00
NEZNAMY 88773e3232 [BossBar] Fix error when trying to display bossbar that was not visible on join 2024-05-22 10:14:06 +02:00
NEZNAMY 8f32772f83 Add TODO 2024-05-21 18:09:02 +02:00
NEZNAMY 17b3c28d91 [Performance] Only track placeholder usage if cpu tracking is enabled 2024-05-21 17:58:34 +02:00
NEZNAMY 45945d9a13 [Sponge 8] Add 1.20.6 support 2024-05-21 16:57:45 +02:00
NEZNAMY ba9741a084 [Code style] Split Scoreboard class into and interface and abstract class with tracking, also resend content on server switch using tracked values instead of from each feature individually 2024-05-21 16:04:35 +02:00
NEZNAMY 3bcad371d2 [Code style] Create a class for BossBar managing all safety checks and extend it in all implementations and resend them on server switch internally instead of using bossbar feature itself 2024-05-20 22:06:49 +02:00
NEZNAMY 1e9bf68671 [BossBar] Fix Network Protocol Error disconnect on server switch 2024-05-20 12:37:31 +02:00
NEZNAMY f57df6a536 [BossBar] Make %countdown% return 0 after announcement is over instead of going to negative numbers 2024-05-20 11:18:44 +02:00
NEZNAMY 793536d2d3 [Fix] Fix typo 2024-05-18 18:18:00 +02:00
NEZNAMY 9a348da34f [Code style] Simplify 2024-05-18 17:45:03 +02:00
NEZNAMY 4819bf63b6 [Bukkit] Add back fallback solutions for Header/Footer using Paper API and Bukkit API if NMS fails to load 2024-05-18 17:32:43 +02:00
NEZNAMY 5777d49861 [Performance] [Bukkit] Use Adventure API for BossBars if available for massively improved performance 2024-05-18 12:28:46 +02:00
NEZNAMY 7540c61fde [Code style] Create fields for adventure components from TAB component to allow multiple options in the future 2024-05-18 11:57:59 +02:00
NEZNAMY 308da4cbac [Code style] Create field for feature name and define it in constructor instead of creating abstract functions 2024-05-17 22:17:11 +02:00
NEZNAMY 615af41de8 [Performance] Return placeholder values as strings to prevent boxing objects being created 2024-05-17 20:24:46 +02:00
NEZNAMY 7c473a4e3f [Performance] Change functional interface usage to avoid int -> Integer boxing 2024-05-17 18:58:03 +02:00
NEZNAMY 79b4f9821b [Performance] Add cooldown to player vanish check 2024-05-17 17:23:16 +02:00
NEZNAMY 80825ee701 [Code style] Mark fields of class as NonNull 2024-05-17 16:51:09 +02:00
NEZNAMY aa0e60b091 [Fix] Fix startup error caused by one of the previous commits 2024-05-17 16:50:49 +02:00
NEZNAMY 718cfb682d [Code style] Improve readability of some sorting functions (also probably fix sorting API not working in layout) 2024-05-17 12:49:02 +02:00
NEZNAMY 66f0426e6a [Code style] Remove unused method 2024-05-17 12:25:55 +02:00
NEZNAMY 145671ecdd [Code style] Remove unused methods 2024-05-17 12:22:08 +02:00
NEZNAMY 43d71f7e49 [Code style] Remove unused import 2024-05-17 12:20:26 +02:00
NEZNAMY 150de771d5 [Code style] Initialize map values in construction instead of creating anonymous class 2024-05-17 12:20:16 +02:00
NEZNAMY 50da728abf [Code style] Remove redundant checks 2024-05-17 11:05:28 +02:00
NEZNAMY 656ce6ecad [Performance] Create player data classes for Tablist formatting and teams to avoid Map lookup each time 2024-05-17 11:01:54 +02:00
NEZNAMY 8a758dffec [Performance] Create player data class for Belowname to avoid Map lookup each time 2024-05-16 21:14:07 +02:00
NEZNAMY 52bd538ed0 [Performance] Create player data class for Playerlist objective to avoid Map lookup each time 2024-05-16 20:58:49 +02:00
NEZNAMY 115c5ac890 [Bug fix] Fix disabled tablist formatting referencing wrong variable 2024-05-16 20:43:46 +02:00
NEZNAMY 0f7d15a4d0 [Performance] Create player data class for Header/Footer to avoid Map lookup each time 2024-05-16 20:39:04 +02:00
NEZNAMY 5b6e07d5d3 [Fabric] Update to 24w20a 2024-05-15 17:22:15 +02:00
NEZNAMY 8579ed322d [Code style] Remove redundant class wrapper for a Map 2024-05-15 15:19:53 +02:00
NEZNAMY 44464b605d [Fabric] Replace Minecraft version check with fabric networking api check (which is what is preventing the mod from working there) 2024-05-14 11:30:08 +02:00
NEZNAMY e8124dd280 [Fabric] Replace Fabric API call with direct NMS call 2024-05-13 22:25:19 +02:00
NEZNAMY 0105fc2087 [Fabric] Remove unused field 2024-05-12 14:10:28 +02:00
NEZNAMY 39e7b26128 [Fabric] Remove entity packets from access widener 2024-05-12 14:05:58 +02:00
NEZNAMY ddbc13fc27 [Scoreboard] Remove respect-other-plugins config option, it is now forced 2024-05-12 13:57:15 +02:00
NEZNAMY 80660fa6cf [Performance] Small optimization of scoreboard packet processing 2024-05-12 13:16:52 +02:00
NEZNAMY b4a94e8da5 [Code style] Remove unused method 2024-05-12 12:34:32 +02:00
NEZNAMY 051c9a8c85 [BossBar] Add console warn if used color or style is invalid 2024-05-12 12:27:28 +02:00
NEZNAMY 840b1ea4a2 [Code style] Remove unused field 2024-05-12 11:32:14 +02:00
NEZNAMY ea57695a31 [Fix] Remove forgotten references to deleted unlimited nametag feature 2024-05-12 11:28:49 +02:00
NEZNAMY 90778bc84c Merge branch 'master' into v5 2024-05-11 21:31:45 +02:00
NEZNAMY 949216325f [Nametags] Only make nametags of invisible players invisible for 1.8 players to compensate for the bug instead of everyone (#1287) 2024-05-11 21:29:55 +02:00
NEZNAMY cdb521de1f [BungeeCord] Initialize different BossBar instance for 1.8 players to avoid version check every time 2024-05-11 17:01:49 +02:00
NEZNAMY e50b39c559 [Javadoc] Document more methods 2024-05-11 14:36:01 +02:00
NEZNAMY 80afb497e0 [Code style] Remove unused field 2024-05-11 13:34:53 +02:00
NEZNAMY e83a12aaee [Fabric] Mark 1.17 as supported again 2024-05-11 13:24:12 +02:00
NEZNAMY 461860bb17 Delete unlimited nametag and wither bossbar features 2024-05-11 13:22:00 +02:00
NEZNAMY cff4e3e6b0 5.0.0-SNAPSHOT 2024-05-11 12:20:46 +02:00
NEZNAMY dddf0b35a2 [Code style] Add missing access level to field 2024-05-11 11:43:51 +02:00
NEZNAMY 35ec2bf215 [Code style] Make fields final 2024-05-11 11:43:05 +02:00
NEZNAMY 607b60b323 [Code style] Remove unused method 2024-05-11 11:41:35 +02:00
NEZNAMY bb6ad72962 [Code style] Improve presence check of Player#getPing method 2024-05-10 17:05:47 +02:00
NEZNAMY 4fb8420d69 [Code style] Remove unused method 2024-05-10 16:59:11 +02:00
NEZNAMY 74af19a9d9 [Code style] Move field to a local variable 2024-05-10 16:53:51 +02:00
NEZNAMY 737ac70e6e [Fabric] Update to 24w19a 2024-05-10 16:28:39 +02:00
NEZNAMY bfc72b735c [Fabric] Add another submodule for 1.18.2 to avoid hardcoding method and class names 2024-05-10 16:05:09 +02:00
NEZNAMY 323412f935 [Code style] Decrease field visibility 2024-05-10 14:56:00 +02:00
NEZNAMY db34ba4995 [Fabric] Improve check for Fabric API features availability 2024-05-10 14:54:01 +02:00
NEZNAMY 15d7eb6d91 [Javadoc] Document more methods 2024-05-10 14:50:02 +02:00
NEZNAMY e2b95df2e4 [Bukkit] Explicitly specify constructor to fix compatibility with forge mods that widen a constructor access, causing TAB to choose the wrong one on 1.19.3+ (#1276) 2024-05-10 13:42:50 +02:00
NEZNAMY 1117094412 [Bug fix] Update library to fix error 2024-05-09 14:54:46 +02:00
NEZNAMY 4bab076642 [Bug fix] Fix group change from Bridge not being processed correctly (#1281) 2024-05-09 13:38:36 +02:00
NEZNAMY d602818f67 [Bug fix] Disable tablist containsEntry usage due to a race condition that sometimes makes it not work properly until a better solution is found (#1284) 2024-05-08 09:37:35 +02:00
NEZNAMY 1a76321062 [Fabric] Update to 24w18a 2024-05-04 20:37:08 +02:00
NEZNAMY 4b056529dd [Fix] Add cpu usage of placeholders inside plugin's main thread instead of placeholder thread to avoid incorrect numbers when it's overloaded 2024-05-04 20:29:21 +02:00
NEZNAMY bdbf3ba5b1 [Velocity] Remove message printing if attempting to send plugin message to a player who is not connected to any server (#1248) 2024-05-03 22:35:29 +02:00
NEZNAMY aab9a650b0 Fix startup error when using a plugin that shades MiniMessage without shading component serializers (#1280) 2024-05-03 14:47:25 +02:00
NEZNAMY f8487f07a6 Create array of component decorations to take values from to avoid instantiation each time 2024-05-02 21:06:15 +02:00
NEZNAMY e38721fa69 Speed up function 2024-05-02 19:30:22 +02:00
NEZNAMY 18e52f2f10 Add 1.20.6 to known versions 2024-04-29 18:06:16 +02:00
NEZNAMY f1300410b8 Update Fabric to 1.20.6 2024-04-29 18:03:52 +02:00
NEZNAMY e17059f1f7 Update library to fix error (1276) 2024-04-29 12:26:29 +02:00
NEZNAMY f3e9f7cf06 [BungeeCord] Remove console warn regarding ViaVersion on BungeeCord as it no longer breaks anything 2024-04-28 18:08:50 +02:00
NEZNAMY 63ed24d136 [Bukkit] Use Spigot internals over Paper API as a primary TPS getter (uses 10x less CPU and 100x less memory allocations) 2024-04-28 14:01:33 +02:00
NEZNAMY 66008cd767 [Velocity] Fix "Received packet for unknown scoreboard objective: TAB-BelowName" on server switch 2024-04-27 19:03:46 +02:00
NEZNAMY 1852c1b5c4 Create array to iterate over to prevent creating new instance every time 2024-04-26 20:12:45 +02:00
NEZNAMY 9a4fc2fc73 Fix field type 2024-04-26 11:52:55 +02:00
NEZNAMY 6846a78833 Require plugin list in a bug report 2024-04-26 11:52:15 +02:00
NEZNAMY d3d9e85a7f Merge branch '4.1.5'
# Conflicts:
#	build.gradle.kts
2024-04-26 11:47:03 +02:00
NEZNAMY f867b6b2ea 4.1.5-SNAPSHOT 2024-04-23 21:09:31 +02:00
NEZNAMY 6b38954694 4.1.4 2024-04-23 20:57:31 +02:00
NEZNAMY 9eb350df30 Fix startup on 1.19.3 - 1.20.4 2024-04-23 20:57:12 +02:00
NEZNAMY 639aa5e251 Fix startup on 1.19.3 - 1.20.4 2024-04-23 20:56:06 +02:00
NEZNAMY f089e26998 Added 1.20.5 support to Bukkit 2024-04-23 19:30:14 +02:00
NEZNAMY 9070a6aadc 4.1.3 2024-04-23 19:11:24 +02:00
NEZNAMY c68e135c66 Added 1.20.5 support to Bukkit 2024-04-23 19:11:17 +02:00
NEZNAMY 8693b4fe8f Mark 1.20.5 as latest supported version 2024-04-23 17:37:21 +02:00
NEZNAMY 9390a402ff Update Fabric to 1.20.5 2024-04-23 17:35:38 +02:00
NEZNAMY 7fda2c5f88 Add 1.20.5 ProtocolVersion constant 2024-04-23 17:35:15 +02:00
NEZNAMY cb394007a4 Update Fabric to 1.20.5 2024-04-23 17:25:00 +02:00
NEZNAMY cd92910281 Add 1.20.5 ProtocolVersion constant 2024-04-23 17:24:35 +02:00
NEZNAMY 7f0b2e2b13 Initialize feature data structured on declaration to make it cleaner & fix error 2024-04-23 16:16:51 +02:00
NEZNAMY bdc44d46c8 Add Exception throwing when attempting to use API class instances that got discarded on reload. 2024-04-23 16:10:24 +02:00
NEZNAMY 8d8480469a Update Fabric to 1.20.5-rc3 2024-04-23 15:28:30 +02:00
NEZNAMY a91fe6db36 Remove unused SneakyThrows 2024-04-23 12:51:41 +02:00
NEZNAMY 20d734aa80 Add missing action mapping 2024-04-23 12:43:20 +02:00
NEZNAMY f053bbd544 Access Team packet data directly on 1.17+ Fabric instead of using reflection 2024-04-23 12:40:14 +02:00
NEZNAMY 7eba26cab1 Rename class to match version number 2024-04-23 12:15:47 +02:00
NEZNAMY 5f77dd0adb Rename class to match version number 2024-04-23 12:14:42 +02:00
NEZNAMY 4ef94d3c60 Update Fabric to 1.20.5-rc3 2024-04-22 17:03:08 +02:00
NEZNAMY 36006045e2 Add "listed" TabList flag support into internal API 2024-04-22 16:54:39 +02:00
NEZNAMY d5d025c2c9 Store information about player meeting a feature's disable condition inside player class to improve performance by avoiding Map lookup each time 2024-04-22 14:41:34 +02:00
NEZNAMY 5b7053d500 Store feature data of players inside TabPlayer class to improve performance by avoiding Map lookup 2024-04-22 14:06:37 +02:00
NEZNAMY ce2e60c268 4.1.4-SNAPSHOT 2024-04-21 21:43:25 +02:00
NEZNAMY 8e9b575c37 Update Fabric to 1.20.5-rc2 2024-04-19 20:13:26 +02:00
NEZNAMY beab7d5a4f Update Fabric to 1.20.5-rc1 2024-04-18 16:26:16 +02:00
NEZNAMY d2f5fc4d69 Update Fabric to 1.20.5-pre4 2024-04-17 15:57:16 +02:00
NEZNAMY fb9a7f693b Update Fabric to 1.20.5-pre3 2024-04-16 16:48:03 +02:00
NEZNAMY 1d2d636270 Fix compilation warning on Fabric 1.14.4 submodule 2024-04-16 09:28:35 +02:00
NEZNAMY 37ec5ee442 Update Fabric to 1.20.5-pre2 2024-04-15 19:08:50 +02:00
NEZNAMY 5ed67cf5f8 Remove recently added config option that doesn't add any real value 2024-04-13 13:21:04 +02:00
NEZNAMY 76fc47d5bd Fix client lag when another plugin removes player from team (#1193) 2024-04-13 13:11:35 +02:00
NEZNAMY aa856beee1 Refactor team anti-override code to avoid duplicating code 2024-04-13 11:37:50 +02:00
NEZNAMY e6f2cc3eda Simplify 2024-04-12 15:00:32 +02:00
NEZNAMY 02fd45587b Fix replacements to %group% changing the group name inside plugin internals as well 2024-04-12 14:45:32 +02:00
NEZNAMY 7cef6eeb61 Update Fabric to 1.20.5-pre1 2024-04-10 19:11:43 +02:00
NEZNAMY da919bc43b Add BuiltByBit link to download links 2024-04-05 22:52:13 +02:00
NEZNAMY 2b661d6c5b Downgrade Java requirement on Fabric back to 17 2024-04-04 19:01:58 +02:00
NEZNAMY ee0ced63ef Update Fabric to 24w14a and Java version to 21 2024-04-03 21:22:35 +02:00
NEZNAMY 736dad5819 Merge pull request #1263 from JT122406/master
Update Loom and Gradle to Latest
2024-04-03 19:08:45 +02:00
Joseph T. McQuigg 11f36e8a22 Update Loom and Gradle to Latest 2024-04-03 13:05:57 -04:00
NEZNAMY 2cddf0b313 Add version compatibility check on Velocity 2024-03-31 12:03:58 +02:00
NEZNAMY 36a2d449b7 Add player version printing to debug command 2024-03-30 13:48:42 +01:00
NEZNAMY b6786456a2 Fix wrong method being overridden 2024-03-30 13:28:14 +01:00
NEZNAMY 76e8e1af6f Remove redundant .toLowerCase() 2024-03-30 12:33:49 +01:00
NEZNAMY ff55838a54 Remove unused imports 2024-03-29 14:21:21 +01:00
NEZNAMY b14b6828cc Move accesswidener file to resources/ folder instead of root in the compiled jar 2024-03-28 10:58:03 +01:00
NEZNAMY be7fb67988 Move configuration files to config/ folder instead of root in the compiled jar 2024-03-28 10:49:53 +01:00
NEZNAMY ae0be45d7d Drop 1.17(.0) support on Fabric (1.17.1 still supported) 2024-03-28 10:36:47 +01:00
NEZNAMY ba237d5dc4 Update Fabric to 24w13a 2024-03-28 10:27:22 +01:00
NEZNAMY bdf5cd8751 Remove unused constructor 2024-03-28 10:27:06 +01:00
NEZNAMY 9a6d309840 Update Fabric to 24w12a 2024-03-20 17:42:51 +01:00
NEZNAMY 9a6e92a58c Micro optimization of placeholder output replacements 2024-03-20 15:05:20 +01:00
NEZNAMY 1bc018918b Use common implementation of a method as default instead of making it abstract 2024-03-20 14:49:37 +01:00
NEZNAMY f32f8f5cdd Convert components in scoreboard class instead of each subclass 2024-03-20 14:39:46 +01:00
NEZNAMY 39585de3f0 Remove fallback solutions for Scoreboard on Bukkit 2024-03-20 14:16:18 +01:00
NEZNAMY 9ce81fc68e Convert component in abstract TabList class instead of manually in every class 2024-03-20 13:54:14 +01:00
NEZNAMY 0d56f0da98 Remove backup solutions for header/footer on Bukkit and only use packets 2024-03-20 13:49:31 +01:00
NEZNAMY 14a3d8da12 Save converted components as a field in TAB component instead of a separate cache that requires lookup, making it slower 2024-03-19 12:57:35 +01:00
NEZNAMY e4fa99b865 Use packets as primary solution for header/footer on Bukkit 2024-03-19 09:42:48 +01:00
NEZNAMY 96af2cb573 Drop native <gradient:#RRGGBB:#RRGGBB>Text</gradient> support to fix unexpected results when used in a way supported by MiniMessage but not this TAB function (and also because TAB called that function first) (#1252) 2024-03-18 22:40:57 +01:00
NEZNAMY f53ec58b2f Fix redundant empty component creation when using magic code after color code 2024-03-18 21:58:46 +01:00
NEZNAMY 2ff30dda83 Use HashMap instead of ConcurrentHashMap for better performance 2024-03-18 18:38:56 +01:00
NEZNAMY c0972f8faf Simplify 2024-03-18 15:52:25 +01:00
NEZNAMY 9663e1aa7e Remove redundant check 2024-03-18 15:46:28 +01:00
NEZNAMY d83a61b30a Replace &#RRGGBB with #RRGGBB sooner to save resources while refreshing 2024-03-18 15:35:59 +01:00
NEZNAMY 96d83da9b7 Remove unused method 2024-03-18 15:23:31 +01:00
NEZNAMY f1d881e0ba Add more checks to API methods 2024-03-18 13:41:23 +01:00
NEZNAMY d1285c7e04 Only send belowname update packets to players in the same world and server 2024-03-18 11:31:41 +01:00
NEZNAMY d4476e2d4c Optimize tablist packet creation on 1.19.3+ Bukkit & Fabric 2024-03-18 10:57:47 +01:00
NEZNAMY 3124d51381 Micro optimization of permission conditions 2024-03-18 10:19:12 +01:00
NEZNAMY b6ae1a79d4 Fix breaking errors on Fabric 1.16 - 1.18.2 2024-03-15 21:29:49 +01:00
NEZNAMY 42d7b598bf Improve comments in accesswidener 2024-03-15 21:29:00 +01:00
NEZNAMY 052e828d5a Split player spawn packet reading on Fabric based on version 2024-03-15 20:51:38 +01:00
NEZNAMY 55d4f8da6b Use logger directly on Fabric 1.18.2+ 2024-03-15 20:33:52 +01:00
NEZNAMY 1c5a4bbacc Simplify channel getting on BungeeCord 2024-03-15 16:54:27 +01:00
NEZNAMY 565d4bdeec Add java version requirement to fabric.mod.json 2024-03-15 15:47:56 +01:00
NEZNAMY 3d9ef7d252 Remove no longer needed SneakyThrows annotation 2024-03-15 15:39:23 +01:00
NEZNAMY 161bcbb236 Merge scoreboard packet listener methods into one 2024-03-15 15:22:23 +01:00
NEZNAMY c8af0ab5bc Use access widener on Fabric instead of reflection where easily possible 2024-03-14 20:46:04 +01:00
NEZNAMY 98e9c167c5 Update Fabric to 24w11a 2024-03-14 18:52:44 +01:00
NEZNAMY ed815c5767 Remove unintended return type 2024-03-14 16:14:14 +01:00
NEZNAMY f6e53ac91f Fix raw generic usage 2024-03-14 16:09:15 +01:00
NEZNAMY 3e5df50f9e Rename generic types 2024-03-14 16:05:44 +01:00
NEZNAMY 1e28a93c5f Replace star import with class imports 2024-03-14 16:02:13 +01:00
NEZNAMY 717bdd3550 Catch everything 2024-03-12 22:55:44 +01:00
NEZNAMY 3bee514bb9 Actually fix the previous error at its source 2024-03-12 10:32:56 +01:00
NEZNAMY 678d4b8db7 Use ConcurrentHashMap to fix ConcurrentModificationException 2024-03-12 10:02:06 +01:00
NEZNAMY d76e5e7f9b Simplify method (also probably speed it up) 2024-03-11 16:03:25 +01:00
NEZNAMY 9629192305 Simplify 2024-03-11 16:00:52 +01:00
NEZNAMY eef7debdba Remove unnecessary full class name 2024-03-09 11:35:23 +01:00
NEZNAMY 138d9f7f46 Initialize more variables in constructor 2024-03-08 12:52:47 +01:00
NEZNAMY e4abd9ec2f Refactor multi-version support on Fabric 2024-03-08 11:21:42 +01:00
NEZNAMY 8efce72e26 Remove component serialization code as it is no longer used 2024-03-07 19:04:27 +01:00
NEZNAMY 15ebca2d11 Use direct component conversion on Fabric instead of serializing and deserializing json 2024-03-07 18:47:55 +01:00
NEZNAMY 6583489523 Remove json deserializer support on Bukkit and only use direct component conversion 2024-03-07 17:15:53 +01:00
NEZNAMY 5610d52813 Remove part of a comment 2024-03-07 17:03:42 +01:00
NEZNAMY 618b61dd60 Use Adventure API to serialize components on Velocity 2024-03-07 17:03:24 +01:00
NEZNAMY 2de58f7a3b Remove RGB support in ViaBossbar (1.16+ clients on 1.8 server) 2024-03-07 16:44:50 +01:00
NEZNAMY 2bd94158f9 Remove redundant code 2024-03-07 14:47:56 +01:00
NEZNAMY 4e7ab43ac9 Update Fabric to 24w10a 2024-03-06 22:38:08 +01:00
NEZNAMY 33529d0cfd Slightly optimize vanish check and usage 2024-03-06 21:00:40 +01:00
NEZNAMY a5b929bdf5 Optimize tablist packet check on 1.19.3+ 2024-03-06 20:37:01 +01:00
NEZNAMY d10bd3358d Simplify 2024-03-05 15:58:14 +01:00
NEZNAMY ffe928fbe8 Save EnumSet for each tablist action into map and retrieve it instead of creating new Set on every packet send. 2024-03-05 15:51:16 +01:00
NEZNAMY fd61739d96 Remove deleted option from default config 2024-03-04 17:03:30 +01:00
NEZNAMY e1602a5655 Refactor TabList class to extract common content from each subclass into the main one 2024-03-04 13:48:53 +01:00
NEZNAMY a936302fd2 Rework tablist anti-override to save expected names and then restore the save values instead of creating them again 2024-03-04 11:45:18 +01:00
NEZNAMY 7f0d4df6ca Save teams for later use instead of recreating them every time 2024-03-03 21:23:47 +01:00
NEZNAMY 35ab0c67c5 Remove unused dependencies 2024-03-02 18:41:05 +01:00
NEZNAMY 090633140f Remove bug compensation 2024-03-02 17:21:16 +01:00
NEZNAMY 8efe02c2ef Further improve performance of command listener method (#1237) 2024-03-01 21:01:02 +01:00
NEZNAMY 2dbcaf029c Improve performance of a method if both scoreboard and bossbar features are disabled (#1237) 2024-03-01 20:28:50 +01:00
NEZNAMY ce758534bd Remove ClickEvent support as it's never used by the plugin 2024-03-01 11:58:19 +01:00
NEZNAMY 15caf70170 Update Bukkit 1.20.5 draft to 24w09a 2024-03-01 10:54:04 +01:00
NEZNAMY c07c3a3a4f Update Fabric to 24w09a 2024-03-01 10:37:43 +01:00
NEZNAMY b9000af55e Implement direct component conversion on Bukkit and use it as primary option. 2024-02-29 21:32:29 +01:00
NEZNAMY ed15ba29bb Create separate class for component conversion on Bukkit (will be extended soon) 2024-02-29 12:42:00 +01:00
NEZNAMY 2fb8da022a Fix startup on <1.8 2024-02-29 12:28:49 +01:00
NEZNAMY ed65088cb8 Add API method for setting player's expected game profile name (#1240) 2024-02-29 09:24:45 +01:00
NEZNAMY f367542096 Replace unoptimized online player check with an instant one 2024-02-28 14:19:38 +01:00
NEZNAMY 00e457542d Remove TabPlayer#isOnline as it was never really used 2024-02-28 14:12:22 +01:00
NEZNAMY b0c423b2dd Change sortingPlaceholder data type to avoid retrieving it each time 2024-02-27 20:57:32 +01:00
NEZNAMY eb5e3d637c Split method into multiple for better readability 2024-02-27 14:45:03 +01:00
NEZNAMY 4acd24b829 Make permission-related options refresh interval configurable 2024-02-27 13:59:58 +01:00
NEZNAMY f8576834fe Optimize method 2024-02-27 13:12:40 +01:00
NEZNAMY 1e9888a8b5 Optimize method 2024-02-27 13:08:17 +01:00
NEZNAMY d99b6643e9 Fix team color defaulting to black on Sponge 2024-02-27 11:17:16 +01:00
NEZNAMY 0b98d98867 Add Sponge 1.20.4 support 2024-02-27 11:04:55 +01:00
NEZNAMY d040b0faf5 Save global playerlist server group mapping instead of computing it on each request 2024-02-27 10:16:55 +01:00
NEZNAMY d53c20da56 Do not respawn armor stands on sneak for flying players (#1236). 2024-02-26 20:28:06 +01:00
NEZNAMY fad035699f Revert broken commit 2024-02-26 19:00:28 +01:00
NEZNAMY c7ab2b93a3 Move armor stands instead of teleporting them when players move. This should result in a significantly better sync. May also help with #1236 a bit. 2024-02-26 18:46:51 +01:00
NEZNAMY 4b75144276 Create cache for last color of prefix 2024-02-26 11:16:30 +01:00
NEZNAMY 99edcf68c1 Use new TabList method for better performance 2024-02-25 15:05:56 +01:00
NEZNAMY 9b6f1ce955 Add TabList#containsEntry method 2024-02-25 15:00:34 +01:00
NEZNAMY b570020944 Only send global playerlist latency update packets of players a player can actually see 2024-02-23 20:44:57 +01:00
NEZNAMY e91ba4ef79 Slightly speed up method 2024-02-23 19:14:45 +01:00
NEZNAMY a1fbefb13f Set use-numbers to true by default because buggy clients don't work without it and will not fix it anytime soon 2024-02-22 23:42:57 +01:00
NEZNAMY 340592d951 Document class 2024-02-22 11:59:45 +01:00
NEZNAMY a1c0bf7dec Use new Paper API for Scoreboard NumberFormat in fallback PaperScoreboard implementation 2024-02-20 18:49:52 +01:00
NEZNAMY a62f20469e Replace NotNull with NonNull in Scoreboard class for better troubleshooting 2024-02-19 20:22:17 +01:00
NEZNAMY 3f1f78315b Add Getter 2024-02-19 20:12:18 +01:00
NEZNAMY 12d8bc75cd Replace NotNull with NonNull in TabList class for better troubleshooting 2024-02-19 20:10:26 +01:00
NEZNAMY c1cf02ee9f Fix ConcurrentModificationException 2024-02-19 16:17:13 +01:00
NEZNAMY 7ac240af76 Update Fabric to 24w07a 2024-02-15 09:29:33 +01:00
NEZNAMY 82c34a33b5 Do not update tablist format for players on different servers who the player cannot see (#1232) 2024-02-14 18:08:04 +01:00
NEZNAMY d2330337ef Simplify method 2024-02-14 16:56:45 +01:00
NEZNAMY af38bd0383 Fix double score send on join 2024-02-14 11:52:07 +01:00
NEZNAMY c0a9ede377 Add runtime warn when belowname / playerlist objective placeholder returned decimal number 2024-02-14 11:45:40 +01:00
NEZNAMY 555ba3eb73 Split method into multiple for better readability and clean up 2024-02-11 20:24:54 +01:00
NEZNAMY 6f0e757ad6 Add console warn if condition type is needed but not configured 2024-02-11 20:07:59 +01:00
NEZNAMY 077b8fee96 Add more info into error message 2024-02-11 16:11:55 +01:00
NEZNAMY 643df47437 (Attempt to) fix deadlock (#1230) 2024-02-11 10:28:43 +01:00
NEZNAMY 9e1ea4678d Create shared empty instance for PlaceholderReplacementPattern to avoid new instances even if nothing is configured 2024-02-10 17:37:20 +01:00
NEZNAMY f3576b678b Make MySQL errors more user-friendly 2024-02-10 11:22:52 +01:00
NEZNAMY 2b49bce998 Add config option to disable SSL certification in MySQL if the database is not using it 2024-02-10 10:22:42 +01:00
NEZNAMY 896048ffff Replace "featureName" field with getter 2024-02-09 16:56:12 +01:00
NEZNAMY 04cb14f790 Add some more Javadoc 2024-02-09 16:12:16 +01:00
NEZNAMY bd22b0c08b Properly remove disconnected player from bossbars 2024-02-09 15:47:47 +01:00
NEZNAMY 95ce52bbeb Add TODO note 2024-02-09 11:04:40 +01:00
NEZNAMY 6b411f5cce Slightly optimize method 2024-02-09 10:56:59 +01:00
NEZNAMY c15b0d178b Create array field to iterate over for slightly better performance 2024-02-09 10:40:48 +01:00
NEZNAMY f5ffb69675 Disable tab expansion by default 2024-02-08 20:59:18 +01:00
NEZNAMY 24e59d970f Initialize NotNull field just in case 2024-02-08 17:10:55 +01:00
NEZNAMY 4ece4b66cd Only initialize map if used 2024-02-07 22:02:50 +01:00
NEZNAMY 7852d244bb Fix #1227 2024-02-07 21:37:27 +01:00
NEZNAMY d1c2487ba4 Enable CPU usage tracking only after running /tab cpu for the first time 2024-02-07 20:43:32 +01:00
NEZNAMY 4ea789efcf Add config option to disable refreshing placeholders in another thread (boosts performance) 2024-02-07 20:17:02 +01:00
NEZNAMY 43fc97c671 Update Fabric to 24w06a 2024-02-07 18:28:09 +01:00
NEZNAMY a20378d5cb Change abstract class to interface 2024-02-06 21:58:35 +01:00
NEZNAMY 7c0384c96b Create local variable to prevent spamming Map#get 2024-02-06 18:51:22 +01:00
NEZNAMY 7d4419b300 Override some methods in EmptyTabExpansion to avoid unnecessary operations 2024-02-06 17:56:28 +01:00
NEZNAMY 393af9b5c5 Add check to avoid unnecessary operations 2024-02-06 17:55:12 +01:00
NEZNAMY 559e423a1d Vastly improve performance of CPU usage tracking 2024-02-06 17:43:45 +01:00
NEZNAMY a2d68e14e6 Simplify 2024-02-06 17:10:21 +01:00
NEZNAMY 580b67d9ed Fix thread submitting tasks to itself 2024-02-06 16:45:57 +01:00
NEZNAMY 080654f703 Increase scoreboard line length limit by 2 characters on <1.13 2024-02-05 20:14:36 +01:00
NEZNAMY 002a002749 Remove redundant check 2024-02-05 19:19:51 +01:00
NEZNAMY 7e888e46f9 Implement best parts of #1219 2024-02-05 10:57:40 +01:00
NEZNAMY 199ca94acd Add compensation for 1.8.0 client-sided bug directly into TabList class (#1225) 2024-02-04 22:03:29 +01:00
NEZNAMY 67455bd47d Fix replacements not applying in nested placeholders 2024-02-04 18:32:21 +01:00
NEZNAMY fbb0e252c5 Allow -1 in refresh intervals 2024-02-04 17:57:44 +01:00
NEZNAMY 2566972ac7 Recode internal component class 2024-02-03 18:12:37 +01:00
NEZNAMY 9455294060 Simplify 2024-02-03 13:24:57 +01:00
NEZNAMY 6870b42a1a Merge branch 'master' of https://github.com/NEZNAMY/TAB 2024-02-03 11:22:45 +01:00
NEZNAMY 32cd414a51 Merge pull request #1224 from XXMA16/fix-spongeforge
Fix SpongeForge startup crash
2024-02-03 11:22:35 +01:00
XXMA16 35f63b7075 Fix code style
Signed-off-by: XXMA16 <xxma1610@gmail.com>
2024-02-03 02:43:51 +02:00
XXMA16 f9097b11b6 Fix SpongeForge startup crash
Signed-off-by: XXMA16 <xxma1610@gmail.com>
2024-02-02 19:37:19 +02:00
NEZNAMY dc5acdf729 Add default implementation to method instead of making it abstract 2024-02-01 22:09:49 +01:00
NEZNAMY e5fb25daee Update Bukkit 1.20.5 draft to match 24w05b changes 2024-02-01 20:47:03 +01:00
NEZNAMY 33b6867c02 Update Fabric to 24w05b 2024-02-01 20:39:16 +01:00
NEZNAMY d572973b60 Add console hint when configuring redundant placeholder replacement pattern using "else" 2024-01-31 19:28:30 +01:00
NEZNAMY 3d240f0f7d Fix NPE 2024-01-31 19:12:13 +01:00
NEZNAMY 3a4973d760 Change sidebar team naming 2024-01-29 11:43:25 +01:00
NEZNAMY 811c9716a2 Fix message 2024-01-28 13:26:04 +01:00
NEZNAMY 771f6db89a Remove unused imports 2024-01-28 10:55:44 +01:00
NEZNAMY 97f515f573 Remove placeholder output replacement from default config 2024-01-27 20:19:17 +01:00
NEZNAMY c589dfb281 Fix per-world settings of unlimited nametags not updating on world switch 2024-01-27 20:01:41 +01:00
NEZNAMY 82efe5b4d1 Simplify 2024-01-27 13:57:25 +01:00
NEZNAMY 765f593b88 Specify locale in .toLowerCase to avoid error when java is using a weird language 2024-01-27 13:52:01 +01:00
NEZNAMY 21e5de25cb Remove console warn when ViaVersion returns unknown version, because kids kept asking about it on ViaVersion discord despite the message clearly saying to update TAB. 2024-01-27 13:42:06 +01:00
NEZNAMY 4333e44f6d Fix false warn on proxy when bukkit permissions are enabled 2024-01-26 21:21:40 +01:00
NEZNAMY 7070fd886b Add support for Bukkit jars without CraftBukkit relocation (#1220) 2024-01-25 15:15:12 +01:00
NEZNAMY 89480a9018 Remove cpu report printing into console if overloaded and debug is enabled 2024-01-24 18:16:15 +01:00
NEZNAMY 19ce873037 Update Fabric to 24w04a 2024-01-24 17:30:58 +01:00
NEZNAMY 977007b427 Do not cache subcomponents on bungeecord (#1211) 2024-01-24 17:07:37 +01:00
NEZNAMY 218c1c9d9a Remove global serverVersion field and only use it in each platform if needed 2024-01-24 15:32:38 +01:00
NEZNAMY f358ac9d9c Create and use Platform#isProxy method 2024-01-24 14:02:38 +01:00
NEZNAMY 58fe2b4582 Make "enable-collision" support conditions 2024-01-24 13:08:03 +01:00
NEZNAMY 211624b1a9 Improve style of iteration 2024-01-24 11:56:01 +01:00
NEZNAMY 6874369a48 Simplify animation placeholder creation 2024-01-24 11:53:52 +01:00
NEZNAMY f8c52d3577 Initialize player group in declaration to prevent "Vault through Bridge" returning null on the first time (#1211) 2024-01-24 09:58:16 +01:00
NEZNAMY 376bf5314d Actually fix trying to process offline players (players are still marked as online by Bukkit API even after they disconnect) 2024-01-23 18:18:12 +01:00
NEZNAMY 2346df67a0 Fix trying to process offline players in placeholder update task 2024-01-23 18:05:01 +01:00
NEZNAMY e63c7b43e1 Show a runtime warn if belowname / playerlist objective cannot be evaluated to a number 2024-01-23 18:04:18 +01:00
NEZNAMY 578691fe8c Document and clean up class 2024-01-22 19:15:07 +01:00
NEZNAMY 189d8a82d5 Update default config to account for missing NumberFormat in scoreboards in bedrock edition 2024-01-22 17:43:45 +01:00
NEZNAMY 9412d9cc28 Add %bedrock% placeholder returning true for bedrock clients 2024-01-22 17:40:02 +01:00
NEZNAMY 75b2bfa14c Implement TabPlayer#isOnline on Fabric 2024-01-22 15:40:09 +01:00
NEZNAMY 7fcb5c8aa3 Create functions for different error types instead of printing them directly 2024-01-22 15:15:59 +01:00
NEZNAMY 9827711111 Simplify 2024-01-22 13:41:06 +01:00
NEZNAMY 16aecd65e6 Add error message when permission plugin returned null group 2024-01-22 13:32:29 +01:00
NEZNAMY c143ecc6ae Remove redundant Getter annotation 2024-01-20 17:56:29 +01:00
NEZNAMY 2935f9e205 Clean up 2024-01-20 17:54:51 +01:00
NEZNAMY a6a33a79d4 Attempt to fix error (#1218) 2024-01-20 17:22:23 +01:00
NEZNAMY 82f9d8ddee Attempt to fix error (#1218) 2024-01-20 11:08:59 +01:00
NEZNAMY daa6012b36 Simplify 2024-01-20 11:05:45 +01:00
NEZNAMY 5001c82f23 Update Fabric to 24w03b 2024-01-18 21:17:10 +01:00
NEZNAMY 59dbad9abf Fix snapshot name in fabric.mod.json 2024-01-18 12:12:13 +01:00
NEZNAMY 945c7cc7b8 Draft 1.20.5 support on Bukkit 2024-01-18 11:19:30 +01:00
NEZNAMY 3391f7646c Simplify 2024-01-17 23:27:27 +01:00
NEZNAMY 88070aa2b2 Use different constructor to simplify usage 2024-01-17 23:06:15 +01:00
NEZNAMY c792296746 Use reflection to get rid of 2 Fabric submodules 2024-01-17 23:06:06 +01:00
NEZNAMY 18a13f777d Allow empty output in sorting by pre-defined values 2024-01-17 22:27:34 +01:00
NEZNAMY 469529b324 Update Fabric to 24w03a 2024-01-17 21:15:26 +01:00
NEZNAMY 4715a5ab9d Use static number as a start of numbering if use-numbers is enabled 2024-01-17 19:08:46 +01:00
NEZNAMY be305162a6 Fix scoreboard use-numbers duplicating numbers 2024-01-17 19:08:17 +01:00
NEZNAMY 7a1bc16e9d Fix NPE 2024-01-17 11:27:36 +01:00
NEZNAMY eb2c80deb8 Add try/catch for ViaVersion hook (#1201) 2024-01-16 21:56:51 +01:00
NEZNAMY 0863b77bf0 Remove unused import 2024-01-16 20:51:16 +01:00
NEZNAMY 769a698509 Fix NPE and replace it with a warning (#1198) 2024-01-16 20:50:51 +01:00
NEZNAMY 53870b2c81 Fix anti-override on Velocity and Sponge no longer working after players are removed & added back to the tablist by another plugin 2024-01-16 12:54:52 +01:00
NEZNAMY e198a5df88 Another attempt to fix #1212 2024-01-16 11:17:28 +01:00
NEZNAMY ac947f698b Fix ClassCastException (#1213) 2024-01-16 11:05:06 +01:00
NEZNAMY ecabd62b6b Catch another exception (#1212) 2024-01-15 10:35:09 +01:00
NEZNAMY f350d200ac Fix memory leak 2024-01-14 20:28:35 +01:00
NEZNAMY 97d5a3f7ef Print all exceptions in a chain, not just the last one 2024-01-14 13:25:59 +01:00
NEZNAMY f15f3efc3f Add plugin's name prefix into console messages on Fabric 2024-01-14 11:48:24 +01:00
NEZNAMY 7563b6b946 Convert \n to newline if snakeyaml does not do it because text is in '' and not "" 2024-01-13 18:52:21 +01:00
NEZNAMY 421c53e6be Replace forEach with for 2024-01-13 18:06:16 +01:00
NEZNAMY 3db8666951 Hide spectator effect for players who unvanished (#1209) 2024-01-13 12:58:00 +01:00
NEZNAMY ecc6e01cf9 Add links to Tanguygab's new discord server where he will provide support to kids 2024-01-12 10:39:12 +01:00
NEZNAMY becf81db00 Merge 2 fields into 1 2024-01-10 15:04:50 +01:00
NEZNAMY 92f5b337c9 Use dummy implementation if original one is not available & remove redundant class 2024-01-10 14:26:56 +01:00
NEZNAMY 3ddf884c23 Get CraftBukkit classes using package name instead of version as recommended by Paper 2024-01-10 14:18:54 +01:00
NEZNAMY 116117af55 Create method to simplify usage 2024-01-09 18:20:51 +01:00
NEZNAMY 0980bcfca5 Merge pull request #1202 from Jake-Moore/master
Support to use Global Playerlist `server-groups` as Header/Footer `per-server` keys.
2024-01-09 18:12:05 +01:00
NEZNAMY 20e2e8ded6 Fix relational placeholders not refreshing properly & nested relational placeholders not being marked as used by the feature (and therefore not refreshing properly) (#1203) 2024-01-09 18:06:35 +01:00
Jake Moore 13af0b7b2b Improve handling of failed cases 2024-01-08 20:58:19 -08:00
Jake Moore cbcbfdcbf1 Adds support to use Global Playerlist server-groups as Header/Footer keys in per-server. Allowing for configuration of a server group with several velocity servers which can have a unique header-footer section. 2024-01-08 17:07:44 -08:00
NEZNAMY 38eb294667 Move version check 2024-01-08 12:24:50 +01:00
NEZNAMY 71d16ff906 Only send messages that actually affect the user 2024-01-08 12:22:19 +01:00
NEZNAMY 395058d771 Send console message saying how long NMS hook took to load 2024-01-08 12:13:58 +01:00
NEZNAMY d8af7c454c Simplify 2024-01-07 23:07:38 +01:00
NEZNAMY 2f10084e7a Replace more fields with functional interfaces 2024-01-07 22:56:08 +01:00
NEZNAMY 5af387b32d Move ScorePacketData to a separate class 2024-01-07 21:41:10 +01:00
NEZNAMY 4b7144f705 Replace fields with functional interfaces for NMS access 2024-01-07 21:20:24 +01:00
NEZNAMY 0fbbbb6485 Simplify 2024-01-07 20:23:09 +01:00
NEZNAMY f033d78785 Optionally print compatibility exception into console 2024-01-07 20:08:44 +01:00
NEZNAMY 2ea79eb57d Remove unused import 2024-01-07 14:44:49 +01:00
NEZNAMY 226ee0db9d Include supported version range in compatibility error message 2024-01-06 22:45:21 +01:00
NEZNAMY 8a62f21e84 Improve compatibility error messages 2024-01-06 22:25:33 +01:00
NEZNAMY c353c39086 Make entity view compatibility on Bukkit optional 2024-01-06 21:33:19 +01:00
NEZNAMY 2b2c877ab2 Add more Javadoc 2024-01-06 21:15:20 +01:00
NEZNAMY 016af4bfee Make DummyEntityView methods do nothing instead of throwing 2024-01-06 20:54:23 +01:00
NEZNAMY b3d26d91de Add console warn when waterfall option causing issues is enabled 2024-01-06 17:23:41 +01:00
NEZNAMY a7a7f409eb Fix sorting note getting overridden on refresh when set using API 2024-01-06 15:52:24 +01:00
NEZNAMY f44ccec712 Remove StaticLine class and use LongLine instead for the same effect 2024-01-06 14:29:08 +01:00
NEZNAMY 1c0887733c Initialize property names to random values instead of specific names 2024-01-06 14:14:33 +01:00
NEZNAMY 7ee3c35785 Rename some cpu usage categories to make them easier to understand 2024-01-06 14:01:13 +01:00
NEZNAMY 01b725cf38 Define team color immediately and forward it instead of figuring it out later 2024-01-05 21:30:43 +01:00
NEZNAMY 1ac6d90633 Add a runtime warn when sorting element is not in list (group, placeholder, or no permission) 2024-01-02 16:27:08 +01:00
NEZNAMY 9704193237 Add a runtime warn when numeric placeholder in condition did not return a number 2024-01-02 15:43:22 +01:00
NEZNAMY 69b150b391 Make team color always white for scoreboard lines (#1189) 2024-01-02 14:13:17 +01:00
NEZNAMY 7ffb3edda5 Spawn entity using bundle packet for 1.19.4+ to prevent frame being rendered between packets, causing visible armor stands for a single frame (#1168) 2024-01-02 13:10:20 +01:00
NEZNAMY 046eb68ce6 Split MisconfigurationHelper class into 3 for different message types 2024-01-01 22:03:08 +01:00
NEZNAMY 816d80a27c Construct ArmorStand with non-null level on Fabric (#1191) (one more) 2023-12-31 11:27:17 +01:00
NEZNAMY 957037e5f4 Construct ArmorStand with non-null level on Fabric (#1191) 2023-12-30 15:38:54 +01:00
NEZNAMY 9ca179a71f Make BungeeCord compatibility error message more clear about what exactly went wrong (#1190). 2023-12-30 15:34:12 +01:00
NEZNAMY cb4d96f1ba Remove unused imports 2023-12-29 22:15:05 +01:00
NEZNAMY 7d57522775 Add more Javadoc 2023-12-29 22:04:54 +01:00
NEZNAMY 902565f1b1 Remove TabList.Entry.Builder class and build entries directly 2023-12-29 19:07:13 +01:00
NEZNAMY 2f8de436af Improve Javadoc 2023-12-29 18:56:17 +01:00
NEZNAMY 38bd035d99 Create separate class for each incoming plugin message and move handling method to ProxyPlatform class 2023-12-29 18:29:51 +01:00
NEZNAMY 88b6d1a3ca Remove redundant SneakyThrows and replace some instances with throws 2023-12-29 14:40:17 +01:00
NEZNAMY a74878e7bb Make PacketSender an instance class 2023-12-29 14:17:29 +01:00
NEZNAMY 2b6eba7c4d Replace star import with direct imports 2023-12-26 12:21:06 +01:00
NEZNAMY 0de1b86ef5 Remove unnecessary static modifier 2023-12-26 12:19:46 +01:00
NEZNAMY ae0ab6471b Remove unused import 2023-12-26 12:17:58 +01:00
NEZNAMY c24cdaa8a4 Fix json syntax error when sorting character ends up being \ (#1184) 2023-12-24 23:17:07 +01:00
NEZNAMY df1442dd8a Fix YellowNumber & BelowName sending score update to disabled players 2023-12-24 15:30:57 +01:00
NEZNAMY b17d5306db Create and use TabFeature#config method for shorter code in all features 2023-12-24 15:08:34 +01:00
NEZNAMY 88d5294b8e Skip placeholder refreshing code if no placeholders are being refreshed 2023-12-24 14:25:25 +01:00
NEZNAMY 8c3405d01f Replace streams with direct code for better performance 2023-12-24 14:23:13 +01:00
NEZNAMY 9f83ba700c Fix bossbar & scoreboard writing into file on every join when remembering toggle choice is enabled even if value didn't change 2023-12-23 23:06:08 +01:00
NEZNAMY ae147211ca Code style 2023-12-23 22:58:01 +01:00
NEZNAMY 01d305eba0 Move scoreboard packet listening from pipeline class to scoreboard class 2023-12-23 21:54:26 +01:00
NEZNAMY 08c30574a9 Code style 2023-12-23 21:01:25 +01:00
NEZNAMY 39c4725a2f Change access from public to private 2023-12-23 19:45:32 +01:00
NEZNAMY 7002aeefaf Create constants for "magic numbers" 2023-12-23 17:28:19 +01:00
NEZNAMY f1201cc5bc Code style 2023-12-23 16:30:14 +01:00
NEZNAMY 0b99d4ac52 Extract duplicated code into a method 2023-12-23 16:29:11 +01:00
NEZNAMY 642cb701dd Remove unused import 2023-12-23 15:42:49 +01:00
NEZNAMY 66d6aee115 Move method to avoid duplication 2023-12-23 15:39:01 +01:00
NEZNAMY 38d8eb1108 Simplify 2023-12-23 15:20:09 +01:00
NEZNAMY f9941c5dff Add some more Javadocs 2023-12-23 14:48:26 +01:00
NEZNAMY 855a6f447a Use constants for bStats plugin ids 2023-12-23 13:59:02 +01:00
NEZNAMY fa0a1f8553 Create and use ProtocolVersion#supportsRGB instead of manually comparing number each time. 2023-12-23 13:55:52 +01:00
NEZNAMY 0d1fee1636 Add missing Javadoc to Fabric 2023-12-23 13:48:35 +01:00
NEZNAMY ec8269332f Add missing Javadoc to Bukkit 2023-12-23 13:31:16 +01:00
NEZNAMY 00fe9400e6 Add missing Javadoc to BungeeCord 2023-12-23 12:40:59 +01:00
NEZNAMY 8389b1e151 Add missing Javadoc to API 2023-12-23 12:31:09 +01:00
NEZNAMY 2289d10d6c Add missing Javadoc to Sponge and Velocity 2023-12-23 12:22:01 +01:00
NEZNAMY b30af4f144 Remove redundant "new" when creating arrays 2023-12-23 12:00:05 +01:00
NEZNAMY 041322c53f Update latest known version field 2023-12-23 11:21:03 +01:00
NEZNAMY 548968bcfc Print console warn on startup if error log has reaches its size limit 2023-12-22 20:37:31 +01:00
NEZNAMY 6d405b70e7 Properly apply replacements to server placeholders initially 2023-12-22 17:27:02 +01:00
NEZNAMY 1b4d4acc63 Fix map merging mistake 2023-12-22 17:26:24 +01:00
NEZNAMY 6f498089fb Add back option to disable tab expansion 2023-12-22 15:32:53 +01:00
NEZNAMY 8e27cba0f6 Fix compilation 2023-12-22 15:30:05 +01:00
NEZNAMY ae48041a96 Simplify 2023-12-21 23:55:57 +01:00
NEZNAMY bad16a4cdc Update Fabric to 23w51b 2023-12-21 20:50:16 +01:00
NEZNAMY 07baf769dd Suppress random irrelevant warnings 2023-12-21 20:21:23 +01:00
NEZNAMY ab409643f6 Convert class to record 2023-12-21 18:00:36 +01:00
NEZNAMY c745a61601 Recode placeholder refreshing to make refreshing thread not do anything more than placeholder requests & various minor performance improvements 2023-12-21 17:57:47 +01:00
NEZNAMY c4e8e83d1e Add check to improve method's performance 2023-12-21 13:03:49 +01:00
NEZNAMY 9133f3d792 Repackage classes and remove unused interface 2023-12-21 09:54:22 +01:00
NEZNAMY b779d584a5 Speed up placeholder replacement code if nothing is configured 2023-12-20 17:31:22 +01:00
NEZNAMY 05bb61b3ab Improve performance of a method 2023-12-20 15:50:25 +01:00
NEZNAMY 5d2885e662 Wrap maps into synchronizedMap to avoid deadlock on concurrent access 2023-12-20 15:48:26 +01:00
NEZNAMY ef645c1058 Fix random NPE 2023-12-17 20:16:09 +01:00
NEZNAMY 52a476fd0a Print cpu report into console if plugin is overloaded and debug is enabled 2023-12-17 11:19:08 +01:00
NEZNAMY 7386c45f06 Implement TabList class on Bukkit for 1.7, implement a backup solution using API and make the loading optional 2023-12-16 15:53:51 +01:00
NEZNAMY 1a508ddedf Fix error on old versions 2023-12-16 14:28:31 +01:00
NEZNAMY a8675f254a Move sendPacket call 2023-12-15 18:46:03 +01:00
NEZNAMY 0f70cd789e Move team anti-override to scoreboard class 2023-12-15 14:53:47 +01:00
NEZNAMY b8f594f42c Move tablist packet processing to tablist class 2023-12-15 12:20:17 +01:00
NEZNAMY 7857527ce1 Add console warn if floodgate is not configured correctly 2023-12-11 20:40:14 +01:00
NEZNAMY 05c41a5469 Create separate class for PremiumVanish hook & add check for outdated version to avoid an error (#1171) 2023-12-11 15:11:46 +01:00
NEZNAMY f11f8afdc4 Update README.md 2023-12-11 09:05:28 +01:00
NEZNAMY fa499aa46d Merge pull request #1170 from NicoNekoDev/master
Add NexEngine gradient
2023-12-10 13:25:05 +01:00
NicoNekoDev e8a7cc026f Documentation 2023-12-10 14:09:53 +02:00
NicoNekoDev 433ef6a8a7 Placeholders and legacy text 2023-12-10 14:08:09 +02:00
NicoNekoDev fc4b5a7bcd Fix codestyle 2023-12-10 13:40:44 +02:00
NicoNekoDev bd43134d58 Fix text 2023-12-10 13:26:34 +02:00
NicoNekoDev 557970ba4e Add NexEngine gradient
https://github.com/nulli0n/NexEngine-spigot/wiki/Configuration-Tips
2023-12-10 11:18:41 +02:00
NEZNAMY d3418e0067 Remove duplicate method 2023-12-09 20:52:44 +01:00
NEZNAMY b8d1845d4e Change way of detecting 1.19.4+ flag 2023-12-09 19:03:11 +01:00
NEZNAMY 32e360409d Create and use method for retrieving a CraftBukkit class instead of doing it manually each time (the method might also change in the future according to Paper devs, this will also make modifying and maintenance easier) 2023-12-09 19:00:46 +01:00
NEZNAMY c54a778af9 Fix RGB color conversion from adventure component to internal component 2023-12-09 15:26:55 +01:00
NEZNAMY ce25698f87 Do not cache nested components 2023-12-09 14:26:49 +01:00
NEZNAMY 4d95cc838a Change way of multi-version code handling on Fabric to significantly reduce complexity, module count and compilation time 2023-12-09 14:14:31 +01:00
NEZNAMY 67fa0a231e Add more misconfiguration checks for layout feature 2023-12-09 11:23:39 +01:00
NEZNAMY 3c2e8c81c4 4.1.3-SNAPSHOT 2023-12-08 09:50:11 +01:00
NEZNAMY 484d46252b 4.1.2 2023-12-08 09:47:09 +01:00
NEZNAMY a2e3c67298 Fix MiniMessage parsing causing issues to different syntax rules (#1166) 2023-12-08 09:46:36 +01:00
NEZNAMY b2ea05d8dd Merge 1.14.4 and 1.15.2 fabric modules for faster compilation 2023-12-07 20:26:13 +01:00
NEZNAMY 1477f47962 Merge 1.17 and 1.17.1 fabric modules for faster compilation 2023-12-07 19:18:25 +01:00
NEZNAMY 273ce49c14 4.1.2-SNAPSHOT 2023-12-07 19:16:56 +01:00
NEZNAMY 96b6790646 4.1.1 2023-12-07 18:50:30 +01:00
NEZNAMY 38227ec878 Update Fabric to 1.20.4 2023-12-07 18:48:08 +01:00
NEZNAMY 11da632972 Add 1.20.4 to version list 2023-12-07 17:46:51 +01:00
NEZNAMY 3721b9fe22 Fix MiniMessage not working in scoreboard 2023-12-07 14:12:13 +01:00
NEZNAMY ecb697e5fb Update default config to match recent scoreboard change (using ||) 2023-12-07 13:31:51 +01:00
NEZNAMY c754772280 Remove warn if ViaVersion returns -1 version (finally got to reproduce it & make tests) 2023-12-06 18:21:58 +01:00
NEZNAMY 5f2b4ba0b3 Fix disconnect on BungeeCord on 1.20.3 2023-12-06 13:46:21 +01:00
NEZNAMY 0ab60becfc Change scoreboard line number format split sequence to || instead of | to prevent false trigger when trying to actually display the character. 2023-12-05 23:01:54 +01:00
NEZNAMY 1dcfb7d6dc 4.1.1-SNAPSHOT 2023-12-05 23:01:11 +01:00
NEZNAMY 3c0b44b365 4.1.0 2023-12-05 20:45:58 +01:00
NEZNAMY ec4aec50ef Mark 1.20.3 as latest known version 2023-12-05 18:55:42 +01:00
NEZNAMY 9c86cfe056 Add Vault to softdepend to avoid console warn 2023-12-05 18:53:49 +01:00
NEZNAMY 6bb2337276 Print warn if RedisSupport received unknown message instead of throwing a NPE 2023-12-05 18:49:53 +01:00
NEZNAMY 4702ca255b Update Fabric to 1.20.3 2023-12-05 18:48:54 +01:00
NEZNAMY ab47aa36cc Confirm network id of 1.20.3 2023-12-05 18:40:55 +01:00
NEZNAMY 4bb14c4a4e Rename new config options 2023-12-05 17:27:24 +01:00
NEZNAMY 1dd75162f9 Add a version to list 2023-12-04 21:09:37 +01:00
NEZNAMY a2242e3c27 Move server version check 2023-12-04 20:52:29 +01:00
NEZNAMY 26ecf494a9 Little fix 2023-12-04 20:45:51 +01:00
NEZNAMY 659af5d0b3 Completely get rid of NMSStorage class 2023-12-04 20:33:23 +01:00
NEZNAMY 382a5ee7fc Move packet sending method to a separate class and make loading optional 2023-12-04 19:17:51 +01:00
NEZNAMY 7364496844 Move ping retrieving method to a separate class 2023-12-04 17:52:32 +01:00
NEZNAMY d342316b87 Reduce dependence on the main NMS class on Bukkit 2023-12-04 17:29:25 +01:00
NEZNAMY b38141da88 Add &f at the beginning of scoreboard lines for 1.13+ players to prevent color field from coloring text if no color is used 2023-12-04 16:40:06 +01:00
NEZNAMY 98f80f7dae Remove unused methods 2023-12-03 21:36:22 +01:00
NEZNAMY c134ec6bfe Simplify class loading 2023-12-03 21:32:00 +01:00
NEZNAMY 4e3f759243 Use NMS prefix only once instead of every usage 2023-12-03 21:03:08 +01:00
NEZNAMY a5f2e0157b Make player game profile getting optional instead of throwing a compatibility error 2023-12-03 20:52:29 +01:00
NEZNAMY fd21032e51 Make pipeline injection compatibility optional and print a warning if a compatibility error is found 2023-12-03 19:22:33 +01:00
NEZNAMY c4f5f9b7d3 Update comment 2023-12-03 18:11:40 +01:00
NEZNAMY 6baf5a7068 Fix NPE 2023-12-03 17:28:41 +01:00
NEZNAMY d3460174de Enable fallback solutions for Scoreboard implementation on Bukkit 2023-12-03 16:07:05 +01:00
NEZNAMY f9f19628ca Fix BukkitScoreboard class issues 2023-12-03 15:38:22 +01:00
NEZNAMY 04e48fea5d Clean up method 2023-12-01 20:22:41 +01:00
NEZNAMY 3e99e22fce Simplify 2023-12-01 19:18:58 +01:00
NEZNAMY 0b244d5ff7 Refactor PacketScoreboard class and draft 1.20.3 support 2023-12-01 19:15:56 +01:00
NEZNAMY 703f2ff316 Fix potentially wrong uuid write 2023-12-01 09:35:47 +01:00
NEZNAMY 34a2bbdbae Simplify 2023-12-01 09:34:14 +01:00
NEZNAMY cd8697c1a4 Add exclusions for some dependencies 2023-11-30 19:15:20 +01:00
NEZNAMY ed2dc2dd51 Avoid rare error on Velocity 2023-11-30 18:50:53 +01:00
NEZNAMY 2dfdc1b993 Update Fabric to 1.20.3-rc1 2023-11-30 18:27:49 +01:00
NEZNAMY 6f2d7f1194 Fix 1.20.3 client crash on BungeeCord 2023-11-30 17:52:01 +01:00
NEZNAMY 30009ef127 Attempt to fix error (#1146) 2023-11-29 17:19:11 +01:00
NEZNAMY 051a422331 Update Fabric to 1.20.3-pre4 2023-11-29 16:56:35 +01:00
NEZNAMY fab6489e9c Fix compilation 2023-11-28 16:12:27 +01:00
NEZNAMY a448614e4a Slightly better organize method 2023-11-27 18:54:28 +01:00
NEZNAMY 84ad874b2a Split complex method into 2 2023-11-27 18:43:43 +01:00
NEZNAMY 19ba978291 Simplify 2023-11-27 18:16:48 +01:00
NEZNAMY e304469e55 Remove star import 2023-11-27 18:10:28 +01:00
NEZNAMY 7ce9e2592a Update README.md 2023-11-27 18:07:35 +01:00
NEZNAMY 681b812c7b Rename feature in /tab cpu output 2023-11-26 13:59:29 +01:00
NEZNAMY ee1ab6785d Rename objective 2023-11-26 12:36:12 +01:00
NEZNAMY 57704b6622 Move a few classes around 2023-11-26 11:15:23 +01:00
NEZNAMY 7fe804e0fc Fix disconnect on bungeecord on 1.20.3 due to null text in component 2023-11-25 22:24:02 +01:00
NEZNAMY a71529b641 Simplify 2023-11-25 18:07:47 +01:00
NEZNAMY 4055173bdb Replace .length() == 0 with .isEmpty() 2023-11-25 17:09:20 +01:00
NEZNAMY 3f8841a276 Update to latest BungeeCord (for the 3rd time in a row) 2023-11-25 17:04:34 +01:00
NEZNAMY 15c38851bc Add misconfiguration check and prevent startup error 2023-11-25 16:56:11 +01:00
NEZNAMY 05030ae817 Update outdated message 2023-11-25 13:05:57 +01:00
NEZNAMY 255fa11371 Fix NPE 2023-11-24 18:41:08 +01:00
NEZNAMY a074c0bf74 Simplify 2023-11-24 10:49:12 +01:00
NEZNAMY 6ccd649fc4 Remove unused imports 2023-11-24 10:46:59 +01:00
NEZNAMY 21dbea07dd Add support for nested relational placeholders (#1153) 2023-11-23 20:28:21 +01:00
NEZNAMY 4c21d9d127 Remove unused import 2023-11-23 20:27:16 +01:00
NEZNAMY 766002b079 Delete aligned suffix feature, since 1.20.3 now has it naturally using playerlist objective (rip 1.20.2-) 2023-11-23 19:39:47 +01:00
NEZNAMY 2ce430ec41 Add support for all Fabric versions in a single jar 2023-11-23 19:18:31 +01:00
NEZNAMY cf2b151045 Bump Velocity version and use new method 2023-11-19 16:57:22 +01:00
NEZNAMY 92216179df Replace try/catch with SneakyThrows annotation 2023-11-19 16:27:06 +01:00
NEZNAMY a2a95b8591 Replace scoreboard enums with fields 2023-11-19 10:50:54 +01:00
NEZNAMY 4a22dc111a Fix attempt to send header/footer to 1.7 players on bungeecord, causing disconnect 2023-11-19 10:16:27 +01:00
NEZNAMY 5df7ecc245 Fix compatibility error message 2023-11-18 20:49:24 +01:00
NEZNAMY d4ef520f26 Print required bridge version in debug command if not connected 2023-11-18 20:39:09 +01:00
NEZNAMY e0f8737865 Use direct code for bungeecord instead of reflection and drop support for old versions 2023-11-18 20:37:37 +01:00
NEZNAMY 37b13a54a7 Create classes for plugin message types instead of writing all content on each usage + bump bridge version to 5 due to braking changes 2023-11-18 14:44:22 +01:00
NEZNAMY d9d28d31d0 Prepare for new 1.20.3 scoreboard features 2023-11-17 20:21:17 +01:00
NEZNAMY 66bf5da3f5 Delete CustomLine class due to not being viable 2023-11-17 11:41:11 +01:00
NEZNAMY 840c721afc Simplify, the performance gain was pretty much zero 2023-11-17 10:59:28 +01:00
NEZNAMY 859e705a48 Drop multi-version code for fabric (hard to maintain + a lot of it didn't actually work) 2023-11-16 22:10:45 +01:00
NEZNAMY 7375070b21 oops (#1144) 2023-11-15 16:53:42 +01:00
NEZNAMY 3e2eda6a71 Add ClickEvent to components 2023-11-11 20:17:22 +01:00
NEZNAMY 798d327dcb Fix plugin not removing redundant character width overrides from config 2023-11-11 18:11:37 +01:00
NEZNAMY f5ca9139e6 Fix double bossbar on Velocity on server switch (#1139) 2023-11-11 14:02:07 +01:00
NEZNAMY f35e8cfa51 Improve vanish tracking for nametag feature 2023-11-10 21:31:21 +01:00
NEZNAMY 0f6953711b Update build.yml 2023-11-10 15:57:34 +01:00
NEZNAMY e2c5e6f9ac Allow empty text for fixed slots in layout 2023-11-10 15:46:26 +01:00
NEZNAMY 5ef5d6ddba Update README.md 2023-11-10 12:51:41 +01:00
NEZNAMY 5b19a5d798 Only unregister team for other players when player is vanishing 2023-11-10 11:02:35 +01:00
NEZNAMY bf804e8923 Merge pull request #1137 from NEZNAMY/vanish-patch
Alternate implementation of #1136
2023-11-09 18:53:45 +01:00
NEZNAMY f47b8b5528 Alternate implementation of #1136 2023-11-09 18:30:56 +01:00
NEZNAMY c353f6787a Fix endsWith condition (#1134) 2023-11-07 17:37:52 +01:00
NEZNAMY 1b7d5c1a5c Add support for latest BungeeCord (yes, again), as well as some previous versions and remove compatibility check. 2023-11-06 17:12:26 +01:00
NEZNAMY 956456f157 4.1.0-SNAPSHOT 2023-11-06 13:41:51 +01:00
NEZNAMY 49077bd798 Create enum constants for packet actions for better readability and understanding of code 2023-11-05 21:16:07 +01:00
NEZNAMY 019a0287b2 4.0.9 2023-11-05 14:27:55 +01:00
NEZNAMY a71dac28c0 Hotfix after adding support for latest bungeecord (#1132) 2023-11-05 14:21:25 +01:00
NEZNAMY 155886e000 Fix typo 2023-11-04 15:39:45 +01:00
NEZNAMY ed4c303d2e 4.0.8 2023-11-04 14:55:32 +01:00
NEZNAMY 9da0db5f74 Disable creation of blank issues 2023-11-04 11:55:58 +01:00
NEZNAMY 562a973c84 Create new issue template 2023-11-04 11:53:10 +01:00
NEZNAMY 967980ddf7 Update bug_report.yml 2023-11-03 21:27:24 +01:00
NEZNAMY 81d3675a87 Check for bundle packet on 1.19.4+ when reading entity packets for unlimited nametags 2023-11-03 21:25:21 +01:00
NEZNAMY 7be786bbaf Fix vanish change being called on join even if vanish status did not change 2023-11-02 17:24:02 +01:00
NEZNAMY f41c9be1f7 Fix race condition on Velocity causing errors on shutdown 2023-11-02 17:21:48 +01:00
NEZNAMY e88062d028 Fix unvanish method not being called on server switch when clearing vanish status 2023-11-02 16:08:15 +01:00
NEZNAMY edb2828643 Fix wrong java instruction 2023-11-02 15:58:34 +01:00
NEZNAMY 58c189cd0e Catch all exceptions/errors on load/unload to prevent players from getting kicked on bungeecord if something changes again in the future 2023-10-31 16:41:29 +01:00
NEZNAMY 012994847e Unregister teams of players who vanished for those who cannot see vanished players to prevent 3rd party clients from revealing vanished players by finding out who is vanished and who actually left. 2023-10-30 20:39:21 +01:00
NEZNAMY d87801be5f Add support for latest BungeeCord (#1123) 2023-10-30 16:02:31 +01:00
NEZNAMY 6d78c0c104 Create a class storing values of minecraft limitations 2023-10-29 15:25:00 +01:00
NEZNAMY 3a83519122 Fix tablist entry related issues on both BungeeCord and Velocity (each one was affected by a different issue) 2023-10-27 22:27:42 +02:00
NEZNAMY a9f940ebed Avoid attempts to send packets to offline players on bungeecord 2023-10-27 19:17:56 +02:00
NEZNAMY db73d9ef81 Simplify 2023-10-24 17:46:25 +02:00
NEZNAMY e2bd21c717 Cache adventure components & use Paper API for header/footer by default. This has reduced CPU usage of the feature by 50% in the test I have done. 2023-10-24 17:40:22 +02:00
NEZNAMY 871215b7b5 Do not attempt to send scoreboard-related packets between login packet send and process 2023-10-24 15:18:17 +02:00
NEZNAMY a6153ef46f Force-fix NPE that doesn't make sense 2023-10-24 13:42:55 +02:00
NEZNAMY 35475a6103 Fix the previous error on Fabric & Sponge as well 2023-10-24 13:42:35 +02:00
NEZNAMY bf77ffc1a5 Fix error (#1117) 2023-10-22 23:01:53 +02:00
NEZNAMY 7a64a9a534 Code style 2023-10-22 20:08:27 +02:00
NEZNAMY 68e057b99c Fabric - Implement world name recognition and everything related to it (#1115) 2023-10-22 17:44:34 +02:00
NEZNAMY 7338afff96 Fix error when using 3 years old version of PlaceholderAPI 2023-10-21 11:27:38 +02:00
NEZNAMY 97ae7813aa Add vanish status updating to RedisBungee (#1109) 2023-10-18 16:48:01 +02:00
NEZNAMY c0f3667ac1 4.0.8-SNAPSHOT 2023-10-18 16:47:37 +02:00
NEZNAMY d5c5502abe 4.0.7 2023-10-16 20:45:35 +02:00
NEZNAMY 194e8ffbd9 Code style 2023-10-15 20:39:06 +02:00
NEZNAMY ef39458abd With all the problems on 1.20.2 BungeeCord it turns out that Velocity isn't that bad. 2023-10-15 17:39:21 +02:00
NEZNAMY 6a6907fb0a Process login packet with a delay to avoid problems 2023-10-15 17:33:06 +02:00
NEZNAMY 8bb7c4a4a6 Adapt redis support subfeatures to recent changes 2023-10-15 17:00:55 +02:00
NEZNAMY 91700e7ed0 Fix global playerlist not readding players for 1.20.2 clients on server switch 2023-10-15 17:00:16 +02:00
NEZNAMY 661c2e6fc3 Simplify 2023-10-15 15:37:38 +02:00
NEZNAMY 3d053a6149 Implement backup solutions if header/footer fields fail to initialize 2023-10-15 15:35:25 +02:00
NEZNAMY 34179e4f62 Fix startup on old versions due to wrong enum names 2023-10-15 14:56:40 +02:00
NEZNAMY a23e5d9f50 Remove toComponent method from Platform interface and only keep it in platforms that actually use it 2023-10-15 14:26:09 +02:00
NEZNAMY 1cbcbf70d9 Fix aligned playerlist attempting to send packets to players who just left 2023-10-15 14:08:35 +02:00
NEZNAMY 0a7371aaec Micro optimizations with enum conversions 2023-10-14 13:55:52 +02:00
NEZNAMY da13e2d861 Fix Bridge still injecting placeholders that are not used on proxy anymore 2023-10-13 12:27:12 +02:00
NEZNAMY 5b18fa8c25 Fix PingSpoof spoofing everything instead of just online players (or their respective layout entries) 2023-10-13 11:34:38 +02:00
NEZNAMY 347231850a Fix error 2023-10-13 09:51:40 +02:00
NEZNAMY b1f9bdc26c Resend BossBar on server switch for 1.20.2 players as Login packet now clears it 2023-10-12 20:51:50 +02:00
NEZNAMY 03c9b95041 Listen to login packet instead of server switch delay for 1.20.2 players for better consistency (also fix layout not being resent on server switch on 1.20.2) 2023-10-12 19:20:22 +02:00
NEZNAMY 6e7e1d783b Fix rare placeholder formatting error 2023-10-12 16:33:58 +02:00
NEZNAMY cfb9b0a029 Fix compatibility with some random 1.8.8 overpriced fork (#1105) 2023-10-12 14:32:21 +02:00
NEZNAMY b7ea6e5af6 Fix wrong exception being caught causing the try/catch to not work (#1092) 2023-10-12 09:33:50 +02:00
NEZNAMY 44104df712 Change error message about invalid team/objective actions to a debug message. They don't cause any issues as they are properly caught and debugging is hard, especially if reporter has no interest in cooperating (#1083) 2023-10-11 19:35:57 +02:00
NEZNAMY 5de20d1c58 Add try/catch for BungeeCord sendPacket method to avoid a NPE in BungeeCord code (#1090, #1092) 2023-10-11 16:24:43 +02:00
NEZNAMY d156303740 Remove warn when placeholders use too much CPU. Since they have been moved to another thread, they will no longer prevent the plugin from working. While the warning can be useful for more advanced users, this is a public plugin used by many and most of them don't care about performance at all. This has resulted in having to answer people who would have never contacted me otherwise. 2023-10-10 15:04:00 +02:00
NEZNAMY 6e36eb3554 Add back fabric class for multi-version code for easier backport 2023-10-09 21:49:21 +02:00
NEZNAMY f7f3891817 Avoid attempts to send plugin message to offline players on bungeecord (#1090? #1092?) that may? cause errors on 1.20.2 2023-10-08 12:41:12 +02:00
NEZNAMY 1ec28856ff Avoid attempts to send packets to offline players on bungeecord (#1090? #1092?) that may? cause errors on 1.20.2 2023-10-06 11:41:32 +02:00
NEZNAMY 9658e0b74d Add debug message showing how long bridge took to respond to player join plugin message 2023-10-06 11:31:09 +02:00
NEZNAMY 86cd8d4151 Make feature loading more readable 2023-10-05 17:39:27 +02:00
NEZNAMY 2418eb206e Improve unknown version handling code & error messages 2023-10-05 13:57:56 +02:00
NEZNAMY 08fa715d26 Fix runtime warns false triggering on proxy when placeholders are not loaded due to bridge not having a chance to respond yet (#1088) 2023-10-04 14:16:08 +02:00
NEZNAMY 52426de283 Remove double method call 2023-10-04 14:04:57 +02:00
NEZNAMY 64b3da14c4 It's called disable condition, not display condition 2023-10-02 20:38:21 +02:00
NEZNAMY bf7341c52c Change way getProfile method is retrieved (#1089) 2023-10-02 19:09:53 +02:00
NEZNAMY e3490564a2 4.0.7-SNAPSHOT 2023-10-02 19:07:05 +02:00
789 changed files with 49180 additions and 82823 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
+10
View File
@@ -18,6 +18,14 @@ body:
validations:
required: true
- type: textarea
attributes:
label: Plugin list
description: Full list of plugins (output of /plugins)
placeholder: ...
validations:
required: true
- type: textarea
attributes:
label: Describe the bug
@@ -60,4 +68,6 @@ body:
- label: I ticked all of the boxes without actually reading them
required: false
- label: I have read the Compatibility wiki page and am not trying to run the plugin on an unsupported server version / platform
required: true
- label: I am willing to cooperate to get this issue resolved faster, including providing any additional information requested or testing new builds
required: true
@@ -0,0 +1,38 @@
name: Compatibility issue
description: A compatibility issue with another plugin/mod or a specific version of a platform marked as supported
labels: ["Type: Compatibility issue"]
body:
- type: input
attributes:
label: TAB version
description: Full version in numbers, "latest" is not a version.
placeholder: 4.0.0
validations:
required: true
- type: textarea
attributes:
label: Software causing compatibility issue
description: plugin/mod/platform version causing the issue
validations:
required: true
- type: textarea
attributes:
label: Additional info
description: Anything else you want to provide that will help in resolving the issue faster.
validations:
required: false
- type: checkboxes
attributes:
label: Checklist
description: Let's make sure this report is valid
options:
- label: I am running latest version of the plugin
required: true
- label: I ticked all of the boxes without actually reading them
required: false
- label: The compatibility wiki page does not mention this incompatibility
required: true
- label: I am willing to cooperate to get this issue resolved faster, including providing any additional information requested or testing new builds
required: true
+5
View File
@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Support
url: https://discord.gg/YPqXt63YQj
about: Fresh new community discord providing support with all plugins, including TAB
+14
View File
@@ -0,0 +1,14 @@
# About
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 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:
| File name | Description |
|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| images | Folder containing all images used in the descriptions and wiki for advertising. Used not only as a backup, but for hosting them as well, so we do not need to rely on third party websites. |
| description_markdown.md | Plugin description written in **markdown** syntax. Used by **Modrinth**. |
| description_bbcode.txt | Plugin description written in **bbcode** syntax. Used by **SpigotMC** and **BuiltByBit**. |
@@ -0,0 +1,34 @@
[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. 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://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://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.
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/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]
@@ -0,0 +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.
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://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.
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/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="138" height="20" role="img" aria-label="Minecraft: 1.5 - 1.21.8"><title>Minecraft: 1.5 - 1.21.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="138" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="77" height="20" fill="#007ec6"/><rect width="138" 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="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">Minecraft</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">Minecraft</text><text aria-hidden="true" x="985" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="670">1.5 - 1.21.8</text><text x="985" y="140" transform="scale(.1)" fill="#fff" textLength="670">1.5 - 1.21.8</text></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="92" height="20" role="img" aria-label="Release: 5.2.5"><title>Release: 5.2.5</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">5.2.5</text><text x="715" y="140" transform="scale(.1)" fill="#fff" textLength="290">5.2.5</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: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 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,288 @@
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 = "5.2.5"
download_image(f"https://img.shields.io/badge/Release-{release}-blue.svg", "Badge_Release.svg")
minecraft = "1.5 - 1.21.8".replace(" ", "%20").replace("-", "--")
download_image(f"https://img.shields.io/badge/Minecraft-{minecraft}-blue.svg", "Badge_Minecraft.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.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

+11
View File
@@ -0,0 +1,11 @@
# About
This is a backup of the wiki in case anything happened to the repository, so the wiki will not get lost forever.
The "Clone this wiki locally" option on GitHub wiki does not actually work (the downloaded file is malformed) and cannot be used to import data from the file (?).
Since GitHub wiki does not support reading the wiki from source code, every change
to the wiki must be copied here as well. The wiki is being updated on an almost daily basis for many reasons, including, but not limited to
updating compatibility page (especially when new MC versions come out), adding more examples, improving descriptions, fixing mistakes or
adding information that was previously missing. This synchronization will be done periodically once a month.
# Hyperlinks
All hyperlinks used inside the wiki link to other wiki pages using full URLs. As a result, they will all be broken when browsing here.
This is expected and will not be resolved.
+46
View File
@@ -0,0 +1,46 @@
## Getting started
* [Why TAB?](https://github.com/NEZNAMY/TAB/wiki/Why-TAB%3F)
* [Installation](https://github.com/NEZNAMY/TAB/wiki/Installation)
* [Commands & Permissions](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions)
* [Frequently Asked Questions](https://github.com/NEZNAMY/TAB/wiki/Frequently-Asked-Questions)
* [Compatibility](https://github.com/NEZNAMY/TAB/wiki/Compatibility)
* [How to assign players into groups](https://github.com/NEZNAMY/TAB/wiki/How-to-assign-players-into-groups)
* [Known issues](https://github.com/NEZNAMY/TAB/wiki/Known-issues)
* [TAB-Bridge plugin](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge)
## Core features
* [Belowname](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Belowname)
* [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)
* [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)
* [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)
* [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting)
## Functions
* [Animations](https://github.com/NEZNAMY/TAB/wiki/Animations)
* [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
* [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)
* [Quick PlaceholderAPI startup guide](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide)
+105
View File
@@ -0,0 +1,105 @@
# About
This is a collection of random information about the plugin not necessarily limited to a single feature or function.
# Content
* [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)
* [Differences](#differences)
* [Debug config option](#debug-config-option)
# Vanish detection
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](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](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 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
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).
# Scoreboard objective and team naming
There's a well-known BungeeCord bug that kicks players if a duplicate team or objective is registered.
This message also shows the name of the objective/team.
Before reporting this, make sure it actually comes from TAB.
TAB's objective and team naming:
* Objectives ("Objective ... already exists in this scoreboard")
* `TAB-BelowName` for [Belowname](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Belowname)
* `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-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.
## Detection
When TAB is installed on a proxy, the proxy's API is used to get player's version.
When TAB is installed on a backend server, ViaVersion's API is used to get player's version (as it's the only plugin allowing multiple versions, ProtocolSupport is abandoned).
You can check what version the plugin thinks player has by using any of the following:
* `/tab parse <player> %player-version%` - Shows version name, if multiple versions share the same protocol, the newer one is returned
* `/tab parse <player> %player-version-id%` - Returns network id of player's version
* Set `debug: true` in config and check console messages on player join, it will send a message containing game version ViaVersion API has returned
Player game version detection may fail. Here are a few possible scenarios why:
* ViaVersion is installed on 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 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.
| 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:
* 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 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 suggests something bad is going on, either bridge being overloaded or the server itself.
+60
View File
@@ -0,0 +1,60 @@
# Content
* [Creating an animation](#creating-an-animation)
* [Using an animation](#using-an-animation)
* [Tips & Tricks](#tips--tricks)
* [External tools](#external-tools)
* [Additional info](#additional-info)
* [Additional note 1 - Frame synchronization](#additional-note-1---frame-synchronization)
# Creating an animation
Animations can be created in **animations.yml** file.
To begin, you can copy an already existing animation or directly modify already existing one.
Let's take a look at an example:
```animations:
Welcome: #this is name of the animation
change-interval: 400 #this is refresh interval of the animation in milliseconds
texts: #the frames of animation
- "&7&lW_"
- "&7&lW_"
- "&7&lWe_"
- "&7&lWel_"
- "&7&lWelc_"
- "&7&lWelco_"
- "&7&lWelcom_"
- "&7&lWelcome_"
- "&7&lWelcome_"
- "&7&lWelcome_"
- "&7&lWelcome_"
- "&7&lWelcom_"
- "&7&lWelco_"
- "&7&lWelc_"
- "&7&lWel_"
- "&7&lWe_"
- "&7&lW_"
- "&7&lW_"
```
This is an animation called `Welcome` with `change-interval` of `400` milliseconds, which is 2.5 refreshes per second. `Texts` are the actual frames of animation.
# Using an animation
To use an animation, use `%animation:<name>%` format.
In the example above it's `%animation:Welcome%`.
Animations are supported everywhere.
That includes header/footer, prefix/suffix, belowname, playerlist objective, bossbar and more.
# Tips & Tricks
* Animations don't need to be fast. You can use them as a changing text in general.
* Animations can also be used as a short alias to a long text. You can do this by creating an animation with one frame.
# External tools
If you want an animation too complicated to be done manually, you can check out these websites:
* https://www.birdflop.com/resources/animtab/
* https://starve-l.github.io/tab-animation.html
* https://srnyx.com/gradient
# Additional info
## Additional note 1 - Frame synchronization
All animations start at the same time, which is time of plugin being (re)loaded.
Thanks to this, all animations with the same 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.
+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 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:
* 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 `.`.
+20
View File
@@ -0,0 +1,20 @@
# Content
* [About](#about)
* [Nametag format in tablist](#nametag-format-in-tablist)
* [Tablist entry overlap](#tablist-entry-overlap)
* [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.
# 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 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.
There isn't really any ideal solution for this. Here are a few tips that might help:
* Decrease GUI scale in client options to make text smaller
* Make tablist entries shorter, such as avoiding using bold text (&l) or using short aliases for ranks instead of their full names (such as `A` instead of `Admin`).
# Tablist entry widths
All tablist entries are rendered with the same width regardless of their content to match width of the longest text. This is done globally, not on a per-column basis. Therefore, one wide entry with make them all render wide, even if the content is empty. This can be a problem when using [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) to force all 80 slots. Just like in the point above, you need to make the longest entry shorter to have the tablist smaller.
+155
View File
@@ -0,0 +1,155 @@
# About
This page lists all the commands and permissions that are available with TAB.
Commands have required permissions associated with them.
**BungeeCord / Velocity users who installed TAB 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.
* 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.
* 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\> remove](#tab-playergroupplayeruuid-name-remove)
* [/tab reload](#tab-reload)
* [/tab debug \[player\]](#tab-debug-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 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 announce \<name\> \<length\>](#tab-scoreboard-announce-name-duration)
* [Nametags / Teams](#nametags--teams)
* [/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)
* [/tab mysql download](#tab-mysql-download)
* [Other](#other)
* [/tab cpu](#tab-cpu)
* [/tab parse \<player\> \<placeholder\>](#tab-parse-player-text)
* [Additional permissions](#additional-permissions)
# Configuration commands
## /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.
#### Properties
* For tablist: `tabprefix`, `customtabname`, and `tabsuffix`.
* For nametag: `tagprefix` and `tagsuffix`.
#### Options
* `-s <server>` - Applying value only for a specific server
* `-w <world>` - Applying value only for a specific world
#### 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: Using group names from permission plugin. `_DEFAULT_` is used for default settings for all groups.
## /tab \<player/group/playeruuid\> \<name\> remove
* **Permission:** `tab.remove`
* **Description:** Removes all direct data from the given player/group.
#### Notes
* The `playeruuid` argument requires the name of an **online player** to remove data from.
## /tab reload
* **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 group \<group\>
* **Permission:** `tab.groupinfo`
* **Description:** Shows all settings applied to the specified group, both global and per-world / per-server. Handy when plugin is connected to MySQL, where you have no other way to effectively check group settings.
## /tab groups
* **Permission:** `tab.grouplist`
* **Description:** Shows a list of all groups that have anything assigned to them, either globally or per-world / per-server. Handy when plugin is connected to MySQL, where you have no other way to effectively check your groups.
# Scoreboard
## /tab scoreboard show \<name\> \[player\]
* **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\]
* **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:**
* `-s` for silent toggling (no chat message for affected player)
## /tab scoreboard announce \<name\> \<duration\>
* **Permission:** `tab.announce.scoreboard`
* **Description:** Shows the scoreboard with the given `name` to every player on the server for the given `duration`, in seconds.
# Bossbar
## /tab bossbar show \<name\> \[player\]
* **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\]
* **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:**
* `-s` for silent toggling (no chat message for affected player)
## /tab bossbar announce \<name\> \<duration\>
* **Permission:** `tab.announce.bar`
* **Description:** Shows the bossbar with the given `name` to every player on the server for the given `duration`, in seconds.
# Nametags / Teams
## /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`
* **Description:** Forces collision rule for specified player, overriding configuration.
# MySQL
## /tab mysql upload
* **Permission:** `tab.mysql.upload`
* **Description:** Uploads all data from users.yml and groups.yml to MySQL. MySQL must be enabled and connected for this command to work.
## /tab mysql download
* **Permission:** `tab.mysql.download`
* **Description:** Downloads all data to users.yml and groups.yml from MySQL. MySQL must be enabled and connected for this command to work.
# Other
## /tab cpu
* **Permission:** `tab.cpu`
* **Description:** Shows approximate CPU usage of the plugin from the last 10 seconds. There are parts that are impossible to be measured, so this shows slightly less than the real value is. The content is self-explanatory. All major ways to decrease CPU usage can be found at [Optimizing the plugin](https://github.com/NEZNAMY/TAB/wiki/Optimizing-the-plugin).
## /tab parse \<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 verify if a placeholder works as expected.
# Additional permissions
* `tab.admin` - Allows the player to execute all commands.
* `tab.bypass` - If the per-world player list is enabled as well as this permission, it allows the player to see everyone on the server, regardless of what the per-world player list settings allow. For example, if your per-world player list is set up to isolate worlds A and B, players with this permission will see all players from both A and B on their player list, whereas players that don't have the permission will only see either players from world A or players from world B, depending on what world they are in.
* `tab.staff` - Allows the player to be counted in the `%staffonline%` placeholder.
* `tab.spectatorbypass` - If enabling bypass permission in [Spectator fix](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Spectator-fix), this is the permission.
* `tab.tabcomplete` - Allows the player to auto-complete the `/tab` command.
* `tab.seevanished` - Allows the player to see other vanished players on the [Global Playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist) and [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout).
+157
View File
@@ -0,0 +1,157 @@
# 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)
* [Forge / NeoForge](#forge--neoforge)
* [Sponge](#sponge)
* [Velocity](#velocity)
* [Compatibility issues](#compatibility-issues)
# Requirements
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:
* Sponge, 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>
<thead>
<tr>
<th>Software type</th>
<th>Software name</th>
<th>Supported versions</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan=2>Vanilla</td>
<td rowspan=1><a href="https://getbukkit.org/">Bukkit</a> (+forge hybrids)</td>
<td>✔ (1.5 - 1.21.8)</td>
</tr>
<tr>
<td rowspan=1><a href="https://www.spongepowered.org/">Sponge</a></td>
<td>✔ (1.20.6 - 1.21.8)</td>
</tr>
</tbody>
<tbody>
<tr>
<td rowspan=3>Modded</td>
<td rowspan=1><a href="https://fabricmc.net">Fabric</a></td>
<td>✔ (1.21.6 - 1.21.8)<sup>1</sup></td>
</tr>
<tr>
<td rowspan=1><a href="https://minecraftforge.net">Forge</a></td>
<td>✔ (1.21.6 - 1.21.8)<sup>1</sup></td>
</tr>
<tr>
<td rowspan=1><a href="https://neoforged.net/">NeoForge</a></td>
<td>✔ (1.21.6 - 1.21.8)<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>
</tr>
<tr>
<td rowspan=1><a href="https://www.velocitypowered.com/">Velocity</a></td>
<td>✔ (latest only)<sup>2</sup></td>
</tr>
</tbody>
</table>
<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.
Since breaking changes don't happen too often, it means a wide range of versions is usually supported.
When a breaking change occurs, the plugin is updated to support the new version,
automatically making old versions incompatible.
Since proxies support all client versions, there is never a reason to stay outdated,
so you can always safely update to new version/build of your proxy software if the plugin requires it.
# Supported features per platform
| Feature \ Platform | Bukkit / Hybrid | Sponge | Fabric / 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
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.
## 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 vanishing levels instead of using a basic 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 vanishing levels instead of using a basic 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.
[**placeholder-api**](https://modrinth.com/mod/placeholder-api) - Displaying placeholders from that mod and offering TAB's placeholders into it.
## Forge / NeoForge
[**LuckPerms**](https://github.com/LuckPerms/LuckPerms) - Permission checks with a string instead of using vanilla OP levels.
## Sponge
*None*
## Velocity
[**PremiumVanish**](https://www.spigotmc.org/resources/14404) -
Supporting PremiumVanish's vanishing levels instead of using a basic 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)
# 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 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 `value` and [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective)'s `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.
* 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 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.
+110
View File
@@ -0,0 +1,110 @@
# Page content
* [About](#about)
* [Adding the dependency](#adding-the-dependency)
* [Getting started](#getting-started)
* [Lifespan of API calls](#lifespan-of-api-calls)
* [Events](#Events)
# External Content
* [BossBar](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Bossbar#api)
* [Header/Footer](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Header-&-Footer#api)
* [Nametags](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags#api)
* [Scoreboard](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Scoreboard#api)
* [Sorting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist#api)
* [Tablist name formatting](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Tablist-name-formatting#api)
* [Placeholders](https://github.com/NEZNAMY/TAB/wiki/Placeholders#api)
# 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
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.NEZNAMY</groupId>
<artifactId>TAB-API</artifactId>
<version>5.2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
Or, for Gradle users, here are a few examples:
Groovy:
```groovy
repositories {
maven { url 'https://jitpack.io' }
}
dependencies {
compileOnly 'com.github.NEZNAMY:TAB-API:5.2.5'
}
```
Kotlin:
```kotlin
repositories {
maven("https://jitpack.io")
}
dependencies {
compileOnly("com.github.NEZNAMY", "TAB-API", "5.2.5")
}
```
> [!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()`.
The `TabAPI` class that you want to import is located in the `me.neznamy.tab.api` package.
If you do not see this imported,
or it is imported but the package is not `me.neznamy.tab.api`, then you have the **wrong class**.
Now you have the instance, you can get a `TabPlayer` with the methods `getPlayer(UUID)` and `getPlayer(String)`, to get players by UUID and name respectively.
If no player was found with the UUID or the name that you gave, these methods will return `null`. It is important that you catch this, to avoid running in to a `NullPointerException`. You should **NOT** assume that just because a player has logged in that TAB will already have a player for them, as players are processed asynchronously. This will be especially true for join events like `PlayerJoinEvent`.
If you want to be 100% sure that the player you want is loaded when you want to process them, use `PlayerLoadEvent`.
This will give you the `TabPlayer` that has been loaded, so that you can process that `TabPlayer`.
See below for more details on how to use the event.
# Lifespan of API calls
All API calls result in temporary changes to the plugin's logic.
When the plugin is reloaded or server restarted, all previous API calls will lose effect.
This also applies for players after they reconnect—they are reset back.
If you want to perform long-term changes to player's prefix or suffix,
call TAB's [commands](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions) from your plugin.
If you want to re-apply your changes on plugin reload, listen to [events](#events) using plugin's own event system,
specifically `TabLoadEvent`, which is called on plugin reload.
# Events
TAB is using a custom platform-independent event API. As such, the same event listener code will work on all supported platforms. Usage is also different, let's take a look at an example:
```
TabAPI.getInstance().getEventBus().register(PlayerLoadEvent.class, event -> {
TabPlayer tabPlayer = event.getPlayer();
//do something
});
```
TAB plugin provides the following events:
* `TabLoadEvent` - Called when the plugin has finished its load, either on startup or plugin reload.
* `PlayerLoadEvent` - Called when the plugin has finished loading a player (either join or plugin reload).
* `PlaceholderRegisterEvent` - Called when the plugin is about to register a parser for used PlaceholderAPI placeholder, allowing to override it.
+52
View File
@@ -0,0 +1,52 @@
# Content
* [About](#about)
* [errors.log](#errorslog)
* [placeholder-errors.log](#placeholder-errorslog)
* [anti-override.log](#anti-overridelog)
# About
TAB logs various events in multiple files to keep the console clean.
All of these notifications are negative, so they should be looked at.
Files are only created when something is about to get logged.
This means if you have none of these files in your folder, everything is good.
It is safe to delete the logs any time while the server is running without needing to reload the plugin or anything.
All files have their sizes limited to 16 MB to avoid giant files consisting of the same error repeating over and over.
Remember these files are **logs**; therefore, after solving the problems you must delete them.
These files will not delete themselves.
After deleting a file, there is no need to perform any other action.
Every time an error is about to be logged, the file is created if it doesn't exist.
Java errors usually contain stack traces.
If you got an error spamming with an error message but no stack trace,
the most common cause is java not including it because too many errors were thrown already.
To bypass this check, add `-XX:-OmitStackTraceInFastThrow` to your startup parameters.
# errors.log
No one likes having their console spammed with errors.
Fixing errors is the most reliable solution, however, that takes time,
and you usually don't get an update fixing an error the second you report it.
Because of that, all plugin errors are moved to this file instead.
# placeholder-errors.log
This file is used
to track errors thrown by PlaceholderAPI expansions when trying to retrieve the value of a placeholder.
These should be reported to the expansion author.
First line(s) of error should give you a good idea which expansion it is,
as well as the actual placeholder which threw the error
(displayed on top of the error).
# anti-override.log
This file logs all attempts of other plugins to override TAB's visuals.
This is checking for features that only a single plugin can be displaying info in at once
(such as nametag prefix/suffix, tablist prefix/suffix).
This means that (at least) one of your plugins is not configured correctly,
and you didn't disable functions you don't want.
If you want TAB to use a feature, disable it in other plugins.
If you want a different plugin to display it, disable it in TAB (disabled features do not log this).
It is unfortunately not possible to easily figure out which plugin is causing it, you can only guess from the message.
Although this is technically unnecessary since TAB automatically blocks other plugins from overriding it,
it's good to have your plugins configured properly.
+204
View File
@@ -0,0 +1,204 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [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)
* [Additional note 4 - Compatibility with modified clients](#additional-note-4---compatibility-with-modified-clients)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [Limitations](#limitations)
* [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
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)
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'
```
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
* `fancy-value` for 1.20.3+ (will show `fancy-value-default` on NPCs), which supports any text
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, 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+, where it completely replaces `value`. |
| 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 | Shared label shown after the score for every player entity. Everyone sees the same text (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) that must be met for disabling the feature for players. Set to empty for not disabling the feature ever. |
# Additional Info
## Additional note 1 - Copying nametag visibility rule
The minecraft feature is programmed to be affected by nametag visibility rule.
This means that when the nametag is set to invisible, belowname will be invisible as well.
## Additional note 2 - Hidden on sneak on 1.8
Belowname is not visible on 1.8.x clients when player is sneaking. This is client-sided behavior and cannot be changed by the server.
## Additional note 3 - Visible on NPCs
Belowname objective is automatically attached to all entities of player type with the default value of
`0` (<1.20.3) or value configured as `fancy-value-default` (1.20.3+).
This includes player NPCs.
There is currently only one way to make them not visible on NPCs.
From [Additional note 1 - Copying nametag visibility rule](#additional-note-1---copying-nametag-visibility-rule) we know
that belowname is not visible if player's nametag is invisible.
NPC plugin can take advantage of this by using teams to hide the original name and display a hologram instead.
This is how you can achieve it using the following popular NPC plugins:
* **Citizens**:
* 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.
# 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.
# 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.
# Limitations
* [1.5 - 1.12.2] Title length is limited to 32 characters (including color codes).
* [1.5 - 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.**
# 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:
belowname1:
conditions:
- "%world%=world1"
true: "Text to display in world world1" # Player is in world world1, display the text
false: "%condition:belowname2%" # Player is not in world world1, check another condition
belowname2:
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`:
```
belowname-objective:
fancy-value: "%condition:belowname1%"
```
If you are under 1.20.3 and want to make `value` and `title` conditional,
create two condition chains, one for each value and use them.
> [!NOTE]
> This is just an example, the plugin is not limited to displaying different values only per world.
> If you want per server values on BungeeCord, use %server% with server names.
> If you want WorldGuard regions, use %worldguard_region_name% with region names.
> This works for any placeholder offered by the plugin or by PlaceholderAPI.
## Example 2 - Hiding `title` for 1.20.3+ players
1.20.3 has replaced `value` field,
which is limited to a white number with value configurable as `fancy-value`, which has no limits.
However, `title` field is still visible on 1.20.3+.
If you support both version ranges and want to make the best out of the new functionality,
you might want to not show `title` to 1.20.3+ players anymore,
since you can fully customize the text you want to display in `fancy-value`.
First, let's remind ourselves what `title` *actually* is.
It is actually called scoreboard title.
Yes, just like the one on top of sidebar, just displayed elsewhere.
This is why it displays on all players and placeholders are parsed for the viewing player.
With this knowledge, all we need to do is check for player's version and only show something for <1.20.3.
For this, we will use `%player-version-id%` placeholder,
which returns the network protocol version of player's game version, which can then be compared to.
```
conditions:
version:
- "%player-version-id%>=765" # 1.20.3 is 765
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!
```
belowname-objective:
title: "%condition:version%"
```
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.
## 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
In order to use these placeholders, make sure PlaceholderAPI is installed and its `math` and `player` expansions are downloaded.
# 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.
# 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.
+247
View File
@@ -0,0 +1,247 @@
# 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)
* [Limitations](#limitations)
* [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)
* [API](#api)
* [Examples](#examples)
* [Example 1 - Animated bossbar color](#example-1---animated-bossbar-color)
* [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)
# 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.
# Configuration
## Defining bossbars
```
bossbar:
bars:
MyBossbar:
style: "PROGRESS"
color: "%animation:barcolors%"
progress: "100"
text: "&fWebsite: &bwww.domain.com"
```
Every bossbar line has 4 properties:
### 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.
### 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.
### 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.
> [!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: `%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.
```
bossbar:
bars:
MyBossbar:
style: "PROGRESS"
color: "BLUE"
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"
```
## 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.
When using a bossbar announcement, you have new placeholders available:
* `%bossbar_announce_time_left_<bossbar>%` - Returns remaining time of the announcement in seconds.
* `%bossbar_announce_time_total_<bossbar>%` - Returns total time of the announcement in seconds (the inputted number).
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%`.
## 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. |
# 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.
# 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 is invisible.
Then, you need to force your players to get the resource pack.
## Additional note 2 - Not hiding on server switch
When under a proxy 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.
# 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 `BossBarManager` instance. Get it using `TabAPI.getInstance().getBossBarManager()`. If this feature is disabled, the method will return `null`.
A boss bar is made up of a few things:
* A name. This is either the name given in the config, if the bar was loaded from the config, or a random UUID string when created with API.
* A title. This is the display message of the boss bar.
* The progress from 0 to 100.
* The color. This determines what color the boss bar will appear when it is shown to clients.
* The style. This determines how many segments, if any, the boss bar will be split to.
Let's start with methods in `BossBarManager`:
* `BossBarManager#createBossBar(String, float, BarColor, BarStyle` - Creates new bossbar using direct values.
* `BossBarManager#createBossBar(String, String, String, String` - Creates new bossbar. Accepts all the previous parameters as strings, to allow for placeholders, though the given placeholders must match the requirements (progress will be a number, color and style matching enum names).
* `BossBarManager#getBossBar(String)` - Returns bossbar by name defined in config.
* `BossBarManager#toggleBossBar(TabPlayer, boolean)` - Toggles all bossbars for specified player. The boolean flags whether toggle message defined in messages.yml should be sent to the player or not.
* `BossBarManager#hasBossBarVisible(TabPlayer)` - Returns `true` if player has bossbars visible, `false` if disabled using toggling.
* `BossBarManager#setBossBarVisible(TabPlayer, boolean, boolean)` - Sets bossbar visibility status for specified player to specified value (first boolean). Second boolean determines whether toggle message configured in messages.yml should be sent or not.
* `BossBarManager#sendBossBarTemporarily(TabPlayer, String, int)` - Temporarily sends bossbar to player. String defines name of the bossbar defined in config. Int defines length in milliseconds.
* `BossBarManager#announceBossBar(String, int)` - Sends bossbar with specified name in config to all players for `int` milliseconds.
* `BossBarManager#getAnnouncedBossBars()` - Returns all bossbars, which are currently being announced.
* `BossBarManager#getRegisteredBossBars()` - Returns map of all registered bossbars using configuration or the API.
Methods in `BossBar`:
* `BossBar#getName()` - Returns name of the bossbar defined in config, or randomly generated UUID string when generated using API.
* `BossBar#setTitle(String)` - Sets title. Accepts placeholders, which will be replaced and periodically updated.
* `BossBar#setProgress(String)` - Sets progress. Accepts placeholders, which will be replaced and periodically updated.
* `BossBar#setProgress(float)` - Sets progress.
* `BossBar#setColor(String)` - Sets color. Accepts placeholders, which will be replaced and periodically updated.
* `BossBar#setColor(BarColor)` - Sets color.
* `BossBar#setStyle(String)` - Sets style. Accepts placeholders, which will be replaced and periodically updated.
* `BossBar#setStyle(BarStyle)` - Sets style.
* `BossBar#getTitle()` - Returns raw title.
* `BossBar#getProgress()` - Returns raw progress as string.
* `BossBar#getColor()` - Returns raw color as string.
* `BossBar#getStyle()` - Returns raw style as string.
* `BossBar#addPlayer(TabPlayer)` - Sends the bossbar to specified player.
* `BossBar#removePlayer(TabPlayer)` - Removes the bossbar from specified player.
* `BossBar#getPlayers()` - Returns all players that can currently see this 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.
# Examples
## Example 1 - Animated bossbar color
You can animate the color of a bossbar using [animations](https://github.com/NEZNAMY/TAB/wiki/Animations).
First, create an animation in **animations.yml**, such as
```
BossColor:
change-interval: 1000
texts:
- "BLUE"
- "YELLOW"
```
Then, use the animation in bossbar configuration
```
bars:
ServerInfo:
style: "PROGRESS"
color: "%animation:BossColor%"
progress: "100"
text: "&fWebsite: &bwww.domain.com"
```
This bossbar will change color every second between blue and yellow colors.
You can do the same with progress, style and text as well.
## 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),
create 2 bars and give them the same condition, except, negate it.
If your original condition uses `=`, make second condition use `!=`.
For number comparisons, negate `<` using `>=` and so on.
**Example**:
```
bars:
full:
style: "PROGRESS"
color: "YELLOW"
progress: "100"
text: "&aYour health is full"
display-condition: "%health%=20"
notfull:
style: "PROGRESS"
color: "RED"
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: "%animation:barcolors%"
progress: "100" # in %
text: "&fWebsite: &bwww.domain.com"
```
Now, the bossbar will appear and disappear every 10 seconds.
@@ -0,0 +1,236 @@
# Content
* [About](#about)
* [Condition types](#condition-types)
* [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)
* [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 3 - Negating expressions](#example-3---negating-expressions)
# 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
# Condition types
## 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
| 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.) |
| `\|-` | 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.) |
| `-\|` | 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.) |
> [!NOTE]
> For `=` and `!=` you can check for empty output of a placeholder using `%my_placeholder%=` and `%my_placeholder%!=`.
> [!NOTE]
> For string operations, the text must match placeholder's output exactly, including color codes.
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
| 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 |
# 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.
# Usage
You have 2 ways to use conditions.
## 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>
```
conditions:
serverName:
conditions:
- "%server%=lobby"
yes: "You are in the lobby"
no: "You are not in lobby"
```
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>
```
conditions:
MyCondition:
conditions:
- "permission:tab.admin"
```
```
scoreboards:
MyScoreboard:
display-condition: MyCondition
```
In this example, scoreboard will only be displayed to players with `tab.admin` permission.
</details>
### 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 `|`.
**Single condition example**:
```
display-condition: "%server%=lobby"
```
**Multiple conditions, all of them must be met**:
```
display-condition: "%server%=lobby;%world%=world"
```
**Multiple conditions, at least one of them must be met**:
```
display-condition: "%server%=lobby|%server%=lobby2"
```
# 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).
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---all-platforms-placeholder-refresh-intervals).
# Examples
## Example 1 - Chaining conditional placeholders
Let's create colored ping by chaining conditions using multiple intervals for ping quality. This specific case would be easier done using [replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements), but this is just an example. Let's say we want <50 for good, <100 for medium and 100+ for bad. Let's create the first condition:
```
conditions:
ping:
conditions:
- "%ping%<50"
true: "&a%ping%"
false: "%condition:ping2%"
```
When ping is <50, display it as green. Otherwise, use another condition. Put them together and we get
```
conditions:
ping:
conditions:
- "%ping%<50"
true: "&a%ping%" # Ping is < 50, display as green
false: "%condition:ping2%" # Ping is 50+, check another condition
ping2:
conditions:
- "%ping%<100"
true: "&e%ping%" # Ping is < 100, display as yellow
false: "&c%ping%" # Ping is 100+, display as red
```
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.
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:
```
conditions:
world:
conditions:
- "%world%=world1"
- "%world%=world2"
type: OR
main:
conditions:
- "%condition:world%=true"
- "%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.
## Example 3 - Negating expressions
Most condition types contain their opposites, such as:
* `=` -> `!=`
* `permission:` -> `!permission:`
* `>=` -> `<`
* `>` -> `<=`
However, some of them don't, as things could get too complicated. This includes:
* `|-` starts with
* `-|` ends with
* `<-` contains
You can achieve this by creating a full condition and check if it returned false.
**Example:**
Original:
```
display-condition: "%server%|-lobby"
```
Negated:
```
conditions:
lobby:
conditions:
- "%server%|-lobby"
```
...
```
display-condition: "%condition:lobby%=false"
```
This way, the display condition will pass if the nested condition returned `false` (player is not in any lobby).
@@ -0,0 +1,75 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Grouping players only from certain servers](#grouping-players-only-from-certain-servers)
* [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)
# About
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` (![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). |
## Grouping players only from certain servers
In case you want multiple servers to share playerlist,
but not with every server, create a server group and put servers there.
The default example
```
global-playerlist:
server-groups:
lobbies:
- lobby1
- lobby2
group2:
- server1
- server2
```
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.
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.
To make all servers share the playerlist, simply clear server groups and set
```
server-groups: {}
```
## 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.
For example:
```
global-playerlist:
server-groups:
test1:
- isolatedServer1
test2:
- isolatedServer2
```
## Seeing all players on the network from some server
If, despite configuring server groups,
you want players to see everyone on the network if they're connected to specific server(s),
you can list those servers at
```
global-playerlist:
spy-servers:
- spyserver1
- spyserver2
```
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.
+129
View File
@@ -0,0 +1,129 @@
# 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)
* [Additional info](#additional-info)
* [Additional note 1 - [1.8 - 1.20.1] Not resetting on server switch](#additional-note-1---18---1201-not-resetting-on-server-switch)
* [Tips & Tricks](#tips--tricks)
* [Tip 1 - Dynamic line count](#tip-1---dynamic-line-count)
* [API](#api)
# About
Minecraft feature **introduced in 1.8** showing text above and below playerlist. It cannot be displayed on 1.7 clients in any way.
![](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:
```
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>:
header:
- "Header in specified world"
footer:
- "Footer in specified world"
per-server:
<your server>:
header:
- "Header in specified server"
footer:
- "Footer in specified server"
```
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:
```
header-footer:
per-world:
world1;world2:
header:
- "Shared header in worlds world1 and world2"
lobby-*:
header:
- "Header in all worlds starting with lobby-"
```
> [!NOTE]
> To make per-world work on proxy installation,
> install the [TAB-Bridge](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) plugin on your backend servers.
## Per-group / per-player
**groups.yml**
```
MyGroup:
header:
- "This is a header for MyGroup group"
footer:
- "This is a footer for MyGroup group"
per-world:
MyWorld:
TestGroup:
header:
- "Header for group TestGroup in world MyWorld"
```
Same for users, which can be configured in **users.yml**.
# Additional info
## 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.
Velocity sends reset packet, so it isn't a problem there.
# Tips & Tricks
## Tip 1 - 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>
<summary>Example</summary>
**animations.yml**
```
MyAnimation:
change-interval: 1000
texts:
- "First frame with only 1 line"
- "Second frame\nconsisting of 2 lines"
```
**config.yml**
```
header-footer:
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.
+276
View File
@@ -0,0 +1,276 @@
# 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)
* [Compatibility](#compatibility)
* [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 - [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](https://github.com/NEZNAMY/TAB/wiki/Feature-guide%3A-Layout/_edit#additional-note-3---entry-overlap)
* [Examples](#examples)
* [Example 1 - Per-server columns](#example-1---per-server-columns)
# About
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:
```
layouts:
staff:
condition: "permission:tab.staff"
```
This layout will only be visible to players with `tab.staff` permission.
## 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`.
`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'
- '3|&8&m '
- '4|&3TPS&f:'
- '5|&b%tps%'
```
## Player groups
These are groups of players that meet the specified condition. They consist of 2 parts - condition and slots.
**1. 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).
If player doesn't meet any condition, they are not displayed at all.
Display condition is not required (can be used to make a "default" group with the remaining players).
**2. Slots**
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'
```
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.
Example:
```
layouts:
staff:
condition: "permission:tab.staff"
fixed-slots:
...
groups:
...
default:
fixed-slots:
...
groups:
...
```
In this example, players with `tab.staff` permission will see `staff` layout, others will see `default` layout.
# 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).*
In slots which display a connected player, 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.
## Format
Currently, TAB supports 3 skin formats:
* `mineskin:<UUID>` - 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 with the `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)
# 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)
# Compatibility
## 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.
## 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.
## 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),
the feature will only hide the real players,
which are outside tablist and not visible anyway and not touch the layout entries.
However, you can replicate the same effect using layout feature itself, using conditions.
<details>
<summary>Example</summary>
*We are going to ignore fixed slots in the examples,
as they don't affect anything, and you can just configure them however you want.*
Let's create 2 layouts, one for world `world1` and one for world `world2`.
Each layout only displays players in that world.
```
layouts:
layout1:
condition: "%world%=world1"
fixed-slots: []
groups:
players:
condition: "%world%=world1"
slots:
- 1-80
layout2:
condition: "%world%=world2"
fixed-slots: []
groups:
players:
condition: "%world%=world2"
slots:
- 1-80
```
You can also merge multiple worlds into a group.
```
layouts:
layout1:
condition: "%world%=world1|%world%=world2"
fixed-slots: []
groups:
players:
condition: "%world%=world1|%world%=world2"
slots:
- 1-80
```
You can also replicate "ignore-effect-in-worlds" by creating a layout with condition for displaying, but not for groups.
```
layouts:
globalWorld:
condition: "%world%=globalWorld"
fixed-slots: []
groups:
players: # No condition here to show all players
slots:
- 1-80
```
</details>
# 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.
**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
```
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:
fixed-slots:
- "1|&2&lLobby"
- "21|&2&lSurvival"
- "41|&2&lCreative"
- "61|&2&lSkyblock"
groups:
lobby:
condition: "%server%=lobby"
slots:
- 2-20
survival:
condition: "%server%=survival"
slots:
- 22-40
creative:
condition: "%server%=creative"
slots:
- 42-60
skyblock:
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.
![image](https://github.com/NEZNAMY/TAB/assets/6338394/81016b5a-9b40-445e-8bfc-58204f5457f5)
@@ -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 BungeeCord / Velocity 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.
+241
View File
@@ -0,0 +1,241 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Groups and users](#groups-and-users)
* [Per-world / per-server](#per-world--per-server)
* [Priority system](#priority-system)
* [Name color](#name-color)
* [Placeholder support](#placeholder-support)
* [Additional settings](#additional-settings)
* [Tips & Tricks](#tips--tricks)
* [Limitations](#limitations)
* [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)
# About
Nametags are controlled by a feature called scoreboard teams. They offer 6 properties:
* Team name - used for sorting players in tablist, see [Sorting guide](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist) for more info
* Prefix - prefix displayed in nametag, it will be referred to as `tagprefix`
* Suffix - suffix displayed in nametag, it will be referred to as `tagsuffix`
* 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).
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
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:
tagprefix: "&4&lAdmin &r"
```
This can also be achieved with commands, in this case `/tab group admin tagprefix "&4&lAdmin &r"`.
**users.yml**
```
_NEZNAMY_:
tagprefix: "&6&lTAB &r"
# An alternate way using UUID
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"`.
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:
**groups.yml**
```
admin:
tagprefix: "&4&lAdmin &r"
_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:
**groups.yml**
```
per-world:
world1:
_DEFAULT_:
tagprefix: "&a" # Everyone in world "world1" will have this prefix
per-server:
server1:
_DEFAULT_:
tagprefix: "&a" # Everyone in server "server1" will have this prefix
```
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_:
tagsuffix: "Shared tagsuffix in worlds world1 and world2"
lobby-*:
_DEFAULT_:
tagsuffix: "Suffix in all worlds starting with lobby-"
```
## Priority system
The full list of priorities looks like this:
1. value set using the [API](#api)
2. per-world / per-server applied to username
3. value applied to username
4. per-world / per-server applied to uuid
5. value applied to uuid
6. per-world / per-server applied to player's group
7. per-world / per-server applied to group `_DEFAULT_`
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.
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.
## 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.
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, while people are used to putting some color code at the end of prefix and expect the name to take it. 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`.
## 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.
## 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 [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 | 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. |
| 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. |
# 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%"
```
# Limitations
* [1.5 - 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+] The name can only have one code. That is either color or magic code (such as &4 or &l), but not both.
* The name cannot be effectively changed and the plugin doesn't offer it.
* 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.
# Additional info
## Additional note 1 - NPC (in)compatibility
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 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. The only way to achieve this goal is to send & modify packets to replace the player's actual profile name with a fake one. This is very complicated and can have a lot of side effects. This is out of scope of TAB and is in fact something nick plugins are trying to achieve. As such, **TAB does not offer this**.
Once you find a nick plugin that supports this, you will need to [make sure TAB properly detects this](https://github.com/NEZNAMY/TAB/wiki/How-to-display-name-from-nickname-plugins#proper-compatibility-with-plugins-that-change-profile-name) to make name-bound features (such as nametags) work properly for nicked players.
## Additional note 4 - F1 view
Using teams causes player nametags to remain visible when using F1 view.
The plugin cannot avoid this in any way.
The only possible solution would be to modify the client.
## Additional note 5 - Transparent players
Minecraft's teams can show players in the same team transparent (partially invisible).
This requires both players (viewer and target) to be in the same team.
As such, this effect is impossible to achieve with TAB,
because it puts every player into a different team
to properly sort players and give them different prefix/suffix in nametag
(and more, such as collision and nametag visibility).
If you want this effect, the only way is to use another plugin that offers this and disable TAB's teams entirely by setting
```
scoreboard-teams:
enabled: false
```
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. The easiest way 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.*
To access this feature, you'll need to obtain `NameTagManager` instance. Get it using `TabAPI.getInstance().getNameTagManager()`. If this feature is disabled, the method will return `null`.
## Changing prefix and suffix
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 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#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).
## Collision
* `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
* `NameTagManager#hideNametag(TabPlayer, TabPlayer)` - Hides player's nametag from a specific player, where the first `TabPlayer` is the player whose nametag you want to hide, and the second `TabPlayer` is the player who you want to hide the first player's nametag from.
* `NameTagManager#showNametag(TabPlayer)` - Shows player's nametag back again for everyone
* `NameTagManager#showNametag(TabPlayer, TabPlayer)` - Shows player's nametag back. The first `TabPlayer` is the player whose nametag you want to show, and the second `TabPlayer` is the player who you want to show the first player's nametag to.
* `NameTagManager#hasHiddenNametag(TabPlayer)` - Returns `true` if player has hidden nametag for everyone, `false` if not
* `NameTagManager#hasHiddenNametag(TabPlayer, TabPlayer)` - Returns `true` if player has hidden nametag for specific player, `false` if not. The first `TabPlayer` is the player whose nametag you want to check is hidden, and the second `TabPlayer` is the player who you want to check if they can see the first player's nametag.
## 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.
@@ -0,0 +1,35 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Grouping playerlist from multiple worlds](#grouping-playerlist-from-multiple-worlds)
# 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.
# 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) |
## 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
```
per-world-playerlist:
shared-playerlist-world-groups:
lobby:
- lobby1
- lobby2
minigames:
- paintball
- bedwars
```
Contains 2 groups, each of them consisting of 2 worlds.
World group name can be anything (in our case, they're called "lobby" and "minigames").
Under group name, list the actual world names.
With this setup, "lobby1" and "lobby2" will share playerlist, as well as "paintball" with "bedwars". All other worlds will have playerlist not shared with any other worlds. Creating a group for 1 world only is completely useless.
+26
View File
@@ -0,0 +1,26 @@
# About
By default, the server sends information about ping of players to everyone,
which you can see in the tablist as the green bar.
Some modified clients allow seeing the exact value instead of just bars.
This feature spoofs the ping value of all players to the configured value, hiding their true ping.
I don't know why anyone would want to do that.
# Configuration
Find this section in your **config.yml**
```
ping-spoof:
enabled: false
value: 0
```
To enable the feature, set `enabled: true`.
When the feature is enabled, everyone's ping value will be shown as value configured in `value` field.
The ping intervals for bars are client sided and are as following:
| Ping value | Displayed icon |
| ----------- | -------------- |
| Negative | ![image](https://user-images.githubusercontent.com/6338394/179717654-add90ec7-1321-41a3-99e6-76420e665833.png)|
| 0 - 149 | ![image](https://user-images.githubusercontent.com/6338394/179717531-3c6409b6-6bf8-41c1-a150-ce0ed615e5a5.png)|
| 150 - 299 | ![image](https://user-images.githubusercontent.com/6338394/179717804-cfedfe33-7846-4b60-8559-be2b902b4a75.png)|
| 300 - 599 | ![image](https://user-images.githubusercontent.com/6338394/179717915-0bccc83c-a2db-4459-9a76-58754f1307df.png)|
| 600 - 999 | ![image](https://user-images.githubusercontent.com/6338394/179717996-eec0942a-17c9-44ff-9428-3137f76f50a4.png)|
| 1000+ | ![image](https://user-images.githubusercontent.com/6338394/179718067-a3c86f83-cb57-436e-97ef-f3de394d9c41.png)|
@@ -0,0 +1,196 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Supported replacement patterns](#supported-replacement-patterns)
* [Pattern 1: Exact text](#pattern-1-exact-text)
* [Pattern 2: Number intervals](#pattern-2-number-intervals)
* [Pattern 3: else](#pattern-3-else)
* [Supported content in values](#supported-content-in-values)
* [Using in other plugins](#using-in-other-plugins)
* [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.
This is especially a problem with placeholders such as vanish or afk ones that return "yes"
or "no" instead of some fancy text.
It is a job of the plugins providing placeholders to allow control over outputs,
but for plugins that don't we have a solution - now you're able to configure output of any placeholder in many ways.
# Configuration
Open **config.yml** and find this section:
```
placeholder-output-replacements:
<placeholder>:
<original output>: <new output>
```
## Supported replacement patterns
### Pattern 1: Exact text
If the placeholder's output is exact to the text on the left side, it will return text on the right side.
<details>
<summary>Example</summary>
```
placeholder-output-replacements:
"%tps%":
"20": "Running at perfect 20 TPS!"
"%essentials_vanished%":
"yes": " &7[V]"
"no": ""
```
</details>
> [!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.
<details>
<summary>Example</summary>
```
placeholder-output-replacements:
"%tps%":
"15-20": "Solid"
"5-15": "Bad"
"0-5": "Terrible"
```
</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`.
Intervals can be defined using both `-` and `~`.
If you need support for negative values, use `~` for an interval instead of `-`.
<details>
<summary>Example</summary>
```
placeholder-output-replacements:
"%my_negative_placeholder%":
"-100~-1": "Negative"
"0": "Zero"
"1-100": "Positive"
```
</details>
### Pattern 3: else
If none of the configured outputs are used and "else" is set, that value will be used instead.
<details>
<summary>Example</summary>
```
placeholder-output-replacements:
"%tps%":
"20": "Running at perfect 20 TPS!"
"15-20": "Solid"
"5-15": "Bad"
"else": "Terrible" #0-5 in this case
```
</details>
## Supported content in values
You can use placeholders inside outputs, including the original placeholder you are altering.
It will return the original output of the placeholder.
<details>
<summary>Example</summary>
```
placeholder-output-replacements:
"%tps%":
"20": "Running at perfect 20 TPS!"
"15-20": "%tps% (Solid)"
"5-15": "%tps% (Bad)"
"else": "%tps% (Terrible)"
```
With this example, if TPS reaches, for example 17.5, the output would be `17.5 (Solid)`.
</details>
# Using in other plugins
These replacements are only supported inside TAB. They won't work in other plugins.
If you want to use these in other plugins, you'll need to [enable tab's PlaceholderAPI expansion](https://github.com/NEZNAMY/TAB/wiki/Placeholders#placeholderapi) and use `%tab_replace_<placeholder>%`. If you, for example, configure output for %player_health%, use `%tab_replace_player_health%`.
This only works for PlaceholderAPI placeholders, not TAB's internal ones. For TAB's internal ones use `%tab_placeholder_<placeholder>`, such as for %health% use `%tab_placeholder_health%`.
# Examples
## Example 1 - Adding brackets to placeholder output if it returns non-empty value
When displaying faction or clan of players, you may want to add brackets if a player is in a faction/clan,
but not show them if they are not in one.
To achieve this,
we are going to use [Pattern 1: Exact text](#pattern-1-exact-text) and [Pattern 3: else](#pattern-3-else).
If the placeholder returned nothing, show nothing.
Otherwise, show the output with added brackets:
```
placeholder-output-replacements:
"%my_placeholder%":
"": ""
"else": "[%my_placeholder%] "
```
Note that you'll need to match the placeholder output exactly. Not all clan/faction-like plugins return empty value when player doesn't have any. They may return just a color code, such as `&7`, in which case replacing empty value won't work. To see what the exact output of a placeholder is, use `/tab parse <player> <placeholder>` and check "Without colors" part. If that's the case, you'll need to change it on the left side. Example:
```
placeholder-output-replacements:
"%my_placeholder%":
"&7": ""
"else": "[%my_placeholder%] "
```
**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%
> [!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:
```
placeholder-output-replacements:
"%ping%":
"0-50": "&a%ping%"
"51-100": "&e%ping%"
"else": "&c%ping%"
```
Keep in mind that now the placeholder will no longer return just a number,
which can break features like [Playerlist Objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective),
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.
## 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>
@@ -0,0 +1,36 @@
# Content
* [About](#about)
* [Configuration](#configuration)
* [Limitations](#limitations)
* [Additional info](#additional-info)
* [Additional note 1 - Spectator gamemode](#additional-note-1---spectator-gamemode)
# About
The scoreboard objective with PLAYER_LIST display 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
![](https://images-ext-2.discordapp.net/external/RxWu_5hBSLUWqS7vCvSPY9PnNxkYfAMQQXwkbi6GEyU/https/image.prntscr.com/image/edpM4XpOT1q3SsQ5vYNjzQ.png)
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. 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. |
| title | "TAB" | Title to send. Only visible on Bedrock Edition. |
| render-type | INTEGER | Render type of the value. Supported values are `INTEGER` and `HEARTS` |
| 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. |
# Limitations
* [1.5 - 1.20.2] Only 2 display types are supported - yellow number and hearts.
* [1.5 - 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.
# 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.
+341
View File
@@ -0,0 +1,341 @@
# 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)
* [Limitations](#limitations)
* [Longer lines](#longer-lines)
* [Compatibility with other plugins](#compatibility-with-other-plugins)
* [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 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 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:
```
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......."
```
Will give you the following:
![image](https://github.com/NEZNAMY/TAB/assets/6338394/785e4e66-935c-4233-8a16-f3e34386cfd0)
The right side text will not be visible at 1.20.2 and lower, and numbers will be displayed instead.
### 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).
### 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:
```
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.
# Announce command
This takes priority over the current scoreboard.
Once the announcement is over, the previous scoreboard is restored.
`/tab scoreboard announce <name> <time>`
name - name of scoreboard to be displayed
time - number of seconds to display the scoreboard for
# 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. 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. |
# Limitations
* [1.5 - 1.12.2] The title is limited to 32 characters (including color codes).
* [1.5 - 1.12.2] Line length is limited to 28 characters (including color codes) (64 on lines with static text / [Longer lines](#longer-lines)).
* [1.5 - 1.20.2] The red numbers on the right really cannot be removed from the plugin side (a client modification / resource pack is necessary).
* 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 displayed).
* [Bedrock] Scoreboard lines may be cut off and show `...`, this can be bypassed by using [GeyserOptionalPack](https://github.com/GeyserMC/GeyserOptionalPack)
# 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.
A line has to be completely removed and a new one added.
There's a chance a frame is rendered between these 2 packets are sent,
causing the scoreboard to have 1 line missing for 1 frame, causing the visual issue known as "flickering".
However,
if your scoreboard only has placeholders that don't change value often
(pretty much any placeholder except animations, really),
you can make TAB use player name part,
allowing you to use an additional up to 40 characters.
To do so, add `Long|` prefix to all lines that should use this bypass.
```
lines:
- "Classic line with shorter limit"
- "Long|Long line with much higher character limit"
```
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.
# 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.
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.
<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>
# 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 `ScoreboardManager` instance. Get it using `TabAPI.getInstance().getScoreboardManager()`. If this feature is disabled, the method will return `null`.
## Creating custom scoreboards
You can create and register new scoreboards using `ScoreboardManager#createScoreboard(String, String, List<String>)`, where the first `String` is the name, the second `String` is the title that will be displayed, and the `List<String>` is the list of lines that the scoreboard will display.
## Showing custom scoreboards
To show your new scoreboard to a player, you can use `ScoreboardManager#showScoreboard(TabPlayer, Scoreboard)`, where the `TabPlayer` is the player you want to show the scoreboard to, and the `Scoreboard` is the scoreboard you want to show. Doing this will also disable automatic scoreboard updating for the player, so that your scoreboard does not get overridden until you unregister it.
To reset the scoreboard that a player is using to the default scoreboard that they should be seeing as determined by the config, use `ScoreboardManager#resetScoreboard(TabPlayer)`.
To determine whether a player has a custom scoreboard set (one that was shown through the API), use `ScoreboardManager#hasCustomScoreboard(TabPlayer)`.
## Toggling scoreboard visibility
To change whether a player can see scoreboards, use `ScoreboardManager#setScoreboardVisible(TabPlayer, boolean, boolean)`, and to determine whether a player can see scoreboards, use `ScoreboardManager#hasScoreboardVisible(TabPlayer)`.
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,
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.
# Examples
## 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.
If none of the conditions are met, display the default scoreboard.
```
scoreboards:
# start
scoreboard1:
display-condition: "%world%=world1"
title: 'Scoreboard 1'
lines:
- 'You are in world world1'
# first condition didn't pass, try next
scoreboard2:
display-condition: "%world%=world2"
title: 'Scoreboard 2'
lines:
- 'You are in world world2'
# first two conditions didn't pass, try next
scoreboard3:
display-condition: "%world%=world3"
title: 'Scoreboard 3'
lines:
- 'You are in world world3'
# none of the conditions above passed, display default scoreboard
default:
title: '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 proxy, use %server% with server names.
> If you want worldguard regions, use %worldguard_region_name% with region names.
> This works for any placeholder offered by the plugin or by PlaceholderAPI.
## Example 2 - 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:
**animations.yml**
```
switchingScoreboard:
change-interval: 10000
texts:
- "1"
- "2"
```
This animation will switch frames every 10 seconds.
Then, we will use the output of this animation as a display condition.
If animation is on the first frame, display the first scoreboard.
Otherwise, display the second scoreboard.
Result:
**config.yml**
```
scoreboards:
scoreboard1:
display-condition: "%animation:switchingScoreboard%=1" # If animation is on the first frame
title: "Scoreboard 1"
lines:
- 'Text'
# Animation is on the second frame
scoreboard2:
title: "Scoreboard 2"
lines:
- 'Text'
```
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
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.
* `%bedrock%` - Returns `true` if player is using the bedrock edition, which does not support new functions either.
We only want the first scoreboard for players with version 765 or greater and not bedrock players. This can be achieved with the following condition: `display-condition: "%player-version-id%>=765;%bedrock%=false"`.
Let's go ahead and set it up (with proper spacing):
```
scoreboards:
scoreboard-1.20.3+:
title: "Scoreboard for 1.20.3+ and not bedrock"
display-condition: "%player-version-id%>=765;%bedrock%=false" # Only display it to players using 1.20.3+ AND NOT bedrock edition
lines:
- "* &eOnline&7:||%online%"
- "* &eCurrent World&7:||%worldonline%"
- "* &eStaff&7:||%staffonline%"
- "* &bRank&7:||%group%"
- "* &bPing&7:||%ping%&8ms"
- "* &bWorld&7:||%world%"
scoreboard:
title: "Scoreboard for <1.20.3 and bedrock"
lines:
- "* &eOnline&7: &f%online%"
- "* &eCurrent World&7: &f%worldonline%"
- "* &eStaff&7: &f%staffonline%"
- "* &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%='
yes: "" # No faction, return empty string to hide the line
no: "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.
+253
View File
@@ -0,0 +1,253 @@
# Content
* [Enabling](#enabling)
* [Methods of sorting](#methods-of-sorting)
* [GROUPS](#groups)
* [PERMISSIONS](#permissions)
* [PLACEHOLDER](#placeholder)
* [PLACEHOLDER_A_TO_Z](#placeholder_a_to_z)
* [PLACEHOLDER_Z_TO_A](#placeholder_z_to_a)
* [PLACEHOLDER_LOW_TO_HIGH](#placeholder_low_to_high)
* [PLACEHOLDER_HIGH_TO_LOW](#placeholder_high_to_low)
* [Multiple elements with the same priority](#multiple-elements-with-the-same-priority)
* [Combining multiple sorting types](#combining-multiple-sorting-types)
* [Additional settings](#additional-settings)
* [Additional info](#additional-info)
* [Additional note 1 - Limitations](#additional-note-1---limitations)
* [Additional note 2 - per-world sorting](#additional-note-2---per-world-sorting)
* [Additional note 3 - Compatibility issues with other plugins](#additional-note-3---compatibility-issues-with-other-plugins)
* [Common mistakes](#common-mistakes)
* [API](#api)
# 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.
> [!TIP]
> 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.
## 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).
> [!TIP]
> 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.
Second, place all of your groups in to a comma separated list **in order of priority** into `sorting-types`. Example:
```yaml
scoreboard-teams:
sorting-types:
- "GROUPS:owner,admin,mod,default"
```
> [!TIP]
> 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
> [!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**.
For example, if you have the permissions `my.permission.1`, `my.permission.2`, `my.permission.3`, and want to have players sorted in that order, you would end up with a configuration like `PERMISSIONS:my.permission.1,my.permission.2,my.permission.3`.
Example:
```yaml
scoreboard-teams:
sorting-types:
- "PERMISSIONS:my.permission.1,my.permission.2,my.permission.3"
```
> [!TIP]
> Verify sorting permissions of a player using `/tab debug <player>`
## PLACEHOLDER
This method sorts players using the output of a placeholder and comparing that to pre-defined values.
To configure this sorting type, write the placeholder that you want to use, followed by a colon (`:`), followed by a comma separated list of outputs to check against.
For example, if you want to sort players using the output of the `%essentials_afk%` placeholder, depending on whether it is `yes` or `no`, you would do that using a configuration such as `PLACEHOLDER:%essentials_afk%:no,yes`, where players who the placeholder outputs `no` for will be sorted above players who the placeholder outputs `yes` for in this case, putting AFK players on the bottom.
Example:
```yaml
scoreboard-teams:
sorting-types:
- "PLACEHOLDER:%essentials_afk%:no,yes"
```
## PLACEHOLDER_A_TO_Z
This method sorts players alphabetically, according to the output of a placeholder.
To configure this sorting type, write the placeholder that you want to use. That's it.
For example, if you want to sort players by their name alphabetically, you would do that using a configuration such as `PLACEHOLDER_A_TO_Z:%player%`.
Example:
```yaml
scoreboard-teams:
sorting-types:
- "PLACEHOLDER_A_TO_Z:%player%"
```
## PLACEHOLDER_Z_TO_A
This method sorts players reverse alphabetically, according to the output of a placeholder.
This is identical to the above A to Z sorting, except that the alphabet is backwards, so Z comes first, and A comes last.
To configure this sorting type, write the placeholder that you want to use. That's it.
For example, if you want to sort players by their name reverse alphabetically, you would do that using a configuration such as `PLACEHOLDER_Z_TO_A:%player%`.
Example:
```yaml
scoreboard-teams:
sorting-types:
- "PLACEHOLDER_Z_TO_A:%player%"
```
## PLACEHOLDER_LOW_TO_HIGH
This method sorts players numerically depending on the output of a **numeric** placeholder from the lowest value to the highest value.
**Only placeholders that output number values will work with this sorting type!**
Supported number interval is from -1,000,000,000 to 1,000,000,000 and 5 decimal places.
To configure this sorting type, write the placeholder that you want to use. That's it.
For example, if you want to sort players using the output of the `%health%` placeholder from the lowest health to highest, you would do that using a configuration such as `PLACEHOLDER_LOW_TO_HIGH:%health%`.
Example:
```yaml
scoreboard-teams:
sorting-types:
- "PLACEHOLDER_LOW_TO_HIGH:%health%"
```
## PLACEHOLDER_HIGH_TO_LOW
This method sorts players numerically depending on the output of a **numeric** placeholder from the highest value to the lowest value.
**Only placeholders that output number values will work with this sorting type!**
Supported number interval is from -1,000,000,000 to 1,000,000,000 and 5 decimal places.
To configure this sorting type, write the placeholder that you want to use. That's it.
For example, if you want to sort players using LuckPerms weights, you would do that using a configuration such as `PLACEHOLDER_HIGH_TO_LOW:%luckperms_highest_group_weight%`.
Example:
```yaml
scoreboard-teams:
sorting-types:
- "PLACEHOLDER_HIGH_TO_LOW:%luckperms_highest_group_weight%"
```
# Multiple elements with the same priority
If using a sorting type that uses pre-defined values ([GROUPS](#groups), [PERMISSIONS](#permissions) or [PLACEHOLDER](#placeholder)), you can sort multiple elements with the same priority by separating them with `|` symbol. Example using group sorting:
```
scoreboard-teams:
sorting-types:
- "GROUPS:owner,admin,vip1|vip2,default"
```
Where `vip1` and `vip2` will be sorted with the same priority (3rd).
This works for permissions and pre-defined placeholder values as well.
# Combining multiple sorting types
Since `sorting-types` is a list, you are able to use more than one sorting type. Sorting type priorities go in the same order as defined in the config. Let's take a look at the default config:
```
sorting-types:
- "GROUPS:owner,admin,mod,helper,builder,vip,default"
- "PLACEHOLDER_A_TO_Z:%player%"
```
Here, players are sorted by their group first.
Owner goes above admin etc. However,
if 2 people have the same group (such as admin), the next sorting type decides the final order.
In this case, admin with alphabetically lower username will be higher in the tablist.
A common request is putting AFK players on the bottom of tablist. This can be achieved with the following configuration:
```
sorting-types:
- "PLACEHOLDER:%essentials_afk%:no,yes"
- "GROUPS:owner,admin,mod,helper,builder,vip,default"
- "PLACEHOLDER_A_TO_Z:%player%"
```
With AFK status taking the highest priority, AFK players will always be sorted below players which are not AFK.
Both player groups (afk and non-afk) then follow the rest of the logic explained above to define the final order.
If trying to copy-paste this example, keep
in mind [Placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements) work here as well,
so if you are using a fancier output for %essentials_afk%,
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. |
# Additional info
## Additional note 1 - Limitations
All sorting elements must together build a team name up to 16 characters long. Because of that, cuts in placeholder outputs may be required. TAB is already using the shortest possible values for all sorting types:
* `GROUPS`, `PERMISSIONS` and `PLACEHOLDER` - 1 character
* `PLACEHOLDER_LOW_TO_HIGH` and `PLACEHOLDER_HIGH_TO_LOW` - 3 characters
* `PLACEHOLDER_A_TO_Z` and `PLACEHOLDER_Z_TO_A` - as many as used
All your sorting types must be within a 15-character limit.
Any characters above that will be cut off (TAB reserves 1 character to ensure each player is in a unique team).
To get the most out of it, use the 1-character sorting types where possible.
You can bypass this limit by using [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) feature.
Player ordering is fully plugin-sided and therefore is not artificially limited.
## Additional note 2 - per-world sorting
Defining a per-world sorting type is not supported.
However,
this can be achieved with [Conditional placeholders](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders).
Check for %world% and return one placeholder if it matches, another one if not.
This will work with anything, not just worlds (server, regions, etc.).
## Additional note 3 - Compatibility issues with other plugins
As you already know by now, sorting is managed by scoreboard teams (their names to be exact).
Player can only be a member of one team.
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.
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.
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`.
* `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.
This detection, however, is not 100%.
Because of that, you may still be experiencing a compatibility issue even with anti-override enabled.
To identify such an issue, check if /tab reload fixes your sorting issue.
If it does, it's a compatibility issue of some sort.
If not, it is most likely a misconfiguration issue.
# Common mistakes
Every possible mistake could be called "not reading this wiki page", but that would make this section pointless.
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.
* 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 (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.
# 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 `SortingManager` instance. Get it using `TabAPI.getInstance().getSortingManager()`. If sorting is disabled, the method will return `null`.
You can change player's team name using the following methods:
* `SortingManager#forceTeamName(TabPlayer, String)` - Sets player's team name to specified value (and performs team unregister & register with new name).
* `SortingManager#getForcedTeamName(TabPlayer)` - Returns player's forced team name using the method above. Will return `null` if no value is set.
Unfortunately, there is no simple way of just changing one's position while still accounting for other players.
This is because the plugin supports a lot of sorting options, not just groups,
so doing amateur stuff like "priority 1, 2" doesn't make sense.
If you are really only interested in sorting by groups and changing group which player is sorted as,
you can use `TabPlayer#setTemporaryGroup(String)`.
To reset the group back to normal, call the function with `null` argument.
@@ -0,0 +1,31 @@
# Content
* [About](#about)
* [Enabling](#enabling)
* [Permissions](#permissions)
* [Additional info](#additional-info)
* [Additional note 1 - Seeing yourself still as spectator](#additional-note-1---seeing-yourself-still-as-spectator)
# 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.
# Enabling
To enable this feature, open **config.yml** and set
```
prevent-spectator-effect:
enabled: true
```
# 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. |
# Additional info
## Additional note 1 - Seeing yourself still as spectator
Receiving information about going spectator gamemode allows players to clip through walls.
Cancelling this on self would result in inability to go through walls.
To avoid this, the information will be canceled for every player except the one going spectator gamemode.
Therefore, if you change gamemode to spectator, you will still see yourself on the bottom,
but no one else will (unless someone has the bypass permission).
@@ -0,0 +1,165 @@
# 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)
* [API](#api)
# About
This feature allows you to configure player name formats in the tablist.
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,
take advantage of [this client-sided mechanic](https://github.com/NEZNAMY/TAB/wiki/Client%E2%80%90sided-mechanics#nametag-format-in-tablist) and configure tagprefix/tagsuffix,
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
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
`tabsuffix` - last part of the text, this is where suffix is usually configured
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.
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:
**groups.yml**
```
admin:
tabprefix: "&4&lAdmin &r"
```
This can also be achieved with commands, in this case `/tab group admin tabprefix "&4&lAdmin &r"`.
**users.yml**
```
_NEZNAMY_:
tabprefix: "&6&lTAB &r"
# An alternate way using UUID
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"`.
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:
**groups.yml**
```
admin:
tabprefix: "&4&lAdmin &r"
_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:
**groups.yml**
```
per-world:
world1:
_DEFAULT_:
tabprefix: "&a" # Everyone in world "world1" will have this prefix
per-server:
server1:
_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.
Example:
```
per-world:
world1;world2:
_DEFAULT_:
tabsuffix: "Shared tabsuffix 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:
1. value set using the [API](#api)
2. per-world / per-server applied to username
3. value applied to username
4. per-world / per-server applied to uuid
5. value applied to uuid
6. per-world / per-server applied to player's group
7. per-world / per-server applied to group `_DEFAULT_`
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).
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.
## 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.
## Additional settings
| 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. |
# 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%"
```
# 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 `TabListFormatManager` instance. Get it using `TabAPI.getInstance().getTabListFormatManager()`. If this feature is disabled, the method will return `null`.
To set the values for the respective formatting, use the following:
* `TabListFormatManager#setPrefix(TabPlayer, String)`
* `TabListFormatManager#setName(TabPlayer, String)`
* `TabListFormatManager#setSuffix(TabPlayer, String)`
To reset the values, set them to `null`.
To get custom values previously set using the API (they will return `null` if no custom value is set):
* `TabListFormatManager#getCustomPrefix(TabPlayer)`
* `TabListFormatManager#getCustomName(TabPlayer)`
* `TabListFormatManager#getCustomSuffix(TabPlayer)`
To get the original value set by the plugin based on configuration:
* `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).
+8
View File
@@ -0,0 +1,8 @@
# About
A collection of things people have requested that I might look into implementing when I get extremely bored sometime next decade.
* Less than 4 columns in Layout
* Relational placeholder support in sorting
* Relational conditions for layout player groups
* 1.21.2+ sorting support
* disable-condition support in multi-server-support
* Custom relational placeholders
+137
View File
@@ -0,0 +1,137 @@
# Content
* [#1 - Why are NPCs showing up in the tablist?](#1---why-are-npcs-showing-up-in-the-tablist)
* [#2 - How to make TAB work with LuckPerms?](#2---how-to-make-tab-work-with-luckperms)
* [#3 - I enabled MySQL, and my prefix is now gone!](#3---i-enabled-mysql-and-my-prefix-is-now-gone)
* [#4 - Why is player sorting not working?](#4---why-is-player-sorting-not-working)
* [#5 - How to add players to %staffonline% placeholder?](#5---how-to-add-players-to-the-staffonline-placeholder)
* [#6 - How to make player heads visible in tablist?](#6---how-to-make-player-heads-visible-in-tablist)
* [#7 - Where can i find current default config files?](#7---where-can-i-find-current-default-config-files)
* [#8 - How can I split players into multiple columns?](#8---how-can-i-split-players-into-multiple-columns)
* [#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)
* [#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)
## #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).
## #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. 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%`.
## #3 - I enabled MySQL, and my prefix is now gone!
When enabling [MySQL](https://github.com/NEZNAMY/TAB/wiki/MySQL), it will be used as a data storage and groups.yml / users.yml files will no longer be used.
If you want to upload your configuration to MySQL (or download it back to files), use [MySQL conversion commands](https://github.com/NEZNAMY/TAB/wiki/MySQL#data-conversion) - [`/tab mysql upload`](https://github.com/NEZNAMY/TAB/wiki/MySQL#uploading-from-files-to-mysql) and [`/tab mysql download`](https://github.com/NEZNAMY/TAB/wiki/MySQL#downloading-from-mysql-to-files), respectively.
After you are done, run `/tab reload` for the changes to take effect.
## #4 - Why is player sorting not working?
See [Common mistakes section on sorting page](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist#common-mistakes).
## #5 - How to add players to the %staffonline% placeholder?
Give them the `tab.staff` permission.
## #6 - How to make player heads visible in tablist?
Players who did not buy the game will never be able to see heads.
The client displays Player heads when connection to the server is an online connection authenticated through Mojang.
It cannot be directly controlled by plugins.
The intended way to reach this is by setting `online-mode=true` in `server.properties`.
If you want to allow pirates on your server,
you can still display heads for players who bought the game by changing their connections to online connections.
Most commonly used plugins for this are [FastLogin](https://www.spigotmc.org/resources/14153/) and [JPremium](https://www.spigotmc.org/resources/27766/),
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.
## #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).
* Delete or rename a file, and the plugin will regenerate it.
* Open the plugin jar as a zip file and take files from there.
## #8 - How can I split players into multiple columns?
The client puts players into columns, it is not managed by the server.
The only way is to get more players.
They automatically split into more columns at 21, 41 and 61 players (due to limit of 20 entries per column).
If you don't mind getting all 80 slots filled with fake player slots,
check out the [Layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) feature.
## #9 - How to use spaces in prefix/suffix command?
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.
## #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://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.
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.
**Option 2**: Find hex code of your symbol (4 hexadecimal numbers) and use `\uxxxx` format,
where `xxxx` is hex code of the symbol.
Make sure to also wrap the text into `""` for the text to properly take `\` as an escape symbol.
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?
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).
When using the symbol in configuration using \u format, remember to use `""` in config instead of `''`.
## #16 - Is MiniMessage supported?
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.
However,
you can achieve this using PlaceholderAPI's `PlayerList` expansion
and following [this example](https://github.com/Tanguygab/PlayerList-PlaceholderAPI-Expansion/wiki#list-of-players-in-group).
## #18 - Why is the plugin flagged as a virus by Windows defender?
First, this is a false positive.
[Here](https://www.spigotmc.org/threads/windows-defender-false-positives.639507/)'s a spigot thread confirming it.
After experimenting with VirusTotal,
it turns out the antivirus software available on the website used flags [bStats](https://github.com/Bastian/bStats) library as malicious.
Its purpose is to collect anonymous data about servers and submitting it to [bStats.org](https://bstats.org/),
where plugin authors can see how many servers use their plugins (if they don't disable it).
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.
+37
View File
@@ -0,0 +1,37 @@
# About the wiki
The wiki explains the functionality of the plugin as of version **5.2.5**.
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.
If you plan to run your server for longer than 1 week,
it's a good idea to read this wiki as it explains everything about the plugin.
This will give you knowledge to do things you had no idea were possible, giving you an advantage over everyone else.
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).
# Limitations of plugins
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
to carefully read the limitations of each feature to know what they are capable of and what they are not capable of.
Some of the undesired behavior can be altered using a resource pack and some using a modified client.
Both of these are out of scope of TAB as a plugin; therefore, no advanced information regarding this is provided.
# Public plugin
TAB is a public plugin designed to satisfy the needs of a majority of servers.
This means it has functions not everyone will need. All you need to do is disable functions you don't want. Disabled features do not consume the CPU at all.
On the other hand, it cannot contain everything everyone can think of.
There must be a balance
between providing as much as possible while making the configuration as short and readable as possible.
This is not an easy task.
The majority of things that are not supported directly can be achieved in different ways.
Adding direct way for everything everyone asks for would not only take a lot of time,
but make the plugin harder to configure for everyone, as well as introduce a lot of duplicate ways to achieve things,
making the plugin overcomplicated.
If your need is very specific and not available in the plugin in any way,
you should look into private plugin development.
You will end up with a plugin made just for you with everything you want and nothing else.
@@ -0,0 +1,58 @@
# Content
* [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 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.
First option hooks into your permission plugin and takes groups from it. Therefore, your permission plugin must be supported.
**Supported permission plugins**: **LuckPerms** everywhere, on Bukkit any plugin supporting **Vault**.
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.
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\>).
> [!TIP]
> Verify player's group using `/tab debug <player>`. It should say `Primary permission group: <your group>`.
## Option 2: Permission nodes
Instead of taking whole groups, TAB will check for permission nodes and assign groups based on the highest permission.
1. Go to config.yml and set `assign-groups-by-permissions: true`.
2. Give `tab.group.<group name>` permission to the user/permission group.
3. Put all possible groups into `primary-group-finding-list`.
This is necessary because:
#1 - there's no way to get the list of permissions, only checking for a permission.
The list will be used for a list of permissions to check for.
#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).
> [!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 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`).
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:
```
use-bukkit-permissions-manager: true
```
When enabling it, all group **and** permission requests will be done through [Bridge plugin](https://github.com/NEZNAMY/TAB/wiki/TAB-Bridge) to take data from backend servers. Your groups will now match data from backend server a player is connected to (in case of LuckPerms `/lp user <player> info`).
When assigning by permissions instead of taking the primary group directly from permission plugin,
the permission nodes (`tab.group.<name>`) will be taken from backend servers instead.
@@ -0,0 +1,105 @@
# 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)
# Tablist
This one is straightforward.
The tablist format of players is one text split into 3 parts in the plugin for convenience
(tabprefix, customtabname, tabsuffix).
Using `customtabname` you can configure name part into any placeholder you want,
including one from your nickname plugin.
All you need is a working PlaceholderAPI placeholder from your nickname plugin.
Example:
**groups.yml**
```
_DEFAULT_:
customtabname: '%essentials_nickname%'
```
or using in-game command `/tab group _DEFAULT_ customtabname %essentials_nickname%`.
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.
> [!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.
# 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,
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 modded platforms.
**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 (either you use TAB on Sponge / Velocity, or 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.
Make sure your nickname plugin is not changing UUID of players.
If UUID changes, the plugin won't be able to properly format names even in the tablist,
since entries there are bound to UUIDs and by changing it, it will break.
Identifying whether name change detection is working properly or not can be checked
by setting `debug: true` in config and checking console on name change.
It should say `Processing name change of player <player name> to <new nickname>`.
If it doesn't, something went wrong, most likely UUID not matching.
# Tips & Tricks
## Tip 1 - Nickname prefix
By default, Essentials prefixes nicknames of players in chat using `~` symbol for nicked players. We can very easily replicate that with [Conditional placeholders](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders). First, create a new condition:
```
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
```
Then, use `%condition:nick%` in your `customtabname` instead of the placeholder directly.
# Tip 2 - Sorting nicked players with the lowest priority
Let's say your sorting list looks like this:
```
sorting-types:
- "GROUPS:owner,admin,mod,helper,builder,vip,default"
- "PLACEHOLDER_A_TO_Z:%player%"
```
Let's also assume that you want every nicked player to be sorted as `default`. This can be achieved using [sorting by placeholder](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Sorting-players-in-tablist#placeholder) and creating a [condition](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) that will return output based on nick status. First, let's create the condition:
```
conditions:
group:
conditions:
- '%haonick_isNicked%=true'
yes: "default"
no: "%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).
In this case, we are using placeholder `%haonick_isNicked%`, which returns `true` for nicked players.
If using Essentials, the line would look like this: `%essentials_nickname%!=%player%`, because Essentials is made to return player's actual name when not nicked, meaning when it's not equal, player is nicked.
Finally, use the conditional placeholder in sorting:
```
sorting-types:
- PLACEHOLDER:%condition:group%:owner,admin,mod,helper,builder,vip,default"
- PLACEHOLDER_A_TO_Z:%player%
```
This will result in nicked players being sorted as `default`.
If you want to achieve something more complicated, such as not only sorted as default, but another rank, you will need to dig deeper into your problem, analyzing available placeholders and functions that will help you achieve your result.
@@ -0,0 +1,31 @@
This guide will explain how to solve the incompatibility with glow plugins.
# Content
* [Reason for compatibility issue](#reason-for-compatibility-issue)
* [Solution](#Solution)
* [Examples of glow plugins](#examples-of-glow-plugins)
## Reason for compatibility issue
Glow color is managed by scoreboard teams, which also handle nametag formatting and player sorting in tablist. Only one plugin can handle teams at a time. Because of that, TAB will prevent glow plugins from assigning players into teams.
## 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.
> [!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.
**groups.yml**
```
_DEFAULT_:
tagprefix: '%vault-prefix%%eglow_glowcolor%'
```
## Examples of glow plugins
- [eGlow](https://www.spigotmc.org/resources/63295/) (%eglow_glowcolor%) (Paid)
- [CMI](https://www.spigotmc.org/resources/3742/) (%cmi_user_glow_code%) (Paid)
- ... more?
@@ -0,0 +1,34 @@
# Programs
* [Notepad](#notepad)
* [Notepad++](#notepad-1)
* [Sublime Text 3](#sublime-text-3)
* [WinSCP](#winscp)
* [VSCode](#vscode)
***
# Notepad
Open the file > Click file > Save as... > Set encoding to UTF-8 > Click save
![](https://i.ibb.co/zQHbL3p/notepad.png)
***
# Notepad++
Open the file > Click encoding > Click UTF-8 (if that didn't work, use Convert to UTF-8)
![](https://i.ibb.co/qNdj80Q/notepad.png)
***
# Sublime Text 3
![](https://cdn.discordapp.com/attachments/659545536533364776/847537718236938260/unknown.png)
***
# 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)
# 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,185 @@
# 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)
* [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+)
> [!NOTE]
> This is a draft for future versions - MC 1.21.9+ and TAB 5.3.0+.
A new component of "object" type was added into the game in 1.21.9. It currently has 2 implementations described below.
> [!WARNING]
> In order to use these, you will need to disable MiniMessage support, because object components were not added to MiniMessage yet. Even when they are added, TAB will require and update to read them from adventure. To disable MiniMessage support, set:
> ```
> components:
> minimessage-support: false
> ```
> in **config.yml**.
> [!WARNING]
> The syntax for object components is just temporary and will change in the future to match MiniMessage (once they add it) to avoid confusing users / adding conversion from TAB syntax to MiniMessage syntax even for these.
> Expect the syntax to break in a future TAB update. For now, use the existing syntax for prototyping and testing.
## 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:
- 'Diamond helmet: <sprite:"minecraft:blocks":"minecraft:item/diamond_helmet">'
- 'Diamond chestplate: <sprite:"minecraft:blocks":"minecraft:item/diamond_chestplate">'
- 'Diamond leggings: <sprite:"minecraft:blocks":"minecraft:item/diamond_leggings">'
- 'Diamond boots: <sprite:"minecraft:blocks":"minecraft:item/diamond_boots">'
```
<img width="386" height="101" alt="image" src="https://github.com/user-attachments/assets/e9a66305-2ae4-44f4-9d8e-a227fb7591e4" />
## Player sprite
This type allows you to display minecraft heads. There are 3 ways to define a head along with their TAB syntaxes:
* `name`: `<head:name:NAME>` where `NAME` is player name
* `uuid`: `<head:id:UUID>` where `UUID` is UUID of a player
* `skin`: `<head:signed_texture:VALUE;SIGNATURE>` where `VALUE` and `SIGNATURE` are value and signature of that skin
Here is an example configuration
```
footer:
- "Head by your UUID: <head:id:%uuid%>"
- "Head by your name: <head:name:%player%>"
- "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=>"
```
With dynamic UUID and name, but hardcoded texture.
<img width="261" height="61" alt="image" src="https://github.com/user-attachments/assets/88e61963-9408-42fe-8075-95479c7fadda" />
Additionally, you can use
* `<head:mineskin:ID>` to display skin from mineskin
* `<head:texture:VALUE>` to display skin from defined texture
TAB will retrieve skin value + signature and use those values.
# 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
> [!NOTE]
> This is a draft for future versions - TAB 5.3.0+.
| 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'
yes: "#00FF00 RGB text"
no: "&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.
+65
View File
@@ -0,0 +1,65 @@
# Content
* [Backend](#backend)
* [BungeeCord / Velocity](#bungeecord--velocity)
* [Proxy installation](#proxy-installation)
* [Backend installation](#backend-installation)
* [Mixed installation](#mixed-installation)
* [Updating the plugin](#updating-the-plugin)
# Backend
Installation on Bukkit / Fabric / Sponge 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 such ways to (re)load it.
# BungeeCord / Velocity
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.
## 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.
**Recommended**:
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**.
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) 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
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 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.
# Updating the plugin
Updating the plugin is always as simple as replacing old jar with the new one.
You do not need to reset your configuration files or make any manual changes to them.
If any changes to configuration are made (changed / removed / added),
TAB will automatically convert your existing configuration files to the latest format
(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.
+15
View File
@@ -0,0 +1,15 @@
# 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.
# 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`).
# 1.15.x - Strikethrough and underline
Using &m (strikethrough) and &n (underline) does not work in header,
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)).
+206
View File
@@ -0,0 +1,206 @@
# Content
Combine the knowledge gathered by reading the wiki to get interesting results, most frequently asked ones listed here.
* [Displaying kill / death counter in tablist](#displaying-kill--death-counter-in-tablist)
* [Taking prefixes/suffixes from permission plugin](#taking-prefixessuffixes-from-permission-plugin)
* [Showing player's version in tablist](#showing-players-version-in-tablist)
* [Replicating Purpur's TPSBar](#replicating-purpurs-tpsbar)
* [BedWars1058 compatibility](#bedwars1058-compatibility)
* [Displaying AFK status in tablist](#displaying-afk-status-in-tablist)
* [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)
# Displaying kill / death counter in tablist
This example uses PlaceholderAPI placeholders.
Kills:
```
playerlist-objective:
enabled: true
value: "%statistic_player_kills%"
```
Deaths:
```
playerlist-objective:
enabled: true
value: "%statistic_deaths%"
```
**Note:** These values are taken from server stats. You can modify / reset them for each player in `<main world>/stats/<player uuid>.json` file.
# Taking prefixes/suffixes from permission plugin
Delete all groups from **groups.yml** and only keep this:
```
_DEFAULT_:
tabprefix: "%vault_prefix%"
tagprefix: "%vault_prefix%"
tabsuffix: "%vault_suffix%"
tagsuffix: "%vault_suffix%"
```
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).
# 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:
![image](https://github.com/NEZNAMY/TAB/assets/6338394/2327b482-e8da-4940-9aa8-ea2bdda64b6f)
# Replicating Purpur's TPSBar
*This guide was made purely for demonstration of TAB's functionality to show you can even do things like this with conditions. It is not meant to be used as a replacement for Purpur or any of its functions or discouraging users from using Purpur.*
By default, Purpur's TPSBar shows server's TPS, MSPT and player ping.
These change colors from green to red based on value.
The easier way
to achieve this is with [Placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements-(premium-only)),
however, it alters placeholders everywhere inside TAB,
which would result in features like [Playerlist objective](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Playerlist-Objective)
to stop working correctly when %ping% is used,
since it would contain color codes now.
For that reason,
we will use [Conditions](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Conditional-placeholders) instead.
When TPS is above 19, it displays as `<#55FF55>value</#00AA00>`. When above 15, `<#FFFF55>value</#FFAA00>`, otherwise `<#FF5555>value</#AA0000>`. This can be achieved with 2 conditions:
```
conditions:
tps:
conditions:
- "%tps%>=19"
yes: "<#55FF55>%tps%</#00AA00>"
no: "%condition:tps2%"
tps2:
conditions:
- "%tps%>=15"
yes: "<#FFFF55>%tps%</#FFAA00>"
no: "<#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+.
Conditions for mspt and ping may look something like this:
```
conditions:
mspt:
conditions:
- "%mspt%<40"
yes: "<#55FF55>%mspt%</#00AA00>"
no: "%condition:mspt2%"
mspt2:
conditions:
- "%mspt%<50"
yes: "<#FFFF55>%mspt%</#FFAA00>"
no: "<#FF5555>%mspt%</#AA0000>"
ping:
conditions:
- "%ping%<100"
yes: "<#55FF55>%ping%</#00AA00>"
no: "%condition:ping2%"
ping2:
conditions:
- "%ping%<200"
yes: "<#FFFF55>%ping%</#FFAA00>"
no: "<#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:
```
bars:
tpsbar:
style: NOTCHED_20
color: GREEN
progress: "%math_0_{tab_placeholder_mspt}*2%"
text: "&7TPS&e: %condition:tps% &7MSPT&e: %condition:mspt% &7Ping&e: %condition:ping%&7ms"
```
The last step is to configure when should this bossbar be displayed. One way is to use bossbar announce/send command. Another is to use display conditions. An example can look like `display-condition: "permission:tab.tpsbar`. Now, only players with the permission will see the bossbar.
# BedWars1058 compatibility
## Sorting
To sort teams through TAB, add the PLACEHOLDER_A_TO_Z sorting type with the %bw1058_player_team% placeholder. Example:
```yml
sorting-types:
- "PLACEHOLDER_A_TO_Z:%bw1058_player_team%"
- "GROUPS:admin,mod,default"
- "PLACEHOLDER_A_TO_Z:%player%"
```
## Team name in tablist/nametag
To display the team name in the tablist, use this command: `/tab group _DEFAULT_ tabprefix %bw1058_player_team%`
The same goes for the nametag, but with tagprefix instead: `/tab group _DEFAULT_ tagprefix %bw1058_player_team%`
To display only the first letter of the team, download this PlaceholderAPI expansion: https://api.extendedclip.com/expansions/bw1058plus/
and use `%bw1058plus_team_letter%` instead, if you want the color as well, put `%bw1058plus_team_color%` right before.
## Rank in lobby & Team name in game
If you want to display the rank of the player while he's in the lobby or waiting lobby,
BUT show the team name while in the game, then don't worry, there's a way.
You can create a condition which checks if the player's current team = nothing (which means the player isn't playing),
and return either the rank or the team name depending on that condition.
Example:
```yml
conditions:
rankOrTeam:
conditions:
- "%bw1058_player_team%="
yes: "%luckperms-prefix%"
no: "%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.
# Displaying AFK status in tablist
First, you'll need to get an AFK plugin. TAB does not track player AFK status. Then, find a PlaceholderAPI placeholder for your AFK plugin in their documentation, such as
* `%essentials_afk%` for Essentials
* `%cmi_user_afk_symbol%` for CMI
* `%purpur_player_afk%` for Purpur (server software)
Remember to install PlaceholderAPI and the respective expansion of your afk plugin.
Then, use the placeholder in configuration wherever you want it.
Assuming you want it for all players,
use `_DEFAULT_` group keyword in **groups.yml** for default settings for all groups.
Combined with other settings, it may look like this for tabsuffix:
```
_DEFAULT_:
tabsuffix: "%luckperms-suffix%%essentials_afk%"
```
Or running an in-game command: `/tab group _DEFAULT_ tabsuffix %luckperms-suffix%%essentials_afk%`.
This is not limited to displaying AFK status in suffix, you can also use it in tabprefix instead (or nametags).
Finally, you will most likely need to set up [placeholder output replacements](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Placeholder-output-replacements) for the placeholder, as lots of them, including the %essentials_afk% placeholder used as an example, return `yes` and `no` values, which you most likely want to customize.
As mentioned, by default, Essentials' afk placeholder returns `yes` / `no` (unless modified in PlaceholderAPI's config.yml). Other placeholders may return different values. To find out what a placeholder returned, use `/tab parse <player> <placeholder>`. Remember to include color codes as well.
An example customization may look like this:
```
placeholder-output-replacements:
"%essentials_afk%":
"yes": " &4&lAFK"
"no": "" # display nothing if not afk
```
Keep in mind that some placeholders don't need this.
For example, CMI has 2 placeholders - %cmi_user_afk% that returns true/false,
and %cmi_user_afk_symbol% that returns AFK text configured in CMI configuration.
Therefore, if you decide to use the latter one, you don't need to set up replacements.
# Showing combined online player count from multiple servers
## Option 1 - Using global playerlist
The first way is to install TAB on the proxy
and enable [global playerlist](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Global-playerlist).
It allows you to create groups of servers that share playerlist.
These groups can then be used to show player count on those servers using a placeholder.
Using the following example:
```
global-playerlist:
enabled: true
server-groups:
lobbies:
- lobby1
- lobby2
```
Servers `lobby1` and `lobby2` will share playerlist. You will also be able to use placeholder formula `%playerlist-group_<group>%`, in this case `%playerlist-group_lobbies%`. It will show amount of players on `lobby1` and `lobby2` combined.
Advantage of this is the natural compatibility with global playerlist's settings,
which is also its disadvantage, since global playerlist has to be configured that way.
When using [layout](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Layout) feature,
global playerlist is redundant and having it enabled only for the placeholder is inefficient.
## Option 2 - Using PlaceholderAPI
Unlike the first option, this one offers much more freedom, but also requires another plugin. You'll need to [download PlaceholderAPI and its expansions called math and bungee](https://github.com/NEZNAMY/TAB/wiki/Quick-PlaceholderAPI-startup-guide) (`/papi ecloud download bungee`, `/papi ecloud download math`, `/papi reload`).
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).
+77
View File
@@ -0,0 +1,77 @@
* [About](#about)
* [Availability](#availability)
* [Enabling](#enabling)
* [Configuration changes](#configuration-changes)
* [Data conversion](#data-conversion)
* [Downloading from MySQL to files](#downloading-from-mysql-to-files)
* [Uploading from files to MySQL](#uploading-from-files-to-mysql)
* [Synchronization frequency](#synchronization-frequency)
# About
By default, groups and users are stored in separate files (groups.yml and users.yml).
Enabling MySQL will use it as storage of groups and users instead of the files.
`playerdata.yml` file (for toggling scoreboard/bossbar and remembering the decision)
is not affected and will still be used instead of MySQL.
It may be added in the future.
All tables from TAB are prefixed with `tab_`, currently `tab_groups` for groups and `tab_users` for users.
# Availability
Before attempting to use the function, make sure your server software has an integrated MySQL driver.
TAB does not contain it by itself.
See the compatibility table below for current information about compatibility:
| Platform | Available |
|------------|-----------|
| Bukkit | ✔ |
| BungeeCord | ✔ |
| Fabric | ❌ |
| Sponge | ❌ |
| Velocity | ❌ |
# Enabling
Find this section in **config.yml**:
```
mysql:
enabled: false
host: 127.0.0.1
port: 3306
database: tab
username: user
password: password
useSSL: true
```
Enabling it will enable MySQL. The other settings are pretty straight forward.
# Configuration changes
Once enabled, configured values in groups.yml and users.yml will not be visible anymore,
which is expected because your database is empty when created.
This is not a bug.
All you need to do is [upload your data to the database](#uploading-from-files-to-mysql).
Since groups.yml and users.yml files will no longer be used, making any changes to them will take no effect. If you wish to perform any changes, you have 2 options:
* Use in-game commands, which will upload changes to the database
* Upload the file to the database after every change (will not work for removing though) (useful when enabling for the first time).
# Data conversion
## Downloading from MySQL to files
This can be done using `/tab mysql download` command (permission is `tab.mysql.download`). It will download all data from the MySQL and save into groups.yml / users.yml.
This command requires the MySQL function enabled.
Existing data in files will not intentionally be deleted, but may get overwritten.
## Uploading from files to MySQL
This can be done using `/tab mysql upload` command (permission is `tab.mysql.upload`). It will upload all content from groups.yml and users.yml into MySQL.
This command requires the MySQL function enabled.
Existing data in the database will not intentionally be deleted, but may get overwritten.
# Synchronization frequency
When using files to store data, it's simple -
groups.yml and users.yml files are loaded into memory and read from when needed.
When a command is run to update something, it is updated in memory and saved into files as well.
When using MySQL, the plugin has to keep data up to date with other servers, but at the same time not kill the server with requests all the time.
For writing, both groups and users, whenever a command is used to update something, the update is sent to the database immediately.
For reading, data is updated as following:
* Groups - All data from groups table is loaded into memory on a load (server start, plugin reload). When a player joins in or any other action, values from memory are checked. Therefore, if a change is made on another server, it will not be visible until the plugin is reloaded.
* Users - Nothing is loaded on a plugin load. Whenever a player joins, all data of that player is requested from the database. Therefore, if a player's data changes on another server, it is visible immediately when a player joins this one, without the need to reload the plugin.
+94
View File
@@ -0,0 +1,94 @@
This guide will explain all primary ways you can reduce plugin's CPU usage besides the obvious things like "don't spam animations" or "disable features you don't want".
The usage can be checked at any time using [**/tab cpu**](https://github.com/NEZNAMY/TAB/wiki/Commands-&-Permissions#tab-cpu) command. If the numbers appear to be higher than they should be, check this guide for various ways to optimize the plugin. Most of these apply for all platforms, but some of them are only specific for some platforms.
# Content
* [#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] 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)
# #1 - [All platforms] Static text instead of placeholders
Static text doesn't need to be refreshed periodically, resulting in better performance.
Some placeholders can be replaced with static text, such as placeholder for max player counts,
since that value doesn't change at runtime.
Another option is to configure prefixes per-group in config
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.
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
placeholder-refresh-intervals:
default-refresh-interval: 500
"%server_uptime%": 1000
"%server_tps_1_colored%": 1000
"%player_health%": 200
"%player_ping%": 1000
"%vault_prefix%": 1000
"%rel_factionsuuid_relation_color%": 500
```
Refresh interval is in milliseconds. It must be divisible by 50.
`default-refresh-interval` is refresh interval for all unlisted PlaceholderAPI placeholders.
Keep in mind that CPU measurement is reset every 10 seconds.
This means that if you configure a higher refresh interval than 10000,
there will be intervals when placeholder didn't refresh at all,
making it look like the CPU is perfect, while on the next refresh it may be high.
For this reason, if you want to cleanly track usage, keep the interval at 10000 at most.
Using a higher interval will help if needed, but may lead to misleading info in cpu output.
# #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] 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,
the nametag format appears in tablist if tablist name is not defined.
You can take advantage of this to effectively disable one entire feature and its cpu usage,
while not losing on anything.
However, you can only do this if:
* You are fine with nametag and tablist formats being identical, which also means all [nametag limitations](https://github.com/NEZNAMY/TAB/wiki/Feature-guide:-Nametags#limitations) will transfer to tablist as well
* You don't have any plugin formatting the tablist names
Whether you have another plugin attempting to handle them or not may not be easy to identify with a lot of plugins and not enough time spent configuring them. In that case, your best choice is to try it and see. If tablist names break, it means you have another plugin and cannot take advantage of this optimization option.
# #6 - [All platforms] Increase permission refresh interval
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)
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.
# #7 - [BungeeCord / Velocity] 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,
where values must be constantly sent to bridge using plugin messages.
Disabling TAB's PlaceholderAPI expansion if you don't use it improves performance.
**config.yml**:
```
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.
+244
View File
@@ -0,0 +1,244 @@
# Content
* [About](#about)
* [Internal placeholders](#internal-placeholders)
* [Universal](#universal)
* [Backend only](#backend-only)
* [BungeeCord only](#bungeecord-only)
* [PlaceholderAPI](#placeholderapi)
* [Relational placeholders](#relational-placeholders)
* [About](#about-1)
* [Usage](#usage)
* [Refreshing](#refreshing)
* [Refresh intervals](#refresh-intervals)
* [Sync refreshing](#sync-refreshing)
* [Placeholder is not working](#placeholder-is-not-working)
* [Internal placeholder is not working](#internal-placeholder-is-not-working)
* [PlaceholderAPI placeholder is not working](#placeholderapi-placeholder-is-not-working)
* [API](#api)
* [Server placeholders](#server-placeholders)
* [Player placeholders](#player-placeholders)
* [Relational placeholders](#relational-placeholders-1)
# About
TAB offers various placeholders to display the most common information. It also supports [PlaceholderAPI placeholders](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders).
# Internal placeholders
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 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 |
| %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. |
| %% | -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 the server. Not directly available on Fabric, Forge and Neoforge. 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) | - |
## 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_\<server name\>% | 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) |
# 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 the second argument.
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. 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 raw placeholders |
| %tab_tabsuffix_raw% | Raw tabsuffix containing raw placeholders |
| %tab_tagprefix_raw% | Raw tagprefix containing raw placeholders |
| %tab_tagsuffix_raw% | Raw tagsuffix containing raw placeholders |
| %tab_customtabname_raw% | Raw customtabname containing raw 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_visibility% | "Enabled" if player can see nametags, "Disabled" if disabled using `/tab nametag toggleview` |
| %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%) |
# Relational placeholders
## About
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).
When passing players into the function, first player is the player viewing the text, second player is the one text is being displayed on.
Code wise, the PlaceholderAPI request function becomes
```
public String onPlaceholderRequest(Player viewer, Player target, String identifier)
```
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.
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 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.
> [!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.
> [!IMPORTANT]
> 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.
> For example, you can use %vault_prefix% instead of %vault-prefix%,
> %player_health_rounded% instead of %health% and so on.
## 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.
> [!TIP]
> Use `/papi parse me <placeholder>` to check if the placeholder is working.
> If it does not work, the issue is not on TAB's end.
# API
*To get started with the API, see [Developer API](https://github.com/NEZNAMY/TAB/wiki/Developer-API) page.*
For working with placeholders, you will need the `PlaceholderManager`. Get it using `TabAPI.getInstance().getPlaceholderManager()`.
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 the respective placeholder interface.
## Server placeholders
Server placeholders are global to the entire plugin. Their values are not dependent on player.
Examples of server placeholders would be uptime and TPS placeholders.
To register a new server placeholder, use `PlaceholderManager#registerServerPlaceholder(String, int, Supplier<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>
<summary>Example</summary>
```
TabAPI.getInstance().getPlaceholderManager().registerServerPlaceholder("%system-time%", 50, () -> System.currentTimeMillis());
```
This placeholder will show current system time and update every 50 milliseconds.
</details>
## 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 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>
<summary>Example</summary>
```
TabAPI.getInstance().getPlaceholderManager().registerPlayerPlaceholder("%player-uuid%", -1, player -> player.getUniqueId());
```
This placeholder will show player's UUID and never refreshes, since UUID doesn't change at runtime.
</details>
## Relational placeholders
Relational placeholders are calculated using a pair of players, instead of a single one. These depend on the player pair that we want to get the value for. Their identifier must start with `rel_`.
To register a new relational placeholder, use `PlaceholderManager#registerRelationalPlaceholder(String, int, BiFunction<TabPlayer, 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>
<summary>Example</summary>
```
TabAPI.getInstance().getPlaceholderManager().registerRelationalPlaceholder("%rel_staff_version%", 1000, (viewer, target) -> {
if (viewer.hasPermission("tab.staff")) {
return target.getVersion().getFriendlyName();
} else {
return "";
}
});
```
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>
@@ -0,0 +1,29 @@
# About
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 that 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.
# Expansions
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 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.
# Checking if placeholder is working
To check if a placeholder is working, run `/papi parse <player> <placeholder>`. You can also use `me` as player, which parses placeholder for the player who ran the command. If the command outputs the identifier you entered and not the actual output, it means you either entered and invalid placeholder or you are missing an expansion (or you have an outdated version of the expansion), see above.
+33
View File
@@ -0,0 +1,33 @@
# About
When TAB is installed on BungeeCord / Velocity, 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) or [Spigot](https://www.spigotmc.org/resources/83966).
# Installation
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 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 BungeeCord
* 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
* Forward player's gamemode for spectator fix feature to work
# Compatibility
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. Update both to the latest version.
+147
View File
@@ -0,0 +1,147 @@
# ---------------------------------------
# THIS PAGE IS A WORK IN PROGRESS
# ---------------------------------------
# About
This page compares TAB to other plugins offering similar features based on various parameters.
### Open issues
Number 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 issues may be feature requests, which may not be present elsewhere as those are not accepted.
### Price
The price to get 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** | ✔ | ✔ | ✔ | ❌ | ✔ |
+42
View File
@@ -0,0 +1,42 @@
## 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, Fabric, Forge, NeoForge, Sponge, 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 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 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.
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.
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.
Want a simple result with simple configuration? No problem. Want a complicated result? No problem.
+16 -20
View File
@@ -3,43 +3,39 @@ on:
push:
branches:
- master
- v4
pull_request:
types: [opened, synchronize, reopened]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3.3.0 #https://github.com/actions/checkout/releases
- uses: actions/checkout@v4 # 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 17
uses: actions/setup-java@v3.9.0 #https://github.com/actions/setup-java/releases
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
with:
distribution: 'temurin'
java-version: 17
- name: Cache SonarCloud packages
uses: actions/cache@v3.2.3 #https://github.com/actions/cache/releases
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
java-version: 21
- name: Cache Gradle
uses: actions/cache@v3.2.3 #https://github.com/actions/cache/releases
uses: actions/cache@v4.2.0 # https://github.com/actions/cache/releases
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: "${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}"
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Build and analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
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"
- name: Upload a Build Artifact
uses: actions/upload-artifact@v3.1.2 #https://github.com/actions/upload-artifact/releases
uses: actions/upload-artifact@v4.3.3 # https://github.com/actions/upload-artifact/releases
with:
name: Jar
path: jar/build/libs/TAB-**.jar
name: Click here to download
path: jar/build/libs/TAB-*+${{ github.run_number }}.jar
+33 -1
View File
@@ -3,8 +3,19 @@ TAB aims to be a superior all-in-one minecraft plugin for displaying information
similar plugins in terms of features, performance and compatibility.
More information can be found at [Why TAB?](https://github.com/NEZNAMY/TAB/wiki/Why-TAB%3F) wiki page.
# 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), [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
update, therefore development builds are being created and eventually a full update is released when enough changes are made.
If you want to benefit from a recent change in the code before official release, you can download development builds
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 17 and up.
Compilation requires JDK 21 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.
@@ -21,3 +32,24 @@ is in quality of the report. Bug reports where steps to reproduce are "idk" have
# Contributing
See [CONTRIBUTING.md](https://github.com/NEZNAMY/TAB/blob/master/CONTRIBUTING.md)
# Provided services
The plugin is being used by a large amount of servers, which also means the demand for my attention is high. Unfortunately,
I am no longer able to keep up with the demand since I don't want to dedicate my whole existence to a free plugin.
In order to provide the best quality of all provided services, the amount of services provided may vary over time.
Here is the full list of potential services and their status:
| Service type | Availability |
|-------------------------------|--------------|
| Updates for new MC versions | ✔ |
| Bug fixes | ✔ |
| Wiki improvements | ✔ |
| Performance optimizations | ✔ |
| Feature requests | ❌ |
| Customer support<sup>1</sup> | ✔ |
| Free user support<sup>2</sup> | ❌* |
<sup>1</sup> - Unrestricted assistance with the plugin for those, who bought a copy of the plugin when it was purchasable.
<sup>2</sup> - Unlimited access to my free time for everyone in the world.
*Instead, you can use [this fresh new community discord](https://discord.gg/YPqXt63YQj) made by a nice person who will provide this service.
+1 -1
View File
@@ -1,5 +1,5 @@
dependencies {
compileOnlyApi("org.jetbrains:annotations:24.0.1")
compileOnlyApi("org.jetbrains:annotations:24.1.0")
}
tasks.javadoc {
@@ -1,5 +1,6 @@
package me.neznamy.tab.api;
import lombok.NonNull;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -8,6 +9,7 @@ import java.util.UUID;
/**
* An interface representing a player
*/
@SuppressWarnings("unused") // API class
public interface TabPlayer {
/**
@@ -15,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 an instance of bukkit/bungee player depending on platform
* @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)
@@ -45,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.
@@ -66,4 +72,34 @@ public interface TabPlayer {
* @see #setTemporaryGroup(String)
*/
boolean hasTemporaryGroup();
/**
* 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,
* 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.
*
* @param profileName
* New expected profile name
*/
void setExpectedProfileName(@NonNull String profileName);
/**
* Returns player's expected profile name. This defaults to player's username, but may
* get changed by other plugins and then detected by TAB.
*
* @return Player's expected profile name
*/
@NotNull
String getExpectedProfileName();
/**
* 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();
}
@@ -4,6 +4,27 @@ package me.neznamy.tab.api.bossbar;
* An enum representing all available BossBar colors.
* Calling ordinal() will return color's network ID.
*/
@SuppressWarnings("unused") // API class
public enum BarColor {
PINK, BLUE, RED, GREEN, YELLOW, PURPLE, WHITE
/** Pink color */
PINK,
/** Blue color */
BLUE,
/** Red color */
RED,
/** Green color */
GREEN,
/** Yellow color */
YELLOW,
/** Purple color */
PURPLE,
/** White color */
WHITE
}
@@ -1,22 +1,24 @@
package me.neznamy.tab.api.bossbar;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* An enum representing all available BossBar styles.
* Calling ordinal() will return style's network ID.
* Style names are equal to NMS names.
*/
@AllArgsConstructor
@SuppressWarnings("unused") // API class
public enum BarStyle {
PROGRESS("SOLID"),
NOTCHED_6("SEGMENTED_6"),
NOTCHED_10("SEGMENTED_10"),
NOTCHED_12("SEGMENTED_12"),
NOTCHED_20("SEGMENTED_20");
/** Fully solid line */
PROGRESS,
/** Style's name used in Bukkit API */
@Getter private final String bukkitName;
/** Line segmented into 6 parts */
NOTCHED_6,
/** Line segmented into 10 parts */
NOTCHED_10,
/** Line segmented into 12 parts */
NOTCHED_12,
/** Line segmented into 20 parts */
NOTCHED_20
}
@@ -10,11 +10,7 @@ import org.jetbrains.annotations.NotNull;
/**
* An interface representing a BossBar line.
* <p>
* For clients 1.8 and lower it uses wither, which only allows 1 bar
* to be displayed at a time. Entity packets are not available on BungeeCord,
* where nothing will be displayed for these players.
* <p>
* For 1.9+ it uses the new BossBar feature, allowing configurable styles
* It uses 1.9+ BossBar feature, allowing configurable styles
* and colors, as well as display several bars at once. Limit of maximum
* displayed BossBars depends on client resolution and GUI scale, up to
* 9 concurrent BossBars displayed at once.
@@ -205,7 +201,7 @@ public interface BossBar {
* Player to check
* @return {@code true} if player is allowed to see this Boss Bar, {@code false} if not.
*/
boolean containsPlayer(TabPlayer player);
boolean containsPlayer(@NonNull TabPlayer player);
/**
* Returns {@code true} if this boss bar is configured as announcement-only bar,
@@ -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.
@@ -17,6 +17,7 @@ import org.jetbrains.annotations.Nullable;
* This requires the BossBar feature to be enabled in config, otherwise the method will
* return {@code null}.
*/
@SuppressWarnings("unused") // API class
public interface BossBarManager {
/**
@@ -77,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.
*
@@ -116,14 +139,14 @@ public interface BossBarManager {
void setBossBarVisible(@NonNull TabPlayer player, boolean visible, boolean sendToggleMessage);
/**
* Temporarily displays registered BossBar to player for specified amount of time in milliseconds.
* Temporarily displays registered BossBar to player for specified amount of time in seconds.
*
* @param player
* Player to show BossBar to
* @param bossBar
* Name of registered BossBar to show
* @param duration
* In milliseconds for how long should BossBar be displayed
* In seconds for how long should BossBar be displayed
* @throws IllegalArgumentException
* if no BossBar with specified name exists
* @see #announceBossBar(String, int)
@@ -132,12 +155,12 @@ public interface BossBarManager {
void sendBossBarTemporarily(@NonNull TabPlayer player, @NonNull String bossBar, int duration);
/**
* Temporarily displays registered BossBar to all players for specified amount of time in milliseconds.
* Temporarily displays registered BossBar to all players for specified amount of time in seconds.
*
* @param bossBar
* Name of registered BossBar to show
* @param duration
* In milliseconds for how long should BossBar be displayed
* In seconds for how long should BossBar be displayed
* @throws IllegalArgumentException
* if no BossBar with specified name exists
* @see #sendBossBarTemporarily(TabPlayer, String, int)
@@ -6,6 +6,7 @@ import lombok.NonNull;
* The event bus. This is used to register event listeners/handlers for
* handling events that may be fired by TAB.
*/
@SuppressWarnings("unused") // API class
public interface EventBus {
/**
Loaded 100 of 789 files, more files were not shown because too many files have changed in this diff. Show more