diff --git a/build.gradle b/build.gradle
index 9162799..1b10636 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,7 +3,7 @@ import org.apache.tools.ant.filters.ReplaceTokens
plugins {
id 'com.github.johnrengelman.shadow' version '8.1.1'
id 'org.cadixdev.licenser' version '0.6.1'
- id 'org.ajoberstar.grgit' version '5.0.0'
+ id 'org.ajoberstar.grgit' version '5.2.0'
id 'java'
}
@@ -29,19 +29,19 @@ dependencies {
compileOnly 'com.velocitypowered:velocity-api:3.2.0-SNAPSHOT'
compileOnly 'com.velocitypowered:velocity-proxy:3.2.0-SNAPSHOT'
compileOnly 'net.luckperms:api:5.4'
- compileOnly 'io.netty:netty-codec-http:4.1.91.Final'
+ compileOnly 'io.netty:netty-codec-http:4.1.93.Final'
compileOnly 'io.github.miniplaceholders:miniplaceholders-api:2.0.0'
compileOnly 'net.william278:PAPIProxyBridge:1.2'
- compileOnly 'org.projectlombok:lombok:1.18.26'
+ compileOnly 'org.projectlombok:lombok:1.18.28'
implementation 'org.apache.commons:commons-text:1.10.0'
implementation 'net.william278:Annotaml:2.0.1'
implementation 'dev.dejvokep:boosted-yaml:1.3.1'
implementation 'de.themoep:minedown-adventure:1.7.2-SNAPSHOT'
- implementation 'net.william278:DesertWell:2.0.2'
+ implementation 'net.william278:DesertWell:2.0.4'
implementation 'org.bstats:bstats-velocity:3.0.2'
- annotationProcessor 'org.projectlombok:lombok:1.18.26'
+ annotationProcessor 'org.projectlombok:lombok:1.18.28'
}
processResources {
diff --git a/docs/Animations.md b/docs/Animations.md
index 2b3a2dd..99beab2 100644
--- a/docs/Animations.md
+++ b/docs/Animations.md
@@ -23,7 +23,7 @@ By default, the plugin will switch between each frame whenever it is updated. To
### Setting the frame rate
The `update_rate` setting in your `config.yml` file—set to `0` by default—controls the length (in milliseconds†) between your TAB list being updated. On each update, the header or footer format will use the next frame in the list, looping back to the first after the last one has been displayed.
-A good starting value for this could be `1000`, which is equivalent to one second. Once you've changed the value, use `/velocitab reload` to update the TAB menu in-game without restarting your proxy.
+A good starting value for this could be `1000`, which is equivalent to one second. Once you've changed the value, use `/velocitab reload` to update the TAB menu in-game without restarting your proxy. Note the minimum update rate is `200` to avoid excessive network packet traffic, so values between `1`-`199` will be rounded up to `200`. If this value is set to `0` or below (as it is by default), the TAB menu will only update when a player joins or leaves, permissions are recalculated on LuckPerms, or the proxy is reloaded.
†`1ms = 1/1000th` of a second.
@@ -83,6 +83,6 @@ server_groups:
default:
- server
- server2
-update_rate: 100
+update_rate: 200
```
-
\ No newline at end of file
+
diff --git a/docs/Custom-Logos.md b/docs/Custom-Logos.md
new file mode 100644
index 0000000..a33ce2e
--- /dev/null
+++ b/docs/Custom-Logos.md
@@ -0,0 +1,51 @@
+If you'd like to display a custom logo or image in your TAB menu, like the example listed on the project listing,[1] you will need to make use of a resource pack to retexture Minecraft's default Unicode characters.
+
+
+Example: Mine in Abyss server TAB menu.
+
+
+
+
+## Creating a resource pack
+To do this, you'll need to make a resource pack, and set it to be used on your servers as the Server Resource Pack[2]. To do this:
+1. Create a blank resource pack. Consult the [Minecraft Wiki](https://minecraft.fandom.com/wiki/Resource_pack) for making a super basic resource pack layout; this involves creating a `pack.mcmeta` for the correct Minecraft version and placing this inside the root of a directory.
+2. Create the directory to store your logo texture: `/assets/server_name/textures/font`. Replace `server_name` with your server name (lower case, no spaces)
+3. Place your logo in that directory. The logo can have a maximum size of 256x256 (though you can technically use multiple characters if you want a larger logo; feel free to experiment)
+4. Create the `/assets/minecraft/font` directory.
+5. Create `default.json`, which we will use to specify a unicode character to replace with your logo texture.
+6. Add the following to your `default.json` file, which will replace the (non-existent) Unicode character `\ue238` with your logo. Remember to replace `server_name` with the server name you used earlier:
+```json
+{
+ "providers": [
+ {
+ "file": "server_name:font/logo.png",
+ "chars": [
+ "\ue238"
+ ],
+ "height": 50,
+ "ascent": 35,
+ "type": "bitmap"
+ }
+ ]
+}
+```
+7. Save the file. Note that later on you may need to tweak the `height` and `ascent` values in the file to suit your logo's size.
+8. For testing, install the resource pack locally by placing it in your `~/.minecraft/resourcepacks` folder and select your newly created pack in the Resource Packs menu.
+9. Copy the Unicode character from [fileformat.info's unicode browsertest page](https://fileformat.info/info/unicode/char/e238/browsertest.htm) and paste it to chat in-game. Observe and verify that your logo looks correct.
+
+## Applying your pack to your servers and Velocitab
+10. In Velocitab, add your logo's Unicode character to the header section of one or more of your TAB menus. You may need to add multiple newlines (`\n`) after the Unicode character to add spacing between the header and player list. Use `/velocitab reload` to get it right.
+11. Finally, set the pack as your server resource pack, by uploading it to a service that lets you supply a direct download link into your `server.properties` files. You should do this on all your backend (Spigot/Paper/Folia/Fabric, etc.) servers.
+12. Restart everything and fine tune as necessary.
+
+## The entire _Bee Movie_ as an animated TAB header
+You totally could render the entire _Bee Movie_ in the TAB menu by retexturing a ton of impossible Unicode characters with this method, yes (at a low resolution, granted). Bare in mind there are limits on maximum server resource pack sizes, so you'd need to do some optimizations. Your Velocitab config file would also be very long. Have fun.
+
+----
+
+
+[1] — Courtesy of Mine In Abyss. Made in Abyss © Akihito Tsukushi, Takeshobo / Made in Abyss Production Committee.
+
+
+
+[2] — Taken from [this helpful Reddit comment](https://www.reddit.com/r/admincraft/comments/llrgty/comment/gnswdcz/) on [/r/admincraft](https://www.reddit.com/r/admincraft/) by [/u/MrPowerGamerBR](https://www.reddit.com/user/MrPowerGamerBR/).
diff --git a/docs/Formatting.md b/docs/Formatting.md
index 3bf46f6..8ce0d9e 100644
--- a/docs/Formatting.md
+++ b/docs/Formatting.md
@@ -1,14 +1,14 @@
-Velocitab supports the full range of modern color formatting, including RGB colors and gradients. Both MineDown (_default_) and MiniMessage are supported as formats. To change which formatter is being used, change the `formatting_type` value in `config.yml` to `MINEDOWN` or `MINIMESSAGE` respectively.
+Velocitab supports the full range of modern color formatting, including RGB colors and gradients. Both MineDown (_default_), MiniMessage and Legacy formatting are supported. To change which formatter is being used, change the `formatting_type` value in `config.yml` to `MINEDOWN`, `MINIMESSAGE` or `LEGACY` respectively.
Formatting is applied on header, footer and player text for each server group, and is applied after [[Placeholders]] have been inserted.
## MineDown syntax reference
-MineDown is the default formatter type. See the [MineDown Syntax Reference](https://github.com/Phoenix616/MineDown) on GitHub for the specification of how to format text with it.
+MineDown is the default formatter type, enabled by setting `formatting_type` to `MINEDOWN` in `config.yml`. See the [MineDown Syntax Reference](https://github.com/Phoenix616/MineDown) on GitHub for the specification of how to format text with it.
## MiniMessage syntax reference
MiniMessage formatting can be enabled by setting `formatting_type` to `MINIMESSAGE` in `config.yml`. See the [MiniMessage Syntax Reference](https://docs.advntr.dev/minimessage/format.html) on the Adventure Docs for how to format text with it. Using MiniMessage as the formatter also allows compatibility for using MiniPlaceholders in text.
## Legacy formatting
-> ⚠️ Option for legacy formatting is provided only for backwards compatibility with other plugins, please consider using MineDown or MiniMessage options instead!
+> **Warning:** The option for legacy formatting is provided only for backwards compatibility with other plugins. Please consider using the MineDown or MiniMessage options instead!
-Legacy formatting can be enabled by setting `formatting_type` to `LEGACY` in `config.yml`. Legacy formatter supports Mojang color and formatting codes (e.g. `&d`, `&l`), Adventure-styled RGB color codes (e.g. `a25981`), as well as BungeeCord RGB color codes (e.g. `&x&a&2&5&9&8&1`). See the [LegacyComponentSerializer Syntax Reference](https://docs.advntr.dev/serializer/legacy.html) on the Adventure Docs for more technical details.
\ No newline at end of file
+Legacy formatting can be enabled by setting `formatting_type` to `LEGACY` in `config.yml`. Legacy formatter supports Mojang color and formatting codes (e.g. `&d`, `&l`), Adventure-styled RGB color codes (e.g. `a25981`), as well as BungeeCord RGB color codes (e.g. `&x&a&2&5&9&8&1`). See the [LegacyComponentSerializer Syntax Reference](https://docs.advntr.dev/serializer/legacy.html) on the Adventure Docs for more technical details.
diff --git a/docs/Home.md b/docs/Home.md
index affe663..5e5e8ed 100644
--- a/docs/Home.md
+++ b/docs/Home.md
@@ -13,6 +13,7 @@ Please click through to the topic you wish to read about.
* 🎨 [[Formatting]]
* ✍️ [[Placeholders]]
* ✨ [[Animations]]
+* 🖼️ [[Custom Logos]]
## Links
* 💻 [GitHub](https://github.com/WiIIiam278/Velocitab)
@@ -20,4 +21,4 @@ Please click through to the topic you wish to read about.
* 💬 [Discord Support](https://discord.gg/tVYhJfyDWG)
## Contribute to this documentation
-This documentation is automatically generated from the source code and markdown files in the [Velocitab GitHub repository](https://github.com/WiIIiam278/Velocitab/tree/master/docs). If you wish to contribute to the documentation, please submit a pull request to the repository.
\ No newline at end of file
+This documentation is automatically generated from the source code and markdown files in the [Velocitab GitHub repository](https://github.com/WiIIiam278/Velocitab/tree/master/docs). If you wish to contribute to the documentation, please submit a pull request to the repository.
diff --git a/docs/Setup.md b/docs/Setup.md
index a2e4835..cd39420 100644
--- a/docs/Setup.md
+++ b/docs/Setup.md
@@ -8,10 +8,11 @@ This page will walk you through installing Velocitab on a Velocity proxy server.
## Installation
1. Download the latest version of [Velocitab](https://modrinth.com/plugin/velocitab)
-2. Drag both into the `/plugins/` folder on your Velocity proxy server
+2. Drag the plugin into the `/plugins/` folder on your Velocity proxy server
3. Download and install additional optional dependencies on your proxy and backend servers as needed:
- 1. If you'd like Velocitab to display user roles from [LuckPerms](https://luckperms.net/), ensure LuckPerms is installed on your proxy as well, and configured to synchronise role information over your database
- 2. If you'd like to use [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/) placeholders, install [PAPIProxyBridge](https://modrinth.com/plugin/papiproxybridge) on both your Velocity server and Spigot-based Minecraft servers. Also ensure PlaceholderAPI is installed on your spigot servers
+ 1. If you'd like Velocitab to display user roles from [LuckPerms](https://luckperms.net/), ensure LuckPerms is installed on your Velocity proxy as well, and configured to synchronise role information over your database
+ 2. If you'd like to use [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/) placeholders, install [PAPIProxyBridge](https://modrinth.com/plugin/papiproxybridge) on both your Velocity proxy and Spigot-based Minecraft servers. Also ensure PlaceholderAPI is installed on your spigot servers
+ 3. If you'd like to use [MiniPlaceholders](https://modrinth.com/plugin/miniplaceholders) placeholders, install MiniPlaceholders on your Velocity proxy.
4. Restart your proxy to let Velocitab generate its configuration file
5. Stop your proxy server, modify the [`config.yml`](config-file) file to your liking, and start your server
@@ -22,4 +23,4 @@ Velocitab should now be successfully installed on your proxy.
* [Using Placeholders](placeholders)
* [Text Formatting](formatting)
* [Server Groups](server-groups)
-* [Using Animations](animations)
\ No newline at end of file
+* [Using Animations](animations)
diff --git a/docs/_Sidebar.md b/docs/_Sidebar.md
index 6c09637..b9a03d6 100644
--- a/docs/_Sidebar.md
+++ b/docs/_Sidebar.md
@@ -7,8 +7,9 @@
* 🎨 [[Formatting]]
* ✍️ [[Placeholders]]
* ✨ [[Animations]]
+* 🖼️ [[Custom Logos]]
## Links
* 💻 [GitHub](https://github.com/WiIIiam278/Velocitab)
* 📂 [Download](https://modrinth.com/plugin/velocitab)
-* 💬 [Discord Support](https://discord.gg/tVYhJfyDWG)
\ No newline at end of file
+* 💬 [Discord Support](https://discord.gg/tVYhJfyDWG)
diff --git a/gradle.properties b/gradle.properties
index cab670b..f013108 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -5,4 +5,4 @@ org.gradle.daemon=true
plugin_version=1.4.1
plugin_archive=velocitab
-plugin_description=A super-simple (sorted!) Velocity TAB menu plugin
\ No newline at end of file
+plugin_description=A super-simple (sorted!) Velocity TAB menu plugin
diff --git a/src/main/java/net/william278/velocitab/config/Settings.java b/src/main/java/net/william278/velocitab/config/Settings.java
index 1f13bbf..02dafd9 100644
--- a/src/main/java/net/william278/velocitab/config/Settings.java
+++ b/src/main/java/net/william278/velocitab/config/Settings.java
@@ -111,7 +111,8 @@ public class Settings {
@Getter
@YamlKey("update_rate")
@YamlComment("How often in milliseconds to periodically update the TAB list, including header and footer, for all users.\n" +
- "If set to 0, TAB will be updated on player join/leave instead. (1s = 1000ms)")
+ "If set to 0, TAB will be updated on player join/leave instead. (1s = 1000ms)\n" +
+ "The minimal update rate is 200ms, anything lower will automatically be set to 200ms.")
private int updateRate = 0;
public Settings(@NotNull Velocitab plugin) {
diff --git a/src/main/java/net/william278/velocitab/tab/PlayerTabList.java b/src/main/java/net/william278/velocitab/tab/PlayerTabList.java
index 9a8f18a..6ddebb3 100644
--- a/src/main/java/net/william278/velocitab/tab/PlayerTabList.java
+++ b/src/main/java/net/william278/velocitab/tab/PlayerTabList.java
@@ -224,7 +224,7 @@ public class PlayerTabList {
player.sendHeaderAndFooter(this);
});
})
- .repeat(updateRate, TimeUnit.MILLISECONDS)
+ .repeat(Math.max(200, updateRate), TimeUnit.MILLISECONDS)
.schedule();
}