1
0
mirror of https://github.com/Rogiel/l2jserver2 synced 2025-12-09 17:02:53 +00:00

Change-Id: Ifa069a09d1b603781a2c9255d89b77cd6f25a359

This commit is contained in:
rogiel
2011-04-28 22:53:11 -03:00
parent 05e8355aaf
commit 54ef3c7fa2
38 changed files with 962 additions and 99 deletions

View File

@@ -0,0 +1,50 @@
package com.l2jserver.game.net;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import com.l2jserver.game.net.codec.Lineage2Decrypter;
import com.l2jserver.game.net.codec.Lineage2Encrypter;
import com.l2jserver.game.net.packet.ServerPacket;
public class Lineage2Connection {
private final Channel channel;
public Lineage2Connection(Channel channel) {
this.channel = channel;
}
public Channel getChannel() {
return channel;
}
public boolean isOpen() {
return channel.isOpen();
}
public boolean isConnected() {
return channel.isConnected();
}
public ChannelFuture write(ServerPacket message) {
return channel.write(message);
}
public ChannelFuture disconnect() {
return channel.disconnect();
}
public ChannelFuture close() {
return channel.close();
}
public Lineage2Decrypter getDecrypter() {
return (Lineage2Decrypter) channel.getPipeline().get(
Lineage2Decrypter.HANDLER_NAME);
}
public Lineage2Encrypter getEncrypter() {
return (Lineage2Encrypter) channel.getPipeline().get(
Lineage2Encrypter.HANDLER_NAME);
}
}

View File

@@ -0,0 +1,36 @@
package com.l2jserver.game.net;
import static org.jboss.netty.channel.Channels.pipeline;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import com.l2jserver.game.net.codec.Lineage2Decoder;
import com.l2jserver.game.net.codec.Lineage2Decrypter;
import com.l2jserver.game.net.codec.Lineage2Encoder;
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.handler.Lineage2PacketHandler;
public class Lineage2PipelineFactory implements ChannelPipelineFactory {
@Override
public ChannelPipeline getPipeline() throws Exception {
final ChannelPipeline pipeline = pipeline();
pipeline.addLast(Lineage2Encrypter.HANDLER_NAME,
new Lineage2Encrypter());
pipeline.addLast(Lineage2Decrypter.HANDLER_NAME,
new Lineage2Decrypter());
pipeline.addLast("header.encoder", new Lineage2Encoder());
pipeline.addLast("header.decoder", new Lineage2Decoder());
pipeline.addLast("packet.writer", new Lineage2PacketWriter());
pipeline.addLast("packet.reader", new Lineage2PacketReader());
pipeline.addLast("packet.handler", new Lineage2PacketHandler());
return pipeline;
}
}

View File

@@ -1,14 +1,29 @@
package com.l2jserver.game.net.codec;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.frame.FrameDecoder;
import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder;
public class Lineage2Decoder extends FrameDecoder {
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
ChannelBuffer buffer) throws Exception {
return null;
public class Lineage2Decoder extends LengthFieldBasedFrameDecoder {
// private static final int HEADER_SIZE = 2;
public Lineage2Decoder() {
super(16 * 1024, 0, 2);
}
// @Override
// protected Object decode(ChannelHandlerContext ctx, Channel channel,
// ChannelBuffer buffer) throws Exception {
// if (buffer.readableBytes() < 2)
// return null;
// buffer.markReaderIndex();
// final int pending = buffer.readUnsignedShort() - HEADER_SIZE;
// if(pending == 0)
// return null;
//
// if (buffer.readableBytes() < pending) {
// buffer.resetReaderIndex();
// return null;
// }
//
// return buffer.slice(buffer.readableBytes(), pending);
// }
}

View File

@@ -0,0 +1,60 @@
package com.l2jserver.game.net.codec;
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;
public class Lineage2Decrypter extends OneToOneDecoder {
public static final String HANDLER_NAME = "crypto.decoder";
private boolean enabled = false;
private final byte[] key = new byte[16];
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
Object msg) throws Exception {
if (!(msg instanceof ChannelBuffer))
return msg;
if (!enabled)
return msg;
final ChannelBuffer buffer = (ChannelBuffer) msg;
final int offset = buffer.readerIndex();
final int size = buffer.readableBytes();
int temp = 0;
for (int i = 0; i < size; i++) {
int temp2 = buffer.getUnsignedByte(offset + i);
buffer.setByte(offset + i, (byte) (temp2 ^ key[i & 15] ^ temp));
temp = temp2;
}
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 setKey(byte[] key) {
for (int i = 0; i < 16; i++) {
this.key[i] = key[i];
}
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}

View File

@@ -1,5 +1,9 @@
package com.l2jserver.game.net.codec;
public class Lineage2Encoder {
import org.jboss.netty.handler.codec.frame.LengthFieldPrepender;
public class Lineage2Encoder extends LengthFieldPrepender {
public Lineage2Encoder() {
super(2);
}
}

View File

@@ -0,0 +1,58 @@
package com.l2jserver.game.net.codec;
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;
public class Lineage2Encrypter extends OneToOneEncoder {
public static final String HANDLER_NAME = "crypto.encoder";
private boolean enabled = false;
private final byte[] key = new byte[16];
@Override
protected Object encode(ChannelHandlerContext ctx, Channel channel,
Object msg) throws Exception {
if (!(msg instanceof ChannelBuffer))
return msg;
final ChannelBuffer buffer = (ChannelBuffer) msg;
final int offset = buffer.readerIndex();
final int size = buffer.readableBytes();
int temp = 0;
for (int i = 0; i < size; i++) {
int temp2 = buffer.getUnsignedByte(offset + i);
buffer.setByte(offset + i, (byte) (temp2 ^ key[i & 15] ^ temp));
temp = temp2;
}
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 setKey(byte[] key) {
for (int i = 0; i < 16; i++) {
this.key[i] = key[i];
}
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}

View File

@@ -0,0 +1,38 @@
package com.l2jserver.game.net.codec;
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.game.net.packet.ClientPacket;
import com.l2jserver.game.net.packet.client.ProtocolVersionPacket;
public class Lineage2PacketReader extends OneToOneDecoder {
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
Object msg) throws Exception {
if (!(msg instanceof ChannelBuffer))
return msg;
final ChannelBuffer buffer = (ChannelBuffer) msg;
final ClientPacket packet = getPacket(buffer);
if (packet == null)
return null;
packet.read(buffer);
return packet;
}
private ClientPacket getPacket(ChannelBuffer buffer) {
final short opcode = buffer.readUnsignedByte();
switch (opcode) {
case ProtocolVersionPacket.OPCODE:
return new ProtocolVersionPacket();
case 0x2b:
return null;
default:
System.out.println("Unk: " + opcode);
break;
}
return null;
}
}

View File

@@ -0,0 +1,22 @@
package com.l2jserver.game.net.codec;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
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.packet.ServerPacket;
public class Lineage2PacketWriter extends OneToOneEncoder {
@Override
protected Object encode(ChannelHandlerContext ctx, Channel channel,
Object msg) throws Exception {
if (!(msg instanceof ServerPacket))
return msg;
final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
final ServerPacket packet = (ServerPacket) msg;
packet.write(buffer);
return buffer;
}
}

View File

@@ -0,0 +1,26 @@
package com.l2jserver.game.net.handler;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import com.l2jserver.game.net.packet.ClientPacket;
public class Lineage2PacketHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
throws Exception {
final Object msg = e.getMessage();
if (!(msg instanceof ClientPacket))
return;
final ClientPacket packet = (ClientPacket) msg;
packet.process(null);
super.messageReceived(ctx, e);
}
@Override
public void writeRequested(ChannelHandlerContext ctx, MessageEvent e)
throws Exception {
super.writeRequested(ctx, e);
}
}

View File

@@ -2,6 +2,22 @@ package com.l2jserver.game.net.packet;
import org.jboss.netty.buffer.ChannelBuffer;
import com.google.inject.Injector;
public interface ClientPacket extends Packet {
/**
* Read binary data in the {@link ChannelBuffer}.
*
* @param buffer
* the buffer
*/
void read(ChannelBuffer buffer);
/**
* Process the packet
*
* @param injector
* the injector
*/
void process(Injector injector);
}

View File

@@ -0,0 +1,30 @@
package com.l2jserver.game.net.packet.client;
import org.jboss.netty.buffer.ChannelBuffer;
import com.google.inject.Injector;
import com.l2jserver.game.net.packet.AbstractClientPacket;
public class ProtocolVersionPacket extends AbstractClientPacket {
public static final int OPCODE = 0x0e;
private int version;
@Override
public void read(ChannelBuffer buffer) {
this.version = buffer.readInt();
}
@Override
public void process(Injector injector) {
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}

View File

@@ -1,15 +0,0 @@
package com.l2jserver.game.net.packet.client;
import org.jboss.netty.buffer.ChannelBuffer;
import com.l2jserver.game.net.packet.AbstractClientPacket;
public class TestPacket extends AbstractClientPacket {
public static final int OPCODE = 0x00;
@Override
public void read(ChannelBuffer buffer) {
// TODO Auto-generated method stub
}
}