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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user