1
0
mirror of https://github.com/Rogiel/l2jserver2 synced 2025-12-10 09:22:49 +00:00

Service improvements

Signed-off-by: Rogiel <rogiel@rogiel.com>
This commit is contained in:
2011-05-16 13:41:55 -03:00
parent adb285fdf9
commit 4952a6a47b
52 changed files with 1099 additions and 296 deletions

View File

@@ -25,6 +25,7 @@ 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.id.object.CharacterID;
import com.l2jserver.model.world.L2Character;
/**
@@ -41,7 +42,7 @@ public class Lineage2Connection {
/**
* The character object
*/
private L2Character character;
private CharacterID characterID;
/**
* The Lineage 2 session
*/
@@ -80,22 +81,29 @@ public class Lineage2Connection {
* @return the character
*/
public boolean hasCharacter() {
return character != null;
return characterID != null;
}
/**
* @return the character ID
*/
public CharacterID getCharacterID() {
return characterID;
}
/**
* @return the character
*/
public L2Character getCharacter() {
return character;
return characterID.getObject();
}
/**
* @param character
* the character to set
* @param characterID
* the character ID to set
*/
public void setCharacter(L2Character character) {
this.character = character;
public void setCharacterID(CharacterID characterID) {
this.characterID = characterID;
}
/**

View File

@@ -16,10 +16,6 @@
*/
package com.l2jserver.game.net;
import java.util.Arrays;
import com.l2jserver.util.BlowFishKeygen;
/**
* Manages the cryptography key used to write/read packets. This class also
* updates the key once data has been sent/received.
@@ -42,16 +38,6 @@ public class Lineage2CryptographyKey implements Cloneable {
this.key = key;
}
/**
* Crates a new random key
*
* @return the random created key
*/
public static Lineage2CryptographyKey createRandomKey() {
return new Lineage2CryptographyKey(Arrays.copyOf(
BlowFishKeygen.getRandomKey(), 16));
}
/**
* @return the key
*/

View File

@@ -32,6 +32,7 @@ import com.l2jserver.game.net.codec.Lineage2FrameEncoder;
import com.l2jserver.game.net.codec.Lineage2PacketReader;
import com.l2jserver.game.net.codec.Lineage2PacketWriter;
import com.l2jserver.game.net.handler.Lineage2PacketHandler;
import com.l2jserver.service.network.NettyNetworkService;
/**
* This class creates a new instance of {@link ChannelPipeline} and attaches all
@@ -44,10 +45,16 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory {
* The Google Guice {@link Injector}.
*/
private final Injector injector;
/**
* The {@link NettyNetworkService}
*/
private final NettyNetworkService nettyNetworkService;
@Inject
public Lineage2PipelineFactory(Injector injector) {
public Lineage2PipelineFactory(Injector injector,
NettyNetworkService nettyNetworkService) {
this.injector = injector;
this.nettyNetworkService = nettyNetworkService;
}
@Override
@@ -73,7 +80,7 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory {
pipeline.addLast("logger", new LoggingHandler(InternalLogLevel.DEBUG,
true));
pipeline.addLast("packet.handler", new Lineage2PacketHandler());
pipeline.addLast("packet.handler", new Lineage2PacketHandler(nettyNetworkService));
return pipeline;
}

View File

@@ -72,11 +72,9 @@ public class Lineage2Decrypter extends OneToOneDecoder {
*
* @return the generated key
*/
public Lineage2CryptographyKey enable() {
Lineage2CryptographyKey key = Lineage2CryptographyKey.createRandomKey();
public void enable(Lineage2CryptographyKey key) {
this.setKey(key);
this.setEnabled(true);
return key;
}
/**

View File

@@ -23,6 +23,7 @@ import org.jboss.netty.channel.SimpleChannelHandler;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.ClientPacket;
import com.l2jserver.service.network.NettyNetworkService;
/**
* This handler dispatches the {@link ClientPacket#process(Lineage2Connection)}
@@ -32,17 +33,27 @@ import com.l2jserver.game.net.packet.ClientPacket;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class Lineage2PacketHandler extends SimpleChannelHandler {
/**
* The {@link NettyNetworkService}
*/
private final NettyNetworkService nettyNetworkService;
/**
* The Lineage 2 connection
*/
private Lineage2Connection connection;
public Lineage2PacketHandler(NettyNetworkService nettyNetworkService) {
this.nettyNetworkService = nettyNetworkService;
}
@Override
public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e)
throws Exception {
connection = new Lineage2Connection(e.getChannel());
connection.getPacketWriter().setConnection(connection);
nettyNetworkService.register(connection);
super.channelOpen(ctx, e);
}
@@ -62,4 +73,10 @@ public class Lineage2PacketHandler extends SimpleChannelHandler {
throws Exception {
super.writeRequested(ctx, e);
}
@Override
public void channelDisconnected(ChannelHandlerContext ctx,
ChannelStateEvent e) throws Exception {
nettyNetworkService.unregister(connection);
}
}

View File

@@ -39,12 +39,24 @@ import com.l2jserver.util.BufferUtils;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class AuthLoginPacket extends AbstractClientPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x2b;
/**
* The {@link CharacterDAO} implementation
*/
private final CharacterDAO characterDao;
/**
* The {@link AccountID} factory
*/
private final AccountIDFactory accountIdFactory;
// packet
/**
* User account name
*/
private String loginName;
private int playKey1;
private int playKey2;

View File

@@ -37,6 +37,7 @@ 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.model.world.character.CharacterClass;
import com.l2jserver.util.BufferUtils;
/**
@@ -46,6 +47,9 @@ import com.l2jserver.util.BufferUtils;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class CharacterCreatePacket extends AbstractClientPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x0c;
/**
@@ -55,25 +59,79 @@ public class CharacterCreatePacket extends AbstractClientPacket {
.getLogger(CharacterCreatePacket.class);
// services and daos
/**
* The {@link CharacterDAO} implementation
*/
private final CharacterDAO characterDao;
/**
* The {@link CharacterID} factory
*/
private final CharacterIDFactory characterIdFactory;
/**
* The {@link CharacterTemplateID} factory
*/
private final CharacterTemplateIDFactory characterTemplateIdFactory;
// packet
/**
* The name of the new character
*/
private String name;
/**
* The race of the new character
*/
private Race race;
/**
* The sex of the new character
*/
private Sex sex;
private int classId;
/**
* The class of the new character
*/
private CharacterClass characterClass;
/**
* The new character intelligence. Note that this is ignored and the
* template value is used.
*/
private int intelligence;
/**
* The new character intelligence. Note that this is ignored and the
* template value is used.
*/
private int strength;
/**
* The new character strength. Note that this is ignored and the template
* value is used.
*/
private int concentration;
/**
* The new character concentration. Note that this is ignored and the
* template value is used.
*/
private int mentality;
/**
* The new character mentality. Note that this is ignored and the template
* value is used.
*/
private int dexterity;
/**
* The new character dexterity. Note that this is ignored and the template
* value is used.
*/
private int witness;
/**
* The new character hair style
*/
private CharacterHairStyle hairStyle;
/**
* The new character hair color
*/
private CharacterHairColor hairColor;
/**
* The new character face
*/
private CharacterFace face;
@Inject
@@ -90,7 +148,7 @@ public class CharacterCreatePacket extends AbstractClientPacket {
name = BufferUtils.readString(buffer);
race = Race.fromOption(buffer.readInt());
sex = Sex.fromOption(buffer.readInt());
classId = buffer.readInt();
characterClass = CharacterClass.fromID(buffer.readInt());
intelligence = buffer.readInt();
strength = buffer.readInt();
@@ -106,8 +164,8 @@ public class CharacterCreatePacket extends AbstractClientPacket {
@Override
public void process(final Lineage2Connection conn) {
log.debug("Creating a new character, race={}, sex={}, classid={}",
new Object[] { race, sex, classId });
log.debug("Creating a new character, race={}, sex={}, class={}",
new Object[] { race, sex, characterClass });
if ((name.length() < 1) || (name.length() > 16)) {
log.debug("Character name length invalid: {}. Aborting.", name);
conn.write(new CharacterCreateFailPacket(
@@ -135,7 +193,7 @@ public class CharacterCreatePacket extends AbstractClientPacket {
// create template id and lookup for the template instance
final CharacterTemplateID templateId = characterTemplateIdFactory
.createID(classId);
.createID(characterClass.id);
final CharacterTemplate template = templateId.getTemplate();
log.debug("Creating character with template {}", template);
@@ -239,18 +297,18 @@ public class CharacterCreatePacket extends AbstractClientPacket {
}
/**
* @return the classId
* @return the character class
*/
public int getClassId() {
return classId;
public CharacterClass getCharacterClass() {
return characterClass;
}
/**
* @param classId
* the classId to set
* @param characterClass
* the character class
*/
public void setClassId(int classId) {
this.classId = classId;
public void setClassId(CharacterClass characterClass) {
this.characterClass = characterClass;
}
/**

View File

@@ -29,6 +29,9 @@ import com.l2jserver.game.net.packet.server.InventoryPacket;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class EnterWorld extends AbstractClientPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x11;
@Override

View File

@@ -30,6 +30,9 @@ import com.l2jserver.game.net.packet.AbstractClientPacket;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class LogoutPacket extends AbstractClientPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x00;
/**

View File

@@ -22,12 +22,14 @@ import org.jboss.netty.channel.ChannelFutureListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.l2jserver.L2JConstants;
import com.l2jserver.game.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;
import com.l2jserver.service.blowfish.BlowfishKeygenService;
/**
* In this packet the client is informing its protocol version. It is possible
@@ -38,6 +40,9 @@ import com.l2jserver.game.net.packet.server.KeyPacket;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class ProtocolVersionPacket extends AbstractClientPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x0e;
/**
@@ -46,9 +51,24 @@ public class ProtocolVersionPacket extends AbstractClientPacket {
private final Logger log = LoggerFactory
.getLogger(ProtocolVersionPacket.class);
// services
/**
* The {@link BlowfishKeygenService} implementation. Use to generate
* cryptography keys.
*/
private final BlowfishKeygenService keygen;
// packet
/**
* The client version of the protocol
*/
private ProtocolVersion version;
@Inject
public ProtocolVersionPacket(BlowfishKeygenService keygen) {
this.keygen = keygen;
}
@Override
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
this.version = ProtocolVersion.fromVersion((int) buffer
@@ -58,7 +78,10 @@ public class ProtocolVersionPacket extends AbstractClientPacket {
@Override
public void process(final Lineage2Connection conn) {
// generate a new key
final Lineage2CryptographyKey inKey = conn.getDecrypter().enable();
final Lineage2CryptographyKey inKey = new Lineage2CryptographyKey(
keygen.generate());
conn.getDecrypter().enable(inKey);
final Lineage2CryptographyKey outKey = inKey.clone();
log.debug("Decrypter has been enabled");

View File

@@ -37,8 +37,14 @@ import com.l2jserver.model.world.character.CharacterClass;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class RequestCharacterTemplatesPacket extends AbstractClientPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x13;
/**
* List of {@link CharacterClass} templates sent to the client
*/
public static final CharacterClass[] TEMPLATE_CLASSES = {
CharacterClass.HUMAN_FIGHTER, CharacterClass.HUMAN_MYSTIC,
CharacterClass.ELVEN_FIGHTER, CharacterClass.ELVEN_MYSTIC,
@@ -53,6 +59,9 @@ public class RequestCharacterTemplatesPacket extends AbstractClientPacket {
private static final Logger log = LoggerFactory
.getLogger(RequestCharacterTemplatesPacket.class);
/**
* The {@link CharacterTemplateID} factory
*/
private final CharacterTemplateIDFactory idFactory;
@Inject

View File

@@ -34,9 +34,18 @@ import com.l2jserver.model.world.L2Character;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class RequestGotoLobby extends AbstractClientPacket {
/**
* The packet OPCODE1
*/
public static final int OPCODE1 = 0xd0;
/**
* The packet OPCODE2
*/
public static final int OPCODE2 = 0x36;
/**
* The {@link CharacterDAO} implementation
*/
private final CharacterDAO characterDao;
@Inject

View File

@@ -22,13 +22,18 @@ 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.
* The client is requesting a the key mappings.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class RequestKeyMapping extends AbstractClientPacket {
/**
* The packet OPCODE1
*/
public static final int OPCODE1 = 0xd0;
/**
* The packet OPCODE2
*/
public static final int OPCODE2 = 0x21;
@Override

View File

@@ -23,13 +23,18 @@ 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.
* The client is requesting the manor list.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class RequestManorList extends AbstractClientPacket {
/**
* The packet OPCODE1
*/
public static final int OPCODE1 = 0xd0;
/**
* The packet OPCODE2
*/
public static final int OPCODE2 = 0x01;
@Override

View File

@@ -28,8 +28,14 @@ import com.l2jserver.game.net.packet.AbstractServerPacket;
* @see Reason
*/
public class CharacterCreateFailPacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x10;
/**
* The character creation failure reason
*/
private Reason reason;
/**
@@ -72,9 +78,12 @@ public class CharacterCreateFailPacket extends AbstractServerPacket {
*/
REASON_CHOOSE_ANOTHER_SVR(0x06);
/**
* The error code id
*/
public final int id;
private Reason(int id) {
Reason(int id) {
this.id = id;
}
}

View File

@@ -27,8 +27,14 @@ import com.l2jserver.game.net.packet.AbstractServerPacket;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class CharacterCreateOkPacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x0f;
/**
* The packet shared instance
*/
public static final CharacterCreateOkPacket INSTANCE = new CharacterCreateOkPacket();
public CharacterCreateOkPacket() {

View File

@@ -30,11 +30,28 @@ import com.l2jserver.util.BufferUtils;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class CharacterEnterWorldPacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x0b;
/**
* The entering character
*/
private final L2Character character;
/**
* The session ID
*/
private final int sessionId;
/**
* Creates a new instance
*
* @param character
* the character
* @param sessionId
* the session id
*/
public CharacterEnterWorldPacket(L2Character character, int sessionId) {
super(OPCODE);
this.character = character;

View File

@@ -32,11 +32,23 @@ import com.l2jserver.util.BufferUtils;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class CharacterSelectionListPacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x09;
/**
* The account username
*/
private final String loginName;
/**
* The session ID
*/
private final int sessionId;
// private int lastCharacterId;
/**
* The list of character to be displayed
*/
private final L2Character[] characters;
public CharacterSelectionListPacket(String loginName, int sessionId,

View File

@@ -28,8 +28,14 @@ import com.l2jserver.model.template.CharacterTemplate;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class CharacterTemplatePacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x0d;
/**
* The character template list
*/
private CharacterTemplate[] templates;
public CharacterTemplatePacket(CharacterTemplate... templates) {

View File

@@ -30,11 +30,17 @@ import com.l2jserver.model.world.character.CharacterInventory;
*/
public class InventoryPacket extends AbstractServerPacket {
/**
* Message OPCODE
* The packet OPCODE
*/
public static final int OPCODE = 0x11;
/**
* The character inventory
*/
private CharacterInventory inventory;
/**
* Whether or not to open the inventory window
*/
private boolean showWindow = false;
public InventoryPacket(CharacterInventory inventory) {

View File

@@ -32,7 +32,7 @@ import com.l2jserver.game.net.packet.AbstractServerPacket;
*/
public class KeyPacket extends AbstractServerPacket {
/**
* Message OPCODE
* The packet OPCODE
*/
public static final int OPCODE = 0x2e;

View File

@@ -29,10 +29,13 @@ import com.l2jserver.util.BufferUtils;
*/
public class ManorListPacket extends AbstractServerPacket {
/**
* Message OPCODE
* The packet OPCODE
*/
public static final int OPCODE = 0xfe;
/**
* List of manors to be sent
*/
private String[] manors;
public ManorListPacket(String... manors) {

View File

@@ -29,10 +29,13 @@ import com.l2jserver.util.BufferUtils;
*/
public class UserInformationPacket extends AbstractServerPacket {
/**
* Message OPCODE
* The packet OPCODE
*/
public static final int OPCODE = 0xfe;
/**
* TODO
*/
private String[] manors;
public UserInformationPacket(String... manors) {