diff --git a/build.gradle b/build.gradle index d81071b..a6ce939 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'net.momirealms' -version = '2.0-PRE-6' +version = '2.0-PRE-7' repositories { mavenCentral() diff --git a/src/main/java/net/momirealms/customnameplates/ConfigManager.java b/src/main/java/net/momirealms/customnameplates/ConfigManager.java index 9104fe7..740dcd7 100644 --- a/src/main/java/net/momirealms/customnameplates/ConfigManager.java +++ b/src/main/java/net/momirealms/customnameplates/ConfigManager.java @@ -20,6 +20,7 @@ package net.momirealms.customnameplates; import net.kyori.adventure.key.Key; import net.momirealms.customnameplates.bossbar.BossBarConfig; import net.momirealms.customnameplates.bossbar.Overlay; +import net.momirealms.customnameplates.data.SqlHandler; import net.momirealms.customnameplates.font.FontOffset; import net.momirealms.customnameplates.objects.BackGround; import net.momirealms.customnameplates.font.FontWidthNormal; @@ -35,6 +36,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Objects; @@ -222,40 +224,65 @@ public class ConfigManager { public static String prefix; public static String lackArgs; public static String reload; - public static String equip; - public static String unEquip; - public static String force_equip; - public static String force_unEquip; - public static String not_exist; public static String not_online; public static String no_console; - public static String notAvailable; - public static String available; public static String coolDown; public static String preview; public static String generate; public static String noNameplate; + public static String generateDone; + + public static String np_equip; + public static String np_unEquip; + public static String np_force_equip; + public static String np_force_unEquip; + public static String np_not_exist; + public static String np_notAvailable; + public static String np_available; + public static String np_haveNone; + + public static String bb_equip; + public static String bb_unEquip; + public static String bb_force_equip; + public static String bb_force_unEquip; + public static String bb_not_exist; + public static String bb_notAvailable; + public static String bb_available; + public static String bb_haveNone; public static void reload(){ - YamlConfiguration messagesConfig = getConfig("messages/messages_" + Main.lang +".yml"); + YamlConfiguration messagesConfig = getConfig("messages" + File.separator + Main.lang +".yml"); + noPerm = messagesConfig.getString("messages.no-perm"); prefix = messagesConfig.getString("messages.prefix"); lackArgs = messagesConfig.getString("messages.lack-args"); reload = messagesConfig.getString("messages.reload"); - equip = messagesConfig.getString("messages.equip"); - unEquip = messagesConfig.getString("messages.unequip"); - force_equip = messagesConfig.getString("messages.force-equip"); - force_unEquip = messagesConfig.getString("messages.force-unequip"); - not_exist = messagesConfig.getString("messages.not-exist"); - not_online = messagesConfig.getString("messages.not-online"); - no_console = messagesConfig.getString("messages.no-console"); - notAvailable = messagesConfig.getString("messages.not-available"); - available = messagesConfig.getString("messages.available"); coolDown = messagesConfig.getString("messages.cooldown"); preview = messagesConfig.getString("messages.preview"); generate = messagesConfig.getString("messages.generate"); - noNameplate = messagesConfig.getString("messages.no-nameplate","messages.no-nameplate is missing"); + generateDone = messagesConfig.getString("messages.generate-done"); + noNameplate = messagesConfig.getString("messages.no-nameplate"); + not_online = messagesConfig.getString("messages.not-online"); + no_console = messagesConfig.getString("messages.no-console"); + + np_equip = messagesConfig.getString("messages.equip-nameplates"); + np_unEquip = messagesConfig.getString("messages.unequip-nameplates"); + np_force_equip = messagesConfig.getString("messages.force-equip-nameplates"); + np_force_unEquip = messagesConfig.getString("messages.force-unequip-nameplates"); + np_not_exist = messagesConfig.getString("messages.not-exist-nameplates"); + np_notAvailable = messagesConfig.getString("messages.not-available-nameplates"); + np_available = messagesConfig.getString("messages.available-nameplates"); + np_haveNone = messagesConfig.getString("messages.have-no-nameplates"); + + bb_equip = messagesConfig.getString("messages.equip-bubbles"); + bb_unEquip = messagesConfig.getString("messages.unequip-bubbles"); + bb_force_equip = messagesConfig.getString("messages.force-equip-bubbles"); + bb_force_unEquip = messagesConfig.getString("messages.force-unequip-bubbles"); + bb_not_exist = messagesConfig.getString("messages.not-exist-bubbles"); + bb_notAvailable = messagesConfig.getString("messages.not-available-bubbles"); + bb_available = messagesConfig.getString("messages.available-bubbles"); + bb_haveNone = messagesConfig.getString("messages.have-no-bubbles"); } } @@ -331,14 +358,20 @@ public class ConfigManager { * 加载聊天气泡模块功能 */ public static class Bubbles { - public static String defaultBubble; + public static String defaultBubble = "none"; + public static String defaultFormat; + public static String prefix; + public static String suffix; public static double lineSpace; public static double yOffset; public static int stayTime; public static void load() { YamlConfiguration config = getConfig("bubble.yml"); defaultBubble = config.getString("bubble.default-bubbles", "none"); + prefix = config.getString("bubble.text-prefix", ""); + suffix = config.getString("bubble.text-suffix", ""); lineSpace = config.getDouble("bubble.line-spacing"); + defaultFormat = config.getString("bubble.default-format", ""); yOffset = config.getDouble("bubble.bottom-line-Y-offset"); stayTime = config.getInt("bubble.stay-time", 5); } @@ -384,7 +417,7 @@ public class ConfigManager { YamlConfiguration databaseConfig = getConfig("database.yml"); String storage_mode = databaseConfig.getString("settings.storage-mode","SQLite"); - async = !databaseConfig.getBoolean("settings.disable-async", true); + async = !databaseConfig.getBoolean("settings.disable-async", false); if(storage_mode.equalsIgnoreCase("SQLite")){ enable_pool = false; use_mysql = false; @@ -409,6 +442,7 @@ public class ConfigManager { url = url + "&allowPublicKeyRetrieval=true"; } enable_pool = databaseConfig.getBoolean("settings.use-pool"); + if(enable_pool){ maximum_pool_size = databaseConfig.getInt("Pool-Settings.maximum-pool-size"); minimum_idle = databaseConfig.getInt("Pool-Settings.minimum-idle"); @@ -420,6 +454,18 @@ public class ConfigManager { AdventureUtil.consoleMessage("[CustomNameplates] Error! No such storage mode!"); Bukkit.getPluginManager().disablePlugin(CustomNameplates.instance); } + + if (databaseConfig.getBoolean("settings.migration", false)) { + SqlHandler.updateTable(); + databaseConfig.set("settings.migration", false); + AdventureUtil.consoleMessage("[CustomNameplates] Migration is done!"); + try { + databaseConfig.save(new File(CustomNameplates.instance.getDataFolder(), "database.yml")); + } + catch (IOException e) { + e.printStackTrace(); + } + } } } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/CustomNameplates.java b/src/main/java/net/momirealms/customnameplates/CustomNameplates.java index 12b1812..d49fe1f 100644 --- a/src/main/java/net/momirealms/customnameplates/CustomNameplates.java +++ b/src/main/java/net/momirealms/customnameplates/CustomNameplates.java @@ -22,15 +22,17 @@ import com.comphenix.protocol.ProtocolManager; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.momirealms.customnameplates.actionbar.ActionBarManager; import net.momirealms.customnameplates.bossbar.BossBarManager; -import net.momirealms.customnameplates.commands.Execute; -import net.momirealms.customnameplates.commands.TabComplete; +import net.momirealms.customnameplates.commands.bb.ExecuteB; +import net.momirealms.customnameplates.commands.bb.TabCompleteB; +import net.momirealms.customnameplates.commands.np.ExecuteN; +import net.momirealms.customnameplates.commands.np.TabCompleteN; import net.momirealms.customnameplates.data.DataManager; import net.momirealms.customnameplates.data.SqlHandler; import net.momirealms.customnameplates.helper.LibraryLoader; import net.momirealms.customnameplates.hook.PlaceholderManager; import net.momirealms.customnameplates.nameplates.TeamManager; import net.momirealms.customnameplates.nameplates.TeamPacketManager; -import net.momirealms.customnameplates.nameplates.bubbles.ChatBubblesManager; +import net.momirealms.customnameplates.nameplates.mode.bubbles.ChatBubblesManager; import net.momirealms.customnameplates.nameplates.mode.NameplateManager; import net.momirealms.customnameplates.nameplates.mode.rd.RidingTag; import net.momirealms.customnameplates.nameplates.mode.tm.TeamTag; @@ -78,8 +80,10 @@ public final class CustomNameplates extends JavaPlugin { AdventureUtil.consoleMessage("[CustomNameplates] Running on " + Bukkit.getVersion()); - Objects.requireNonNull(Bukkit.getPluginCommand("customnameplates")).setExecutor(new Execute()); - Objects.requireNonNull(Bukkit.getPluginCommand("customnameplates")).setTabCompleter(new TabComplete()); + Objects.requireNonNull(Bukkit.getPluginCommand("customnameplates")).setExecutor(new ExecuteN()); + Objects.requireNonNull(Bukkit.getPluginCommand("customnameplates")).setTabCompleter(new TabCompleteN()); + Objects.requireNonNull(Bukkit.getPluginCommand("chatbubbles")).setExecutor(new ExecuteB()); + Objects.requireNonNull(Bukkit.getPluginCommand("chatbubbles")).setTabCompleter(new TabCompleteB()); loadConfig(); diff --git a/src/main/java/net/momirealms/customnameplates/actionbar/ActionBarManager.java b/src/main/java/net/momirealms/customnameplates/actionbar/ActionBarManager.java index 89c71ad..3f3efc1 100644 --- a/src/main/java/net/momirealms/customnameplates/actionbar/ActionBarManager.java +++ b/src/main/java/net/momirealms/customnameplates/actionbar/ActionBarManager.java @@ -30,7 +30,7 @@ public class ActionBarManager extends Function { private BukkitTask bukkitTask; - private ActionBarPacketsListener actionBarPacketsListener; +// private ActionBarPacketsListener actionBarPacketsListener; private int timer; @@ -41,8 +41,8 @@ public class ActionBarManager extends Function { @Override public void load() { - this.actionBarPacketsListener = new ActionBarPacketsListener(this); - CustomNameplates.protocolManager.addPacketListener(actionBarPacketsListener); +// this.actionBarPacketsListener = new ActionBarPacketsListener(this); +// CustomNameplates.protocolManager.addPacketListener(actionBarPacketsListener); PlaceholderManager placeholderManager = CustomNameplates.instance.getPlaceholderManager(); @@ -62,7 +62,7 @@ public class ActionBarManager extends Function { @Override public void unload() { - CustomNameplates.protocolManager.removePacketListener(actionBarPacketsListener); +// CustomNameplates.protocolManager.removePacketListener(actionBarPacketsListener); this.bukkitTask.cancel(); } } diff --git a/src/main/java/net/momirealms/customnameplates/actionbar/ActionBarPacketsListener.java b/src/main/java/net/momirealms/customnameplates/actionbar/ActionBarPacketsListener.java index a820029..0e8aeaa 100644 --- a/src/main/java/net/momirealms/customnameplates/actionbar/ActionBarPacketsListener.java +++ b/src/main/java/net/momirealms/customnameplates/actionbar/ActionBarPacketsListener.java @@ -40,6 +40,4 @@ public class ActionBarPacketsListener extends PacketAdapter { // WrappedChatComponent chatComponent1 = WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(raw)); // packet.getChatComponents().write(0, chatComponent1); } - - } diff --git a/src/main/java/net/momirealms/customnameplates/commands/bb/ExecuteB.java b/src/main/java/net/momirealms/customnameplates/commands/bb/ExecuteB.java new file mode 100644 index 0000000..a51a0b2 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/commands/bb/ExecuteB.java @@ -0,0 +1,168 @@ +package net.momirealms.customnameplates.commands.bb; + +import net.momirealms.customnameplates.ConfigManager; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.nameplates.TeamManager; +import net.momirealms.customnameplates.resource.ResourceManager; +import net.momirealms.customnameplates.utils.AdventureUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class ExecuteB implements CommandExecutor { + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + + if (args.length < 1){ + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.lackArgs); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.lackArgs); + return true; + } + + switch (args[0]) { + case "equip" -> { + if (sender instanceof Player player) { + if (args.length < 2) { + AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.lackArgs); + return true; + } + if (sender.hasPermission("bubbles.equip." + args[1]) || sender.isOp()) { + if (CustomNameplates.instance.getResourceManager().getNameplateInstance(args[1]) == null) { + AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.bb_not_exist); + return true; + } + CustomNameplates.instance.getDataManager().getCache().get(player.getUniqueId()).setBubbles(args[1]); + CustomNameplates.instance.getDataManager().savePlayer(player.getUniqueId()); + CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(player); + AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.bb_equip.replace("{Bubble}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[1]).getConfig().getName())); + } + else AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.bb_notAvailable); + } + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.no_console); + return true; + } + case "forceequip" -> { + if (args.length < 3){ + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.lackArgs); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.lackArgs); + return true; + } + if (sender.hasPermission("bubbles.forceequip") || sender.isOp()){ + Player player = Bukkit.getPlayer(args[1]); + if (player != null){ + if (CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]) == null){ + if(sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.bb_not_exist); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.bb_not_exist); + return true; + } + CustomNameplates.instance.getDataManager().getCache().get(player.getUniqueId()).setBubbles(args[2]); + CustomNameplates.instance.getDataManager().savePlayer(player.getUniqueId()); + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.bb_force_equip.replace("{Bubble}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]).getConfig().getName()).replace("{Player}", args[1])); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.bb_force_equip.replace("{Bubble}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]).getConfig().getName()).replace("{Player}", args[1])); + }else { + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.not_online.replace("{Player}",args[1])); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.not_online.replace("{Player}",args[1])); + } + } + else AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.noPerm); + return true; + } + case "unequip" -> { + if (sender instanceof Player player){ + CustomNameplates.instance.getDataManager().getCache().get(player.getUniqueId()).setBubbles("none"); + CustomNameplates.instance.getDataManager().savePlayer(player.getUniqueId()); + AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.bb_unEquip); + } + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.no_console); + return true; + } + case "forceunequip" -> { + if (args.length < 2){ + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.lackArgs); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.lackArgs); + return true; + } + if (sender.hasPermission("bubbles.forceunequip")){ + Player player = Bukkit.getPlayer(args[1]); + if (player != null){ + CustomNameplates.instance.getDataManager().getCache().get(player.getUniqueId()).setBubbles("none"); + CustomNameplates.instance.getDataManager().savePlayer(player.getUniqueId()); + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.bb_force_unEquip.replace("{Player}", args[1])); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.bb_force_unEquip.replace("{Player}", args[1])); + }else { + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.not_online.replace("{Player}",args[1])); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.not_online.replace("{Player}",args[1])); + } + } + return true; + } + case "list" -> { + if (sender instanceof Player player) { + if (player.isOp()) { + StringBuilder stringBuilder = new StringBuilder(); + ResourceManager.NAMEPLATES.keySet().forEach(key -> { + if (key.equalsIgnoreCase("none")) return; + stringBuilder.append(key).append(" "); + }); + AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.bb_available.replace("{Bubbles}", stringBuilder.toString())); + } + else if (player.hasPermission("bubbles.list")) { + List availableBubbles = new ArrayList<>(); + for (PermissionAttachmentInfo info : player.getEffectivePermissions()) { + String permission = info.getPermission().toLowerCase(); + if (permission.startsWith("bubbles.equip.")) { + permission = StringUtils.replace(permission, "bubbles.equip.", ""); + if (ResourceManager.NAMEPLATES.get(permission) != null) { + availableBubbles.add(permission); + } + } + } + if (availableBubbles.size() != 0) { + StringBuilder stringBuilder = new StringBuilder(); + for (String str : availableBubbles) { + stringBuilder.append(str).append(" "); + } + AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.bb_available.replace("{Bubbles}", stringBuilder.toString())); + } + else { + AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.bb_haveNone); + } + } + else AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.noPerm); + } + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.no_console); + return true; + } + default -> { + if (sender instanceof Player player){ + if (player.hasPermission("nameplates.help")){ + AdventureUtil.playerMessage(player,"/bubbles help - show the command list"); + AdventureUtil.playerMessage(player,"/bubbles equip - equip a specified bubble"); + AdventureUtil.playerMessage(player,"/bubbles forceequip - force a player to equip a specified bubble"); + AdventureUtil.playerMessage(player,"/bubbles unequip - unequip your bubble"); + AdventureUtil.playerMessage(player,"/bubbles forceunequip - force unequip a player's bubble"); + AdventureUtil.playerMessage(player,"/bubbles list - list your available bubbles"); + } + } + else { + AdventureUtil.consoleMessage("/bubbles help - show the command list"); + AdventureUtil.consoleMessage("/bubbles equip - equip a specified bubble"); + AdventureUtil.consoleMessage("/bubbles forceequip - force a player to equip a specified bubble"); + AdventureUtil.consoleMessage("/bubbles unequip - unequip your bubble"); + AdventureUtil.consoleMessage("/bubbles forceunequip - force unequip a player's bubble"); + AdventureUtil.consoleMessage("/bubbles list - list your available bubbles"); + } + return true; + } + } + } +} diff --git a/src/main/java/net/momirealms/customnameplates/commands/bb/TabCompleteB.java b/src/main/java/net/momirealms/customnameplates/commands/bb/TabCompleteB.java new file mode 100644 index 0000000..a3f5f1f --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/commands/bb/TabCompleteB.java @@ -0,0 +1,102 @@ +package net.momirealms.customnameplates.commands.bb; + +import net.momirealms.customnameplates.resource.ResourceManager; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class TabCompleteB implements TabCompleter { + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { + + if(1 == args.length){ + + List tab = new ArrayList<>(); + if (sender.hasPermission("bubbles.help")) tab.add("help"); + if (sender.hasPermission("bubbles.equip")) tab.add("equip"); + if (sender.hasPermission("bubbles.forceequip")) tab.add("forceequip"); + if (sender.hasPermission("bubbles.unequip")) tab.add("unequip"); + if (sender.hasPermission("bubbles.forceunequip")) tab.add("forceunequip"); + if (sender.hasPermission("bubbles.list")) tab.add("list"); + + List arrayList = new ArrayList<>(); + for (String cmd : tab) { + if (cmd.startsWith(args[0])) + arrayList.add(cmd); + } + return arrayList; + } + if(2 == args.length){ + if (args[0].equalsIgnoreCase("equip")){ + List arrayList = new ArrayList<>(); + for (String cmd : availableBubbles(sender)) { + if (cmd.startsWith(args[1])) + arrayList.add(cmd); + } + return arrayList; + } + if (args[0].equalsIgnoreCase("forceunequip") && sender.hasPermission("bubbles.forceunequip")){ + List arrayList = new ArrayList<>(); + for (String cmd : online_players()) { + if (cmd.startsWith(args[1])) + arrayList.add(cmd); + } + return arrayList; + } + if (args[0].equalsIgnoreCase("forceequip") && sender.hasPermission("bubbles.forceequip")){ + List arrayList = new ArrayList<>(); + for (String cmd : online_players()) { + if (cmd.startsWith(args[1])) + arrayList.add(cmd); + } + return arrayList; + } + } + if(3 == args.length){ + if (args[0].equalsIgnoreCase("forceequip") && sender.hasPermission("bubbles.forceequip")){ + List arrayList = new ArrayList<>(); + for (String cmd : bubbles()) { + if (cmd.startsWith(args[2])) + arrayList.add(cmd); + } + return arrayList; + } + } + return null; + } + + private static List online_players(){ + List online = new ArrayList<>(); + Bukkit.getOnlinePlayers().forEach((player -> online.add(player.getName()))); + return online; + } + + private List availableBubbles(CommandSender sender){ + List availableBubbles = new ArrayList<>(); + if (sender instanceof Player player){ + for (PermissionAttachmentInfo info : player.getEffectivePermissions()) { + String permission = info.getPermission().toLowerCase(); + if (permission.startsWith("bubbles.equip.")) { + permission = StringUtils.replace(permission, "bubbles.equip.", ""); + if (ResourceManager.NAMEPLATES.get(permission) != null){ + availableBubbles.add(permission); + } + } + } + } + return availableBubbles; + } + + private List bubbles(){ + return new ArrayList<>(ResourceManager.NAMEPLATES.keySet()); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/commands/Execute.java b/src/main/java/net/momirealms/customnameplates/commands/np/ExecuteN.java similarity index 89% rename from src/main/java/net/momirealms/customnameplates/commands/Execute.java rename to src/main/java/net/momirealms/customnameplates/commands/np/ExecuteN.java index fc8d5bb..84f6a1c 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/Execute.java +++ b/src/main/java/net/momirealms/customnameplates/commands/np/ExecuteN.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.commands; +package net.momirealms.customnameplates.commands.np; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; @@ -38,9 +38,11 @@ import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionAttachmentInfo; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; -public class Execute implements CommandExecutor { +public class ExecuteN implements CommandExecutor { private final HashMap coolDown = new HashMap<>(); @@ -64,17 +66,13 @@ public class Execute implements CommandExecutor { if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.reload); else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.reload); - } - else AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.noPerm); - return true; - } - //生成资源包 - case "generate" -> { - if (sender.hasPermission("nameplates.generate") || sender.isOp()) { - ConfigManager.Main.reload(); - CustomNameplates.instance.getResourceManager().generateResourcePack(); + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.generate); else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.generate); + CustomNameplates.instance.getResourceManager().generateResourcePack(); + + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.generateDone); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.generateDone); } else AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.noPerm); return true; @@ -91,17 +89,17 @@ public class Execute implements CommandExecutor { if (sender.hasPermission("nameplates.equip." + args[1]) || sender.isOp()) { if (CustomNameplates.instance.getResourceManager().getNameplateInstance(args[1]) == null) { - AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.not_exist); + AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.np_not_exist); return true; } CustomNameplates.instance.getDataManager().getCache().get(player.getUniqueId()).equipNameplate(args[1]); CustomNameplates.instance.getDataManager().savePlayer(player.getUniqueId()); CustomNameplates.instance.getTeamManager().getTeams().get(TeamManager.getTeamName(player)).updateNameplates(); CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(player); - AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.equip.replace("{Nameplate}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[1]).getConfig().getName())); + AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.np_equip.replace("{Nameplate}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[1]).getConfig().getName())); } - else AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.notAvailable); + else AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.np_notAvailable); } else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.no_console); @@ -120,16 +118,16 @@ public class Execute implements CommandExecutor { Player player = Bukkit.getPlayer(args[1]); if (player != null){ if (CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]) == null){ - if(sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.not_exist); - else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.not_exist); + if(sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.np_not_exist); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.np_not_exist); return true; } CustomNameplates.instance.getDataManager().getCache().get(player.getUniqueId()).equipNameplate(args[2]); CustomNameplates.instance.getDataManager().savePlayer(player.getUniqueId()); CustomNameplates.instance.getTeamManager().getTeams().get(TeamManager.getTeamName(player)).updateNameplates(); CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(player); - if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.force_equip.replace("{Nameplate}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]).getConfig().getName()).replace("{Player}", args[1])); - else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.force_equip.replace("{Nameplate}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]).getConfig().getName()).replace("{Player}", args[1])); + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.np_force_equip.replace("{Nameplate}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]).getConfig().getName()).replace("{Player}", args[1])); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.np_force_equip.replace("{Nameplate}", CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]).getConfig().getName()).replace("{Player}", args[1])); }else { if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.not_online.replace("{Player}",args[1])); else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.not_online.replace("{Player}",args[1])); @@ -147,7 +145,7 @@ public class Execute implements CommandExecutor { CustomNameplates.instance.getDataManager().savePlayer(player.getUniqueId()); CustomNameplates.instance.getTeamManager().getTeams().get(TeamManager.getTeamName(player)).updateNameplates(); CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(player); - AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.unEquip); + AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.np_unEquip); } else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.no_console); @@ -170,8 +168,8 @@ public class Execute implements CommandExecutor { CustomNameplates.instance.getDataManager().savePlayer(player.getUniqueId()); CustomNameplates.instance.getTeamManager().getTeams().get(TeamManager.getTeamName(player)).updateNameplates(); CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(player); - if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.force_unEquip.replace("{Player}", args[1])); - else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.force_unEquip.replace("{Player}", args[1])); + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.np_force_unEquip.replace("{Player}", args[1])); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.np_force_unEquip.replace("{Player}", args[1])); }else { if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.not_online.replace("{Player}",args[1])); else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.not_online.replace("{Player}",args[1])); @@ -240,8 +238,8 @@ public class Execute implements CommandExecutor { } NameplateInstance nameplateInstance = CustomNameplates.instance.getResourceManager().getNameplateInstance(args[2]); if (nameplateInstance == null){ - if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.not_exist); - else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.not_exist); + if (sender instanceof Player) AdventureUtil.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.np_not_exist); + else AdventureUtil.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.np_not_exist); return true; } long time = System.currentTimeMillis(); @@ -284,20 +282,29 @@ public class Execute implements CommandExecutor { if (key.equalsIgnoreCase("none")) return; stringBuilder.append(key).append(" "); }); - AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.available.replace("{Nameplates}", stringBuilder.toString())); + AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.np_available.replace("{Nameplates}", stringBuilder.toString())); } else if (player.hasPermission("nameplates.list")) { - StringBuilder stringBuilder = new StringBuilder(); + List availableNameplates = new ArrayList<>(); for (PermissionAttachmentInfo info : player.getEffectivePermissions()) { String permission = info.getPermission().toLowerCase(); if (permission.startsWith("nameplates.equip.")) { permission = StringUtils.replace(permission, "nameplates.equip.", ""); if (ResourceManager.NAMEPLATES.get(permission) != null) { - stringBuilder.append(permission).append(" "); + availableNameplates.add(permission); } } } - AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.available.replace("{Nameplates}", stringBuilder.toString())); + if (availableNameplates.size() != 0) { + StringBuilder stringBuilder = new StringBuilder(); + for (String str : availableNameplates) { + stringBuilder.append(str).append(" "); + } + AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.np_available.replace("{Nameplates}", stringBuilder.toString())); + } + else { + AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.np_haveNone); + } } else AdventureUtil.playerMessage(player, ConfigManager.Message.prefix + ConfigManager.Message.noPerm); } @@ -317,7 +324,6 @@ public class Execute implements CommandExecutor { AdventureUtil.playerMessage(player,"/nameplates preview - preview your nameplate"); AdventureUtil.playerMessage(player,"/nameplates forcepreview - force a player to preview a nameplate"); AdventureUtil.playerMessage(player,"/nameplates list - list your available nameplates"); - AdventureUtil.playerMessage(player,"/nameplates generate - generate the resource pack"); } } else { @@ -330,7 +336,6 @@ public class Execute implements CommandExecutor { AdventureUtil.consoleMessage("/nameplates preview - preview your nameplate"); AdventureUtil.consoleMessage("/nameplates forcepreview - force a player to preview a nameplate"); AdventureUtil.consoleMessage("/nameplates list - list your available nameplates"); - AdventureUtil.consoleMessage("/nameplates generate - generate the resource pack"); } return true; } diff --git a/src/main/java/net/momirealms/customnameplates/commands/TabComplete.java b/src/main/java/net/momirealms/customnameplates/commands/np/TabCompleteN.java similarity index 96% rename from src/main/java/net/momirealms/customnameplates/commands/TabComplete.java rename to src/main/java/net/momirealms/customnameplates/commands/np/TabCompleteN.java index ef85b4a..778c8e7 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/TabComplete.java +++ b/src/main/java/net/momirealms/customnameplates/commands/np/TabCompleteN.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.commands; +package net.momirealms.customnameplates.commands.np; import net.momirealms.customnameplates.resource.ResourceManager; import org.apache.commons.lang.StringUtils; @@ -31,7 +31,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; import java.util.List; -public class TabComplete implements TabCompleter { +public class TabCompleteN implements TabCompleter { @Override @ParametersAreNonnullByDefault @@ -49,7 +49,6 @@ public class TabComplete implements TabCompleter { if (sender.hasPermission("nameplates.forcepreview")) tab.add("forcepreview"); if (sender.hasPermission("nameplates.preview")) tab.add("preview"); if (sender.hasPermission("nameplates.list")) tab.add("list"); - if (sender.hasPermission("nameplates.generate")) tab.add("generate"); List arrayList = new ArrayList<>(); for (String cmd : tab) { diff --git a/src/main/java/net/momirealms/customnameplates/data/DataManager.java b/src/main/java/net/momirealms/customnameplates/data/DataManager.java index 4a92580..45d1353 100644 --- a/src/main/java/net/momirealms/customnameplates/data/DataManager.java +++ b/src/main/java/net/momirealms/customnameplates/data/DataManager.java @@ -33,7 +33,7 @@ public class DataManager { public PlayerData getOrEmpty(Player player) { if (cache.get(player.getUniqueId()) == null) { - return new PlayerData("none"); + return new PlayerData("none","none"); } else { return cache.get(player.getUniqueId()); @@ -45,7 +45,7 @@ public class DataManager { if (ConfigManager.DatabaseConfig.async) { Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.instance, () -> { PlayerData playerData = SqlHandler.getPlayerData(uuid); - cache.put(uuid, Optional.ofNullable(playerData).orElse(new PlayerData(ConfigManager.Nameplate.default_nameplate))); + cache.put(uuid, Optional.ofNullable(playerData).orElse(new PlayerData(ConfigManager.Nameplate.default_nameplate, ConfigManager.Bubbles.defaultBubble))); CustomNameplates.instance.getTeamManager().createTeam(player); CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(player); CustomNameplates.instance.getTeamPacketManager().sendUpdateToOne(player); @@ -53,7 +53,7 @@ public class DataManager { } else { PlayerData playerData = SqlHandler.getPlayerData(uuid); - cache.put(uuid, Optional.ofNullable(playerData).orElse(new PlayerData(ConfigManager.Nameplate.default_nameplate))); + cache.put(uuid, Optional.ofNullable(playerData).orElse(new PlayerData(ConfigManager.Nameplate.default_nameplate, ConfigManager.Bubbles.defaultBubble))); CustomNameplates.instance.getTeamManager().createTeam(player); Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.instance, () -> { CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(player); @@ -68,7 +68,7 @@ public class DataManager { } PlayerData playerData = SqlHandler.getPlayerData(uuid); if (playerData == null) { - playerData = new PlayerData(ConfigManager.Nameplate.default_nameplate); + playerData = new PlayerData(ConfigManager.Nameplate.default_nameplate, ConfigManager.Bubbles.defaultBubble); } cache.put(uuid, playerData); return playerData; diff --git a/src/main/java/net/momirealms/customnameplates/data/PlayerData.java b/src/main/java/net/momirealms/customnameplates/data/PlayerData.java index 22f92df..48102b6 100644 --- a/src/main/java/net/momirealms/customnameplates/data/PlayerData.java +++ b/src/main/java/net/momirealms/customnameplates/data/PlayerData.java @@ -19,13 +19,15 @@ package net.momirealms.customnameplates.data; public class PlayerData { - public static PlayerData EMPTY = new PlayerData("none"); + public static PlayerData EMPTY = new PlayerData("none","none"); private String equipped; + private String bubbles; // private boolean accepted; - public PlayerData(String equipped) { + public PlayerData(String equipped, String bubbles) { this.equipped = equipped; + this.bubbles = bubbles; // this.accepted = accepted; } @@ -45,4 +47,11 @@ public class PlayerData { this.equipped = nameplate.toLowerCase(); } + public String getBubbles() { + return bubbles; + } + + public void setBubbles(String bubbles) { + this.bubbles = bubbles; + } } diff --git a/src/main/java/net/momirealms/customnameplates/data/SqlHandler.java b/src/main/java/net/momirealms/customnameplates/data/SqlHandler.java index 46fc5e9..4b6b3dd 100644 --- a/src/main/java/net/momirealms/customnameplates/data/SqlHandler.java +++ b/src/main/java/net/momirealms/customnameplates/data/SqlHandler.java @@ -72,11 +72,11 @@ public class SqlHandler { String query; if (ConfigManager.DatabaseConfig.use_mysql) { query = "CREATE TABLE IF NOT EXISTS " + ConfigManager.DatabaseConfig.tableName - + "(player VARCHAR(50) NOT NULL, equipped VARCHAR(50) NOT NULL, accepted INT(1) NOT NULL," + + "(player VARCHAR(50) NOT NULL, equipped VARCHAR(50) NOT NULL, bubble VARCHAR(50) NOT NULL," + " PRIMARY KEY (player)) DEFAULT charset = " + ConfigManager.DatabaseConfig.ENCODING + ";"; } else { query = "CREATE TABLE IF NOT EXISTS " + ConfigManager.DatabaseConfig.tableName - + "(player VARCHAR(50) NOT NULL, equipped VARCHAR(50) NOT NULL, accepted INT(1) NOT NULL," + + "(player VARCHAR(50) NOT NULL, equipped VARCHAR(50) NOT NULL, bubble VARCHAR(50) NOT NULL," + " PRIMARY KEY (player));"; } statement.executeUpdate(query); @@ -87,6 +87,24 @@ public class SqlHandler { } } + public static void updateTable() { + try { + Connection connection = database.getConnectionAndCheck(); + Statement statement = connection.createStatement(); + if (statement == null) { + return; + } + String query1 = "ALTER TABLE " + ConfigManager.DatabaseConfig.tableName + " DROP COLUMN accepted;"; + String query2 = "ALTER TABLE " + ConfigManager.DatabaseConfig.tableName + " ADD COLUMN bubble VARCHAR(50) NOT NULL DEFAULT 'none';"; + statement.executeUpdate(query1); + statement.executeUpdate(query2); + statement.close(); + database.closeHikariConnection(connection); + } catch (SQLException e) { + e.printStackTrace(); + } + } + @Nullable public static PlayerData getPlayerData(UUID uuid) { PlayerData playerData = null; @@ -97,13 +115,13 @@ public class SqlHandler { statement.setString(1, uuid.toString()); ResultSet rs = statement.executeQuery(); if (rs.next()) { - playerData = new PlayerData(rs.getString(2)); + playerData = new PlayerData(rs.getString(2), rs.getString(3)); }else { - sql = "INSERT INTO " + ConfigManager.DatabaseConfig.tableName + "(player,equipped,accepted) values(?,?,?)"; + sql = "INSERT INTO " + ConfigManager.DatabaseConfig.tableName + "(player,equipped,bubble) values(?,?,?)"; statement = connection.prepareStatement(sql); statement.setString(1, uuid.toString()); statement.setString(2, ConfigManager.Nameplate.default_nameplate); - statement.setInt(3, 0); + statement.setString(3, ConfigManager.Bubbles.defaultBubble); statement.executeUpdate(); } rs.close(); @@ -118,10 +136,10 @@ public class SqlHandler { public static void save(PlayerData playerData, UUID uuid) { Connection connection = database.getConnectionAndCheck(); try { - String query = " SET equipped = ?, accepted = ? WHERE player = ?"; + String query = " SET equipped = ?, bubble = ? WHERE player = ?"; PreparedStatement statement = connection.prepareStatement("UPDATE " + ConfigManager.DatabaseConfig.tableName + query); statement.setString(1, playerData.getEquippedNameplate()); - statement.setInt(2, 1); + statement.setString(2, playerData.getBubbles()); statement.setString(3, uuid.toString()); statement.executeUpdate(); statement.close(); @@ -137,10 +155,10 @@ public class SqlHandler { Bukkit.getOnlinePlayers().forEach(player -> { try { PlayerData playerData = data.get(player.getUniqueId()); - String query = " SET equipped = ?, accepted = ? WHERE player = ?"; + String query = " SET equipped = ?, bubble = ? WHERE player = ?"; PreparedStatement statement = connection.prepareStatement("UPDATE " + ConfigManager.DatabaseConfig.tableName + query); statement.setString(1, playerData.getEquippedNameplate()); - statement.setInt(2, 1); + statement.setString(2, playerData.getBubbles()); statement.setString(3, String.valueOf(player.getUniqueId())); statement.executeUpdate(); statement.close(); diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/ArmorStandManager.java b/src/main/java/net/momirealms/customnameplates/nameplates/ArmorStandManager.java index 5329dba..6356d0e 100644 --- a/src/main/java/net/momirealms/customnameplates/nameplates/ArmorStandManager.java +++ b/src/main/java/net/momirealms/customnameplates/nameplates/ArmorStandManager.java @@ -39,14 +39,15 @@ public class ArmorStandManager { private final Player owner; - public ArmorStandManager(Player owner, boolean isBubbles) { - Set> entries = ConfigManager.Nameplate.textMap.entrySet(); + public ArmorStandManager(Player owner) { this.owner = owner; - if (!isBubbles) { - entries.forEach(map -> { - addArmorStand(map.getKey(), new FakeArmorStand(this, owner, new TextCache(owner, map.getKey()), map.getValue())); - }); - } + } + + public void addDefault() { + Set> entries = ConfigManager.Nameplate.textMap.entrySet(); + entries.forEach(map -> { + addArmorStand(map.getKey(), new FakeArmorStand(this, owner, new TextCache(owner, map.getKey()), map.getValue())); + }); } public void addArmorStand(String name, ArmorStand as) { @@ -150,6 +151,7 @@ public class ArmorStandManager { public void run() { as.destroy(); armorStands.remove(random); + armorStandArray = armorStands.values().toArray(new ArmorStand[0]); } }.runTaskLater(CustomNameplates.instance, ConfigManager.Bubbles.stayTime * 20L); } diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/NameplateConfig.java b/src/main/java/net/momirealms/customnameplates/nameplates/NameplateConfig.java index 27c5339..65cd4ca 100644 --- a/src/main/java/net/momirealms/customnameplates/nameplates/NameplateConfig.java +++ b/src/main/java/net/momirealms/customnameplates/nameplates/NameplateConfig.java @@ -21,9 +21,9 @@ import org.bukkit.ChatColor; import java.util.Objects; -public record NameplateConfig(ChatColor color, int height, String name, int yoffset) { +public record NameplateConfig(ChatColor color, int height, String name, int yoffset, String bubbleColor) { - public static NameplateConfig EMPTY = new NameplateConfig(ChatColor.WHITE, 16, "none", 12); + public static NameplateConfig EMPTY = new NameplateConfig(ChatColor.WHITE, 16, "none", 12, ""); public ChatColor getColor() { return this.color; @@ -41,6 +41,10 @@ public record NameplateConfig(ChatColor color, int height, String name, int yoff return this.yoffset; } + public String bubbleColor() { + return bubbleColor; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/BBPacketsHandle.java b/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/BBPacketsHandle.java deleted file mode 100644 index 42d82d1..0000000 --- a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/BBPacketsHandle.java +++ /dev/null @@ -1,132 +0,0 @@ -package net.momirealms.customnameplates.nameplates.bubbles; - -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.momirealms.customnameplates.ConfigManager; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.Function; -import net.momirealms.customnameplates.data.PlayerData; -import net.momirealms.customnameplates.nameplates.ArmorStandManager; -import net.momirealms.customnameplates.nameplates.FakeArmorStand; -import net.momirealms.customnameplates.nameplates.NameplateInstance; -import net.momirealms.customnameplates.nameplates.NameplateUtil; -import net.momirealms.customnameplates.nameplates.bubbles.lis.*; -import net.momirealms.customnameplates.resource.ResourceManager; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; - -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -public class BBPacketsHandle extends Function { - - protected Map entityIdMap = new ConcurrentHashMap<>(); - - private final ChatBubblesManager chatBubblesManager; - - private ChatListener chatListener; - - private EntityDestroy entityDestroy; - private EntityMove entityMove; - private EntitySpawn entitySpawn; - private EntityLook entityLook; - private EntityTeleport entityTeleport; - - protected BBPacketsHandle(String name, ChatBubblesManager chatBubblesManager) { - super(name); - this.chatBubblesManager = chatBubblesManager; - } - - @Override - public void load() { - super.load(); - - this.chatListener = new ChatListener(this); - Bukkit.getPluginManager().registerEvents(chatListener, CustomNameplates.instance); - - this.entityDestroy = new EntityDestroy(this); - this.entityMove = new EntityMove(this); - this.entitySpawn = new EntitySpawn(this); - this.entityLook = new EntityLook(this); - this.entityTeleport = new EntityTeleport(this); - CustomNameplates.protocolManager.addPacketListener(entityDestroy); - CustomNameplates.protocolManager.addPacketListener(entityMove); - CustomNameplates.protocolManager.addPacketListener(entitySpawn); - CustomNameplates.protocolManager.addPacketListener(entityLook); - CustomNameplates.protocolManager.addPacketListener(entityTeleport); - } - - @Override - public void unload() { - super.unload(); - HandlerList.unregisterAll(chatListener); - CustomNameplates.protocolManager.removePacketListener(entityDestroy); - CustomNameplates.protocolManager.removePacketListener(entitySpawn); - CustomNameplates.protocolManager.removePacketListener(entityMove); - CustomNameplates.protocolManager.removePacketListener(entityLook); - CustomNameplates.protocolManager.removePacketListener(entityTeleport); - } - - public void onEntityMove(Player receiver, int entityId) { - Player mover = getPlayerFromMap(entityId); - if (mover != null) { - chatBubblesManager.getArmorStandManager(mover).teleport(receiver); - } - } - - public void onEntitySpawn(Player receiver, int entityId) { - Player spawnedPlayer = getPlayerFromMap(entityId); - if (spawnedPlayer != null) { - chatBubblesManager.getArmorStandManager(spawnedPlayer).spawn(receiver); - } - } - - public void onEntityDestroy(Player receiver, List entities) { - for (int entity : entities) { - onEntityDestroy(receiver, entity); - } - } - - public void onEntityDestroy(Player receiver, int entity) { - Player deSpawnedPlayer = getPlayerFromMap(entity); - if (deSpawnedPlayer != null) { - chatBubblesManager.getArmorStandManager(deSpawnedPlayer).destroy(receiver); - } - } - - public Player getPlayerFromMap(int entityID) { - return entityIdMap.get(entityID); - } - - public void onChat(Player player, String text) { - PlayerData playerData = CustomNameplates.instance.getDataManager().getOrEmpty(player); - String nameplateName = playerData.getEquippedNameplate(); - NameplateInstance nameplateInstance = ResourceManager.NAMEPLATES.get(nameplateName); - String nameplate = NameplateUtil.makeCustomNameplate("", text, "", nameplateInstance); - String suffix = NameplateUtil.getSuffixChar(text); - Component armorStand_Name = Component.text(nameplate).font(ConfigManager.Main.key).append(Component.text(text).font(Key.key("minecraft:default"))).append(Component.text(suffix).font(ConfigManager.Main.key)); - WrappedChatComponent wrappedChatComponent = WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(armorStand_Name)); - - ArmorStandManager asm = chatBubblesManager.getArmorStandManager(player); - asm.ascent(); - String name = UUID.randomUUID().toString(); - FakeArmorStand fakeArmorStand = new FakeArmorStand(asm, player, wrappedChatComponent); - asm.addArmorStand(name, fakeArmorStand); - asm.countdown(name, fakeArmorStand); - } - - public void onJoin(Player player) { - entityIdMap.put(player.getEntityId(), player); - chatBubblesManager.onJoin(player); - } - - public void onQuit(Player player) { - entityIdMap.remove(player.getEntityId()); - chatBubblesManager.onQuit(player); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/ChatBubblesManager.java b/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/ChatBubblesManager.java deleted file mode 100644 index 9a36479..0000000 --- a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/ChatBubblesManager.java +++ /dev/null @@ -1,82 +0,0 @@ -package net.momirealms.customnameplates.nameplates.bubbles; - -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.momirealms.customnameplates.ConfigManager; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.Function; -import net.momirealms.customnameplates.data.PlayerData; -import net.momirealms.customnameplates.nameplates.ArmorStandManager; -import net.momirealms.customnameplates.nameplates.FakeArmorStand; -import net.momirealms.customnameplates.nameplates.NameplateInstance; -import net.momirealms.customnameplates.nameplates.NameplateUtil; -import net.momirealms.customnameplates.nameplates.mode.EntityTag; -import net.momirealms.customnameplates.resource.ResourceManager; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.HashMap; - -public class ChatBubblesManager extends Function { - - protected final HashMap armorStandManagerMap = new HashMap<>(); - - private BBPacketsHandle packetsHandle; - - public ChatBubblesManager(String name) { - super(name); - } - - @Override - public void load() { - - this.packetsHandle = new BBPacketsHandle("BUBBLES", this); - this.packetsHandle.load(); - - for (Player all : Bukkit.getOnlinePlayers()) { - armorStandManagerMap.put(all, new ArmorStandManager(all, true)); - for (Player player : Bukkit.getOnlinePlayers()) - spawnArmorStands(player, all); - } - } - - @Override - public void unload() { - this.packetsHandle.unload(); - } - - private void spawnArmorStands(Player viewer, Player target) { - if (target == viewer) return; - if (viewer.getWorld() != target.getWorld()) return; - if (getDistance(target, viewer) < 48 && viewer.canSee(target)) - getArmorStandManager(target).spawn(viewer); - } - - private double getDistance(Player player1, Player player2) { - Location loc1 = player1.getLocation(); - Location loc2 = player2.getLocation(); - return Math.sqrt(Math.pow(loc1.getX()-loc2.getX(), 2) + Math.pow(loc1.getZ()-loc2.getZ(), 2)); - } - - public ArmorStandManager getArmorStandManager(Player player) { - return armorStandManagerMap.get(player); - } - - public void onJoin(Player player) { - armorStandManagerMap.put(player, new ArmorStandManager(player, true)); - for (Player viewer : Bukkit.getOnlinePlayers()) { - spawnArmorStands(viewer, player); - spawnArmorStands(player, viewer); - } - } - - public void onQuit(Player player) { - ArmorStandManager asm = armorStandManagerMap.remove(player); - if (asm != null) { - asm.destroy(); - } - } -} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/ChatListener.java b/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/ChatListener.java deleted file mode 100644 index 879cb3e..0000000 --- a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/ChatListener.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.momirealms.customnameplates.nameplates.bubbles; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - -public record ChatListener( - BBPacketsHandle bbPacketsHandle) implements Listener { - - @EventHandler - public void onChat(AsyncPlayerChatEvent event) { - bbPacketsHandle.onChat(event.getPlayer(), event.getMessage()); - } - - @EventHandler - public void onJoin(PlayerJoinEvent event) { - bbPacketsHandle.onJoin(event.getPlayer()); - } - - @EventHandler - public void onQuit(PlayerQuitEvent event) { - bbPacketsHandle.onQuit(event.getPlayer()); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityDestroy.java b/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityDestroy.java deleted file mode 100644 index 3c87a92..0000000 --- a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityDestroy.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.nameplates.bubbles.lis; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketAdapter; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.nameplates.bubbles.BBPacketsHandle; - -public class EntityDestroy extends PacketAdapter { - - private final BBPacketsHandle handler; - - public EntityDestroy(BBPacketsHandle handler) { - super(CustomNameplates.instance, ListenerPriority.HIGHEST, PacketType.Play.Server.ENTITY_DESTROY); - this.handler = handler; - } - - public void onPacketSending(PacketEvent event) { - PacketContainer packet = event.getPacket(); - handler.onEntityDestroy(event.getPlayer(), packet.getIntLists().read(0)); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityLook.java b/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityLook.java deleted file mode 100644 index 7d3d612..0000000 --- a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityLook.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.nameplates.bubbles.lis; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketAdapter; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.nameplates.bubbles.BBPacketsHandle; - -public class EntityLook extends PacketAdapter { - - private final BBPacketsHandle handler; - - public EntityLook(BBPacketsHandle handler) { - super(CustomNameplates.instance, ListenerPriority.HIGHEST, PacketType.Play.Server.REL_ENTITY_MOVE_LOOK); - this.handler = handler; - } - - public void onPacketSending(PacketEvent event) { - PacketContainer packet = event.getPacket(); - handler.onEntityMove(event.getPlayer(), packet.getIntegers().read(0)); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityMove.java b/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityMove.java deleted file mode 100644 index ad53441..0000000 --- a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityMove.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.nameplates.bubbles.lis; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketAdapter; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.nameplates.bubbles.BBPacketsHandle; - -public class EntityMove extends PacketAdapter { - - private final BBPacketsHandle handler; - - public EntityMove(BBPacketsHandle handler) { - super(CustomNameplates.instance, ListenerPriority.NORMAL, PacketType.Play.Server.REL_ENTITY_MOVE); - this.handler = handler; - } - - public void onPacketSending(PacketEvent event) { - PacketContainer packet = event.getPacket(); - handler.onEntityMove(event.getPlayer(), packet.getIntegers().read(0)); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntitySpawn.java b/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntitySpawn.java deleted file mode 100644 index a406eb4..0000000 --- a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntitySpawn.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.nameplates.bubbles.lis; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketAdapter; -import com.comphenix.protocol.events.PacketEvent; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.nameplates.bubbles.BBPacketsHandle; - -public class EntitySpawn extends PacketAdapter { - - private final BBPacketsHandle handler; - - public EntitySpawn(BBPacketsHandle handler) { - super(CustomNameplates.instance, ListenerPriority.HIGHEST, PacketType.Play.Server.NAMED_ENTITY_SPAWN); - this.handler = handler; - } - - public synchronized void onPacketSending(PacketEvent event) { - handler.onEntitySpawn(event.getPlayer(), event.getPacket().getIntegers().read(0)); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityTeleport.java b/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityTeleport.java deleted file mode 100644 index 7d76ca3..0000000 --- a/src/main/java/net/momirealms/customnameplates/nameplates/bubbles/lis/EntityTeleport.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.nameplates.bubbles.lis; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketAdapter; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.nameplates.bubbles.BBPacketsHandle; - -public class EntityTeleport extends PacketAdapter { - - private final BBPacketsHandle handler; - - public EntityTeleport(BBPacketsHandle handler) { - super(CustomNameplates.instance, ListenerPriority.HIGHEST, PacketType.Play.Server.ENTITY_TELEPORT); - this.handler = handler; - } - - public void onPacketSending(PacketEvent event) { - PacketContainer packet = event.getPacket(); - handler.onEntityMove(event.getPlayer(), packet.getIntegers().read(0)); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/mode/EntityTag.java b/src/main/java/net/momirealms/customnameplates/nameplates/mode/EntityTag.java index 6823e35..8e85411 100644 --- a/src/main/java/net/momirealms/customnameplates/nameplates/mode/EntityTag.java +++ b/src/main/java/net/momirealms/customnameplates/nameplates/mode/EntityTag.java @@ -17,13 +17,9 @@ package net.momirealms.customnameplates.nameplates.mode; -import net.momirealms.customnameplates.ConfigManager; -import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.nameplates.ArmorStandManager; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitTask; import java.util.concurrent.ConcurrentHashMap; @@ -31,35 +27,16 @@ public abstract class EntityTag extends NameplateManager { protected final ConcurrentHashMap armorStandManagerMap = new ConcurrentHashMap<>(); - protected BukkitTask bukkitTask; - protected EntityTag(String name) { super(name); } @Override public void load(){ - if (ConfigManager.Nameplate.update) { - bukkitTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.instance, () -> { - for (ArmorStandManager asm : armorStandManagerMap.values()) { - asm.refresh(false); - } - }, 20, ConfigManager.Nameplate.refresh); - } - else { - Bukkit.getScheduler().runTaskLaterAsynchronously(CustomNameplates.instance, () -> { - for (ArmorStandManager asm : armorStandManagerMap.values()) { - asm.refresh(false); - } - }, 20); - } } @Override public void unload(){ - if (bukkitTask != null) { - bukkitTask.cancel(); - } for (Player all : Bukkit.getOnlinePlayers()) { getArmorStandManager(all).destroy(); } @@ -69,24 +46,11 @@ public abstract class EntityTag extends NameplateManager { @Override public void onJoin(Player player) { super.onJoin(player); - armorStandManagerMap.put(player, new ArmorStandManager(player, false)); - for (Player viewer : Bukkit.getOnlinePlayers()) { - spawnArmorStands(viewer, player); - spawnArmorStands(player, viewer); - } } @Override public void onQuit(Player player) { super.onQuit(player); -// for (Player all : Bukkit.getOnlinePlayers()) { -// if (getArmorStandManager(all) == null) continue; -// getArmorStandManager(all) .unregisterPlayer(player); -// } - ArmorStandManager asm = armorStandManagerMap.remove(player); - if (asm != null) { - asm.destroy(); - } } // @Override @@ -107,17 +71,4 @@ public abstract class EntityTag extends NameplateManager { public void refresh(Player refreshed, boolean force) { getArmorStandManager(refreshed).refresh(force); } - - private void spawnArmorStands(Player viewer, Player target) { - if (target == viewer) return; - if (viewer.getWorld() != target.getWorld()) return; - if (getDistance(target, viewer) < 48 && viewer.canSee(target)) - getArmorStandManager(target).spawn(viewer); - } - - private double getDistance(Player player1, Player player2) { - Location loc1 = player1.getLocation(); - Location loc2 = player2.getLocation(); - return Math.sqrt(Math.pow(loc1.getX()-loc2.getX(), 2) + Math.pow(loc1.getZ()-loc2.getZ(), 2)); - } } diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/mode/PacketsHandler.java b/src/main/java/net/momirealms/customnameplates/nameplates/mode/PacketsHandler.java index 11cdd16..e340aed 100644 --- a/src/main/java/net/momirealms/customnameplates/nameplates/mode/PacketsHandler.java +++ b/src/main/java/net/momirealms/customnameplates/nameplates/mode/PacketsHandler.java @@ -69,9 +69,6 @@ public abstract class PacketsHandler extends Function { public void onEntityMove(Player receiver, int entityId) { } - public void onPlayerMove(Player mover) { - } - public void onEntitySpawn(Player receiver, int entityId) { } diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/BBPacketsHandle.java b/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/BBPacketsHandle.java new file mode 100644 index 0000000..cd0607c --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/BBPacketsHandle.java @@ -0,0 +1,85 @@ +package net.momirealms.customnameplates.nameplates.mode.bubbles; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.nameplates.listener.*; +import net.momirealms.customnameplates.nameplates.mode.PacketsHandler; +import org.bukkit.entity.Player; + +import java.util.List; + +public class BBPacketsHandle extends PacketsHandler { + + private final ChatBubblesManager chatBubblesManager; + + private EntityDestroyListener entityDestroyListener; + private EntityMoveListener entityMoveListener; + private EntitySpawnListener entitySpawnListener; + private EntityTeleportListener entityTeleportListener; + private EntityLookListener entityLookListener; + + protected BBPacketsHandle(String name, ChatBubblesManager chatBubblesManager) { + super(name, chatBubblesManager); + this.chatBubblesManager = chatBubblesManager; + } + + @Override + public void load() { + super.load(); + this.entityDestroyListener = new EntityDestroyListener(this); + this.entityMoveListener = new EntityMoveListener(this); + this.entitySpawnListener = new EntitySpawnListener(this); + this.entityTeleportListener = new EntityTeleportListener(this); + this.entityLookListener = new EntityLookListener(this); + CustomNameplates.protocolManager.addPacketListener(entityDestroyListener); + CustomNameplates.protocolManager.addPacketListener(entityMoveListener); + CustomNameplates.protocolManager.addPacketListener(entitySpawnListener); + CustomNameplates.protocolManager.addPacketListener(entityTeleportListener); + CustomNameplates.protocolManager.addPacketListener(entityLookListener); + } + + @Override + public void unload() { + super.unload(); + CustomNameplates.protocolManager.removePacketListener(entityDestroyListener); + CustomNameplates.protocolManager.removePacketListener(entityMoveListener); + CustomNameplates.protocolManager.removePacketListener(entitySpawnListener); + CustomNameplates.protocolManager.removePacketListener(entityTeleportListener); + CustomNameplates.protocolManager.removePacketListener(entityLookListener); + } + + @Override + public void onEntityMove(Player receiver, int entityId) { + Player mover = getPlayerFromMap(entityId); + if (mover != null) { + chatBubblesManager.getArmorStandManager(mover).teleport(receiver); + } + } + + @Override + public void onEntitySpawn(Player receiver, int entityId) { + Player spawnedPlayer = getPlayerFromMap(entityId); + if (spawnedPlayer != null) { + chatBubblesManager.getArmorStandManager(spawnedPlayer).spawn(receiver); + } + } + + @Override + public void onEntityDestroy(Player receiver, List entities) { + for (int entity : entities) { + onEntityDestroy(receiver, entity); + } + } + + @Override + public void onEntityDestroy(Player receiver, int entity) { + Player deSpawnedPlayer = getPlayerFromMap(entity); + if (deSpawnedPlayer != null) { + chatBubblesManager.getArmorStandManager(deSpawnedPlayer).destroy(receiver); + } + } + + @Override + public Player getPlayerFromMap(int entityID) { + return entityIdMap.get(entityID); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/ChatBubblesManager.java b/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/ChatBubblesManager.java new file mode 100644 index 0000000..a610b6a --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/ChatBubblesManager.java @@ -0,0 +1,123 @@ +package net.momirealms.customnameplates.nameplates.mode.bubbles; + +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.momirealms.customnameplates.ConfigManager; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.data.PlayerData; +import net.momirealms.customnameplates.nameplates.ArmorStandManager; +import net.momirealms.customnameplates.nameplates.FakeArmorStand; +import net.momirealms.customnameplates.nameplates.NameplateInstance; +import net.momirealms.customnameplates.nameplates.NameplateUtil; +import net.momirealms.customnameplates.nameplates.mode.EntityTag; +import net.momirealms.customnameplates.resource.ResourceManager; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +import java.util.UUID; + +public class ChatBubblesManager extends EntityTag { + + private BBPacketsHandle packetsHandle; + + private ChatListener chatListener; + + public ChatBubblesManager(String name) { + super(name); + } + + @Override + public void load() { + + this.packetsHandle = new BBPacketsHandle("BUBBLES", this); + this.packetsHandle.load(); + + this.chatListener = new ChatListener(this); + Bukkit.getPluginManager().registerEvents(chatListener, CustomNameplates.instance); + + for (Player all : Bukkit.getOnlinePlayers()) { + armorStandManagerMap.put(all, new ArmorStandManager(all)); + for (Player player : Bukkit.getOnlinePlayers()) + spawnArmorStands(player, all); + } + } + + @Override + public void unload() { + this.packetsHandle.unload(); + HandlerList.unregisterAll(chatListener); + super.unload(); + } + + private void spawnArmorStands(Player viewer, Player target) { + if (target == viewer) return; + if (viewer.getWorld() != target.getWorld()) return; + if (getDistance(target, viewer) < 48 && viewer.canSee(target)) + getArmorStandManager(target).spawn(viewer); + } + + private double getDistance(Player player1, Player player2) { + Location loc1 = player1.getLocation(); + Location loc2 = player2.getLocation(); + return Math.sqrt(Math.pow(loc1.getX()-loc2.getX(), 2) + Math.pow(loc1.getZ()-loc2.getZ(), 2)); + } + + public ArmorStandManager getArmorStandManager(Player player) { + return armorStandManagerMap.get(player); + } + + @Override + public void onJoin(Player player) { + armorStandManagerMap.put(player, new ArmorStandManager(player)); + for (Player viewer : Bukkit.getOnlinePlayers()) { + spawnArmorStands(viewer, player); + spawnArmorStands(player, viewer); + } + } + + @Override + public void onQuit(Player player) { + ArmorStandManager asm = armorStandManagerMap.remove(player); + if (asm != null) { + asm.destroy(); + } + } + + public void onChat(Player player, String text) { + PlayerData playerData = CustomNameplates.instance.getDataManager().getOrEmpty(player); + String bubbles = playerData.getBubbles(); + NameplateInstance bubblesInstance = ResourceManager.NAMEPLATES.get(bubbles); + WrappedChatComponent wrappedChatComponent; + if (bubblesInstance == null || bubbles.equals("none")) { + text = ConfigManager.Main.placeholderAPI ? + CustomNameplates.instance.getPlaceholderManager().parsePlaceholders(player, ConfigManager.Bubbles.prefix) + ConfigManager.Bubbles.defaultFormat + text + CustomNameplates.instance.getPlaceholderManager().parsePlaceholders(player, ConfigManager.Bubbles.suffix) + : + ConfigManager.Bubbles.prefix + text + ConfigManager.Bubbles.suffix; + wrappedChatComponent = WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(text))); + } + else { + text = ConfigManager.Main.placeholderAPI ? + CustomNameplates.instance.getPlaceholderManager().parsePlaceholders(player, ConfigManager.Bubbles.prefix) + bubblesInstance.getConfig().bubbleColor() + text + CustomNameplates.instance.getPlaceholderManager().parsePlaceholders(player, ConfigManager.Bubbles.suffix) + : + ConfigManager.Bubbles.prefix + text + ConfigManager.Bubbles.suffix; + String stripped = MiniMessage.miniMessage().stripTags(text); + String bubble = NameplateUtil.makeCustomNameplate("", stripped, "", bubblesInstance); + String suffix = NameplateUtil.getSuffixChar(stripped); + Component armorStand_Name = Component.text(bubble).font(ConfigManager.Main.key) + .append(MiniMessage.miniMessage().deserialize(text).font(Key.key("minecraft:default"))) + .append(Component.text(suffix).font(ConfigManager.Main.key)); + wrappedChatComponent = WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(armorStand_Name)); + } + ArmorStandManager asm = getArmorStandManager(player); + asm.ascent(); + String name = UUID.randomUUID().toString(); + FakeArmorStand fakeArmorStand = new FakeArmorStand(asm, player, wrappedChatComponent); + asm.addArmorStand(name, fakeArmorStand); + asm.countdown(name, fakeArmorStand); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/ChatListener.java b/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/ChatListener.java new file mode 100644 index 0000000..fded5a2 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/nameplates/mode/bubbles/ChatListener.java @@ -0,0 +1,17 @@ +package net.momirealms.customnameplates.nameplates.mode.bubbles; + +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public record ChatListener( + ChatBubblesManager chatBubblesManager) implements Listener { + + @EventHandler + public void onChat(AsyncPlayerChatEvent event) { + if (!event.isCancelled()) + chatBubblesManager.onChat(event.getPlayer(), MiniMessage.miniMessage().stripTags(ChatColor.stripColor(event.getMessage()))); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/mode/rd/RidingTag.java b/src/main/java/net/momirealms/customnameplates/nameplates/mode/rd/RidingTag.java index 0152711..4925089 100644 --- a/src/main/java/net/momirealms/customnameplates/nameplates/mode/rd/RidingTag.java +++ b/src/main/java/net/momirealms/customnameplates/nameplates/mode/rd/RidingTag.java @@ -26,6 +26,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; +import org.bukkit.scheduler.BukkitTask; public class RidingTag extends EntityTag { @@ -33,6 +34,8 @@ public class RidingTag extends EntityTag { private EventListenerE listener; + private BukkitTask refreshTask; + public RidingTag(String name) { super(name); } @@ -40,7 +43,9 @@ public class RidingTag extends EntityTag { @Override public void load() { for (Player all : Bukkit.getOnlinePlayers()) { - armorStandManagerMap.put(all, new ArmorStandManager(all, false)); + ArmorStandManager asm = new ArmorStandManager(all); + asm.addDefault(); + armorStandManagerMap.put(all, asm); CustomNameplates.instance.getTeamPacketManager().sendUpdateToOne(all); CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(all); for (Player player : Bukkit.getOnlinePlayers()) @@ -50,20 +55,32 @@ public class RidingTag extends EntityTag { this.handler.load(); listener = new EventListenerE(this); Bukkit.getPluginManager().registerEvents(listener, CustomNameplates.instance); - super.load(); + if (ConfigManager.Nameplate.update) { + refreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.instance, () -> { + for (ArmorStandManager asm : armorStandManagerMap.values()) { + asm.refresh(false); + } + }, 20, ConfigManager.Nameplate.refresh); + } + else { + Bukkit.getScheduler().runTaskLaterAsynchronously(CustomNameplates.instance, () -> { + for (ArmorStandManager asm : armorStandManagerMap.values()) { + asm.refresh(false); + } + }, 20); + } } @Override public void unload() { + if (refreshTask != null) { + refreshTask.cancel(); + } this.handler.unload(); HandlerList.unregisterAll(listener); super.unload(); } - @Override - public void onQuit(Player player) { - super.onQuit(player); - } // @Override // public void onRP(Player player, PlayerResourcePackStatusEvent.Status status) { @@ -102,4 +119,36 @@ public class RidingTag extends EntityTag { Location loc2 = player2.getLocation(); return Math.sqrt(Math.pow(loc1.getX()-loc2.getX(), 2) + Math.pow(loc1.getZ()-loc2.getZ(), 2)); } + + @Override + public void onJoin(Player player) { + ArmorStandManager asm = new ArmorStandManager(player); + asm.addDefault(); + armorStandManagerMap.put(player, asm); + for (Player viewer : Bukkit.getOnlinePlayers()) { + spawnArmorStands(viewer, player); + spawnArmorStands(player, viewer); + } + super.onJoin(player); + } + + private void spawnArmorStands(Player viewer, Player target) { + if (target == viewer) return; + if (viewer.getWorld() != target.getWorld()) return; + if (getDistance(target, viewer) < 48 && viewer.canSee(target)) + getArmorStandManager(target).spawn(viewer); + } + + @Override + public void onQuit(Player player) { +// for (Player all : Bukkit.getOnlinePlayers()) { +// if (getArmorStandManager(all) == null) continue; +// getArmorStandManager(all) .unregisterPlayer(player); +// } + ArmorStandManager asm = armorStandManagerMap.remove(player); + if (asm != null) { + asm.destroy(); + } + super.onQuit(player); + } } diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/mode/tp/TeleportingTag.java b/src/main/java/net/momirealms/customnameplates/nameplates/mode/tp/TeleportingTag.java index b76396b..774893b 100644 --- a/src/main/java/net/momirealms/customnameplates/nameplates/mode/tp/TeleportingTag.java +++ b/src/main/java/net/momirealms/customnameplates/nameplates/mode/tp/TeleportingTag.java @@ -36,7 +36,9 @@ public class TeleportingTag extends EntityTag { private TpPacketsHandler handler; - private BukkitTask task; + private BukkitTask vehicleTask; + + private BukkitTask refreshTask; public TeleportingTag(String name) { super(name); @@ -45,7 +47,9 @@ public class TeleportingTag extends EntityTag { @Override public void load() { for (Player all : Bukkit.getOnlinePlayers()) { - armorStandManagerMap.put(all, new ArmorStandManager(all, false)); + ArmorStandManager asm = new ArmorStandManager(all); + asm.addDefault(); + armorStandManagerMap.put(all, asm); CustomNameplates.instance.getTeamPacketManager().sendUpdateToOne(all); CustomNameplates.instance.getTeamPacketManager().sendUpdateToAll(all); for (Player player : Bukkit.getOnlinePlayers()) @@ -57,12 +61,25 @@ public class TeleportingTag extends EntityTag { this.handler.load(); this.vehicleChecker = new VehicleChecker(this); this.vehicleChecker.load(); - this.task = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.instance, () -> { + this.vehicleTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.instance, () -> { for (Player player : Bukkit.getOnlinePlayers()) { this.vehicleChecker.refresh(player); } },10,20); - super.load(); + if (ConfigManager.Nameplate.update) { + refreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.instance, () -> { + for (ArmorStandManager asm : armorStandManagerMap.values()) { + asm.refresh(false); + } + }, 20, ConfigManager.Nameplate.refresh); + } + else { + Bukkit.getScheduler().runTaskLaterAsynchronously(CustomNameplates.instance, () -> { + for (ArmorStandManager asm : armorStandManagerMap.values()) { + asm.refresh(false); + } + }, 20); + } } @Override @@ -71,7 +88,10 @@ public class TeleportingTag extends EntityTag { super.unload(); this.handler.unload(); this.vehicleChecker.unload(); - this.task.cancel(); + this.vehicleTask.cancel(); + if (refreshTask != null) { + refreshTask.cancel(); + } } @Override @@ -96,4 +116,29 @@ public class TeleportingTag extends EntityTag { Location loc2 = player2.getLocation(); return Math.sqrt(Math.pow(loc1.getX()-loc2.getX(), 2) + Math.pow(loc1.getZ()-loc2.getZ(), 2)); } + + @Override + public void onJoin(Player player) { + ArmorStandManager asm = new ArmorStandManager(player); + asm.addDefault(); + armorStandManagerMap.put(player, asm); + for (Player viewer : Bukkit.getOnlinePlayers()) { + spawnArmorStands(viewer, player); + spawnArmorStands(player, viewer); + } + super.onJoin(player); + } + + @Override + public void onQuit(Player player) { +// for (Player all : Bukkit.getOnlinePlayers()) { +// if (getArmorStandManager(all) == null) continue; +// getArmorStandManager(all) .unregisterPlayer(player); +// } + ArmorStandManager asm = armorStandManagerMap.remove(player); + if (asm != null) { + asm.destroy(); + } + super.onQuit(player); + } } diff --git a/src/main/java/net/momirealms/customnameplates/nameplates/mode/tp/TpPacketsHandler.java b/src/main/java/net/momirealms/customnameplates/nameplates/mode/tp/TpPacketsHandler.java index 97bce26..e6fd43f 100644 --- a/src/main/java/net/momirealms/customnameplates/nameplates/mode/tp/TpPacketsHandler.java +++ b/src/main/java/net/momirealms/customnameplates/nameplates/mode/tp/TpPacketsHandler.java @@ -72,11 +72,6 @@ public class TpPacketsHandler extends PacketsHandler { } } - @Override - public void onPlayerMove(Player mover) { - teleportingTag.getArmorStandManager(mover).teleport(); - } - @Override public void onEntitySpawn(Player receiver, int entityId) { Player spawnedPlayer = super.getPlayerFromMap(entityId); diff --git a/src/main/java/net/momirealms/customnameplates/resource/ResourceManager.java b/src/main/java/net/momirealms/customnameplates/resource/ResourceManager.java index 66326ae..ef22848 100644 --- a/src/main/java/net/momirealms/customnameplates/resource/ResourceManager.java +++ b/src/main/java/net/momirealms/customnameplates/resource/ResourceManager.java @@ -204,7 +204,6 @@ public class ResourceManager { AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to generate font json..."); } - AdventureUtil.consoleMessage("[CustomNameplates] ResourcePack has been generated!"); if (NAMEPLATES.size() != 0) AdventureUtil.consoleMessage("[CustomNameplates] Loaded " + (NAMEPLATES.size() -1) + " nameplates"); if (ConfigManager.Main.itemsAdder){ @@ -264,12 +263,14 @@ public class ResourceManager { if (!config.contains("color")) config.set("color","WHITE"); if (!config.contains("size")) config.set("size", 16); if (!config.contains("yoffset")) config.set("yoffset", 12); + if (!config.contains("bubble")) config.set("bubble", ""); ChatColor color = ChatColor.valueOf(Objects.requireNonNull(config.getString("color","WHITE")).toUpperCase()); int size = config.getInt("size"); int yoffset = config.getInt("yoffset"); String name = config.getString("name"); + String bubble = config.getString("bubble"); config.save(file); - return new NameplateConfig(color, size, name, yoffset); + return new NameplateConfig(color, size, name, yoffset, bubble); } catch (Exception e) { return NameplateConfig.EMPTY; diff --git a/src/main/java/net/momirealms/customnameplates/utils/ConfigUtil.java b/src/main/java/net/momirealms/customnameplates/utils/ConfigUtil.java index db9c7e7..e14360a 100644 --- a/src/main/java/net/momirealms/customnameplates/utils/ConfigUtil.java +++ b/src/main/java/net/momirealms/customnameplates/utils/ConfigUtil.java @@ -23,6 +23,7 @@ import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import net.momirealms.customnameplates.ConfigManager; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.helper.Log; @@ -37,6 +38,15 @@ public class ConfigUtil { YamlDocument.create(new File(CustomNameplates.instance.getDataFolder(), "nameplate.yml"), CustomNameplates.instance.getResource("nameplate.yml"), GeneralSettings.DEFAULT, LoaderSettings.builder().setAutoUpdate(true).build(), DumperSettings.DEFAULT, UpdaterSettings.builder().setVersioning(new BasicVersioning("config-version")).build()); YamlDocument.create(new File(CustomNameplates.instance.getDataFolder(), "bubble.yml"), CustomNameplates.instance.getResource("bubble.yml"), GeneralSettings.DEFAULT, LoaderSettings.builder().setAutoUpdate(true).build(), DumperSettings.DEFAULT, UpdaterSettings.builder().setVersioning(new BasicVersioning("config-version")).build()); YamlDocument.create(new File(CustomNameplates.instance.getDataFolder(), "MODULES.yml"), CustomNameplates.instance.getResource("MODULES.yml"), GeneralSettings.DEFAULT, LoaderSettings.builder().setAutoUpdate(true).build(), DumperSettings.DEFAULT, UpdaterSettings.builder().setVersioning(new BasicVersioning("config-version")).build()); + YamlDocument.create(new File(CustomNameplates.instance.getDataFolder(), "database.yml"), CustomNameplates.instance.getResource("database.yml"), GeneralSettings.DEFAULT, LoaderSettings.builder().setAutoUpdate(true).build(), DumperSettings.DEFAULT, UpdaterSettings.builder().setVersioning(new BasicVersioning("config-version")).build()); + }catch (IOException e){ + Log.warn(e.getMessage()); + } + } + + public static void lang(){ + try { + YamlDocument.create(new File(CustomNameplates.instance.getDataFolder(), "messages" + File.separator + ConfigManager.Main.lang +".yml"), CustomNameplates.instance.getResource("messages" + File.separator + ConfigManager.Main.lang +".yml"), GeneralSettings.DEFAULT, LoaderSettings.builder().setAutoUpdate(true).build(), DumperSettings.DEFAULT, UpdaterSettings.builder().setVersioning(new BasicVersioning("config-version")).build()); }catch (IOException e){ Log.warn(e.getMessage()); } diff --git a/src/main/java/net/momirealms/customnameplates/utils/JsonUtil.java b/src/main/java/net/momirealms/customnameplates/utils/JsonUtil.java index 664cd55..5207029 100644 --- a/src/main/java/net/momirealms/customnameplates/utils/JsonUtil.java +++ b/src/main/java/net/momirealms/customnameplates/utils/JsonUtil.java @@ -26,4 +26,4 @@ public class JsonUtil { } } } -} +} \ No newline at end of file diff --git a/src/main/resources/MODULES.yml b/src/main/resources/MODULES.yml index 5e42598..77261f9 100644 --- a/src/main/resources/MODULES.yml +++ b/src/main/resources/MODULES.yml @@ -1,4 +1,5 @@ -config-version: '5' +# Do not change +config-version: '6' #Nameplate module require a restart because it requires a SQL connection nameplate: true @@ -7,7 +8,4 @@ nameplate: true background: true bossbar: true actionbar: true - -#Chatting bubbles are still not available -#They are in developments and will be available soon -bubbles: false \ No newline at end of file +bubbles: true \ No newline at end of file diff --git a/src/main/resources/bubble.yml b/src/main/resources/bubble.yml index 8c3a4c6..526ab1e 100644 --- a/src/main/resources/bubble.yml +++ b/src/main/resources/bubble.yml @@ -1,11 +1,19 @@ -# Don't change -config-version: '5' +# Do not change +config-version: '6' bubble: # Player's default chatting bubbles default-bubbles: 'none' + # Text format when no bubbles equipped + default-format: '' + + # Add additional prefix and suffix to the text + # Placeholders can be used here + text-prefix: '' + text-suffix: '' + # Space between two lines of text line-spacing: 0.5 diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d3cd34c..a7b3c8c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ -# don't change -config-version: '5' +# Do not change +config-version: '6' config: # Language diff --git a/src/main/resources/database.yml b/src/main/resources/database.yml index 1197e54..7a771e1 100644 --- a/src/main/resources/database.yml +++ b/src/main/resources/database.yml @@ -1,3 +1,6 @@ +# Do not change +config-version: '6' + settings: # Valid Options: SQLite MYSQL # Only MYSQL supports pool. @@ -5,6 +8,10 @@ settings: storage-mode: SQLite use-pool: false disable-async: false + # If you are updating from a version lower than 2.0-PRE-6 + # Enable this to migrate data! If you are using MySQL you only need one server to proceed migration + # BackUp your data before enabling this! + migration: false # MySQL settings MySQL: diff --git a/src/main/resources/messages/cn.yml b/src/main/resources/messages/cn.yml new file mode 100644 index 0000000..ce6cbe8 --- /dev/null +++ b/src/main/resources/messages/cn.yml @@ -0,0 +1,30 @@ +messages: + prefix: '[CustomNameplates] ' + no-perm: '你没有权限!' + lack-args: '参数不足!' + reload: '插件已重载!' + not-online: '玩家 {Player} 不在线!' + no-console: '这个指令不能由控制台执行!' + cooldown: '上一个预览还没结束!' + generate: '正在生成资源包...' + generate-done: '资源包生成完毕...' + no-nameplate: '无铭牌' + preview: '你正在预览你的铭牌(切换到第三人称)' + + equip-nameplates: '你已佩戴铭牌 {Nameplate} [点击预览]' + force-equip-nameplates: '你已为玩家 {Player} 强制佩戴了铭牌 {Nameplate}' + unequip-nameplates: '你已卸下铭牌!' + force-unequip-nameplates: '你已强制卸下玩家 {Player} 的铭牌!' + not-exist-nameplates: '那个铭牌不存在!' + not-available-nameplates: '你还未拥有这个铭牌!' + available-nameplates: '可用铭牌: {Nameplates}' + have-no-nameplates: '你还没有拥有任何铭牌.' + + equip-bubbles: '你已佩戴聊天气泡 {Bubble}' + unequip-bubbles: '你已卸下聊天气泡' + available-bubbles: '可用聊天气泡: ' + force-equip-bubbles: '成功使用聊天气泡 {Bubbles}' + force-unequip-bubbles: '你移除了你的聊天气泡' + not-exist-bubbles: '这个聊天气泡不存在!' + not-available-bubbles: '你还未拥有这个气泡!' + have-no-bubbles: '你还没有拥有任何气泡.' \ No newline at end of file diff --git a/src/main/resources/messages/en.yml b/src/main/resources/messages/en.yml new file mode 100644 index 0000000..dddccce --- /dev/null +++ b/src/main/resources/messages/en.yml @@ -0,0 +1,30 @@ +messages: + prefix: '[CustomNameplates] ' + no-perm: 'No Permission!' + lack-args: 'Insufficient parameters!' + reload: 'Reloaded!' + not-online: 'Player {Player} is not online!' + no-console: 'This command can be only executed by player!' + cooldown: 'Previewing is still Ongoing!' + generate: 'Resource Pack is generating..' + generate-done: 'Resource Pack has been generated!' + no-nameplate: 'No Nameplate' + preview: 'Now previewing your nameplate (go to third person to view)!' + + equip-nameplates: 'Successfully equipped nameplate {Nameplate}. [click to preview]' + force-equip-nameplates: 'Successfully equipped nameplate {Nameplate} to {Player}.' + unequip-nameplates: 'You removed your nameplate' + force-unequip-nameplates: 'Successfully removed {Player}''s nameplate!' + not-exist-nameplates: 'This nameplate does not exist!' + not-available-nameplates: 'This nameplate is currently not available!' + available-nameplates: 'Available nameplates: {Nameplates}.' + have-no-nameplates: 'You don''t have any nameplates yet' + + equip-bubbles: 'Successfully equipped chatting bubbles {Bubble}' + force-equip-bubbles: 'Successfully equipped chatting bubbles {Bubbles}' + unequip-bubbles: 'You removed your chatting bubbles' + force-unequip-bubbles: 'You removed your chatting bubbles' + not-exist-bubbles: 'This bubble does not exist!' + not-available-bubbles: 'This bubble is currently not available!' + available-bubbles: 'Available bubbles: ' + have-no-bubbles: 'You don''t have any bubbles yet' \ No newline at end of file diff --git a/src/main/resources/ResourcePack/minecraft/shaders/core/note.txt b/src/main/resources/messages/es.yml similarity index 100% rename from src/main/resources/ResourcePack/minecraft/shaders/core/note.txt rename to src/main/resources/messages/es.yml diff --git a/src/main/resources/messages/messages_cn.yml b/src/main/resources/messages/messages_cn.yml deleted file mode 100644 index 263d9a7..0000000 --- a/src/main/resources/messages/messages_cn.yml +++ /dev/null @@ -1,18 +0,0 @@ -messages: - prefix: '[CustomNameplates] ' - no-perm: '你没有权限!' - lack-args: '参数不足!' - reload: '插件已重载!' - equip: '你已佩戴铭牌 {Nameplate} [点击预览]' - force-equip: '你已为玩家 {Player} 强制佩戴了铭牌 {Nameplate}' - unequip: '你已卸下铭牌!' - force-unequip: '你已强制卸下玩家 {Player} 的铭牌!' - preview: '你正在预览你的铭牌(切换到第三人称)' - not-exist: '那个铭牌不存在!' - not-online: '玩家 {Player} 不在线!' - no-console: '这个指令不能由控制台执行!' - not-available: '你还未拥有这个铭牌!' - available: '可用铭牌: {Nameplates}' - cooldown: '上一个预览还没结束!' - generate: '正在生成资源包...' - no-nameplate: '无铭牌' \ No newline at end of file diff --git a/src/main/resources/messages/messages_en.yml b/src/main/resources/messages/messages_en.yml deleted file mode 100644 index 3ea1f67..0000000 --- a/src/main/resources/messages/messages_en.yml +++ /dev/null @@ -1,18 +0,0 @@ -messages: - prefix: '[CustomNameplates] ' - no-perm: 'No Permission!' - lack-args: 'Insufficient parameters!' - reload: 'Reloaded!' - equip: 'Successfully equipped nameplate {Nameplate}. [click to preview]' - force-equip: 'Successfully equipped nameplate {Nameplate} to {Player}.' - unequip: 'You have removed your nameplate!' - force-unequip: 'Successfully removed {Player}''s nameplate!' - preview: 'Now previewing your nameplate (go to third person to view)!' - not-exist: 'This nameplate does not exist!' - not-online: 'Player {Player} is not online!' - no-console: 'This command can be only executed by player!' - not-available: 'This nameplate is currently not available!' - available: 'Available nameplates: {Nameplates}.' - cooldown: 'Previewing is still Ongoing!' - generate: 'Resource Pack is generating..' - no-nameplate: 'No Nameplate' \ No newline at end of file diff --git a/src/main/resources/messages/messages_es.yml b/src/main/resources/messages/messages_es.yml deleted file mode 100644 index a4cefe2..0000000 --- a/src/main/resources/messages/messages_es.yml +++ /dev/null @@ -1,17 +0,0 @@ -messages: - prefix: '[CustomNameplates] ' - no-perm: '¡No tienes permisos!' - lack-args: '¡Parámetros insuficientes!' - reload: '¡Recargado!' - equip: 'Nameplate equipada con éxito {Nameplate}. [click to preview]' - force-equip: 'Nameplate equipada con éxito {Nameplate} to {Player}.' - unequip: '¡Has quitado tu Nameplate!' - force-unequip: 'Eliminado con éxito {Player}''s nameplate!' - preview: '¡Ahora, la vista previa de su placa de identificación (ir a la tercera persona para ver)!' - not-exist: 'Este Nameplate no existe.' - not-online: 'Player {Player} ¡no está en línea!' - no-console: 'Este comando sólo puede ser ejecutado por el jugador.' - not-available: 'Esta placa no está disponible actualmente.' - available: 'Nameplates disponibles: {Nameplates}.' - cooldown: '¡El preestreno sigue en curso!' - no-nameplate: 'No Nameplate' \ No newline at end of file diff --git a/src/main/resources/nameplate.yml b/src/main/resources/nameplate.yml index 6fc8657..1d1650e 100644 --- a/src/main/resources/nameplate.yml +++ b/src/main/resources/nameplate.yml @@ -1,5 +1,5 @@ -# Don't change -config-version: '5' +# Do not change +config-version: '6' nameplate: # mode: Team / Riding / Teleporting diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 06d2280..2374b7f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -24,7 +24,6 @@ permissions: nameplates.*: description: Gives access to all nameplates commands children: - nameplates.generate: true nameplates.reload: true nameplates.forceequip: true nameplates.forceunequip: true @@ -33,8 +32,6 @@ permissions: nameplates.preview: true nameplates.list: true - nameplates.generate: - default: op nameplates.reload: default: op nameplates.forceequip: @@ -50,4 +47,26 @@ permissions: nameplates.list: default: true nameplates.equip: - default: true \ No newline at end of file + default: true + + bubbles.*: + description: Gives access to all bubbles commands + children: + bubbles.unequip: true + bubbles.equip: true + bubbles.forceequip: true + bubbles.forceunequip: true + bubbles.list: true + + bubbles.help: + default: op + bubbles.equip: + default: true + bubbles.unequip: + default: true + bubbles.list: + default: true + bubbles.forceequip: + default: op + bubbles.forceunequip: + default: op \ No newline at end of file