mirror of
https://github.com/Rogiel/l2jserver2
synced 2025-12-08 08:23:11 +00:00
Change-Id: I04b40ac9094ed82a87bba234191ea0b8db67c718
This commit is contained in:
@@ -18,6 +18,11 @@ public class Lineage2Connection {
|
||||
private final Channel channel;
|
||||
private L2Character character;
|
||||
private Lineage2Session session;
|
||||
private ConnectionState state = ConnectionState.CONNECTED;
|
||||
|
||||
public enum ConnectionState {
|
||||
CONNECTED, AUTHENTICATED, IN_GAME;
|
||||
}
|
||||
|
||||
public Lineage2Connection(Channel channel) {
|
||||
this.channel = channel;
|
||||
|
||||
@@ -36,14 +36,16 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory {
|
||||
new Lineage2Encrypter());
|
||||
pipeline.addLast(Lineage2Decrypter.HANDLER_NAME,
|
||||
new Lineage2Decrypter());
|
||||
|
||||
pipeline.addLast("logger-hex", new LoggingHandler(InternalLogLevel.DEBUG, true));
|
||||
|
||||
pipeline.addLast("packet.writer", new Lineage2PacketWriter());
|
||||
pipeline.addLast("packet.reader", new Lineage2PacketReader(injector));
|
||||
|
||||
pipeline.addLast("logger", new LoggingHandler(InternalLogLevel.DEBUG, true));
|
||||
|
||||
pipeline.addLast("packet.handler", new Lineage2PacketHandler());
|
||||
|
||||
pipeline.addLast("logger", new LoggingHandler(InternalLogLevel.WARN));
|
||||
|
||||
return pipeline;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
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;
|
||||
@@ -26,11 +28,23 @@ public class Lineage2Decrypter extends OneToOneDecoder {
|
||||
final int size = buffer.readableBytes();
|
||||
int temp = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
int temp2 = buffer.getUnsignedByte(offset + i) & 0xFF;
|
||||
buffer.setByte(offset + i, (byte) (temp2 ^ key[i & 15] ^ temp));
|
||||
int temp2 = buffer.getByte(offset + i) & 0xFF;
|
||||
buffer.setByte(offset + i, (temp2 ^ key[i & 15] ^ temp));
|
||||
temp = temp2;
|
||||
}
|
||||
|
||||
// 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;
|
||||
@@ -54,9 +68,7 @@ public class Lineage2Decrypter extends OneToOneDecoder {
|
||||
}
|
||||
|
||||
public void setKey(byte[] key) {
|
||||
for (int i = 0; i < 16; i++) {
|
||||
this.key[i] = key[i];
|
||||
}
|
||||
System.arraycopy(key, 0, this.key, 0, key.length);
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
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;
|
||||
@@ -24,7 +26,7 @@ public class Lineage2Encrypter extends OneToOneEncoder {
|
||||
final int size = buffer.readableBytes() - 2;
|
||||
int temp = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
int temp2 = buffer.getUnsignedByte(offset + i) & 0xFF;
|
||||
int temp2 = buffer.getByte(offset + i) & 0xFF;
|
||||
buffer.setByte(offset + i, (byte) (temp2 ^ key[i & 15] ^ temp));
|
||||
temp = temp2;
|
||||
}
|
||||
@@ -50,9 +52,7 @@ public class Lineage2Encrypter extends OneToOneEncoder {
|
||||
}
|
||||
|
||||
public void setKey(byte[] key) {
|
||||
for (int i = 0; i < 16; i++) {
|
||||
this.key[i] = key[i];
|
||||
}
|
||||
System.arraycopy(key, 0, this.key, 0, key.length);
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
|
||||
@@ -12,10 +12,13 @@ import com.google.inject.Injector;
|
||||
import com.l2jserver.game.net.packet.ClientPacket;
|
||||
import com.l2jserver.game.net.packet.client.AuthLoginPacket;
|
||||
import com.l2jserver.game.net.packet.client.CharacterCreatePacket;
|
||||
import com.l2jserver.game.net.packet.client.EnterWorld;
|
||||
import com.l2jserver.game.net.packet.client.LogoutPacket;
|
||||
import com.l2jserver.game.net.packet.client.ProtocolVersionPacket;
|
||||
import com.l2jserver.game.net.packet.client.RequestCharacterTemplatesPacket;
|
||||
import com.l2jserver.game.net.packet.client.RequestGotoLobby;
|
||||
import com.l2jserver.game.net.packet.client.RequestNewCharacterPacket;
|
||||
import com.l2jserver.game.net.packet.client.RequestKeyMapping;
|
||||
import com.l2jserver.game.net.packet.client.RequestManorList;
|
||||
|
||||
public class Lineage2PacketReader extends OneToOneDecoder {
|
||||
private final Injector injector;
|
||||
@@ -57,20 +60,25 @@ public class Lineage2PacketReader extends OneToOneDecoder {
|
||||
return AuthLoginPacket.class;
|
||||
case CharacterCreatePacket.OPCODE:
|
||||
return CharacterCreatePacket.class;
|
||||
case RequestNewCharacterPacket.OPCODE:
|
||||
return RequestNewCharacterPacket.class;
|
||||
// COMPOSED
|
||||
case 0xd0:
|
||||
case RequestCharacterTemplatesPacket.OPCODE:
|
||||
return RequestCharacterTemplatesPacket.class;
|
||||
case 0xd0: // COMPOSED
|
||||
final int opcode2 = buffer.readUnsignedShort();
|
||||
switch (opcode2) {
|
||||
case RequestGotoLobby.OPCODE2:
|
||||
return RequestGotoLobby.class;
|
||||
case RequestKeyMapping.OPCODE2:
|
||||
return RequestKeyMapping.class;
|
||||
case RequestManorList.OPCODE2:
|
||||
return RequestManorList.class;
|
||||
default:
|
||||
logger.warn("Unknown opcode2: 0x{}",
|
||||
Integer.toHexString(opcode));
|
||||
logger.warn("Unknown opcode2 for 0xd0: 0x{}",
|
||||
Integer.toHexString(opcode2));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case EnterWorld.OPCODE:
|
||||
return EnterWorld.class;
|
||||
default:
|
||||
logger.warn("Unknown opcode: 0x{}", Integer.toHexString(opcode));
|
||||
break;
|
||||
|
||||
@@ -7,10 +7,15 @@ 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 org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.l2jserver.game.net.packet.ServerPacket;
|
||||
|
||||
public class Lineage2PacketWriter extends OneToOneEncoder {
|
||||
private static final Logger log = LoggerFactory
|
||||
.getLogger(Lineage2PacketWriter.class);
|
||||
|
||||
@Override
|
||||
protected Object encode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
@@ -22,6 +27,9 @@ public class Lineage2PacketWriter extends OneToOneEncoder {
|
||||
buffer.writeShort(0x0000);
|
||||
buffer.writeByte(packet.getOpcode()); // packet opcode
|
||||
packet.write(buffer);
|
||||
|
||||
log.debug("Writing message {}", ChannelBuffers.hexDump(buffer));
|
||||
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@ import com.l2jserver.db.dao.CharacterDAO;
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.Lineage2Session;
|
||||
import com.l2jserver.game.net.packet.AbstractClientPacket;
|
||||
import com.l2jserver.game.net.packet.server.CharacterSelectionListPacket;
|
||||
import com.l2jserver.game.net.packet.server.CharacterEnterWorldPacket;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.util.BufferUtil;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This packet is sent by the client once the login server has authorized
|
||||
@@ -39,8 +39,7 @@ public class AuthLoginPacket extends AbstractClientPacket {
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
this.loginName = BufferUtil.readString(buffer);
|
||||
System.out.println(loginName);
|
||||
this.loginName = BufferUtils.readString(buffer).toLowerCase();
|
||||
this.playKey1 = buffer.readInt();
|
||||
this.playKey2 = buffer.readInt();
|
||||
this.loginKey1 = buffer.readInt();
|
||||
@@ -54,8 +53,9 @@ public class AuthLoginPacket extends AbstractClientPacket {
|
||||
|
||||
final List<L2Character> chars = characterDao.selectByAccount(conn
|
||||
.getSession().getUsername());
|
||||
conn.write(CharacterSelectionListPacket.fromL2Session(
|
||||
conn.getSession(), chars.toArray(new L2Character[0])));
|
||||
// conn.write(CharacterSelectionListPacket.fromL2Session(
|
||||
// conn.getSession(), chars.toArray(new L2Character[0])));
|
||||
conn.write(new CharacterEnterWorldPacket(chars.get(0), playKey1));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -21,11 +21,11 @@ import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.model.world.character.CharacterAppearance.CharacterFace;
|
||||
import com.l2jserver.model.world.character.CharacterAppearance.CharacterHairColor;
|
||||
import com.l2jserver.model.world.character.CharacterAppearance.CharacterHairStyle;
|
||||
import com.l2jserver.util.BufferUtil;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* Completes the creation of an character. Creates the object, inserts into the
|
||||
* database and notifies the client abou the status of the operation.
|
||||
* database and notifies the client about the status of the operation.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
@@ -71,7 +71,7 @@ public class CharacterCreatePacket extends AbstractClientPacket {
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
name = BufferUtil.readString(buffer);
|
||||
name = BufferUtils.readString(buffer);
|
||||
race = Race.fromOption(buffer.readInt());
|
||||
sex = Sex.fromOption(buffer.readInt());
|
||||
classId = buffer.readInt();
|
||||
@@ -90,7 +90,8 @@ public class CharacterCreatePacket extends AbstractClientPacket {
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Connection conn) {
|
||||
log.debug("Creating a new character");
|
||||
log.debug("Creating a new character, race={}, sex={}, classid={}",
|
||||
new Object[] { race, sex, classId });
|
||||
if ((name.length() < 1) || (name.length() > 16)) {
|
||||
log.debug("Character name length invalid: {}. Aborting.", name);
|
||||
conn.write(new CharacterCreateFailPacket(
|
||||
@@ -123,15 +124,29 @@ public class CharacterCreatePacket extends AbstractClientPacket {
|
||||
log.debug("Creating character with template {}", template);
|
||||
|
||||
// ensure parameters passed by the client are true
|
||||
if ((intelligence != template.getIntelligence())
|
||||
|| (strength != template.getStrength())
|
||||
|| (concentration != template.getConcentration())
|
||||
|| (mentality != template.getMentality())
|
||||
|| (dextry != template.getDextry())
|
||||
|| (witness != template.getWitness())
|
||||
|| (race != template.getRace())) {
|
||||
if (/*
|
||||
* (intelligence != template.getIntelligence()) || (strength !=
|
||||
* template.getStrength()) || (concentration !=
|
||||
* template.getConcentration()) || (mentality !=
|
||||
* template.getMentality()) || (dextry != template.getDextry()) ||
|
||||
* (witness != template.getWitness()) ||
|
||||
*/(race != template.getRace())) {
|
||||
// log.debug("intelligence, expected {}, received {}",
|
||||
// template.getIntelligence(), intelligence);
|
||||
// log.debug("strength, expected {}, received {}",
|
||||
// template.getStrength(), strength);
|
||||
// log.debug("concentration, expected {}, received {}",
|
||||
// template.getConcentration(), concentration);
|
||||
// log.debug("dextry, expected {}, received {}",
|
||||
// template.getDextry(),
|
||||
// dextry);
|
||||
// log.debug("witness, expected {}, received {}",
|
||||
// template.getWitness(), witness);
|
||||
log.debug("race, expected {}, received {}", template.getRace(),
|
||||
race);
|
||||
|
||||
log.debug(
|
||||
"Values sent by client and sent from template does not match: {}",
|
||||
"Values sent by client and from template does not match: {}",
|
||||
template);
|
||||
// some of the values didn't match, canceling creation
|
||||
conn.write(new CharacterCreateFailPacket(
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractClientPacket;
|
||||
import com.l2jserver.game.net.packet.server.InventoryPacket;
|
||||
|
||||
/**
|
||||
* The client is requesting a logout. Currently, when this packet is received
|
||||
* the connection is immediately closed.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class EnterWorld extends AbstractClientPacket {
|
||||
public static final int OPCODE = 0x11;
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
buffer.readBytes(new byte[32]); // Unknown Byte Array
|
||||
buffer.readInt(); // Unknown Value
|
||||
buffer.readInt(); // Unknown Value
|
||||
buffer.readInt(); // Unknown Value
|
||||
buffer.readInt(); // Unknown Value
|
||||
buffer.readBytes(new byte[32]); // Unknown Byte Array
|
||||
buffer.readInt(); // Unknown Value
|
||||
// TODO parse tracert
|
||||
// for (int i = 0; i < 5; i++)
|
||||
// for (int o = 0; o < 4; o++)
|
||||
// tracert[i][o] = readC();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Connection conn) {
|
||||
conn.write(new InventoryPacket(conn.getCharacter().getInventory()));
|
||||
}
|
||||
}
|
||||
@@ -11,27 +11,28 @@ import com.l2jserver.game.net.packet.server.CharacterTemplatePacket;
|
||||
import com.l2jserver.model.id.template.CharacterTemplateID;
|
||||
import com.l2jserver.model.id.template.factory.CharacterTemplateIDFactory;
|
||||
import com.l2jserver.model.template.CharacterTemplate;
|
||||
import com.l2jserver.model.world.character.CharacterClass;
|
||||
|
||||
/**
|
||||
* Requests the creation of a new Character. The list of character templates is
|
||||
* sent to the client, meaning that the client is autorized to create
|
||||
* sent to the client, meaning that the client is authorized to create
|
||||
* characters.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class RequestNewCharacterPacket extends AbstractClientPacket {
|
||||
public class RequestCharacterTemplatesPacket extends AbstractClientPacket {
|
||||
public static final int OPCODE = 0x13;
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private static final Logger log = LoggerFactory
|
||||
.getLogger(RequestNewCharacterPacket.class);
|
||||
.getLogger(RequestCharacterTemplatesPacket.class);
|
||||
|
||||
private final CharacterTemplateIDFactory idFactory;
|
||||
|
||||
@Inject
|
||||
public RequestNewCharacterPacket(CharacterTemplateIDFactory idFactory) {
|
||||
public RequestCharacterTemplatesPacket(CharacterTemplateIDFactory idFactory) {
|
||||
this.idFactory = idFactory;
|
||||
}
|
||||
|
||||
@@ -43,7 +44,7 @@ public class RequestNewCharacterPacket extends AbstractClientPacket {
|
||||
public void process(final Lineage2Connection conn) {
|
||||
log.debug("Requested character templates");
|
||||
final CharacterTemplateID id = idFactory
|
||||
.createID(Integer.MAX_VALUE - 1);
|
||||
.createID(CharacterClass.HUMAN_FIGHTER.id);
|
||||
final CharacterTemplate template = id.getTemplate();
|
||||
|
||||
final CharacterTemplatePacket templatePacket = new CharacterTemplatePacket(
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* The client is requesting a logout. Currently, when this packet is received
|
||||
* the connection is immediately closed.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class RequestKeyMapping extends AbstractClientPacket {
|
||||
public static final int OPCODE1 = 0xd0;
|
||||
public static final int OPCODE2 = 0x21;
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Connection conn) {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.l2jserver.game.net.Lineage2Connection;
|
||||
import com.l2jserver.game.net.packet.AbstractClientPacket;
|
||||
import com.l2jserver.game.net.packet.server.ManorListPacket;
|
||||
|
||||
/**
|
||||
* The client is requesting a logout. Currently, when this packet is received
|
||||
* the connection is immediately closed.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class RequestManorList extends AbstractClientPacket {
|
||||
public static final int OPCODE1 = 0xd0;
|
||||
public static final int OPCODE2 = 0x01;
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private static final Logger log = LoggerFactory
|
||||
.getLogger(RequestManorList.class);
|
||||
|
||||
@Override
|
||||
public void read(ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Connection conn) {
|
||||
conn.write(new ManorListPacket("gludio", "dion", "giran", "oren", "aden",
|
||||
"innadril", "goddard", "rune", "schuttgart"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.model.world.actor.ActorExperience;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* An packet informing that the character was created with success.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CharacterEnterWorldPacket extends AbstractServerPacket {
|
||||
public static final int OPCODE = 0x0b;
|
||||
|
||||
private final L2Character character;
|
||||
private final int sessionId;
|
||||
|
||||
public CharacterEnterWorldPacket(L2Character character, int sessionId) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
this.sessionId = sessionId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
BufferUtils.writeString(buffer, character.getName());
|
||||
buffer.writeInt(character.getID().getID());
|
||||
BufferUtils.writeString(buffer, "Hello world!");
|
||||
buffer.writeInt(sessionId);
|
||||
buffer.writeInt(0x00); // clan id
|
||||
buffer.writeInt(0x00); // ??
|
||||
buffer.writeInt(character.getSex().option);
|
||||
buffer.writeInt(character.getRace().option);
|
||||
buffer.writeInt(character.getCharacterClass().id);
|
||||
buffer.writeInt(0x01); // active ??
|
||||
buffer.writeInt(character.getPosition().getX());
|
||||
buffer.writeInt(character.getPosition().getY());
|
||||
buffer.writeInt(character.getPosition().getZ());
|
||||
|
||||
buffer.writeDouble(100);
|
||||
buffer.writeDouble(100);
|
||||
buffer.writeInt(0x00);
|
||||
buffer.writeLong(ActorExperience.LEVEL_1.experience);
|
||||
buffer.writeInt(ActorExperience.LEVEL_1.level);
|
||||
buffer.writeInt(0x00); // karma
|
||||
buffer.writeInt(0x00); // pk
|
||||
buffer.writeInt(character.getAttributes().getIntelligence()); // INT
|
||||
buffer.writeInt(character.getAttributes().getStrength()); // STR
|
||||
buffer.writeInt(character.getAttributes().getConcentration()); // CON
|
||||
buffer.writeInt(character.getAttributes().getMentality()); // MEN
|
||||
buffer.writeInt(character.getAttributes().getDextry()); // DEX
|
||||
buffer.writeInt(character.getAttributes().getWitness()); // WIT
|
||||
|
||||
buffer.writeInt(250); // game time
|
||||
buffer.writeInt(0x00);
|
||||
|
||||
buffer.writeInt(character.getCharacterClass().id);
|
||||
|
||||
buffer.writeInt(0x00);
|
||||
buffer.writeInt(0x00);
|
||||
buffer.writeInt(0x00);
|
||||
buffer.writeInt(0x00);
|
||||
|
||||
buffer.writeBytes(new byte[64]);
|
||||
buffer.writeInt(0x00);
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,8 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import com.l2jserver.game.net.Lineage2Session;
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.util.BufferUtil;
|
||||
import com.l2jserver.model.world.actor.ActorExperience;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* The list of characters sent to the client.
|
||||
@@ -32,7 +33,7 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
public static CharacterSelectionListPacket fromL2Session(
|
||||
Lineage2Session session, L2Character... characters) {
|
||||
return new CharacterSelectionListPacket(session.getUsername(),
|
||||
session.getPlayKey1(), -1, characters);
|
||||
session.getPlayKey2(), -1, characters);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -40,16 +41,17 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
// buffer.writeByte(0x09);
|
||||
buffer.writeInt(characters.length);
|
||||
|
||||
// Can prevent players from creating new characters (if 0); (if 1,
|
||||
// the client will ask if chars may be created (0x13) Response: (0x0D) )
|
||||
buffer.writeInt(0x01);
|
||||
// Can prevent players from creating new characters (if 0);
|
||||
// if 1 the client will ask if chars may be created
|
||||
// (RequestCharacterTemplatesPacket) Response: (CharacterTemplatePacket)
|
||||
buffer.writeInt(0x07); // max chars
|
||||
buffer.writeByte(0x00);
|
||||
|
||||
int i = 0;
|
||||
//int i = 0;
|
||||
for (final L2Character character : characters) {
|
||||
BufferUtil.writeString(buffer, character.getName());
|
||||
BufferUtils.writeString(buffer, character.getName());
|
||||
buffer.writeInt(character.getID().getID());
|
||||
BufferUtil.writeString(buffer, loginName);
|
||||
BufferUtils.writeString(buffer, loginName);
|
||||
buffer.writeInt(sessionId);
|
||||
// if (character.getClanID() == null) {
|
||||
buffer.writeInt(0x00); // clan id
|
||||
@@ -58,7 +60,7 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
// }
|
||||
buffer.writeInt(0x00); // ??
|
||||
|
||||
buffer.writeInt(character.getSex().option); // sex
|
||||
buffer.writeInt(0x01); // sex
|
||||
buffer.writeInt(character.getRace().option); // race
|
||||
|
||||
// if (character.getClassId() == character.getBaseClassId())
|
||||
@@ -76,23 +78,26 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
buffer.writeDouble(20); // hp cur
|
||||
buffer.writeDouble(20); // mp cur
|
||||
|
||||
buffer.writeInt(3000); // sp
|
||||
buffer.writeLong(2000); // exp
|
||||
buffer.writeInt(0x01); // level
|
||||
buffer.writeInt(0x00); // sp
|
||||
buffer.writeLong(ActorExperience.LEVEL_1.experience); // exp
|
||||
buffer.writeInt(ActorExperience.LEVEL_1.level); // level
|
||||
|
||||
buffer.writeInt(0x00); // karma
|
||||
buffer.writeInt(0x00); // pk
|
||||
buffer.writeInt(0x00); // pvp
|
||||
|
||||
buffer.writeInt(0x00); // unk
|
||||
buffer.writeInt(0x00); // unk
|
||||
buffer.writeInt(0x00); // unk
|
||||
buffer.writeInt(0x00); // unk
|
||||
buffer.writeInt(0x00); // unk
|
||||
buffer.writeInt(0x00); // unk
|
||||
buffer.writeInt(0x00); // unk
|
||||
for (int n = 0; n < 7; n++) {
|
||||
buffer.writeInt(0x00); // unk
|
||||
}
|
||||
// buffer.writeInt(0x00); // unk 1
|
||||
// buffer.writeInt(0x00); // unk 2
|
||||
// buffer.writeInt(0x00); // unk 3
|
||||
// buffer.writeInt(0x00); // unk 4
|
||||
// buffer.writeInt(0x00); // unk 5
|
||||
// buffer.writeInt(0x00); // unk 6
|
||||
// buffer.writeInt(0x00); // unk 7
|
||||
|
||||
for (int id = 0; id < 26; id++) {
|
||||
for (int id = 0; id < 25; id++) {
|
||||
buffer.writeInt(0x00); // paperdolls
|
||||
}
|
||||
// buffer.writeInt(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
|
||||
@@ -123,18 +128,21 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
// buffer.writeInt(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_BELT));
|
||||
|
||||
// hair style
|
||||
buffer.writeInt(character.getAppearance().getHairStyle().option);
|
||||
//buffer.writeInt(character.getAppearance().getHairStyle().option);
|
||||
buffer.writeInt(0x02);
|
||||
// hair color
|
||||
buffer.writeInt(character.getAppearance().getHairColor().option);
|
||||
//buffer.writeInt(character.getAppearance().getHairColor().option);
|
||||
buffer.writeInt(0x03);
|
||||
// face
|
||||
buffer.writeInt(character.getAppearance().getFace().option);
|
||||
//buffer.writeInt(character.getAppearance().getFace().option);
|
||||
buffer.writeInt(0x00);
|
||||
|
||||
buffer.writeDouble(30); // hp max
|
||||
buffer.writeDouble(30); // mp max
|
||||
|
||||
buffer.writeInt(0x0); // seconds left before delete
|
||||
buffer.writeInt(character.getCharacterClass().id); // class
|
||||
buffer.writeInt(0x00); // c3 auto-select char
|
||||
buffer.writeInt(0x01); // c3 auto-select char
|
||||
|
||||
buffer.writeByte(0x00); // enchant effect
|
||||
|
||||
@@ -146,7 +154,7 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
// character select you don't see your transformation.
|
||||
|
||||
// Freya by Vistall:
|
||||
// buffer.writeInt(0); // npdid - 16024 Tame Tiny Baby Kookaburra
|
||||
buffer.writeInt(16024); // npdid - 16024 Tame Tiny Baby Kookaburra
|
||||
// // A9E89C
|
||||
buffer.writeInt(0); // level
|
||||
buffer.writeInt(0); // ?
|
||||
@@ -154,7 +162,9 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
|
||||
buffer.writeDouble(0); // max Hp
|
||||
buffer.writeDouble(0); // cur Hp
|
||||
|
||||
i++;
|
||||
// buffer.writeInt(0x00);
|
||||
|
||||
//i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.model.world.character.CharacterInventory;
|
||||
|
||||
/**
|
||||
* This packet send the inventory to the client
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class InventoryPacket extends AbstractServerPacket {
|
||||
/**
|
||||
* Message OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x11;
|
||||
|
||||
private CharacterInventory inventory;
|
||||
private boolean showWindow = false;
|
||||
|
||||
public InventoryPacket(CharacterInventory inventory) {
|
||||
super(OPCODE);
|
||||
this.inventory = inventory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
buffer.writeByte((showWindow ? 0x01 : 0x00));
|
||||
buffer.writeInt(0x00); // item count
|
||||
// for (Item item : inventory) {
|
||||
// buffer.writeInt(item.getID().getID());
|
||||
// buffer.writeInt(item.getTemplateID().getID());
|
||||
// buffer.writeInt(0x00); // loc slot
|
||||
// buffer.writeLong(0x00); //count
|
||||
// buffer.writeShort(0x00); // item type2
|
||||
// buffer.writeShort(0x00); // item type3
|
||||
// buffer.writeShort(0x00); // equiped?
|
||||
// buffer.writeInt(0x00); // body part
|
||||
// buffer.writeShort(0x00); // enchant level
|
||||
// // race tickets
|
||||
// buffer.writeShort(temp.getCustomType2()); // item type4
|
||||
// buffer.writeInt(0x00); // augument
|
||||
// buffer.writeInt(temp.getMana()); // mana
|
||||
// buffer.writeInt(-9999); // time
|
||||
// buffer.writeShort(temp.getAttackElementType()); // attack element
|
||||
// type
|
||||
// buffer.writeShort(temp.getAttackElementPower()); // attack element
|
||||
// power
|
||||
// for (byte i = 0; i < 6; i++) {
|
||||
// buffer.writeShort(temp.getElementDefAttr(i)); // element def attrib
|
||||
// }
|
||||
// // Enchant Effects
|
||||
// buffer.writeShort(0x00);
|
||||
// buffer.writeShort(0x00);
|
||||
// buffer.writeShort(0x00);
|
||||
// }
|
||||
// if (_inventory.hasInventoryBlock()) {
|
||||
// buffer.writeShort(_inventory.getBlockItems().length);
|
||||
// writeC(_inventory.getBlockMode());
|
||||
// for (int i : _inventory.getBlockItems())
|
||||
// buffer.writeInt(i);
|
||||
// } else
|
||||
buffer.writeShort(0x00);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This packet send the manor list to the client
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class ManorListPacket extends AbstractServerPacket {
|
||||
/**
|
||||
* Message OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0xfe;
|
||||
|
||||
private String[] manors;
|
||||
|
||||
public ManorListPacket(String... manors) {
|
||||
super(OPCODE);
|
||||
this.manors = manors;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
buffer.writeShort(0x22);
|
||||
buffer.writeInt(manors.length);
|
||||
int i = 1;
|
||||
for (String manor : manors) {
|
||||
buffer.writeInt(i++);
|
||||
BufferUtils.writeString(buffer, manor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.game.net.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This is an message informing the client of an given player
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class UserinfoPacket extends AbstractServerPacket {
|
||||
/**
|
||||
* Message OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0xfe;
|
||||
|
||||
private String[] manors;
|
||||
|
||||
public UserinfoPacket(String... manors) {
|
||||
super(OPCODE);
|
||||
this.manors = manors;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer buffer) {
|
||||
buffer.writeShort(0x22);
|
||||
buffer.writeInt(manors.length);
|
||||
int i = 1;
|
||||
for (String manor : manors) {
|
||||
buffer.writeInt(i++);
|
||||
BufferUtils.writeString(buffer, manor);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user