From cc57c63578bd49decd4dc5be9c86861f0f804047 Mon Sep 17 00:00:00 2001 From: sophie Date: Mon, 8 Jul 2024 01:57:14 +0300 Subject: [PATCH] add disabling the animal chat modifications client side --- src/main/java/lv/pi/animalrp/AnimalRP.java | 156 ++++++++++++------ .../commands/ChatModClientCommand.java | 53 ++++++ .../lv/pi/animalrp/listeners/PlayerChat.java | 41 +++-- src/main/resources/plugin.yml | 4 + 4 files changed, 188 insertions(+), 66 deletions(-) create mode 100644 src/main/java/lv/pi/animalrp/commands/ChatModClientCommand.java diff --git a/src/main/java/lv/pi/animalrp/AnimalRP.java b/src/main/java/lv/pi/animalrp/AnimalRP.java index 5a47ae3..bff864e 100644 --- a/src/main/java/lv/pi/animalrp/AnimalRP.java +++ b/src/main/java/lv/pi/animalrp/AnimalRP.java @@ -54,6 +54,7 @@ import lv.pi.animalrp.animals.Dog; import lv.pi.animalrp.animals.Fox; import lv.pi.animalrp.commands.EmoteCommand; import lv.pi.animalrp.commands.InteractionCommand; +import lv.pi.animalrp.commands.ChatModClientCommand; import lv.pi.animalrp.commands.ChatModCommand; import lv.pi.animalrp.commands.ClearCooldownCommand; import lv.pi.animalrp.commands.SexCommand; @@ -69,10 +70,11 @@ import net.milkbowl.vault.chat.Chat; public class AnimalRP extends JavaPlugin { public static HashMap users; public static HashMap isChatModOff; + public static HashMap isChatModOffClient; public static HashMap cooldowns; public static HashMap animals; public static Emote emotes; - + public static Chat vaultChat; public static Boolean configEnabled = true; @@ -83,45 +85,61 @@ public class AnimalRP extends JavaPlugin { public void onDisable() { File folder = getDataFolder(); HashMap usersReformatted = new HashMap(); - - for (Entry ee : users.entrySet()) { + + for (Entry ee : users.entrySet()) { usersReformatted.put(ee.getKey().toString(), ee.getValue().name); } try { Path filePath = folder.toPath().resolve("database.json"); - if(!Files.exists(filePath)) Files.createFile(filePath); + if (!Files.exists(filePath)) + Files.createFile(filePath); - Files.write(filePath, gson.toJson(usersReformatted).getBytes()); - } catch (IOException e) { - e.printStackTrace(); - } + Files.write(filePath, gson.toJson(usersReformatted).getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } try { Path filePath = folder.toPath().resolve("cooldowns.json"); - if(!Files.exists(filePath)) Files.createFile(filePath); + if (!Files.exists(filePath)) + Files.createFile(filePath); JsonObject jsobj = new JsonObject(); AnimalRP.cooldowns.forEach((a, b) -> { jsobj.add(a.toString(), b.toJson()); }); - Files.write(filePath, gson.toJson(jsobj).getBytes()); - } catch (IOException e) { - e.printStackTrace(); - } + Files.write(filePath, gson.toJson(jsobj).getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } try { Path filePath = folder.toPath().resolve("disabled.json"); - if(!Files.exists(filePath)) Files.createFile(filePath); + if (!Files.exists(filePath)) + Files.createFile(filePath); JsonObject jsobj = new JsonObject(); AnimalRP.isChatModOff.forEach((a, b) -> { jsobj.addProperty(a.toString(), b); }); - Files.write(filePath, gson.toJson(jsobj).getBytes()); - } catch (IOException e) { - e.printStackTrace(); - } + Files.write(filePath, gson.toJson(jsobj).getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + Path filePath = folder.toPath().resolve("disabled-client.json"); + if (!Files.exists(filePath)) + Files.createFile(filePath); + JsonObject jsobj = new JsonObject(); + AnimalRP.isChatModOffClient.forEach((a, b) -> { + jsobj.addProperty(a.toString(), b); + }); + Files.write(filePath, gson.toJson(jsobj).getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } } public boolean setupVault() { @@ -129,20 +147,23 @@ public class AnimalRP extends JavaPlugin { return false; } RegisteredServiceProvider rsp = getServer().getServicesManager().getRegistration(Chat.class); - if(rsp != null) { + if (rsp != null) { AnimalRP.vaultChat = rsp.getProvider(); } else { return false; - } + } return true; } + @Override public void onEnable() { - if(!setupVault()) { - this.getLogger().log(Level.WARNING, "!!! Missing vault, prefix/suffix will not be included in chat formatting."); + if (!setupVault()) { + this.getLogger().log(Level.WARNING, + "!!! Missing vault, prefix/suffix will not be included in chat formatting."); } AnimalRP.users = new HashMap(); AnimalRP.isChatModOff = new HashMap(); + AnimalRP.isChatModOffClient = new HashMap(); AnimalRP.cooldowns = new HashMap(); AnimalRP.animals = new HashMap(); @@ -155,38 +176,41 @@ public class AnimalRP extends JavaPlugin { animals.put("fox", new Fox()); animals.put("dog", new Dog()); animals.put("bee", new Bee()); - - animals.forEach((z,b) -> { + + animals.forEach((z, b) -> { pm.registerEvents(b, this); }); - + Path folder = getDataFolder().toPath(); - if(!Files.exists(folder)) { + if (!Files.exists(folder)) { try { Files.createDirectory(folder); } catch (IOException e) { e.printStackTrace(); } } - - if(folder.resolve("database.json").toFile().exists()) { - try { - JsonObject z = JsonParser.parseString(Files.readString(folder.resolve("database.json"))).getAsJsonObject(); - - for (Entry entry : z.entrySet()) { - AnimalRP.users.put(UUID.fromString(entry.getKey()), AnimalRP.animals.get(entry.getValue().getAsString())); + + if (folder.resolve("database.json").toFile().exists()) { + try { + JsonObject z = JsonParser.parseString(Files.readString(folder.resolve("database.json"))) + .getAsJsonObject(); + + for (Entry entry : z.entrySet()) { + AnimalRP.users.put(UUID.fromString(entry.getKey()), + AnimalRP.animals.get(entry.getValue().getAsString())); } } catch (JsonSyntaxException | IOException e) { e.printStackTrace(); } } - if(folder.resolve("disabled.json").toFile().exists()) { - try { - JsonObject z = JsonParser.parseString(Files.readString(folder.resolve("disabled.json"))).getAsJsonObject(); - - for (Entry entry : z.entrySet()) { + if (folder.resolve("disabled.json").toFile().exists()) { + try { + JsonObject z = JsonParser.parseString(Files.readString(folder.resolve("disabled.json"))) + .getAsJsonObject(); + + for (Entry entry : z.entrySet()) { AnimalRP.isChatModOff.put(UUID.fromString(entry.getKey()), entry.getValue().getAsBoolean()); } } catch (JsonSyntaxException | IOException e) { @@ -194,12 +218,27 @@ public class AnimalRP extends JavaPlugin { } } - if(folder.resolve("cooldowns.json").toFile().exists()) { - try { - JsonObject z = JsonParser.parseString(Files.readString(folder.resolve("cooldowns.json"))).getAsJsonObject(); - - for (Entry entry : z.entrySet()) { - AnimalRP.cooldowns.put(UUID.fromString(entry.getKey()), Cooldown.fromJson(entry.getValue().getAsJsonObject())); + if (folder.resolve("cooldowns.json").toFile().exists()) { + try { + JsonObject z = JsonParser.parseString(Files.readString(folder.resolve("cooldowns.json"))) + .getAsJsonObject(); + + for (Entry entry : z.entrySet()) { + AnimalRP.cooldowns.put(UUID.fromString(entry.getKey()), + Cooldown.fromJson(entry.getValue().getAsJsonObject())); + } + } catch (JsonSyntaxException | IOException e) { + e.printStackTrace(); + } + } + + if (folder.resolve("disabled-client.json").toFile().exists()) { + try { + JsonObject z = JsonParser.parseString(Files.readString(folder.resolve("disabled-client.json"))) + .getAsJsonObject(); + + for (Entry entry : z.entrySet()) { + AnimalRP.isChatModOffClient.put(UUID.fromString(entry.getKey()), entry.getValue().getAsBoolean()); } } catch (JsonSyntaxException | IOException e) { e.printStackTrace(); @@ -208,27 +247,38 @@ public class AnimalRP extends JavaPlugin { pm.registerEvents(new PlayerChat(), this); pm.registerEvents(new PlayerLeave(), this); - + getCommand("tf").setExecutor(new TfCommand()); getCommand("emote").setExecutor(new EmoteCommand()); getCommand("sex").setExecutor(new SexCommand()); ChatModCommand cmc = new ChatModCommand(); + ChatModClientCommand cmcc = new ChatModClientCommand(); getCommand("chatmodoff").setExecutor(cmc); getCommand("chatmodon").setExecutor(cmc); + getCommand("chatmodclientoff").setExecutor(cmcc); + getCommand("chatmodclienton").setExecutor(cmcc); getCommand("clearcooldown").setExecutor(new ClearCooldownCommand()); - getCommand("headpats").setExecutor(new InteractionCommand(Mood.HAPPY, "%s petted you! %s", "You petted %s! %s")); - getCommand("kiss").setExecutor(new InteractionCommand(Mood.CUTE, "%s kissed you.. 0////0 %s", "You kissed %s.. 0////0 %s")); - getCommand("bite").setExecutor(new InteractionCommand(Mood.ANGRY, "%s bit you!! Σ(っ゚Д゚)っ %s", "You bit %s! (○`д´)ノシ %s")); - getCommand("bzz").setExecutor(new InteractionCommand(Mood.ANGRY, "%s bzzs at you!! :3 %s", "You bzzed at %s :3 %s")); - getCommand("purr").setExecutor(new InteractionCommand(Mood.CUTE, "You hear the soft sound of %s purring on you... %s", "You jump on %s, and start purring. %s")); - getCommand("scratch").setExecutor(new InteractionCommand(Mood.ANGRY, "%s SCRATCHES YOU! Ow! %s", "You channel your inner evil, and scratch %s! %s")); + getCommand("headpats") + .setExecutor(new InteractionCommand(Mood.HAPPY, "%s petted you! %s", "You petted %s! %s")); + getCommand("kiss").setExecutor( + new InteractionCommand(Mood.CUTE, "%s kissed you.. 0////0 %s", "You kissed %s.. 0////0 %s")); + getCommand("bite") + .setExecutor(new InteractionCommand(Mood.ANGRY, "%s bit you!! Σ(っ゚Д゚)っ %s", "You bit %s! (○`д´)ノシ %s")); + getCommand("bzz") + .setExecutor(new InteractionCommand(Mood.ANGRY, "%s bzzs at you!! :3 %s", "You bzzed at %s :3 %s")); + getCommand("purr").setExecutor(new InteractionCommand(Mood.CUTE, + "You hear the soft sound of %s purring on you... %s", "You jump on %s, and start purring. %s")); + getCommand("scratch").setExecutor(new InteractionCommand(Mood.ANGRY, "%s SCRATCHES YOU! Ow! %s", + "You channel your inner evil, and scratch %s! %s")); /* Contributed by Simo__28 */ - getCommand("hug").setExecutor(new InteractionCommand(Mood.HAPPY, "%s hugs you! How heartwarming. %s", "You hug %s! How heartwarming. %s")); - getCommand("cuddle").setExecutor(new InteractionCommand(Mood.CUTE, "%s cuddles with you. %s", "You and %s start cuddling. How cute! %s")); + getCommand("hug").setExecutor(new InteractionCommand(Mood.HAPPY, "%s hugs you! How heartwarming. %s", + "You hug %s! How heartwarming. %s")); + getCommand("cuddle").setExecutor(new InteractionCommand(Mood.CUTE, "%s cuddles with you. %s", + "You and %s start cuddling. How cute! %s")); /* */ } } \ No newline at end of file diff --git a/src/main/java/lv/pi/animalrp/commands/ChatModClientCommand.java b/src/main/java/lv/pi/animalrp/commands/ChatModClientCommand.java new file mode 100644 index 0000000..4e829f9 --- /dev/null +++ b/src/main/java/lv/pi/animalrp/commands/ChatModClientCommand.java @@ -0,0 +1,53 @@ +package lv.pi.animalrp.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import lv.pi.animalrp.AnimalRP; + +public class ChatModClientCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender arg0, @NotNull Command arg1, @NotNull String arg2, + @NotNull String[] arg3) { + if (!(arg0 instanceof Player)) { + arg0.sendMessage(AnimalRP.mm.deserialize("I'm sorry console. :(")); + return true; + } + + Player player = (Player) arg0; + + boolean off = false; + if (arg2.endsWith("off")) { + off = true; + } + + boolean isDisabled = false; + + if (AnimalRP.isChatModOffClient.get(player.getUniqueId()) != null) { + isDisabled = true; + } + + if (isDisabled) { // client chat modifications are turned off + if (off) { // asking to be turned off + arg0.sendMessage( + AnimalRP.mm.deserialize("Chat modifications for your client are already disabled!")); + } else { // asking to be turned on + arg0.sendMessage(AnimalRP.mm.deserialize("Chat modifications for your client are enabled!")); + AnimalRP.isChatModOffClient.remove(player.getUniqueId()); + } + } else { // chat modifications are turned on + if (off) { // asking to be turned off + arg0.sendMessage(AnimalRP.mm.deserialize("Chat modifications for your client are disabled!")); + AnimalRP.isChatModOffClient.put(player.getUniqueId(), true); + } else { // asking to be turned on + arg0.sendMessage( + AnimalRP.mm.deserialize("Chat modifications for your client are already enabled!!")); + } + } + return true; + } + +} diff --git a/src/main/java/lv/pi/animalrp/listeners/PlayerChat.java b/src/main/java/lv/pi/animalrp/listeners/PlayerChat.java index b28dbfe..ce9f15b 100644 --- a/src/main/java/lv/pi/animalrp/listeners/PlayerChat.java +++ b/src/main/java/lv/pi/animalrp/listeners/PlayerChat.java @@ -1,6 +1,8 @@ package lv.pi.animalrp.listeners; +import java.util.Optional; import java.util.Random; +import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -15,20 +17,30 @@ import io.papermc.paper.event.player.AsyncChatEvent; import lv.pi.animalrp.animals.Animal; import lv.pi.animalrp.util.Mood; import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.identity.Identity; import net.kyori.adventure.text.Component; import lv.pi.animalrp.AnimalRP; class CustomChatRenderer implements ChatRenderer { String message; + String messageDefault; - public CustomChatRenderer(String message) { + public CustomChatRenderer(String message, String messageDefault) { this.message = message; + this.messageDefault = messageDefault; } @Override - public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, + public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, + @NotNull Component message, @NotNull Audience viewer) { + Optional uuid = viewer.get(Identity.UUID); + if (uuid.isPresent()) { + if (AnimalRP.isChatModOffClient.get(uuid.get()) != null) { + return AnimalRP.mm.deserialize(this.messageDefault); + } + } return AnimalRP.mm.deserialize(this.message); } }; @@ -42,21 +54,22 @@ public class PlayerChat implements Listener { Boolean chatModOff = false; Team team = Bukkit.getServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(event.getPlayer()); - if(animal != null) { - if(AnimalRP.isChatModOff.get(event.getPlayer().getUniqueId()) != null) { - chatModOff = true; + if (animal != null) { + if (AnimalRP.isChatModOff.get(event.getPlayer().getUniqueId()) != null) { + chatModOff = true; } else { - if(random.nextDouble() < 0.08) { + if (random.nextDouble() < 0.08) { Bukkit.getScheduler().runTask(AnimalRP.getPlugin(AnimalRP.class), () -> { - event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), animal.moodSounds.get(Mood.HAPPY), 10F, 1); + event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), + animal.moodSounds.get(Mood.HAPPY), 10F, 1); }); - } - } + } + } } String format = "%prefix%teamColor%animalColor%name%suffix: %message"; String message = format; - if(AnimalRP.vaultChat != null) { + if (AnimalRP.vaultChat != null) { message = message.replaceAll("%prefix", AnimalRP.vaultChat.getPlayerPrefix(event.getPlayer())); message = message.replaceAll("%suffix", AnimalRP.vaultChat.getPlayerSuffix(event.getPlayer())); } else { @@ -66,9 +79,11 @@ public class PlayerChat implements Listener { message = message.replaceAll("%teamColor", team == null ? "" : "<" + team.color().asHexString() + ">"); message = message.replaceAll("%animalColor", (animal != null && !chatModOff) ? "<" + animal.color + ">" : ""); message = message.replaceAll("%name", event.getPlayer().getName()); - message = message.replaceAll("%message", (animal != null && !chatModOff) ? animal.chatTransformations(AnimalRP.mm.serialize(event.message())) : AnimalRP.mm.serialize(event.message())); + String messageDefault = message.replaceAll("%message", AnimalRP.mm.serialize(event.message())); + message = message.replaceAll("%message", + (animal != null && !chatModOff) ? animal.chatTransformations(AnimalRP.mm.serialize(event.message())) + : AnimalRP.mm.serialize(event.message())); - event.renderer(new CustomChatRenderer(message)); + event.renderer(new CustomChatRenderer(message, messageDefault)); } } - diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index fcda8d0..83efeb5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -17,6 +17,10 @@ commands: usage: Disable the chat modification done by animals! chatmodon: usage: Enable the chat modification done by animals! + chatmodclientoff: + usage: Disable all viewing of chat modifications + chatmodclienton: + usage: View all chat modifications of animals clearcooldown: usage: Clears the specified user's cooldown. purr: