mirror of
https://github.com/Rogiel/l2jserver2
synced 2025-12-06 07:32:46 +00:00
Moved packets back to l2jserver2-gameserver-core module
This commit is contained in:
@@ -1,419 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net;
|
||||
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelFuture;
|
||||
|
||||
import com.l2jserver.game.net.codec.Lineage2Decrypter;
|
||||
import com.l2jserver.game.net.codec.Lineage2Encrypter;
|
||||
import com.l2jserver.game.net.codec.Lineage2PacketReader;
|
||||
import com.l2jserver.game.net.codec.Lineage2PacketWriter;
|
||||
import com.l2jserver.game.net.packet.server.SM_ACTION_FAILED;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_INVENTORY;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_INVENTORY_UPDATE;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_INVENTORY_UPDATE.InventoryUpdateType;
|
||||
import com.l2jserver.game.net.packet.server.SM_COMMUNITY_HTML;
|
||||
import com.l2jserver.game.net.packet.server.SM_HTML;
|
||||
import com.l2jserver.game.net.packet.server.SM_SYSTEM_MESSAGE;
|
||||
import com.l2jserver.model.game.Fort;
|
||||
import com.l2jserver.model.game.Skill;
|
||||
import com.l2jserver.model.id.object.CharacterID;
|
||||
import com.l2jserver.model.template.ItemTemplate;
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.Lineage2Session;
|
||||
import com.l2jserver.service.network.model.ProtocolVersion;
|
||||
import com.l2jserver.service.network.model.SystemMessage;
|
||||
import com.l2jserver.service.network.model.packet.ServerPacket;
|
||||
import com.l2jserver.util.html.markup.HtmlTemplate;
|
||||
|
||||
/**
|
||||
* This object connects the model (structure objects normally stored in the
|
||||
* database) to the controller (protocol stuff).
|
||||
* <p>
|
||||
* This class also provides handy methods for {@link #write(ServerPacket)
|
||||
* writing} packets.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class FreyaLineage2Client implements Lineage2Client {
|
||||
/**
|
||||
* The connection channel
|
||||
*/
|
||||
private final Channel channel;
|
||||
/**
|
||||
* The character object
|
||||
*/
|
||||
private CharacterID characterID;
|
||||
/**
|
||||
* The Lineage 2 session
|
||||
*/
|
||||
private Lineage2Session session;
|
||||
|
||||
/**
|
||||
* The client supported protocol version
|
||||
*/
|
||||
private ProtocolVersion version;
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
*
|
||||
* @param channel
|
||||
* the channel
|
||||
*/
|
||||
public FreyaLineage2Client(Channel channel) {
|
||||
this.channel = channel;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the character
|
||||
*/
|
||||
public boolean hasCharacter() {
|
||||
return characterID != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the character ID
|
||||
*/
|
||||
public CharacterID getCharacterID() {
|
||||
return characterID;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the character
|
||||
*/
|
||||
public L2Character getCharacter() {
|
||||
return characterID.getObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param characterID
|
||||
* the character ID to set
|
||||
*/
|
||||
public void setCharacterID(CharacterID characterID) {
|
||||
this.characterID = characterID;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the session
|
||||
*/
|
||||
public Lineage2Session getSession() {
|
||||
return session;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param session
|
||||
* the session to set
|
||||
*/
|
||||
public void setSession(Lineage2Session session) {
|
||||
if (this.session != null)
|
||||
throw new IllegalStateException("Session is already set!");
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the version
|
||||
*/
|
||||
public ProtocolVersion getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param version
|
||||
* the version to set
|
||||
*/
|
||||
public void setVersion(ProtocolVersion version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the client supports an given version of the protocol. Note that
|
||||
* if the protocol is not known false will always be returned.
|
||||
*
|
||||
* @param version
|
||||
* the protocol version to test for support
|
||||
* @return true if version is supported by the client
|
||||
* @see ProtocolVersion#supports(ProtocolVersion)
|
||||
*/
|
||||
public boolean supports(ProtocolVersion version) {
|
||||
if (version == null)
|
||||
return false;
|
||||
return this.version.supports(version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the channel
|
||||
*
|
||||
* @return the channel
|
||||
*/
|
||||
public Channel getChannel() {
|
||||
return channel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if the client is still open.
|
||||
* <p>
|
||||
* Please note that the channel can be open but disconnected!
|
||||
*
|
||||
* @return true if the client is still open
|
||||
* @see Channel#isOpen()
|
||||
*/
|
||||
public boolean isOpen() {
|
||||
return channel.isOpen();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if the client is still connected
|
||||
* <p>
|
||||
* Please note that the channel can be open but disconnected!
|
||||
*
|
||||
* @return true if the client is still connected
|
||||
* @see Channel#isConnected()
|
||||
*/
|
||||
public boolean isConnected() {
|
||||
return channel.isConnected();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an packet to this client
|
||||
* <p>
|
||||
* Please note that this method will <b>not</b> block for the packets to be
|
||||
* sent. It is possible to check if the packet was sent successfully using
|
||||
* the {@link ChannelFuture}.
|
||||
*
|
||||
* @param packet
|
||||
* the packet
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture write(ServerPacket packet) {
|
||||
return channel.write(packet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a string message to this client
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture sendMessage(String message) {
|
||||
return write(new SM_SYSTEM_MESSAGE(SystemMessage.S1).addString(message));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a {@link SystemMessage} to this client
|
||||
*
|
||||
* @param message
|
||||
* the {@link SystemMessage}
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture sendSystemMessage(SystemMessage message) {
|
||||
return write(new SM_SYSTEM_MESSAGE(message));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a {@link SystemMessage} to this client
|
||||
*
|
||||
* @param message
|
||||
* the {@link SystemMessage}
|
||||
* @param args
|
||||
* the arguments of the message, they will be automatically
|
||||
* detected and inserted. See {@link SM_SYSTEM_MESSAGE} for more
|
||||
* about supported formats.
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
* @see SM_SYSTEM_MESSAGE
|
||||
*/
|
||||
public ChannelFuture sendSystemMessage(SystemMessage message,
|
||||
Object... args) {
|
||||
final SM_SYSTEM_MESSAGE packet = new SM_SYSTEM_MESSAGE(message);
|
||||
for (final Object obj : args) {
|
||||
if (obj instanceof String)
|
||||
packet.addString((String) obj);
|
||||
else if (obj instanceof ItemTemplate)
|
||||
packet.addItem((ItemTemplate) obj);
|
||||
else if (obj instanceof Item)
|
||||
packet.addItem((Item) obj);
|
||||
else if (obj instanceof Number)
|
||||
packet.addNumber((Integer) obj);
|
||||
else if (obj instanceof Skill)
|
||||
packet.addSkill((Skill) obj);
|
||||
else if (obj instanceof Fort)
|
||||
packet.addFort((Fort) obj);
|
||||
}
|
||||
return write(packet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a {@link SM_ACTION_FAILED} to the client.
|
||||
* <p>
|
||||
* This is an convenience method for <blockquote><code>
|
||||
* conn.write(ActionFailedPacket.SHARED_INSTANCE);</code></blockquote>
|
||||
*
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture sendActionFailed() {
|
||||
return write(SM_ACTION_FAILED.SHARED_INSTANCE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a {@link SM_HTML} packet to the client. In the packet, the NPC will
|
||||
* be null. If you wish to send the HTML with an NPC, you should send the
|
||||
* packet directly.
|
||||
* <p>
|
||||
* This is an convenience method for <blockquote><code>
|
||||
* conn.write(new SM_HTML(null, template));</code></blockquote>
|
||||
*
|
||||
* @param template
|
||||
* the HTML template to be sent
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture sendHTML(HtmlTemplate template) {
|
||||
return write(new SM_HTML(null, template));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a {@link SM_COMMUNITY_HTML} packet to the client. HTML code is not
|
||||
* displayed in the regular chat window, they will appear in a large one.
|
||||
* <p>
|
||||
* This is an convenience method for <blockquote><code>
|
||||
* conn.write(new SM_COMMUNITY_HTML(template));</code></blockquote>
|
||||
*
|
||||
* @param template
|
||||
* the HTML template to be sent
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture sendCommunityHTML(HtmlTemplate template) {
|
||||
return write(new SM_COMMUNITY_HTML(template));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the whole user inventory to the client. This is a very bandwidth
|
||||
* consuming process and should be avoided.
|
||||
*
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture updateEntireInventoryItems() {
|
||||
return write(new SM_CHAR_INVENTORY(characterID.getObject()
|
||||
.getInventory()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes <code>items</code> from the game client UI.
|
||||
*
|
||||
* @param items
|
||||
* the list of items to be removed
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture removeInventoryItems(Item... items) {
|
||||
return write(new SM_CHAR_INVENTORY_UPDATE(InventoryUpdateType.REMOVE,
|
||||
items));
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates <code>items</code> in the game client UI.
|
||||
*
|
||||
* @param items
|
||||
* the list of items to be updated
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture updateInventoryItems(Item... items) {
|
||||
return write(new SM_CHAR_INVENTORY_UPDATE(InventoryUpdateType.UPDATE,
|
||||
items));
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds <code>items</code> in the game client UI.
|
||||
*
|
||||
* @param items
|
||||
* the list of items to be added
|
||||
* @return the {@link ChannelFuture} that will be notified once the packet
|
||||
* has been written.
|
||||
*/
|
||||
public ChannelFuture addInventoryItems(Item... items) {
|
||||
return write(new SM_CHAR_INVENTORY_UPDATE(InventoryUpdateType.ADD,
|
||||
items));
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnects this client, without closing the channel.
|
||||
*
|
||||
* @return the {@link ChannelFuture}
|
||||
*/
|
||||
public ChannelFuture disconnect() {
|
||||
return channel.disconnect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the channel of this client.
|
||||
*
|
||||
* @return the {@link ChannelFuture}
|
||||
*/
|
||||
public ChannelFuture close() {
|
||||
return channel.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the client {@link Lineage2Decrypter}
|
||||
*/
|
||||
public Lineage2Decrypter getDecrypter() {
|
||||
return (Lineage2Decrypter) channel.getPipeline().get(
|
||||
Lineage2Decrypter.HANDLER_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the client {@link Lineage2Encrypter}
|
||||
*/
|
||||
public Lineage2Encrypter getEncrypter() {
|
||||
return (Lineage2Encrypter) channel.getPipeline().get(
|
||||
Lineage2Encrypter.HANDLER_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the client {@link Lineage2PacketReader}
|
||||
*/
|
||||
public Lineage2PacketReader getPacketReader() {
|
||||
return (Lineage2PacketReader) channel.getPipeline().get(
|
||||
Lineage2PacketReader.HANDLER_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the client {@link Lineage2PacketWriter}
|
||||
*/
|
||||
public Lineage2PacketWriter getPacketWriter() {
|
||||
return (Lineage2PacketWriter) channel.getPipeline().get(
|
||||
Lineage2PacketWriter.HANDLER_NAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Lineage2Client [channel=" + channel + ", characterID="
|
||||
+ characterID + ", session=" + session + ", version=" + version
|
||||
+ "]";
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ import com.l2jserver.game.net.codec.Lineage2PacketReader;
|
||||
import com.l2jserver.game.net.codec.Lineage2PacketWriter;
|
||||
import com.l2jserver.game.net.handler.Lineage2PacketHandler;
|
||||
import com.l2jserver.game.net.handler.Lineage2TimeoutHandler;
|
||||
import com.l2jserver.service.network.NettyNetworkService;
|
||||
import com.l2jserver.service.network.AbstractNettyNetworkService;
|
||||
import com.l2jserver.service.network.NetworkService;
|
||||
|
||||
/**
|
||||
@@ -49,9 +49,9 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory {
|
||||
*/
|
||||
private final Injector injector;
|
||||
/**
|
||||
* The {@link NettyNetworkService}
|
||||
* The {@link AbstractNettyNetworkService}
|
||||
*/
|
||||
private final NettyNetworkService nettyNetworkService;
|
||||
private final AbstractNettyNetworkService nettyNetworkService;
|
||||
|
||||
/**
|
||||
* Creates a new instance of this pipeline
|
||||
@@ -65,7 +65,7 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory {
|
||||
public Lineage2PipelineFactory(Injector injector,
|
||||
NetworkService networkService) {
|
||||
this.injector = injector;
|
||||
this.nettyNetworkService = (NettyNetworkService) networkService;
|
||||
this.nettyNetworkService = (AbstractNettyNetworkService) networkService;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.codec;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneDecoder;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2CryptographyKey;
|
||||
|
||||
/**
|
||||
* Decrypts encrypted Lineage II packets
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class Lineage2Decrypter extends OneToOneDecoder {
|
||||
/**
|
||||
* The handler name
|
||||
*/
|
||||
public static final String HANDLER_NAME = "crypto.decoder";
|
||||
|
||||
/**
|
||||
* Enabled state
|
||||
*/
|
||||
private boolean enabled = false;
|
||||
/**
|
||||
* Crypto key
|
||||
*/
|
||||
private Lineage2CryptographyKey key;
|
||||
|
||||
@Override
|
||||
protected Object decode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
if (!(msg instanceof ChannelBuffer))
|
||||
return msg;
|
||||
if (!enabled)
|
||||
return msg;
|
||||
final ChannelBuffer buffer = (ChannelBuffer) msg;
|
||||
|
||||
final int offset = buffer.readerIndex();
|
||||
final int size = buffer.readableBytes();
|
||||
int temp = 0;
|
||||
synchronized (key) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
int temp2 = buffer.getByte(offset + i) & 0xFF;
|
||||
buffer.setByte(offset + i, (temp2 ^ key.get(i) ^ temp));
|
||||
temp = temp2;
|
||||
}
|
||||
key.update(size);
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a random key and enables descrypting
|
||||
*
|
||||
* @param key
|
||||
* the key
|
||||
*/
|
||||
public void enable(Lineage2CryptographyKey key) {
|
||||
this.setKey(key);
|
||||
this.setEnabled(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set this decrypter key. The key can only be set once.
|
||||
*
|
||||
* @param key
|
||||
* the key
|
||||
*/
|
||||
public void setKey(Lineage2CryptographyKey key) {
|
||||
if (this.key != null)
|
||||
throw new IllegalStateException("Key is already set");
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if decrypter is enabled
|
||||
*/
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the state of this decrypter
|
||||
*
|
||||
* @param enabled
|
||||
* the new state
|
||||
*/
|
||||
public void setEnabled(boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.codec;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2CryptographyKey;
|
||||
|
||||
/**
|
||||
* Encrypts Lineage II packets
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class Lineage2Encrypter extends OneToOneEncoder {
|
||||
/**
|
||||
* The handler name
|
||||
*/
|
||||
public static final String HANDLER_NAME = "crypto.encoder";
|
||||
|
||||
/**
|
||||
* Enabled state
|
||||
*/
|
||||
private boolean enabled = false;
|
||||
/**
|
||||
* Crypto key
|
||||
*/
|
||||
private Lineage2CryptographyKey key;
|
||||
|
||||
@Override
|
||||
protected Object encode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
if (!(msg instanceof ChannelBuffer))
|
||||
return msg;
|
||||
if (!enabled)
|
||||
return msg;
|
||||
final ChannelBuffer buffer = (ChannelBuffer) msg;
|
||||
|
||||
final int offset = buffer.readerIndex() + 2; // skip header
|
||||
final int size = buffer.readableBytes() - 2;
|
||||
int temp = 0, temp2 = 0;
|
||||
synchronized (key) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
temp2 = buffer.getByte(offset + i) & 0xFF;
|
||||
temp = temp2 ^ key.get(i) ^ temp;
|
||||
buffer.setByte(offset + i, (byte) temp);
|
||||
}
|
||||
key.update(size);
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables this encrypter with the given <tt>key</tt>
|
||||
*
|
||||
* @param key
|
||||
* the key
|
||||
*/
|
||||
public void enable(Lineage2CryptographyKey key) {
|
||||
this.setKey(key);
|
||||
this.setEnabled(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set this decrypter key. The key can only be set once.
|
||||
*
|
||||
* @param key
|
||||
* the key
|
||||
*/
|
||||
public void setKey(Lineage2CryptographyKey key) {
|
||||
if (this.key != null)
|
||||
throw new IllegalStateException("Key is already set");
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this encrypter is enabled
|
||||
*/
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the state of this encrypter
|
||||
*
|
||||
* @param enabled
|
||||
* the new state
|
||||
*/
|
||||
public void setEnabled(boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.codec;
|
||||
|
||||
import java.nio.ByteOrder;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.buffer.ChannelBuffers;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.frame.FrameDecoder;
|
||||
|
||||
/**
|
||||
* This decoder parses Lineage II frames. Each frame is has a header of 2 bytes
|
||||
* unsigned short.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class Lineage2FrameDecoder extends FrameDecoder {
|
||||
/**
|
||||
* The message header size (in bytes)
|
||||
*/
|
||||
private static final int HEADER_SIZE = 2;
|
||||
|
||||
@Override
|
||||
protected Object decode(ChannelHandlerContext ctx, Channel channel,
|
||||
ChannelBuffer oldBuffer) throws Exception {
|
||||
if (oldBuffer.readableBytes() < 2)
|
||||
return null;
|
||||
ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(oldBuffer
|
||||
.toByteBuffer().order(ByteOrder.LITTLE_ENDIAN));
|
||||
|
||||
buffer.markReaderIndex();
|
||||
final int pending = buffer.readUnsignedShort() - HEADER_SIZE;
|
||||
if (pending == 0)
|
||||
return null;
|
||||
if (buffer.readableBytes() < pending) {
|
||||
buffer.resetReaderIndex();
|
||||
return null;
|
||||
}
|
||||
|
||||
final ChannelBuffer b = buffer.copy(buffer.readerIndex(), pending);
|
||||
oldBuffer.skipBytes(pending + HEADER_SIZE);
|
||||
return ChannelBuffers.wrappedBuffer(b.toByteBuffer().order(
|
||||
ByteOrder.LITTLE_ENDIAN));
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.codec;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
|
||||
|
||||
/**
|
||||
* This encoder creates Lineage II frames. Each frame is has a header of 2 bytes
|
||||
* unsigned short.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class Lineage2FrameEncoder extends OneToOneEncoder {
|
||||
@Override
|
||||
protected Object encode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
if (!(msg instanceof ChannelBuffer))
|
||||
return msg;
|
||||
final ChannelBuffer buffer = (ChannelBuffer) msg;
|
||||
buffer.setShort(0, buffer.readableBytes());
|
||||
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
@@ -1,226 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.codec;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneDecoder;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Injector;
|
||||
import com.l2jserver.game.net.packet.client.CM_ACTION_USE;
|
||||
import com.l2jserver.game.net.packet.client.CM_ADMIN_COMMAND;
|
||||
import com.l2jserver.game.net.packet.client.CM_AUTH_LOGIN;
|
||||
import com.l2jserver.game.net.packet.client.CM_BYPASS;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_ACTION;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_APPEARING;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_ATTACK;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_CHAT;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_CREATE;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_MOVE;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_OPEN_MAP;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_POSITION;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_REQ_INVENTORY;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_SELECT;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_SHORTCUT_CREATE;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_SHORTCUT_REMOVE;
|
||||
import com.l2jserver.game.net.packet.client.CM_CHAR_TARGET_UNSELECT;
|
||||
import com.l2jserver.game.net.packet.client.CM_ENTER_WORLD;
|
||||
import com.l2jserver.game.net.packet.client.CM_EXT_REQ_ALL_FORTRESS_INFO;
|
||||
import com.l2jserver.game.net.packet.client.CM_EXT_REQ_KEY_MAPPING;
|
||||
import com.l2jserver.game.net.packet.client.CM_EXT_REQ_MANOR_LIST;
|
||||
import com.l2jserver.game.net.packet.client.CM_GG_KEY;
|
||||
import com.l2jserver.game.net.packet.client.CM_GOTO_LOBBY;
|
||||
import com.l2jserver.game.net.packet.client.CM_ITEM_DESTROY;
|
||||
import com.l2jserver.game.net.packet.client.CM_ITEM_DROP;
|
||||
import com.l2jserver.game.net.packet.client.CM_LOGOUT;
|
||||
import com.l2jserver.game.net.packet.client.CM_PROTOCOL_VERSION;
|
||||
import com.l2jserver.game.net.packet.client.CM_REQUEST_CHAR_TEMPLATE;
|
||||
import com.l2jserver.game.net.packet.client.CM_RESTART;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.ClientPacket;
|
||||
|
||||
/**
|
||||
* This decoder reads an frame and decodes the packet in it. Each packet has an
|
||||
* fixed single opcode byte. Once the packet has been identified, reading is
|
||||
* done by the {@link ClientPacket} class.
|
||||
* <p>
|
||||
* Note that some packets have an additional opcode. This class also handle
|
||||
* those cases.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class Lineage2PacketReader extends OneToOneDecoder {
|
||||
/**
|
||||
* The handler name
|
||||
*/
|
||||
public static final String HANDLER_NAME = "packet.reader";
|
||||
|
||||
/**
|
||||
* The Google Guice {@link Injector}
|
||||
*/
|
||||
private final Injector injector;
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private final Logger logger = LoggerFactory
|
||||
.getLogger(Lineage2PacketReader.class);
|
||||
|
||||
/**
|
||||
* The active Lineage 2 connection
|
||||
*/
|
||||
private Lineage2Client connection;
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
*
|
||||
* @param injector
|
||||
* the injector
|
||||
*/
|
||||
@Inject
|
||||
public Lineage2PacketReader(Injector injector) {
|
||||
this.injector = injector;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object decode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
if (!(msg instanceof ChannelBuffer))
|
||||
return msg;
|
||||
final ChannelBuffer buffer = (ChannelBuffer) msg;
|
||||
final ClientPacket packet = createPacket(getPacketClass(buffer));
|
||||
if (packet == null)
|
||||
return null;
|
||||
packet.read(connection, buffer);
|
||||
return packet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Crates a new instance of the packet <tt>type</tt>
|
||||
*
|
||||
* @param type
|
||||
* the packet type
|
||||
* @return the created packet
|
||||
*/
|
||||
private ClientPacket createPacket(Class<? extends ClientPacket> type) {
|
||||
if (type == null)
|
||||
return null;
|
||||
return injector.getInstance(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Discovers the packet type
|
||||
*
|
||||
* @param buffer
|
||||
* the buffer
|
||||
* @return the packet class
|
||||
*/
|
||||
private Class<? extends ClientPacket> getPacketClass(ChannelBuffer buffer) {
|
||||
final short opcode = buffer.readUnsignedByte();
|
||||
switch (opcode) {
|
||||
case CM_LOGOUT.OPCODE:
|
||||
return CM_LOGOUT.class;
|
||||
case CM_PROTOCOL_VERSION.OPCODE:
|
||||
return CM_PROTOCOL_VERSION.class;
|
||||
case CM_AUTH_LOGIN.OPCODE:
|
||||
return CM_AUTH_LOGIN.class;
|
||||
case CM_CHAR_CREATE.OPCODE:
|
||||
return CM_CHAR_CREATE.class;
|
||||
case CM_REQUEST_CHAR_TEMPLATE.OPCODE:
|
||||
return CM_REQUEST_CHAR_TEMPLATE.class;
|
||||
case 0xd0: // CM_REQ_**************
|
||||
final int opcode2 = buffer.readUnsignedShort();
|
||||
switch (opcode2) {
|
||||
case CM_GOTO_LOBBY.OPCODE2:
|
||||
return CM_GOTO_LOBBY.class;
|
||||
case CM_EXT_REQ_KEY_MAPPING.OPCODE2:
|
||||
return CM_EXT_REQ_KEY_MAPPING.class;
|
||||
case CM_EXT_REQ_MANOR_LIST.OPCODE2:
|
||||
return CM_EXT_REQ_MANOR_LIST.class;
|
||||
case CM_EXT_REQ_ALL_FORTRESS_INFO.OPCODE2:
|
||||
return CM_EXT_REQ_ALL_FORTRESS_INFO.class;
|
||||
default:
|
||||
logger.warn("Unknown packet for 0xd0{}",
|
||||
Integer.toHexString(opcode2));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case CM_CHAR_SELECT.OPCODE:
|
||||
return CM_CHAR_SELECT.class;
|
||||
case CM_GG_KEY.OPCODE:
|
||||
return CM_GG_KEY.class;
|
||||
case CM_CHAR_MOVE.OPCODE:
|
||||
return CM_CHAR_MOVE.class;
|
||||
case CM_RESTART.OPCODE:
|
||||
return CM_RESTART.class;
|
||||
case CM_CHAR_CHAT.OPCODE:
|
||||
return CM_CHAR_CHAT.class;
|
||||
case CM_CHAR_POSITION.OPCODE:
|
||||
return CM_CHAR_POSITION.class;
|
||||
case CM_ENTER_WORLD.OPCODE:
|
||||
return CM_ENTER_WORLD.class;
|
||||
case CM_CHAR_ACTION.OPCODE:
|
||||
return CM_CHAR_ACTION.class;
|
||||
case CM_CHAR_REQ_INVENTORY.OPCODE:
|
||||
return CM_CHAR_REQ_INVENTORY.class;
|
||||
case CM_ADMIN_COMMAND.OPCODE:
|
||||
return CM_ADMIN_COMMAND.class;
|
||||
case CM_BYPASS.OPCODE:
|
||||
return CM_BYPASS.class;
|
||||
case CM_CHAR_APPEARING.OPCODE:
|
||||
return CM_CHAR_APPEARING.class;
|
||||
case CM_ACTION_USE.OPCODE:
|
||||
return CM_ACTION_USE.class;
|
||||
case CM_CHAR_OPEN_MAP.OPCODE:
|
||||
return CM_CHAR_OPEN_MAP.class;
|
||||
case CM_CHAR_ATTACK.OPCODE:
|
||||
return CM_CHAR_ATTACK.class;
|
||||
case CM_ITEM_DROP.OPCODE:
|
||||
return CM_ITEM_DROP.class;
|
||||
case CM_ITEM_DESTROY.OPCODE:
|
||||
return CM_ITEM_DESTROY.class;
|
||||
case CM_CHAR_TARGET_UNSELECT.OPCODE:
|
||||
return CM_CHAR_TARGET_UNSELECT.class;
|
||||
case CM_CHAR_SHORTCUT_CREATE.OPCODE:
|
||||
return CM_CHAR_SHORTCUT_CREATE.class;
|
||||
case CM_CHAR_SHORTCUT_REMOVE.OPCODE:
|
||||
return CM_CHAR_SHORTCUT_REMOVE.class;
|
||||
default:
|
||||
logger.warn("Unknown packet for 0x{}", Integer.toHexString(opcode));
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the connection
|
||||
*/
|
||||
public Lineage2Client getConnection() {
|
||||
return connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param connection
|
||||
* the connection to set
|
||||
*/
|
||||
public void setConnection(Lineage2Client connection) {
|
||||
this.connection = connection;
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.codec;
|
||||
|
||||
import java.nio.ByteOrder;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.buffer.ChannelBuffers;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.ServerPacket;
|
||||
|
||||
/**
|
||||
* This encoder writes the frame content and encodes the packet in it. Each
|
||||
* packet has an fixed single opcode byte. Once the packet opcode has been
|
||||
* written, packet data is written by the {@link ServerPacket} class.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class Lineage2PacketWriter extends OneToOneEncoder {
|
||||
/**
|
||||
* The handler name
|
||||
*/
|
||||
public static final String HANDLER_NAME = "packet.writer";
|
||||
|
||||
/**
|
||||
* The active Lineage 2 connection
|
||||
*/
|
||||
private Lineage2Client connection;
|
||||
|
||||
@Override
|
||||
protected Object encode(ChannelHandlerContext ctx, Channel channel,
|
||||
Object msg) throws Exception {
|
||||
if (!(msg instanceof ServerPacket))
|
||||
return msg;
|
||||
final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(
|
||||
ByteOrder.LITTLE_ENDIAN, 10);
|
||||
final ServerPacket packet = (ServerPacket) msg;
|
||||
buffer.writeShort(0); // wrap 2 bytes for packet length
|
||||
buffer.writeByte(packet.getOpcode()); // packet opcode
|
||||
packet.write(connection, buffer);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the connection
|
||||
*/
|
||||
public Lineage2Client getConnection() {
|
||||
return connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param connection
|
||||
* the connection to set
|
||||
*/
|
||||
public void setConnection(Lineage2Client connection) {
|
||||
this.connection = connection;
|
||||
}
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.handler;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.jboss.netty.channel.ChannelException;
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.channel.ChannelStateEvent;
|
||||
import org.jboss.netty.channel.ExceptionEvent;
|
||||
import org.jboss.netty.channel.MessageEvent;
|
||||
import org.jboss.netty.channel.SimpleChannelHandler;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
import com.l2jserver.game.net.FreyaLineage2Client;
|
||||
import com.l2jserver.service.network.NettyNetworkService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.ClientPacket;
|
||||
import com.l2jserver.util.html.markup.HtmlTemplate;
|
||||
import com.l2jserver.util.html.markup.MarkupTag;
|
||||
|
||||
/**
|
||||
* This handler dispatches the {@link ClientPacket#process(Lineage2Client)}
|
||||
* method and creates a new {@link Lineage2Client} once a new channel is open.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class Lineage2PacketHandler extends SimpleChannelHandler {
|
||||
/**
|
||||
* The {@link NettyNetworkService}
|
||||
*/
|
||||
private final NettyNetworkService nettyNetworkService;
|
||||
/**
|
||||
* The timeout handler is responsible for disconnecting idle clients.
|
||||
*/
|
||||
private final Lineage2TimeoutHandler timeoutHandler;
|
||||
/**
|
||||
* The Lineage 2 connection
|
||||
*/
|
||||
private FreyaLineage2Client connection;
|
||||
|
||||
/**
|
||||
* Creates a new instance of the packet handler
|
||||
*
|
||||
* @param nettyNetworkService
|
||||
* the netty network service
|
||||
* @param timeoutHandler
|
||||
* the timeout handler
|
||||
*/
|
||||
public Lineage2PacketHandler(NettyNetworkService nettyNetworkService,
|
||||
Lineage2TimeoutHandler timeoutHandler) {
|
||||
this.nettyNetworkService = nettyNetworkService;
|
||||
this.timeoutHandler = timeoutHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e)
|
||||
throws Exception {
|
||||
connection = new FreyaLineage2Client(e.getChannel());
|
||||
connection.getPacketWriter().setConnection(connection);
|
||||
timeoutHandler.setConnection(connection);
|
||||
|
||||
nettyNetworkService.register(connection);
|
||||
|
||||
super.channelOpen(ctx, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
|
||||
throws Exception {
|
||||
final Object msg = e.getMessage();
|
||||
if (!(msg instanceof ClientPacket))
|
||||
return;
|
||||
final ClientPacket packet = (ClientPacket) msg;
|
||||
packet.process(connection);
|
||||
super.messageReceived(ctx, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeRequested(ChannelHandlerContext ctx, MessageEvent e)
|
||||
throws Exception {
|
||||
super.writeRequested(ctx, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void channelDisconnected(ChannelHandlerContext ctx,
|
||||
ChannelStateEvent e) throws Exception {
|
||||
nettyNetworkService.unregister(connection);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent event)
|
||||
throws Exception {
|
||||
final Throwable e = event.getCause();
|
||||
try {
|
||||
if (e instanceof ChannelException)
|
||||
return;
|
||||
if (e instanceof IOException)
|
||||
return;
|
||||
if (!connection.isConnected())
|
||||
// no point sending error messages if the client is disconnected
|
||||
return;
|
||||
|
||||
// TODO only send exception stack trace in development mode!
|
||||
final String exception = Throwables.getStackTraceAsString(e)
|
||||
.replaceAll("\n", "<br>").replace(" ", "");
|
||||
final HtmlTemplate template = new HtmlTemplate("Java Exception") {
|
||||
@Override
|
||||
public void build(MarkupTag body) {
|
||||
body.text(exception);
|
||||
}
|
||||
};
|
||||
connection.sendHTML(template);
|
||||
// order client not to wait any packet
|
||||
connection.sendActionFailed();
|
||||
|
||||
final String[] lines = Throwables.getStackTraceAsString(e).split(
|
||||
"\n");
|
||||
for (final String line : lines) {
|
||||
connection.sendMessage(line);
|
||||
}
|
||||
} finally {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.handler;
|
||||
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler;
|
||||
import org.jboss.netty.handler.timeout.IdleStateEvent;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*
|
||||
*/
|
||||
public class Lineage2TimeoutHandler extends IdleStateAwareChannelHandler {
|
||||
/**
|
||||
* The Lineage 2 connection
|
||||
*/
|
||||
private Lineage2Client connection;
|
||||
|
||||
@Override
|
||||
public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e)
|
||||
throws Exception {
|
||||
if (connection != null) {
|
||||
connection.close();
|
||||
}
|
||||
super.channelIdle(ctx, e);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the connection
|
||||
*/
|
||||
protected Lineage2Client getConnection() {
|
||||
return connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param connection
|
||||
* the connection to set
|
||||
*/
|
||||
protected void setConnection(Lineage2Client connection) {
|
||||
this.connection = connection;
|
||||
}
|
||||
}
|
||||
@@ -1,205 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.model.world.L2Character.CharacterMoveType;
|
||||
import com.l2jserver.service.game.character.CharacterAlreadyRunningServiceException;
|
||||
import com.l2jserver.service.game.character.CharacterAlreadyWalkingServiceException;
|
||||
import com.l2jserver.service.game.character.CharacterService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* This packet notifies the server which character the player has chosen to use.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_ACTION_USE extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x56;
|
||||
|
||||
/**
|
||||
* The {@link CharacterService}
|
||||
*/
|
||||
private final CharacterService charService;
|
||||
|
||||
/**
|
||||
* The action to be performed
|
||||
*/
|
||||
private Action action;
|
||||
|
||||
/**
|
||||
* The enumeration of all possible actions
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public enum Action {
|
||||
/**
|
||||
* Toggles the character in SIT or STAND mode
|
||||
*/
|
||||
SIT_STAND(0),
|
||||
/**
|
||||
* Toggles the character in WALK or RUN mode
|
||||
*/
|
||||
WALK_RUN(1),
|
||||
|
||||
/**
|
||||
* Stats a new private store sell
|
||||
*/
|
||||
PRIVATE_STORE_SELL(10),
|
||||
/**
|
||||
* Stats a new private store buy
|
||||
*/
|
||||
PRIVATE_STORE_BUY(11),
|
||||
/**
|
||||
* Sets the pet in follow mode
|
||||
*/
|
||||
PET_FOLLOW_MOVE(15),
|
||||
/**
|
||||
* Sets the pet in follow mode 2
|
||||
*/
|
||||
PET_FOLLOW_MOVE2(21),
|
||||
/**
|
||||
* Orders the pet to attack
|
||||
*/
|
||||
PET_ATTACK(16),
|
||||
/**
|
||||
* Orders the pet to attack (second type)
|
||||
*/
|
||||
PET_ATTACK2(22),
|
||||
/**
|
||||
* Orders the pet to stop
|
||||
*/
|
||||
PET_STOP(17),
|
||||
/**
|
||||
* Orders the pet to stop (second type)
|
||||
*/
|
||||
PET_STOP2(23),
|
||||
/**
|
||||
* Unsummons the pet
|
||||
*/
|
||||
PET_UNSUMMON(19),
|
||||
/**
|
||||
* Mounts or dismount from pet
|
||||
*/
|
||||
MOUNT_DISMOUNT(38),
|
||||
/**
|
||||
* Switch Wild Hog Cannon mode
|
||||
*/
|
||||
WILD_HOG_CANNON_SWITCH_MODE(32),
|
||||
/**
|
||||
* Stops Wild Hog Cannon
|
||||
*/
|
||||
WILD_HOG_CANNON_STOP(41),
|
||||
|
||||
/**
|
||||
* Souless toxic smoke
|
||||
*/
|
||||
SOULESS_TOXIC_SMOKE(36),
|
||||
/**
|
||||
* Souless parasite burst
|
||||
*/
|
||||
SOULESS_PARASITE_BURST(39),
|
||||
/**
|
||||
* Creates a new darwven manufacture
|
||||
*/
|
||||
DWARVEN_MANUFACTURE(37);
|
||||
|
||||
/**
|
||||
* The numeric action id
|
||||
*/
|
||||
public final int id;
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the numeric action id
|
||||
*/
|
||||
Action(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the numeric id into an Java type action
|
||||
*
|
||||
* @param id
|
||||
* the numeric id
|
||||
* @return the resolved action
|
||||
*/
|
||||
public static Action fromID(int id) {
|
||||
for (final Action action : values())
|
||||
if (action.id == id)
|
||||
return action;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If CTRL key was pressed for this action
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private boolean ctrlPressed;
|
||||
/**
|
||||
* If SHIFT key was pressed for this action
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private boolean shiftPressed;
|
||||
|
||||
/**
|
||||
* @param charService
|
||||
* the character service
|
||||
*/
|
||||
@Inject
|
||||
public CM_ACTION_USE(CharacterService charService) {
|
||||
this.charService = charService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
action = Action.fromID(buffer.readInt());
|
||||
ctrlPressed = (buffer.readByte() == 1 ? true : false);
|
||||
shiftPressed = (buffer.readByte() == 1 ? true : false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final L2Character character = conn.getCharacter();
|
||||
switch (action) {
|
||||
case SIT_STAND:
|
||||
// TODO
|
||||
break;
|
||||
case WALK_RUN:
|
||||
try {
|
||||
if (character.getMoveType() == CharacterMoveType.WALK) {
|
||||
charService.run(character);
|
||||
} else {
|
||||
charService.walk(character);
|
||||
}
|
||||
} catch (CharacterAlreadyWalkingServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
} catch (CharacterAlreadyRunningServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.service.ServiceException;
|
||||
import com.l2jserver.service.game.admin.AdministratorService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* Executes an administrator action
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_ADMIN_COMMAND extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x74;
|
||||
|
||||
/**
|
||||
* The admin service
|
||||
*/
|
||||
private final AdministratorService adminService;
|
||||
|
||||
/**
|
||||
* The command
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private String command;
|
||||
|
||||
/**
|
||||
* @param adminService
|
||||
* the administrator service
|
||||
*/
|
||||
@Inject
|
||||
public CM_ADMIN_COMMAND(AdministratorService adminService) {
|
||||
this.adminService = adminService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
command = BufferUtils.readString(buffer).trim();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
// final StringTokenizer tokenizer = new StringTokenizer(command, " ");
|
||||
// final String cmd = tokenizer.nextToken();
|
||||
// if (cmd.equals("tele")) {
|
||||
// Coordinate coord = Coordinate.fromXYZ(
|
||||
// Integer.parseInt(tokenizer.nextToken()),
|
||||
// Integer.parseInt(tokenizer.nextToken()),
|
||||
// Integer.parseInt(tokenizer.nextToken()));
|
||||
// try {
|
||||
// spawnService.teleport(conn.getCharacter(), coord);
|
||||
// } catch (NotSpawnedServiceException e) {
|
||||
// conn.sendActionFailed();
|
||||
// } catch (CharacterAlreadyTeleportingServiceException e) {
|
||||
// conn.sendActionFailed();
|
||||
// }
|
||||
// }
|
||||
try {
|
||||
adminService
|
||||
.command(conn, conn.getCharacter(), "", new String[] {});
|
||||
} catch (ServiceException e) {
|
||||
conn.sendMessage("Invalid administrator command or syntax");
|
||||
} finally {
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
|
||||
// TODO implement admin commands
|
||||
}
|
||||
}
|
||||
@@ -1,145 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_LIST;
|
||||
import com.l2jserver.model.dao.CharacterDAO;
|
||||
import com.l2jserver.model.id.AccountID;
|
||||
import com.l2jserver.model.id.provider.AccountIDProvider;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.Lineage2Session;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This packet is sent by the client once the login server has authorized
|
||||
* authentication into this server. A new {@link Lineage2Session} object will be
|
||||
* set to the current connection and the character list is sent to the client.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_AUTH_LOGIN 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 AccountIDProvider accountIdFactory;
|
||||
|
||||
// packet
|
||||
/**
|
||||
* User account name
|
||||
*/
|
||||
private String loginName;
|
||||
/**
|
||||
* The play key 1
|
||||
*/
|
||||
private int playKey1;
|
||||
/**
|
||||
* The play key 2
|
||||
*/
|
||||
private int playKey2;
|
||||
/**
|
||||
* The login key 1
|
||||
*/
|
||||
private int loginKey1;
|
||||
/**
|
||||
* The login key 2
|
||||
*/
|
||||
private int loginKey2;
|
||||
|
||||
/**
|
||||
* @param characterDao
|
||||
* the character DAO
|
||||
* @param accountIdFactory
|
||||
* the account id factory
|
||||
*/
|
||||
@Inject
|
||||
public CM_AUTH_LOGIN(CharacterDAO characterDao,
|
||||
AccountIDProvider accountIdFactory) {
|
||||
this.characterDao = characterDao;
|
||||
this.accountIdFactory = accountIdFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
this.loginName = BufferUtils.readString(buffer).toLowerCase();
|
||||
this.playKey1 = buffer.readInt();
|
||||
this.playKey2 = buffer.readInt();
|
||||
this.loginKey1 = buffer.readInt();
|
||||
this.loginKey2 = buffer.readInt();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final AccountID accountId = accountIdFactory.resolveID(loginName);
|
||||
conn.setSession(new Lineage2Session(accountId, playKey1, playKey2,
|
||||
loginKey1, loginKey2));
|
||||
|
||||
final List<L2Character> chars = characterDao.selectByAccount(accountId);
|
||||
conn.write(SM_CHAR_LIST.fromL2Session(conn.getSession(),
|
||||
chars.toArray(new L2Character[chars.size()])));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the loginName
|
||||
*/
|
||||
public String getLoginName() {
|
||||
return loginName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the playKey1
|
||||
*/
|
||||
public int getPlayKey1() {
|
||||
return playKey1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the playKey2
|
||||
*/
|
||||
public int getPlayKey2() {
|
||||
return playKey2;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the loginKey1
|
||||
*/
|
||||
public int getLoginKey1() {
|
||||
return loginKey1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the loginKey2
|
||||
*/
|
||||
public int getLoginKey2() {
|
||||
return loginKey2;
|
||||
}
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.model.id.ObjectID;
|
||||
import com.l2jserver.model.id.object.NPCID;
|
||||
import com.l2jserver.model.id.object.provider.ObjectIDResolver;
|
||||
import com.l2jserver.model.world.NPC;
|
||||
import com.l2jserver.model.world.npc.NPCController.NPCControllerException;
|
||||
import com.l2jserver.service.game.character.CannotSetTargetServiceException;
|
||||
import com.l2jserver.service.game.npc.ActionServiceException;
|
||||
import com.l2jserver.service.game.npc.NPCService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* Executes an bypass command
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_BYPASS extends AbstractClientPacket {
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private final Logger log = LoggerFactory.getLogger(this.getClass());
|
||||
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x23;
|
||||
|
||||
/**
|
||||
* The {@link ObjectID} resolver
|
||||
*/
|
||||
private final ObjectIDResolver idResolver;
|
||||
/**
|
||||
* The {@link NPC} service
|
||||
*/
|
||||
private final NPCService npcService;
|
||||
|
||||
/**
|
||||
* The bypass command
|
||||
*/
|
||||
private String command;
|
||||
|
||||
/**
|
||||
* @param idResolver
|
||||
* the object id resolver
|
||||
* @param npcService
|
||||
* the {@link NPC} service
|
||||
*/
|
||||
@Inject
|
||||
public CM_BYPASS(ObjectIDResolver idResolver, NPCService npcService) {
|
||||
this.idResolver = idResolver;
|
||||
this.npcService = npcService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
this.command = BufferUtils.readString(buffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
// parse command
|
||||
final StringTokenizer tokenizer = new StringTokenizer(command, "_ ");
|
||||
final String type = tokenizer.nextToken();
|
||||
switch (type) {
|
||||
case "npc":
|
||||
final int objectId = Integer.parseInt(tokenizer.nextToken());
|
||||
final ObjectID<NPC> id = idResolver.resolve(objectId);
|
||||
if (!(id instanceof NPCID)) {
|
||||
conn.sendActionFailed();
|
||||
return;
|
||||
}
|
||||
final NPC npc = id.getObject();
|
||||
try {
|
||||
npcService.action(npc, conn.getCharacter(),
|
||||
createArgumentArray(tokenizer));
|
||||
} catch (ActionServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
} catch (CannotSetTargetServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
} catch (NPCControllerException e) {
|
||||
if (e.getSystemMessage() != null)
|
||||
conn.sendSystemMessage(e.getSystemMessage());
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
return;
|
||||
default:
|
||||
log.warn(
|
||||
"Client {} requested an bypass not supported by server: {}",
|
||||
conn, type);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param tokenizer
|
||||
* the tokenizer
|
||||
* @return an array of strings with each parameter
|
||||
*/
|
||||
private String[] createArgumentArray(StringTokenizer tokenizer) {
|
||||
if (!tokenizer.hasMoreTokens())
|
||||
return new String[0];
|
||||
final String[] args = new String[tokenizer.countTokens()];
|
||||
int i = 0;
|
||||
while (tokenizer.hasMoreTokens()) {
|
||||
args[i++] = tokenizer.nextToken();
|
||||
}
|
||||
return args;
|
||||
}
|
||||
}
|
||||
@@ -1,142 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.model.id.ObjectID;
|
||||
import com.l2jserver.model.id.object.ItemID;
|
||||
import com.l2jserver.model.id.object.NPCID;
|
||||
import com.l2jserver.model.id.object.provider.ObjectIDResolver;
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.NPC;
|
||||
import com.l2jserver.model.world.npc.NPCController.NPCControllerException;
|
||||
import com.l2jserver.service.game.character.CannotSetTargetServiceException;
|
||||
import com.l2jserver.service.game.character.CharacterAction;
|
||||
import com.l2jserver.service.game.item.ItemNotOnGroundServiceException;
|
||||
import com.l2jserver.service.game.item.ItemService;
|
||||
import com.l2jserver.service.game.npc.ActionServiceException;
|
||||
import com.l2jserver.service.game.npc.NPCService;
|
||||
import com.l2jserver.service.game.spawn.NotSpawnedServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.SystemMessage;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.geometry.Coordinate;
|
||||
|
||||
/**
|
||||
* Executes an action from an character to an NPC
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_ACTION extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x1f;
|
||||
|
||||
/**
|
||||
* The {@link ObjectID} resolver
|
||||
*/
|
||||
private final ObjectIDResolver idResolver;
|
||||
/**
|
||||
* The {@link NPC} Service
|
||||
*/
|
||||
private final NPCService npcService;
|
||||
/**
|
||||
* The {@link Item} Service
|
||||
*/
|
||||
private final ItemService itemService;
|
||||
|
||||
/**
|
||||
* The object id
|
||||
*/
|
||||
private int objectId;
|
||||
/**
|
||||
* The action origin
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private Coordinate origin;
|
||||
/**
|
||||
* The character action type (aka mouse button)
|
||||
*/
|
||||
private CharacterAction action;
|
||||
|
||||
/**
|
||||
* @param idResolver
|
||||
* the id resolver
|
||||
* @param npcService
|
||||
* the npc service
|
||||
* @param itemService
|
||||
* the item service
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_ACTION(ObjectIDResolver idResolver, NPCService npcService,
|
||||
ItemService itemService) {
|
||||
this.idResolver = idResolver;
|
||||
this.npcService = npcService;
|
||||
this.itemService = itemService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
this.objectId = buffer.readInt();
|
||||
this.origin = Coordinate.fromXYZ(buffer.readInt(), buffer.readInt(),
|
||||
buffer.readInt());
|
||||
this.action = CharacterAction.fromID(buffer.readByte());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final ObjectID<?> id = idResolver.resolve(objectId);
|
||||
if (id instanceof NPCID) {
|
||||
final NPC npc = ((NPCID) id).getObject();
|
||||
try {
|
||||
npcService.action(npc, conn.getCharacter(), action);
|
||||
} catch (NPCControllerException e) {
|
||||
if (e.getSystemMessage() != null)
|
||||
conn.sendSystemMessage(e.getSystemMessage());
|
||||
conn.sendActionFailed();
|
||||
} catch (ActionServiceException | CannotSetTargetServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
} else if (id instanceof ItemID) {
|
||||
final Item item = ((ItemID) id).getObject();
|
||||
try {
|
||||
final Item stackItem = itemService.action(item,
|
||||
conn.getCharacter(), action);
|
||||
if (stackItem.equals(item)) { // adds
|
||||
conn.addInventoryItems(stackItem);
|
||||
} else { // update only
|
||||
conn.updateInventoryItems(stackItem);
|
||||
}
|
||||
conn.sendSystemMessage(SystemMessage.YOU_PICKED_UP_S2_S1, Long
|
||||
.toString(item.getCount()), item.getTemplate()
|
||||
.getName());
|
||||
conn.sendActionFailed();
|
||||
} catch (ItemNotOnGroundServiceException
|
||||
| NotSpawnedServiceException e) {
|
||||
conn.sendSystemMessage(SystemMessage.FAILED_TO_PICKUP_S1, item
|
||||
.getTemplate().getName());
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
} else {
|
||||
conn.sendActionFailed();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.service.game.spawn.CharacterNotTeleportingServiceException;
|
||||
import com.l2jserver.service.game.spawn.SpawnService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* Completes the creation of an character. Creates the object, inserts into the
|
||||
* database and notifies the client about the status of the operation.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_APPEARING extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x3a;
|
||||
|
||||
/**
|
||||
* The {@link SpawnService}
|
||||
*/
|
||||
private final SpawnService spawnService;
|
||||
|
||||
/**
|
||||
* @param spawnService
|
||||
* the spawn service
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_APPEARING(SpawnService spawnService) {
|
||||
this.spawnService = spawnService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
try {
|
||||
spawnService.finishTeleport(conn.getCharacter());
|
||||
} catch (CharacterNotTeleportingServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_ACTION_FAILED;
|
||||
import com.l2jserver.model.id.ObjectID;
|
||||
import com.l2jserver.model.id.object.ActorID;
|
||||
import com.l2jserver.model.id.object.provider.ObjectIDResolver;
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.game.character.ActorIsNotAttackableServiceException;
|
||||
import com.l2jserver.service.game.character.CannotSetTargetServiceException;
|
||||
import com.l2jserver.service.game.character.CharacterService;
|
||||
import com.l2jserver.service.game.npc.NotAttackableNPCServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.geometry.Coordinate;
|
||||
|
||||
/**
|
||||
* Completes the creation of an character. Creates the object, inserts into the
|
||||
* database and notifies the client about the status of the operation.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_ATTACK extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x01;
|
||||
|
||||
/**
|
||||
* The Logger
|
||||
*/
|
||||
private final Logger log = LoggerFactory.getLogger(this.getClass());
|
||||
|
||||
/**
|
||||
* The {@link CharacterService}
|
||||
*/
|
||||
private final CharacterService charService;
|
||||
/**
|
||||
* The {@link ObjectID} resolver
|
||||
*/
|
||||
private final ObjectIDResolver idResolver;
|
||||
|
||||
/**
|
||||
* The {@link ObjectID} being attacked
|
||||
*/
|
||||
private int objectId;
|
||||
/**
|
||||
* The position of the target
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private Coordinate origin;
|
||||
/**
|
||||
* The attack action type
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private CharacterAttackAction action;
|
||||
|
||||
/**
|
||||
* Enumeration of all possible attack actions
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public enum CharacterAttackAction {
|
||||
/**
|
||||
* Normal click
|
||||
*/
|
||||
CLICK(0),
|
||||
/**
|
||||
* Clicked with shift-click
|
||||
*/
|
||||
SHIFT_CLICK(1);
|
||||
|
||||
/**
|
||||
* The attack action numeric id
|
||||
*/
|
||||
public final int id;
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the action numeric id
|
||||
*/
|
||||
CharacterAttackAction(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the numeric action id to an {@link CharacterAttackAction}
|
||||
* type
|
||||
*
|
||||
* @param id
|
||||
* the numeric id
|
||||
* @return the resolved action
|
||||
*/
|
||||
public static CharacterAttackAction fromID(int id) {
|
||||
for (final CharacterAttackAction action : values())
|
||||
if (action.id == id)
|
||||
return action;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param charService
|
||||
* the character service
|
||||
* @param idResolver
|
||||
* the object id resolver
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_ATTACK(CharacterService charService,
|
||||
ObjectIDResolver idResolver) {
|
||||
this.charService = charService;
|
||||
this.idResolver = idResolver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
this.objectId = buffer.readInt();
|
||||
this.origin = Coordinate.fromXYZ(buffer.readInt(), buffer.readInt(),
|
||||
buffer.readInt());
|
||||
this.action = CharacterAttackAction.fromID(buffer.readByte());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final L2Character character = conn.getCharacter();
|
||||
// since this is an erasure type, this is safe.
|
||||
final ObjectID<Actor> id = idResolver.resolve(objectId);
|
||||
if (!(id instanceof ActorID)) {
|
||||
conn.write(SM_ACTION_FAILED.SHARED_INSTANCE);
|
||||
log.warn("Player {} is trying to attack {}, which is not an actor",
|
||||
character, id);
|
||||
return;
|
||||
}
|
||||
final Actor actor = id.getObject();
|
||||
try {
|
||||
charService.attack(character, actor);
|
||||
} catch (CannotSetTargetServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
} catch (ActorIsNotAttackableServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
} catch (NotAttackableNPCServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_ACTION_FAILED;
|
||||
import com.l2jserver.service.game.chat.CannotChatToSelfChatServiceException;
|
||||
import com.l2jserver.service.game.chat.ChatBanActiveChatServiceException;
|
||||
import com.l2jserver.service.game.chat.ChatMessageType;
|
||||
import com.l2jserver.service.game.chat.ChatService;
|
||||
import com.l2jserver.service.game.chat.ChatTargetOfflineServiceException;
|
||||
import com.l2jserver.service.game.chat.TargetNotFoundChatServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.SystemMessage;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* Completes the creation of an character. Creates the object, inserts into the
|
||||
* database and notifies the client about the status of the operation.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_CHAT extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x49;
|
||||
|
||||
// services and daos
|
||||
/**
|
||||
* The {@link ChatService} implementation
|
||||
*/
|
||||
private final ChatService chatService;
|
||||
|
||||
/**
|
||||
* The message
|
||||
*/
|
||||
private String message;
|
||||
/**
|
||||
* The message destination
|
||||
*/
|
||||
private ChatMessageType destination;
|
||||
/**
|
||||
* The message target
|
||||
*/
|
||||
private String target;
|
||||
|
||||
/**
|
||||
* @param chatService
|
||||
* the chat service
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_CHAT(ChatService chatService) {
|
||||
this.chatService = chatService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
this.message = BufferUtils.readString(buffer);
|
||||
this.destination = ChatMessageType.fromID(buffer.readInt());
|
||||
if (this.destination == ChatMessageType.TELL) { // private
|
||||
// message
|
||||
this.target = BufferUtils.readString(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
if (message.length() == 0 || destination == null) {
|
||||
conn.write(SM_ACTION_FAILED.SHARED_INSTANCE);
|
||||
conn.close();
|
||||
}
|
||||
|
||||
try {
|
||||
chatService.send(conn.getCharacterID(), destination, message,
|
||||
target);
|
||||
} catch (TargetNotFoundChatServiceException e) {
|
||||
conn.sendSystemMessage(SystemMessage.TARGET_CANT_FOUND);
|
||||
} catch (CannotChatToSelfChatServiceException e) {
|
||||
conn.sendSystemMessage(SystemMessage.CANNOT_USE_ON_YOURSELF);
|
||||
} catch (ChatBanActiveChatServiceException e) {
|
||||
conn.sendSystemMessage(SystemMessage.CHATTING_IS_CURRENTLY_PROHIBITED);
|
||||
} catch (ChatTargetOfflineServiceException e) {
|
||||
conn.sendSystemMessage(SystemMessage.S1_IS_NOT_ONLINE, target);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,190 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import static com.l2jserver.game.net.packet.server.SM_CHAR_CREATE_FAIL.Reason.REASON_16_ENG_CHARS;
|
||||
import static com.l2jserver.game.net.packet.server.SM_CHAR_CREATE_FAIL.Reason.REASON_CHOOSE_ANOTHER_SVR;
|
||||
import static com.l2jserver.game.net.packet.server.SM_CHAR_CREATE_FAIL.Reason.REASON_CREATION_FAILED;
|
||||
import static com.l2jserver.game.net.packet.server.SM_CHAR_CREATE_FAIL.Reason.REASON_NAME_ALREADY_EXISTS;
|
||||
import static com.l2jserver.game.net.packet.server.SM_CHAR_CREATE_FAIL.Reason.REASON_TOO_MANY_CHARACTERS;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_CREATE_OK;
|
||||
import com.l2jserver.model.template.actor.ActorSex;
|
||||
import com.l2jserver.model.template.character.CharacterClass;
|
||||
import com.l2jserver.model.template.character.CharacterRace;
|
||||
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.service.game.character.CharacteCreationNotAllowedException;
|
||||
import com.l2jserver.service.game.character.CharacterInvalidAppearanceException;
|
||||
import com.l2jserver.service.game.character.CharacterInvalidNameException;
|
||||
import com.l2jserver.service.game.character.CharacterInvalidRaceException;
|
||||
import com.l2jserver.service.game.character.CharacterInvalidSexException;
|
||||
import com.l2jserver.service.game.character.CharacterNameAlreadyExistsException;
|
||||
import com.l2jserver.service.game.character.CharacterService;
|
||||
import com.l2jserver.service.game.character.TooManyCharactersException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* Completes the creation of an character. Creates the object, inserts into the
|
||||
* database and notifies the client about the status of the operation.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_CREATE extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x0c;
|
||||
|
||||
// services and daos
|
||||
/**
|
||||
* The {@link CharacterService} implementation
|
||||
*/
|
||||
private final CharacterService characterService;
|
||||
|
||||
// packet
|
||||
/**
|
||||
* The name of the new character
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* The race of the new character. Note that this is ignored and the template
|
||||
* value is used.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private CharacterRace race;
|
||||
/**
|
||||
* The sex of the new character. Note that this is ignored and the template
|
||||
* value is used.
|
||||
*/
|
||||
private ActorSex sex;
|
||||
/**
|
||||
* The class of the new character
|
||||
*/
|
||||
private CharacterClass characterClass;
|
||||
|
||||
/**
|
||||
* The new character intelligence. Note that this is ignored and the
|
||||
* template value is used.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private int intelligence;
|
||||
/**
|
||||
* The new character intelligence. Note that this is ignored and the
|
||||
* template value is used.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private int strength;
|
||||
/**
|
||||
* The new character strength. Note that this is ignored and the template
|
||||
* value is used.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private int concentration;
|
||||
/**
|
||||
* The new character concentration. Note that this is ignored and the
|
||||
* template value is used.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private int mentality;
|
||||
/**
|
||||
* The new character mentality. Note that this is ignored and the template
|
||||
* value is used.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private int dexterity;
|
||||
/**
|
||||
* The new character dexterity. Note that this is ignored and the template
|
||||
* value is used.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
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;
|
||||
|
||||
/**
|
||||
* @param characterService
|
||||
* the character service
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_CREATE(CharacterService characterService) {
|
||||
this.characterService = characterService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
name = BufferUtils.readString(buffer);
|
||||
race = CharacterRace.fromOption(buffer.readInt());
|
||||
sex = ActorSex.fromOption(buffer.readInt());
|
||||
characterClass = CharacterClass.fromID(buffer.readInt());
|
||||
|
||||
intelligence = buffer.readInt();
|
||||
strength = buffer.readInt();
|
||||
concentration = buffer.readInt();
|
||||
mentality = buffer.readInt();
|
||||
dexterity = buffer.readInt();
|
||||
witness = buffer.readInt();
|
||||
|
||||
hairStyle = CharacterHairStyle.fromOption(buffer.readInt());
|
||||
hairColor = CharacterHairColor.fromOption(buffer.readInt());
|
||||
face = CharacterFace.fromOption(buffer.readInt());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
try {
|
||||
final L2Character character = characterService.create(name, conn
|
||||
.getSession().getAccountID(), sex, characterClass,
|
||||
hairStyle, hairColor, face);
|
||||
|
||||
if (character != null)
|
||||
conn.write(SM_CHAR_CREATE_OK.INSTANCE);
|
||||
else
|
||||
conn.write(REASON_CREATION_FAILED.newInstance());
|
||||
} catch (CharacterInvalidNameException e) {
|
||||
conn.write(REASON_16_ENG_CHARS.newInstance());
|
||||
} catch (CharacterInvalidAppearanceException e) {
|
||||
conn.write(REASON_CREATION_FAILED.newInstance());
|
||||
} catch (CharacterNameAlreadyExistsException e) {
|
||||
conn.write(REASON_NAME_ALREADY_EXISTS.newInstance());
|
||||
} catch (CharacteCreationNotAllowedException e) {
|
||||
conn.write(REASON_CREATION_FAILED.newInstance());
|
||||
} catch (CharacterInvalidRaceException | CharacterInvalidSexException e) {
|
||||
conn.write(REASON_CHOOSE_ANOTHER_SVR.newInstance());
|
||||
} catch (TooManyCharactersException e) {
|
||||
conn.write(REASON_TOO_MANY_CHARACTERS.newInstance());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,150 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_STOP;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.game.character.CharacterService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.geometry.Coordinate;
|
||||
|
||||
/**
|
||||
* This packet notifies the server which character the player has chosen to use.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_MOVE extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x0f;
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private final Logger log = LoggerFactory.getLogger(this.getClass());
|
||||
|
||||
/**
|
||||
* The {@link CharacterService}
|
||||
*/
|
||||
private final CharacterService charService;
|
||||
|
||||
// packet
|
||||
/**
|
||||
* The movement target
|
||||
*/
|
||||
private Coordinate target;
|
||||
/**
|
||||
* The movement origin
|
||||
*/
|
||||
private Coordinate origin;
|
||||
/**
|
||||
* The movement type
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private MovementType type;
|
||||
|
||||
/**
|
||||
* Defines the movement action type
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public enum MovementType {
|
||||
/**
|
||||
* The move action was issued by the mouse
|
||||
*/
|
||||
MOUSE(0x01),
|
||||
/**
|
||||
* The move action was issued by the keyboard
|
||||
*/
|
||||
KEYBOARD(0x00);
|
||||
|
||||
/**
|
||||
* The type id
|
||||
*/
|
||||
public final int id;
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the type id
|
||||
*/
|
||||
MovementType(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the type id
|
||||
* @return the {@link MovementType} represented by <code>id</code>
|
||||
*/
|
||||
public static MovementType fromID(int id) {
|
||||
for (final MovementType type : values()) {
|
||||
if (type.id == id)
|
||||
return type;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param charService
|
||||
* the character service
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_MOVE(CharacterService charService) {
|
||||
this.charService = charService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
this.target = Coordinate.fromXYZ(buffer.readInt(), buffer.readInt(),
|
||||
buffer.readInt());
|
||||
this.origin = Coordinate.fromXYZ(buffer.readInt(), buffer.readInt(),
|
||||
buffer.readInt());
|
||||
// seems that L2Walker does not send this
|
||||
if (buffer.readableBytes() >= 4) {
|
||||
// 0 keyboard, 1 mouse
|
||||
this.type = MovementType.fromID(buffer.readInt());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
if (target.equals(origin)) {
|
||||
log.debug("Target is same as origin. Stopping character.");
|
||||
conn.write(new SM_CHAR_STOP(conn.getCharacter()));
|
||||
return;
|
||||
}
|
||||
if (target.getDistance(origin) >= 98010000) {
|
||||
log.warn(
|
||||
"Character {} is trying to move a really big distance: {}",
|
||||
conn.getCharacter(), target.getDistance(origin));
|
||||
// TODO send action failed message!
|
||||
return;
|
||||
}
|
||||
final L2Character character = conn.getCharacter();
|
||||
log.debug("Character {} is moving from {} to {}", new Object[] {
|
||||
character, origin, target });
|
||||
charService.move(character, target);
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.packet.server.SM_CHAR_OPEN_MAP;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* Executes an bypass command
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_OPEN_MAP extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x6c;
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
conn.write(new SM_CHAR_OPEN_MAP(1665));
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.service.game.character.CharacterService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.geometry.Point3D;
|
||||
|
||||
/**
|
||||
* This packet notifies the server which character the player has chosen to use.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_POSITION extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x59;
|
||||
|
||||
/**
|
||||
* The {@link CharacterService}
|
||||
*/
|
||||
private final CharacterService charService;
|
||||
|
||||
/**
|
||||
* The current position point
|
||||
*/
|
||||
private Point3D point;
|
||||
/**
|
||||
* Extra data -> vehicle id
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private int extra; // vehicle id
|
||||
|
||||
/**
|
||||
* @param charService
|
||||
* the character service
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_POSITION(CharacterService charService) {
|
||||
this.charService = charService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
point = Point3D.fromXYZA(buffer.readInt(), buffer.readInt(),
|
||||
buffer.readInt(), buffer.readInt());
|
||||
extra = buffer.readInt();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
charService.receivedValidation(conn.getCharacter(), point);
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.packet.server.SM_CHAR_INVENTORY;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* Completes the creation of an character. Creates the object, inserts into the
|
||||
* database and notifies the client about the status of the operation.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_REQ_INVENTORY extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x14;
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final L2Character character = conn.getCharacter();
|
||||
conn.write(new SM_CHAR_INVENTORY(character.getInventory()));
|
||||
}
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_SELECTED;
|
||||
import com.l2jserver.model.dao.CharacterDAO;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* This packet notifies the server which character the player has chosen to use.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_SELECT extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x12;
|
||||
|
||||
// services and daos
|
||||
/**
|
||||
* The {@link CharacterDAO} implementation
|
||||
*/
|
||||
private final CharacterDAO characterDao;
|
||||
|
||||
// packet
|
||||
/**
|
||||
* The character slot
|
||||
*/
|
||||
private int slot;
|
||||
|
||||
/**
|
||||
* @param characterDao
|
||||
* the character dao
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_SELECT(CharacterDAO characterDao) {
|
||||
this.characterDao = characterDao;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
slot = buffer.readInt();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final List<L2Character> chars = characterDao.selectByAccount(conn
|
||||
.getSession().getAccountID());
|
||||
|
||||
// FIXME better handling! this will throw an exception sooner or later
|
||||
final L2Character character = chars.get(slot);
|
||||
conn.setCharacterID(character.getID());
|
||||
|
||||
conn.write(new SM_CHAR_SELECTED(chars.get(slot)));
|
||||
}
|
||||
}
|
||||
@@ -1,125 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.model.game.CharacterShortcut.ShortcutActorType;
|
||||
import com.l2jserver.model.game.CharacterShortcut.ShortcutType;
|
||||
import com.l2jserver.model.id.object.ItemID;
|
||||
import com.l2jserver.model.id.object.provider.ItemIDProvider;
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.game.character.ShortcutService;
|
||||
import com.l2jserver.service.game.character.ShortcutSlotNotFreeServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* Completes the creation of an character. Creates the object, inserts into the
|
||||
* database and notifies the client about the status of the operation.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_SHORTCUT_CREATE extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x3d;
|
||||
|
||||
/**
|
||||
* The {@link ShortcutService}
|
||||
*/
|
||||
private final ShortcutService shortcutService;
|
||||
/**
|
||||
* The {@link ItemID} provider
|
||||
*/
|
||||
private final ItemIDProvider itemIdProvider;
|
||||
|
||||
/**
|
||||
* The shortcut type
|
||||
*/
|
||||
private ShortcutType type;
|
||||
/**
|
||||
* The shortcut object ID (depends on type)
|
||||
*/
|
||||
private int objectId;
|
||||
/**
|
||||
* The slot
|
||||
*/
|
||||
private int slot;
|
||||
/**
|
||||
* The page
|
||||
*/
|
||||
private int page;
|
||||
/**
|
||||
* The skill level
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private int level;
|
||||
/**
|
||||
* Whether the shortcut is an for an character(1) or a pet(2)
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private ShortcutActorType actorType;
|
||||
|
||||
/**
|
||||
* @param shortcutService
|
||||
* the shortcut service
|
||||
* @param itemIdProvider
|
||||
* the item id provider
|
||||
*/
|
||||
@Inject
|
||||
private CM_CHAR_SHORTCUT_CREATE(ShortcutService shortcutService,
|
||||
ItemIDProvider itemIdProvider) {
|
||||
this.shortcutService = shortcutService;
|
||||
this.itemIdProvider = itemIdProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
type = ShortcutType.fromID(buffer.readInt());
|
||||
int slot = buffer.readInt();
|
||||
objectId = buffer.readInt();
|
||||
level = buffer.readInt();
|
||||
actorType = ShortcutActorType.fromID(buffer.readInt());
|
||||
|
||||
this.slot = slot % 12;
|
||||
this.page = slot / 12;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final L2Character character = conn.getCharacter();
|
||||
try {
|
||||
switch (type) {
|
||||
case ITEM:
|
||||
final ItemID itemID = itemIdProvider.resolveID(objectId);
|
||||
final Item item = itemID.getObject();
|
||||
if (item == null) {
|
||||
conn.sendActionFailed();
|
||||
return;
|
||||
}
|
||||
shortcutService.create(character, item, page, slot);
|
||||
break;
|
||||
}
|
||||
} catch (ShortcutSlotNotFreeServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.service.game.character.ShortcutService;
|
||||
import com.l2jserver.service.game.character.ShortcutSlotEmptyServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* Completes the creation of an character. Creates the object, inserts into the
|
||||
* database and notifies the client about the status of the operation.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_SHORTCUT_REMOVE extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x3f;
|
||||
|
||||
/**
|
||||
* The {@link ShortcutService}
|
||||
*/
|
||||
private final ShortcutService shortcutService;
|
||||
|
||||
/**
|
||||
* The slot
|
||||
*/
|
||||
private int slot;
|
||||
/**
|
||||
* The page
|
||||
*/
|
||||
private int page;
|
||||
|
||||
/**
|
||||
* @param shortcutService
|
||||
* the shortcut service
|
||||
*/
|
||||
@Inject
|
||||
private CM_CHAR_SHORTCUT_REMOVE(ShortcutService shortcutService) {
|
||||
this.shortcutService = shortcutService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
int slot = buffer.readInt();
|
||||
this.slot = slot % 12;
|
||||
this.page = slot / 12;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
try {
|
||||
shortcutService.remove(conn.getCharacter(), page, slot);
|
||||
} catch (ShortcutSlotEmptyServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.service.game.character.CannotSetTargetServiceException;
|
||||
import com.l2jserver.service.game.character.CharacterService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.SystemMessage;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* This packet cancels the target selection
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_CHAR_TARGET_UNSELECT extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x48;
|
||||
|
||||
/**
|
||||
* The {@link CharacterService}
|
||||
*/
|
||||
private final CharacterService charService;
|
||||
|
||||
/**
|
||||
* Now known for sure
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private boolean unselect;
|
||||
|
||||
/**
|
||||
* @param charService
|
||||
* the character service
|
||||
*/
|
||||
@Inject
|
||||
public CM_CHAR_TARGET_UNSELECT(CharacterService charService) {
|
||||
this.charService = charService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
this.unselect = (buffer.readByte() == 1 ? true : false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
try {
|
||||
charService.target(conn.getCharacter(), null);
|
||||
} catch (CannotSetTargetServiceException e) {
|
||||
conn.sendSystemMessage(SystemMessage.FAILED_DISABLE_TARGET);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.google.inject.Inject;
|
||||
import com.l2jserver.model.id.object.CharacterID;
|
||||
import com.l2jserver.service.game.character.CharacterService;
|
||||
import com.l2jserver.service.game.spawn.AlreadySpawnedServiceException;
|
||||
import com.l2jserver.service.game.spawn.SpawnPointNotFoundServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.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 CM_ENTER_WORLD extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x11;
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private final Logger log = LoggerFactory.getLogger(CM_ENTER_WORLD.class);
|
||||
|
||||
/**
|
||||
* The {@link CharacterService}
|
||||
*/
|
||||
private final CharacterService characterService;
|
||||
|
||||
/**
|
||||
* @param characterService
|
||||
* the character service
|
||||
*/
|
||||
@Inject
|
||||
public CM_ENTER_WORLD(CharacterService characterService) {
|
||||
this.characterService = characterService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, 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 Lineage2Client conn) {
|
||||
final CharacterID id = conn.getCharacterID();
|
||||
if (id == null) {
|
||||
log.warn(
|
||||
"Client {} is trying to enter world without select a character",
|
||||
conn);
|
||||
conn.close();
|
||||
return;
|
||||
}
|
||||
// TODO send fail message
|
||||
try {
|
||||
characterService.enterWorld(id.getObject());
|
||||
} catch (SpawnPointNotFoundServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
} catch (AlreadySpawnedServiceException e) {
|
||||
// TODO send an error message here
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.packet.server.SM_FORT_INFO;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* The client is requesting the manor list.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_EXT_REQ_ALL_FORTRESS_INFO extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE1
|
||||
*/
|
||||
public static final int OPCODE1 = 0xd0;
|
||||
/**
|
||||
* The packet OPCODE2
|
||||
*/
|
||||
public static final int OPCODE2 = 0x3d;
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
conn.write(new SM_FORT_INFO());
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* The client is requesting a the key mappings.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_EXT_REQ_KEY_MAPPING extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE1
|
||||
*/
|
||||
public static final int OPCODE1 = 0xd0;
|
||||
/**
|
||||
* The packet OPCODE2
|
||||
*/
|
||||
public static final int OPCODE2 = 0x21;
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.packet.server.SM_MANOR_LIST;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* The client is requesting the manor list.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_EXT_REQ_MANOR_LIST extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE1
|
||||
*/
|
||||
public static final int OPCODE1 = 0xd0;
|
||||
/**
|
||||
* The packet OPCODE2
|
||||
*/
|
||||
public static final int OPCODE2 = 0x01;
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
conn.write(new SM_MANOR_LIST("gludio", "dion", "giran", "oren", "aden",
|
||||
"innadril", "goddard", "rune", "schuttgart"));
|
||||
}
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.google.inject.Inject;
|
||||
import com.l2jserver.service.network.gameguard.GameGuardService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.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 CM_GG_KEY extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0xcb;
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private static final Logger log = LoggerFactory.getLogger(CM_GG_KEY.class);
|
||||
|
||||
/**
|
||||
* The {@link GameGuardService}
|
||||
*/
|
||||
private final GameGuardService ggService;
|
||||
|
||||
/**
|
||||
* The Game guard authentication key
|
||||
*/
|
||||
private byte[] key = new byte[8];
|
||||
|
||||
/**
|
||||
* @param ggService
|
||||
* the gameguard service
|
||||
*/
|
||||
@Inject
|
||||
public CM_GG_KEY(GameGuardService ggService) {
|
||||
this.ggService = ggService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
byte[] part1 = buffer.readBytes(4).array();
|
||||
buffer.readInt();
|
||||
byte[] part2 = buffer.readBytes(4).array();
|
||||
|
||||
// create a single key array
|
||||
System.arraycopy(part1, 0, key, 0, 4);
|
||||
System.arraycopy(part2, 0, key, 4, 4);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
log.debug("Received GG key");
|
||||
switch (ggService.key(conn, key)) {
|
||||
case INVALID:
|
||||
log.warn("Client {} sent an invalid GG key", conn);
|
||||
// if key is invalid, disconnect client
|
||||
conn.close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_LIST;
|
||||
import com.l2jserver.model.dao.CharacterDAO;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* Requests the list of characters to be displayed in the lobby. The list of
|
||||
* characters is sent to the client.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_GOTO_LOBBY 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;
|
||||
|
||||
/**
|
||||
* @param characterDao
|
||||
* the character dao
|
||||
*/
|
||||
@Inject
|
||||
public CM_GOTO_LOBBY(CharacterDAO characterDao) {
|
||||
this.characterDao = characterDao;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final List<L2Character> chars = characterDao.selectByAccount(conn
|
||||
.getSession().getAccountID());
|
||||
conn.write(SM_CHAR_LIST.fromL2Session(conn.getSession(),
|
||||
chars.toArray(new L2Character[chars.size()])));
|
||||
}
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.model.id.object.ItemID;
|
||||
import com.l2jserver.model.id.object.provider.ItemIDProvider;
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.service.game.item.ItemService;
|
||||
import com.l2jserver.service.game.item.NonStackableItemsServiceException;
|
||||
import com.l2jserver.service.game.item.NotEnoughItemsServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.SystemMessage;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* This packet drops items on the ground.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_ITEM_DESTROY extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x60;
|
||||
|
||||
/**
|
||||
* The {@link ItemService}
|
||||
*/
|
||||
private final ItemService itemService;
|
||||
/**
|
||||
* The {@link ItemID} provider
|
||||
*/
|
||||
private final ItemIDProvider itemIdProvider;
|
||||
|
||||
/**
|
||||
* The item ID
|
||||
*/
|
||||
private int objectId;
|
||||
/**
|
||||
* The number of items to be dropped
|
||||
*/
|
||||
private long count;
|
||||
|
||||
/**
|
||||
* @param itemService
|
||||
* the item service
|
||||
* @param itemIdProvider
|
||||
* the item id provider
|
||||
*/
|
||||
@Inject
|
||||
public CM_ITEM_DESTROY(ItemService itemService,
|
||||
ItemIDProvider itemIdProvider) {
|
||||
this.itemService = itemService;
|
||||
this.itemIdProvider = itemIdProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
objectId = buffer.readInt();
|
||||
count = buffer.readLong();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final ItemID id = itemIdProvider.resolveID(objectId);
|
||||
final Item item = id.getObject();
|
||||
|
||||
if (item == null) {
|
||||
conn.sendActionFailed();
|
||||
return;
|
||||
}
|
||||
if (!conn.getCharacterID().equals(item.getOwnerID())) {
|
||||
conn.sendActionFailed();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (itemService.destroy(item, count)) {
|
||||
conn.removeInventoryItems(item);
|
||||
} else {
|
||||
conn.updateInventoryItems(item);
|
||||
}
|
||||
} catch (NotEnoughItemsServiceException
|
||||
| NonStackableItemsServiceException e) {
|
||||
conn.sendSystemMessage(SystemMessage.CANNOT_DISCARD_THIS_ITEM);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.model.id.object.ItemID;
|
||||
import com.l2jserver.model.id.object.provider.ItemIDProvider;
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.service.game.item.ItemAlreadyOnGroundServiceException;
|
||||
import com.l2jserver.service.game.item.ItemService;
|
||||
import com.l2jserver.service.game.item.NonStackableItemsServiceException;
|
||||
import com.l2jserver.service.game.item.NotEnoughItemsServiceException;
|
||||
import com.l2jserver.service.game.spawn.AlreadySpawnedServiceException;
|
||||
import com.l2jserver.service.game.spawn.SpawnPointNotFoundServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.SystemMessage;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
import com.l2jserver.util.geometry.Point3D;
|
||||
|
||||
/**
|
||||
* This packet drops items on the ground.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_ITEM_DROP extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x17;
|
||||
|
||||
/**
|
||||
* The {@link ItemService}
|
||||
*/
|
||||
private final ItemService itemService;
|
||||
/**
|
||||
* The {@link ItemID} provider
|
||||
*/
|
||||
private final ItemIDProvider itemIdProvider;
|
||||
|
||||
/**
|
||||
* The item ID
|
||||
*/
|
||||
private int objectId;
|
||||
/**
|
||||
* The number of items to be dropped
|
||||
*/
|
||||
private long count;
|
||||
/**
|
||||
* The location to be dropped
|
||||
*/
|
||||
private Point3D point;
|
||||
|
||||
/**
|
||||
* @param itemService
|
||||
* the item service
|
||||
* @param itemIdProvider
|
||||
* the item id provider
|
||||
*/
|
||||
@Inject
|
||||
public CM_ITEM_DROP(ItemService itemService, ItemIDProvider itemIdProvider) {
|
||||
this.itemService = itemService;
|
||||
this.itemIdProvider = itemIdProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
objectId = buffer.readInt();
|
||||
count = buffer.readLong();
|
||||
point = Point3D.fromXYZ(buffer.readInt(), buffer.readInt(),
|
||||
buffer.readInt());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
final ItemID id = itemIdProvider.resolveID(objectId);
|
||||
final Item item = id.getObject();
|
||||
|
||||
if (item == null) {
|
||||
conn.sendActionFailed();
|
||||
return;
|
||||
}
|
||||
if (!conn.getCharacterID().equals(item.getOwnerID())) {
|
||||
conn.sendActionFailed();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
final Item dropped = itemService.drop(item, count, point,
|
||||
conn.getCharacter());
|
||||
if (dropped.equals(item)) {
|
||||
conn.removeInventoryItems(dropped);
|
||||
} else {
|
||||
conn.updateInventoryItems(item);
|
||||
}
|
||||
if (dropped.getCount() == 1) {
|
||||
conn.sendSystemMessage(SystemMessage.YOU_DROPPED_S1, item
|
||||
.getTemplate().getName());
|
||||
} else {
|
||||
conn.sendSystemMessage(SystemMessage.DROPPED_S1_S2, item
|
||||
.getTemplate().getName(), Long.toString(dropped
|
||||
.getCount()));
|
||||
}
|
||||
} catch (ItemAlreadyOnGroundServiceException
|
||||
| AlreadySpawnedServiceException
|
||||
| SpawnPointNotFoundServiceException
|
||||
| NotEnoughItemsServiceException
|
||||
| NonStackableItemsServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.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 CM_LOGOUT extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x00;
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private static final Logger log = LoggerFactory.getLogger(CM_LOGOUT.class);
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
log.debug("Logging out client {}", conn);
|
||||
conn.close();
|
||||
}
|
||||
}
|
||||
@@ -1,125 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.channel.ChannelFuture;
|
||||
import org.jboss.netty.channel.ChannelFutureListener;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.L2JConstant;
|
||||
import com.l2jserver.game.net.FreyaLineage2Client;
|
||||
import com.l2jserver.game.net.packet.server.SM_KEY;
|
||||
import com.l2jserver.service.network.keygen.BlowfishKeygenService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.Lineage2CryptographyKey;
|
||||
import com.l2jserver.service.network.model.ProtocolVersion;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* In this packet the client is informing its protocol version. It is possible
|
||||
* to do an test and refuse invalid protocol versions. After this packet, the
|
||||
* messages received and sent are all encrypted, except for the encryptation key
|
||||
* which is sent here.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_PROTOCOL_VERSION extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x0e;
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private final Logger log = LoggerFactory
|
||||
.getLogger(CM_PROTOCOL_VERSION.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;
|
||||
|
||||
/**
|
||||
* @param keygen
|
||||
* the keygen service
|
||||
*/
|
||||
@Inject
|
||||
public CM_PROTOCOL_VERSION(BlowfishKeygenService keygen) {
|
||||
this.keygen = keygen;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
this.version = ProtocolVersion.fromVersion((int) buffer
|
||||
.readUnsignedInt());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
// generate a new key
|
||||
final Lineage2CryptographyKey inKey = new Lineage2CryptographyKey(
|
||||
keygen.generate());
|
||||
|
||||
final FreyaLineage2Client client = (FreyaLineage2Client) conn;
|
||||
|
||||
client.getDecrypter().enable(inKey);
|
||||
final Lineage2CryptographyKey outKey = inKey.copy();
|
||||
log.debug("Decrypter has been enabled");
|
||||
|
||||
log.debug("Client protocol version: {}", version);
|
||||
conn.setVersion(version);
|
||||
if (L2JConstant.SUPPORTED_PROTOCOL != version) {
|
||||
log.warn("Incorrect protocol version: {}. Only {} is supported.",
|
||||
version, L2JConstant.SUPPORTED_PROTOCOL);
|
||||
// notify wrong protocol and close connection
|
||||
conn.write(new SM_KEY(inKey, false)).addListener(
|
||||
new ChannelFutureListener() {
|
||||
@Override
|
||||
public void operationComplete(ChannelFuture future)
|
||||
throws Exception {
|
||||
// close connection
|
||||
conn.close();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
// activate encrypter once packet has been sent.
|
||||
conn.write(new SM_KEY(inKey, true)).addListener(
|
||||
new ChannelFutureListener() {
|
||||
@Override
|
||||
public void operationComplete(ChannelFuture future)
|
||||
throws Exception {
|
||||
log.debug("Encrypter has been enabled");
|
||||
// enable encrypter
|
||||
client.getEncrypter().setKey(outKey);
|
||||
client.getEncrypter().setEnabled(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. 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.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_TEMPLATE;
|
||||
import com.l2jserver.model.id.template.CharacterTemplateID;
|
||||
import com.l2jserver.model.id.template.provider.CharacterTemplateIDProvider;
|
||||
import com.l2jserver.model.template.CharacterTemplate;
|
||||
import com.l2jserver.model.template.character.CharacterClass;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* Requests the creation of a new Character. The list of character templates is
|
||||
* sent to the client, meaning that the client is authorized to create
|
||||
* characters.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_REQUEST_CHAR_TEMPLATE extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x13;
|
||||
|
||||
/**
|
||||
* List of {@link CharacterClass} templates sent to the client
|
||||
*/
|
||||
private static final CharacterClass[] TEMPLATE_CLASSES = {
|
||||
CharacterClass.HUMAN_FIGHTER, CharacterClass.HUMAN_MYSTIC,
|
||||
CharacterClass.ELVEN_FIGHTER, CharacterClass.ELVEN_MYSTIC,
|
||||
CharacterClass.DARK_FIGHTER, CharacterClass.DARK_MYSTIC,
|
||||
CharacterClass.ORC_FIGHTER, CharacterClass.ORC_MYSTIC,
|
||||
CharacterClass.DWARVEN_FIGHTER, CharacterClass.MALE_SOLDIER,
|
||||
CharacterClass.FEMALE_SOLDIER };
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private static final Logger log = LoggerFactory
|
||||
.getLogger(CM_REQUEST_CHAR_TEMPLATE.class);
|
||||
|
||||
/**
|
||||
* The {@link CharacterTemplateID} factory
|
||||
*/
|
||||
private final CharacterTemplateIDProvider idFactory;
|
||||
|
||||
/**
|
||||
* @param idFactory
|
||||
* the character template id provider
|
||||
*/
|
||||
@Inject
|
||||
public CM_REQUEST_CHAR_TEMPLATE(CharacterTemplateIDProvider idFactory) {
|
||||
this.idFactory = idFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
log.debug("Requested character templates");
|
||||
|
||||
final CharacterTemplate[] templates = new CharacterTemplate[TEMPLATE_CLASSES.length];
|
||||
int i = 0;
|
||||
for (final CharacterClass charClass : TEMPLATE_CLASSES) {
|
||||
final CharacterTemplateID id = idFactory.resolveID(charClass.id);
|
||||
templates[i++] = id.getTemplate();
|
||||
}
|
||||
conn.write(new SM_CHAR_TEMPLATE(templates));
|
||||
}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.client;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_LIST;
|
||||
import com.l2jserver.game.net.packet.server.SM_CHAR_RESTART;
|
||||
import com.l2jserver.model.dao.CharacterDAO;
|
||||
import com.l2jserver.service.game.character.CharacterService;
|
||||
import com.l2jserver.service.game.spawn.NotSpawnedServiceException;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractClientPacket;
|
||||
|
||||
/**
|
||||
* Requests the list of characters to be displayed in the lobby. The list of
|
||||
* characters is sent to the client.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class CM_RESTART extends AbstractClientPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x57;
|
||||
|
||||
/**
|
||||
* The {@link CharacterService}
|
||||
*/
|
||||
private final CharacterService charService;
|
||||
/**
|
||||
* The {@link CharacterDAO}
|
||||
*/
|
||||
private final CharacterDAO charDao;
|
||||
|
||||
/**
|
||||
* @param charService
|
||||
* the character service
|
||||
* @param charDao
|
||||
* the character dao
|
||||
*/
|
||||
@Inject
|
||||
public CM_RESTART(CharacterService charService, CharacterDAO charDao) {
|
||||
this.charService = charService;
|
||||
this.charDao = charDao;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final Lineage2Client conn) {
|
||||
try {
|
||||
charService.leaveWorld(conn.getCharacter());
|
||||
} catch (NotSpawnedServiceException e) {
|
||||
conn.sendActionFailed();
|
||||
return;
|
||||
}
|
||||
conn.setCharacterID(null);
|
||||
conn.write(SM_CHAR_RESTART.ok());
|
||||
conn.write(SM_CHAR_LIST.fromL2Session(conn.getSession(),
|
||||
charDao.selectByAccount(conn.getSession().getAccountID())));
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet responds to the Restart request
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_ACTION_FAILED extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x1f;
|
||||
|
||||
/**
|
||||
* The {@link SM_ACTION_FAILED} shared instance
|
||||
*/
|
||||
public static final SM_ACTION_FAILED SHARED_INSTANCE = new SM_ACTION_FAILED();
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
*/
|
||||
public SM_ACTION_FAILED() {
|
||||
super(OPCODE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
}
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.server.AttackHit;
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.factory.CollectionFactory;
|
||||
|
||||
/**
|
||||
* This packet informs the client of an attack issued
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
* @see AttackHit
|
||||
*/
|
||||
public class SM_ACTOR_ATTACK extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x33;
|
||||
|
||||
/**
|
||||
* The attacker actor
|
||||
*/
|
||||
private final Actor attacker;
|
||||
/**
|
||||
* List of hits to be sent
|
||||
*/
|
||||
private final List<AttackHit> hits = CollectionFactory.newList();
|
||||
|
||||
/**
|
||||
* @param attacker
|
||||
* the attacked
|
||||
* @param hits
|
||||
* the hits
|
||||
*/
|
||||
public SM_ACTOR_ATTACK(Actor attacker, AttackHit... hits) {
|
||||
super(OPCODE);
|
||||
this.attacker = attacker;
|
||||
Collections.addAll(this.hits, hits);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param hits
|
||||
* the hits
|
||||
*/
|
||||
public SM_ACTOR_ATTACK(AttackHit... hits) {
|
||||
this(hits[0].getAttacker(), hits);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(attacker.getID().getID());
|
||||
|
||||
final AttackHit first = hits.get(0);
|
||||
buffer.writeInt(first.getTarget().getID().getID());
|
||||
buffer.writeInt((int) first.getDamage());
|
||||
buffer.writeByte(first.getFlagsByte());
|
||||
|
||||
buffer.writeInt(attacker.getPoint().getX());
|
||||
buffer.writeInt(attacker.getPoint().getY());
|
||||
buffer.writeInt(attacker.getPoint().getZ());
|
||||
|
||||
buffer.writeShort(hits.size() - 1);
|
||||
if (hits.size() > 1) {
|
||||
boolean skipFirst = false;
|
||||
for (final AttackHit hit : hits) {
|
||||
if (!skipFirst) {
|
||||
skipFirst = true;
|
||||
continue;
|
||||
}
|
||||
buffer.writeInt(hit.getTarget().getID().getID());
|
||||
buffer.writeInt((int) hit.getDamage());
|
||||
buffer.writeByte(hit.getFlagsByte());
|
||||
}
|
||||
}
|
||||
|
||||
buffer.writeInt(first.getTarget().getPoint().getX());
|
||||
buffer.writeInt(first.getTarget().getPoint().getY());
|
||||
buffer.writeInt(first.getTarget().getPoint().getZ());
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new hit
|
||||
*
|
||||
* @param hit
|
||||
* the hit
|
||||
* @return this instance
|
||||
*/
|
||||
public SM_ACTOR_ATTACK add(AttackHit hit) {
|
||||
hits.add(hit);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.game.chat.ChatMessageType;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This packet notifies the client that the chosen character has been
|
||||
* successfully selected.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_ACTOR_CHAT extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x4a;
|
||||
|
||||
/**
|
||||
* The sending actor
|
||||
*/
|
||||
private final Actor actor;
|
||||
/**
|
||||
* The message destination
|
||||
*/
|
||||
private ChatMessageType destination;
|
||||
/**
|
||||
* The message
|
||||
*/
|
||||
private String message = null;
|
||||
/**
|
||||
* The message ID
|
||||
*/
|
||||
private int messageID = 0;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the actor
|
||||
* @param destination
|
||||
* the destination
|
||||
* @param message
|
||||
* the message
|
||||
*/
|
||||
public SM_ACTOR_CHAT(Actor character, ChatMessageType destination,
|
||||
String message) {
|
||||
super(OPCODE);
|
||||
this.actor = character;
|
||||
this.destination = destination;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param actor
|
||||
* the actor
|
||||
* @param destination
|
||||
* the destination
|
||||
* @param messageID
|
||||
* the message id
|
||||
*/
|
||||
public SM_ACTOR_CHAT(Actor actor, ChatMessageType destination, int messageID) {
|
||||
super(OPCODE);
|
||||
this.actor = actor;
|
||||
this.destination = destination;
|
||||
this.messageID = messageID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(actor.getID().getID());
|
||||
buffer.writeInt(destination.id);
|
||||
if (actor instanceof L2Character) {
|
||||
BufferUtils.writeString(buffer, ((L2Character) actor).getName());
|
||||
} else {
|
||||
buffer.writeInt(actor.getID().getID());
|
||||
}
|
||||
if (message != null) {
|
||||
BufferUtils.writeString(buffer, message);
|
||||
} else {
|
||||
buffer.writeInt(messageID);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.server.AttackHit;
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet informs the client of an attack issued
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
* @see AttackHit
|
||||
*/
|
||||
public class SM_ACTOR_DIE extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x00;
|
||||
|
||||
/**
|
||||
* The attacker actor
|
||||
*/
|
||||
private final Actor actor;
|
||||
|
||||
/**
|
||||
* @param actor
|
||||
* the actor
|
||||
*/
|
||||
public SM_ACTOR_DIE(Actor actor) {
|
||||
super(OPCODE);
|
||||
this.actor = actor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(actor.getID().getID());
|
||||
buffer.writeInt(0x00); // to hide away
|
||||
buffer.writeInt(0x00); // to castle
|
||||
buffer.writeInt(0x00); // to siege HQ
|
||||
buffer.writeInt(0x00); // sweepable (blue glow)
|
||||
buffer.writeInt(0x00); // to FIXED
|
||||
buffer.writeInt(0x00); // to fortress
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.geometry.Coordinate;
|
||||
|
||||
/**
|
||||
* This packet notifies the client that the character is moving to an certain
|
||||
* point. If the {@link Actor} moving is the same as the client connected, the
|
||||
* client will send position validations at specific time intervals.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a> O
|
||||
*/
|
||||
public class SM_ACTOR_MOVE extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x2f;
|
||||
|
||||
/**
|
||||
* The selected character
|
||||
*/
|
||||
private final Actor actor;
|
||||
/**
|
||||
* The destination coordinate
|
||||
*/
|
||||
private Coordinate target;
|
||||
|
||||
/**
|
||||
* @param actor
|
||||
* the actor
|
||||
* @param target
|
||||
* the target
|
||||
*/
|
||||
public SM_ACTOR_MOVE(Actor actor, Coordinate target) {
|
||||
super(OPCODE);
|
||||
this.actor = actor;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(actor.getID().getID());
|
||||
|
||||
// target
|
||||
buffer.writeInt(target.getX());
|
||||
buffer.writeInt(target.getY());
|
||||
buffer.writeInt(target.getZ());
|
||||
|
||||
// source
|
||||
buffer.writeInt(actor.getPoint().getX());
|
||||
buffer.writeInt(actor.getPoint().getY());
|
||||
buffer.writeInt(actor.getPoint().getZ());
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet notifies the client that the chosen character has been
|
||||
* successfully selected.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_ACTOR_POSITION extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x79;
|
||||
|
||||
/**
|
||||
* The selected character
|
||||
*/
|
||||
private final Actor actor;
|
||||
|
||||
/**
|
||||
* @param actor
|
||||
* the actor
|
||||
*/
|
||||
public SM_ACTOR_POSITION(Actor actor) {
|
||||
super(OPCODE);
|
||||
this.actor = actor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(actor.getID().getID());
|
||||
buffer.writeInt(actor.getPoint().getX());
|
||||
buffer.writeInt(actor.getPoint().getY());
|
||||
buffer.writeInt(actor.getPoint().getZ());
|
||||
buffer.writeInt((int) actor.getPoint().getAngle());
|
||||
}
|
||||
}
|
||||
@@ -1,219 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.factory.CollectionFactory;
|
||||
|
||||
/**
|
||||
* This packet notifies the client that the chosen character has been
|
||||
* successfully selected.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_ACTOR_STATUS_UPDATE extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x18;
|
||||
|
||||
/**
|
||||
* The stats the can be updated with the packet
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public enum Stat {
|
||||
/**
|
||||
* Updates the character level
|
||||
*/
|
||||
LEVEL(0x01),
|
||||
/**
|
||||
* Updates the character experience
|
||||
*/
|
||||
EXPERIENCE(0x02),
|
||||
/**
|
||||
* Updates the character strength
|
||||
*/
|
||||
STR(0x03),
|
||||
/**
|
||||
* Updates the character dexterity
|
||||
*/
|
||||
DEX(0x04),
|
||||
|
||||
/**
|
||||
* Updates the character concentration
|
||||
*/
|
||||
CON(0x05),
|
||||
/**
|
||||
* Updates the character intelligence
|
||||
*/
|
||||
INT(0x06),
|
||||
/**
|
||||
* Updates the character witness
|
||||
*/
|
||||
WIT(0x07),
|
||||
/**
|
||||
* Updates the character mentality
|
||||
*/
|
||||
MEN(0x08),
|
||||
/**
|
||||
* Updates the character hp
|
||||
*/
|
||||
HP(0x09),
|
||||
/**
|
||||
* Updates the character maximum hp
|
||||
*/
|
||||
MAX_HP(0x0a),
|
||||
/**
|
||||
* Updates the character hp
|
||||
*/
|
||||
MP(0x0b),
|
||||
/**
|
||||
* Updates the character maximum mp
|
||||
*/
|
||||
MAX_MP(0x0c),
|
||||
/**
|
||||
* Updates the character sp
|
||||
*/
|
||||
SP(0x0d),
|
||||
/**
|
||||
* Updates the character load
|
||||
*/
|
||||
LOAD(0x0e),
|
||||
/**
|
||||
* Updates the character maximum load
|
||||
*/
|
||||
MAX_LOAD(0x0f),
|
||||
/**
|
||||
* Updates the character physical attack
|
||||
*/
|
||||
PHYSICAL_ATK(0x11),
|
||||
/**
|
||||
* Updates the character attack speed
|
||||
*/
|
||||
ATTACK_SPEED(0x12),
|
||||
/**
|
||||
* Updates the character physical defense
|
||||
*/
|
||||
PHYSICAL_DEFENSE(0x13),
|
||||
/**
|
||||
* Updates the character evasion
|
||||
*/
|
||||
EVASION(0x14),
|
||||
/**
|
||||
* Updates the character accuracy
|
||||
*/
|
||||
ACCURACY(0x15),
|
||||
/**
|
||||
* Updates the character critical
|
||||
*/
|
||||
CRITICAL(0x16),
|
||||
/**
|
||||
* Updates the character magical attack
|
||||
*/
|
||||
MAGICAL_ATTACK(0x17),
|
||||
/**
|
||||
* Updates the character cast speed
|
||||
*/
|
||||
CAST_SPEED(0x18),
|
||||
/**
|
||||
* Updates the character magical defense
|
||||
*/
|
||||
MAGICAL_DEFENSE(0x19),
|
||||
|
||||
/**
|
||||
* Updates the character pvp flag
|
||||
*/
|
||||
PVP_FLAG(0x1a),
|
||||
|
||||
/**
|
||||
* Updates the character karma
|
||||
*/
|
||||
KARMA(0x1b),
|
||||
|
||||
/**
|
||||
* Updates the character cp
|
||||
*/
|
||||
CP(0x21),
|
||||
|
||||
/**
|
||||
* Updates the character max cp
|
||||
*/
|
||||
MAX_CP(0x22);
|
||||
|
||||
/**
|
||||
* The stat id
|
||||
*/
|
||||
public final int id;
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the stat id
|
||||
*/
|
||||
Stat(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The set of updates to be sent
|
||||
*/
|
||||
private final Map<Stat, Integer> update = CollectionFactory.newMap();
|
||||
/**
|
||||
* The actor to be updated
|
||||
*/
|
||||
private final Actor actor;
|
||||
|
||||
/**
|
||||
* @param actor
|
||||
* the actor
|
||||
*/
|
||||
public SM_ACTOR_STATUS_UPDATE(Actor actor) {
|
||||
super(OPCODE);
|
||||
this.actor = actor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(actor.getID().getID());
|
||||
buffer.writeInt(update.size());
|
||||
|
||||
for (Entry<Stat, Integer> entry : update.entrySet()) {
|
||||
buffer.writeInt(entry.getKey().id);
|
||||
buffer.writeInt(entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param stat
|
||||
* the stat
|
||||
* @param value
|
||||
* the stat value
|
||||
* @return this instances
|
||||
*/
|
||||
public SM_ACTOR_STATUS_UPDATE add(Stat stat, int value) {
|
||||
update.put(stat, value);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* An packet informing that the character could not be created.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
* @see Reason
|
||||
*/
|
||||
public class SM_CHAR_CREATE_FAIL extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x10;
|
||||
|
||||
/**
|
||||
* The character creation failure reason
|
||||
*/
|
||||
private Reason reason;
|
||||
|
||||
/**
|
||||
* The character creation error reason
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public enum Reason {
|
||||
/**
|
||||
* "Your character creation has failed."
|
||||
*/
|
||||
REASON_CREATION_FAILED(0x00),
|
||||
/**
|
||||
* "You cannot create another character. Please delete the existing
|
||||
* character and try again." Removes all settings that were selected
|
||||
* (race, class, etc)"
|
||||
*/
|
||||
REASON_TOO_MANY_CHARACTERS(0x01),
|
||||
/**
|
||||
* "This name already exists."
|
||||
*/
|
||||
REASON_NAME_ALREADY_EXISTS(0x02),
|
||||
/**
|
||||
* "Your title cannot exceed 16 characters in length. Please try again."
|
||||
*/
|
||||
REASON_16_ENG_CHARS(0x03),
|
||||
/**
|
||||
* "Incorrect name. Please try again."
|
||||
*/
|
||||
REASON_INCORRECT_NAME(0x04),
|
||||
/**
|
||||
* "Characters cannot be created from this server."
|
||||
*/
|
||||
REASON_CREATE_NOT_ALLOWED(0x05),
|
||||
/**
|
||||
* "Unable to create character. You are unable to create a new character
|
||||
* on the selected server. A restriction is in place which restricts
|
||||
* users from creating characters on different servers where no previous
|
||||
* character exists. Please choose another server."
|
||||
*/
|
||||
REASON_CHOOSE_ANOTHER_SVR(0x06);
|
||||
|
||||
/**
|
||||
* The error code id
|
||||
*/
|
||||
public final int id;
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the reason id
|
||||
*/
|
||||
Reason(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an {@link SM_CHAR_CREATE_FAIL} instance for this enum
|
||||
* constant
|
||||
*/
|
||||
public SM_CHAR_CREATE_FAIL newInstance() {
|
||||
return new SM_CHAR_CREATE_FAIL(this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param reason
|
||||
* the reason
|
||||
*/
|
||||
public SM_CHAR_CREATE_FAIL(Reason reason) {
|
||||
super(OPCODE);
|
||||
this.reason = reason;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(reason.id);
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* An packet informing that the character was created with success.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_CREATE_OK extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x0f;
|
||||
|
||||
/**
|
||||
* The packet shared instance
|
||||
*/
|
||||
public static final SM_CHAR_CREATE_OK INSTANCE = new SM_CHAR_CREATE_OK();
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
*/
|
||||
public SM_CHAR_CREATE_OK() {
|
||||
super(OPCODE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(0x01);
|
||||
}
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.model.world.actor.ActorExperience;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
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 SM_CHAR_ENTER_WORLD 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 SM_CHAR_ENTER_WORLD(L2Character character, int sessionId) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
this.sessionId = sessionId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, 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().id);
|
||||
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.getStats().getIntelligence()); // INT
|
||||
buffer.writeInt(character.getStats().getStrength()); // STR
|
||||
buffer.writeInt(character.getStats().getConcentration()); // CON
|
||||
buffer.writeInt(character.getStats().getMentality()); // MEN
|
||||
buffer.writeInt(character.getStats().getDexterity()); // DEX
|
||||
buffer.writeInt(character.getStats().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);
|
||||
}
|
||||
}
|
||||
@@ -1,399 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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.model.template.actor.ActorSex;
|
||||
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.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This is an message informing the client of an given player
|
||||
*
|
||||
* <pre>
|
||||
* (c) dddddSddddQdddddddddddddddddddddddddddddddddddddddddddddddddd
|
||||
* ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
|
||||
* fdfdfdfddddSdddddcccddh[h]cdcdhhdhddddccdcccddddcdddddhhhhhhhdddd
|
||||
* d
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_INFO extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x32;
|
||||
|
||||
/**
|
||||
* The character
|
||||
*/
|
||||
private L2Character character;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character
|
||||
*/
|
||||
public SM_CHAR_INFO(L2Character character) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
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.getStats().getStrength());
|
||||
buffer.writeInt(character.getStats().getDexterity());
|
||||
buffer.writeInt(character.getStats().getConcentration());
|
||||
buffer.writeInt(character.getStats().getIntelligence());
|
||||
buffer.writeInt(character.getStats().getWitness());
|
||||
buffer.writeInt(character.getStats().getMentality());
|
||||
buffer.writeInt(character.getStats().getMaxHP()); // max hp
|
||||
buffer.writeInt((int) character.getHP()); // cur hp
|
||||
buffer.writeInt(character.getStats().getMaxMP()); // max mp
|
||||
buffer.writeInt((int) character.getMP()); // cur mp
|
||||
buffer.writeInt(character.getSP()); // sp
|
||||
buffer.writeInt(0); // load
|
||||
buffer.writeInt(character.getStats().getMaximumLoad()); // 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);
|
||||
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);
|
||||
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.getStats().getPhysicalAttack());
|
||||
buffer.writeInt(character.getStats().getPhysicalAttackSpeed());
|
||||
buffer.writeInt(character.getStats().getPhysicalDefense());
|
||||
|
||||
buffer.writeInt(character.getStats().getEvasionRate()); // evasion
|
||||
buffer.writeInt(character.getStats().getAccuracy());
|
||||
buffer.writeInt(character.getStats().getPhysicalCriticalRate());
|
||||
|
||||
buffer.writeInt(character.getStats().getMagicalAttack());
|
||||
buffer.writeInt(character.getStats().getMagicalAttackSpeed());
|
||||
buffer.writeInt(character.getStats().getPhysicalAttackSpeed());
|
||||
buffer.writeInt(character.getStats().getMagicalDefense());
|
||||
|
||||
buffer.writeInt(0x00); // 0-non-pvp 1-pvp = violett name
|
||||
buffer.writeInt(character.getKarma()); // karma
|
||||
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getWalkSpeed());
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getWalkSpeed());
|
||||
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());
|
||||
// }
|
||||
if (character.getSex() == ActorSex.MALE) {
|
||||
buffer.writeDouble(character.getTemplate().getCollision().getMale()
|
||||
.getRadius());
|
||||
buffer.writeDouble(character.getTemplate().getCollision().getMale()
|
||||
.getHeigth());
|
||||
} else {
|
||||
buffer.writeDouble(character.getTemplate().getCollision()
|
||||
.getFemale().getRadius());
|
||||
buffer.writeDouble(character.getTemplate().getCollision()
|
||||
.getFemale().getHeigth());
|
||||
}
|
||||
|
||||
buffer.writeInt(character.getAppearance().getHairStyle().option);
|
||||
buffer.writeInt(character.getAppearance().getHairColor().option);
|
||||
buffer.writeInt(character.getAppearance().getFace().option);
|
||||
buffer.writeInt(0x01); // is gm
|
||||
|
||||
BufferUtils.writeString(buffer, character.getTitle());
|
||||
|
||||
buffer.writeInt((character.getClanID() != null ? character.getClanID()
|
||||
.getID() : 0x00)); // 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(character.getPkKills()); // pk kills
|
||||
buffer.writeInt(character.getPvpKills()); // pvp kills
|
||||
|
||||
buffer.writeShort(0x00); // cubics size
|
||||
// short:cubicsid[cubicssize]
|
||||
// buffer.writeShort(cubicid);
|
||||
|
||||
buffer.writeByte(0); // is party match room
|
||||
|
||||
buffer.writeInt(0x00); // 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(character.getStats().getMaxCP());
|
||||
buffer.writeInt((int) character.getCP()); // cur cp
|
||||
buffer.writeByte(0x00); // is mount or is airshilhelp = 0; otherwise
|
||||
// enchant effect (minimum 127)
|
||||
|
||||
buffer.writeByte(0x00);// 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(character.getMoveType().id);
|
||||
|
||||
// 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(0x00); // special effects
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the paperdoll object id
|
||||
*
|
||||
* @param buffer
|
||||
* the buffer
|
||||
* @param character
|
||||
* the character
|
||||
* @param paperdoll
|
||||
* the slot
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the paperdoll item id
|
||||
*
|
||||
* @param buffer
|
||||
* the buffer
|
||||
* @param character
|
||||
* the character
|
||||
* @param paperdoll
|
||||
* the slot
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the paperdoll augument id
|
||||
*
|
||||
* @param buffer
|
||||
* the buffer
|
||||
* @param character
|
||||
* the character
|
||||
* @param paperdoll
|
||||
* the slot
|
||||
*/
|
||||
private void writePaperdollAugumentID(ChannelBuffer buffer,
|
||||
L2Character character, InventoryPaperdoll paperdoll) {
|
||||
buffer.writeInt(0x00);
|
||||
}
|
||||
}
|
||||
@@ -1,293 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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_HAND;
|
||||
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.LEGS;
|
||||
import static com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll.RIGHT_BRACELET;
|
||||
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.model.template.actor.ActorSex;
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.model.world.L2Character.CharacterMoveType;
|
||||
import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This packet sends to the client an actor information about an actor
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_INFO_BROADCAST extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x31;
|
||||
|
||||
/**
|
||||
* The character
|
||||
*/
|
||||
private final L2Character character;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character
|
||||
*/
|
||||
public SM_CHAR_INFO_BROADCAST(L2Character character) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(character.getPoint().getX());
|
||||
buffer.writeInt(character.getPoint().getY());
|
||||
buffer.writeInt(character.getPoint().getZ());
|
||||
buffer.writeInt(0x00); // unk
|
||||
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);
|
||||
|
||||
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);
|
||||
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);
|
||||
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); // unk
|
||||
buffer.writeInt(0x01); // unk
|
||||
// end of t1 new h's
|
||||
|
||||
buffer.writeInt(0x00); // pvp flag
|
||||
buffer.writeInt(character.getKarma()); // karma
|
||||
|
||||
buffer.writeInt(character.getStats().getMagicalAttackSpeed());
|
||||
buffer.writeInt(character.getStats().getPhysicalAttackSpeed());
|
||||
|
||||
buffer.writeInt(0x00); // unk
|
||||
|
||||
// FIXME half of those are walk speed
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
buffer.writeInt(character.getStats().getRunSpeed());
|
||||
|
||||
buffer.writeDouble(0x01); // move speed multiplier
|
||||
buffer.writeDouble(0x01); // attack speed multiplier
|
||||
|
||||
if (character.getSex() == ActorSex.MALE) {
|
||||
buffer.writeDouble(character.getTemplate().getCollision().getMale()
|
||||
.getRadius());
|
||||
buffer.writeDouble(character.getTemplate().getCollision().getMale()
|
||||
.getHeigth());
|
||||
} else {
|
||||
buffer.writeDouble(character.getTemplate().getCollision()
|
||||
.getFemale().getRadius());
|
||||
buffer.writeDouble(character.getTemplate().getCollision()
|
||||
.getFemale().getHeigth());
|
||||
}
|
||||
|
||||
buffer.writeInt(character.getAppearance().getHairStyle().option);
|
||||
buffer.writeInt(character.getAppearance().getHairColor().option);
|
||||
buffer.writeInt(character.getAppearance().getFace().option);
|
||||
|
||||
BufferUtils.writeString(buffer, character.getTitle());
|
||||
|
||||
// dont send those 4 if using cursed weapon
|
||||
buffer.writeInt(0); // clan id
|
||||
buffer.writeInt(0); // crest id
|
||||
buffer.writeInt(0); // ally id
|
||||
buffer.writeInt(0); // ally crest id
|
||||
|
||||
buffer.writeByte(0x01); // sitting
|
||||
buffer.writeByte((character.getMoveType() == CharacterMoveType.RUN ? 0x01
|
||||
: 0x00));
|
||||
buffer.writeByte((character.isAttacking() ? 0x01 : 0x00)); // is in
|
||||
// combat
|
||||
|
||||
buffer.writeByte(0x00); // alike dead
|
||||
|
||||
buffer.writeByte((character.getAppearance().isVisible() ? 0x00 : 0x01));
|
||||
|
||||
// 1-on Strider, 2-on Wyvern,
|
||||
// 3-on Great Wolf, 0-no mount
|
||||
buffer.writeByte(0x00);
|
||||
buffer.writeByte(0x00); // 1 - sellshop
|
||||
|
||||
// writeH(_activeChar.getCubics().size());
|
||||
// for (int id : _activeChar.getCubics().keySet())
|
||||
// writeH(id);
|
||||
buffer.writeShort(0x00); // cubics size
|
||||
|
||||
buffer.writeByte(0x00); // in party match room
|
||||
buffer.writeInt(0x00); // abnormal
|
||||
buffer.writeByte(0x00); // flying mounted
|
||||
|
||||
// recom have
|
||||
buffer.writeShort(0x00); // Blue value for name (0 =
|
||||
// white, 255 = pure blue)
|
||||
buffer.writeInt(1000000); // mount npc
|
||||
buffer.writeInt(character.getCharacterClass().id);
|
||||
buffer.writeInt(0x00); // ?
|
||||
buffer.writeByte(0x00); // enchant effect
|
||||
|
||||
buffer.writeByte(0x00); // team circle around feet 1= Blue, 2 = red
|
||||
|
||||
buffer.writeInt(0x00); // clan crest large id
|
||||
buffer.writeByte(0x00); // is noble - Symbol on char menu
|
||||
// ctrl+I
|
||||
buffer.writeByte(0x00); // Hero Aura
|
||||
|
||||
// (Cant be undone by setting back to 0)
|
||||
buffer.writeByte(0x00); // 0x01: Fishing Mode
|
||||
buffer.writeInt(0x00); // fish x
|
||||
buffer.writeInt(0x00);// fish y
|
||||
buffer.writeInt(0x00); // fish z
|
||||
|
||||
buffer.writeInt(character.getAppearance().getNameColor().toInteger());
|
||||
|
||||
buffer.writeInt((int) character.getPoint().getAngle());
|
||||
|
||||
buffer.writeInt(0x00); // pledge class
|
||||
buffer.writeInt(0x00); // pledge type
|
||||
|
||||
buffer.writeInt(character.getAppearance().getTitleColor().toInteger());
|
||||
|
||||
buffer.writeInt(0x00); // cursed weapon id
|
||||
buffer.writeInt(0x00); // clan reputation
|
||||
|
||||
// T1
|
||||
buffer.writeInt(0x00); // transformation id
|
||||
buffer.writeInt(0x00); // agathion id
|
||||
|
||||
// T2
|
||||
buffer.writeInt(0x01); // unk
|
||||
|
||||
// T2.3
|
||||
buffer.writeInt(0x00); // special effect
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the paperdoll item id
|
||||
*
|
||||
* @param buffer
|
||||
* the buffer
|
||||
* @param character
|
||||
* the character
|
||||
* @param paperdoll
|
||||
* the slot
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the paperdoll augument id
|
||||
*
|
||||
* @param buffer
|
||||
* the buffer
|
||||
* @param character
|
||||
* the character
|
||||
* @param paperdoll
|
||||
* the slot
|
||||
*/
|
||||
private void writePaperdollAugumentID(ChannelBuffer buffer,
|
||||
L2Character character, InventoryPaperdoll paperdoll) {
|
||||
buffer.writeInt(0x00);
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This is an message informing the client of extra informations from a player
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_INFO_EXTRA extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0xfe;
|
||||
|
||||
/**
|
||||
* The character
|
||||
*/
|
||||
private L2Character character;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character
|
||||
*/
|
||||
public SM_CHAR_INFO_EXTRA(L2Character character) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeShort(0xcf); // opcode2
|
||||
buffer.writeInt(character.getID().getID()); // object ID of Player
|
||||
buffer.writeInt(0x00); // event effect id
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.character.CharacterInventory;
|
||||
import com.l2jserver.model.world.character.CharacterInventory.ItemLocation;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet send the inventory to the client
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_INVENTORY extends AbstractServerPacket {
|
||||
/**
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* @param inventory
|
||||
* the inventory
|
||||
*/
|
||||
public SM_CHAR_INVENTORY(CharacterInventory inventory) {
|
||||
super(OPCODE);
|
||||
this.inventory = inventory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeShort((showWindow ? 0x01 : 0x00));
|
||||
// TODO warehouse items will have an issue here!
|
||||
buffer.writeShort(inventory.getItemCount()); // item count
|
||||
|
||||
// TODO implement real item slot
|
||||
int slot = 0;
|
||||
for (Item item : inventory) {
|
||||
buffer.writeInt(item.getID().getID()); // obj id
|
||||
buffer.writeInt(item.getTemplateID().getID()); // item id
|
||||
buffer.writeInt(slot); // loc slot
|
||||
buffer.writeLong(item.getCount()); // count
|
||||
buffer.writeShort(0x00); // item type2
|
||||
buffer.writeShort(0x00); // item type3
|
||||
buffer.writeShort((item.getLocation() == ItemLocation.PAPERDOLL ? 0x01
|
||||
: 0x00)); // equiped?
|
||||
buffer.writeInt((item.getPaperdoll() != null ? item.getPaperdoll().id
|
||||
: 0)); // body part
|
||||
buffer.writeShort(127); // enchant level
|
||||
// race tickets
|
||||
buffer.writeShort(0x00); // item type4 (custom type 2)
|
||||
buffer.writeInt(0x00); // augument
|
||||
buffer.writeInt(0x00); // mana
|
||||
buffer.writeInt(-9999); // time
|
||||
buffer.writeShort(0x00); // attack element type
|
||||
buffer.writeShort(0x00); // attack element power
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
buffer.writeShort(0x00); // element def attrib
|
||||
}
|
||||
// Enchant Effects
|
||||
buffer.writeShort(0x00);
|
||||
buffer.writeShort(0x00);
|
||||
buffer.writeShort(0x00);
|
||||
|
||||
slot++;
|
||||
}
|
||||
// TODO inventory block
|
||||
// buffer.writeShort(_inventory.getBlockItems().length);
|
||||
// writeC(_inventory.getBlockMode());
|
||||
// for (int i : _inventory.getBlockItems())
|
||||
// buffer.writeInt(i);
|
||||
buffer.writeShort(0x00);
|
||||
}
|
||||
}
|
||||
@@ -1,226 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.character.CharacterInventory.ItemLocation;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.factory.CollectionFactory;
|
||||
|
||||
/**
|
||||
* This packet send the inventory to the client
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_INVENTORY_UPDATE extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x21;
|
||||
|
||||
/**
|
||||
* List of items to be updated in the client
|
||||
*/
|
||||
private final Map<Item, InventoryUpdateType> items = CollectionFactory
|
||||
.newMap();
|
||||
|
||||
/**
|
||||
* The type of operation to be performed.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public enum InventoryUpdateType {
|
||||
/**
|
||||
* Flags the item to be added to the inventory list
|
||||
*/
|
||||
ADD(1),
|
||||
/**
|
||||
* Flags the item to be updated in the inventory list
|
||||
*/
|
||||
UPDATE(2),
|
||||
/**
|
||||
* Flags the item to be removed in the inventory list
|
||||
*/
|
||||
REMOVE(3);
|
||||
|
||||
/**
|
||||
* The operation ID
|
||||
*/
|
||||
public final int id;
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the operation ID
|
||||
*/
|
||||
private InventoryUpdateType(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an empty instance. Items can be added, removed or update using
|
||||
* {@link #add(Item)}, {@link #remove(Item)} and {@link #update(Item)}.
|
||||
*/
|
||||
public SM_CHAR_INVENTORY_UPDATE() {
|
||||
super(OPCODE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance with several items performing
|
||||
* {@link InventoryUpdateType} <code>type</code> operation.
|
||||
*
|
||||
* @param type
|
||||
* the operation type
|
||||
* @param items
|
||||
* the items
|
||||
*/
|
||||
public SM_CHAR_INVENTORY_UPDATE(InventoryUpdateType type, Item... items) {
|
||||
super(OPCODE);
|
||||
switch (type) {
|
||||
case ADD:
|
||||
add(items);
|
||||
break;
|
||||
case REMOVE:
|
||||
remove(items);
|
||||
break;
|
||||
case UPDATE:
|
||||
update(items);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeShort(items.size()); // item count
|
||||
|
||||
for (Entry<Item, InventoryUpdateType> e : items.entrySet()) {
|
||||
final Item item = e.getKey();
|
||||
final InventoryUpdateType type = e.getValue();
|
||||
|
||||
buffer.writeShort(type.id); // change type
|
||||
buffer.writeInt(item.getID().getID()); // obj id
|
||||
buffer.writeInt(item.getTemplateID().getID()); // item id
|
||||
buffer.writeInt(0x00); // loc slot
|
||||
buffer.writeLong(item.getCount()); // count
|
||||
buffer.writeShort(0x00); // item type2
|
||||
buffer.writeShort(0x00); // item type3
|
||||
buffer.writeShort((item.getLocation() == ItemLocation.PAPERDOLL ? 0x01
|
||||
: 0x00)); // equiped?
|
||||
buffer.writeInt((item.getPaperdoll() != null ? item.getPaperdoll().id
|
||||
: 0)); // body part
|
||||
buffer.writeShort(127); // enchant level
|
||||
// race tickets
|
||||
buffer.writeShort(0x00); // item type4 (custom type 2)
|
||||
buffer.writeInt(0x00); // augument
|
||||
buffer.writeInt(0x00); // mana
|
||||
buffer.writeInt(-9999); // time
|
||||
buffer.writeShort(0x00); // attack element type
|
||||
buffer.writeShort(0x00); // attack element power
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
buffer.writeShort(0x00); // element def attrib
|
||||
}
|
||||
// Enchant Effects
|
||||
buffer.writeShort(0x00);
|
||||
buffer.writeShort(0x00);
|
||||
buffer.writeShort(0x00);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a single item
|
||||
*
|
||||
* @param item
|
||||
* the item to be removed
|
||||
* @return this instance
|
||||
*/
|
||||
public SM_CHAR_INVENTORY_UPDATE remove(Item item) {
|
||||
items.put(item, InventoryUpdateType.REMOVE);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes several items
|
||||
*
|
||||
* @param items
|
||||
* the items to be removed
|
||||
* @return this instance
|
||||
*/
|
||||
public SM_CHAR_INVENTORY_UPDATE remove(Item... items) {
|
||||
for (final Item item : items) {
|
||||
remove(item);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a single item
|
||||
*
|
||||
* @param item
|
||||
* the item to be added
|
||||
* @return this instance
|
||||
*/
|
||||
public SM_CHAR_INVENTORY_UPDATE add(Item item) {
|
||||
items.put(item, InventoryUpdateType.ADD);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds several items
|
||||
*
|
||||
* @param items
|
||||
* the item to be added
|
||||
* @return this instance
|
||||
*/
|
||||
public SM_CHAR_INVENTORY_UPDATE add(Item... items) {
|
||||
for (final Item item : items) {
|
||||
add(item);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a single item
|
||||
*
|
||||
* @param item
|
||||
* the item to be updated
|
||||
* @return this instance
|
||||
*/
|
||||
public SM_CHAR_INVENTORY_UPDATE update(Item item) {
|
||||
items.put(item, InventoryUpdateType.UPDATE);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates several items
|
||||
*
|
||||
* @param items
|
||||
* the item to be updated
|
||||
* @return this instance
|
||||
*/
|
||||
public SM_CHAR_INVENTORY_UPDATE update(Item... items) {
|
||||
for (final Item item : items) {
|
||||
update(item);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -1,262 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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 java.util.Collection;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.Lineage2Session;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* The list of characters sent to the client.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_LIST 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;
|
||||
|
||||
/**
|
||||
* @param loginName
|
||||
* the account id
|
||||
* @param sessionId
|
||||
* the session id
|
||||
* @param lastCharacterId
|
||||
* the last character used
|
||||
* @param characters
|
||||
* the characters
|
||||
*/
|
||||
public SM_CHAR_LIST(String loginName, int sessionId, int lastCharacterId,
|
||||
L2Character... characters) {
|
||||
super(OPCODE);
|
||||
this.loginName = loginName;
|
||||
this.sessionId = sessionId;
|
||||
// this.lastCharacterId = lastCharacterId;
|
||||
this.characters = characters;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param session
|
||||
* the session
|
||||
* @param characters
|
||||
* the characters
|
||||
* @return an {@link SM_CHAR_LIST} instance
|
||||
*/
|
||||
public static SM_CHAR_LIST fromL2Session(Lineage2Session session,
|
||||
L2Character... characters) {
|
||||
return new SM_CHAR_LIST(session.getAccountID().getID(),
|
||||
session.getPlayKey2(), -1, characters);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param session
|
||||
* the session
|
||||
* @param characters
|
||||
* the characters
|
||||
* @return an {@link SM_CHAR_LIST} instance
|
||||
*/
|
||||
public static SM_CHAR_LIST fromL2Session(Lineage2Session session,
|
||||
Collection<L2Character> characters) {
|
||||
return fromL2Session(session,
|
||||
characters.toArray(new L2Character[characters.size()]));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
// 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
|
||||
// (RequestCharacterTemplatesPacket) Response: (CharacterTemplatePacket)
|
||||
buffer.writeInt(7); // max chars
|
||||
buffer.writeByte(0x00);
|
||||
|
||||
// int i = 0;
|
||||
for (final L2Character character : characters) {
|
||||
BufferUtils.writeString(buffer, character.getName());
|
||||
buffer.writeInt(character.getID().getID());
|
||||
BufferUtils.writeString(buffer, loginName);
|
||||
buffer.writeInt(sessionId);
|
||||
buffer.writeInt((character.getClanID() != null ? character
|
||||
.getClanID().getID() : 0x00)); // clan id
|
||||
buffer.writeInt(0x00); // ??
|
||||
|
||||
buffer.writeInt(character.getSex().option); // sex
|
||||
buffer.writeInt(character.getRace().id); // race
|
||||
|
||||
// if (character.getClassId() == character.getBaseClassId())
|
||||
buffer.writeInt(character.getCharacterClass().id); // base class id
|
||||
// or class id
|
||||
// else
|
||||
// buffer.writeInt(character.getBaseClassId());
|
||||
|
||||
buffer.writeInt(1); // active ??
|
||||
|
||||
buffer.writeInt(character.getPoint().getX()); // x
|
||||
buffer.writeInt(character.getPoint().getY()); // y
|
||||
buffer.writeInt(character.getPoint().getZ()); // z
|
||||
|
||||
buffer.writeDouble(character.getHP()); // hp cur
|
||||
buffer.writeDouble(character.getMP()); // mp cur
|
||||
|
||||
buffer.writeInt(character.getSP()); // sp
|
||||
buffer.writeLong(character.getExperience()); // exp
|
||||
buffer.writeInt(character.getLevel()); // level
|
||||
|
||||
buffer.writeInt(character.getKarma()); // karma
|
||||
buffer.writeInt(character.getPkKills()); // pk
|
||||
buffer.writeInt(character.getPvpKills()); // pvp
|
||||
|
||||
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
|
||||
|
||||
writePaperdollItemID(buffer, character, HAIR1);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
|
||||
// hair style
|
||||
buffer.writeInt(character.getAppearance().getHairStyle().option);
|
||||
// hair color
|
||||
buffer.writeInt(character.getAppearance().getHairColor().option);
|
||||
// face
|
||||
buffer.writeInt(character.getAppearance().getFace().option);
|
||||
|
||||
buffer.writeDouble(character.getStats().getMaxHP()); // hp max
|
||||
buffer.writeDouble(character.getStats().getMaxMP()); // mp max
|
||||
|
||||
buffer.writeInt(0x0); // seconds left before delete
|
||||
buffer.writeInt(character.getCharacterClass().id); // class
|
||||
buffer.writeInt(1); // c3 auto-select char
|
||||
|
||||
buffer.writeByte(0x00); // enchant effect
|
||||
|
||||
buffer.writeInt(0x00); // augmentation id
|
||||
|
||||
// Currently on retail when you are on character select you don't
|
||||
// see your transformation.
|
||||
buffer.writeInt(0x00);
|
||||
|
||||
// Freya by Vistall:
|
||||
// npdid - 16024 Tame Tiny Baby Kookaburra
|
||||
buffer.writeInt(16024); // A9E89C
|
||||
buffer.writeInt(0); // level
|
||||
buffer.writeInt(0); // ?
|
||||
buffer.writeInt(0); // food? - 1200
|
||||
buffer.writeDouble(0); // max Hp
|
||||
buffer.writeDouble(0); // cur Hp
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the paperdoll item id
|
||||
*
|
||||
* @param buffer
|
||||
* the buffer
|
||||
* @param character
|
||||
* the character
|
||||
* @param paperdoll
|
||||
* the slot
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet updates the movement type
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_MOVE_TYPE extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x28;
|
||||
|
||||
/**
|
||||
* The character
|
||||
*/
|
||||
private final L2Character character;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character
|
||||
*/
|
||||
public SM_CHAR_MOVE_TYPE(L2Character character) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(character.getID().getID());
|
||||
buffer.writeInt(character.getMoveType().id);
|
||||
buffer.writeInt(0x00); // unk
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* An packet authorizing the client to open the map
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_OPEN_MAP extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0xa3;
|
||||
|
||||
/**
|
||||
* The map ID
|
||||
*/
|
||||
private final int mapID;
|
||||
|
||||
/**
|
||||
* @param mapID
|
||||
* the map id
|
||||
*/
|
||||
public SM_CHAR_OPEN_MAP(int mapID) {
|
||||
super(OPCODE);
|
||||
this.mapID = mapID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(mapID);
|
||||
buffer.writeByte(0x00); // seven signs period
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet responds to the Restart request
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_RESTART extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x71;
|
||||
|
||||
/**
|
||||
* The restart state
|
||||
*/
|
||||
private boolean state;
|
||||
|
||||
/**
|
||||
* @param state
|
||||
* the state
|
||||
*/
|
||||
public SM_CHAR_RESTART(boolean state) {
|
||||
super(OPCODE);
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an OK instance of this packet
|
||||
*/
|
||||
public static SM_CHAR_RESTART ok() {
|
||||
return new SM_CHAR_RESTART(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an FAILED instance of this packet
|
||||
*/
|
||||
public static SM_CHAR_RESTART denied() {
|
||||
return new SM_CHAR_RESTART(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeByte((state ? 0x01 : 0x00));
|
||||
}
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.model.world.actor.ActorExperience;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This packet notifies the client that the chosen character has been
|
||||
* successfully selected.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_SELECTED extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x0b;
|
||||
|
||||
/**
|
||||
* The selected character
|
||||
*/
|
||||
private final L2Character character;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character
|
||||
*/
|
||||
public SM_CHAR_SELECTED(L2Character character) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
BufferUtils.writeString(buffer, character.getName());
|
||||
buffer.writeInt(character.getID().getID());
|
||||
BufferUtils.writeString(buffer, "It works!"); // title
|
||||
buffer.writeInt(conn.getSession().getPlayKey1());
|
||||
buffer.writeInt((character.getClanID() != null ? character.getClanID()
|
||||
.getID() : 0));
|
||||
buffer.writeInt(0x00); // ??
|
||||
buffer.writeInt(character.getSex().option);
|
||||
buffer.writeInt(character.getRace().id);
|
||||
buffer.writeInt(character.getCharacterClass().id);
|
||||
buffer.writeInt(0x01); // active ??
|
||||
buffer.writeInt(character.getPoint().getX());
|
||||
buffer.writeInt(character.getPoint().getY());
|
||||
buffer.writeInt(character.getPoint().getZ());
|
||||
|
||||
buffer.writeDouble(20); // cur hp
|
||||
buffer.writeDouble(20); // cur mp
|
||||
buffer.writeInt(0); // sp
|
||||
buffer.writeLong(ActorExperience.LEVEL_1.experience);
|
||||
buffer.writeInt(ActorExperience.LEVEL_1.level);
|
||||
buffer.writeInt(0); // karma
|
||||
buffer.writeInt(0); // pk
|
||||
buffer.writeInt(character.getStats().getIntelligence());
|
||||
buffer.writeInt(character.getStats().getStrength());
|
||||
buffer.writeInt(character.getStats().getConcentration());
|
||||
buffer.writeInt(character.getStats().getMentality());
|
||||
buffer.writeInt(character.getStats().getDexterity());
|
||||
buffer.writeInt(character.getStats().getWitness());
|
||||
|
||||
buffer.writeInt(0); // game time
|
||||
buffer.writeInt(0x00); // unk
|
||||
|
||||
buffer.writeInt(character.getCharacterClass().id);
|
||||
|
||||
buffer.writeInt(0x00);// unk
|
||||
buffer.writeInt(0x00);// unk
|
||||
buffer.writeInt(0x00);// unk
|
||||
buffer.writeInt(0x00);// unk
|
||||
|
||||
buffer.writeBytes(new byte[64]); // unk
|
||||
buffer.writeInt(0x00);// unk
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.game.CharacterShortcut;
|
||||
import com.l2jserver.model.world.character.CharacterShortcutContainer;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet sends to the client his shortcut list
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_SHORTCUT_LIST extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x45;
|
||||
|
||||
/**
|
||||
* The shortcut list
|
||||
*/
|
||||
private final CharacterShortcutContainer shortcuts;
|
||||
|
||||
/**
|
||||
* @param shortcuts
|
||||
* the shortcuts container
|
||||
*/
|
||||
public SM_CHAR_SHORTCUT_LIST(CharacterShortcutContainer shortcuts) {
|
||||
super(OPCODE);
|
||||
this.shortcuts = shortcuts;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(shortcuts.getShortcutCount());
|
||||
for (final CharacterShortcut shortcut : shortcuts) {
|
||||
buffer.writeInt(shortcut.getType().id);
|
||||
buffer.writeInt(shortcut.getPage() * 12 + shortcut.getSlot());
|
||||
switch (shortcut.getType()) {
|
||||
case ITEM:
|
||||
buffer.writeInt(shortcut.getItemID().getID());
|
||||
buffer.writeInt(0x01); // unk1f
|
||||
buffer.writeInt(-1); // reuse group
|
||||
buffer.writeInt(0x00); // unk2
|
||||
buffer.writeInt(0x00); // unk3
|
||||
buffer.writeShort(0x00); // unk4
|
||||
buffer.writeShort(0x00); // unk5
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.game.CharacterShortcut;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet informs the client that a new shortcut has been created
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_SHORTCUT_REGISTER extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x44;
|
||||
|
||||
/**
|
||||
* The shortcut
|
||||
*/
|
||||
private final CharacterShortcut shortcut;
|
||||
|
||||
/**
|
||||
* @param shortcut
|
||||
* the shortcut registered
|
||||
*/
|
||||
public SM_CHAR_SHORTCUT_REGISTER(CharacterShortcut shortcut) {
|
||||
super(OPCODE);
|
||||
this.shortcut = shortcut;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(shortcut.getType().id);
|
||||
buffer.writeInt(shortcut.getPage() * 12 + shortcut.getSlot());
|
||||
switch (shortcut.getType()) {
|
||||
case ITEM:
|
||||
buffer.writeInt(shortcut.getItemID().getID());
|
||||
buffer.writeInt(0x01); // unk1f
|
||||
buffer.writeInt(-1); // reuse group
|
||||
buffer.writeInt(0x00); // unk2
|
||||
buffer.writeInt(0x00); // unk3
|
||||
buffer.writeShort(0x00); // unk4
|
||||
buffer.writeShort(0x00); // unk5
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* An packet that sends all character templates to the client.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_STOP extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x47;
|
||||
|
||||
/**
|
||||
* The character
|
||||
*/
|
||||
private L2Character character;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character
|
||||
*/
|
||||
public SM_CHAR_STOP(L2Character character) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(character.getID().getID());
|
||||
buffer.writeInt(character.getPoint().getX());
|
||||
buffer.writeInt(character.getPoint().getY());
|
||||
buffer.writeInt(character.getPoint().getZ());
|
||||
buffer.writeInt((int) character.getPoint().getAngle());
|
||||
}
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet notifies the client that the chosen character has been
|
||||
* successfully selected.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_TARGET extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0xb9;
|
||||
|
||||
/**
|
||||
* The selected character
|
||||
*/
|
||||
private final Actor object;
|
||||
/**
|
||||
* The name color
|
||||
*/
|
||||
private int color;
|
||||
|
||||
/**
|
||||
* @param object
|
||||
* the target
|
||||
* @param color
|
||||
* the name color
|
||||
*/
|
||||
public SM_CHAR_TARGET(Actor object, int color) {
|
||||
super(OPCODE);
|
||||
this.object = object;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object
|
||||
* the target
|
||||
*/
|
||||
public SM_CHAR_TARGET(Actor object) {
|
||||
this(object, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(object.getID().getID());
|
||||
buffer.writeShort(color);
|
||||
buffer.writeInt(0x00);
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet notifies the client that the chosen character has been
|
||||
* successfully selected.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_TARGET_UNSELECT extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x24;
|
||||
|
||||
/**
|
||||
* The character that as unselected an object
|
||||
*/
|
||||
private final L2Character character;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character
|
||||
*/
|
||||
public SM_CHAR_TARGET_UNSELECT(L2Character character) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(character.getID().getID());
|
||||
buffer.writeInt(character.getPoint().getX());
|
||||
buffer.writeInt(character.getPoint().getY());
|
||||
buffer.writeInt(character.getPoint().getZ());
|
||||
buffer.writeInt(0x00); // ??
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.geometry.Point3D;
|
||||
|
||||
/**
|
||||
* This packet notifies the client that the chosen character has been
|
||||
* successfully selected.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_TELEPORT extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x22;
|
||||
|
||||
/**
|
||||
* The selected character
|
||||
*/
|
||||
private final L2Character character;
|
||||
/**
|
||||
* The teleportation point
|
||||
*/
|
||||
private final Point3D point;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character
|
||||
* @param point
|
||||
* the teleport point
|
||||
*/
|
||||
public SM_CHAR_TELEPORT(L2Character character, Point3D point) {
|
||||
super(OPCODE);
|
||||
this.character = character;
|
||||
this.point = point;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(character.getID().getID());
|
||||
buffer.writeInt(point.getX());
|
||||
buffer.writeInt(point.getY());
|
||||
buffer.writeInt(point.getZ());
|
||||
buffer.writeInt(0x00); // isValidation ??
|
||||
buffer.writeInt((int) point.getAngle()); // nYaw
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.template.CharacterTemplate;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* An packet that sends all character templates to the client.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_CHAR_TEMPLATE extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x0d;
|
||||
|
||||
/**
|
||||
* The character template list
|
||||
*/
|
||||
private CharacterTemplate[] templates;
|
||||
|
||||
/**
|
||||
* @param templates
|
||||
* the character templates
|
||||
*/
|
||||
public SM_CHAR_TEMPLATE(CharacterTemplate... templates) {
|
||||
super(OPCODE);
|
||||
this.templates = templates;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(templates.length);
|
||||
for (final CharacterTemplate template : templates) {
|
||||
buffer.writeInt(template.getID().getCharacterClass().race.id);
|
||||
buffer.writeInt(template.getID().getCharacterClass().id);
|
||||
buffer.writeInt(0x46);
|
||||
buffer.writeInt(template.getStats().getBase().getStr());
|
||||
buffer.writeInt(0x0a);
|
||||
buffer.writeInt(0x46);
|
||||
buffer.writeInt(template.getStats().getBase().getDex());
|
||||
buffer.writeInt(0x0a);
|
||||
buffer.writeInt(0x46);
|
||||
buffer.writeInt(template.getStats().getBase().getDex());
|
||||
buffer.writeInt(0x0a);
|
||||
buffer.writeInt(0x46);
|
||||
buffer.writeInt(template.getStats().getBase().getInt());
|
||||
buffer.writeInt(0x0a);
|
||||
buffer.writeInt(0x46);
|
||||
buffer.writeInt(template.getStats().getBase().getWit());
|
||||
buffer.writeInt(0x0a);
|
||||
buffer.writeInt(0x46);
|
||||
buffer.writeInt(template.getStats().getBase().getMen());
|
||||
buffer.writeInt(0x0a);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.htmlparser.tags.Html;
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
import com.l2jserver.util.html.markup.HtmlTemplate;
|
||||
|
||||
/**
|
||||
* This packet sends an HTML message to be displayed in the client. As opposed
|
||||
* to {@link SM_HTML}, this one displays it in the community board window.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_COMMUNITY_HTML extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x7b;
|
||||
|
||||
/**
|
||||
* The HTML contents
|
||||
*/
|
||||
private final String html;
|
||||
|
||||
/**
|
||||
* @param html
|
||||
* the html
|
||||
*/
|
||||
public SM_COMMUNITY_HTML(String html) {
|
||||
super(OPCODE);
|
||||
this.html = html;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param html
|
||||
* the html
|
||||
*/
|
||||
public SM_COMMUNITY_HTML(Html html) {
|
||||
super(OPCODE);
|
||||
this.html = html.toHtml();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param template
|
||||
* the html template
|
||||
*/
|
||||
public SM_COMMUNITY_HTML(HtmlTemplate template) {
|
||||
super(OPCODE);
|
||||
this.html = template.toHtmlString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeByte(0x01); // display or hide
|
||||
BufferUtils.writeString(buffer, html);
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.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 SM_FORT_INFO extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0xfe;
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
*/
|
||||
public SM_FORT_INFO() {
|
||||
super(OPCODE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client 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
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.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 SM_GG_QUERY extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x74;
|
||||
/**
|
||||
* The GG key
|
||||
*/
|
||||
private final int[] key;
|
||||
|
||||
/**
|
||||
* @param key
|
||||
* the game guard key
|
||||
*/
|
||||
public SM_GG_QUERY(int[] key) {
|
||||
super(OPCODE);
|
||||
Preconditions.checkArgument(key.length == 4,
|
||||
"key must by an 4-length array");
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param key1
|
||||
* the game guard key 1
|
||||
* @param key2
|
||||
* the game guard key 2
|
||||
* @param key3
|
||||
* the game guard key 3
|
||||
* @param key4
|
||||
* the game guard key 4
|
||||
*/
|
||||
public SM_GG_QUERY(int key1, int key2, int key3, int key4) {
|
||||
super(OPCODE);
|
||||
this.key = new int[4];
|
||||
this.key[0] = key1;
|
||||
this.key[1] = key2;
|
||||
this.key[2] = key3;
|
||||
this.key[3] = key4;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
for (final int part : key) {
|
||||
buffer.writeInt(part);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.htmlparser.tags.Html;
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.NPC;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
import com.l2jserver.util.html.markup.HtmlTemplate;
|
||||
|
||||
/**
|
||||
* This packet sends an HTML message to be displayed in the client.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_HTML extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x19;
|
||||
|
||||
/**
|
||||
* The saying NPC
|
||||
*/
|
||||
private final NPC npc;
|
||||
/**
|
||||
* The HTML contents
|
||||
*/
|
||||
private final String html;
|
||||
|
||||
/**
|
||||
* @param npc
|
||||
* the npc instance
|
||||
* @param html
|
||||
* the html
|
||||
*/
|
||||
public SM_HTML(NPC npc, String html) {
|
||||
super(OPCODE);
|
||||
this.npc = npc;
|
||||
this.html = html;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param npc
|
||||
* the npc instance
|
||||
* @param html
|
||||
* the html
|
||||
*/
|
||||
public SM_HTML(NPC npc, Html html) {
|
||||
super(OPCODE);
|
||||
this.npc = npc;
|
||||
this.html = html.toHtml();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param npc
|
||||
* the npc instance
|
||||
* @param template
|
||||
* the html template
|
||||
*/
|
||||
public SM_HTML(NPC npc, HtmlTemplate template) {
|
||||
super(OPCODE);
|
||||
this.npc = npc;
|
||||
this.html = template.toHtmlString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param html
|
||||
* the html
|
||||
*/
|
||||
public SM_HTML(String html) {
|
||||
this(null, html);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param html
|
||||
* the html
|
||||
*/
|
||||
public SM_HTML(Html html) {
|
||||
this(null, html);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param template
|
||||
* the html template
|
||||
*/
|
||||
public SM_HTML(HtmlTemplate template) {
|
||||
this(null, template);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt((npc != null ? npc.getID().getID() : 0x01));
|
||||
BufferUtils.writeString(buffer, html);
|
||||
buffer.writeInt(0x00); // item id
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet sends an item that is dropped on the ground
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_ITEM_GROUND extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x16;
|
||||
/**
|
||||
* The item that is on the ground
|
||||
*/
|
||||
private final Item item;
|
||||
|
||||
/**
|
||||
* @param item
|
||||
* the item that is on the ground
|
||||
*/
|
||||
public SM_ITEM_GROUND(Item item) {
|
||||
super(OPCODE);
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt((item.getOwnerID() != null ? item.getOwnerID().getID()
|
||||
: 0)); // char who dropped
|
||||
buffer.writeInt(item.getID().getID()); // item obj id
|
||||
buffer.writeInt(item.getTemplateID().getID()); // item template id
|
||||
|
||||
buffer.writeInt(item.getPoint().getX()); // x
|
||||
buffer.writeInt(item.getPoint().getY()); // y
|
||||
buffer.writeInt(item.getPoint().getZ()); // z
|
||||
// only show item count if it is a stackable item
|
||||
buffer.writeInt(0x01); // show count
|
||||
buffer.writeLong(item.getCount()); // count
|
||||
|
||||
buffer.writeInt(0); // unknown
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.server.AttackHit;
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.L2Character;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet makes an character pick up an item
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
* @see AttackHit
|
||||
*/
|
||||
public class SM_ITEM_PICK extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x17;
|
||||
|
||||
/**
|
||||
* The {@link Item} being picked up
|
||||
*/
|
||||
private final Item item;
|
||||
/**
|
||||
* The {@link L2Character} picking the item
|
||||
*/
|
||||
private final L2Character character;
|
||||
|
||||
/**
|
||||
* @param character
|
||||
* the character that is picking the <code>item</code>
|
||||
* @param item
|
||||
* the item that is being picked
|
||||
*/
|
||||
public SM_ITEM_PICK(L2Character character, Item item) {
|
||||
super(OPCODE);
|
||||
this.item = item;
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(character.getID().getID());
|
||||
buffer.writeInt(item.getID().getID());
|
||||
|
||||
buffer.writeInt(item.getPoint().getX());
|
||||
buffer.writeInt(item.getPoint().getY());
|
||||
buffer.writeInt(item.getPoint().getZ());
|
||||
}
|
||||
}
|
||||
@@ -1,128 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.Lineage2CryptographyKey;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet send the encryptation keys for the client. After this message all
|
||||
* communication is done with the cryptography engine enabled.
|
||||
*
|
||||
* <pre>
|
||||
* (c) cbddcd
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_KEY extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x2e;
|
||||
|
||||
/**
|
||||
* 8-byte key cryptography key
|
||||
*/
|
||||
private byte[] key;
|
||||
/**
|
||||
* The protocol state. True if valid, false if not.
|
||||
*/
|
||||
private boolean status;
|
||||
|
||||
/**
|
||||
* @param key
|
||||
* the cryptography key
|
||||
* @param status
|
||||
* the status
|
||||
*/
|
||||
public SM_KEY(Lineage2CryptographyKey key, boolean status) {
|
||||
super(OPCODE);
|
||||
this.key = Arrays.copyOfRange(key.key, 0, 8);
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link SM_KEY} with <tt>key</tt> and valid protocol.
|
||||
*
|
||||
* @param key
|
||||
* the key
|
||||
* @return the new instance
|
||||
*/
|
||||
public static SM_KEY valid(Lineage2CryptographyKey key) {
|
||||
return new SM_KEY(key, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link SM_KEY} with <tt>key</tt> and invalid protocol.
|
||||
*
|
||||
* @param key
|
||||
* the key
|
||||
* @return the new instance
|
||||
*/
|
||||
public static SM_KEY invalid(Lineage2CryptographyKey key) {
|
||||
return new SM_KEY(key, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeByte((status ? 0x01 : 0x00));
|
||||
for (int i = 0; i < 8; i++) {
|
||||
buffer.writeByte(key[i]);
|
||||
}
|
||||
// buffer.writeBytes(key);
|
||||
buffer.writeInt(0x01);
|
||||
buffer.writeInt(0x01); // server id
|
||||
buffer.writeByte(0x01);
|
||||
buffer.writeInt(0x00); // obfuscation key
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the key
|
||||
*/
|
||||
public byte[] getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param key
|
||||
* the key to set
|
||||
*/
|
||||
public void setKey(byte[] key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the status
|
||||
*/
|
||||
public boolean isStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param status
|
||||
* the status to set
|
||||
*/
|
||||
public void setStatus(boolean status) {
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.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 SM_MANOR_LIST extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0xfe;
|
||||
|
||||
/**
|
||||
* List of manors to be sent
|
||||
*/
|
||||
private String[] manors;
|
||||
|
||||
/**
|
||||
* @param manors
|
||||
* the manors
|
||||
*/
|
||||
public SM_MANOR_LIST(String... manors) {
|
||||
super(OPCODE);
|
||||
this.manors = manors;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeShort(0x22);
|
||||
buffer.writeInt(manors.length);
|
||||
int i = 1;
|
||||
for (String manor : manors) {
|
||||
buffer.writeInt(i++);
|
||||
BufferUtils.writeString(buffer, manor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.template.NPCTemplate;
|
||||
import com.l2jserver.model.world.NPC;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This packet sends to the client an actor information about an actor
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_NPC_INFO extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x0c;
|
||||
/**
|
||||
* The {@link NPC}
|
||||
*/
|
||||
private final NPC npc;
|
||||
|
||||
/**
|
||||
* @param npc
|
||||
* the npc
|
||||
*/
|
||||
public SM_NPC_INFO(NPC npc) {
|
||||
super(OPCODE);
|
||||
this.npc = npc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
final NPCTemplate template = npc.getTemplate();
|
||||
|
||||
buffer.writeInt(npc.getID().getID());
|
||||
buffer.writeInt(template.getID().getID() + 1000000); // npctype
|
||||
// id
|
||||
// buffer.writeInt((template.isAttackable() ? 0x01 : 0x00)); //
|
||||
// attackable
|
||||
// FIXME unhard code it
|
||||
buffer.writeInt(0x00); // attackable
|
||||
buffer.writeInt(npc.getPoint().getX());
|
||||
buffer.writeInt(npc.getPoint().getY());
|
||||
buffer.writeInt(npc.getPoint().getZ());
|
||||
buffer.writeInt((int) npc.getPoint().getAngle());
|
||||
buffer.writeInt(0x00); // unk
|
||||
buffer.writeInt(npc.getStats().getMagicalAttackSpeed());
|
||||
buffer.writeInt(npc.getStats().getPhysicalAttackSpeed());
|
||||
buffer.writeInt(npc.getStats().getRunSpeed());
|
||||
buffer.writeInt(npc.getStats().getWalkSpeed());
|
||||
buffer.writeInt(npc.getStats().getRunSpeed()); // swim run speed
|
||||
buffer.writeInt(npc.getStats().getWalkSpeed()); // swim walk speed
|
||||
buffer.writeInt(npc.getStats().getRunSpeed()); // swim run speed
|
||||
buffer.writeInt(npc.getStats().getWalkSpeed()); // swim walk speed
|
||||
buffer.writeInt(npc.getStats().getRunSpeed()); // fly run speed
|
||||
buffer.writeInt(npc.getStats().getWalkSpeed()); // fly run speed
|
||||
buffer.writeDouble(0x01); // TODO
|
||||
buffer.writeDouble(0x01);// TODO
|
||||
buffer.writeDouble(template.getInfo().getCollision().getRadius());
|
||||
buffer.writeDouble(template.getInfo().getCollision().getHeigth());
|
||||
if (template.getInfo().getItem() != null) {
|
||||
buffer.writeInt((template.getInfo().getItem().getRightHand() != null ? template
|
||||
.getInfo().getItem().getRightHand().getID()
|
||||
: 0x00));
|
||||
} else {
|
||||
buffer.writeInt(0x00);
|
||||
}
|
||||
buffer.writeInt(0x00); // chest
|
||||
if (template.getInfo().getItem() != null) {
|
||||
buffer.writeInt((template.getInfo().getItem().getLeftHand() != null ? template
|
||||
.getInfo().getItem().getLeftHand().getID()
|
||||
: 0x00));
|
||||
} else {
|
||||
buffer.writeInt(0x00);
|
||||
}
|
||||
buffer.writeByte(1); // name above char 1=true ... ??
|
||||
buffer.writeByte(0x00); // is running
|
||||
buffer.writeByte((npc.isAttacking() ? 0x01 : 0x00)); // is in combat
|
||||
buffer.writeByte((npc.isDead() ? 0x01 : 0x00)); // is like dead (faking)
|
||||
buffer.writeByte(0x00); // 0=teleported 1=default 2=summoned
|
||||
BufferUtils.writeString(buffer,
|
||||
(template.getInfo().getName() != null ? template.getInfo()
|
||||
.getName().getValue() : null));
|
||||
BufferUtils.writeString(buffer,
|
||||
(template.getInfo().getTitle() != null ? template.getInfo()
|
||||
.getTitle().getValue() : null));
|
||||
buffer.writeInt(0x00); // Title color 0=client default
|
||||
buffer.writeInt(0x00); // pvp flag
|
||||
buffer.writeInt(0x00); // karma
|
||||
|
||||
buffer.writeInt(0x00); // C2 - abnormal effect
|
||||
buffer.writeInt(0x00); // clan id
|
||||
buffer.writeInt(0x00); // crest id
|
||||
buffer.writeInt(0x00); // ally id
|
||||
buffer.writeInt(0x00); // all crest
|
||||
buffer.writeByte(0x00); // C2 - is flying
|
||||
buffer.writeByte(0x00); // title color 0=client
|
||||
|
||||
buffer.writeDouble(template.getInfo().getCollision().getRadius());
|
||||
buffer.writeDouble(template.getInfo().getCollision().getHeigth());
|
||||
buffer.writeInt(0x00); // C4 - enchant effect
|
||||
buffer.writeInt(0x00); // C6 -- is flying
|
||||
buffer.writeInt(0x00); // unk
|
||||
buffer.writeInt(0x00);// CT1.5 Pet form and skills, Color effect
|
||||
buffer.writeByte((template.getInfo().getName() != null
|
||||
&& template.getInfo().getName().isDisplay() ? 0x01 : 0x00)); // hide
|
||||
// name
|
||||
buffer.writeByte((template.getInfo().getName() != null
|
||||
&& template.getInfo().getName().isDisplay() ? 0x01 : 0x00)); // hide
|
||||
// name,
|
||||
// again
|
||||
|
||||
buffer.writeInt(0x00); // special effects
|
||||
buffer.writeInt(0x00); // display effect
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.world.PositionableObject;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
|
||||
/**
|
||||
* This packet informs the client that an certain object has disappeared from
|
||||
* his sight or from the world.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_OBJECT_REMOVE extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x08;
|
||||
|
||||
/**
|
||||
* The Object
|
||||
*/
|
||||
private final PositionableObject object;
|
||||
|
||||
/**
|
||||
* @param object
|
||||
* the object to be removed
|
||||
*/
|
||||
public SM_OBJECT_REMOVE(PositionableObject object) {
|
||||
super(OPCODE);
|
||||
this.object = object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(object.getID().getID());
|
||||
buffer.writeInt(0x00);
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.template.NPCTemplate;
|
||||
import com.l2jserver.model.world.NPC;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
|
||||
/**
|
||||
* This packet sends to the client an actor information about an actor (except
|
||||
* players)
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_SERVER_OBJECT extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x92;
|
||||
/**
|
||||
* The {@link NPC}
|
||||
*/
|
||||
private final NPC npc;
|
||||
|
||||
/**
|
||||
* @param npc
|
||||
* the npc
|
||||
*/
|
||||
public SM_SERVER_OBJECT(NPC npc) {
|
||||
super(OPCODE);
|
||||
this.npc = npc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
final NPCTemplate template = npc.getTemplate();
|
||||
|
||||
buffer.writeInt(npc.getID().getID()); // obj id
|
||||
buffer.writeInt(npc.getTemplateID().getID() + 1000000); // template id
|
||||
BufferUtils
|
||||
.writeString(buffer, template.getInfo().getName().getValue()); // name
|
||||
buffer.writeInt((template.getInfo().isAttackable() ? 0x01 : 0x00)); // attackable
|
||||
buffer.writeInt(npc.getPoint().getX()); // x
|
||||
buffer.writeInt(npc.getPoint().getY()); // y
|
||||
buffer.writeInt(npc.getPoint().getZ()); // z
|
||||
buffer.writeInt((int) npc.getPoint().getAngle()); // angle
|
||||
buffer.writeDouble(0x01); // move mult
|
||||
buffer.writeDouble(0x01); // attack spd mult
|
||||
buffer.writeDouble(template.getInfo().getCollision().getRadius());
|
||||
buffer.writeDouble(template.getInfo().getCollision().getHeigth());
|
||||
buffer.writeInt((int) (template.getInfo().isAttackable() ? npc.getHP()
|
||||
: 0x00));
|
||||
buffer.writeInt((int) (template.getInfo().isAttackable() ? template
|
||||
.getInfo().getStats().getHp() : 0x00));
|
||||
buffer.writeInt(0x01); // object type
|
||||
buffer.writeInt(0x00); // special effects
|
||||
}
|
||||
}
|
||||
@@ -1,377 +0,0 @@
|
||||
/*
|
||||
* This file is part of l2jserver2 <l2jserver2.com>.
|
||||
*
|
||||
* l2jserver2 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.
|
||||
*
|
||||
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.game.net.packet.server;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import com.l2jserver.model.game.Castle;
|
||||
import com.l2jserver.model.game.Fort;
|
||||
import com.l2jserver.model.game.Skill;
|
||||
import com.l2jserver.model.template.ItemTemplate;
|
||||
import com.l2jserver.model.template.SkillTemplate;
|
||||
import com.l2jserver.model.world.Actor;
|
||||
import com.l2jserver.model.world.Item;
|
||||
import com.l2jserver.model.world.NPC;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.SystemMessage;
|
||||
import com.l2jserver.service.network.model.packet.AbstractServerPacket;
|
||||
import com.l2jserver.util.BufferUtils;
|
||||
import com.l2jserver.util.factory.CollectionFactory;
|
||||
|
||||
/**
|
||||
* This packet sends an System Message to the client. Most messages appear in
|
||||
* the console.
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public class SM_SYSTEM_MESSAGE extends AbstractServerPacket {
|
||||
/**
|
||||
* The packet OPCODE
|
||||
*/
|
||||
public static final int OPCODE = 0x62;
|
||||
|
||||
/**
|
||||
* The System message id
|
||||
*/
|
||||
private int id;
|
||||
/**
|
||||
* The system message parameters
|
||||
*/
|
||||
private List<SystemMessagePacketParameter> params = CollectionFactory
|
||||
.newList();
|
||||
|
||||
/**
|
||||
* System message parameter IDs
|
||||
*
|
||||
* @author <a href="http://www.rogiel.com">Rogiel</a>
|
||||
*/
|
||||
public interface SystemMessagePacketParameter {
|
||||
/**
|
||||
* String parameter
|
||||
*/
|
||||
public static final byte TYPE_SYSTEM_STRING = 13;
|
||||
/**
|
||||
* Player name parameter
|
||||
*/
|
||||
public static final byte TYPE_PLAYER_NAME = 12;
|
||||
// id 11 - unknown
|
||||
/**
|
||||
* Instance name parameter
|
||||
*/
|
||||
public static final byte TYPE_INSTANCE_NAME = 10;
|
||||
/**
|
||||
* Element name parameter
|
||||
*/
|
||||
public static final byte TYPE_ELEMENT_NAME = 9;
|
||||
// id 8 - same as 3
|
||||
/**
|
||||
* Zone name parameter
|
||||
*/
|
||||
public static final byte TYPE_ZONE_NAME = 7;
|
||||
/**
|
||||
* {@link Item} number parameter
|
||||
*/
|
||||
public static final byte TYPE_ITEM_NUMBER = 6;
|
||||
/**
|
||||
* {@link Castle} name parameter
|
||||
*/
|
||||
public static final byte TYPE_CASTLE_NAME = 5;
|
||||
/**
|
||||
* {@link Skill} name parameter
|
||||
*/
|
||||
public static final byte TYPE_SKILL_NAME = 4;
|
||||
/**
|
||||
* {@link Item} name parameter
|
||||
*/
|
||||
public static final byte TYPE_ITEM_NAME = 3;
|
||||
/**
|
||||
* {@link NPC} name parameter
|
||||
*/
|
||||
public static final byte TYPE_NPC_NAME = 2;
|
||||
/**
|
||||
* Number parameter
|
||||
*/
|
||||
public static final byte TYPE_NUMBER = 1;
|
||||
/**
|
||||
* Text parameter
|
||||
*/
|
||||
public static final byte TYPE_TEXT = 0;
|
||||
|
||||
/**
|
||||
* @param conn
|
||||
* the connection
|
||||
* @param buffer
|
||||
* the buffer
|
||||
*/
|
||||
void write(Lineage2Client conn, ChannelBuffer buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
*
|
||||
* @param message
|
||||
* the {@link SystemMessage}
|
||||
*/
|
||||
public SM_SYSTEM_MESSAGE(SystemMessage message) {
|
||||
super(OPCODE);
|
||||
this.id = message.id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(id);
|
||||
buffer.writeInt(params.size());
|
||||
for (final SystemMessagePacketParameter param : params) {
|
||||
param.write(conn, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an string parameter
|
||||
*
|
||||
* @param text
|
||||
* the text
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addString(final String text) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_TEXT);
|
||||
BufferUtils.writeString(buffer, text);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Castlename-e.dat<br>
|
||||
* 0-9 Castle names<br>
|
||||
* 21-64 CH names<br>
|
||||
* 81-89 Territory names<br>
|
||||
* 101-121 Fortress names<br>
|
||||
*
|
||||
* @param fort
|
||||
* the fort
|
||||
* @return the {@link SM_SYSTEM_MESSAGE} instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addFort(final Fort fort) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_CASTLE_NAME);
|
||||
buffer.writeInt(fort.getID().getID());
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an number parameter
|
||||
*
|
||||
* @param number
|
||||
* the number
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addNumber(final int number) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_NUMBER);
|
||||
buffer.writeInt(number);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an item count parameter
|
||||
*
|
||||
* @param number
|
||||
* the number
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addItemCount(final long number) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_ITEM_NUMBER);
|
||||
buffer.writeLong(number);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an the actor name
|
||||
*
|
||||
* @param actor
|
||||
* the actor
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addActorName(final Actor actor) {
|
||||
// params.add(new SystemMessagePacketParameter() {
|
||||
// @Override
|
||||
// public void write(Lineage2Connection conn, ChannelBuffer buffer) {
|
||||
// // buffer.writeInt(TYPE_TEXT);
|
||||
// // buffer.writeInt(number);
|
||||
// // TODO
|
||||
// }
|
||||
// });
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the item name
|
||||
*
|
||||
* @param item
|
||||
* the item
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addItem(final ItemTemplate item) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_ITEM_NAME);
|
||||
buffer.writeInt(item.getID().getID());
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the item name
|
||||
*
|
||||
* @param item
|
||||
* the item
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addItem(final Item item) {
|
||||
return addItem(item.getTemplateID().getTemplate());
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the zone name
|
||||
*
|
||||
* @param x
|
||||
* the x
|
||||
* @param y
|
||||
* the y
|
||||
* @param z
|
||||
* the z
|
||||
*
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addZoneName(final int x, final int y,
|
||||
final int z) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_ZONE_NAME);
|
||||
buffer.writeInt(x);
|
||||
buffer.writeInt(y);
|
||||
buffer.writeInt(z);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param skill
|
||||
* the skill template
|
||||
* @param level
|
||||
* the skill level
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addSkill(final SkillTemplate skill,
|
||||
final int level) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_SKILL_NAME);
|
||||
buffer.writeInt(skill.getID().getID());
|
||||
buffer.writeInt(level);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param skill
|
||||
* the skill
|
||||
* @return this instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addSkill(final Skill skill) {
|
||||
return addSkill(skill.getTemplate(), skill.getLevel());
|
||||
}
|
||||
|
||||
/**
|
||||
* Elemental name - 0(Fire) ...
|
||||
*
|
||||
* @param type
|
||||
* the type
|
||||
* @return the {@link SM_SYSTEM_MESSAGE} instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addElemntal(final int type) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_ELEMENT_NAME);
|
||||
buffer.writeInt(type);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* ID from sysstring-e.dat
|
||||
*
|
||||
* @param type
|
||||
* the type
|
||||
* @return the {@link SM_SYSTEM_MESSAGE} instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addSystemString(final int type) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_SYSTEM_STRING);
|
||||
buffer.writeInt(type);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Instance name from instantzonedata-e.dat
|
||||
*
|
||||
* @param type
|
||||
* id of instance
|
||||
* @return the {@link SM_SYSTEM_MESSAGE} instance
|
||||
*/
|
||||
public final SM_SYSTEM_MESSAGE addInstanceName(final int type) {
|
||||
params.add(new SystemMessagePacketParameter() {
|
||||
@Override
|
||||
public void write(Lineage2Client conn, ChannelBuffer buffer) {
|
||||
buffer.writeInt(TYPE_INSTANCE_NAME);
|
||||
buffer.writeInt(type);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -16,39 +16,17 @@
|
||||
*/
|
||||
package com.l2jserver.service.network;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.jboss.netty.channel.ChannelPipelineFactory;
|
||||
|
||||
import org.jboss.netty.bootstrap.ServerBootstrap;
|
||||
import org.jboss.netty.channel.ChannelFuture;
|
||||
import org.jboss.netty.channel.ChannelFutureListener;
|
||||
import org.jboss.netty.channel.ServerChannel;
|
||||
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
|
||||
import org.jboss.netty.logging.InternalLoggerFactory;
|
||||
import org.jboss.netty.logging.Slf4JLoggerFactory;
|
||||
import org.jboss.netty.util.ThreadNameDeterminer;
|
||||
import org.jboss.netty.util.ThreadRenamingRunnable;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Injector;
|
||||
import com.l2jserver.game.net.Lineage2PipelineFactory;
|
||||
import com.l2jserver.model.id.object.CharacterID;
|
||||
import com.l2jserver.service.AbstractConfigurableService;
|
||||
import com.l2jserver.service.AbstractService.Depends;
|
||||
import com.l2jserver.service.core.logging.LoggingService;
|
||||
import com.l2jserver.service.core.threading.ThreadPool;
|
||||
import com.l2jserver.service.core.threading.ThreadPoolPriority;
|
||||
import com.l2jserver.service.core.threading.ThreadService;
|
||||
import com.l2jserver.service.game.world.WorldService;
|
||||
import com.l2jserver.service.network.keygen.BlowfishKeygenService;
|
||||
import com.l2jserver.service.network.model.Lineage2Client;
|
||||
import com.l2jserver.service.network.model.packet.ServerPacket;
|
||||
import com.l2jserver.util.ThreadPoolUtils;
|
||||
import com.l2jserver.util.factory.CollectionFactory;
|
||||
|
||||
/**
|
||||
* Netty network service implementation
|
||||
@@ -58,44 +36,7 @@ import com.l2jserver.util.factory.CollectionFactory;
|
||||
@Depends({ LoggingService.class, ThreadService.class,
|
||||
BlowfishKeygenService.class, WorldService.class })
|
||||
public class NettyNetworkService extends
|
||||
AbstractConfigurableService<NetworkServiceConfiguration> implements
|
||||
NetworkService {
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private final Logger log = LoggerFactory.getLogger(this.getClass());
|
||||
|
||||
/**
|
||||
* The {@link ThreadService}
|
||||
*/
|
||||
private final ThreadService threadService;
|
||||
|
||||
/**
|
||||
* The Google Guice {@link Injector}
|
||||
*/
|
||||
private final Injector injector;
|
||||
|
||||
/**
|
||||
* Netty Boss {@link ThreadPool}
|
||||
*/
|
||||
private ThreadPool bossPool;
|
||||
/**
|
||||
* Netty Worker {@link ThreadPool}
|
||||
*/
|
||||
private ThreadPool workerPool;
|
||||
/**
|
||||
* The server bootstrap
|
||||
*/
|
||||
private ServerBootstrap server;
|
||||
/**
|
||||
* The server channel
|
||||
*/
|
||||
private ServerChannel channel;
|
||||
/**
|
||||
* The client list. This list all active clients in the server
|
||||
*/
|
||||
private Set<Lineage2Client> clients = CollectionFactory.newSet();
|
||||
|
||||
AbstractNettyNetworkService {
|
||||
/**
|
||||
* @param injector
|
||||
* the {@link Guice} {@link Injector}
|
||||
@@ -104,101 +45,11 @@ public class NettyNetworkService extends
|
||||
*/
|
||||
@Inject
|
||||
public NettyNetworkService(Injector injector, ThreadService threadService) {
|
||||
super(NetworkServiceConfiguration.class);
|
||||
this.threadService = threadService;
|
||||
this.injector = injector;
|
||||
InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());
|
||||
super(injector, threadService);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void doStart() {
|
||||
bossPool = threadService.createThreadPool("netty-boss", 10, 60,
|
||||
TimeUnit.SECONDS, ThreadPoolPriority.HIGH);
|
||||
workerPool = threadService.createThreadPool("netty-worker", 50, 60,
|
||||
TimeUnit.SECONDS, ThreadPoolPriority.HIGH);
|
||||
|
||||
ThreadRenamingRunnable
|
||||
.setThreadNameDeterminer(new ThreadNameDeterminer() {
|
||||
@Override
|
||||
public String determineThreadName(String currentThreadName,
|
||||
String proposedThreadName) throws Exception {
|
||||
return currentThreadName;
|
||||
}
|
||||
});
|
||||
|
||||
server = new ServerBootstrap(new NioServerSocketChannelFactory(
|
||||
ThreadPoolUtils.wrap(bossPool),
|
||||
ThreadPoolUtils.wrap(workerPool), 50));
|
||||
|
||||
server.setPipelineFactory(new Lineage2PipelineFactory(injector, this));
|
||||
channel = (ServerChannel) server.bind(config.getListenAddress());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(final Lineage2Client client) {
|
||||
Preconditions.checkNotNull(client, "client");
|
||||
|
||||
log.debug("Registering client: {}", client);
|
||||
|
||||
clients.add(client);
|
||||
client.getChannel().getCloseFuture()
|
||||
.addListener(new ChannelFutureListener() {
|
||||
@Override
|
||||
public void operationComplete(ChannelFuture future)
|
||||
throws Exception {
|
||||
unregister(client);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(Lineage2Client client) {
|
||||
Preconditions.checkNotNull(client, "client");
|
||||
|
||||
log.debug("Unregistering client: {}", client);
|
||||
clients.remove(client);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Lineage2Client discover(CharacterID character) {
|
||||
Preconditions.checkNotNull(character, "character");
|
||||
|
||||
log.debug("Discovering client object for {}", character);
|
||||
|
||||
for (final Lineage2Client client : clients) {
|
||||
if (character.equals(client.getCharacterID()))
|
||||
return client;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void broadcast(ServerPacket packet) {
|
||||
Preconditions.checkNotNull(packet, "packet");
|
||||
|
||||
log.debug("Broadcasting {} packet to all connected clients", packet);
|
||||
|
||||
channel.write(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cleanup() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doStop() {
|
||||
try {
|
||||
channel.close().awaitUninterruptibly();
|
||||
server.releaseExternalResources();
|
||||
bossPool.dispose();
|
||||
workerPool.dispose();
|
||||
} finally {
|
||||
server = null;
|
||||
channel = null;
|
||||
bossPool = null;
|
||||
workerPool = null;
|
||||
}
|
||||
clients.clear();
|
||||
protected ChannelPipelineFactory createPipelineFactory(Injector injector) {
|
||||
return new Lineage2PipelineFactory(injector, this);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user