diff --git a/api/src/main/java/net/momirealms/customnameplates/api/data/OnlineUser.java b/api/src/main/java/net/momirealms/customnameplates/api/data/OnlineUser.java index f536e75..50ef651 100644 --- a/api/src/main/java/net/momirealms/customnameplates/api/data/OnlineUser.java +++ b/api/src/main/java/net/momirealms/customnameplates/api/data/OnlineUser.java @@ -1,8 +1,11 @@ package net.momirealms.customnameplates.api.data; import net.momirealms.customnameplates.api.CustomNameplatesPlugin; +import net.momirealms.customnameplates.api.mechanic.bubble.Bubble; import net.momirealms.customnameplates.api.mechanic.nameplate.Nameplate; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -36,6 +39,7 @@ public class OnlineUser { /** * Get the original nameplate key from data */ + @NotNull public String getNameplateKey() { return nameplate; } @@ -43,6 +47,7 @@ public class OnlineUser { /** * Get the original bubble key from data */ + @NotNull public String getBubbleKey() { return bubble; } @@ -51,6 +56,7 @@ public class OnlineUser { * This value might be inconsistent with the key get by "getNameplateKey()" * Because if a player doesn't have a nameplate, his nameplate would be the default one */ + @Nullable public Nameplate getNameplate() { String temp = nameplate; if (temp.equals("none")) { @@ -59,6 +65,15 @@ public class OnlineUser { return CustomNameplatesPlugin.get().getNameplateManager().getNameplate(temp); } + @Nullable + public Bubble getBubble() { + String temp = nameplate; + if (temp.equals("none")) { + temp = CustomNameplatesPlugin.get().getBubbleManager().getDefaultBubble(); + } + return CustomNameplatesPlugin.get().getBubbleManager().getBubble(temp); + } + /** * Set nameplate for a player * diff --git a/api/src/main/java/net/momirealms/customnameplates/api/manager/BubbleManager.java b/api/src/main/java/net/momirealms/customnameplates/api/manager/BubbleManager.java index 1d1e9d8..d710bbf 100644 --- a/api/src/main/java/net/momirealms/customnameplates/api/manager/BubbleManager.java +++ b/api/src/main/java/net/momirealms/customnameplates/api/manager/BubbleManager.java @@ -9,7 +9,6 @@ import java.util.List; public interface BubbleManager { - boolean registerBubble(String key, Bubble bubble); boolean unregisterBubble(String key); @@ -25,4 +24,12 @@ public interface BubbleManager { String[] getBlacklistChannels(); Collection getBubbles(); + + boolean equipBubble(Player player, String bubble); + + void unEquipBubble(Player player); + + String getDefaultBubble(); + + Collection getBubbleKeys(); } diff --git a/build.gradle.kts b/build.gradle.kts index 5ea482e..3db5b32 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { allprojects { - version = "2.3.0.0" + version = "2.3.0.0-beta-1" apply() apply(plugin = "java") diff --git a/paper/src/main/java/net/momirealms/customnameplates/paper/CustomNameplatesPluginImpl.java b/paper/src/main/java/net/momirealms/customnameplates/paper/CustomNameplatesPluginImpl.java index c33e782..7f6fa46 100644 --- a/paper/src/main/java/net/momirealms/customnameplates/paper/CustomNameplatesPluginImpl.java +++ b/paper/src/main/java/net/momirealms/customnameplates/paper/CustomNameplatesPluginImpl.java @@ -60,8 +60,8 @@ public class CustomNameplatesPluginImpl extends CustomNameplatesPlugin { this.actionBarManager = new ActionBarManagerImpl(this); this.coolDownManager = new CoolDownManager(this); this.packetManager = new PacketManager(this); - new CommandManager(this).load(); this.reload(CNConfig.generatePackOnStart); + new CommandManager(this).load(); this.versionManager.checkUpdate().thenAccept(outDated -> { if (!outDated) this.getAdventure().sendConsoleMessage("[CustomNameplates] You are using the latest version."); else this.getAdventure().sendConsoleMessage("[CustomNameplates] Update is available: https://polymart.org/resource/2543"); diff --git a/paper/src/main/java/net/momirealms/customnameplates/paper/command/CommandManager.java b/paper/src/main/java/net/momirealms/customnameplates/paper/command/CommandManager.java index c5c6f92..98fdaea 100644 --- a/paper/src/main/java/net/momirealms/customnameplates/paper/command/CommandManager.java +++ b/paper/src/main/java/net/momirealms/customnameplates/paper/command/CommandManager.java @@ -26,11 +26,13 @@ import dev.jorel.commandapi.arguments.PlayerArgument; import dev.jorel.commandapi.arguments.StringArgument; import net.momirealms.customnameplates.api.CustomNameplatesPlugin; import net.momirealms.customnameplates.api.data.OnlineUser; +import net.momirealms.customnameplates.api.mechanic.bubble.Bubble; import net.momirealms.customnameplates.api.mechanic.nameplate.Nameplate; import net.momirealms.customnameplates.api.mechanic.tag.NameplatePlayer; import net.momirealms.customnameplates.api.util.LogUtils; import net.momirealms.customnameplates.paper.CustomNameplatesPluginImpl; import net.momirealms.customnameplates.paper.adventure.AdventureManagerImpl; +import net.momirealms.customnameplates.paper.setting.CNConfig; import net.momirealms.customnameplates.paper.setting.CNLocale; import org.bukkit.entity.Player; @@ -51,181 +53,284 @@ public class CommandManager { } public void load() { - new CommandAPICommand("customnameplates") + var command1 = new CommandAPICommand("customnameplates") .withAliases("nameplates", "cnameplates") .withSubcommands( - getReloadCommand(), - getAboutCommand(), - getEquipCommand(), - getUnEquipCommand(), - getPreviewCommand(), - getListCommand(), - getForceEquipCommand(), - getForceUnEquipCommand(), - getForcePreviewCommand() - ) - .register(); + NameplatesCommands.getReloadCommand(), + NameplatesCommands.getAboutCommand() + ); + if (CNConfig.nameplateModule) { + command1.withSubcommands( + NameplatesCommands.getEquipCommand(), + NameplatesCommands.getUnEquipCommand(), + NameplatesCommands.getPreviewCommand(), + NameplatesCommands.getListCommand(), + NameplatesCommands.getForceEquipCommand(), + NameplatesCommands.getForceUnEquipCommand(), + NameplatesCommands.getForcePreviewCommand() + ); + } + command1.register(); + if (CNConfig.bubbleModule) + new CommandAPICommand("bubbles") + .withSubcommands( + BubblesCommands.getListCommand(), + BubblesCommands.getEquipCommand(), + BubblesCommands.getUnEquipCommand(), + BubblesCommands.getForceEquipCommand(), + BubblesCommands.getForceUnEquipCommand() + ) + .register(); } - private CommandAPICommand getForceEquipCommand() { - return new CommandAPICommand("force-equip") - .withPermission("customnameplates.admin") - .withArguments(new PlayerArgument("player")) - .withArguments(new StringArgument("nameplate").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> plugin.getNameplateManager().getNameplateKeys().toArray(new String[0])))) - .executes((sender, args) -> { + public static class BubblesCommands { + + public static CommandAPICommand getListCommand() { + return new CommandAPICommand("list") + .withPermission("bubbles.list") + .executesPlayer((player, args) -> { + if (!CNConfig.bubbleModule) return; + List bubbles = CustomNameplatesPlugin.get().getBubbleManager().getAvailableBubblesDisplayNames(player); + if (bubbles.size() != 0) { + StringJoiner stringJoiner = new StringJoiner(", "); + for (String availableBubble : bubbles) { + stringJoiner.add(availableBubble); + } + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_AVAILABLE_BUBBLE.replace("{Bubble}", stringJoiner.toString())); + } else { + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_HAVE_NO_BUBBLE); + } + }); + } + + public static CommandAPICommand getEquipCommand() { + return new CommandAPICommand("equip") + .withPermission("bubbles.equip") + .withArguments(new StringArgument("bubble").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> CustomNameplatesPlugin.get().getBubbleManager().getAvailableBubbles((Player) commandSenderSuggestionInfo.sender()).toArray(new String[0])))) + .executesPlayer((player, args) -> { + if (!CNConfig.bubbleModule) return; + String bubble = (String) args.get("bubble"); + if (!CustomNameplatesPlugin.get().getBubbleManager().equipBubble(player, bubble)) { + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_BUBBLE_NOT_EXIST); + return; + } + Bubble bubbleInstance = CustomNameplatesPlugin.get().getBubbleManager().getBubble(bubble); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_EQUIP_BUBBLE.replace("{Bubble}", bubbleInstance.getDisplayName())); + }); + } + + public static CommandAPICommand getUnEquipCommand() { + return new CommandAPICommand("unequip") + .withPermission("bubbles.unequip") + .executesPlayer((player, args) -> { + if (!CNConfig.bubbleModule) return; + CustomNameplatesPlugin.get().getBubbleManager().unEquipBubble(player); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_UNEQUIP_BUBBLE); + }); + } + + public static CommandAPICommand getForceEquipCommand() { + return new CommandAPICommand("force-equip") + .withPermission("customnameplates.admin") + .withArguments(new PlayerArgument("player")) + .withArguments(new StringArgument("bubble").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> CustomNameplatesPlugin.get().getBubbleManager().getBubbleKeys().toArray(new String[0])))) + .executes((sender, args) -> { + if (!CNConfig.bubbleModule) return; + Player player = (Player) args.get("player"); + String bubble = (String) args.get("bubble"); + if (player == null) return; + if (!CustomNameplatesPlugin.get().getBubbleManager().equipBubble(player, bubble)) { + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_BUBBLE_NOT_EXIST); + return; + } + Bubble bubbleInstance = CustomNameplatesPlugin.get().getBubbleManager().getBubble(bubble); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_FORCE_EQUIP_BUBBLE.replace("{Bubble}", bubbleInstance.getDisplayName()).replace("{Player}", player.getName())); + }); + } + + public static CommandAPICommand getForceUnEquipCommand() { + return new CommandAPICommand("force-unequip") + .withPermission("customnameplates.admin") + .withArguments(new PlayerArgument("player")) + .executes((sender, args) -> { + if (!CNConfig.bubbleModule) return; + Player player = (Player) args.get("player"); + if (player == null) return; + CustomNameplatesPlugin.get().getBubbleManager().unEquipBubble(player); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_FORCE_UNEQUIP_BUBBLE.replace("{Player}", player.getName())); + }); + } + + } + + public static class NameplatesCommands { + public static CommandAPICommand getForceEquipCommand() { + return new CommandAPICommand("force-equip") + .withPermission("customnameplates.admin") + .withArguments(new PlayerArgument("player")) + .withArguments(new StringArgument("nameplate").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> CustomNameplatesPlugin.get().getNameplateManager().getNameplateKeys().toArray(new String[0])))) + .executes((sender, args) -> { + if (!CNConfig.nameplateModule) return; Player player = (Player) args.get("player"); String nameplate = (String) args.get("nameplate"); if (player == null) return; - if (!plugin.getNameplateManager().equipNameplate(player, nameplate, false)) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_NAMEPLATE_NOT_EXISTS); - return; + if (!CustomNameplatesPlugin.get().getNameplateManager().equipNameplate(player, nameplate, false)) { + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_NAMEPLATE_NOT_EXISTS); + return; } - Nameplate nameplateInstance = plugin.getNameplateManager().getNameplate(nameplate); + Nameplate nameplateInstance = CustomNameplatesPlugin.get().getNameplateManager().getNameplate(nameplate); AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_FORCE_EQUIP_NAMEPLATE.replace("{Nameplate}", nameplateInstance.getDisplayName()).replace("{Player}", player.getName())); - }); - } + }); + } - private CommandAPICommand getForceUnEquipCommand() { - return new CommandAPICommand("force-unequip") - .withPermission("customnameplates.admin") - .withArguments(new PlayerArgument("player")) - .executes((sender, args) -> { + public static CommandAPICommand getForceUnEquipCommand() { + return new CommandAPICommand("force-unequip") + .withPermission("customnameplates.admin") + .withArguments(new PlayerArgument("player")) + .executes((sender, args) -> { + if (!CNConfig.nameplateModule) return; Player player = (Player) args.get("player"); if (player == null) return; - plugin.getNameplateManager().unEquipNameplate(player, false); + CustomNameplatesPlugin.get().getNameplateManager().unEquipNameplate(player, false); AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_FORCE_UNEQUIP_NAMEPLATE.replace("{Player}", player.getName())); - }); - } + }); + } - private CommandAPICommand getPreviewCommand() { - return new CommandAPICommand("preview") - .withPermission("nameplates.preview") - .executesPlayer((player, args) -> { - NameplatePlayer nameplatePlayer = plugin.getNameplateManager().getNameplatePlayer(player.getUniqueId()); + public static CommandAPICommand getPreviewCommand() { + return new CommandAPICommand("preview") + .withPermission("nameplates.preview") + .executesPlayer((player, args) -> { + if (!CNConfig.nameplateModule) return; + NameplatePlayer nameplatePlayer = CustomNameplatesPlugin.get().getNameplateManager().getNameplatePlayer(player.getUniqueId()); if (nameplatePlayer == null) { - LogUtils.warn(player.getName() + " failed to preview because no tag is created"); - return; + LogUtils.warn(player.getName() + " failed to preview because no tag is created"); + return; } if (nameplatePlayer.isPreviewing()) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_PREVIEW_COOLDOWN); - return; + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_PREVIEW_COOLDOWN); + return; } nameplatePlayer.setPreview(true); AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_PREVIEW_START); - plugin.getScheduler().runTaskAsyncLater(() -> { - nameplatePlayer.setPreview(false); - }, plugin.getNameplateManager().getPreviewDuration(), TimeUnit.SECONDS); - }); - } + CustomNameplatesPlugin.get().getScheduler().runTaskAsyncLater(() -> { + nameplatePlayer.setPreview(false); + }, CustomNameplatesPlugin.get().getNameplateManager().getPreviewDuration(), TimeUnit.SECONDS); + }); + } - private CommandAPICommand getForcePreviewCommand() { - return new CommandAPICommand("force-preview") - .withPermission("customnameplates.admin") - .withArguments(new PlayerArgument("player")) - .withOptionalArguments(new StringArgument("nameplate").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> plugin.getNameplateManager().getNameplateKeys().toArray(new String[0])))) - .executes((sender, args) -> { + public static CommandAPICommand getForcePreviewCommand() { + return new CommandAPICommand("force-preview") + .withPermission("customnameplates.admin") + .withArguments(new PlayerArgument("player")) + .withOptionalArguments(new StringArgument("nameplate").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> CustomNameplatesPlugin.get().getNameplateManager().getNameplateKeys().toArray(new String[0])))) + .executes((sender, args) -> { + if (!CNConfig.nameplateModule) return; Player player = (Player) args.get("player"); String nameplate = (String) args.getOrDefault("nameplate", ""); if (player == null) return; - NameplatePlayer nameplatePlayer = plugin.getNameplateManager().getNameplatePlayer(player.getUniqueId()); + NameplatePlayer nameplatePlayer = CustomNameplatesPlugin.get().getNameplateManager().getNameplatePlayer(player.getUniqueId()); if (nameplatePlayer == null) { - LogUtils.warn(player.getName() + " failed to preview because no tag is created"); - return; + LogUtils.warn(player.getName() + " failed to preview because no tag is created"); + return; } if (nameplatePlayer.isPreviewing()) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_PREVIEW_COOLDOWN); - return; + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_PREVIEW_COOLDOWN); + return; } - Optional user = plugin.getStorageManager().getOnlineUser(player.getUniqueId()); + Optional user = CustomNameplatesPlugin.get().getStorageManager().getOnlineUser(player.getUniqueId()); if (user.isEmpty()) { - LogUtils.warn(player.getName() + " failed to preview because data not loaded"); - return; + LogUtils.warn(player.getName() + " failed to preview because data not loaded"); + return; } String previous = user.get().getNameplateKey(); - if (!plugin.getNameplateManager().equipNameplate(player, nameplate, true)) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_NAMEPLATE_NOT_EXISTS); - return; + if (!CustomNameplatesPlugin.get().getNameplateManager().equipNameplate(player, nameplate, true)) { + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_NAMEPLATE_NOT_EXISTS); + return; } nameplatePlayer.setPreview(true); AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_FORCE_PREVIEW.replace("{Player}", player.getName())); - plugin.getScheduler().runTaskAsyncLater(() -> { - nameplatePlayer.setPreview(false); - plugin.getNameplateManager().equipNameplate(player, previous, true); - }, plugin.getNameplateManager().getPreviewDuration(), TimeUnit.SECONDS); - }); - } + CustomNameplatesPlugin.get().getScheduler().runTaskAsyncLater(() -> { + nameplatePlayer.setPreview(false); + if (previous.equals("none")) { + CustomNameplatesPlugin.get().getNameplateManager().unEquipNameplate(player, true); + } else { + CustomNameplatesPlugin.get().getNameplateManager().equipNameplate(player, previous, true); + } + }, CustomNameplatesPlugin.get().getNameplateManager().getPreviewDuration(), TimeUnit.SECONDS); + }); + } - private CommandAPICommand getEquipCommand() { - return new CommandAPICommand("equip") - .withPermission("nameplates.equip") - .withArguments(new StringArgument("nameplate").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> plugin.getNameplateManager().getAvailableNameplates((Player) commandSenderSuggestionInfo.sender()).toArray(new String[0])))) - .executesPlayer((player, args) -> { + public static CommandAPICommand getEquipCommand() { + return new CommandAPICommand("equip") + .withPermission("nameplates.equip") + .withArguments(new StringArgument("nameplate").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> CustomNameplatesPlugin.get().getNameplateManager().getAvailableNameplates((Player) commandSenderSuggestionInfo.sender()).toArray(new String[0])))) + .executesPlayer((player, args) -> { + if (!CNConfig.nameplateModule) return; String nameplate = (String) args.get("nameplate"); - Nameplate nameplateInstance = plugin.getNameplateManager().getNameplate(nameplate); - if (nameplateInstance == null) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_NAMEPLATE_NOT_AVAILABLE); - return; - } - if (!plugin.getNameplateManager().equipNameplate(player, nameplate, false)) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_NAMEPLATE_NOT_EXISTS); - return; + if (!CustomNameplatesPlugin.get().getNameplateManager().equipNameplate(player, nameplate, false)) { + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_NAMEPLATE_NOT_EXISTS); + return; } + Nameplate nameplateInstance = CustomNameplatesPlugin.get().getNameplateManager().getNameplate(nameplate); AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_EQUIP_NAMEPLATE.replace("{Nameplate}", nameplateInstance.getDisplayName())); - }); - } + }); + } - private CommandAPICommand getUnEquipCommand() { - return new CommandAPICommand("unequip") - .withPermission("nameplates.unequip") - .executesPlayer((player, args) -> { - plugin.getNameplateManager().unEquipNameplate(player, false); + public static CommandAPICommand getUnEquipCommand() { + return new CommandAPICommand("unequip") + .withPermission("nameplates.unequip") + .executesPlayer((player, args) -> { + if (!CNConfig.nameplateModule) return; + CustomNameplatesPlugin.get().getNameplateManager().unEquipNameplate(player, false); AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_UNEQUIP_NAMEPLATE); - }); - } + }); + } - private CommandAPICommand getListCommand() { - return new CommandAPICommand("list") - .withPermission("nameplates.list") - .executesPlayer((player, args) -> { - List nameplates = plugin.getNameplateManager().getAvailableNameplateDisplayNames(player); + public static CommandAPICommand getListCommand() { + return new CommandAPICommand("list") + .withPermission("nameplates.list") + .executesPlayer((player, args) -> { + if (!CNConfig.nameplateModule) return; + List nameplates = CustomNameplatesPlugin.get().getNameplateManager().getAvailableNameplateDisplayNames(player); if (nameplates.size() != 0) { - StringJoiner stringJoiner = new StringJoiner(", "); - for (String availableNameplate : nameplates) { - stringJoiner.add(availableNameplate); - } - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_AVAILABLE_NAMEPLATE.replace("{Nameplates}", stringJoiner.toString())); + StringJoiner stringJoiner = new StringJoiner(", "); + for (String availableNameplate : nameplates) { + stringJoiner.add(availableNameplate); + } + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_AVAILABLE_NAMEPLATE.replace("{Nameplates}", stringJoiner.toString())); } else { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_HAVE_NO_NAMEPLATE); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CNLocale.MSG_HAVE_NO_NAMEPLATE); } - }); - } + }); + } - private CommandAPICommand getReloadCommand() { - return new CommandAPICommand("reload") - .withPermission("customnameplates.admin") - .withOptionalArguments(new BooleanArgument("generate pack")) - .executes((sender, args) -> { + public static CommandAPICommand getReloadCommand() { + return new CommandAPICommand("reload") + .withPermission("customnameplates.admin") + .withOptionalArguments(new BooleanArgument("generate pack")) + .executes((sender, args) -> { long time = System.currentTimeMillis(); - plugin.reload(false); + CustomNameplatesPlugin.get().reload(false); AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_RELOAD.replace("{time}", String.valueOf(System.currentTimeMillis()-time))); boolean generate = (boolean) args.getOrDefault("generate pack", true); if (generate) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_GENERATING); - plugin.getResourcePackManager().generateResourcePack(); - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_PACK_GENERATED); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_GENERATING); + CustomNameplatesPlugin.get().getResourcePackManager().generateResourcePack(); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CNLocale.MSG_PACK_GENERATED); } - }); - } + }); + } - private CommandAPICommand getAboutCommand() { - return new CommandAPICommand("about") - .withPermission("customnameplates.about") - .executes((sender, args) -> { - AdventureManagerImpl.getInstance().sendMessage(sender, "<#3CB371>⚓ CustomNameplates - <#98FB98>" + CustomNameplatesPlugin.getInstance().getVersionManager().getPluginVersion()); - AdventureManagerImpl.getInstance().sendMessage(sender, "<#7FFFAA>A plugin that provides adjustable images for texts"); - AdventureManagerImpl.getInstance().sendMessage(sender, "<#DA70D6>\uD83E\uDDEA Author: <#FFC0CB>XiaoMoMi"); - AdventureManagerImpl.getInstance().sendMessage(sender, "<#FF7F50>\uD83D\uDD25 Contributors: <#FFA07A>TopOrigin"); - AdventureManagerImpl.getInstance().sendMessage(sender, "<#FFD700>⭐ Document <#A9A9A9>| <#FAFAD2>⛏ Github <#A9A9A9>| <#48D1CC>\uD83D\uDD14 Polymart"); - }); + public static CommandAPICommand getAboutCommand() { + return new CommandAPICommand("about") + .withPermission("customnameplates.about") + .executes((sender, args) -> { + AdventureManagerImpl.getInstance().sendMessage(sender, "<#3CB371>⚓ CustomNameplates - <#98FB98>" + CustomNameplatesPlugin.getInstance().getVersionManager().getPluginVersion()); + AdventureManagerImpl.getInstance().sendMessage(sender, "<#7FFFAA>A plugin that provides adjustable images for texts"); + AdventureManagerImpl.getInstance().sendMessage(sender, "<#DA70D6>\uD83E\uDDEA Author: <#FFC0CB>XiaoMoMi"); + AdventureManagerImpl.getInstance().sendMessage(sender, "<#FF7F50>\uD83D\uDD25 Contributors: <#FFA07A>TopOrigin"); + AdventureManagerImpl.getInstance().sendMessage(sender, "<#FFD700>⭐ Document <#A9A9A9>| <#FAFAD2>⛏ Github <#A9A9A9>| <#48D1CC>\uD83D\uDD14 Polymart"); + }); + } } } diff --git a/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/bubble/BubbleManagerImpl.java b/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/bubble/BubbleManagerImpl.java index 98298af..af40dba 100644 --- a/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/bubble/BubbleManagerImpl.java +++ b/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/bubble/BubbleManagerImpl.java @@ -24,6 +24,8 @@ import net.momirealms.customnameplates.api.manager.BubbleManager; import net.momirealms.customnameplates.api.mechanic.bubble.Bubble; import net.momirealms.customnameplates.api.mechanic.character.CharacterArranger; import net.momirealms.customnameplates.api.mechanic.character.ConfiguredChar; +import net.momirealms.customnameplates.api.mechanic.nameplate.Nameplate; +import net.momirealms.customnameplates.api.mechanic.tag.NameplatePlayer; import net.momirealms.customnameplates.api.mechanic.tag.unlimited.EntityTagPlayer; import net.momirealms.customnameplates.api.mechanic.tag.unlimited.StaticTextEntity; import net.momirealms.customnameplates.api.mechanic.tag.unlimited.StaticTextTagSetting; @@ -306,6 +308,11 @@ public class BubbleManagerImpl implements BubbleManager { return result; } + @Override + public Collection getBubbleKeys() { + return bubbleMap.keySet(); + } + @Nullable @Override public Bubble getBubble(String bubble) { @@ -349,6 +356,42 @@ public class BubbleManagerImpl implements BubbleManager { return bubbleMap.values(); } + @Override + public boolean equipBubble(Player player, String bubbleKey) { + Bubble bubble = getBubble(bubbleKey); + if (bubble == null && bubbleKey.equals("none")) { + return false; + } + plugin.getStorageManager().getOnlineUser(player.getUniqueId()).ifPresentOrElse(it -> { + if (it.getBubbleKey().equals(bubbleKey)) { + return; + } + it.setBubble(bubbleKey); + plugin.getStorageManager().saveOnlinePlayerData(player.getUniqueId()); + }, () -> { + LogUtils.severe("Player " + player.getName() + "'s data is not loaded."); + }); + return true; + } + + @Override + public void unEquipBubble(Player player) { + plugin.getStorageManager().getOnlineUser(player.getUniqueId()).ifPresentOrElse(it -> { + if (it.getBubbleKey().equals("none")) { + return; + } + it.setNameplate("none"); + plugin.getStorageManager().saveOnlinePlayerData(player.getUniqueId()); + }, () -> { + LogUtils.severe("Player " + player.getName() + "'s data is not loaded."); + }); + } + + @Override + public String getDefaultBubble() { + return defaultBubble; + } + private void saveDefaultBubbles() { String[] png_list = new String[]{"chat"}; String[] part_list = new String[]{"_left.png", "_middle.png", "_right.png", "_tail.png", ".yml"}; diff --git a/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/nameplate/NameplateManagerImpl.java b/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/nameplate/NameplateManagerImpl.java index 119612b..1bedb64 100644 --- a/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/nameplate/NameplateManagerImpl.java +++ b/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/nameplate/NameplateManagerImpl.java @@ -479,7 +479,7 @@ public class NameplateManagerImpl implements NameplateManager, Listener { @Override public boolean equipNameplate(Player player, String nameplateKey, boolean temp) { Nameplate nameplate = getNameplate(nameplateKey); - if (nameplate == null && !nameplateKey.equals("none")) { + if (nameplate == null && nameplateKey.equals("none")) { return false; } plugin.getStorageManager().getOnlineUser(player.getUniqueId()).ifPresentOrElse(it -> { @@ -502,6 +502,9 @@ public class NameplateManagerImpl implements NameplateManager, Listener { @Override public void unEquipNameplate(Player player, boolean temp) { plugin.getStorageManager().getOnlineUser(player.getUniqueId()).ifPresentOrElse(it -> { + if (it.getNameplateKey().equals("none")) { + return; + } it.setNameplate("none"); this.updateCachedNameplate(player, getNameplate(getDefaultNameplate())); NameplatePlayer nameplatePlayer = getNameplatePlayer(player.getUniqueId()); diff --git a/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/placeholder/PluginPlaceholders.java b/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/placeholder/PluginPlaceholders.java index 4ec86c6..fb5f195 100644 --- a/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/placeholder/PluginPlaceholders.java +++ b/paper/src/main/java/net/momirealms/customnameplates/paper/mechanic/placeholder/PluginPlaceholders.java @@ -3,6 +3,7 @@ package net.momirealms.customnameplates.paper.mechanic.placeholder; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import net.momirealms.customnameplates.api.CustomNameplatesPlugin; import net.momirealms.customnameplates.api.manager.PlaceholderManager; +import net.momirealms.customnameplates.api.mechanic.bubble.Bubble; import net.momirealms.customnameplates.api.mechanic.character.ConfiguredChar; import net.momirealms.customnameplates.api.mechanic.font.OffsetFont; import net.momirealms.customnameplates.api.mechanic.nameplate.Nameplate; @@ -134,10 +135,20 @@ public class PluginPlaceholders extends PlaceholderExpansion { case "nameplate-name" -> { Nameplate nameplate = optPlayer.get().getNameplate(); if (nameplate == null) { - return CNLocale.MSG_NO_NAMEPLATE; + return ""; } return nameplate.getDisplayName(); } + case "bubble" -> { + return optPlayer.get().getBubbleKey(); + } + case "bubble-name" -> { + Bubble bubble = optPlayer.get().getBubble(); + if (bubble == null) { + return ""; + } + return bubble.getDisplayName(); + } } } } diff --git a/paper/src/main/java/net/momirealms/customnameplates/paper/setting/CNLocale.java b/paper/src/main/java/net/momirealms/customnameplates/paper/setting/CNLocale.java index 92ebe60..65048f9 100644 --- a/paper/src/main/java/net/momirealms/customnameplates/paper/setting/CNLocale.java +++ b/paper/src/main/java/net/momirealms/customnameplates/paper/setting/CNLocale.java @@ -33,14 +33,14 @@ public class CNLocale { public static String MSG_AVAILABLE_NAMEPLATE; public static String MSG_HAVE_NO_NAMEPLATE; public static String MSG_FORCE_PREVIEW; - 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 String MSG_EQUIP_BUBBLE; + public static String MSG_UNEQUIP_BUBBLE; + public static String MSG_FORCE_EQUIP_BUBBLE; + public static String MSG_FORCE_UNEQUIP_BUBBLE; + public static String MSG_BUBBLE_NOT_EXIST; + public static String MSG_BUBBLE_NOT_AVAILABLE; + public static String MSG_AVAILABLE_BUBBLE; + public static String MSG_HAVE_NO_BUBBLE; public static void load() { try { @@ -83,14 +83,14 @@ public class CNLocale { MSG_AVAILABLE_NAMEPLATE = config.getString("messages.available-nameplates"); MSG_HAVE_NO_NAMEPLATE = config.getString("messages.have-no-nameplates"); MSG_FORCE_PREVIEW = config.getString("messages.force-preview"); - bb_equip = config.getString("messages.equip-bubbles"); - bb_unEquip = config.getString("messages.unequip-bubbles"); - bb_force_equip = config.getString("messages.force-equip-bubbles"); - bb_force_unEquip = config.getString("messages.force-unequip-bubbles"); - bb_not_exist = config.getString("messages.not-exist-bubbles"); - bb_notAvailable = config.getString("messages.not-available-bubbles"); - bb_available = config.getString("messages.available-bubbles"); - bb_haveNone = config.getString("messages.have-no-bubbles"); + MSG_EQUIP_BUBBLE = config.getString("messages.equip-bubbles"); + MSG_UNEQUIP_BUBBLE = config.getString("messages.unequip-bubbles"); + MSG_FORCE_EQUIP_BUBBLE = config.getString("messages.force-equip-bubbles"); + MSG_FORCE_UNEQUIP_BUBBLE = config.getString("messages.force-unequip-bubbles"); + MSG_BUBBLE_NOT_EXIST = config.getString("messages.not-exist-bubbles"); + MSG_BUBBLE_NOT_AVAILABLE = config.getString("messages.not-available-bubbles"); + MSG_AVAILABLE_BUBBLE = config.getString("messages.available-bubbles"); + MSG_HAVE_NO_BUBBLE = config.getString("messages.have-no-bubbles"); } } } diff --git a/paper/src/main/resources/configs/bubble.yml b/paper/src/main/resources/configs/bubble.yml index b2f1159..1b5e8a9 100644 --- a/paper/src/main/resources/configs/bubble.yml +++ b/paper/src/main/resources/configs/bubble.yml @@ -3,7 +3,7 @@ blacklist-channels: - Private - Staff -# Player's default chatting bubbles +# Default bubble to display if player's bubble is "none" default-bubbles: 'chat' # Text format when bubble is "none" diff --git a/paper/src/main/resources/configs/nameplate.yml b/paper/src/main/resources/configs/nameplate.yml index 455c861..ac6aa74 100644 --- a/paper/src/main/resources/configs/nameplate.yml +++ b/paper/src/main/resources/configs/nameplate.yml @@ -4,7 +4,7 @@ mode: TEAM # The duration (in seconds) that the nameplate preview will last for. preview-duration: 5 -# Default nameplate to display if player doesn't equip any +# Default nameplate to display if player's nameplate is "none" default-nameplate: 'none' # This decides what %nameplates_prefix/suffix% would return diff --git a/paper/src/main/resources/messages/chinese.yml b/paper/src/main/resources/messages/chinese.yml index 535a46d..4b1d86d 100644 --- a/paper/src/main/resources/messages/chinese.yml +++ b/paper/src/main/resources/messages/chinese.yml @@ -21,8 +21,8 @@ messages: equip-bubbles: '你已佩戴聊天气泡 {Bubble}' unequip-bubbles: '你已卸下聊天气泡' - available-bubbles: '可用聊天气泡: {Bubbles}' - force-equip-bubbles: '成功使用聊天气泡 {Bubbles}' + available-bubbles: '可用聊天气泡: {Bubble}' + force-equip-bubbles: '成功使用聊天气泡 {Bubble}' force-unequip-bubbles: '你移除了 {Player} 的聊天气泡' not-exist-bubbles: '那个聊天气泡不存在!' not-available-bubbles: '你还未拥有这个气泡!' diff --git a/paper/src/main/resources/messages/english.yml b/paper/src/main/resources/messages/english.yml index bb7d90c..6d5616c 100644 --- a/paper/src/main/resources/messages/english.yml +++ b/paper/src/main/resources/messages/english.yml @@ -20,10 +20,10 @@ messages: force-preview: 'Forced {Player} to preview the nameplate' equip-bubbles: 'Successfully equipped chatting bubbles {Bubble}' - force-equip-bubbles: 'Successfully equipped chatting bubbles {Bubbles}' + force-equip-bubbles: 'Successfully equipped chatting bubbles {Bubble}' unequip-bubbles: 'You removed your chatting bubbles' force-unequip-bubbles: 'Successfully removed {Player}''s bubbles!' not-exist-bubbles: 'This bubble does not exist!' not-available-bubbles: 'This bubble is currently not available!' - available-bubbles: 'Available bubbles: {Bubbles}' + available-bubbles: 'Available bubbles: {Bubble}' have-no-bubbles: 'You don''t have any bubble yet' \ No newline at end of file diff --git a/paper/src/main/resources/messages/french.yml b/paper/src/main/resources/messages/french.yml index fe14b49..e8de3cd 100644 --- a/paper/src/main/resources/messages/french.yml +++ b/paper/src/main/resources/messages/french.yml @@ -20,10 +20,10 @@ messages: force-preview: 'Forced {Player} to preview the nameplate' equip-bubbles: 'Bulles de discussion {Bubble} équipées avec succès' - force-equip-bubbles: 'Bulles de discussion {Bubbles} équipées avec succès' + force-equip-bubbles: 'Bulles de discussion {Bubble} équipées avec succès' unequip-bubbles: 'Vous avez retiré vos bulles de discussion' force-unequip-bubbles: 'Les bulles de discussion de {Player} ont été retirées avec succès !' not-exist-bubbles: 'Cette bulle de discussion n'existe pas !' not-available-bubbles: 'Cette bulle de discussion n'est actuellement pas disponible !' - available-bubbles: 'Bulles de discussion disponibles : {Bubbles}.' + available-bubbles: 'Bulles de discussion disponibles : {Bubble}.' have-no-bubbles: 'Vous n'avez pas encore de bulles de discussion' diff --git a/paper/src/main/resources/messages/russian.yml b/paper/src/main/resources/messages/russian.yml index 5b7b445..313e606 100644 --- a/paper/src/main/resources/messages/russian.yml +++ b/paper/src/main/resources/messages/russian.yml @@ -20,10 +20,10 @@ messages: force-preview: 'Forced {Player} to preview the nameplate' equip-bubbles: 'Успешно установлен стиль чата над головой: {Bubble}' - force-equip-bubbles: 'Успешно установлен стиль чата над головой: {Bubbles}' + force-equip-bubbles: 'Успешно установлен стиль чата над головой: {Bubble}' unequip-bubbles: 'Вы сняли стиль чата над головой.' force-unequip-bubbles: 'Успешно снят стиль чата над головой у {Player}!' not-exist-bubbles: 'Такого стиля чата над головой не существует!' not-available-bubbles: 'Этот стиль чата над головой сейчас недоступен!' - available-bubbles: 'Доступные стили чата над головой: {Bubbles}' + available-bubbles: 'Доступные стили чата над головой: {Bubble}' have-no-bubbles: 'У вас еще нет никаких стилей чата над головой.' diff --git a/paper/src/main/resources/messages/spanish.yml b/paper/src/main/resources/messages/spanish.yml index 7c43acf..14afc4d 100644 --- a/paper/src/main/resources/messages/spanish.yml +++ b/paper/src/main/resources/messages/spanish.yml @@ -20,10 +20,10 @@ messages: force-preview: 'Forced {Player} to preview the nameplate' equip-bubbles: 'Correctamente equipado chatting bubbles {Bubble}' - force-equip-bubbles: 'Correctamente equipdo chatting bubbles {Bubbles}' + force-equip-bubbles: 'Correctamente equipdo chatting bubbles {Bubble}' unequip-bubbles: 'Se ha removido tu chatting bubbles' force-unequip-bubbles: 'Se ha removido tu chatting bubbles' not-exist-bubbles: 'Este bubble no existe' not-available-bubbles: 'Este bubble no esta actualmente disponible!' - available-bubbles: 'Bubbles Disponibles: {Bubbles}' + available-bubbles: 'Bubbles Disponibles: {Bubble}' have-no-bubbles: 'Todavía no tienes ningun bubble' \ No newline at end of file diff --git a/paper/src/main/resources/messages/turkish.yml b/paper/src/main/resources/messages/turkish.yml index 17be809..9d8337c 100644 --- a/paper/src/main/resources/messages/turkish.yml +++ b/paper/src/main/resources/messages/turkish.yml @@ -21,10 +21,10 @@ messages: force-preview: 'Forced {Player} to preview the nameplate' equip-bubbles: 'Sohbet balonlarınız başarıyla eklendi {Bubble}' - force-equip-bubbles: '{Bubbles} sohbet balonları başarıyla eklendi.' + force-equip-bubbles: '{Bubble} sohbet balonları başarıyla eklendi.' unequip-bubbles: 'Sohbet balonlarınızı kaldırdınız' force-unequip-bubbles: '{Player} oyuncusunun sohbet balonları başarıyla kaldırıldı!' not-exist-bubbles: 'Bu balon mevcut değil!' not-available-bubbles: 'Bu balon şu anda kullanılabilir değil!' - available-bubbles: 'Mevcut sohbet balonları: {Bubbles}.' + available-bubbles: 'Mevcut sohbet balonları: {Bubble}.' have-no-bubbles: 'Henüz hiç sohbet balonunuz yok' \ No newline at end of file