diff --git a/src/main/java/com/l2jserver/L2JConstants.java b/src/main/java/com/l2jserver/L2JConstants.java index 5fafb5e71..6c6a25de7 100644 --- a/src/main/java/com/l2jserver/L2JConstants.java +++ b/src/main/java/com/l2jserver/L2JConstants.java @@ -6,5 +6,5 @@ public class L2JConstants { *

* This MUST be hard-coded! */ - public static final int SUPPORTED_PROTOCOL = 216; + public static final ProtocolVersion SUPPORTED_PROTOCOL = ProtocolVersion.FREYA; } diff --git a/src/main/java/com/l2jserver/ProtocolVersion.java b/src/main/java/com/l2jserver/ProtocolVersion.java index c0b19cab6..2c8156d9e 100644 --- a/src/main/java/com/l2jserver/ProtocolVersion.java +++ b/src/main/java/com/l2jserver/ProtocolVersion.java @@ -6,14 +6,29 @@ package com.l2jserver; * @author Rogiel */ 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) diff --git a/src/main/java/com/l2jserver/game/net/Lineage2Connection.java b/src/main/java/com/l2jserver/game/net/Lineage2Connection.java index 5967b2635..05d10fa21 100644 --- a/src/main/java/com/l2jserver/game/net/Lineage2Connection.java +++ b/src/main/java/com/l2jserver/game/net/Lineage2Connection.java @@ -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); + } } diff --git a/src/main/java/com/l2jserver/game/net/Lineage2CryptographyKey.java b/src/main/java/com/l2jserver/game/net/Lineage2CryptographyKey.java new file mode 100644 index 000000000..0e91e4d4e --- /dev/null +++ b/src/main/java/com/l2jserver/game/net/Lineage2CryptographyKey.java @@ -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; + } + } +} diff --git a/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java b/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java index 0456e7557..c3e8610b9 100644 --- a/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java +++ b/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java @@ -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)); diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2Decrypter.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2Decrypter.java index a4262d0da..6e0975240 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2Decrypter.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2Decrypter.java @@ -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() { diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2Encrypter.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2Encrypter.java index 5f1d43666..ac66c541d 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2Encrypter.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2Encrypter.java @@ -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() { diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java index 97ac03593..3484ade1c 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java @@ -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; + } } diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketWriter.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketWriter.java index b131676d4..7483909e7 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketWriter.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketWriter.java @@ -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; + } } diff --git a/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java b/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java index f9e0dbc73..69936de64 100644 --- a/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java +++ b/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java @@ -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); } diff --git a/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java b/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java index b1aeaef71..442b690b6 100644 --- a/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java @@ -7,14 +7,19 @@ import com.l2jserver.game.net.Lineage2Connection; public interface ClientPacket extends Packet { /** * Read binary data in the {@link ChannelBuffer}. + *

+ * 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 diff --git a/src/main/java/com/l2jserver/game/net/packet/PacketManager.java b/src/main/java/com/l2jserver/game/net/packet/PacketManager.java deleted file mode 100644 index 205e41250..000000000 --- a/src/main/java/com/l2jserver/game/net/packet/PacketManager.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.l2jserver.game.net.packet; - -public class PacketManager { - -} diff --git a/src/main/java/com/l2jserver/game/net/packet/ServerPacket.java b/src/main/java/com/l2jserver/game/net/packet/ServerPacket.java index aaa85942f..ae7fb9f80 100644 --- a/src/main/java/com/l2jserver/game/net/packet/ServerPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/ServerPacket.java @@ -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. + *

+ * 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(); } diff --git a/src/main/java/com/l2jserver/game/net/packet/client/AuthLoginPacket.java b/src/main/java/com/l2jserver/game/net/packet/client/AuthLoginPacket.java index 787daf375..97a6f6f46 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/AuthLoginPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/AuthLoginPacket.java @@ -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(); diff --git a/src/main/java/com/l2jserver/game/net/packet/client/CharacterCreatePacket.java b/src/main/java/com/l2jserver/game/net/packet/client/CharacterCreatePacket.java index 632cecbc6..5d3105137 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/CharacterCreatePacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/CharacterCreatePacket.java @@ -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()); diff --git a/src/main/java/com/l2jserver/game/net/packet/client/EnterWorld.java b/src/main/java/com/l2jserver/game/net/packet/client/EnterWorld.java index ea6562f6e..ad3fdb156 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/EnterWorld.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/EnterWorld.java @@ -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 diff --git a/src/main/java/com/l2jserver/game/net/packet/client/LogoutPacket.java b/src/main/java/com/l2jserver/game/net/packet/client/LogoutPacket.java index 2e82bfcf3..c79e19e39 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/LogoutPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/LogoutPacket.java @@ -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 diff --git a/src/main/java/com/l2jserver/game/net/packet/client/ProtocolVersionPacket.java b/src/main/java/com/l2jserver/game/net/packet/client/ProtocolVersionPacket.java index 96e75d893..3c707718c 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/ProtocolVersionPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/ProtocolVersionPacket.java @@ -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; } } diff --git a/src/main/java/com/l2jserver/game/net/packet/client/RequestCharacterTemplatesPacket.java b/src/main/java/com/l2jserver/game/net/packet/client/RequestCharacterTemplatesPacket.java index 6af7e8552..019d06846 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/RequestCharacterTemplatesPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/RequestCharacterTemplatesPacket.java @@ -37,7 +37,7 @@ public class RequestCharacterTemplatesPacket extends AbstractClientPacket { } @Override - public void read(ChannelBuffer buffer) { + public void read(Lineage2Connection conn, ChannelBuffer buffer) { } @Override diff --git a/src/main/java/com/l2jserver/game/net/packet/client/RequestGotoLobby.java b/src/main/java/com/l2jserver/game/net/packet/client/RequestGotoLobby.java index 70eadba39..5a3bd07b7 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/RequestGotoLobby.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/RequestGotoLobby.java @@ -29,7 +29,7 @@ public class RequestGotoLobby extends AbstractClientPacket { } @Override - public void read(ChannelBuffer buffer) { + public void read(Lineage2Connection conn, ChannelBuffer buffer) { } @Override diff --git a/src/main/java/com/l2jserver/game/net/packet/client/RequestKeyMapping.java b/src/main/java/com/l2jserver/game/net/packet/client/RequestKeyMapping.java index fbba7f7c2..534d41620 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/RequestKeyMapping.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/RequestKeyMapping.java @@ -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 diff --git a/src/main/java/com/l2jserver/game/net/packet/client/RequestManorList.java b/src/main/java/com/l2jserver/game/net/packet/client/RequestManorList.java index dc1001e5a..50f5b1ebb 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/RequestManorList.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/RequestManorList.java @@ -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 diff --git a/src/main/java/com/l2jserver/game/net/packet/server/CharacterCreateFailPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/CharacterCreateFailPacket.java index 228cd911b..c1ec06b5a 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/CharacterCreateFailPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/CharacterCreateFailPacket.java @@ -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); } } diff --git a/src/main/java/com/l2jserver/game/net/packet/server/CharacterCreateOkPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/CharacterCreateOkPacket.java index f15cb21e6..c9b11392f 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/CharacterCreateOkPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/CharacterCreateOkPacket.java @@ -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); } } diff --git a/src/main/java/com/l2jserver/game/net/packet/server/CharacterEnterWorldPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/CharacterEnterWorldPacket.java index 5139e7467..46b23ead7 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/CharacterEnterWorldPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/CharacterEnterWorldPacket.java @@ -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!"); diff --git a/src/main/java/com/l2jserver/game/net/packet/server/CharacterSelectionListPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/CharacterSelectionListPacket.java index 037c63626..73811336c 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/CharacterSelectionListPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/CharacterSelectionListPacket.java @@ -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 + } } } } diff --git a/src/main/java/com/l2jserver/game/net/packet/server/CharacterTemplatePacket.java b/src/main/java/com/l2jserver/game/net/packet/server/CharacterTemplatePacket.java index 1c075fcd2..9e854a738 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/CharacterTemplatePacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/CharacterTemplatePacket.java @@ -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); diff --git a/src/main/java/com/l2jserver/game/net/packet/server/InventoryPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/InventoryPacket.java index 665cac3c1..cf186a063 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/InventoryPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/InventoryPacket.java @@ -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) { diff --git a/src/main/java/com/l2jserver/game/net/packet/server/KeyPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/KeyPacket.java index b4fe7e7ce..4d8d88f03 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/KeyPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/KeyPacket.java @@ -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]); diff --git a/src/main/java/com/l2jserver/game/net/packet/server/ManorListPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/ManorListPacket.java index 5c7551b59..7118187e8 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/ManorListPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/ManorListPacket.java @@ -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; diff --git a/src/main/java/com/l2jserver/game/net/packet/server/UserInformationPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/UserInformationPacket.java index d8b5ebf83..d2fcfbe32 100644 --- a/src/main/java/com/l2jserver/game/net/packet/server/UserInformationPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/server/UserInformationPacket.java @@ -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;