diff --git a/src/main/java/com/l2jserver/GeneralConfiguration.java b/src/main/java/com/l2jserver/GeneralConfiguration.java new file mode 100644 index 000000000..9d50484a2 --- /dev/null +++ b/src/main/java/com/l2jserver/GeneralConfiguration.java @@ -0,0 +1,6 @@ +package com.l2jserver; + +import com.l2jserver.service.configuration.Configuration; + +public interface GeneralConfiguration extends Configuration { +} diff --git a/src/main/java/com/l2jserver/L2JConstants.java b/src/main/java/com/l2jserver/L2JConstants.java new file mode 100644 index 000000000..e46b6e866 --- /dev/null +++ b/src/main/java/com/l2jserver/L2JConstants.java @@ -0,0 +1,10 @@ +package com.l2jserver; + +public class L2JConstants { + /** + * Indicated the supported protocol for this compilation. + *
+ * This MUST be hard-coded! + */ + public static final int SUPPORTED_PROTOCOL = 10; +} diff --git a/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java b/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java index b0d429843..87063e564 100644 --- a/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java +++ b/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java @@ -5,6 +5,7 @@ import static org.jboss.netty.channel.Channels.pipeline; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; +import com.google.inject.Injector; import com.l2jserver.game.net.codec.Lineage2Decoder; import com.l2jserver.game.net.codec.Lineage2Decrypter; import com.l2jserver.game.net.codec.Lineage2Encoder; @@ -12,8 +13,15 @@ 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.handler.Lineage2PacketHandler; +import com.l2jserver.service.logging.LoggingService; public class Lineage2PipelineFactory implements ChannelPipelineFactory { + private final Injector injector; + + public Lineage2PipelineFactory(Injector injector) { + this.injector = injector; + } + @Override public ChannelPipeline getPipeline() throws Exception { final ChannelPipeline pipeline = pipeline(); @@ -27,7 +35,8 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory { pipeline.addLast("header.decoder", new Lineage2Decoder()); pipeline.addLast("packet.writer", new Lineage2PacketWriter()); - pipeline.addLast("packet.reader", new Lineage2PacketReader()); + pipeline.addLast("packet.reader", new Lineage2PacketReader(injector, + injector.getInstance(LoggingService.class))); pipeline.addLast("packet.handler", new Lineage2PacketHandler()); diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java index eea90439d..8a0ef9ba2 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java @@ -5,32 +5,49 @@ import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; +import com.google.inject.Inject; +import com.google.inject.Injector; import com.l2jserver.game.net.packet.ClientPacket; import com.l2jserver.game.net.packet.client.ProtocolVersionPacket; +import com.l2jserver.service.logging.Logger; +import com.l2jserver.service.logging.LoggingService; public class Lineage2PacketReader extends OneToOneDecoder { + private final Injector injector; + private final Logger logger; + + @Inject + public Lineage2PacketReader(Injector injector, LoggingService logging) { + this.injector = injector; + this.logger = logging.getLogger(Lineage2PacketReader.class); + } + @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 = getPacket(buffer); + final ClientPacket packet = createPacket(getPacketClass(buffer)); if (packet == null) return null; packet.read(buffer); return packet; } - private ClientPacket getPacket(ChannelBuffer buffer) { + private ClientPacket createPacket(Class extends ClientPacket> type) { + return injector.getInstance(type); + } + + private Class extends ClientPacket> getPacketClass(ChannelBuffer buffer) { final short opcode = buffer.readUnsignedByte(); switch (opcode) { case ProtocolVersionPacket.OPCODE: - return new ProtocolVersionPacket(); + return ProtocolVersionPacket.class; case 0x2b: return null; default: - System.out.println("Unk: " + opcode); + logger.info("Unknown opcode: " + opcode); break; } return null; diff --git a/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java b/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java index 82afde18e..b612ca887 100644 --- a/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java +++ b/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java @@ -1,12 +1,23 @@ package com.l2jserver.game.net.handler; import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; +import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.game.net.packet.ClientPacket; public class Lineage2PacketHandler extends SimpleChannelHandler { + private Lineage2Connection connection; + + @Override + public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) + throws Exception { + connection = new Lineage2Connection(e.getChannel()); + super.channelOpen(ctx, e); + } + @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { @@ -14,7 +25,7 @@ public class Lineage2PacketHandler extends SimpleChannelHandler { if (!(msg instanceof ClientPacket)) return; final ClientPacket packet = (ClientPacket) msg; - packet.process(null); + packet.process(connection, null); super.messageReceived(ctx, e); } diff --git a/src/main/java/com/l2jserver/game/net/packet/AbstractClientPacket.java b/src/main/java/com/l2jserver/game/net/packet/AbstractClientPacket.java index cd9090819..8c621b638 100644 --- a/src/main/java/com/l2jserver/game/net/packet/AbstractClientPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/AbstractClientPacket.java @@ -1,4 +1,5 @@ package com.l2jserver.game.net.packet; + public abstract class AbstractClientPacket implements ClientPacket { } diff --git a/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java b/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java index 977e06341..f2fcdcdbf 100644 --- a/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java @@ -3,6 +3,7 @@ package com.l2jserver.game.net.packet; import org.jboss.netty.buffer.ChannelBuffer; import com.google.inject.Injector; +import com.l2jserver.game.net.Lineage2Connection; public interface ClientPacket extends Packet { /** @@ -19,5 +20,5 @@ public interface ClientPacket extends Packet { * @param injector * the injector */ - void process(Injector injector); + void process(Lineage2Connection conn, Injector injector); } diff --git a/src/main/java/com/l2jserver/game/net/packet/ClientPacketModule.java b/src/main/java/com/l2jserver/game/net/packet/ClientPacketModule.java new file mode 100644 index 000000000..23c58d40b --- /dev/null +++ b/src/main/java/com/l2jserver/game/net/packet/ClientPacketModule.java @@ -0,0 +1,11 @@ +package com.l2jserver.game.net.packet; + +import com.google.inject.AbstractModule; +import com.l2jserver.game.net.packet.client.ProtocolVersionPacket; + +public class ClientPacketModule extends AbstractModule { + @Override + protected void configure() { + bind(ProtocolVersionPacket.class); + } +} diff --git a/src/main/java/com/l2jserver/game/net/packet/client/ProtocolVersionPacket.java b/src/main/java/com/l2jserver/game/net/packet/client/ProtocolVersionPacket.java index f92c54482..eaf7b3aba 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/ProtocolVersionPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/ProtocolVersionPacket.java @@ -2,13 +2,27 @@ package com.l2jserver.game.net.packet.client; import org.jboss.netty.buffer.ChannelBuffer; +import com.google.inject.Inject; import com.google.inject.Injector; +import com.l2jserver.L2JConstants; +import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.game.net.packet.AbstractClientPacket; +import com.l2jserver.service.logging.Logger; +import com.l2jserver.service.logging.LoggingService; public class ProtocolVersionPacket extends AbstractClientPacket { public static final int OPCODE = 0x0e; + // services + private final Logger logger; + + // packet private int version; + + @Inject + protected ProtocolVersionPacket(LoggingService logging) { + logger = logging.getLogger(ProtocolVersionPacket.class); + } @Override public void read(ChannelBuffer buffer) { @@ -16,8 +30,12 @@ public class ProtocolVersionPacket extends AbstractClientPacket { } @Override - public void process(Injector injector) { - + public void process(Lineage2Connection conn, Injector injector) { + if(L2JConstants.SUPPORTED_PROTOCOL != version) { + logger.info("Incorrect protocol version: "+version); + conn.close(); + } + } public int getVersion() { diff --git a/src/main/java/com/l2jserver/model/world/capability/Attackable.java b/src/main/java/com/l2jserver/model/world/capability/Attackable.java index d341f9a9c..7cdf410eb 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Attackable.java +++ b/src/main/java/com/l2jserver/model/world/capability/Attackable.java @@ -8,6 +8,6 @@ import com.l2jserver.model.world.AbstractObject; * * @author Rogiel */ -public interface Attackable extends WorldCapability { +public interface Attackable extends ObjectCapability { void receiveAttack(Attacker attacker); } diff --git a/src/main/java/com/l2jserver/model/world/capability/Attacker.java b/src/main/java/com/l2jserver/model/world/capability/Attacker.java index 619b7a734..4e797926d 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Attacker.java +++ b/src/main/java/com/l2jserver/model/world/capability/Attacker.java @@ -7,6 +7,6 @@ import com.l2jserver.model.world.AbstractObject; * * @author Rogiel */ -public interface Attacker extends WorldCapability { +public interface Attacker extends ObjectCapability { void attack(Attackable target); } diff --git a/src/main/java/com/l2jserver/model/world/capability/Castable.java b/src/main/java/com/l2jserver/model/world/capability/Castable.java index 1893b2c76..5b16ab8d0 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Castable.java +++ b/src/main/java/com/l2jserver/model/world/capability/Castable.java @@ -7,6 +7,6 @@ import com.l2jserver.model.world.AbstractObject; * * @author Rogiel */ -public interface Castable extends WorldCapability { +public interface Castable extends ObjectCapability { void cast(); } diff --git a/src/main/java/com/l2jserver/model/world/capability/Caster.java b/src/main/java/com/l2jserver/model/world/capability/Caster.java index 97c13ec8d..6ef09c933 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Caster.java +++ b/src/main/java/com/l2jserver/model/world/capability/Caster.java @@ -8,6 +8,6 @@ import com.l2jserver.model.world.AbstractObject; * * @author Rogiel */ -public interface Caster extends WorldCapability { +public interface Caster extends ObjectCapability { void cast(SkillTemplate skill, Castable cast); } diff --git a/src/main/java/com/l2jserver/model/world/capability/Child.java b/src/main/java/com/l2jserver/model/world/capability/Child.java index 33b62511e..30b7bed46 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Child.java +++ b/src/main/java/com/l2jserver/model/world/capability/Child.java @@ -8,6 +8,6 @@ import com.l2jserver.model.world.AbstractObject; * * @author Rogiel */ -public interface Child
extends WorldCapability { +public interface Child
extends ObjectCapability {
public P getParent();
}
diff --git a/src/main/java/com/l2jserver/model/world/capability/Consumable.java b/src/main/java/com/l2jserver/model/world/capability/Consumable.java
new file mode 100644
index 000000000..e69288bb8
--- /dev/null
+++ b/src/main/java/com/l2jserver/model/world/capability/Consumable.java
@@ -0,0 +1,13 @@
+package com.l2jserver.model.world.capability;
+
+import com.l2jserver.model.template.ItemTemplate;
+import com.l2jserver.model.world.AbstractObject;
+
+/**
+ * Defines an {@link AbstractObject} that can be consumed.
+ *
+ * @author Rogiel
+ */
+public interface Consumable extends ObjectCapability {
+ void consume(ItemTemplate item, Castable target);
+}
diff --git a/src/main/java/com/l2jserver/model/world/capability/Conversable.java b/src/main/java/com/l2jserver/model/world/capability/Conversable.java
index f0df4cb34..5ac0b5976 100644
--- a/src/main/java/com/l2jserver/model/world/capability/Conversable.java
+++ b/src/main/java/com/l2jserver/model/world/capability/Conversable.java
@@ -7,6 +7,6 @@ import com.l2jserver.model.world.AbstractObject;
*
* @author Rogiel
*/
-public interface Conversable extends WorldCapability {
+public interface Conversable extends ObjectCapability {
}
diff --git a/src/main/java/com/l2jserver/model/world/capability/Dropable.java b/src/main/java/com/l2jserver/model/world/capability/Dropable.java
index 6661f2cd4..569af44b4 100644
--- a/src/main/java/com/l2jserver/model/world/capability/Dropable.java
+++ b/src/main/java/com/l2jserver/model/world/capability/Dropable.java
@@ -7,6 +7,6 @@ import com.l2jserver.model.world.AbstractObject;
*
* @author Rogiel
*/
-public interface Dropable extends WorldCapability {
+public interface Dropable extends ObjectCapability {
void drop();
}
diff --git a/src/main/java/com/l2jserver/model/world/capability/Enchantable.java b/src/main/java/com/l2jserver/model/world/capability/Enchantable.java
index d0087a097..ef91ac4d1 100644
--- a/src/main/java/com/l2jserver/model/world/capability/Enchantable.java
+++ b/src/main/java/com/l2jserver/model/world/capability/Enchantable.java
@@ -7,7 +7,7 @@ import com.l2jserver.model.world.AbstractObject;
*
* @author Rogiel
*/
-public interface Enchantable extends WorldCapability {
+public interface Enchantable extends ObjectCapability {
public int getEnchantLevel();
public int setEnchantLevel();
diff --git a/src/main/java/com/l2jserver/model/world/capability/Equipable.java b/src/main/java/com/l2jserver/model/world/capability/Equipable.java
index 2639597e0..4b6fc5d4b 100644
--- a/src/main/java/com/l2jserver/model/world/capability/Equipable.java
+++ b/src/main/java/com/l2jserver/model/world/capability/Equipable.java
@@ -8,6 +8,6 @@ import com.l2jserver.model.world.AbstractObject;
*
* @author Rogiel
*/
-public interface Equipable extends WorldCapability {
+public interface Equipable extends ObjectCapability {
void equip(Equiper equiper);
}
diff --git a/src/main/java/com/l2jserver/model/world/capability/Equiper.java b/src/main/java/com/l2jserver/model/world/capability/Equiper.java
index 2e7e6f977..8edfff24a 100644
--- a/src/main/java/com/l2jserver/model/world/capability/Equiper.java
+++ b/src/main/java/com/l2jserver/model/world/capability/Equiper.java
@@ -8,7 +8,7 @@ import com.l2jserver.model.world.AbstractObject;
*
* @author Rogiel
*/
-public interface Equiper extends WorldCapability {
+public interface Equiper extends ObjectCapability {
void equip(Equipable equipable);
void setEquipment(Object slot, Equipable equipment);
diff --git a/src/main/java/com/l2jserver/model/world/capability/Listenable.java b/src/main/java/com/l2jserver/model/world/capability/Listenable.java
index 5fb266e28..2fc667fcd 100644
--- a/src/main/java/com/l2jserver/model/world/capability/Listenable.java
+++ b/src/main/java/com/l2jserver/model/world/capability/Listenable.java
@@ -16,7 +16,7 @@ import com.l2jserver.model.world.event.WorldListener;
* the event type
*/
public interface Listenable