forked from Upstream/Velocitab
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
e398306cd7 | ||
|
9cb20be6e0 | ||
|
a14c8eb2ea | ||
|
d47ee75d5b | ||
|
e17d36deb5 | ||
|
6796f4402f |
@ -47,3 +47,34 @@ is equivalent to
|
|||||||
```yaml
|
```yaml
|
||||||
foo: "bar 1\nbar 2\nbar 3\n"
|
foo: "bar 1\nbar 2\nbar 3\n"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## List of multi lines strings
|
||||||
|
|
||||||
|
> **Note:** The examples above are generic examples on how yaml works in multi line. If you want to use multi line in headers & footers you need to provide a list of multi line strings like in the example below.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
headers:
|
||||||
|
- |
|
||||||
|
<rainbow:!2>Running Velocitab by William278 & AlexDev_</rainbow>
|
||||||
|
<gray>Second line of the first element</gray>
|
||||||
|
<yellow>Third line of the first element</yellow>
|
||||||
|
- |
|
||||||
|
<rainbow:!4>Running Velocitab by William278 & AlexDev_</rainbow>
|
||||||
|
<gray>Second line of the second element</gray>
|
||||||
|
<yellow>Third line of the second element</yellow>
|
||||||
|
footers:
|
||||||
|
- <gray>There are currently %players_online%/%max_players_online% players online</gray>
|
||||||
|
- |
|
||||||
|
<gray> Test 1 </gray>
|
||||||
|
<yellow> Test 2 </yellow>
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example the header will switch between the 2 elements, but it will always display all the 3 lines.
|
||||||
|
|
||||||
|
The footer in this example will switch between 2 elements, the first one is just a simple string, the second element will display 2 lines since it's a multi line string
|
||||||
|
|
||||||
|
<figure style="text-align: center;">
|
||||||
|
<img src="https://i.imgur.com/YKu1RWi.gif" />
|
||||||
|
<figcaption>Example of a header and footer with multi line strings</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
@ -40,20 +40,6 @@ Placeholders can be included in the header, footer and player name format of the
|
|||||||
You can find a list of common primary language subtags [here](https://en.wikipedia.org/wiki/IETF_language_tag#List_of_common_primary_language_subtags).
|
You can find a list of common primary language subtags [here](https://en.wikipedia.org/wiki/IETF_language_tag#List_of_common_primary_language_subtags).
|
||||||
|
|
||||||
|
|
||||||
### Customising server display names
|
|
||||||
You can make use of the `server_display_names` feature in `config.yml` to customise how server display name appear when using the `%server%` placeholder. In the below example, if a user is connected to a server with the name "`very-long-server-`name" and the player name format for the group that server belongs to includes a `%server%` placeholder, the placeholder would be replaced with "`VSLN`" instead of the full server name.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Server display names (config.yml)</summary>
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Define custom names to be shown in the TAB list for specific server names.
|
|
||||||
# If no custom display name is provided for a server, its original name will be used.
|
|
||||||
server_display_names:
|
|
||||||
very-long-server-name: VLSN
|
|
||||||
```
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## PlaceholderAPI support
|
## PlaceholderAPI support
|
||||||
To use PlaceholderAPI placeholders in Velocitab, install the [PAPIProxyBridge](https://modrinth.com/plugin/papiproxybridge) library plugin on your Velocity proxy and all Minecraft spigot servers on your network, and ensure the PAPI hook option is enabled in your Velocitab [[Config File]]. You can then include PAPI placeholders in your formats as you would any of the default placeholders.
|
To use PlaceholderAPI placeholders in Velocitab, install the [PAPIProxyBridge](https://modrinth.com/plugin/papiproxybridge) library plugin on your Velocity proxy and all Minecraft spigot servers on your network, and ensure the PAPI hook option is enabled in your Velocitab [[Config File]]. You can then include PAPI placeholders in your formats as you would any of the default placeholders.
|
||||||
|
|
||||||
|
@ -106,7 +106,8 @@ public enum Placeholder {
|
|||||||
.orElse(getPlaceholderFallback(plugin, "%luckperms_primary_group_name%"))),
|
.orElse(getPlaceholderFallback(plugin, "%luckperms_primary_group_name%"))),
|
||||||
ROLE_DISPLAY_NAME((plugin, player) -> player.getRole().getDisplayName()
|
ROLE_DISPLAY_NAME((plugin, player) -> player.getRole().getDisplayName()
|
||||||
.orElse(getPlaceholderFallback(plugin, "%luckperms_primary_group_name%"))),
|
.orElse(getPlaceholderFallback(plugin, "%luckperms_primary_group_name%"))),
|
||||||
ROLE_WEIGHT((plugin, player) -> player.getRoleWeightString()),
|
ROLE_WEIGHT((plugin, player) -> player.getRoleWeightString()
|
||||||
|
.orElse(getPlaceholderFallback(plugin, "%luckperms_meta_weight%"))),
|
||||||
SERVER_GROUP((plugin, player) -> player.getGroup().name()),
|
SERVER_GROUP((plugin, player) -> player.getGroup().name()),
|
||||||
SERVER_GROUP_INDEX((plugin, player) -> Integer.toString(player.getServerGroupPosition(plugin))),
|
SERVER_GROUP_INDEX((plugin, player) -> Integer.toString(player.getServerGroupPosition(plugin))),
|
||||||
DEBUG_TEAM_NAME((plugin, player) -> plugin.getFormatter().escape(player.getLastTeamName().orElse(""))),
|
DEBUG_TEAM_NAME((plugin, player) -> plugin.getFormatter().escape(player.getLastTeamName().orElse(""))),
|
||||||
@ -117,7 +118,7 @@ public enum Placeholder {
|
|||||||
private final static Pattern VELOCITAB_PATTERN = Pattern.compile("<velocitab_.*?>");
|
private final static Pattern VELOCITAB_PATTERN = Pattern.compile("<velocitab_.*?>");
|
||||||
private final static Pattern TEST = Pattern.compile("<.*?>");
|
private final static Pattern TEST = Pattern.compile("<.*?>");
|
||||||
private final static Pattern CONDITION_REPLACER = Pattern.compile("<velocitab_rel_condition:[^:]*:");
|
private final static Pattern CONDITION_REPLACER = Pattern.compile("<velocitab_rel_condition:[^:]*:");
|
||||||
private final static Pattern PLACEHOLDER_PATTERN = Pattern.compile("%.*?%");
|
private final static Pattern PLACEHOLDER_PATTERN = Pattern.compile("%.*?%", Pattern.DOTALL);
|
||||||
private final static String DELIMITER = ":::";
|
private final static String DELIMITER = ":::";
|
||||||
private final static Map<String, String> SYMBOL_SUBSTITUTES = Map.of(
|
private final static Map<String, String> SYMBOL_SUBSTITUTES = Map.of(
|
||||||
"<", "*LESS*",
|
"<", "*LESS*",
|
||||||
@ -285,7 +286,7 @@ public enum Placeholder {
|
|||||||
|
|
||||||
final Pair<String, Map<String, String>> replaced = replaceInternal(format, plugin, player);
|
final Pair<String, Map<String, String>> replaced = replaceInternal(format, plugin, player);
|
||||||
if (!PLACEHOLDER_PATTERN.matcher(replaced.first()).find()) {
|
if (!PLACEHOLDER_PATTERN.matcher(replaced.first()).find()) {
|
||||||
return CompletableFuture.completedFuture(replaced.first());
|
return CompletableFuture.completedFuture(applyPlaceholderReplacements(format, player, replaced.second()));
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<String> placeholders = extractPlaceholders(replaced.first());
|
final List<String> placeholders = extractPlaceholders(replaced.first());
|
||||||
@ -296,7 +297,8 @@ public enum Placeholder {
|
|||||||
return Map.of();
|
return Map.of();
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.orElse(CompletableFuture.completedFuture(Maps.newHashMap())).exceptionally(e -> {
|
.orElse(CompletableFuture.completedFuture(Maps.newHashMap()))
|
||||||
|
.exceptionally(e -> {
|
||||||
plugin.log(Level.ERROR, "An error occurred whilst parsing placeholders: " + e.getMessage());
|
plugin.log(Level.ERROR, "An error occurred whilst parsing placeholders: " + e.getMessage());
|
||||||
return Map.of();
|
return Map.of();
|
||||||
})
|
})
|
||||||
|
@ -30,7 +30,7 @@ import java.util.Optional;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class Role implements Comparable<Role> {
|
public class Role implements Comparable<Role> {
|
||||||
|
|
||||||
public static final int DEFAULT_WEIGHT = 0;
|
public static final int DEFAULT_WEIGHT = -1;
|
||||||
public static final Role DEFAULT_ROLE = new Role(DEFAULT_WEIGHT, null, null, null, null);
|
public static final Role DEFAULT_ROLE = new Role(DEFAULT_WEIGHT, null, null, null, null);
|
||||||
@Getter
|
@Getter
|
||||||
private final int weight;
|
private final int weight;
|
||||||
@ -65,8 +65,11 @@ public class Role implements Comparable<Role> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected String getWeightString() {
|
protected Optional<String> getWeightString() {
|
||||||
return Integer.toString(weight);
|
if (weight == -1) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
return Optional.of(Integer.toString(weight));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -96,7 +96,7 @@ public final class TabPlayer implements Comparable<TabPlayer> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public String getRoleWeightString() {
|
public Optional<String> getRoleWeightString() {
|
||||||
return getRole().getWeightString();
|
return getRole().getWeightString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,7 +263,7 @@ public final class TabPlayer implements Comparable<TabPlayer> {
|
|||||||
@Override
|
@Override
|
||||||
public int compareTo(@NotNull TabPlayer o) {
|
public int compareTo(@NotNull TabPlayer o) {
|
||||||
final int roleDifference = role.compareTo(o.role);
|
final int roleDifference = role.compareTo(o.role);
|
||||||
if (roleDifference == 0) {
|
if (roleDifference <= 0) {
|
||||||
return player.getUsername().compareTo(o.player.getUsername());
|
return player.getUsername().compareTo(o.player.getUsername());
|
||||||
}
|
}
|
||||||
return roleDifference;
|
return roleDifference;
|
||||||
|
@ -146,15 +146,12 @@ public class TabListListener {
|
|||||||
|
|
||||||
final Group group = groupOptional.get();
|
final Group group = groupOptional.get();
|
||||||
plugin.getScoreboardManager().resetCache(joined, group);
|
plugin.getScoreboardManager().resetCache(joined, group);
|
||||||
if (justQuit.contains(joined.getUniqueId())) {
|
|
||||||
|
final int delay = justQuit.contains(joined.getUniqueId()) ? 100 : 250;
|
||||||
plugin.getServer().getScheduler().buildTask(plugin,
|
plugin.getServer().getScheduler().buildTask(plugin,
|
||||||
() -> tabList.joinPlayer(joined, group))
|
() -> tabList.joinPlayer(joined, group))
|
||||||
.delay(250, TimeUnit.MILLISECONDS)
|
.delay(delay, TimeUnit.MILLISECONDS)
|
||||||
.schedule();
|
.schedule();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
tabList.joinPlayer(joined, group);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
|
Loading…
Reference in New Issue
Block a user