Skip to content

Commit c22c358

Browse files
committed
Add shadow muting
1 parent 4d5d08b commit c22c358

File tree

12 files changed

+140
-15
lines changed

12 files changed

+140
-15
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ A simple plugin that allows freezing and unfreezing players.
1313
- Prevents this user from being frozen
1414
- spf.reload:
1515
- Allows this user to reload the configuration
16+
- spf.chatspy
17+
- Allows this user to see the chat of frozen players, if chat behavior is set to 2
1618

1719
### Commands:
1820
- /freeze <player>
@@ -21,6 +23,8 @@ A simple plugin that allows freezing and unfreezing players.
2123
- unfreezes a frozen player
2224
- /spfreload
2325
- Reloads the configuration
26+
- /fspy
27+
- Toggles visibility of the chat of frozen players, if chat behavior is set to 2
2428

2529
### Default configuration
2630

@@ -37,10 +41,14 @@ freeze-dismount: true
3741
freeze-flight: false
3842
# Should the user be invulnerable while they're frozen? (prevents issues like drowning if frozen while underwater)
3943
freeze-invulnerability: true
44+
# Chat behavior
45+
# 0 = Chat as normal, no change
46+
# 1 = Shadow mute, they don't see a change in their chat, however only staff can see their messages
47+
# 2 = Full mute. They cannot send messages and get an error when they attempt to
48+
chat-behavior: 2
4049
# Which things should be prevented when someone is frozen?
4150
prevent-movement: true
4251
prevent-interact: true
43-
prevent-chat: true
4452
prevent-xp-pickup: true
4553
prevent-item-pickup: true
4654
prevent-item-drop: true
@@ -65,6 +73,10 @@ cannot-use-command: "You are frozen and cannot use that command"
6573
login-message: "<red><bold>[NOTICE]</bold></red> <gray>You were frozen during a previous session. You cannot move, interact, or chat"
6674
login-notif: "<dark_gray><bold><name></bold></dark_gray> <gray>has logged in. They were frozen during a previous session."
6775
login-notif-now-unfrozen: "<dark_gray><bold><name></bold></dark_gray> <gray>has logged in. They were frozen during a previous session. They will now be unfrozen."
76+
shadow-mute-format: "<dark_gray>[Frozen]</dark_gray> <gray><player>: <message></gray>"
77+
freeze-spy-enabled: "<green>Freeze Spy has been toggled <bold><yellow>On</yellow></bold>!</green>"
78+
freeze-spy-disabled: "<grey>Freeze Spy has been toggled <bold><red>Off</red></bold>!</grey>"
6879
cannot-be-frozen: "<red>That player cannot be frozen!</red>"
6980
not-frozen: "<red>That player is not frozen!</red>"
81+
only-player: "<red>Sorry! Only a player can run that command</red>"
7082
```

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>simplexity</groupId>
88
<artifactId>SimplePlayerFreeze</artifactId>
9-
<version>0.1.0</version>
9+
<version>0.2.0</version>
1010
<packaging>jar</packaging>
1111

1212
<name>SimplePlayerFreeze</name>

src/main/java/simplexity/simpleplayerfreeze/ConfigSettings.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.util.List;
77

88
public class ConfigSettings {
9-
109
public static String prefix = "";
1110
public static String commandErrorMessage = "";
1211
public static String cannotChat = "";
@@ -22,6 +21,10 @@ public class ConfigSettings {
2221
public static String loginNotif = "";
2322
public static String cannotBeFrozen = "";
2423
public static String notFrozen = "";
24+
public static String shadowMuteFormat = "";
25+
public static String freezeSpyEnabled = "";
26+
public static String freezeSpyDisabled = "";
27+
public static String onlyPlayer = "";
2528
public static boolean freezePersist;
2629
public static boolean freezeGlow;
2730
public static boolean freezeDismount;
@@ -30,20 +33,21 @@ public class ConfigSettings {
3033
public static boolean preventMovement;
3134
public static boolean preventInteract;
3235
public static boolean preventCrafting;
33-
public static boolean preventChat;
3436
public static boolean preventXPPickup;
3537
public static boolean preventItemPickup;
3638
public static boolean preventItemDrop;
3739
public static boolean preventItemUse;
3840
public static boolean preventHotbarSwitch;
3941
public static boolean preventInventoryInteraction;
4042
public static boolean preventCommands;
43+
public static int chatBehavior;
4144
public static ArrayList<String> whitelistedCommandList = new ArrayList<>();
4245

4346
public static void reloadConfigSettings(){
4447
reloadConfigBooleans();
4548
reloadMessages();
4649
reloadConfigCommands();
50+
reloadConfigIntegers();
4751
}
4852
private static void reloadMessages() {
4953
FileConfiguration config = SimplePlayerFreeze.simplePlayerFreeze.getConfig();
@@ -62,7 +66,10 @@ private static void reloadMessages() {
6266
loginNotif = config.getString("login-notif");
6367
cannotBeFrozen = config.getString("cannot-be-frozen");
6468
notFrozen = config.getString("not-frozen");
65-
preventCommands = config.getBoolean("prevent-commands");
69+
shadowMuteFormat = config.getString("shadow-mute-format");
70+
freezeSpyEnabled = config.getString("freeze-spy-enabled");
71+
freezeSpyDisabled = config.getString("freeze-spy-disabled");
72+
onlyPlayer = config.getString("only-player");
6673
}
6774

6875
private static void reloadConfigBooleans() {
@@ -75,12 +82,12 @@ private static void reloadConfigBooleans() {
7582
preventMovement = config.getBoolean("prevent-movement");
7683
preventInteract = config.getBoolean("prevent-interact");
7784
preventCrafting = config.getBoolean("prevent-crafting");
78-
preventChat = config.getBoolean("prevent-chat");
7985
preventXPPickup = config.getBoolean("prevent-xp-pickup");
8086
preventItemPickup = config.getBoolean("prevent-item-pickup");
8187
preventItemDrop = config.getBoolean("prevent-item-drop");
8288
preventItemUse = config.getBoolean("prevent-item-use");
8389
preventHotbarSwitch = config.getBoolean("prevent-hotbar-switch");
90+
preventCommands = config.getBoolean("prevent-commands");
8491
preventInventoryInteraction = config.getBoolean("prevent-inventory-interaction");
8592
}
8693

@@ -90,4 +97,13 @@ private static void reloadConfigCommands() {
9097
List<String> commandList = config.getStringList("whitelisted-commands");
9198
whitelistedCommandList.addAll(commandList);
9299
}
100+
101+
private static void reloadConfigIntegers() {
102+
FileConfiguration config = SimplePlayerFreeze.simplePlayerFreeze.getConfig();
103+
chatBehavior = config.getInt("chat-behavior");
104+
if (!( 0 <= chatBehavior && chatBehavior <= 2)) {
105+
SimplePlayerFreeze.simplePlayerFreeze.getLogger().warning("Chat behavior value is invalid. Defaulting to 0.");
106+
chatBehavior = 2;
107+
}
108+
}
93109
}

src/main/java/simplexity/simpleplayerfreeze/SimplePlayerFreeze.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package simplexity.simpleplayerfreeze;
22

3+
import org.bukkit.Server;
34
import org.bukkit.plugin.Plugin;
45
import org.bukkit.plugin.java.JavaPlugin;
56
import simplexity.simpleplayerfreeze.commands.FreezePlayer;
7+
import simplexity.simpleplayerfreeze.commands.FreezeSpy;
68
import simplexity.simpleplayerfreeze.commands.ReloadConfig;
79
import simplexity.simpleplayerfreeze.commands.UnfreezePlayer;
810
import simplexity.simpleplayerfreeze.listeners.*;
@@ -11,14 +13,17 @@
1113

1214
public final class SimplePlayerFreeze extends JavaPlugin {
1315
public static Plugin simplePlayerFreeze;
16+
public static Server server;
1417

1518
@Override
1619
public void onEnable() {
1720
simplePlayerFreeze = this;
21+
server = getServer();
1822
//Register the commands for the plugin, this is supposedly the best way to do commands now
1923
getServer().getCommandMap().register(Util.namespace, new FreezePlayer("freeze", "Freezes a player in place and prevents them from using normal things", "/freeze <player>", List.of("cease")));
2024
getServer().getCommandMap().register(Util.namespace, new UnfreezePlayer("unfreeze", "Unfreezes a player and allows them to use normal things", "/unfreeze <player>", List.of("resume")));
2125
getServer().getCommandMap().register(Util.namespace, new ReloadConfig("freezereload", " reloads the config", "/freezereload", List.of("simpleplayerfreezereload", "spfreload")));
26+
getServer().getCommandMap().register(Util.namespace, new FreezeSpy("freezespy", "Toggles the visibility of frozen players' messages", "/freezespy", List.of("fspy", "spfspy")));
2227
registerListeners();
2328
this.saveDefaultConfig();
2429
this.reloadConfig();

src/main/java/simplexity/simpleplayerfreeze/Util.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ public class Util {
1212
public static String namespace = "simpleplayerfreeze";
1313
public static NamespacedKey isFrozenKey = new NamespacedKey(namespace, "isfrozen");
1414
public static NamespacedKey previouslyHadFlyPerms = new NamespacedKey(namespace, "previousflyperms");
15+
public static NamespacedKey freezeSpyDisabled = new NamespacedKey(namespace, "freezespy");
1516
public static Permission freezePermission = new Permission("spf.freeze");
1617
public static Permission unfreezePermission = new Permission("spf.unfreeze");
1718
public static Permission freezeBypassPermission = new Permission("spf.bypass");
1819
public static Permission freezeNotify = new Permission("spf.notify");
20+
public static Permission freezeChatSpy = new Permission("spf.chatspy");
1921
public static Permission reloadPermission = new Permission("spf.reload");
2022

2123

src/main/java/simplexity/simpleplayerfreeze/commands/FreezePlayer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String s, @NotNul
3737
} else if (player.hasPermission(Util.freezeBypassPermission)) {
3838
sender.sendRichMessage(ConfigSettings.prefix + ConfigSettings.cannotBeFrozen);
3939
return false;
40-
4140
} else if (Util.isFrozen(player) && sender.hasPermission(Util.unfreezePermission)) {
4241
FreezeFunctionality.setUnfrozen(player);
4342
sender.sendMessage(Util.miniMessage.deserialize((ConfigSettings.prefix + ConfigSettings.unfreezeMessage),
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package simplexity.simpleplayerfreeze.commands;
2+
3+
import org.bukkit.command.Command;
4+
import org.bukkit.command.CommandSender;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.persistence.PersistentDataType;
7+
import org.jetbrains.annotations.NotNull;
8+
import simplexity.simpleplayerfreeze.ConfigSettings;
9+
import simplexity.simpleplayerfreeze.Util;
10+
import simplexity.simpleplayerfreeze.listeners.JoinListener;
11+
12+
import java.util.List;
13+
14+
public class FreezeSpy extends Command {
15+
16+
public FreezeSpy(@NotNull String name, @NotNull String description, @NotNull String usageMessage, @NotNull List<String> aliases) {
17+
super(name, description, usageMessage, aliases);
18+
}
19+
20+
@Override
21+
public boolean execute(@NotNull CommandSender sender, @NotNull String s, @NotNull String[] strings) {
22+
if (!sender.hasPermission(Util.freezeChatSpy)) {
23+
sender.sendRichMessage(ConfigSettings.noPermission);
24+
return false;
25+
}
26+
if (!(sender instanceof Player player)) {
27+
sender.sendRichMessage(ConfigSettings.onlyPlayer);
28+
return false;
29+
}
30+
toggleSpy(player);
31+
return true;
32+
}
33+
34+
private void toggleSpy(Player player) {
35+
if (!player.getPersistentDataContainer().getOrDefault(Util.freezeSpyDisabled, PersistentDataType.BOOLEAN, false)) {
36+
player.getPersistentDataContainer().set(Util.freezeSpyDisabled, PersistentDataType.BOOLEAN, true);
37+
player.sendRichMessage(ConfigSettings.prefix + ConfigSettings.freezeSpyDisabled);
38+
JoinListener.spyList.remove(player);
39+
} else {
40+
player.getPersistentDataContainer().set(Util.freezeSpyDisabled, PersistentDataType.BOOLEAN, false);
41+
player.sendRichMessage(ConfigSettings.prefix + ConfigSettings.freezeSpyEnabled);
42+
JoinListener.spyList.add(player);
43+
}
44+
}
45+
}
Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,45 @@
11
package simplexity.simpleplayerfreeze.listeners;
22

33
import io.papermc.paper.event.player.AsyncChatEvent;
4+
import net.kyori.adventure.text.Component;
5+
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
6+
import org.bukkit.entity.Player;
47
import org.bukkit.event.EventHandler;
58
import org.bukkit.event.Listener;
69
import simplexity.simpleplayerfreeze.ConfigSettings;
10+
import simplexity.simpleplayerfreeze.SimplePlayerFreeze;
711
import simplexity.simpleplayerfreeze.Util;
812

913
public class ChatListener implements Listener {
14+
1015
@EventHandler
1116
public void onChat(AsyncChatEvent chatEvent) {
12-
if (!ConfigSettings.preventChat) return;
13-
if (Util.isFrozen(chatEvent.getPlayer())) {
14-
chatEvent.setCancelled(true);
15-
chatEvent.getPlayer().sendRichMessage(ConfigSettings.cannotChat);
17+
if (!(ConfigSettings.chatBehavior == 1 || ConfigSettings.chatBehavior == 2)) return;
18+
switch (ConfigSettings.chatBehavior) {
19+
case 1:
20+
if (Util.isFrozen(chatEvent.getPlayer())) {
21+
chatEvent.setCancelled(true);
22+
chatEvent.getPlayer().sendRichMessage(ConfigSettings.cannotChat);
23+
}
24+
break;
25+
case 2:
26+
if (!Util.isFrozen(chatEvent.getPlayer())) return;
27+
Component message = chatEvent.message();
28+
chatEvent.viewers().clear();
29+
chatEvent.viewers().add(chatEvent.getPlayer());
30+
for (Player player : JoinListener.spyList) {
31+
player.sendMessage(Util.miniMessage.deserialize(
32+
ConfigSettings.shadowMuteFormat,
33+
Placeholder.component("player", chatEvent.getPlayer().displayName()),
34+
Placeholder.component("message", message)));
35+
}
36+
SimplePlayerFreeze.server.getConsoleSender().sendMessage(Util.miniMessage.deserialize(
37+
ConfigSettings.shadowMuteFormat,
38+
Placeholder.component("player", chatEvent.getPlayer().displayName()),
39+
Placeholder.component("message", message)));
40+
break;
1641
}
42+
1743
}
18-
44+
1945
}

src/main/java/simplexity/simpleplayerfreeze/listeners/JoinListener.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.bukkit.event.Listener;
77
import org.bukkit.event.player.PlayerJoinEvent;
88
import simplexity.simpleplayerfreeze.ConfigSettings;
9+
import simplexity.simpleplayerfreeze.SimplePlayerFreeze;
910
import simplexity.simpleplayerfreeze.Util;
1011
import simplexity.simpleplayerfreeze.freeze.FreezeFunctionality;
1112

@@ -14,19 +15,25 @@
1415
public class JoinListener implements Listener {
1516

1617
public static ArrayList<Player> notifyList = new ArrayList<>();
18+
public static ArrayList<Player> spyList = new ArrayList<>();
1719

1820
@EventHandler
1921
public void onJoin(PlayerJoinEvent joinEvent) {
2022
Player player = joinEvent.getPlayer();
2123
if (player.hasPermission(Util.freezeNotify)) {
2224
notifyList.add(player);
2325
}
26+
if (player.hasPermission(Util.freezeChatSpy)) {
27+
spyList.add(player);
28+
}
2429
if (Util.isFrozen(player) && ConfigSettings.freezePersist) {
2530
FreezeFunctionality.setFrozen(player);
2631
for (Player playerNotif : notifyList) {
2732
playerNotif.sendMessage(Util.miniMessage.deserialize(
2833
(ConfigSettings.prefix + ConfigSettings.loginNotif), Placeholder.component("name", player.displayName())));
2934
}
35+
SimplePlayerFreeze.server.getConsoleSender().sendMessage(Util.miniMessage.deserialize(
36+
(ConfigSettings.prefix + ConfigSettings.loginNotif), Placeholder.component("name", player.displayName())));
3037
} else if (Util.isFrozen(player)) {
3138
FreezeFunctionality.setUnfrozen(player);
3239
for (Player playerNotif : notifyList) {

src/main/java/simplexity/simpleplayerfreeze/listeners/LeaveListener.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class LeaveListener implements Listener {
99
@EventHandler
1010
public void onLeave(org.bukkit.event.player.PlayerQuitEvent event) {
1111
JoinListener.notifyList.remove(event.getPlayer());
12+
JoinListener.spyList.remove(event.getPlayer());
1213
}
1314

1415
}

0 commit comments

Comments
 (0)