Add support for edited clients; Properly support chat filtering; Fix issue #11; Make certain Mining messages filterable.

This commit is contained in:
Major-
2014-02-15 22:40:00 +00:00
parent 2ed1477d2c
commit 9d82797bd6
7 changed files with 99 additions and 11 deletions
+53 -2
View File
@@ -66,6 +66,12 @@ public final class Player extends Mob {
*/
private transient Deque<Point> clicks = new ArrayDeque<Point>();
/**
* 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.
*/
@@ -135,9 +135,7 @@ public final class LoginDecoder extends StatefulFrameDecoder<LoginDecoderState>
private void decodePayload(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> 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<LoginDecoderState>
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()) {
@@ -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.
*
+1 -1
View File
@@ -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 */);