forked from Upstream/Velocitab
Reload and About Commands (#32)
This commit is contained in:
parent
81d4a9a711
commit
88d1c4f6cf
@ -35,6 +35,7 @@ dependencies {
|
|||||||
implementation 'net.william278:Annotaml:2.0.1'
|
implementation 'net.william278:Annotaml:2.0.1'
|
||||||
implementation 'dev.dejvokep:boosted-yaml:1.3.1'
|
implementation 'dev.dejvokep:boosted-yaml:1.3.1'
|
||||||
implementation 'de.themoep:minedown-adventure:1.7.2-SNAPSHOT'
|
implementation 'de.themoep:minedown-adventure:1.7.2-SNAPSHOT'
|
||||||
|
implementation 'net.william278:DesertWell:1.1.1'
|
||||||
|
|
||||||
annotationProcessor 'org.projectlombok:lombok:1.18.26'
|
annotationProcessor 'org.projectlombok:lombok:1.18.26'
|
||||||
}
|
}
|
||||||
@ -59,6 +60,7 @@ shadowJar {
|
|||||||
relocate 'de.themoep', 'net.william278.velocitab.libraries'
|
relocate 'de.themoep', 'net.william278.velocitab.libraries'
|
||||||
relocate 'dev.dejvokep.boostedyaml', 'net.william278.velocitab.libraries'
|
relocate 'dev.dejvokep.boostedyaml', 'net.william278.velocitab.libraries'
|
||||||
relocate 'net.william278.annotaml', 'net.william278.velocitab.libraries.annotaml'
|
relocate 'net.william278.annotaml', 'net.william278.velocitab.libraries.annotaml'
|
||||||
|
relocate 'net.william278.desertwell', 'net.william278.velocitab.libraries.desertwell'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
//noinspection GroovyAssignabilityCheck
|
//noinspection GroovyAssignabilityCheck
|
||||||
|
@ -4,10 +4,12 @@ import com.google.inject.Inject;
|
|||||||
import com.velocitypowered.api.event.Subscribe;
|
import com.velocitypowered.api.event.Subscribe;
|
||||||
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
||||||
import com.velocitypowered.api.plugin.Plugin;
|
import com.velocitypowered.api.plugin.Plugin;
|
||||||
|
import com.velocitypowered.api.plugin.PluginDescription;
|
||||||
import com.velocitypowered.api.plugin.annotation.DataDirectory;
|
import com.velocitypowered.api.plugin.annotation.DataDirectory;
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import com.velocitypowered.api.proxy.Player;
|
||||||
import com.velocitypowered.api.proxy.ProxyServer;
|
import com.velocitypowered.api.proxy.ProxyServer;
|
||||||
import net.william278.annotaml.Annotaml;
|
import net.william278.annotaml.Annotaml;
|
||||||
|
import net.william278.velocitab.commands.VelocitabCommand;
|
||||||
import net.william278.velocitab.config.Formatter;
|
import net.william278.velocitab.config.Formatter;
|
||||||
import net.william278.velocitab.config.Settings;
|
import net.william278.velocitab.config.Settings;
|
||||||
import net.william278.velocitab.hook.Hook;
|
import net.william278.velocitab.hook.Hook;
|
||||||
@ -25,10 +27,7 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@Plugin(id = "velocitab")
|
@Plugin(id = "velocitab")
|
||||||
public class Velocitab {
|
public class Velocitab {
|
||||||
@ -54,6 +53,7 @@ public class Velocitab {
|
|||||||
loadHooks();
|
loadHooks();
|
||||||
prepareScoreboardManager();
|
prepareScoreboardManager();
|
||||||
prepareTabList();
|
prepareTabList();
|
||||||
|
registerCommands();
|
||||||
logger.info("Successfully enabled Velocitab");
|
logger.info("Successfully enabled Velocitab");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ public class Velocitab {
|
|||||||
return getSettings().getFormatter();
|
return getSettings().getFormatter();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadSettings() {
|
public void loadSettings() {
|
||||||
try {
|
try {
|
||||||
settings = Annotaml.create(
|
settings = Annotaml.create(
|
||||||
new File(dataDirectory.toFile(), "config.yml"),
|
new File(dataDirectory.toFile(), "config.yml"),
|
||||||
@ -143,4 +143,13 @@ public class Velocitab {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PluginDescription getDescription() {
|
||||||
|
return server.getPluginManager().getPlugin("velocitab").get().getDescription();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void registerCommands() {
|
||||||
|
server.getCommandManager().register(
|
||||||
|
server.getCommandManager().metaBuilder("velocitab").build(),
|
||||||
|
new VelocitabCommand(this));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
package net.william278.velocitab.commands;
|
||||||
|
|
||||||
|
import com.velocitypowered.api.command.CommandSource;
|
||||||
|
import com.velocitypowered.api.command.SimpleCommand;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.format.TextColor;
|
||||||
|
import net.william278.desertwell.AboutMenu;
|
||||||
|
import net.william278.desertwell.Version;
|
||||||
|
import net.william278.velocitab.Velocitab;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class VelocitabCommand implements SimpleCommand {
|
||||||
|
private final AboutMenu aboutMenu;
|
||||||
|
private final Velocitab plugin;
|
||||||
|
|
||||||
|
public VelocitabCommand(Velocitab plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.aboutMenu = AboutMenu.create("Velocitab")
|
||||||
|
.withDescription(plugin.getDescription().getDescription().get())
|
||||||
|
.withVersion(Version.fromString(plugin.getDescription().getVersion().get(), "-"))
|
||||||
|
.addAttribution("Author",
|
||||||
|
AboutMenu.Credit.of("William278").withDescription("Click to visit website").withUrl("https://william278.net"))
|
||||||
|
.addAttribution("Contributors",
|
||||||
|
AboutMenu.Credit.of("Ironboundred").withDescription("Coding"),
|
||||||
|
AboutMenu.Credit.of("Emibergo02").withDescription("Coding"))
|
||||||
|
.addButtons(
|
||||||
|
AboutMenu.Link.of("https://william278.net/docs/velocitab").withText("Docs").withIcon("⛏"),
|
||||||
|
AboutMenu.Link.of("https://discord.gg/tVYhJfyDWG").withText("Discord").withIcon("⭐").withColor("#6773f5"),
|
||||||
|
AboutMenu.Link.of("https://modrinth.com/plugin/velocitab").withText("Modrinth").withIcon("X").withColor("#589143"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Invocation invocation) {
|
||||||
|
if (invocation.arguments().length >= 1) {
|
||||||
|
if (invocation.arguments()[0].equalsIgnoreCase("reload")) {
|
||||||
|
reloadSettings(invocation.source());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sendAboutInfo(invocation.source());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> suggest(Invocation invocation) {
|
||||||
|
if (invocation.source().hasPermission("velocitab.command.reload")) {
|
||||||
|
return List.of("about", "reload");
|
||||||
|
} else {
|
||||||
|
return List.of("about");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendAboutInfo(CommandSource source) {
|
||||||
|
source.sendMessage(aboutMenu.toMineDown().toComponent());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reloadSettings(CommandSource source) {
|
||||||
|
if (source.hasPermission("velocitab.command.reload")) {
|
||||||
|
plugin.loadSettings();
|
||||||
|
plugin.getTabList().reloadUpdate();
|
||||||
|
source.sendMessage(Component.text("Velocitab has been reloaded!").color(TextColor.color(255, 199, 31)));
|
||||||
|
} else {
|
||||||
|
source.sendMessage(Component.text("You do not have permission to use this command"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -8,6 +8,7 @@ import com.velocitypowered.api.proxy.ServerConnection;
|
|||||||
import com.velocitypowered.api.proxy.player.TabList;
|
import com.velocitypowered.api.proxy.player.TabList;
|
||||||
import com.velocitypowered.api.proxy.player.TabListEntry;
|
import com.velocitypowered.api.proxy.player.TabListEntry;
|
||||||
import com.velocitypowered.api.proxy.server.ServerInfo;
|
import com.velocitypowered.api.proxy.server.ServerInfo;
|
||||||
|
import com.velocitypowered.api.scheduler.ScheduledTask;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.william278.velocitab.Velocitab;
|
import net.william278.velocitab.Velocitab;
|
||||||
import net.william278.velocitab.config.Placeholder;
|
import net.william278.velocitab.config.Placeholder;
|
||||||
@ -26,6 +27,7 @@ public class PlayerTabList {
|
|||||||
private final Velocitab plugin;
|
private final Velocitab plugin;
|
||||||
private final ConcurrentLinkedQueue<TabPlayer> players;
|
private final ConcurrentLinkedQueue<TabPlayer> players;
|
||||||
private final ConcurrentLinkedQueue<String> fallbackServers;
|
private final ConcurrentLinkedQueue<String> fallbackServers;
|
||||||
|
private ScheduledTask updateTask;
|
||||||
|
|
||||||
public PlayerTabList(@NotNull Velocitab plugin) {
|
public PlayerTabList(@NotNull Velocitab plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
@ -183,7 +185,7 @@ public class PlayerTabList {
|
|||||||
|
|
||||||
// Update the tab list periodically
|
// Update the tab list periodically
|
||||||
private void updatePeriodically(int updateRate) {
|
private void updatePeriodically(int updateRate) {
|
||||||
plugin.getServer().getScheduler()
|
updateTask = plugin.getServer().getScheduler()
|
||||||
.buildTask(plugin, () -> {
|
.buildTask(plugin, () -> {
|
||||||
if (players.isEmpty()) {
|
if (players.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
@ -197,6 +199,27 @@ public class PlayerTabList {
|
|||||||
.schedule();
|
.schedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update all players since there was a reload of the config
|
||||||
|
public void reloadUpdate() {
|
||||||
|
if (players.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (updateTask != null) {
|
||||||
|
updateTask.cancel();
|
||||||
|
}
|
||||||
|
// If the update time is set to 0 do not schedule the updater
|
||||||
|
if (plugin.getSettings().getUpdateRate() > 0) {
|
||||||
|
this.updatePeriodically(plugin.getSettings().getUpdateRate());
|
||||||
|
} else {
|
||||||
|
players.forEach(player -> {
|
||||||
|
this.updatePlayer(player);
|
||||||
|
player.sendHeaderAndFooter(this);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the servers in the same group as the given server
|
* Get the servers in the same group as the given server
|
||||||
* If the server is not in a group, use fallback
|
* If the server is not in a group, use fallback
|
||||||
|
Loading…
Reference in New Issue
Block a user