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