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

Implemented new packets and several services

Signed-off-by: Rogiel <rogiel@rogiel.com>
This commit is contained in:
2011-05-17 12:37:52 -03:00
parent 5e21f16735
commit 31cc1a97e3
66 changed files with 2767 additions and 104 deletions

View File

@@ -22,7 +22,7 @@ package com.l2jserver.game.net;
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class Lineage2CryptographyKey implements Cloneable {
public class Lineage2CryptographyKey {
/**
* The raw key
*/
@@ -76,12 +76,7 @@ public class Lineage2CryptographyKey implements Cloneable {
key[11] = (byte) (old >> 0x18 & 0xff);
}
@Override
public Lineage2CryptographyKey clone() {
try {
return (Lineage2CryptographyKey) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
public Lineage2CryptographyKey copy() {
return new Lineage2CryptographyKey(key);
}
}

View File

@@ -32,10 +32,11 @@ 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.RequestAllFortressInfoPacket;
import com.l2jserver.game.net.packet.client.RequestCharacterTemplatesPacket;
import com.l2jserver.game.net.packet.client.RequestGotoLobby;
import com.l2jserver.game.net.packet.client.RequestKeyMapping;
import com.l2jserver.game.net.packet.client.RequestManorList;
import com.l2jserver.game.net.packet.client.RequestGotoLobbyPacket;
import com.l2jserver.game.net.packet.client.RequestKeyMappingPacket;
import com.l2jserver.game.net.packet.client.RequestManorListPacket;
/**
* This decoder reads an frame and decodes the packet in it. Each packet has an
@@ -128,12 +129,14 @@ public class Lineage2PacketReader extends OneToOneDecoder {
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;
case RequestGotoLobbyPacket.OPCODE2:
return RequestGotoLobbyPacket.class;
case RequestKeyMappingPacket.OPCODE2:
return RequestKeyMappingPacket.class;
case RequestManorListPacket.OPCODE2:
return RequestManorListPacket.class;
case RequestAllFortressInfoPacket.OPCODE2:
return RequestAllFortressInfoPacket.class;
default:
logger.warn("Unknown opcode2 for 0xd0: 0x{}",
Integer.toHexString(opcode2));

View File

@@ -88,6 +88,7 @@ public class AuthLoginPacket extends AbstractClientPacket {
final List<L2Character> chars = characterDao.selectByAccount(accountId);
// conn.write(CharacterSelectionListPacket.fromL2Session(
// conn.getSession(), chars.toArray(new L2Character[0])));
conn.setCharacterID(chars.get(0).getID());
conn.write(new CharacterEnterWorldPacket(chars.get(0), playKey1));
}

View File

@@ -20,7 +20,8 @@ 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;
import com.l2jserver.game.net.packet.server.GameGuardQueryPacket;
import com.l2jserver.game.net.packet.server.UserInformationPacket;
/**
* The client is requesting a logout. Currently, when this packet is received
@@ -51,6 +52,8 @@ public class EnterWorld extends AbstractClientPacket {
@Override
public void process(final Lineage2Connection conn) {
conn.write(new InventoryPacket(conn.getCharacter().getInventory()));
conn.write(new UserInformationPacket(conn.getCharacter()));
conn.write(new GameGuardQueryPacket());
//conn.write(new InventoryPacket(conn.getCharacter().getInventory()));
}
}

View File

@@ -82,7 +82,7 @@ public class ProtocolVersionPacket extends AbstractClientPacket {
keygen.generate());
conn.getDecrypter().enable(inKey);
final Lineage2CryptographyKey outKey = inKey.clone();
final Lineage2CryptographyKey outKey = inKey.copy();
log.debug("Decrypter has been enabled");
log.debug("Client protocol version: {}", version);

View File

@@ -0,0 +1,48 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
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.FortInfoPacket;
/**
* The client is requesting the manor list.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class RequestAllFortressInfoPacket extends AbstractClientPacket {
/**
* The packet OPCODE1
*/
public static final int OPCODE1 = 0xd0;
/**
* The packet OPCODE2
*/
public static final int OPCODE2 = 0x3d;
@Override
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
}
@Override
public void process(final Lineage2Connection conn) {
conn.write(new FortInfoPacket());
}
}

View File

@@ -33,7 +33,7 @@ import com.l2jserver.model.world.L2Character;
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class RequestGotoLobby extends AbstractClientPacket {
public class RequestGotoLobbyPacket extends AbstractClientPacket {
/**
* The packet OPCODE1
*/
@@ -49,7 +49,7 @@ public class RequestGotoLobby extends AbstractClientPacket {
private final CharacterDAO characterDao;
@Inject
public RequestGotoLobby(CharacterDAO characterDao) {
public RequestGotoLobbyPacket(CharacterDAO characterDao) {
this.characterDao = characterDao;
}

View File

@@ -26,7 +26,7 @@ import com.l2jserver.game.net.packet.AbstractClientPacket;
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class RequestKeyMapping extends AbstractClientPacket {
public class RequestKeyMappingPacket extends AbstractClientPacket {
/**
* The packet OPCODE1
*/

View File

@@ -27,7 +27,7 @@ import com.l2jserver.game.net.packet.server.ManorListPacket;
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class RequestManorList extends AbstractClientPacket {
public class RequestManorListPacket extends AbstractClientPacket {
/**
* The packet OPCODE1
*/

View File

@@ -0,0 +1,70 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
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;
/**
* 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 RequestShortcutRegistry extends AbstractClientPacket {
/**
* The packet OPCODE1
*/
public static final int OPCODE1 = 0xd0;
/**
* The packet OPCODE2
*/
public static final int OPCODE2 = 0x3d;
/**
* The logger
*/
private static final Logger log = LoggerFactory
.getLogger(RequestShortcutRegistry.class);
/**
* The shortcut type
*/
private int type;
/**
* The shortcut ID
*/
private int id;
private int slot;
private int page;
private int lvl;
private int characterType;
@Override
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
}
@Override
public void process(final Lineage2Connection conn) {
log.debug("Logging out client {}", conn);
conn.close();
}
}

View File

@@ -0,0 +1,54 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
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;
/**
* This packet send the manor list to the client
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class FortInfoPacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0xfe;
public FortInfoPacket() {
super(OPCODE);
}
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeShort(0x15);
buffer.writeInt(21);
int i = 101;
for (; i < 122; i++) {
buffer.writeInt(i); // fort id
BufferUtils.writeString(buffer, ""); // clan name
buffer.writeInt(0x00); // is in siege
buffer.writeInt(0x00); // Time of possession
}
// TODO implement fort service
}
}

View File

@@ -0,0 +1,48 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
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;
/**
* This packet send the GameGuard query to the client. The client will send an
* notification, but this can be ignored if GG is not supposed to be enforced.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class GameGuardQueryPacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x74;
public GameGuardQueryPacket() {
super(OPCODE);
}
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(0x27533DD9);
buffer.writeInt(0x2E72A51D);
buffer.writeInt(0x2017038B);
buffer.writeInt(0xC35B1EA3);
}
}

View File

@@ -16,10 +16,40 @@
*/
package com.l2jserver.game.net.packet.server;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.BELT;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.CHEST;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.CLOAK;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.DECORATION_1;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.DECORATION_2;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.DECORATION_3;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.DECORATION_4;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.DECORATION_5;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.DECORATION_6;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.FEET;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.GLOVES;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.HAIR1;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.HAIR2;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.HEAD;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.LEFT_BRACELET;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.LEFT_EAR;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.LEFT_FINGER;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.LEFT_HAND;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.LEGS;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.NECK;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.RIGHT_BRACELET;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.RIGHT_EAR;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.RIGHT_FINGER;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.RIGHT_HAND;
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.UNDERWEAR;
import org.jboss.netty.buffer.ChannelBuffer;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.AbstractServerPacket;
import com.l2jserver.model.world.Item;
import com.l2jserver.model.world.L2Character;
import com.l2jserver.model.world.actor.ActorExperience;
import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll;
import com.l2jserver.util.BufferUtils;
/**
@@ -31,26 +61,296 @@ public class UserInformationPacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0xfe;
public static final int OPCODE = 0x32;
/**
* TODO
* The character
*/
private String[] manors;
private L2Character character;
public UserInformationPacket(String... manors) {
public UserInformationPacket(L2Character character) {
super(OPCODE);
this.manors = manors;
this.character = character;
}
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeShort(0x22);
buffer.writeInt(manors.length);
int i = 1;
for (String manor : manors) {
buffer.writeInt(i++);
BufferUtils.writeString(buffer, manor);
}
buffer.writeInt(character.getPoint().getX());
buffer.writeInt(character.getPoint().getY());
buffer.writeInt(character.getPoint().getZ());
buffer.writeInt(0); // vehicle
buffer.writeInt(character.getID().getID());
BufferUtils.writeString(buffer, character.getName());
buffer.writeInt(character.getRace().id);
buffer.writeInt(character.getSex().option);
buffer.writeInt(character.getCharacterClass().id);
buffer.writeInt(character.getLevel());
buffer.writeLong(ActorExperience.LEVEL_1.experience);
buffer.writeInt(character.getAttributes().getStrength());
buffer.writeInt(character.getAttributes().getDexterity());
buffer.writeInt(character.getAttributes().getConcentration());
buffer.writeInt(character.getAttributes().getIntelligence());
buffer.writeInt(character.getAttributes().getWitness());
buffer.writeInt(character.getAttributes().getMentality());
buffer.writeInt(200); // hp
buffer.writeInt((int) 200); // cur hp
buffer.writeInt(200); // mp
buffer.writeInt((int) 200); // cur mp
buffer.writeInt(0); // sp
buffer.writeInt(0); // load
buffer.writeInt(200); // max load
// 20 no weapon, 40 weapon equippe
buffer.writeInt(20);
writePaperdollObjectID(buffer, character, UNDERWEAR);
writePaperdollObjectID(buffer, character, RIGHT_EAR);
writePaperdollObjectID(buffer, character, LEFT_EAR);
writePaperdollObjectID(buffer, character, NECK);
writePaperdollObjectID(buffer, character, RIGHT_FINGER);
writePaperdollObjectID(buffer, character, LEFT_FINGER);
writePaperdollObjectID(buffer, character, HEAD);
writePaperdollObjectID(buffer, character, RIGHT_HAND);
writePaperdollObjectID(buffer, character, LEFT_HAND);
writePaperdollObjectID(buffer, character, GLOVES);
writePaperdollObjectID(buffer, character, CHEST);
writePaperdollObjectID(buffer, character, LEGS);
writePaperdollObjectID(buffer, character, FEET);
writePaperdollObjectID(buffer, character, CLOAK);
writePaperdollObjectID(buffer, character, RIGHT_HAND);
writePaperdollObjectID(buffer, character, HAIR1);
writePaperdollObjectID(buffer, character, HAIR2);
writePaperdollObjectID(buffer, character, RIGHT_BRACELET);
writePaperdollObjectID(buffer, character, LEFT_BRACELET);
writePaperdollObjectID(buffer, character, DECORATION_1);
writePaperdollObjectID(buffer, character, DECORATION_2);
writePaperdollObjectID(buffer, character, DECORATION_3);
writePaperdollObjectID(buffer, character, DECORATION_4);
writePaperdollObjectID(buffer, character, DECORATION_5);
writePaperdollObjectID(buffer, character, DECORATION_6);
writePaperdollObjectID(buffer, character, BELT);
writePaperdollItemID(buffer, character, UNDERWEAR);
writePaperdollItemID(buffer, character, RIGHT_EAR);
writePaperdollItemID(buffer, character, LEFT_EAR);
writePaperdollItemID(buffer, character, NECK);
writePaperdollItemID(buffer, character, RIGHT_FINGER);
writePaperdollItemID(buffer, character, LEFT_FINGER);
writePaperdollItemID(buffer, character, HEAD);
buffer.writeInt(246);
//writePaperdollItemID(buffer, character, RIGHT_HAND);
writePaperdollItemID(buffer, character, LEFT_HAND);
writePaperdollItemID(buffer, character, GLOVES);
writePaperdollItemID(buffer, character, CHEST);
writePaperdollItemID(buffer, character, LEGS);
writePaperdollItemID(buffer, character, FEET);
writePaperdollItemID(buffer, character, CLOAK);
///writePaperdollItemID(buffer, character, RIGHT_HAND);
buffer.writeInt(246);
writePaperdollItemID(buffer, character, HAIR1);
writePaperdollItemID(buffer, character, HAIR2);
writePaperdollItemID(buffer, character, RIGHT_BRACELET);
writePaperdollItemID(buffer, character, LEFT_BRACELET);
writePaperdollItemID(buffer, character, DECORATION_1);
writePaperdollItemID(buffer, character, DECORATION_2);
writePaperdollItemID(buffer, character, DECORATION_3);
writePaperdollItemID(buffer, character, DECORATION_4);
writePaperdollItemID(buffer, character, DECORATION_5);
writePaperdollItemID(buffer, character, DECORATION_6);
writePaperdollItemID(buffer, character, BELT);
writePaperdollAugumentID(buffer, character, UNDERWEAR);
writePaperdollAugumentID(buffer, character, RIGHT_EAR);
writePaperdollAugumentID(buffer, character, LEFT_EAR);
writePaperdollAugumentID(buffer, character, NECK);
writePaperdollAugumentID(buffer, character, RIGHT_FINGER);
writePaperdollAugumentID(buffer, character, LEFT_FINGER);
writePaperdollAugumentID(buffer, character, HEAD);
writePaperdollAugumentID(buffer, character, RIGHT_HAND);
writePaperdollAugumentID(buffer, character, LEFT_HAND);
writePaperdollAugumentID(buffer, character, GLOVES);
writePaperdollAugumentID(buffer, character, CHEST);
writePaperdollAugumentID(buffer, character, LEGS);
writePaperdollAugumentID(buffer, character, FEET);
writePaperdollAugumentID(buffer, character, CLOAK);
writePaperdollAugumentID(buffer, character, RIGHT_HAND);
writePaperdollAugumentID(buffer, character, HAIR1);
writePaperdollAugumentID(buffer, character, HAIR2);
writePaperdollAugumentID(buffer, character, RIGHT_BRACELET);
writePaperdollAugumentID(buffer, character, LEFT_BRACELET);
writePaperdollAugumentID(buffer, character, DECORATION_1);
writePaperdollAugumentID(buffer, character, DECORATION_2);
writePaperdollAugumentID(buffer, character, DECORATION_3);
writePaperdollAugumentID(buffer, character, DECORATION_4);
writePaperdollAugumentID(buffer, character, DECORATION_5);
writePaperdollAugumentID(buffer, character, DECORATION_6);
writePaperdollAugumentID(buffer, character, BELT);
buffer.writeInt(0x00); // (max?) talismans count
buffer.writeInt(0x00); // cloak sratus
buffer.writeInt(character.getAttributes().getPhysicalAttack());
buffer.writeInt(character.getAttributes().getAttackSpeed());
buffer.writeInt(character.getAttributes().getPhysicalDefense());
buffer.writeInt(character.getAttributes().getEvasionChance()); // evasion
buffer.writeInt(character.getAttributes().getAccuracy());
buffer.writeInt(character.getAttributes().getCriticalChance());
buffer.writeInt(character.getAttributes().getMagicalAttack());
buffer.writeInt(character.getAttributes().getCastSpeed());
buffer.writeInt(character.getAttributes().getAttackSpeed());
buffer.writeInt(character.getAttributes().getMagicalDefense());
buffer.writeInt(0x00); // 0-non-pvp 1-pvp = violett name
buffer.writeInt(0x00); // karma
buffer.writeInt(0x10); // run speed
buffer.writeInt(0x20); // walk speed
buffer.writeInt(0x10); // swim run speed
buffer.writeInt(0x20); // swim walk speed
buffer.writeInt(0); // unk
buffer.writeInt(0); // unk
buffer.writeInt(0); // fly speed -only if flying
buffer.writeInt(0); // fly speed -only if flying
buffer.writeDouble(0x01); // move speed multiplier
buffer.writeDouble(0x01); // attack speed multiplier
// L2Summon pet = _activeChar.getPet();
// L2Transformation trans;
// if (_activeChar.getMountType() != 0 && pet != null) {
// writeF(pet.getTemplate().fCollisionRadius);
// writeF(pet.getTemplate().fCollisionHeight);
// } else if ((trans = _activeChar.getTransformation()) != null) {
// writeF(trans.getCollisionRadius());
// writeF(trans.getCollisionHeight());
// } else {
// writeF(_activeChar.getCollisionRadius());
// writeF(_activeChar.getCollisionHeight());
// }
buffer.writeDouble(9.0); // collision radius
buffer.writeDouble(23.0); // collision heigth
buffer.writeInt(character.getAppearance().getHairStyle().option);
buffer.writeInt(character.getAppearance().getHairColor().option);
buffer.writeInt(character.getAppearance().getFace().option);
buffer.writeInt(0x00); // is gm
String title = "Testing"; // title
BufferUtils.writeString(buffer, title);
int clanid = 0;
if (character.getClanID() != null)
clanid = character.getClanID().getID();
buffer.writeInt(clanid); // clanid
buffer.writeInt(0x00); // clan crest id
buffer.writeInt(0x00); // ally id
buffer.writeInt(0x00); // ally crest id
// 0x40 leader rights
// siege flags: attacker - 0x180 sword over name, defender - 0x80
// shield, 0xC0 crown (|leader), 0x1C0 flag (|leader)
buffer.writeInt(0x40);
buffer.writeByte(0x00); // mount type
buffer.writeByte(0x00); // private store type
buffer.writeByte(0x00); // dwarven craft
buffer.writeInt(0x00); // pk kills
buffer.writeInt(0x00); // pvp kills
buffer.writeShort(0x00); // cubics size
// short:cubicsid[cubicssize]
// buffer.writeShort(cubicid);
buffer.writeByte(0); // is party match room
buffer.writeInt(0x100000); // abnormal effect
buffer.writeByte(0x0); // flying mounted = 2; otherwise: 0
buffer.writeInt(0x00); // clan privileges
buffer.writeShort(2); // c2 recommendations remaining
buffer.writeShort(1); // c2 recommendations received
buffer.writeInt(0); // mount npc id
buffer.writeShort(500); // inventory limit
buffer.writeInt(character.getCharacterClass().id);
buffer.writeInt(0x00); // special effects? circles around player...
buffer.writeInt(200); // max cp
buffer.writeInt(200); // cur cp
buffer.writeByte(127); // is mount or is airshilhelp = 0; otherwise
// enchant effect (minimum 127)
buffer.writeByte(0x01);// team, 1=blue,2 red,0 is unknown
buffer.writeInt(0x00); // clan crest large id
// 0x01: symbol on char menu ctrl+I
buffer.writeByte(0x00); // is noble
buffer.writeByte(0x00); // 0x01: Hero Aura
buffer.writeByte(0x00); // Fishing Mode
buffer.writeInt(0x00); // fishing x
buffer.writeInt(0x00); // fishing y
buffer.writeInt(0x00); // fishing z
buffer.writeInt(character.getAppearance().getNameColor().toInteger());
// new c5
// is running
buffer.writeByte(0x00); // changes the Speed
// display on Status
// Window
// pledge class
buffer.writeInt(0x00); // changes the text above
// CP on Status Window
buffer.writeInt(0x00); // pledge type
buffer.writeInt(character.getAppearance().getTitleColor().toInteger());
// cursed weapon ID equipped
buffer.writeInt(0x00);
// T1 Starts
buffer.writeInt(0x00); // transformation id
buffer.writeShort(0x00); // attack element
buffer.writeShort(0x10); // attack element value
buffer.writeShort(0x10); // fire defense value
buffer.writeShort(0x10); // water def value
buffer.writeShort(0x10); // wind def value
buffer.writeShort(0x10); // earth def value
buffer.writeShort(0x10); // holy def value
buffer.writeShort(0x10); // dark def value
buffer.writeInt(0x00); // getAgathionId
// T2 Starts
buffer.writeInt(0x00); // Fame
buffer.writeInt(0x01); // Minimap on Hellbound
buffer.writeInt(1); // Vitality Points
buffer.writeInt(0x000001); // special effects
}
private void writePaperdollObjectID(ChannelBuffer buffer,
L2Character character, InventoryPaperdoll paperdoll) {
final Item item = character.getInventory().getItem(paperdoll);
int id = 0;
if (item != null)
id = item.getID().getID();
buffer.writeInt(id);
}
private void writePaperdollItemID(ChannelBuffer buffer,
L2Character character, InventoryPaperdoll paperdoll) {
final Item item = character.getInventory().getItem(paperdoll);
int id = 0;
if (item != null)
id = item.getTemplateID().getID();
buffer.writeInt(id);
}
private void writePaperdollAugumentID(ChannelBuffer buffer,
L2Character character, InventoryPaperdoll paperdoll) {
buffer.writeInt(0x00);
}
}