diff --git a/pom.xml b/pom.xml index c75b8f75..9f903af7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.loohp InteractiveChat - 3.2.1 + 3.2.2 src diff --git a/src/com/loohp/interactivechat/Bungee/InteractiveChatBungee.java b/src/com/loohp/interactivechat/Bungee/InteractiveChatBungee.java index 6a3a0049..d999968e 100644 --- a/src/com/loohp/interactivechat/Bungee/InteractiveChatBungee.java +++ b/src/com/loohp/interactivechat/Bungee/InteractiveChatBungee.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.StringWriter; import java.lang.reflect.Field; import java.net.SocketAddress; import java.nio.ByteBuffer; @@ -69,6 +70,7 @@ import net.md_5.bungee.api.event.ServerSwitchEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.config.Configuration; import net.md_5.bungee.config.ConfigurationProvider; import net.md_5.bungee.config.YamlConfiguration; import net.md_5.bungee.event.EventHandler; @@ -78,8 +80,10 @@ public class InteractiveChatBungee extends Plugin implements Listener { - public static net.md_5.bungee.config.Configuration configuration = null; - public static ConfigurationProvider config = null; + public static Configuration config = null; + public static ConfigurationProvider yamlConfigProvider = null; + public static File configFile; + public static File playerDataFolder; public static Plugin plugin; public static Metrics metrics; @@ -104,15 +108,19 @@ public class InteractiveChatBungee extends Plugin implements Listener { public void onEnable() { plugin = this; - config = ConfigurationProvider.getProvider(YamlConfiguration.class); - if (!getDataFolder().exists()) + yamlConfigProvider = ConfigurationProvider.getProvider(YamlConfiguration.class); + if (!getDataFolder().exists()) { getDataFolder().mkdir(); + } + configFile = new File(getDataFolder(), "bungeeconfig.yml"); + playerDataFolder = new File(getDataFolder(), "player_data"); + if (!playerDataFolder.exists()) { + playerDataFolder.mkdirs(); + } - File file = new File(getDataFolder(), "bungeeconfig.yml"); - - if (!file.exists()) { + if (!configFile.exists()) { try (InputStream in = getResourceAsStream("bungeeconfig.yml")) { - Files.copy(in, file.toPath()); + Files.copy(in, configFile.toPath()); } catch (IOException e) { e.printStackTrace(); } @@ -142,8 +150,8 @@ public void onDisable() { public static void loadConfig() { try { - configuration = config.load(new File(plugin.getDataFolder(), "bungeeconfig.yml")); - parseCommands = configuration.getStringList("Settings.CommandsToParse"); + config = yamlConfigProvider.load(configFile); + parseCommands = config.getStringList("Settings.CommandsToParse"); } catch (IOException e) { e.printStackTrace(); } @@ -308,6 +316,13 @@ public void run() { placeholderList.put(((Server) event.getSender()).getInfo().getName(), list); forwardPlaceholderList(list, ((Server) event.getSender()).getInfo()); break; + case 0x12: + UUID uuid2 = DataTypeIO.readUUID(input); + String playerdata = DataTypeIO.readString(input, StandardCharsets.UTF_8); + Configuration playerconfig = yamlConfigProvider.load(playerdata); + yamlConfigProvider.save(playerconfig, new File(playerDataFolder, uuid2.toString())); + forwardPlayerData(uuid2, playerdata, ((Server) event.getSender()).getInfo()); + break; } } catch (IOException | DataFormatException e) { e.printStackTrace(); @@ -322,6 +337,38 @@ public void run() { } } + private void forwardPlayerData(UUID uuid, String playerdata, ServerInfo serverFrom) throws IOException { + ByteArrayDataOutput output = ByteStreams.newDataOutput(); + + DataTypeIO.writeUUID(output, uuid); + DataTypeIO.writeString(output, playerdata, StandardCharsets.UTF_8); + + int packetNumber = random.nextInt(); + int packetId = 0x12; + byte[] data = output.toByteArray(); + + byte[][] dataArray = CustomArrayUtils.divideArray(CompressionUtils.compress(data), 32700); + + for (int i = 0; i < dataArray.length; i++) { + byte[] chunk = dataArray[i]; + + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeInt(packetNumber); + + out.writeShort(packetId); + out.writeBoolean(i == (dataArray.length - 1)); + + out.write(chunk); + + for (ServerInfo server : getProxy().getServers().values()) { + if (!server.getSocketAddress().equals(serverFrom.getSocketAddress())) { + server.sendData("interchat:main", out.toByteArray()); + pluginMessagesCounter.incrementAndGet(); + } + } + } + } + private void forwardPlaceholderList(List serverPlaceholderList, ServerInfo serverFrom) throws IOException { ByteArrayDataOutput output = ByteStreams.newDataOutput(); @@ -539,10 +586,23 @@ public void write(ChannelHandlerContext channelHandlerContext, Object obj, Chann @EventHandler public void onPlayerConnected(PostLoginEvent event) { ProxiedPlayer player = event.getPlayer(); + UUID uuid = player.getUniqueId(); forwardedMessages.put(player.getUniqueId(), new ArrayList<>()); List messageQueue = Collections.synchronizedList(new LinkedList<>()); requestedMessageProcesses.put(player.getUniqueId(), messageQueue); + File playerFile = new File(playerDataFolder, uuid.toString()); + if (playerFile.exists()) { + try { + Configuration playerconfig = yamlConfigProvider.load(playerFile); + StringWriter writer = new StringWriter(); + yamlConfigProvider.save(playerconfig, writer); + forwardPlayerData(uuid, writer.toString(), player.getServer().getInfo()); + } catch (IOException e) { + e.printStackTrace(); + } + } + UserConnection userConnection = (UserConnection) player; ChannelWrapper channelWrapper; Field channelField = null; diff --git a/src/com/loohp/interactivechat/Commands.java b/src/com/loohp/interactivechat/Commands.java index 6a138229..4f991213 100644 --- a/src/com/loohp/interactivechat/Commands.java +++ b/src/com/loohp/interactivechat/Commands.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import com.loohp.interactivechat.Data.PlayerDataManager.PlayerData; import com.loohp.interactivechat.PluginMessaging.BungeeMessageSender; import com.loohp.interactivechat.Updater.Updater; import com.loohp.interactivechat.Utils.ChatColorUtils; @@ -70,6 +71,65 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String return true; } + if (args[0].equalsIgnoreCase("mentiontoggle")) { + if (sender.hasPermission("interactivechat.mention.toggle")) { + if (args.length == 1) { + if (sender instanceof Player) { + Player player = (Player) sender; + PlayerData pd = InteractiveChat.playerDataManager.getPlayerData(player); + if (pd.isMentionDisabled()) { + pd.setMentionDisabled(false); + pd.saveConfig(); + sender.sendMessage(InteractiveChat.mentionEnable); + } else { + pd.setMentionDisabled(true); + pd.saveConfig(); + sender.sendMessage(InteractiveChat.mentionDisable); + } + if (InteractiveChat.bungeecordMode) { + try { + BungeeMessageSender.forwardPlayerDataUpdate(player.getUniqueId(), pd.getConfig()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } else { + sender.sendMessage(InteractiveChat.Console); + } + } else { + if (sender.hasPermission("interactivechat.mention.toggle.others")) { + Player player = Bukkit.getPlayer(args[1]); + if (player != null) { + PlayerData pd = InteractiveChat.playerDataManager.getPlayerData(player); + if (pd.isMentionDisabled()) { + pd.setMentionDisabled(false); + pd.saveConfig(); + sender.sendMessage(InteractiveChat.mentionEnable); + } else { + pd.setMentionDisabled(true); + pd.saveConfig(); + sender.sendMessage(InteractiveChat.mentionDisable); + } + if (InteractiveChat.bungeecordMode) { + try { + BungeeMessageSender.forwardPlayerDataUpdate(player.getUniqueId(), pd.getConfig()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } else { + sender.sendMessage(InteractiveChat.InvalidPlayer); + } + } else { + sender.sendMessage(InteractiveChat.NoPermission); + } + } + } else { + sender.sendMessage(InteractiveChat.NoPermission); + } + return true; + } + if (sender instanceof Player) { Player player = (Player) sender; if (args[0].equals("viewinv")) { @@ -121,6 +181,9 @@ public List onTabComplete(CommandSender sender, Command cmd, String labe if (sender.hasPermission("interactivechat.update")) { tab.add("update"); } + if (sender.hasPermission("interactivechat.mention.toggle")) { + tab.add("mentiontoggle"); + } return tab; case 1: if (sender.hasPermission("interactivechat.reload")) { @@ -133,6 +196,22 @@ public List onTabComplete(CommandSender sender, Command cmd, String labe tab.add("update"); } } + if (sender.hasPermission("interactivechat.mention.toggle")) { + if ("mentiontoggle".startsWith(args[0].toLowerCase())) { + tab.add("mentiontoggle"); + } + } + return tab; + case 2: + if (sender.hasPermission("interactivechat.mention.toggle.others")) { + if ("mentiontoggle".equalsIgnoreCase(args[0])) { + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.getName().toLowerCase().startsWith(args[1])) { + tab.add(player.getName()); + } + } + } + } return tab; default: return tab; diff --git a/src/com/loohp/interactivechat/ConfigManager.java b/src/com/loohp/interactivechat/ConfigManager.java index 58ffede8..b6cf72e6 100644 --- a/src/com/loohp/interactivechat/ConfigManager.java +++ b/src/com/loohp/interactivechat/ConfigManager.java @@ -56,6 +56,8 @@ public static void loadConfig() { InteractiveChat.NoPermission = ChatColorUtils.translateAlternateColorCodes('&', getConfig().getString("Messages.NoPermission")); InteractiveChat.InvExpired = ChatColorUtils.translateAlternateColorCodes('&', getConfig().getString("Messages.InvExpired")); InteractiveChat.ReloadPlugin = ChatColorUtils.translateAlternateColorCodes('&', getConfig().getString("Messages.ReloadPlugin")); + InteractiveChat.Console = ChatColorUtils.translateAlternateColorCodes('&', getConfig().getString("Messages.PlayerOnlyCommand")); + InteractiveChat.InvalidPlayer = ChatColorUtils.translateAlternateColorCodes('&', getConfig().getString("Messages.InvalidPlayer")); InteractiveChat.useItem = getConfig().getBoolean("ItemDisplay.Item.Enabled"); InteractiveChat.useInventory = getConfig().getBoolean("ItemDisplay.Inventory.Enabled"); @@ -183,6 +185,9 @@ public static void loadConfig() { InteractiveChat.mentionHover = String.join("\n", stringList3); InteractiveChat.mentionDuration = getConfig().getLong("Chat.MentionedTitleDuration"); + InteractiveChat.mentionEnable = ChatColorUtils.translateAlternateColorCodes('&', getConfig().getString("Messages.EnableMentions")); + InteractiveChat.mentionDisable = ChatColorUtils.translateAlternateColorCodes('&', getConfig().getString("Messages.DisableMentions")); + InteractiveChat.UpdaterEnabled = getConfig().getBoolean("Options.Updater"); InteractiveChat.cancelledMessage = getConfig().getBoolean("Options.ShowCancelledNotice"); diff --git a/src/com/loohp/interactivechat/Data/PlayerDataManager.java b/src/com/loohp/interactivechat/Data/PlayerDataManager.java new file mode 100644 index 00000000..de69c237 --- /dev/null +++ b/src/com/loohp/interactivechat/Data/PlayerDataManager.java @@ -0,0 +1,195 @@ +package com.loohp.interactivechat.Data; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import com.loohp.interactivechat.InteractiveChat; + +public class PlayerDataManager implements Listener { + + public static final String DATA_FOLDER_NAME = "player_data"; + public static final String FILE_EXTENSION = ".yml"; + + private InteractiveChat plugin; + private File dataFolder; + private Map data = new HashMap<>(); + + public PlayerDataManager(InteractiveChat plugin) { + this.plugin = plugin; + Bukkit.getPluginManager().registerEvents(this, this.plugin); + dataFolder = new File(plugin.getDataFolder(), DATA_FOLDER_NAME); + if (!dataFolder.exists()) { + dataFolder.mkdirs(); + } + + for (Player player : Bukkit.getOnlinePlayers()) { + onJoin(new PlayerJoinEvent(player, "")); + } + } + + public void mergeOnline(UUID uuid, String data) { + PlayerData pd = this.data.get(uuid); + FileConfiguration config = pd.getConfig(); + FileConfiguration toMerge = new YamlConfiguration(); + try { + toMerge.loadFromString(data); + + for (Entry entry : toMerge.getValues(true).entrySet()) { + config.set(entry.getKey(), entry.getValue()); + } + } catch (InvalidConfigurationException e1) { + e1.printStackTrace(); + } + + pd.saveConfig(); + } + + public void mergeOffline(UUID uuid, String data) { + File file = new File(dataFolder, uuid.toString() + FILE_EXTENSION); + if (!file.exists()) { + try { + PrintWriter pw = new PrintWriter(file); + pw.println(); + pw.flush(); + pw.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + FileConfiguration toMerge = new YamlConfiguration(); + try { + toMerge.loadFromString(data); + + for (Entry entry : toMerge.getValues(true).entrySet()) { + config.set(entry.getKey(), entry.getValue()); + } + } catch (InvalidConfigurationException e1) { + e1.printStackTrace(); + } + + try { + config.save(new File(dataFolder, uuid.toString() + FILE_EXTENSION)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public PlayerData getPlayerData(Player player) { + return getPlayerData(player.getUniqueId()); + } + + public PlayerData getPlayerData(UUID uuid) { + return data.get(uuid); + } + + //=============== + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + UUID playerUUID = player.getUniqueId(); + + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + File file = new File(dataFolder, playerUUID.toString() + FILE_EXTENSION); + if (!file.exists()) { + try { + PrintWriter pw = new PrintWriter(file); + pw.println(); + pw.flush(); + pw.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + PlayerData pd = new PlayerData(file, config); + pd.setPlayerName(player.getName()); + pd.saveConfig(); + + Bukkit.getScheduler().runTask(plugin, () -> data.put(playerUUID, pd)); + }); + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + PlayerData pd = data.remove(event.getPlayer().getUniqueId()); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> pd.saveConfig()); + } + + //============= + + public static class PlayerData { + + public static final String PLAYERNAME = "PlayerName"; + public static final String DISABLE_MENTION = "Preferences.DisableMention"; + + private FileConfiguration config; + private File file; + + protected PlayerData(File file, FileConfiguration config) { + this.file = file; + this.config = config; + } + + public FileConfiguration getConfig() { + return config; + } + + public void reloadConfig() { + config = YamlConfiguration.loadConfiguration(file); + } + + public void saveConfig() { + try { + config.save(file); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("unchecked") + public T get(String path, T def, Class clazz) { + return (T) config.get(path, def); + } + + public void set(String path, T value) { + config.set(path, value); + } + + public String getPlayerName() { + return config.getString(PLAYERNAME, ""); + } + + public void setPlayerName(String value) { + config.set(PLAYERNAME, value); + } + + public boolean isMentionDisabled() { + return config.getBoolean(DISABLE_MENTION, false); + } + + public void setMentionDisabled(boolean value) { + config.set(DISABLE_MENTION, value); + } + } + +} diff --git a/src/com/loohp/interactivechat/InteractiveChat.java b/src/com/loohp/interactivechat/InteractiveChat.java index d74b20e6..dee03322 100644 --- a/src/com/loohp/interactivechat/InteractiveChat.java +++ b/src/com/loohp/interactivechat/InteractiveChat.java @@ -28,6 +28,7 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.Maps; +import com.loohp.interactivechat.Data.PlayerDataManager; import com.loohp.interactivechat.Debug.Debug; import com.loohp.interactivechat.Hooks.EssentialsNicknames; import com.loohp.interactivechat.Listeners.ChatPackets; @@ -131,6 +132,8 @@ public class InteractiveChat extends JavaPlugin { public static String NoPermission = "&cYou do not have permission to use that command!"; public static String InvExpired = "&cThis inventory view has expired!"; public static String ReloadPlugin = "&aInteractive Chat has been reloaded!"; + public static String Console = ""; + public static String InvalidPlayer = ""; public static Map messages = new ConcurrentHashMap<>(); public static Map keyTime = new ConcurrentHashMap<>(); @@ -156,6 +159,8 @@ public class InteractiveChat extends JavaPlugin { public static String mentionHightlight = "&e{MentionedPlayer}"; public static String mentionHover = "&e{MentionedPlayer}"; public static long mentionDuration = 2; + public static String mentionEnable = ""; + public static String mentionDisable = ""; public static List commandList = new ArrayList(); public static Map commandPlaceholderMatch = new ConcurrentHashMap<>(); @@ -183,6 +188,8 @@ public class InteractiveChat extends JavaPlugin { public static Map> remotePlaceholderList = new HashMap<>(); public static int remoteDelay = 500; public static boolean queueRemoteUpdate = false; + + public static PlayerDataManager playerDataManager; @Override public void onEnable() { @@ -285,6 +292,8 @@ public void onEnable() { ClientSettingPackets.clientSettingsListener(); + playerDataManager = new PlayerDataManager(this); + try { TextComponent test = new TextComponent("Legacy Bungeecord Chat API Test"); test.setHoverEvent(new HoverEvent(Action.SHOW_TEXT, new Text("Test Hover Text"))); diff --git a/src/com/loohp/interactivechat/Listeners/ChatPackets.java b/src/com/loohp/interactivechat/Listeners/ChatPackets.java index e4b3722b..016136cf 100644 --- a/src/com/loohp/interactivechat/Listeners/ChatPackets.java +++ b/src/com/loohp/interactivechat/Listeners/ChatPackets.java @@ -163,7 +163,7 @@ public void onPacketSending(PacketEvent event) { basecomponent = PlayernameDisplay.process(basecomponent, rawMessageKey, sender, unix); } debug++; - if (InteractiveChat.AllowMention && sender.isPresent()) { + if (InteractiveChat.AllowMention && sender.isPresent() && !InteractiveChat.playerDataManager.getPlayerData(reciever).isMentionDisabled()) { basecomponent = MentionDisplay.process(basecomponent, reciever, sender.get(), rawMessageKey, unix, event.isAsync()); } debug++; diff --git a/src/com/loohp/interactivechat/Listeners/Events.java b/src/com/loohp/interactivechat/Listeners/Events.java index 42a9af1d..7901d5a1 100644 --- a/src/com/loohp/interactivechat/Listeners/Events.java +++ b/src/com/loohp/interactivechat/Listeners/Events.java @@ -184,7 +184,7 @@ public void checkChatforChatManagerOrTranslateChatColor(AsyncPlayerChatEvent eve private void checkMention(AsyncPlayerChatEvent event) { String message = event.getMessage(); Player sender = event.getPlayer(); - if (InteractiveChat.AllowMention == true && sender.hasPermission("interactivechat.mention.player")) { + if (InteractiveChat.AllowMention == true && sender.hasPermission("interactivechat.mention.player") && !InteractiveChat.playerDataManager.getPlayerData(sender).isMentionDisabled()) { Map playernames = new HashMap<>(); for (Player player : Bukkit.getOnlinePlayers()) { playernames.put(ChatColorUtils.stripColor(player.getName()), player.getUniqueId()); diff --git a/src/com/loohp/interactivechat/PluginMessaging/BungeeMessageListener.java b/src/com/loohp/interactivechat/PluginMessaging/BungeeMessageListener.java index 1050d744..46662903 100644 --- a/src/com/loohp/interactivechat/PluginMessaging/BungeeMessageListener.java +++ b/src/com/loohp/interactivechat/PluginMessaging/BungeeMessageListener.java @@ -22,6 +22,7 @@ import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteStreams; import com.loohp.interactivechat.InteractiveChat; +import com.loohp.interactivechat.Data.PlayerDataManager; import com.loohp.interactivechat.Modules.ProcessBungeeRequestedMessage; import com.loohp.interactivechat.ObjectHolders.CommandPlaceholderInfo; import com.loohp.interactivechat.ObjectHolders.CustomPlaceholder; @@ -244,6 +245,16 @@ public void onPluginMessageReceived(String channel, Player pluginMessagingPlayer case 0x11: BungeeMessageSender.resetAndForwardAliasMapping(InteractiveChat.aliasesMapping); break; + case 0x12: + UUID playerUUID = DataTypeIO.readUUID(input); + String data1 = DataTypeIO.readString(input, StandardCharsets.UTF_8); + PlayerDataManager manager = InteractiveChat.playerDataManager; + if (manager.getPlayerData(playerUUID) != null) { + manager.mergeOnline(playerUUID, data1); + } else { + manager.mergeOffline(playerUUID, data1); + } + break; } //for (Player player : Bukkit.getOnlinePlayers()) { // player.sendMessage(packetId + ""); diff --git a/src/com/loohp/interactivechat/PluginMessaging/BungeeMessageSender.java b/src/com/loohp/interactivechat/PluginMessaging/BungeeMessageSender.java index ea3ed7aa..0cbcdd39 100644 --- a/src/com/loohp/interactivechat/PluginMessaging/BungeeMessageSender.java +++ b/src/com/loohp/interactivechat/PluginMessaging/BungeeMessageSender.java @@ -9,6 +9,7 @@ import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -177,4 +178,11 @@ public static boolean resetAndForwardPlaceholderList(List placeho } return forwardData(0x11, out.toByteArray()); } + + public static boolean forwardPlayerDataUpdate(UUID uuid, FileConfiguration config) throws IOException { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + DataTypeIO.writeUUID(out, uuid); + DataTypeIO.writeString(out, config.saveToString(), StandardCharsets.UTF_8); + return forwardData(0x12, out.toByteArray()); + } } diff --git a/src/config.yml b/src/config.yml index e142994e..08c29785 100644 --- a/src/config.yml +++ b/src/config.yml @@ -16,6 +16,13 @@ Messages: ColorsDisabled: "&lYou have colors disabled in your client settings! All messages will be white and respect the settings!" ColorsReEnabled: "&aYou have colors re-enabled in your client settings! All messages will be colored from this point!" + #The message sent when a player toggle mentions + EnableMentions: "&aPlayer Mentions Enabled!" + DisableMentions: "&ePlayer Mentions Disabled!" + + PlayerOnlyCommand: "&cThis command cannot be used in the console!" + InvalidPlayer: "&cThat is not a valid player!" + Settings: #Bungeecord Mode Bungeecord: false diff --git a/src/config_legacy.yml b/src/config_legacy.yml index 6ae4c83e..797a765a 100644 --- a/src/config_legacy.yml +++ b/src/config_legacy.yml @@ -14,6 +14,13 @@ Messages: #The messages sent when a client has colors disabled in their own settings ColorsDisabled: "&lYou have colors disabled in your client settings! All messages will be white and respect the settings!" ColorsReEnabled: "&aYou have colors re-enabled in your client settings! All messages will be colored from this point!" + + #The message sent when a player toggle mentions + EnableMentions: "&aPlayer Mentions Enabled!" + DisableMentions: "&ePlayer Mentions Disabled!" + + PlayerOnlyCommand: "&cThis command cannot be used in the console!" + InvalidPlayer: "&cThat is not a valid player!" Settings: #Bungeecord Mode diff --git a/src/config_old.yml b/src/config_old.yml index 4b41ee26..16c30262 100644 --- a/src/config_old.yml +++ b/src/config_old.yml @@ -15,6 +15,13 @@ Messages: ColorsDisabled: "&lYou have colors disabled in your client settings! All messages will be white and respect the settings!" ColorsReEnabled: "&aYou have colors re-enabled in your client settings! All messages will be colored from this point!" + #The message sent when a player toggle mentions + EnableMentions: "&aPlayer Mentions Enabled!" + DisableMentions: "&ePlayer Mentions Disabled!" + + PlayerOnlyCommand: "&cThis command cannot be used in the console!" + InvalidPlayer: "&cThat is not a valid player!" + Settings: #Bungeecord Mode Bungeecord: false diff --git a/src/plugin.yml b/src/plugin.yml index 2104bdf7..bf1e1563 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -45,6 +45,12 @@ permissions: interactivechat.mention.player: description: Allows you to mention others default: true + interactivechat.mention.toggle: + description: Allows you to toggle your own mentions + default: true + interactivechat.mention.toggle.others: + description: Allows you to toggle mentions of other players + default: true interactivechat.chatcolor.translate: description: Allows you to use alternate color code default: true