From 9d82797bd63b3e87e49744d2261988bf0511e38b Mon Sep 17 00:00:00 2001 From: Major- Date: Sat, 15 Feb 2014 22:40:00 +0000 Subject: [PATCH] Add support for edited clients; Properly support chat filtering; Fix issue #11; Make certain Mining messages filterable. --- data/plugins/message-filter/filter.rb | 9 +++ data/plugins/message-filter/plugin.xml | 14 +++++ data/plugins/skill-mining/mining.rb | 6 +- src/org/apollo/game/model/Player.java | 55 ++++++++++++++++++- .../apollo/net/codec/login/LoginDecoder.java | 7 +-- .../apollo/net/codec/login/LoginRequest.java | 17 +++++- src/org/apollo/net/session/LoginSession.java | 2 +- 7 files changed, 99 insertions(+), 11 deletions(-) create mode 100644 data/plugins/message-filter/filter.rb create mode 100644 data/plugins/message-filter/plugin.xml 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 out) throws Exception { if (buffer.readableBytes() >= loginLength) { ByteBuf payload = buffer.readBytes(loginLength); - if (payload.readUnsignedByte() != 0xFF) { - throw new Exception("Invalid magic id."); - } + int clientVersion = 255 - payload.readUnsignedByte(); int releaseNumber = payload.readUnsignedShort(); @@ -195,13 +193,14 @@ public final class LoginDecoder extends StatefulFrameDecoder for (int i = 0; i < seed.length; i++) { seed[i] += 50; } + IsaacRandom encodingRandom = new IsaacRandom(seed); PlayerCredentials credentials = new PlayerCredentials(username, password, usernameHash, uid); IsaacRandomPair randomPair = new IsaacRandomPair(encodingRandom, decodingRandom); LoginRequest request = new LoginRequest(credentials, randomPair, reconnecting, lowMemory, releaseNumber, - archiveCrcs); + archiveCrcs, clientVersion); out.add(request); if (buffer.isReadable()) { diff --git a/src/org/apollo/net/codec/login/LoginRequest.java b/src/org/apollo/net/codec/login/LoginRequest.java index 98320f7c..d2585e2d 100644 --- a/src/org/apollo/net/codec/login/LoginRequest.java +++ b/src/org/apollo/net/codec/login/LoginRequest.java @@ -15,6 +15,11 @@ public final class LoginRequest { */ private final int[] archiveCrcs; + /** + * The version denoting whether the client has been modified or not. + */ + private final int clientVersion; + /** * The player's credentials. */ @@ -51,13 +56,14 @@ public final class LoginRequest { * @param archiveCrcs The archive CRCs. */ public LoginRequest(PlayerCredentials credentials, IsaacRandomPair randomPair, boolean lowMemory, - boolean reconnecting, int releaseNumber, int[] archiveCrcs) { + boolean reconnecting, int releaseNumber, int[] archiveCrcs, int clientVersion) { this.credentials = credentials; this.randomPair = randomPair; this.lowMemory = lowMemory; this.reconnecting = reconnecting; this.releaseNumber = releaseNumber; this.archiveCrcs = archiveCrcs; + this.clientVersion = clientVersion; } /** @@ -69,6 +75,15 @@ public final class LoginRequest { return archiveCrcs; } + /** + * Gets the value denoting the client's (modified) version. + * + * @return The client version. + */ + public int getClientVersion() { + return clientVersion; + } + /** * Gets the player's credentials. * diff --git a/src/org/apollo/net/session/LoginSession.java b/src/org/apollo/net/session/LoginSession.java index 92ae5733..b94e0876 100644 --- a/src/org/apollo/net/session/LoginSession.java +++ b/src/org/apollo/net/session/LoginSession.java @@ -90,7 +90,7 @@ public final class LoginSession extends Session { Player player = response.getPlayer(); int rights = player == null ? 0 : player.getPrivilegeLevel().toInteger(); boolean log = false; - + if (player != null) { GameSession session = new GameSession(channel, serverContext, player); player.setSession(session, false /* TODO */);