diff --git a/data/plugins/cmd/punishment/plugin.xml b/data/plugins/cmd/punishment/plugin.xml
new file mode 100644
index 00000000..a5c7a7e0
--- /dev/null
+++ b/data/plugins/cmd/punishment/plugin.xml
@@ -0,0 +1,14 @@
+
+
+ punishment
+ 1
+ Punishment commands
+ Adds various punishment commands, such as banning or muting a player.
+
+ lare96
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/plugins/cmd/punishment/punish.rb b/data/plugins/cmd/punishment/punish.rb
new file mode 100644
index 00000000..997222b4
--- /dev/null
+++ b/data/plugins/cmd/punishment/punish.rb
@@ -0,0 +1,53 @@
+require 'java'
+
+java_import 'org.apollo.game.model.World'
+java_import 'org.apollo.game.model.entity.Player'
+
+# Adds a command to mute a player. Admins cannot be muted.
+on :command, :mute, RIGHTS_MOD do |player, command|
+ name = command.arguments.to_a.join(' ')
+ on_player = $world.get_player(name)
+
+ if validate(player, on_player)
+ on_player.muted = true
+ on_player.send_message('You have just been muted.')
+ player.send_message("You have just muted #{on_player.get_username}.")
+ end
+end
+
+# Adds a command to unmute a player.
+on :command, :unmute, RIGHTS_MOD do |player, command|
+ name = command.arguments.to_a.join(' ')
+ on_player = $world.get_player(name)
+
+ if validate(player, on_player)
+ on_player.muted = false
+ on_player.send_message('You are no longer muted.')
+ player.send_message("You have just unmuted #{on_player.get_username}.")
+ end
+end
+
+# Adds a command to ban a player. Admins cannot be banned.
+on :command, :ban, RIGHTS_ADMIN do |player, command|
+ name = command.arguments.to_a.join(' ')
+ on_player = $world.get_player(name)
+
+ if validate(player, on_player)
+ on_player.banned = true
+ on_player.logout # TODO force logout
+ player.send_message("You have just banned #{on_player.get_username}.")
+ end
+end
+
+# Ensures the player isn't nil, and that they aren't an Administrator.
+def validate(player, on_player)
+ if on_player.nil?
+ player.send_message('That player does not exist.')
+ return false
+ elsif on_player.get_privilege_level == RIGHTS_ADMIN
+ player.send_message('You cannot perform this action on Administrators.')
+ return false
+ end
+
+ true
+end
diff --git a/game/src/main/org/apollo/game/io/player/BinaryPlayerSerializer.java b/game/src/main/org/apollo/game/io/player/BinaryPlayerSerializer.java
index 9d89bc84..ceadee44 100644
--- a/game/src/main/org/apollo/game/io/player/BinaryPlayerSerializer.java
+++ b/game/src/main/org/apollo/game/io/player/BinaryPlayerSerializer.java
@@ -162,6 +162,10 @@ public final class BinaryPlayerSerializer extends PlayerSerializer {
Map> attributes = readAttributes(in);
attributes.forEach(player::setAttribute);
+
+ if (player.isBanned()) {
+ return new PlayerLoaderResponse(LoginConstants.STATUS_ACCOUNT_DISABLED);
+ }
return new PlayerLoaderResponse(LoginConstants.STATUS_OK, player);
}
diff --git a/game/src/main/org/apollo/game/message/handler/ChatMessageHandler.java b/game/src/main/org/apollo/game/message/handler/ChatMessageHandler.java
index 5b34165c..a4098d2e 100644
--- a/game/src/main/org/apollo/game/message/handler/ChatMessageHandler.java
+++ b/game/src/main/org/apollo/game/message/handler/ChatMessageHandler.java
@@ -23,6 +23,10 @@ public final class ChatMessageHandler extends MessageHandler {
@Override
public void handle(Player player, ChatMessage message) {
+ if (player.isMuted()) {
+ message.terminate();
+ return;
+ }
player.getBlockSet().add(SynchronizationBlock.createChatBlock(player, message));
}
diff --git a/game/src/main/org/apollo/game/model/entity/Player.java b/game/src/main/org/apollo/game/model/entity/Player.java
index ddde02f0..86e8a549 100644
--- a/game/src/main/org/apollo/game/model/entity/Player.java
+++ b/game/src/main/org/apollo/game/model/entity/Player.java
@@ -19,7 +19,6 @@ import org.apollo.game.message.impl.UpdateRunEnergyMessage;
import org.apollo.game.model.Appearance;
import org.apollo.game.model.Position;
import org.apollo.game.model.World;
-import org.apollo.game.model.World.RegistrationStatus;
import org.apollo.game.model.entity.attr.Attribute;
import org.apollo.game.model.entity.attr.AttributeDefinition;
import org.apollo.game.model.entity.attr.AttributeMap;
@@ -65,9 +64,14 @@ import com.google.common.base.Preconditions;
public final class Player extends Mob {
static {
+ // TODO this should be a time rather than a flag
+ AttributeMap.define("muted", AttributeDefinition.forBoolean(false, AttributePersistence.PERSISTENT));
+
+ AttributeMap.define("banned", AttributeDefinition.forBoolean(false, AttributePersistence.PERSISTENT));
AttributeMap.define("run_energy", AttributeDefinition.forInt(100, AttributePersistence.PERSISTENT));
}
+
/**
* This player's bank.
*/
@@ -457,6 +461,22 @@ public final class Player extends Mob {
return energy.getValue();
}
+ /**
+ * Returns if this player is banned or not.
+ */
+ public boolean isBanned() {
+ Attribute banned = attributes.get("banned");
+ return banned.getValue();
+ }
+
+ /**
+ * Returns if this player is muted or not.
+ */
+ public boolean isMuted() {
+ Attribute muted = attributes.get("muted");
+ return muted.getValue();
+ }
+
/**
* Gets this player's {@link ScreenBrightness}.
*
@@ -719,6 +739,10 @@ public final class Player extends Mob {
send(new IdAssignmentMessage(index, members));
sendMessage("Welcome to RuneScape.");
+ if (isMuted()) {
+ sendMessage("You are currently muted. Other players will not see your chat messages.");
+ }
+
int[] tabs = InterfaceConstants.DEFAULT_INVENTORY_TABS;
for (int tab = 0; tab < tabs.length; tab++) {
send(new SwitchTabInterfaceMessage(tab, tabs[tab]));