diff --git a/pom.xml b/pom.xml
index c554ed6..8a0b76d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,13 +7,15 @@
com.rappytv.labyutils
LabyUtils
1.0.1
+ A simple plugin to utilize LabyMod's server API without coding knowledge.
+ https://github.com/RappyPlugins/LabyUtils#readme
jar
LabyUtils
- 17
- 1.0.3
+ 11
+ 1.0.4
UTF-8
@@ -25,8 +27,8 @@
maven-compiler-plugin
3.13.0
- 11
- 11
+ ${java.version}
+ ${java.version}
@@ -56,6 +58,10 @@
spigotmc-repo
https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+
+ papermc
+ https://repo.papermc.io/repository/maven-public/
+
sonatype
https://oss.sonatype.org/content/groups/public/
@@ -87,6 +93,12 @@
1.12-SNAPSHOT
provided
+
+ com.velocitypowered
+ velocity-api
+ 3.3.0-SNAPSHOT
+ provided
+
net.labymod.serverapi
server-bukkit
@@ -97,10 +109,16 @@
server-bungeecord
${labymod.serverApiVersion}
+
+ net.labymod.serverapi
+ server-velocity
+ ${labymod.serverApiVersion}
+
org.jetbrains
annotations
24.1.0
+ provided
com.google.code.gson
diff --git a/src/main/java/com/rappytv/labyutils/bukkit/LabyUtilsBukkit.java b/src/main/java/com/rappytv/labyutils/bukkit/LabyUtilsBukkit.java
index 0876ecc..ac6a09a 100644
--- a/src/main/java/com/rappytv/labyutils/bukkit/LabyUtilsBukkit.java
+++ b/src/main/java/com/rappytv/labyutils/bukkit/LabyUtilsBukkit.java
@@ -8,7 +8,9 @@
import com.rappytv.labyutils.bukkit.listeners.PlayerListener;
import com.rappytv.labyutils.common.ILabyUtilsPlugin;
import io.sentry.Sentry;
+import net.labymod.serverapi.api.logger.ProtocolPlatformLogger;
import net.labymod.serverapi.server.bukkit.LabyModProtocolService;
+import net.labymod.serverapi.server.common.JavaProtocolLogger;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.plugin.PluginManager;
@@ -24,12 +26,14 @@ public final class LabyUtilsBukkit extends JavaPlugin implements ILabyUtilsPlugi
private Economy economy = null;
private boolean usingPapi = false;
private BukkitConfigManager configManager;
+ private ProtocolPlatformLogger logger;
@Override
public void onEnable() {
instance = this;
saveDefaultConfig();
configManager = new BukkitConfigManager(this);
+ logger = new JavaProtocolLogger(getLogger());
if(configManager.isSentryEnabled()) {
getLogger().info("Thanks for enabling Sentry! Loading...");
initializeSentry(getDescription().getVersion());
@@ -97,4 +101,9 @@ private boolean loadPlaceholderAPI() {
usingPapi = getServer().getPluginManager().getPlugin("PlaceholderAPI") != null;
return usingPapi;
}
+
+ @Override
+ public ProtocolPlatformLogger logger() {
+ return logger;
+ }
}
diff --git a/src/main/java/com/rappytv/labyutils/bungee/LabyUtilsBungee.java b/src/main/java/com/rappytv/labyutils/bungee/LabyUtilsBungee.java
index 7b222dd..6cddb8e 100644
--- a/src/main/java/com/rappytv/labyutils/bungee/LabyUtilsBungee.java
+++ b/src/main/java/com/rappytv/labyutils/bungee/LabyUtilsBungee.java
@@ -4,18 +4,22 @@
import com.rappytv.labyutils.bungee.commands.ReloadCommand;
import com.rappytv.labyutils.bungee.listener.PlayerListener;
import com.rappytv.labyutils.common.ILabyUtilsPlugin;
+import net.labymod.serverapi.api.logger.ProtocolPlatformLogger;
import net.labymod.serverapi.server.bungeecord.LabyModProtocolService;
+import net.labymod.serverapi.server.common.JavaProtocolLogger;
import net.md_5.bungee.api.plugin.Plugin;
public final class LabyUtilsBungee extends Plugin implements ILabyUtilsPlugin {
private static LabyUtilsBungee instance;
private BungeeConfigManager configManager;
+ private ProtocolPlatformLogger platformLogger;
@Override
public void onEnable() {
instance = this;
configManager = new BungeeConfigManager(new LabyUtilsConfig(this));
+ platformLogger = new JavaProtocolLogger(getLogger());
try {
LabyModProtocolService.initialize(this);
getLogger().info("LabyMod protocol service initialized.");
@@ -38,4 +42,9 @@ public static String getPrefix() {
public BungeeConfigManager getConfigManager() {
return configManager;
}
+
+ @Override
+ public ProtocolPlatformLogger logger() {
+ return platformLogger;
+ }
}
diff --git a/src/main/java/com/rappytv/labyutils/common/ILabyUtilsPlugin.java b/src/main/java/com/rappytv/labyutils/common/ILabyUtilsPlugin.java
index 48e41b3..b56d2c5 100644
--- a/src/main/java/com/rappytv/labyutils/common/ILabyUtilsPlugin.java
+++ b/src/main/java/com/rappytv/labyutils/common/ILabyUtilsPlugin.java
@@ -3,6 +3,7 @@
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.sentry.Sentry;
+import net.labymod.serverapi.api.logger.ProtocolPlatformLogger;
import net.labymod.serverapi.core.model.display.TabListFlag;
import org.jetbrains.annotations.Nullable;
@@ -19,21 +20,20 @@
import java.util.Map;
import java.util.UUID;
import java.util.function.Consumer;
-import java.util.logging.Logger;
public interface ILabyUtilsPlugin {
Map cachedFlags = new HashMap<>();
Gson gson = new Gson();
HttpClient client = HttpClient.newHttpClient();
- Logger getLogger();
+ ProtocolPlatformLogger logger();
default void initializeSentry(String version) {
Sentry.init(options -> {
options.setDsn("https://d8bbca67730b0a4d93cf0e7d179ef12f@sentry.rappytv.com/4");
options.setTracesSampleRate(1.0);
options.setRelease(version);
- getLogger().info("Sentry loaded!");
+ logger().info("Sentry loaded!");
});
}
@@ -70,13 +70,13 @@ default void getCountryCode(UUID uuid, InetSocketAddress address, Consumer {
Sentry.captureException(throwable);
- getLogger().warning("Failed to get country code of " + host);
+ logger().warn("Failed to get country code of " + host);
consumer.accept(null);
return null;
});
} catch (Exception e) {
Sentry.captureException(e);
- getLogger().warning("Failed to get country code of " + host);
+ logger().warn("Failed to get country code of " + host);
consumer.accept(null);
}
}
diff --git a/src/main/java/com/rappytv/labyutils/velocity/LabyUtilsVelocity.java b/src/main/java/com/rappytv/labyutils/velocity/LabyUtilsVelocity.java
new file mode 100644
index 0000000..a8d8ad5
--- /dev/null
+++ b/src/main/java/com/rappytv/labyutils/velocity/LabyUtilsVelocity.java
@@ -0,0 +1,85 @@
+package com.rappytv.labyutils.velocity;
+
+import com.rappytv.labyutils.common.ILabyUtilsPlugin;
+import com.rappytv.labyutils.velocity.commands.LabyInfoCommand;
+import com.rappytv.labyutils.velocity.commands.ReloadCommand;
+import com.rappytv.labyutils.velocity.listener.PlayerListener;
+import com.velocitypowered.api.command.BrigadierCommand;
+import com.velocitypowered.api.command.CommandManager;
+import com.velocitypowered.api.event.Subscribe;
+import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
+import com.velocitypowered.api.plugin.PluginContainer;
+import com.velocitypowered.api.plugin.annotation.DataDirectory;
+import com.velocitypowered.api.proxy.ProxyServer;
+import net.kyori.adventure.text.TextComponent;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
+import net.labymod.serverapi.api.logger.ProtocolPlatformLogger;
+import net.labymod.serverapi.server.velocity.LabyModProtocolService;
+import net.labymod.serverapi.server.velocity.Slf4jPlatformLogger;
+import org.slf4j.Logger;
+
+import javax.inject.Inject;
+import java.nio.file.Path;
+import java.util.Optional;
+
+public final class LabyUtilsVelocity implements ILabyUtilsPlugin {
+
+ private static LabyUtilsVelocity instance;
+ private VelocityConfigManager configManager;
+ private final ProxyServer server;
+ private final ProtocolPlatformLogger logger;
+ private final Logger serverLogger;
+ private final Path dataDirectory;
+
+ @Inject
+ public LabyUtilsVelocity(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) {
+ this.server = server;
+ this.serverLogger = logger;
+ this.logger = new Slf4jPlatformLogger(logger);
+ this.dataDirectory = dataDirectory;
+ }
+
+ @Subscribe
+ public void onProxyInitialization(ProxyInitializeEvent event) {
+ instance = this;
+ configManager = new VelocityConfigManager(/*new VelocityConfig(this)*/);
+ try {
+ LabyModProtocolService.initialize(this, server, serverLogger);
+ logger.info("LabyMod protocol service initialized.");
+ } catch (IllegalStateException e) {
+ logger.info("LabyMod protocol service already initialized.");
+ }
+ if(configManager.isSentryEnabled()) {
+ String version = "?";
+ Optional plugin = server.getPluginManager().getPlugin("labyutils");
+ if(plugin.isPresent() && plugin.get().getDescription().getVersion().isPresent()) {
+ version = plugin.get().getDescription().getVersion().get();
+ }
+ logger.info("Thanks for enabling Sentry! Loading...");
+ initializeSentry(version);
+ }
+ CommandManager manager = server.getCommandManager();
+ BrigadierCommand infoCommand = LabyInfoCommand.createBrigadierCommand(this);
+ BrigadierCommand reloadCommand = ReloadCommand.createBrigadierCommand(this);
+ manager.register(manager.metaBuilder(infoCommand).build(), infoCommand);
+ manager.register(manager.metaBuilder(reloadCommand).build(), reloadCommand);
+ server.getEventManager().register(this, new PlayerListener(this));
+ }
+
+ @Override
+ public ProtocolPlatformLogger logger() {
+ return logger;
+ }
+
+ public static TextComponent getPrefix() {
+ return LegacyComponentSerializer.legacyAmpersand().deserialize(instance.getConfigManager().getPrefix());
+ }
+
+ public VelocityConfigManager getConfigManager() {
+ return configManager;
+ }
+
+ public ProxyServer getServer() {
+ return server;
+ }
+}
diff --git a/src/main/java/com/rappytv/labyutils/velocity/VelocityConfig.java b/src/main/java/com/rappytv/labyutils/velocity/VelocityConfig.java
new file mode 100644
index 0000000..fb5fa4a
--- /dev/null
+++ b/src/main/java/com/rappytv/labyutils/velocity/VelocityConfig.java
@@ -0,0 +1,4 @@
+package com.rappytv.labyutils.velocity;
+
+public class VelocityConfig { // TODO: Implement config
+}
diff --git a/src/main/java/com/rappytv/labyutils/velocity/VelocityConfigManager.java b/src/main/java/com/rappytv/labyutils/velocity/VelocityConfigManager.java
new file mode 100644
index 0000000..c4dc016
--- /dev/null
+++ b/src/main/java/com/rappytv/labyutils/velocity/VelocityConfigManager.java
@@ -0,0 +1,126 @@
+package com.rappytv.labyutils.velocity;
+
+import com.rappytv.labyutils.common.IConfigManager;
+
+public class VelocityConfigManager implements IConfigManager {
+
+ @Override
+ public void reloadConfig() {
+
+ }
+
+ @Override
+ public String getPrefix() {
+ return "";
+ }
+
+ @Override
+ public boolean isSentryEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isWelcomeLogEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isWelcomeMessageEnabled() {
+ return true;
+ }
+
+ @Override
+ public String getWelcomeMessage() {
+ return "";
+ }
+
+ @Override
+ public boolean isBannerEnabled() {
+ return true;
+ }
+
+ @Override
+ public String getBannerUrl() {
+ return "";
+ }
+
+ @Override
+ public int getEconomyUpdateInterval() {
+ return 0;
+ }
+
+ @Override
+ public boolean showCashBalance() {
+ return true;
+ }
+
+ @Override
+ public boolean showBankBalance() {
+ return true;
+ }
+
+ @Override
+ public boolean areFlagsEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean areSubtitlesEnabled() {
+ return true;
+ }
+
+ @Override
+ public Object getSubtitles() {
+ return null;
+ }
+
+ @Override
+ public boolean areInteractionsEnabled() {
+ return true;
+ }
+
+ @Override
+ public Object getInteractionBullets() {
+ return null;
+ }
+
+ @Override
+ public boolean isAddonManagementEnabled() {
+ return true;
+ }
+
+ @Override
+ public Object getAddonManagement() {
+ return null;
+ }
+
+ @Override
+ public String getAddonKickMessage() {
+ return "";
+ }
+
+ @Override
+ public boolean arePermissionsEnabled() {
+ return true;
+ }
+
+ @Override
+ public Object getPermissions() {
+ return null;
+ }
+
+ @Override
+ public boolean isRpcEnabled() {
+ return true;
+ }
+
+ @Override
+ public String getRpcText() {
+ return "";
+ }
+
+ @Override
+ public boolean showRpcJoinTime() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/rappytv/labyutils/velocity/commands/LabyInfoCommand.java b/src/main/java/com/rappytv/labyutils/velocity/commands/LabyInfoCommand.java
new file mode 100644
index 0000000..eeb24db
--- /dev/null
+++ b/src/main/java/com/rappytv/labyutils/velocity/commands/LabyInfoCommand.java
@@ -0,0 +1,119 @@
+package com.rappytv.labyutils.velocity.commands;
+
+import com.mojang.brigadier.Command;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import com.mojang.brigadier.tree.LiteralCommandNode;
+import com.rappytv.labyutils.common.ILabyUtilsPlugin;
+import com.rappytv.labyutils.velocity.LabyUtilsVelocity;
+import com.velocitypowered.api.command.BrigadierCommand;
+import com.velocitypowered.api.command.CommandSource;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
+import net.labymod.serverapi.api.model.component.ServerAPITextComponent;
+import net.labymod.serverapi.server.velocity.LabyModPlayer;
+import net.labymod.serverapi.server.velocity.LabyModProtocolService;
+
+public class LabyInfoCommand {
+
+ @SuppressWarnings("ResultOfMethodCallIgnored")
+ public static BrigadierCommand createBrigadierCommand(final LabyUtilsVelocity plugin) {
+ Component prefix = LabyUtilsVelocity.getPrefix();
+ LiteralCommandNode infoNode = BrigadierCommand.literalArgumentBuilder("labyinfo")
+ .requires(source -> source.hasPermission("labyutils.info"))
+ .executes(context -> {
+ plugin.getConfigManager().reloadConfig();
+ context.getSource().sendMessage(prefix.append(Component.text(
+ "Please enter a player name!",
+ NamedTextColor.RED
+ )));
+
+ return Command.SINGLE_SUCCESS;
+ })
+ .then(BrigadierCommand.requiredArgumentBuilder("player", StringArgumentType.word())
+ .suggests((ctx, builder) -> {
+ plugin.getServer().getAllPlayers().forEach(player -> builder.suggest(player.getUsername()));
+ return builder.buildFuture();
+ })
+ .executes(context -> {
+ String name = context.getArgument("player", String.class);
+ plugin.getServer().getPlayer(name).ifPresentOrElse(player -> {
+ Component response = Component.empty()
+ .append(prefix)
+ .append(Component.text(
+ "LabyInfo of " + player.getUsername(), NamedTextColor.GOLD
+ ))
+ .appendNewline()
+ .append(prefix)
+ .append(Component.text("UUID: ", NamedTextColor.AQUA))
+ .append(Component.text(player.getUniqueId().toString(), NamedTextColor.GRAY))
+ .appendNewline()
+ .append(prefix)
+ .append(Component.text("Using LabyMod: ", NamedTextColor.AQUA));
+ LabyModPlayer labyPlayer = LabyModProtocolService.get().getPlayer(player.getUniqueId());
+ if(labyPlayer == null) {
+ context.getSource().sendMessage(response.append(
+ Component.text("No", NamedTextColor.RED)
+ ));
+ return;
+ }
+ response.append(Component.text("Yes", NamedTextColor.GREEN));
+ if(plugin.getConfigManager().areSubtitlesEnabled()
+ && context.getSource().hasPermission("labyutils.info.subtitle")) {
+ ServerAPITextComponent component = (ServerAPITextComponent) labyPlayer.subtitle().getText();
+ String subtitle = component != null ? component.getText() : "--";
+ response
+ .appendNewline()
+ .append(prefix)
+ .append(Component.text("Server subtitle: ", NamedTextColor.AQUA))
+ .append(LegacyComponentSerializer.legacyAmpersand().deserialize(
+ "§7" + subtitle
+ ));
+ }
+ if(context.getSource().hasPermission("labyutils.info.economy")) {
+ response
+ .appendNewline()
+ .append(prefix)
+ .append(Component.text("Economy cash: ", NamedTextColor.AQUA))
+ .append(Component.text(
+ plugin.formatNumber(labyPlayer.cashEconomy().getBalance()),
+ NamedTextColor.GRAY
+ ))
+ .appendNewline()
+ .append(prefix)
+ .append(Component.text("Economy bank: ", NamedTextColor.AQUA))
+ .append(Component.text(
+ plugin.formatNumber(labyPlayer.bankEconomy().getBalance()),
+ NamedTextColor.GRAY
+ ));
+ }
+ if(context.getSource().hasPermission("labyutils.info.version")) {
+ response
+ .appendNewline()
+ .append(prefix)
+ .append(Component.text("LabyMod version: ", NamedTextColor.AQUA))
+ .append(Component.text(labyPlayer.getLabyModVersion()));
+ }
+ if(context.getSource().hasPermission("labyutils.info.region")) {
+ String flag = ILabyUtilsPlugin.cachedFlags.containsKey(player.getUniqueId())
+ ? ILabyUtilsPlugin.cachedFlags.get(player.getUniqueId()).name()
+ : "--";
+ response
+ .appendNewline()
+ .append(prefix)
+ .append(Component.text("Region: ", NamedTextColor.AQUA))
+ .append(Component.text(flag, NamedTextColor.GRAY));
+ }
+ context.getSource().sendMessage(response);
+ }, () -> context.getSource().sendMessage(Component.text(
+ LabyUtilsVelocity.getPrefix() + "§cThis player was not found!"
+ )));
+
+ return Command.SINGLE_SUCCESS;
+ })
+ )
+ .build();
+
+ return new BrigadierCommand(infoNode);
+ }
+}
diff --git a/src/main/java/com/rappytv/labyutils/velocity/commands/ReloadCommand.java b/src/main/java/com/rappytv/labyutils/velocity/commands/ReloadCommand.java
new file mode 100644
index 0000000..d8316c7
--- /dev/null
+++ b/src/main/java/com/rappytv/labyutils/velocity/commands/ReloadCommand.java
@@ -0,0 +1,29 @@
+package com.rappytv.labyutils.velocity.commands;
+
+import com.mojang.brigadier.Command;
+import com.mojang.brigadier.tree.LiteralCommandNode;
+import com.rappytv.labyutils.velocity.LabyUtilsVelocity;
+import com.velocitypowered.api.command.BrigadierCommand;
+import com.velocitypowered.api.command.CommandSource;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
+
+public class ReloadCommand {
+
+ public static BrigadierCommand createBrigadierCommand(final LabyUtilsVelocity plugin) {
+ LiteralCommandNode reloadNode = BrigadierCommand.literalArgumentBuilder("labyutils")
+ .requires(source -> source.hasPermission("labyutils.reload"))
+ .executes(context -> {
+ plugin.getConfigManager().reloadConfig();
+ context.getSource().sendMessage(LabyUtilsVelocity.getPrefix().append(Component.text(
+ "Addon config successfully reloaded!",
+ NamedTextColor.GRAY
+ )));
+
+ return Command.SINGLE_SUCCESS;
+ })
+ .build();
+
+ return new BrigadierCommand(reloadNode);
+ }
+}
diff --git a/src/main/java/com/rappytv/labyutils/velocity/listener/PlayerListener.java b/src/main/java/com/rappytv/labyutils/velocity/listener/PlayerListener.java
new file mode 100644
index 0000000..ecde32a
--- /dev/null
+++ b/src/main/java/com/rappytv/labyutils/velocity/listener/PlayerListener.java
@@ -0,0 +1,213 @@
+package com.rappytv.labyutils.velocity.listener;
+
+import com.rappytv.labyutils.common.listeners.IPlayerListener;
+import com.rappytv.labyutils.velocity.LabyUtilsVelocity;
+import com.velocitypowered.api.event.Subscribe;
+import net.kyori.adventure.text.Component;
+import net.labymod.serverapi.api.model.component.ServerAPIComponent;
+import net.labymod.serverapi.core.model.feature.DiscordRPC;
+import net.labymod.serverapi.core.model.feature.InteractionMenuEntry;
+import net.labymod.serverapi.core.model.moderation.Permission;
+import net.labymod.serverapi.core.model.moderation.RecommendedAddon;
+import net.labymod.serverapi.server.velocity.LabyModPlayer;
+import net.labymod.serverapi.server.velocity.event.LabyModPlayerJoinEvent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlayerListener implements IPlayerListener {
+
+ private final LabyUtilsVelocity plugin;
+
+ public PlayerListener(LabyUtilsVelocity plugin) {
+ this.plugin = plugin;
+ }
+
+ @Subscribe(async = false)
+ @Override
+ public void onPlayerJoin(LabyModPlayerJoinEvent event) {
+ LabyModPlayer labyPlayer = event.labyModPlayer();
+
+ logJoin(labyPlayer);
+ sendWelcomer(labyPlayer);
+ setBanner(labyPlayer);
+ setFlag(labyPlayer);
+ setSubtitle(labyPlayer);
+ setInteractionBullets(labyPlayer);
+ manageAddons(labyPlayer);
+ managePermissions(labyPlayer);
+ setRPC(labyPlayer);
+ }
+
+ @Override
+ public void logJoin(LabyModPlayer player) {
+ if(!plugin.getConfigManager().isWelcomeLogEnabled()) return;
+ plugin.logger().info(String.format(
+ "%s just joined with LabyMod v%s!",
+ player.getPlayer().getUsername(),
+ player.getLabyModVersion()
+ ));
+ }
+
+ @Override
+ public void sendWelcomer(LabyModPlayer player) {
+ if(!plugin.getConfigManager().isWelcomeMessageEnabled()) return;
+ String text = plugin
+ .getConfigManager()
+ .getWelcomeMessage()
+ .replace("", plugin.getConfigManager().getPrefix());
+ player.getPlayer().sendMessage(Component.text(text));
+ }
+
+ @Override
+ public void setBanner(LabyModPlayer player) {
+ if(!plugin.getConfigManager().isBannerEnabled()) return;
+ player.sendTabListBanner(plugin.getConfigManager().getBannerUrl());
+ }
+
+ @Override
+ public void setFlag(LabyModPlayer player) {
+ plugin.getCountryCode(player.getUniqueId(), player.getPlayer().getRemoteAddress(), (flag) -> {
+ if(flag != null && plugin.getConfigManager().areFlagsEnabled()) {
+ plugin.getServer().getScheduler().buildTask(plugin, () -> player.setTabListFlag(flag)).schedule();
+ }
+ });
+ }
+
+ @Override
+ public void setSubtitle(LabyModPlayer player) {
+ if(!plugin.getConfigManager().areSubtitlesEnabled()) return;
+// Configuration section = plugin
+// .getConfigManager()
+// .getSubtitles();
+//
+// if(section == null) return;
+// ServerAPIComponent component = null;
+// double size = -1;
+//
+// for(String key : section.getKeys()) {
+// String permission = section.getString(key + ".permission");
+// String text = section.getString(key + ".text");
+// if(permission != null && text != null && player.getPlayer().hasPermission(permission)) {
+// component = ServerAPIComponent.text(text);
+// size = section.getDouble(key + ".size");
+// break;
+// }
+// }
+// if(component == null || size <= 0) {
+// player.resetSubtitle();
+// return;
+// }
+//
+// player.updateSubtitle(component, size);
+ }
+
+ @Override
+ public void setInteractionBullets(LabyModPlayer player) {
+ if(!plugin.getConfigManager().areInteractionsEnabled()) return;
+// List entries = new ArrayList<>();
+// Configuration section = plugin
+// .getConfigManager()
+// .getInteractionBullets();
+//
+// for(String key : section.getKeys()) {
+// if(section.contains(key + ".permission")
+// && !player.getPlayer().hasPermission(section.getString(key + ".permission"))) continue;
+// try {
+// entries.add((InteractionMenuEntry.create(
+// ServerAPIComponent.text(section.getString(key + ".title")),
+// InteractionMenuEntry.InteractionMenuType.valueOf(
+// section.getString(key + ".type").toUpperCase().replace(' ', '_')
+// ),
+// section.getString(key + ".value")
+// )));
+// } catch (Exception e) {
+// plugin.getLogger().warning("Failed to build interaction bullet with id " + key);
+// }
+// }
+//
+// if(!entries.isEmpty()) player.sendInteractionMenuEntries(entries);
+ }
+
+ @Override
+ public void manageAddons(LabyModPlayer player) {
+ if(!plugin.getConfigManager().isAddonManagementEnabled()) return;
+// List recommendedAddons = new ArrayList<>();
+// List disabledAddons = new ArrayList<>();
+//
+// Configuration section = plugin
+// .getConfigManager()
+// .getAddonManagement();
+//
+// if(section == null) return;
+//
+// for(String key : section.getKeys()) {
+// boolean canBypass = player.getPlayer().hasPermission("labyutils.bypass.*")
+// || player.getPlayer().hasPermission("labyutils.bypass." + key);
+// if(canBypass) continue;
+// switch (section.getString(key, "none").toLowerCase()) {
+// case "recommend":
+// recommendedAddons.add(RecommendedAddon.of(key, false));
+// break;
+// case "require":
+// recommendedAddons.add(RecommendedAddon.of(key, true));
+// break;
+// case "disable":
+// disabledAddons.add(key);
+// break;
+// }
+// }
+//
+// if(!recommendedAddons.isEmpty()) {
+// player.sendAddonRecommendations(recommendedAddons, response -> {
+// if(response.isInitial()) return;
+// if(!response.isAllInstalled()) {
+// if(player.getPlayer().isActive()) player.getPlayer().disconnect(
+// Component.text(String.format(
+// plugin.getConfigManager().getAddonKickMessage(),
+// String.join(", ", response.getMissingAddons())
+// ))
+// );
+// }
+// });
+// }
+// if(!disabledAddons.isEmpty()) {
+// player.disableAddons(disabledAddons);
+// }
+ }
+
+ @Override
+ public void managePermissions(LabyModPlayer player) {
+ if(!plugin.getConfigManager().arePermissionsEnabled()) return;
+ // TODO: Find error source
+// List permissions = new ArrayList<>();
+// Configuration section = plugin
+// .getConfigManager()
+// .getPermissions();
+//
+// if(section == null) return;
+//
+// for(String key : section.getKeys()) {
+// boolean hasPermission = player.getPlayer().hasPermission("labyutils.permissions.*")
+// || player.getPlayer().hasPermission("labyutils.permissions." + section.getString(key));
+// permissions.add(hasPermission ? Permission.of(key).allow() : Permission.of(key).deny());
+// }
+//
+// player.sendPermissions(permissions);
+ }
+
+ @Override
+ public void setRPC(LabyModPlayer player) {
+ if(!plugin.getConfigManager().isRpcEnabled()) return;
+// String text = plugin.getConfigManager().getRpcText();
+// boolean showTime = plugin.getConfigManager().showRpcJoinTime();
+//
+// if(text == null) return;
+//
+// DiscordRPC rpc = showTime
+// ? DiscordRPC.createWithStart(text, System.currentTimeMillis())
+// : DiscordRPC.create(text);
+//
+// player.sendDiscordRPC(rpc);
+ }
+}
diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml
index 746ad6b..d502015 100644
--- a/src/main/resources/bungee.yml
+++ b/src/main/resources/bungee.yml
@@ -1,5 +1,5 @@
-name: LabyUtils
+name: ${project.artifactId}
version: '${project.version}'
main: com.rappytv.labyutils.bungee.LabyUtilsBungee
author: RappyTV
-description: A simple plugin to utilize LabyMod's server API without coding knowledge.
\ No newline at end of file
+description: ${project.description}
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 2ef5329..285c9f6 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,9 +1,10 @@
-name: LabyUtils
+name: ${project.artifactId}
version: '${project.version}'
main: com.rappytv.labyutils.bukkit.LabyUtilsBukkit
api-version: '1.13'
authors: [ RappyTV ]
-description: A simple plugin to utilize LabyMod's server API without coding knowledge.
+description: ${project.description}
+website: ${project.url}
softdepend:
- Vault
- PlaceholderAPI
diff --git a/src/main/resources/velocity-plugin.json b/src/main/resources/velocity-plugin.json
new file mode 100644
index 0000000..4d48d59
--- /dev/null
+++ b/src/main/resources/velocity-plugin.json
@@ -0,0 +1,12 @@
+{
+ "id": "labyutils",
+ "name": "${project.artifactId}",
+ "version": "${project.version}",
+ "description": "${project.description}",
+ "url": "${project.url}",
+ "authors": [
+ "RappyTV"
+ ],
+ "dependencies": [],
+ "main": "com.rappytv.labyutils.velocity.LabyUtilsVelocity"
+}
\ No newline at end of file