diff --git a/data/plugins/message-filter/filter.rb b/data/plugins/message-filter/filter.rb
new file mode 100644
index 00000000..e405f803
--- /dev/null
+++ b/data/plugins/message-filter/filter.rb
@@ -0,0 +1,9 @@
+require 'java'
+
+java_import 'org.apollo.game.event.impl.ForwardPrivateMessageEvent'
+java_import 'org.apollo.game.model.World'
+java_import 'org.apollo.game.model.settings.PrivacyState'
+
+on :command, :filter do |player, command|
+ player.send_message('Your message filter is now ' + (player.toggle_message_filter ? 'enabled.' : 'disabled.'))
+end
\ No newline at end of file
diff --git a/data/plugins/message-filter/plugin.xml b/data/plugins/message-filter/plugin.xml
new file mode 100644
index 00000000..d6f6a032
--- /dev/null
+++ b/data/plugins/message-filter/plugin.xml
@@ -0,0 +1,14 @@
+
+
+ message-filter
+ 1
+ Message Filter
+ Adds support for a server-side message filter, for clients that have not been edited.
+
+ Major
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/plugins/skill-mining/mining.rb b/data/plugins/skill-mining/mining.rb
index d8dac87d..33dfad25 100644
--- a/data/plugins/skill-mining/mining.rb
+++ b/data/plugins/skill-mining/mining.rb
@@ -38,7 +38,7 @@ class MiningAction < DistancedAction
# the ore
def start_mine(pickaxe)
@started = true
- mob.send_message "You swing your pick at the rock."
+ mob.send_message("You swing your pick at the rock.", true)
mob.turn_to @position
mob.play_animation pickaxe.animation
@counter = pickaxe.pulses
@@ -51,14 +51,14 @@ class MiningAction < DistancedAction
# verify the mob can mine with their pickaxe
if not (pickaxe != nil and level >= pickaxe.level)
- mob.send_message "You do not have a pickaxe for which you have the level to use."
+ mob.send_message('You do not have a pickaxe for which you have the level to use.')
stop
return
end
# verify the mob can mine the ore
if ore.level > level
- mob.send_message "You do not have the required level to mine this rock."
+ mob.send_message('You do not have the required level to mine this rock.')
stop
return
end
diff --git a/src/org/apollo/game/model/Player.java b/src/org/apollo/game/model/Player.java
index b018a9c4..2a235d57 100644
--- a/src/org/apollo/game/model/Player.java
+++ b/src/org/apollo/game/model/Player.java
@@ -66,6 +66,12 @@ public final class Player extends Mob {
*/
private transient Deque clicks = new ArrayDeque();
+ /**
+ * The version of the client this player is using. This is not the same as the release number, instead denoting the
+ * custom version.
+ */
+ private transient int clientVersion;
+
/**
* This player's credentials.
*/
@@ -181,6 +187,11 @@ public final class Player extends Mob {
*/
private transient int worldId = 1;
+ /**
+ * Indicates whether this player has the message filter enabled.
+ */
+ private boolean filteringMessages = false;
+
/**
* Creates the {@link Player}.
*
@@ -290,6 +301,15 @@ public final class Player extends Mob {
return clicks;
}
+ /**
+ * Gets the value denoting the clients modified version (0 if it is an unmodified jagex client).
+ *
+ * @return The version.
+ */
+ public int getClientVersion() {
+ return clientVersion;
+ }
+
/**
* Gets the player's credentials.
*
@@ -689,7 +709,7 @@ public final class Player extends Mob {
* @param message The message.
*/
public void sendMessage(String message) {
- send(new ServerMessageEvent(message));
+ sendMessage(message, false);
}
/**
@@ -698,7 +718,11 @@ public final class Player extends Mob {
* @param message The message.
*/
public void sendMessage(String message, boolean filterable) {
- send(new ServerMessageEvent(message, filterable));
+ if (clientVersion > 0) {
+ send(new ServerMessageEvent(message, filterable));
+ } else if (!filterable || !filteringMessages) {
+ send(new ServerMessageEvent(message));
+ }
}
/**
@@ -752,6 +776,15 @@ public final class Player extends Mob {
this.chatPrivacy = chatPrivacy;
}
+ /**
+ * Sets the value denoting the client's modified version.
+ *
+ * @param clientVersion The client version.
+ */
+ public void setClientVersion(int clientVersion) {
+ this.clientVersion = clientVersion;
+ }
+
/**
* Sets the design flag.
*
@@ -906,6 +939,24 @@ public final class Player extends Mob {
}
}
+ /**
+ * Toggles the message filter.
+ *
+ * @return The new value of the filter.
+ */
+ public boolean toggleMessageFilter() {
+ return filteringMessages = !filteringMessages;
+ }
+
+ /**
+ * Indicates whether the message filter is enabled.
+ *
+ * @return {@code true} if the filter is enabled, otherwise {@code false}.
+ */
+ public boolean messageFilterEnabled() {
+ return filteringMessages;
+ }
+
/**
* Toggles whether the player is running or not.
*/
diff --git a/src/org/apollo/net/codec/login/LoginDecoder.java b/src/org/apollo/net/codec/login/LoginDecoder.java
index 7a7cb129..71bc853b 100644
--- a/src/org/apollo/net/codec/login/LoginDecoder.java
+++ b/src/org/apollo/net/codec/login/LoginDecoder.java
@@ -135,9 +135,7 @@ public final class LoginDecoder extends StatefulFrameDecoder
private void decodePayload(ChannelHandlerContext ctx, ByteBuf buffer, List