From 43b1d643e58a4e478db2fd2a092a689e4920280f Mon Sep 17 00:00:00 2001 From: AlphaMSq Date: Mon, 13 Nov 2023 00:37:56 +0300 Subject: [PATCH] Add settings command & status placeholder. Optimize code. --- .../java/io/greitan/mineserv/GeyserVoice.java | 92 ++++++++-- .../mineserv/commands/VoiceCommand.java | 164 ++++++++++-------- .../listeners/PlayerJoinListener.java | 51 +++--- .../io/greitan/mineserv/network/Network.java | 30 ---- .../greitan/mineserv/tasks/PositionsTask.java | 27 ++- .../io/greitan/mineserv/utils/Language.java | 39 +++-- .../greitan/mineserv/utils/Placeholder.java | 47 +++++ src/main/resources/config.yml | 3 + src/main/resources/locale/en.yml | 2 +- src/main/resources/locale/ru.yml | 2 +- src/main/resources/plugin.yml | 3 + 11 files changed, 288 insertions(+), 172 deletions(-) create mode 100644 src/main/java/io/greitan/mineserv/utils/Placeholder.java diff --git a/src/main/java/io/greitan/mineserv/GeyserVoice.java b/src/main/java/io/greitan/mineserv/GeyserVoice.java index c3a0386..823f0f3 100644 --- a/src/main/java/io/greitan/mineserv/GeyserVoice.java +++ b/src/main/java/io/greitan/mineserv/GeyserVoice.java @@ -1,18 +1,26 @@ package io.greitan.mineserv; -import lombok.Getter; +import lombok.Getter; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import io.greitan.mineserv.commands.VoiceCommand; import io.greitan.mineserv.listeners.PlayerJoinListener; import io.greitan.mineserv.network.Network; +import io.greitan.mineserv.network.Payloads.BindingPacket; import io.greitan.mineserv.network.Payloads.LoginPacket; +import io.greitan.mineserv.network.Payloads.ServerSettings; +import io.greitan.mineserv.network.Payloads.UpdateSettingsPacket; import io.greitan.mineserv.tasks.PositionsTask; import io.greitan.mineserv.utils.Language; import io.greitan.mineserv.utils.Logger; +import io.greitan.mineserv.utils.Placeholder; import java.util.Objects; - +import java.util.Map; +import java.util.HashMap; public class GeyserVoice extends JavaPlugin { private static @Getter GeyserVoice instance; @@ -20,15 +28,15 @@ public class GeyserVoice extends JavaPlugin { private @Getter String host = ""; private @Getter int port = 0; private @Getter String serverKey = ""; + private @Getter Map playerBinds = new HashMap<>(); private String lang; @Override public void onEnable() { instance = this; - + lang = getConfig().getString("config.lang"); - Language.init(this); VoiceCommand voiceCommand = new VoiceCommand(this, lang); @@ -37,14 +45,14 @@ public void onEnable() { new PositionsTask(this).runTaskTimer(this, 0, 1); getServer().getPluginManager().registerEvents(new PlayerJoinListener(this, lang), this); + if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { + new Placeholder(this).register(); + } - this.reload("server"); + this.reload(); } - public void reload(String player) { - if (!player.equals("server")) { - Logger.info(Language.getMessage(lang, "plugin-reload-pl").replace("$player", player)); - } + public void reload() { saveDefaultConfig(); reloadConfig(); Logger.info(Language.getMessage(lang, "plugin-config-loaded")); @@ -54,29 +62,81 @@ public void reload(String player) { port = getConfig().getInt("config.port"); serverKey = getConfig().getString("config.server-key"); - isConnected = connect(host, port, serverKey, true); + isConnected = connect(true); + + int proximityDistance = getConfig().getInt("config.voice.proximity-distance"); + Boolean proximityToggle = getConfig().getBoolean("proximity-toggle"); + Boolean voiceEffects = getConfig().getBoolean("voice-effects"); + + updateSettings(proximityDistance, proximityToggle, voiceEffects); } - public Boolean connect(String host, int port, String serverKey, Boolean force) { + public Boolean connect(Boolean force) { if (isConnected && !force) return true; - if (Objects.nonNull(host) && Objects.nonNull(serverKey)) { + if (Objects.nonNull(host) && Objects.nonNull(serverKey)) + { String link = "http://" + host + ":" + port; + // Create request data object. LoginPacket loginPacket = new LoginPacket(); loginPacket.loginKey = serverKey; isConnected = Network.sendPostRequest(link, loginPacket); - if (isConnected) { + if (isConnected) + { Logger.info(Language.getMessage(lang, "plugin-connect-connect")); return true; - } else { + } + else + { Logger.warn(Language.getMessage(lang, "plugin-connect-disconnect")); return false; } - } else { + } + else + { Logger.warn(Language.getMessage(lang, "plugin-connect-invalid-data")); return false; } } - + + public Boolean bind(String playerKey, Player player) + { + if(!isConnected || Objects.isNull(host) || Objects.isNull(serverKey) ) return false; + String link = "http://" + host + ":" + port; + + getConfig().set("config.players."+player.getName(), playerKey); + saveConfig(); + + // Create request data object. + BindingPacket bindingPacket = new BindingPacket(); + bindingPacket.playerId = player.getEntityId(); + bindingPacket.gamertag = player.getName(); + bindingPacket.playerKey = playerKey; + bindingPacket.loginKey = serverKey; + + boolean bindStatus = Network.sendPostRequest(link, bindingPacket); + + playerBinds.put(player.getName(), bindStatus); + + return bindStatus; + } + + public Boolean updateSettings(int proximityDistance, Boolean proximityToggle, Boolean voiceEffects){ + if(!isConnected || Objects.isNull(host) || Objects.isNull(serverKey) ) return false; + String link = "http://" + host + ":" + port; + + // Create server settings data object. + ServerSettings serverSettings = new ServerSettings(); + serverSettings.proximityDistance = proximityDistance; + serverSettings.proximityToggle = proximityToggle; + serverSettings.voiceEffects = voiceEffects; + + // Create request data object. + UpdateSettingsPacket updateSettingsPacket = new UpdateSettingsPacket(); + updateSettingsPacket.loginKey = serverKey; + updateSettingsPacket.settings = serverSettings; + + return Network.sendPostRequest(link, updateSettingsPacket); + } } \ No newline at end of file diff --git a/src/main/java/io/greitan/mineserv/commands/VoiceCommand.java b/src/main/java/io/greitan/mineserv/commands/VoiceCommand.java index 8179ec1..d087954 100644 --- a/src/main/java/io/greitan/mineserv/commands/VoiceCommand.java +++ b/src/main/java/io/greitan/mineserv/commands/VoiceCommand.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Objects; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -12,13 +13,12 @@ import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + import io.greitan.mineserv.GeyserVoice; -import io.greitan.mineserv.network.Network; -import io.greitan.mineserv.network.Payloads.BindingPacket; import io.greitan.mineserv.utils.Language; import io.greitan.mineserv.utils.Logger; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; public class VoiceCommand implements CommandExecutor, TabCompleter { @@ -26,126 +26,140 @@ public class VoiceCommand implements CommandExecutor, TabCompleter { private final String lang; private boolean isConnected = false; - public VoiceCommand(GeyserVoice plugin, String lang) { + // Get the plugin and lang interfaces. + public VoiceCommand(GeyserVoice plugin, String lang) + { this.plugin = plugin; this.lang = lang; } @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) + { isConnected = plugin.isConnected(); - - String host = plugin.getConfig().getString("config.host"); - int port = plugin.getConfig().getInt("config.port"); - String link = "http://" + host + ":" + port; - String serverKey = plugin.getConfig().getString("config.server-key"); if (sender instanceof Player) { Player player = (Player) sender; - if (args.length >= 1) { - if (args[0].equalsIgnoreCase("bind") && player.hasPermission("voice.bind") && isConnected) { - String key = args[1]; - if(key == null){return false;} - - String nick = player.getName(); - int id = player.getEntityId(); - - plugin.getConfig().set("config.players."+player.getName(), key); - plugin.saveConfig(); - - BindingPacket bindingPacket = new BindingPacket(); - bindingPacket.playerId = id; - bindingPacket.gamertag = nick; - bindingPacket.playerKey = key; - bindingPacket.loginKey = serverKey; - - Boolean isBinded = Network.sendPostRequest(link, bindingPacket); - if(isBinded){ - String msg = Language.getMessage(lang, "cmd-bind-connect"); - player.sendMessage(Component.text(msg).color(NamedTextColor.AQUA)); - } else { - String msg = Language.getMessage(lang, "cmd-bind-disconnect"); - player.sendMessage(Component.text(msg).color(NamedTextColor.YELLOW)); + if (args.length >= 1) + { + // Bind command - bind player. + if (args[0].equalsIgnoreCase("bind") && player.hasPermission("voice.bind") && isConnected) + { + if(Objects.nonNull(args[1])){ + Boolean isBinded = plugin.bind(args[1], player); + if(isBinded){ + player.sendMessage(Component.text(Language.getMessage(lang, "cmd-bind-connect")).color(NamedTextColor.AQUA)); + } else { + player.sendMessage(Component.text(Language.getMessage(lang, "cmd-bind-disconnect")).color(NamedTextColor.RED)); + } + } + else + { + player.sendMessage(Component.text(Language.getMessage(lang, "cmd-invalid-args")).color(NamedTextColor.RED)); } - return true; - } else if (args[0].equalsIgnoreCase("setup") && player.hasPermission("voice.setup")) { + } + // Setup command - setup the configuration. + else if (args[0].equalsIgnoreCase("setup") && player.hasPermission("voice.setup")) + { String newHost = args[1]; String newPort = args[2]; String newKey = args[3]; - if(newHost != null && newPort != null && newKey != null){ + if(Objects.nonNull(newHost) && Objects.nonNull(newPort) && Objects.nonNull(newKey)){ plugin.getConfig().set("config.host", newHost); plugin.getConfig().set("config.port", newPort); plugin.getConfig().set("config.server-key", newKey); plugin.saveConfig(); plugin.reloadConfig(); - player.sendMessage(Component.text(Language.getMessage(lang, "plugin-connect-connect")).color(NamedTextColor.AQUA)); + plugin.reload(); - plugin.reload(player.getName()); - return true; + player.sendMessage(Component.text(Language.getMessage(lang, "cmd-setup-success")).color(NamedTextColor.AQUA)); } else { - player.sendMessage(Component.text(Language.getMessage(lang, "plugin-connect-connect")).color(NamedTextColor.AQUA)); - return true; + player.sendMessage(Component.text(Language.getMessage(lang, "cmd-setup-invalid-data")).color(NamedTextColor.RED)); } - } else if (args[0].equalsIgnoreCase("connect") && player.hasPermission("voice.connect")) { - if (host != null && serverKey != null) { - Boolean force = Boolean.valueOf(args[1]); - Boolean connected = plugin.connect(host, port, serverKey, force); - if(connected){ - player.sendMessage(Component.text(Language.getMessage(lang, "plugin-connect-connect")).color(NamedTextColor.AQUA)); - } else { - player.sendMessage(Component.text(Language.getMessage(lang, "plugin-connect-disconnect")).color(NamedTextColor.YELLOW)); - } - return true; + } + // Connect command - connect to the VoiceCraft server. + else if (args[0].equalsIgnoreCase("connect") && player.hasPermission("voice.connect")) + { + Boolean force = Boolean.valueOf(args[1]); + + Boolean connected = plugin.connect(force); + if(connected){ + player.sendMessage(Component.text(Language.getMessage(lang, "plugin-connect-connect")).color(NamedTextColor.AQUA)); } else { - player.sendMessage(Component.text(Language.getMessage(lang, "plugin-connect-invalid-data")).color(NamedTextColor.RED)); - return true; + player.sendMessage(Component.text(Language.getMessage(lang, "plugin-connect-disconnect")).color(NamedTextColor.RED)); } - } else if (args[0].equalsIgnoreCase("reload") && player.hasPermission("voice.reload")) { - plugin.reload(player.getName()); + } + // Reload command - reload the configs. + else if (args[0].equalsIgnoreCase("reload") && player.hasPermission("voice.reload")) + { + plugin.reload(); player.sendMessage(Component.text(Language.getMessage(lang, "cmd-reload")).color(NamedTextColor.GREEN)); - return true; - } else { - player.sendMessage(Component.text(Language.getMessage(lang, "cmd-not-exists")).color(NamedTextColor.GREEN)); - return true; + } + else if (args[0].equalsIgnoreCase("settings") && player.hasPermission("voice.settings")) + { + int proximityDistance = 1; + Boolean proximityToggle = true; + Boolean voiceEffects = true; + + plugin.updateSettings(proximityDistance, proximityToggle, voiceEffects); + } + // Command select invalid. + else + { + player.sendMessage(Component.text(Language.getMessage(lang, "cmd-invalid-args")).color(NamedTextColor.RED)); } } - player.sendMessage(Component.text(Language.getMessage(lang, "cmd-invalid-args")).color(NamedTextColor.RED)); - return true; - } else if(args.length >= 1) { - if (args[0].equalsIgnoreCase("reload")) { - plugin.reload("server"); + } + // Commands runned by console. + else if(args.length >= 1) + { + // Reload command - reload the configs. + if (args[0].equalsIgnoreCase("reload")) + { + plugin.reload(); Logger.log(Component.text(Language.getMessage(lang, "cmd-reload")).color(NamedTextColor.GREEN)); - return true; - } else { + } + // Command not for console. + else + { sender.sendMessage(Component.text(Language.getMessage(lang, "cmd-not-player")).color(NamedTextColor.RED)); - return true; } - } else { + } + // Invalid command arguments. + else + { sender.sendMessage(Component.text(Language.getMessage(lang, "cmd-invalid-args")).color(NamedTextColor.RED)); - return true; } + return true; } @Override public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { - if (args.length == 0) { + if (args.length == 0) + { return Collections.emptyList(); } List completions = new ArrayList<>(); - if (args.length == 1) { + // Main command arguments. + if (args.length == 1) + { List options = Arrays.asList("bind", "setup", "connect", "reload"); StringUtil.copyPartialMatches(args[0], options, completions); } - if (args.length == 2 && args[0].equalsIgnoreCase("setup")) { + // Setup command arguments. + if (args.length == 2 && args[0].equalsIgnoreCase("setup")) + { List options = Arrays.asList("host port key"); StringUtil.copyPartialMatches(args[1], options, completions); } - if (args.length == 2 && args[0].equalsIgnoreCase("connect")) { + // Connect command arguments. + if (args.length == 2 && args[0].equalsIgnoreCase("connect")) + { List options = Arrays.asList("true", "false"); StringUtil.copyPartialMatches(args[1], options, completions); } diff --git a/src/main/java/io/greitan/mineserv/listeners/PlayerJoinListener.java b/src/main/java/io/greitan/mineserv/listeners/PlayerJoinListener.java index aaa3d55..686aa43 100644 --- a/src/main/java/io/greitan/mineserv/listeners/PlayerJoinListener.java +++ b/src/main/java/io/greitan/mineserv/listeners/PlayerJoinListener.java @@ -1,56 +1,53 @@ package io.greitan.mineserv.listeners; +import java.util.Objects; + import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import io.greitan.mineserv.GeyserVoice; -import io.greitan.mineserv.network.Network; -import io.greitan.mineserv.network.Payloads.BindingPacket; -import io.greitan.mineserv.utils.Language; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import io.greitan.mineserv.GeyserVoice; +import io.greitan.mineserv.utils.Language; + public class PlayerJoinListener implements Listener { private final GeyserVoice plugin; private final String lang; private boolean isConnected = false; - public PlayerJoinListener(GeyserVoice plugin, String lang) { + // Get the plugin and lang interfaces. + public PlayerJoinListener(GeyserVoice plugin, String lang) + { this.plugin = plugin; this.lang = lang; } + // Player Join event. @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - Player player = event.getPlayer(); + public void onPlayerJoin(PlayerJoinEvent event) + { isConnected = plugin.isConnected(); + Player player = event.getPlayer(); - String host = plugin.getConfig().getString("config.host"); - int port = plugin.getConfig().getInt("config.port"); - - String link = "http://" + host + ":" + port; - - String serverKey = plugin.getConfig().getString("config.server-key"); String playerKey = plugin.getConfig().getString("config.players."+player.getName()); - if (isConnected && playerKey != null) { - int id = player.getEntityId(); - - BindingPacket bindingPacket = new BindingPacket(); - bindingPacket.playerId = id; - bindingPacket.gamertag = player.getName(); - bindingPacket.playerKey = playerKey; - bindingPacket.loginKey = serverKey; - - boolean isBinded = Network.sendPostRequest(link, bindingPacket); - - if (isBinded) { + // Auto bind player. + if (isConnected && Objects.nonNull(playerKey)) + { + boolean isBinded = plugin.bind(playerKey, player); + // Player binded. + if (isBinded) + { player.sendMessage(Component.text(Language.getMessage(lang, "plugin-autobind-success")).color(NamedTextColor.AQUA)); - } else { - player.sendMessage(Component.text(Language.getMessage(lang, "plugin-autobind-failed")).color(NamedTextColor.YELLOW)); + } + // Bind failed. + else + { + player.sendMessage(Component.text(Language.getMessage(lang, "plugin-autobind-failed")).color(NamedTextColor.RED)); } } } diff --git a/src/main/java/io/greitan/mineserv/network/Network.java b/src/main/java/io/greitan/mineserv/network/Network.java index 08ed7d7..8a99c52 100644 --- a/src/main/java/io/greitan/mineserv/network/Network.java +++ b/src/main/java/io/greitan/mineserv/network/Network.java @@ -4,9 +4,6 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.net.http.HttpHeaders; -import java.util.List; -import java.util.Map; import java.time.Duration; import com.fasterxml.jackson.databind.ObjectMapper; @@ -44,31 +41,4 @@ public static boolean sendPostRequest(String url, Object data) { return false; } } - - public static void sendGetRequest(String url) { - HttpClient httpClient = HttpClient.newHttpClient(); - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .build(); - - try { - HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); - - int statusCode = response.statusCode(); - Logger.info("GET status: " + statusCode); - - if (statusCode == 200) { - Logger.info("GET request successful!"); - } else { - Logger.warn("GET request failed!"); - } - - HttpHeaders headers = response.headers(); - Map> headerFields = headers.map(); - Logger.info("Response Headers: " + headerFields); - } catch (Exception e) { - e.printStackTrace(); - } - } } diff --git a/src/main/java/io/greitan/mineserv/tasks/PositionsTask.java b/src/main/java/io/greitan/mineserv/tasks/PositionsTask.java index cbe6076..b0003e6 100644 --- a/src/main/java/io/greitan/mineserv/tasks/PositionsTask.java +++ b/src/main/java/io/greitan/mineserv/tasks/PositionsTask.java @@ -21,12 +21,14 @@ public class PositionsTask extends BukkitRunnable { private final GeyserVoice plugin; private boolean isConnected = false; - public PositionsTask(GeyserVoice plugin) { + public PositionsTask(GeyserVoice plugin) + { this.plugin = plugin; } @Override - public void run() { + public void run() + { isConnected = plugin.isConnected(); String host = plugin.getHost(); int port = plugin.getPort(); @@ -44,10 +46,12 @@ public void run() { } } - public List getPlayerDataList() { + public List getPlayerDataList() + { List playerDataList = new ArrayList<>(); - for (Player player : Bukkit.getServer().getOnlinePlayers()) { + for (Player player : Bukkit.getServer().getOnlinePlayers()) + { Location headLocation = player.getEyeLocation(); LocationData locationData = new LocationData(); @@ -75,8 +79,10 @@ public List getPlayerDataList() { return playerDataList; } - public double getCaveDensity(Player player) { - if (!isConnected) { + public double getCaveDensity(Player player) + { + if (!isConnected) + { return 0.0; } @@ -98,15 +104,18 @@ public double getCaveDensity(Player player) { return (block1 + block2 + block3 + block4 + block5 + block6) / 6.0; } - private Location getRelativeLocation(Location base, double x, double y, double z) { + private Location getRelativeLocation(Location base, double x, double y, double z) + { return new Location(base.getWorld(), base.getX() + x, base.getY() + y, base.getZ() + z); } - private String getBlockType(Location location) { + private String getBlockType(Location location) + { return location.getBlock().getType().toString(); } - private String getDimensionId(Player player) { + private String getDimensionId(Player player) + { String worldName = player.getWorld().getName(); return worldName.equals("world") ? "minecraft:overworld" : worldName.equals("world_nether") ? "minecraft:nether" : diff --git a/src/main/java/io/greitan/mineserv/utils/Language.java b/src/main/java/io/greitan/mineserv/utils/Language.java index 3d5f277..9a4298f 100644 --- a/src/main/java/io/greitan/mineserv/utils/Language.java +++ b/src/main/java/io/greitan/mineserv/utils/Language.java @@ -15,10 +15,12 @@ public class Language { private static final Map languageConfigs = new HashMap<>(); private static String defaultLanguage = "en"; - public static void init(Plugin plugin) { + public static void init(Plugin plugin) + { File languageFolder = new File(plugin.getDataFolder(), "locale"); - if (!languageFolder.exists()) { + if (!languageFolder.exists()) + { languageFolder.mkdirs(); copyResource(plugin, "locale/en.yml", new File(languageFolder, "en.yml")); copyResource(plugin, "locale/ru.yml", new File(languageFolder, "ru.yml")); @@ -27,14 +29,18 @@ public static void init(Plugin plugin) { loadLanguages(languageFolder.getAbsolutePath()); } - private static void loadLanguages(String pluginFolder) { + private static void loadLanguages(String pluginFolder) + { File languageFolder = new File(pluginFolder); - if (languageFolder.exists() && languageFolder.isDirectory()) { + if (languageFolder.exists() && languageFolder.isDirectory()) + { - for (File file : languageFolder.listFiles()) { + for (File file : languageFolder.listFiles()) + { - if (file.getName().endsWith(".yml")) { + if (file.getName().endsWith(".yml")) + { String language = file.getName().replace(".yml", ""); YamlConfiguration config = YamlConfiguration.loadConfiguration(file); languageConfigs.put(language, config); @@ -43,20 +49,27 @@ private static void loadLanguages(String pluginFolder) { } } - private static void copyResource(Plugin plugin, String resourceName, File destination) { - try (InputStream inputStream = plugin.getResource(resourceName)) { - if (inputStream != null) { + private static void copyResource(Plugin plugin, String resourceName, File destination) + { + try (InputStream inputStream = plugin.getResource(resourceName)) + { + if (inputStream != null) + { Files.copy(inputStream, destination.toPath(), StandardCopyOption.REPLACE_EXISTING); } - } catch (IOException e) { + } catch (IOException e) + { e.printStackTrace(); } } - public static String getMessage(String language, String key) { - if (languageConfigs.containsKey(language)) { + public static String getMessage(String language, String key) + { + if (languageConfigs.containsKey(language)) + { YamlConfiguration config = languageConfigs.get(language); - if (config.contains("messages." + key)) { + if (config.contains("messages." + key)) + { return config.getString("messages." + key); } } diff --git a/src/main/java/io/greitan/mineserv/utils/Placeholder.java b/src/main/java/io/greitan/mineserv/utils/Placeholder.java new file mode 100644 index 0000000..ffb275a --- /dev/null +++ b/src/main/java/io/greitan/mineserv/utils/Placeholder.java @@ -0,0 +1,47 @@ +package io.greitan.mineserv.utils; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.entity.Player; + +import io.greitan.mineserv.GeyserVoice; + +public class Placeholder extends PlaceholderExpansion { + private final GeyserVoice plugin; + + // Get the plugin interface. + public Placeholder(GeyserVoice plugin) + { + this.plugin = plugin; + } + + @Override + public String getIdentifier() { + return "voice"; + } + + @Override + public String getAuthor() { + return "GeyserVoice"; + } + + @Override + public String getVersion() { + return "1.0"; + } + + @Override + public String onPlaceholderRequest(Player player, String identifier) { + // Voice icon placeholder "%voice_status%" + if (identifier.equalsIgnoreCase("status")) { + if (plugin.getPlayerBinds().getOrDefault(player.getName(), false)) + { + return plugin.getConfig().getString("config.voice.in-voice-symbol"); + } + else + { + return plugin.getConfig().getString("config.voice.not-in-voice-symbol"); + } + } + return null; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1d68721..f0df4b3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -12,5 +12,8 @@ config: proximity-toggle: true voice-effects: true + not-in-voice-symbol: "\u2727" + in-voice-symbol: "\u2726" + players: AlphaBaqpla: "228" \ No newline at end of file diff --git a/src/main/resources/locale/en.yml b/src/main/resources/locale/en.yml index 533f4c5..0a03d97 100644 --- a/src/main/resources/locale/en.yml +++ b/src/main/resources/locale/en.yml @@ -10,7 +10,7 @@ messages: cmd-setup-success: "Setup success! Reloading..." cmd-setup-invalid-data: "Invalid command arguments. Usage: /voive setup ." - cmd-invalid-args: "Invalid command usage. Usage: /voice " + cmd-invalid-args: "Invalid command usage. Usage: /voice " cmd-not-player: "Only players can use this command!" cmd-not-exists: "This command is not exist." diff --git a/src/main/resources/locale/ru.yml b/src/main/resources/locale/ru.yml index b334baa..62a322c 100644 --- a/src/main/resources/locale/ru.yml +++ b/src/main/resources/locale/ru.yml @@ -10,7 +10,7 @@ messages: cmd-setup-success: "Успешно установлены данные для подключения! Перезагружаю плагин..." cmd-setup-invalid-data: "Не правильные аргументы команды. Использование: /voive setup ." - cmd-invalid-args: "Неверное использование команды. Использование: /voice " + cmd-invalid-args: "Неверное использование команды. Использование: /voice " cmd-not-player: "Только игроки могут использовать эту команду!" cmd-not-exists: "Данной команды не существует." diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e90f3b2..167f46e 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -7,6 +7,9 @@ website: https://mineserv.top api-version: '1.20' prefix: GeyserVoice +depend: +- PlaceholderAPI + commands: voice: description: Voice chat main command.