mirror of
https://github.com/Rogiel/l2jserver2
synced 2025-12-06 07:32:46 +00:00
Cryptography method enhanced
Protocol version-aware packets support implemented Signed-off-by: Rogiel <rogiel@rogiel.com>
This commit is contained in:
@@ -6,5 +6,5 @@ public class L2JConstants {
|
||||
* <p>
|
||||
* This <b>MUST</b> be hard-coded!
|
||||
*/
|
||||
public static final int SUPPORTED_PROTOCOL = 216;
|
||||
public static final ProtocolVersion SUPPORTED_PROTOCOL = ProtocolVersion.FREYA;
|
||||
}
|
||||
|
||||
@@ -6,14 +6,29 @@ package com.l2jserver;
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public enum ProtocolVersion {
|
||||
RELEASE(0), //UNK ID
|
||||
FREYA(216);
|
||||
|
||||
public final ProtocolVersion parent;
|
||||
public final int version;
|
||||
|
||||
ProtocolVersion(int version) {
|
||||
this(version, null);
|
||||
}
|
||||
|
||||
ProtocolVersion(int version, ProtocolVersion parent) {
|
||||
this.version = version;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public boolean supports(ProtocolVersion version) {
|
||||
if(this == version)
|
||||
return true;
|
||||
if(this.parent == null)
|
||||
return false;
|
||||
return this.parent.supports(version);
|
||||
}
|
||||
|
||||
public static ProtocolVersion fromVersion(int version) {
|
||||
for (ProtocolVersion v : values()) {
|
||||
if (v.version == version)
|
||||
|
||||
@@ -3,8 +3,11 @@ package com.l2jserver.game.net;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelFuture;
|
||||
|
||||
import com.l2jserver.ProtocolVersion;
|
||||
import com.l2jserver.game.net.codec.Lineage2Decrypter;
|
||||
import com.l2jserver.game.net.codec.Lineage2Encrypter;
|
||||
import com.l2jserver.game.net.codec.Lineage2PacketReader;
|
||||
import com.l2jserver.game.net.codec.Lineage2PacketWriter;
|
||||
import com.l2jserver.game.net.packet.ServerPacket;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
|
||||
@@ -24,6 +27,8 @@ public class Lineage2Connection {
|
||||
CONNECTED, AUTHENTICATED, IN_GAME;
|
||||
}
|
||||
|
||||
private ProtocolVersion version;
|
||||
|
||||
public Lineage2Connection(Channel channel) {
|
||||
this.channel = channel;
|
||||
}
|
||||
@@ -67,6 +72,50 @@ public class Lineage2Connection {
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the state
|
||||
*/
|
||||
public ConnectionState getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param state
|
||||
* the state to set
|
||||
*/
|
||||
public void setState(ConnectionState state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the version
|
||||
*/
|
||||
public ProtocolVersion getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param version
|
||||
* the version to set
|
||||
*/
|
||||
public void setVersion(ProtocolVersion version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the client supports an given version of the protocol. Note that
|
||||
* if the protocol is not known false will always be returned.
|
||||
*
|
||||
* @param version
|
||||
* @return true if version is supported by the client
|
||||
* @see com.l2jserver.ProtocolVersion#supports(com.l2jserver.ProtocolVersion)
|
||||
*/
|
||||
public boolean supports(ProtocolVersion version) {
|
||||
if (version == null)
|
||||
return false;
|
||||
return version.supports(version);
|
||||
}
|
||||
|
||||
public Channel getChannel() {
|
||||
return channel;
|
||||
}
|
||||
@@ -100,4 +149,14 @@ public class Lineage2Connection {
|
||||
return (Lineage2Encrypter) channel.getPipeline().get(
|
||||
Lineage2Encrypter.HANDLER_NAME);
|
||||
}
|
||||
|
||||
public Lineage2PacketReader getPacketReader() {
|
||||
return (Lineage2PacketReader) channel.getPipeline().get(
|
||||
Lineage2PacketReader.HANDLER_NAME);
|
||||
}
|
||||
|
||||
public Lineage2PacketWriter getPacketWriter() {
|
||||
return (Lineage2PacketWriter) channel.getPipeline().get(
|
||||
Lineage2PacketWriter.HANDLER_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.l2jserver.game.net;
|
||||
|
||||
import com.l2jserver.util.BlowFishKeygen;
|
||||
|
||||
public class Lineage2CryptographyKey implements Cloneable {
|
||||
public final byte[] key;
|
||||
|
||||
public Lineage2CryptographyKey(byte[] key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public static Lineage2CryptographyKey createRandomKey() {
|
||||
return new Lineage2CryptographyKey(BlowFishKeygen.getRandomKey());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the key
|
||||
*/
|
||||
public byte[] getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
public byte get(int i) {
|
||||
return key[i & 15];
|
||||
}
|
||||
|
||||
public void update(int size) {
|
||||
int old = key[8] & 0xff;
|
||||
old |= key[9] << 8 & 0xff00;
|
||||
old |= key[10] << 0x10 & 0xff0000;
|
||||
old |= key[11] << 0x18 & 0xff000000;
|
||||
|
||||
old += size;
|
||||
|
||||
key[8] = (byte) (old & 0xff);
|
||||
key[9] = (byte) (old >> 0x08 & 0xff);
|
||||
key[10] = (byte) (old >> 0x10 & 0xff);
|
||||
key[11] = (byte) (old >> 0x18 & 0xff);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Lineage2CryptographyKey clone() {
|
||||
try {
|
||||
return (Lineage2CryptographyKey) super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,8 +40,10 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory {
|
||||
pipeline.addLast("logger-hex", new LoggingHandler(
|
||||
InternalLogLevel.DEBUG, true));
|
||||
|
||||
pipeline.addLast("packet.writer", new Lineage2PacketWriter());
|
||||
pipeline.addLast("packet.reader", new Lineage2PacketReader(injector));
|
||||
pipeline.addLast(Lineage2PacketWriter.HANDLER_NAME,
|
||||
new Lineage2PacketWriter());
|
||||
pipeline.addLast(Lineage2PacketReader.HANDLER_NAME,
|
||||
new Lineage2PacketReader(injector));
|
||||
|
||||
pipeline.addLast("logger", new LoggingHandler(InternalLogLevel.DEBUG,
|
||||
true));
|
||||
|
||||
@@ -1,23 +1,21 @@
|
||||
package com.l2jserver.game.net.codec;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneDecoder;
|
||||
|
||||
import com.l2jserver.util.BlowFishKeygen;
|
||||
import com.l2jserver.game.net.Lineage2CryptographyKey;
|
||||
|
||||
public class Lineage2Decrypter extends OneToOneDecoder {
|
||||
public static final String HANDLER_NAME = "crypto.decoder";
|
||||
|
||||
private boolean enabled = false;
|
||||
private final byte[] key = new byte[16];
|
||||
private Lineage2CryptographyKey key;
|
||||
|
||||
@Override
|
||||
protected synchronized Object decode(ChannelHandlerContext ctx,
|
||||
Channel channel, Object msg) throws Exception {
|
||||
protected Object decode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
if (!(msg instanceof ChannelBuffer))
|
||||
return msg;
|
||||
if (!enabled)
|
||||
@@ -27,48 +25,29 @@ public class Lineage2Decrypter extends OneToOneDecoder {
|
||||
final int offset = buffer.readerIndex();
|
||||
final int size = buffer.readableBytes();
|
||||
int temp = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
int temp2 = buffer.getByte(offset + i) & 0xFF;
|
||||
buffer.setByte(offset + i, (temp2 ^ key[i & 15] ^ temp));
|
||||
temp = temp2;
|
||||
synchronized (key) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
int temp2 = buffer.getByte(offset + i) & 0xFF;
|
||||
buffer.setByte(offset + i, (temp2 ^ key.get(i) ^ temp));
|
||||
temp = temp2;
|
||||
}
|
||||
key.update(size);
|
||||
}
|
||||
|
||||
// int old = _inKey[8] &0xff;
|
||||
// old |= _inKey[9] << 8 &0xff00;
|
||||
// old |= _inKey[10] << 0x10 &0xff0000;
|
||||
// old |= _inKey[11] << 0x18 &0xff000000;
|
||||
//
|
||||
// old += size;
|
||||
//
|
||||
// _inKey[8] = (byte)(old &0xff);
|
||||
// _inKey[9] = (byte)(old >> 0x08 &0xff);
|
||||
// _inKey[10] = (byte)(old >> 0x10 &0xff);
|
||||
// _inKey[11] = (byte)(old >> 0x18 &0xff);
|
||||
|
||||
int old = key[8] & 0xff;
|
||||
old |= key[9] << 8 & 0xff00;
|
||||
old |= key[10] << 0x10 & 0xff0000;
|
||||
old |= key[11] << 0x18 & 0xff000000;
|
||||
|
||||
old += size;
|
||||
|
||||
key[8] = (byte) (old & 0xff);
|
||||
key[9] = (byte) (old >> 0x08 & 0xff);
|
||||
key[10] = (byte) (old >> 0x10 & 0xff);
|
||||
key[11] = (byte) (old >> 0x18 & 0xff);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public byte[] enable() {
|
||||
byte[] key = BlowFishKeygen.getRandomKey();
|
||||
public Lineage2CryptographyKey enable() {
|
||||
Lineage2CryptographyKey key = Lineage2CryptographyKey.createRandomKey();
|
||||
this.setKey(key);
|
||||
this.setEnabled(true);
|
||||
return key;
|
||||
}
|
||||
|
||||
public void setKey(byte[] key) {
|
||||
System.arraycopy(key, 0, this.key, 0, key.length);
|
||||
public void setKey(Lineage2CryptographyKey key) {
|
||||
if (this.key != null)
|
||||
throw new IllegalStateException("Key is already set");
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
package com.l2jserver.game.net.codec;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2CryptographyKey;
|
||||
|
||||
public class Lineage2Encrypter extends OneToOneEncoder {
|
||||
public static final String HANDLER_NAME = "crypto.encoder";
|
||||
|
||||
private boolean enabled = false;
|
||||
private final byte[] key = new byte[16];
|
||||
private Lineage2CryptographyKey key;
|
||||
|
||||
@Override
|
||||
protected synchronized Object encode(ChannelHandlerContext ctx,
|
||||
Channel channel, Object msg) throws Exception {
|
||||
protected Object encode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
if (!(msg instanceof ChannelBuffer))
|
||||
return msg;
|
||||
if (!enabled)
|
||||
@@ -25,34 +25,27 @@ public class Lineage2Encrypter extends OneToOneEncoder {
|
||||
final int offset = buffer.readerIndex() + 2; // skip header
|
||||
final int size = buffer.readableBytes() - 2;
|
||||
int temp = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
int temp2 = buffer.getByte(offset + i) & 0xFF;
|
||||
buffer.setByte(offset + i, (byte) (temp2 ^ key[i & 15] ^ temp));
|
||||
temp = temp2;
|
||||
synchronized (key) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
int temp2 = buffer.getByte(offset + i) & 0xFF;
|
||||
buffer.setByte(offset + i, (byte) (temp2 ^ key.get(i) ^ temp));
|
||||
temp = temp2;
|
||||
}
|
||||
key.update(size);
|
||||
}
|
||||
|
||||
int old = key[8] & 0xff;
|
||||
old |= key[9] << 8 & 0xff00;
|
||||
old |= key[10] << 0x10 & 0xff0000;
|
||||
old |= key[11] << 0x18 & 0xff000000;
|
||||
|
||||
old += size;
|
||||
|
||||
key[8] = (byte) (old & 0xff);
|
||||
key[9] = (byte) (old >> 0x08 & 0xff);
|
||||
key[10] = (byte) (old >> 0x10 & 0xff);
|
||||
key[11] = (byte) (old >> 0x18 & 0xff);
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
public void enable(byte[] key) {
|
||||
public void enable(Lineage2CryptographyKey key) {
|
||||
this.setKey(key);
|
||||
this.setEnabled(true);
|
||||
}
|
||||
|
||||
public void setKey(byte[] key) {
|
||||
System.arraycopy(key, 0, this.key, 0, key.length);
|
||||
public void setKey(Lineage2CryptographyKey key) {
|
||||
if (this.key != null)
|
||||
throw new IllegalStateException("Key is already set");
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Injector;
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.ClientPacket;
|
||||
import com.l2jserver.game.net.packet.client.AuthLoginPacket;
|
||||
import com.l2jserver.game.net.packet.client.CharacterCreatePacket;
|
||||
@@ -21,10 +22,14 @@ import com.l2jserver.game.net.packet.client.RequestKeyMapping;
|
||||
import com.l2jserver.game.net.packet.client.RequestManorList;
|
||||
|
||||
public class Lineage2PacketReader extends OneToOneDecoder {
|
||||
public static final String HANDLER_NAME = "packet.reader";
|
||||
|
||||
private final Injector injector;
|
||||
private final Logger logger = LoggerFactory
|
||||
.getLogger(Lineage2PacketReader.class);
|
||||
|
||||
private Lineage2Connection connection;
|
||||
|
||||
@Inject
|
||||
public Lineage2PacketReader(Injector injector) {
|
||||
this.injector = injector;
|
||||
@@ -39,7 +44,7 @@ public class Lineage2PacketReader extends OneToOneDecoder {
|
||||
final ClientPacket packet = createPacket(getPacketClass(buffer));
|
||||
if (packet == null)
|
||||
return null;
|
||||
packet.read(buffer);
|
||||
packet.read(connection, buffer);
|
||||
return packet;
|
||||
}
|
||||
|
||||
@@ -85,4 +90,19 @@ public class Lineage2PacketReader extends OneToOneDecoder {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the connection
|
||||
*/
|
||||
public Lineage2Connection getConnection() {
|
||||
return connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param connection
|
||||
* the connection to set
|
||||
*/
|
||||
public void setConnection(Lineage2Connection connection) {
|
||||
this.connection = connection;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,12 +10,17 @@ import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.ServerPacket;
|
||||
|
||||
public class Lineage2PacketWriter extends OneToOneEncoder {
|
||||
public static final String HANDLER_NAME = "packet.writer";
|
||||
|
||||
private static final Logger log = LoggerFactory
|
||||
.getLogger(Lineage2PacketWriter.class);
|
||||
|
||||
private Lineage2Connection connection;
|
||||
|
||||
@Override
|
||||
protected Object encode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
@@ -26,10 +31,25 @@ public class Lineage2PacketWriter extends OneToOneEncoder {
|
||||
final ServerPacket packet = (ServerPacket) msg;
|
||||
buffer.writeShort(0x0000);
|
||||
buffer.writeByte(packet.getOpcode()); // packet opcode
|
||||
packet.write(buffer);
|
||||
packet.write(null, buffer);
|
||||
|
||||
log.debug("Writing message {}", ChannelBuffers.hexDump(buffer));
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the connection
|
||||
*/
|
||||
public Lineage2Connection getConnection() {
|
||||
return connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param connection
|
||||
* the connection to set
|
||||
*/
|
||||
public void setConnection(Lineage2Connection connection) {
|
||||
this.connection = connection;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,7 @@ public class Lineage2PacketHandler extends SimpleChannelHandler {
|
||||
public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e)
|
||||
throws Exception {
|
||||
connection = new Lineage2Connection(e.getChannel());
|
||||
|
||||
System.out.println(e);
|
||||
connection.getPacketWriter().setConnection(connection);
|
||||
|
||||
super.channelOpen(ctx, e);
|
||||
}
|
||||
|
||||
@@ -7,14 +7,19 @@ import com.l2jserver.game.net.Lineage2Connection;
|
||||
public interface ClientPacket extends Packet {
|
||||
/**
|
||||
* Read binary data in the {@link ChannelBuffer}.
|
||||
* <p>
|
||||
* Please do not write packets from this method. If you need to close the
|
||||
* connection or write packets do it in {@link #process(Lineage2Connection)}.
|
||||
*
|
||||
* @param conn
|
||||
* the active connection
|
||||
* @param buffer
|
||||
* the buffer
|
||||
*/
|
||||
void read(ChannelBuffer buffer);
|
||||
void read(Lineage2Connection conn, ChannelBuffer buffer);
|
||||
|
||||
/**
|
||||
* Process the packet
|
||||
* Process the packet. Executes all needed operations.
|
||||
*
|
||||
* @param conn
|
||||
* The active Lineage2Connection
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.l2jserver.game.net.packet;
|
||||
|
||||
public class PacketManager {
|
||||
|
||||
}
|
||||
@@ -2,8 +2,26 @@ package com.l2jserver.game.net.packet;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
public interface ServerPacket extends Packet {
|
||||
void write(ChannelBuffer buffer);
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
|
||||
public interface ServerPacket extends Packet {
|
||||
/**
|
||||
* Writes this packet binary data.
|
||||
* <p>
|
||||
* Please do not write packets from this method! This is only used to test
|
||||
* compatibility of protocols.
|
||||
*
|
||||
* @param conn
|
||||
* the connection
|
||||
* @param buffer
|
||||
* the buffer
|
||||
*/
|
||||
void write(Lineage2Connection conn, ChannelBuffer buffer);
|
||||
|
||||
/**
|
||||
* Get the opcode id of this packet
|
||||
*
|
||||
* @return the opcode id
|
||||
*/
|
||||
int getOpcode();
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ public class AuthLoginPacket extends AbstractClientPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
this.loginName = BufferUtils.readString(buffer).toLowerCase();
|
||||
this.playKey1 = buffer.readInt();
|
||||
this.playKey2 = buffer.readInt();
|
||||
|
||||
@@ -70,7 +70,7 @@ public class CharacterCreatePacket extends AbstractClientPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
name = BufferUtils.readString(buffer);
|
||||
race = Race.fromOption(buffer.readInt());
|
||||
sex = Sex.fromOption(buffer.readInt());
|
||||
|
||||
@@ -16,7 +16,7 @@ public class EnterWorld extends AbstractClientPacket {
|
||||
public static final int OPCODE = 0x11;
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
buffer.readBytes(new byte[32]); // Unknown Byte Array
|
||||
buffer.readInt(); // Unknown Value
|
||||
buffer.readInt(); // Unknown Value
|
||||
|
||||
@@ -23,7 +23,7 @@ public class LogoutPacket extends AbstractClientPacket {
|
||||
.getLogger(LogoutPacket.class);
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -7,7 +7,9 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.l2jserver.L2JConstants;
|
||||
import com.l2jserver.ProtocolVersion;
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.Lineage2CryptographyKey;
|
||||
import com.l2jserver.game.net.packet.AbstractClientPacket;
|
||||
import com.l2jserver.game.net.packet.server.KeyPacket;
|
||||
|
||||
@@ -29,25 +31,28 @@ public class ProtocolVersionPacket extends AbstractClientPacket {
|
||||
.getLogger(ProtocolVersionPacket.class);
|
||||
|
||||
// packet
|
||||
private long version;
|
||||
private ProtocolVersion version;
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
this.version = buffer.readUnsignedInt();
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
this.version = ProtocolVersion.fromVersion((int) buffer
|
||||
.readUnsignedInt());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Connection conn) {
|
||||
// generate a new key
|
||||
final byte[] key = conn.getDecrypter().enable();
|
||||
final Lineage2CryptographyKey inKey = conn.getDecrypter().enable();
|
||||
final Lineage2CryptographyKey outKey = inKey.clone();
|
||||
log.debug("Decrypter has been enabled");
|
||||
|
||||
log.debug("Client protocol version: {}", version);
|
||||
conn.setVersion(version);
|
||||
if (L2JConstants.SUPPORTED_PROTOCOL != version) {
|
||||
log.info("Incorrect protocol version: {0}. Only {1} is supported.",
|
||||
version, L2JConstants.SUPPORTED_PROTOCOL);
|
||||
// notify wrong protocol and close connection
|
||||
conn.write(new KeyPacket(key, false)).addListener(
|
||||
conn.write(new KeyPacket(inKey, false)).addListener(
|
||||
new ChannelFutureListener() {
|
||||
@Override
|
||||
public void operationComplete(ChannelFuture future)
|
||||
@@ -59,20 +64,20 @@ public class ProtocolVersionPacket extends AbstractClientPacket {
|
||||
return;
|
||||
}
|
||||
// activate encrypter once packet has been sent.
|
||||
conn.write(new KeyPacket(key, true)).addListener(
|
||||
conn.write(new KeyPacket(inKey, true)).addListener(
|
||||
new ChannelFutureListener() {
|
||||
@Override
|
||||
public void operationComplete(ChannelFuture future)
|
||||
throws Exception {
|
||||
log.debug("Encrypter has been enabled");
|
||||
// enable encrypter
|
||||
conn.getEncrypter().setKey(key);
|
||||
conn.getEncrypter().setKey(outKey);
|
||||
conn.getEncrypter().setEnabled(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public long getVersion() {
|
||||
public ProtocolVersion getVersion() {
|
||||
return version;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class RequestCharacterTemplatesPacket extends AbstractClientPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -29,7 +29,7 @@ public class RequestGotoLobby extends AbstractClientPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,7 +16,7 @@ public class RequestKeyMapping extends AbstractClientPacket {
|
||||
public static final int OPCODE2 = 0x21;
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -25,7 +25,7 @@ public class RequestManorList extends AbstractClientPacket {
|
||||
.getLogger(RequestManorList.class);
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
@@ -68,7 +69,7 @@ public class CharacterCreateFailPacket extends AbstractServerPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(reason.id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
@@ -19,7 +20,7 @@ public class CharacterCreateOkPacket extends AbstractServerPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(0x01);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.model.world.actor.ActorExperience;
|
||||
@@ -25,7 +26,7 @@ public class CharacterEnterWorldPacket extends AbstractServerPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
BufferUtils.writeString(buffer, character.getName());
|
||||
buffer.writeInt(character.getID().getID());
|
||||
BufferUtils.writeString(buffer, "Hello world!");
|
||||
|
||||
@@ -2,6 +2,8 @@ package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.ProtocolVersion;
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.Lineage2Session;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
@@ -37,7 +39,7 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
// buffer.writeByte(0x09);
|
||||
buffer.writeInt(characters.length);
|
||||
|
||||
@@ -148,23 +150,20 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
|
||||
buffer.writeInt(0x00); // augmentation id
|
||||
|
||||
// buffer.writeInt(charInfoPackage.getTransformId()); // Used to
|
||||
// display Transformations
|
||||
buffer.writeInt(0x00); // Currently on retail when you are on
|
||||
// character select you don't see your transformation.
|
||||
// Currently on retail when you are on character select you don't
|
||||
// see your transformation.
|
||||
buffer.writeInt(0x00);
|
||||
|
||||
// Freya by Vistall:
|
||||
buffer.writeInt(16024); // npdid - 16024 Tame Tiny Baby Kookaburra
|
||||
// // A9E89C
|
||||
buffer.writeInt(0); // level
|
||||
buffer.writeInt(0); // ?
|
||||
buffer.writeInt(0); // food? - 1200
|
||||
buffer.writeDouble(0); // max Hp
|
||||
buffer.writeDouble(0); // cur Hp
|
||||
|
||||
// buffer.writeInt(0x00);
|
||||
|
||||
// i++;
|
||||
if (conn.supports(ProtocolVersion.FREYA)) {
|
||||
// npdid - 16024 Tame Tiny Baby Kookaburra
|
||||
buffer.writeInt(16024); // A9E89C
|
||||
buffer.writeInt(0); // level
|
||||
buffer.writeInt(0); // ?
|
||||
buffer.writeInt(0); // food? - 1200
|
||||
buffer.writeDouble(0); // max Hp
|
||||
buffer.writeDouble(0); // cur Hp
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.model.template.CharacterTemplate;
|
||||
|
||||
@@ -21,7 +22,7 @@ public class CharacterTemplatePacket extends AbstractServerPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(templates.length);
|
||||
for (final CharacterTemplate template : templates) {
|
||||
buffer.writeInt(template.getRace().option);
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.model.world.character.CharacterInventory;
|
||||
|
||||
@@ -25,7 +26,7 @@ public class InventoryPacket extends AbstractServerPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
buffer.writeByte((showWindow ? 0x01 : 0x00));
|
||||
buffer.writeInt(0x00); // item count
|
||||
// for (Item item : inventory) {
|
||||
|
||||
@@ -4,6 +4,8 @@ import java.util.Arrays;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.Lineage2CryptographyKey;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
@@ -27,9 +29,9 @@ public class KeyPacket extends AbstractServerPacket {
|
||||
*/
|
||||
private boolean status;
|
||||
|
||||
public KeyPacket(byte[] key, boolean status) {
|
||||
public KeyPacket(Lineage2CryptographyKey key, boolean status) {
|
||||
super(OPCODE);
|
||||
this.key = Arrays.copyOfRange(key, 0, 8);
|
||||
this.key = Arrays.copyOfRange(key.key, 0, 8);
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
@@ -40,7 +42,7 @@ public class KeyPacket extends AbstractServerPacket {
|
||||
* the key
|
||||
* @return the new instance
|
||||
*/
|
||||
public static KeyPacket valid(byte[] key) {
|
||||
public static KeyPacket valid(Lineage2CryptographyKey key) {
|
||||
return new KeyPacket(key, true);
|
||||
}
|
||||
|
||||
@@ -51,12 +53,12 @@ public class KeyPacket extends AbstractServerPacket {
|
||||
* the key
|
||||
* @return the new instance
|
||||
*/
|
||||
public static KeyPacket invalid(byte[] key) {
|
||||
public static KeyPacket invalid(Lineage2CryptographyKey key) {
|
||||
return new KeyPacket(key, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
buffer.writeByte((status ? 0x01 : 0x00));
|
||||
for (int i = 0; i < 8; i++) {
|
||||
buffer.writeByte(key[i]);
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
@@ -24,7 +25,7 @@ public class ManorListPacket extends AbstractServerPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
buffer.writeShort(0x22);
|
||||
buffer.writeInt(manors.length);
|
||||
int i = 1;
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
@@ -24,7 +25,7 @@ public class UserInformationPacket extends AbstractServerPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
buffer.writeShort(0x22);
|
||||
buffer.writeInt(manors.length);
|
||||
int i = 1;
|
||||
|
||||
Reference in New Issue
Block a user