From 0662150229c7f47c5fe235f6d81298ccbe56181e Mon Sep 17 00:00:00 2001 From: rogiel Date: Fri, 29 Apr 2011 20:17:45 -0300 Subject: [PATCH] Change-Id: If18611eb0a6296da808aead8f1da54be094db2a9 --- .../com/l2jserver/db/dao/CharacterDAO.java | 16 +++ src/dao/com/l2jserver/db/dao/PlayerDAO.java | 13 -- .../db/dao/db4o/DB4OCharacterDAO.java | 26 ++++ .../l2jserver/db/dao/db4o/DB4OPlayerDAO.java | 18 --- .../java/com/l2jserver/GameServerModule.java | 10 +- src/main/java/com/l2jserver/L2JConstants.java | 2 +- .../java/com/l2jserver/L2JGameServerMain.java | 18 ++- .../game/net/Lineage2PipelineFactory.java | 10 +- .../game/net/codec/Lineage2Decoder.java | 56 ++++---- .../game/net/codec/Lineage2Decrypter.java | 19 ++- .../game/net/codec/Lineage2Encoder.java | 17 ++- .../game/net/codec/Lineage2Encrypter.java | 13 ++ .../game/net/codec/Lineage2PacketReader.java | 4 +- .../game/net/codec/Lineage2PacketWriter.java | 9 +- .../net/handler/Lineage2PacketHandler.java | 5 +- .../game/net/packet/ClientPacket.java | 7 +- .../packet/client/ProtocolVersionPacket.java | 43 ++++-- .../game/net/packet/server/TestPacket.java | 18 --- .../l2jserver/model/world/AbstractObject.java | 26 ++++ .../java/com/l2jserver/model/world/Item.java | 5 + .../{Character.java => L2Character.java} | 2 +- .../java/com/l2jserver/model/world/Pet.java | 24 +++- .../com/l2jserver/model/world/Player.java | 98 ++++--------- .../java/com/l2jserver/model/world/World.java | 52 ------- .../model/world/capability/Conversable.java | 2 +- .../model/world/capability/Dropable.java | 11 +- .../model/world/capability/Positionable.java | 1 + .../model/world/event/SpawnEvent.java | 2 + .../world/event/WorldEventDispatcher.java | 16 --- .../model/world/item/ItemDropEvent.java | 6 + .../model/world/player/PlayerEvent.java | 4 +- .../model/world/player/PlayerListener.java | 20 ++- .../model/world/player/PlayerSpawnEvent.java | 22 ++- .../GameServerInitializationRoutine.java | 23 +++- .../java/com/l2jserver/service/Service.java | 19 --- .../l2jserver/service/ServiceException.java | 21 --- .../com/l2jserver/service/ServiceModule.java | 10 -- .../service/ServiceStartException.java | 21 --- .../service/ServiceStopException.java | 21 --- .../game/world/WorldEventDispatcherImpl.java | 15 ++ .../service/game/world/WorldService.java | 81 ++++++++++- .../service/game/world/WorldServiceImpl.java | 74 ++++++++-- .../service/network/NettyNetworkService.java | 9 +- .../service/network/NetworkConfiguration.java | 2 +- .../service/network/NetworkService.java | 2 +- .../util/factory/CollectionFactory.java | 19 +++ .../com/l2jserver/model/world/WorldTest.java | 130 ------------------ .../service/world/WorldServiceImplTest.java | 83 +++++++++++ 48 files changed, 612 insertions(+), 513 deletions(-) create mode 100644 src/dao/com/l2jserver/db/dao/CharacterDAO.java delete mode 100644 src/dao/com/l2jserver/db/dao/PlayerDAO.java create mode 100644 src/dao/db4o/com/l2jserver/db/dao/db4o/DB4OCharacterDAO.java delete mode 100644 src/dao/db4o/com/l2jserver/db/dao/db4o/DB4OPlayerDAO.java delete mode 100644 src/main/java/com/l2jserver/game/net/packet/server/TestPacket.java rename src/main/java/com/l2jserver/model/world/{Character.java => L2Character.java} (79%) delete mode 100644 src/main/java/com/l2jserver/model/world/World.java delete mode 100644 src/main/java/com/l2jserver/model/world/event/WorldEventDispatcher.java delete mode 100644 src/main/java/com/l2jserver/service/Service.java delete mode 100644 src/main/java/com/l2jserver/service/ServiceException.java delete mode 100644 src/main/java/com/l2jserver/service/ServiceModule.java delete mode 100644 src/main/java/com/l2jserver/service/ServiceStartException.java delete mode 100644 src/main/java/com/l2jserver/service/ServiceStopException.java create mode 100644 src/main/java/com/l2jserver/service/game/world/WorldEventDispatcherImpl.java delete mode 100644 src/test/java/com/l2jserver/model/world/WorldTest.java create mode 100644 src/test/java/com/l2jserver/service/world/WorldServiceImplTest.java diff --git a/src/dao/com/l2jserver/db/dao/CharacterDAO.java b/src/dao/com/l2jserver/db/dao/CharacterDAO.java new file mode 100644 index 000000000..f68e94d5d --- /dev/null +++ b/src/dao/com/l2jserver/db/dao/CharacterDAO.java @@ -0,0 +1,16 @@ +package com.l2jserver.db.dao; + +import com.l2jserver.model.id.CharacterID; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.model.world.Player; +import com.l2jserver.service.database.DataAccessObject; + +/** + * The {@link CharacterDAO} is can load and save {@link Player player instances}. + * + * @author Rogiel + */ +public interface CharacterDAO extends DataAccessObject { + L2Character load(CharacterID id); + void save(L2Character character); +} diff --git a/src/dao/com/l2jserver/db/dao/PlayerDAO.java b/src/dao/com/l2jserver/db/dao/PlayerDAO.java deleted file mode 100644 index 2603a5be5..000000000 --- a/src/dao/com/l2jserver/db/dao/PlayerDAO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.l2jserver.db.dao; - -import com.l2jserver.model.world.Player; -import com.l2jserver.service.database.DataAccessObject; - -/** - * The {@link PlayerDAO} is can load and save {@link Player player instances}. - * - * @author Rogiel - */ -public interface PlayerDAO extends DataAccessObject { - void load(Player player); -} diff --git a/src/dao/db4o/com/l2jserver/db/dao/db4o/DB4OCharacterDAO.java b/src/dao/db4o/com/l2jserver/db/dao/db4o/DB4OCharacterDAO.java new file mode 100644 index 000000000..95f2a99fe --- /dev/null +++ b/src/dao/db4o/com/l2jserver/db/dao/db4o/DB4OCharacterDAO.java @@ -0,0 +1,26 @@ +package com.l2jserver.db.dao.db4o; + +import com.google.inject.Inject; +import com.l2jserver.db.dao.CharacterDAO; +import com.l2jserver.model.id.CharacterID; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.service.database.DB4ODatabaseService; + +public class DB4OCharacterDAO extends AbstractDB4ODAO implements CharacterDAO { + @Inject + protected DB4OCharacterDAO(DB4ODatabaseService database) { + super(database); + } + + @Override + public L2Character load(CharacterID id) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void save(L2Character character) { + // TODO Auto-generated method stub + + } +} diff --git a/src/dao/db4o/com/l2jserver/db/dao/db4o/DB4OPlayerDAO.java b/src/dao/db4o/com/l2jserver/db/dao/db4o/DB4OPlayerDAO.java deleted file mode 100644 index fd6d1bb9c..000000000 --- a/src/dao/db4o/com/l2jserver/db/dao/db4o/DB4OPlayerDAO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.l2jserver.db.dao.db4o; - -import com.google.inject.Inject; -import com.l2jserver.db.dao.PlayerDAO; -import com.l2jserver.model.world.Player; -import com.l2jserver.service.database.DB4ODatabaseService; - -public class DB4OPlayerDAO extends AbstractDB4ODAO implements PlayerDAO { - @Inject - protected DB4OPlayerDAO(DB4ODatabaseService database) { - super(database); - } - - @Override - public void load(Player player) { - - } -} diff --git a/src/main/java/com/l2jserver/GameServerModule.java b/src/main/java/com/l2jserver/GameServerModule.java index f4a9fc795..31c891d36 100644 --- a/src/main/java/com/l2jserver/GameServerModule.java +++ b/src/main/java/com/l2jserver/GameServerModule.java @@ -1,11 +1,17 @@ package com.l2jserver; import com.google.inject.AbstractModule; +import com.l2jserver.routines.GameServerInitializationRoutine; +import com.l2jserver.service.BasicServiceModule; +import com.l2jserver.service.ServiceModule; public class GameServerModule extends AbstractModule { @Override protected void configure() { - // TODO Auto-generated method stub - + install(new BasicServiceModule()); + install(new ServiceModule()); + + // routines + bind(GameServerInitializationRoutine.class); } } diff --git a/src/main/java/com/l2jserver/L2JConstants.java b/src/main/java/com/l2jserver/L2JConstants.java index e46b6e866..5fafb5e71 100644 --- a/src/main/java/com/l2jserver/L2JConstants.java +++ b/src/main/java/com/l2jserver/L2JConstants.java @@ -6,5 +6,5 @@ public class L2JConstants { *

* This MUST be hard-coded! */ - public static final int SUPPORTED_PROTOCOL = 10; + public static final int SUPPORTED_PROTOCOL = 216; } diff --git a/src/main/java/com/l2jserver/L2JGameServerMain.java b/src/main/java/com/l2jserver/L2JGameServerMain.java index 1c0fe2575..cd722900b 100644 --- a/src/main/java/com/l2jserver/L2JGameServerMain.java +++ b/src/main/java/com/l2jserver/L2JGameServerMain.java @@ -1,13 +1,23 @@ package com.l2jserver; -public class L2JGameServerMain { +import com.l2jserver.routines.GameServerInitializationRoutine; +public class L2JGameServerMain { /** * @param args + * @throws InterruptedException */ - public static void main(String[] args) { - // TODO Auto-generated method stub - + public static void main(String[] args) throws InterruptedException { + final L2JGameServer server = new L2JGameServer(); + try { + server.getInjector() + .getInstance(GameServerInitializationRoutine.class).call(); + } catch (Exception e) { + System.out.println("GameServer could not be started!"); + e.printStackTrace(); + } + + Thread.sleep(60 * 60 * 1000); } } diff --git a/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java b/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java index 854f88e86..60a164dd8 100644 --- a/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java +++ b/src/main/java/com/l2jserver/game/net/Lineage2PipelineFactory.java @@ -4,6 +4,8 @@ import static org.jboss.netty.channel.Channels.pipeline; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; +import org.jboss.netty.handler.logging.LoggingHandler; +import org.jboss.netty.logging.InternalLogLevel; import com.google.inject.Inject; import com.google.inject.Injector; @@ -28,20 +30,22 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory { public ChannelPipeline getPipeline() throws Exception { final ChannelPipeline pipeline = pipeline(); + pipeline.addLast("header.encoder", new Lineage2Encoder()); + pipeline.addLast("header.decoder", new Lineage2Decoder()); + pipeline.addLast(Lineage2Encrypter.HANDLER_NAME, new Lineage2Encrypter()); pipeline.addLast(Lineage2Decrypter.HANDLER_NAME, new Lineage2Decrypter()); - pipeline.addLast("header.encoder", new Lineage2Encoder()); - pipeline.addLast("header.decoder", new Lineage2Decoder()); - pipeline.addLast("packet.writer", new Lineage2PacketWriter()); pipeline.addLast("packet.reader", new Lineage2PacketReader(injector, injector.getInstance(LoggingService.class))); pipeline.addLast("packet.handler", new Lineage2PacketHandler()); + pipeline.addLast("logger", new LoggingHandler(InternalLogLevel.WARN)); + return pipeline; } } diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2Decoder.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2Decoder.java index dcd5bc135..925055fbc 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2Decoder.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2Decoder.java @@ -1,29 +1,39 @@ package com.l2jserver.game.net.codec; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; +import java.nio.ByteOrder; -public class Lineage2Decoder extends LengthFieldBasedFrameDecoder { - // private static final int HEADER_SIZE = 2; +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; - public Lineage2Decoder() { - super(16 * 1024, 0, 2); +public class Lineage2Decoder extends FrameDecoder { + 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; + System.out.println(ChannelBuffers.hexDump(buffer)); + 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)); } - - // @Override - // protected Object decode(ChannelHandlerContext ctx, Channel channel, - // ChannelBuffer buffer) throws Exception { - // if (buffer.readableBytes() < 2) - // return null; - // buffer.markReaderIndex(); - // final int pending = buffer.readUnsignedShort() - HEADER_SIZE; - // if(pending == 0) - // return null; - // - // if (buffer.readableBytes() < pending) { - // buffer.resetReaderIndex(); - // return null; - // } - // - // return buffer.slice(buffer.readableBytes(), pending); - // } } diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2Decrypter.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2Decrypter.java index 4c1aca746..7eb571a6d 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2Decrypter.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2Decrypter.java @@ -5,9 +5,11 @@ import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; +import com.l2jserver.util.BlowFishKeygen; + public class Lineage2Decrypter extends OneToOneDecoder { public static final String HANDLER_NAME = "crypto.decoder"; - + private boolean enabled = false; private final byte[] key = new byte[16]; @@ -19,12 +21,14 @@ public class Lineage2Decrypter extends OneToOneDecoder { if (!enabled) return msg; final ChannelBuffer buffer = (ChannelBuffer) msg; - + + System.out.println("Decrypting..."); + final int offset = buffer.readerIndex(); final int size = buffer.readableBytes(); int temp = 0; for (int i = 0; i < size; i++) { - int temp2 = buffer.getUnsignedByte(offset + i); + int temp2 = buffer.getUnsignedByte(offset + i) & 0xFF; buffer.setByte(offset + i, (byte) (temp2 ^ key[i & 15] ^ temp)); temp = temp2; } @@ -41,7 +45,14 @@ public class Lineage2Decrypter extends OneToOneDecoder { key[10] = (byte) (old >> 0x10 & 0xff); key[11] = (byte) (old >> 0x18 & 0xff); - return msg; + return buffer; + } + + public byte[] enable() { + byte[] key = BlowFishKeygen.getRandomKey(); + this.setKey(key); + this.setEnabled(true); + return key; } public void setKey(byte[] key) { diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2Encoder.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2Encoder.java index eba8351e2..7723542d2 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2Encoder.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2Encoder.java @@ -1,9 +1,18 @@ package com.l2jserver.game.net.codec; -import org.jboss.netty.handler.codec.frame.LengthFieldPrepender; +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; -public class Lineage2Encoder extends LengthFieldPrepender { - public Lineage2Encoder() { - super(2); +public class Lineage2Encoder 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() - 2); + return buffer; } } diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2Encrypter.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2Encrypter.java index b50744a25..8cc954907 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2Encrypter.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2Encrypter.java @@ -1,10 +1,14 @@ package com.l2jserver.game.net.codec; +import java.util.Arrays; + 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.util.BlowFishKeygen; + public class Lineage2Encrypter extends OneToOneEncoder { public static final String HANDLER_NAME = "crypto.encoder"; @@ -16,7 +20,11 @@ public class Lineage2Encrypter extends OneToOneEncoder { Object msg) throws Exception { if (!(msg instanceof ChannelBuffer)) return msg; + if (!enabled) + return msg; final ChannelBuffer buffer = (ChannelBuffer) msg; + + System.out.println("Encrypting..."); final int offset = buffer.readerIndex(); final int size = buffer.readableBytes(); @@ -41,6 +49,11 @@ public class Lineage2Encrypter extends OneToOneEncoder { return msg; } + + public void enable(byte[] key) { + this.setKey(key); + this.setEnabled(true); + } public void setKey(byte[] key) { for (int i = 0; i < 16; i++) { 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 8a0ef9ba2..c2b9761aa 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketReader.java @@ -44,10 +44,8 @@ public class Lineage2PacketReader extends OneToOneDecoder { switch (opcode) { case ProtocolVersionPacket.OPCODE: return ProtocolVersionPacket.class; - case 0x2b: - return null; default: - logger.info("Unknown opcode: " + opcode); + logger.info("Unknown opcode: " + Integer.toHexString(opcode)); break; } return null; diff --git a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketWriter.java b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketWriter.java index c565042aa..3838c15b9 100644 --- a/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketWriter.java +++ b/src/main/java/com/l2jserver/game/net/codec/Lineage2PacketWriter.java @@ -1,5 +1,7 @@ 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; @@ -14,9 +16,12 @@ public class Lineage2PacketWriter extends OneToOneEncoder { Object msg) throws Exception { if (!(msg instanceof ServerPacket)) return msg; - final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); + final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer( + ByteOrder.LITTLE_ENDIAN, 10); final ServerPacket packet = (ServerPacket) msg; - packet.write(buffer); + buffer.writeShort(0x0000); + buffer.writeByte(packet.getOpcode()); // packet opcode + packet.write(buffer); return buffer; } } 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 b612ca887..07e9e19d9 100644 --- a/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java +++ b/src/main/java/com/l2jserver/game/net/handler/Lineage2PacketHandler.java @@ -15,6 +15,9 @@ public class Lineage2PacketHandler extends SimpleChannelHandler { public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { connection = new Lineage2Connection(e.getChannel()); + + System.out.println(e); + super.channelOpen(ctx, e); } @@ -25,7 +28,7 @@ public class Lineage2PacketHandler extends SimpleChannelHandler { if (!(msg instanceof ClientPacket)) return; final ClientPacket packet = (ClientPacket) msg; - packet.process(connection, null); + packet.process(connection); super.messageReceived(ctx, e); } 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 f2fcdcdbf..b1aeaef71 100644 --- a/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/ClientPacket.java @@ -2,7 +2,6 @@ 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 { @@ -17,8 +16,8 @@ public interface ClientPacket extends Packet { /** * Process the packet * - * @param injector - * the injector + * @param conn + * The active Lineage2Connection */ - void process(Lineage2Connection conn, Injector injector); + void process(Lineage2Connection conn); } 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 d330b317a..3ff2ab2d5 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 @@ -1,11 +1,13 @@ 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 com.google.inject.Injector; import com.l2jserver.L2JConstants; import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.game.net.packet.AbstractClientPacket; +import com.l2jserver.game.net.packet.server.KeyPacket; import com.l2jserver.service.logging.Logger; import com.l2jserver.service.logging.guice.InjectLogger; @@ -17,29 +19,48 @@ public class ProtocolVersionPacket extends AbstractClientPacket { private final Logger logger = null; // packet - private int version; + private long version; @Override public void read(ChannelBuffer buffer) { - this.version = buffer.readInt(); + this.version = buffer.readUnsignedInt(); } @Override - public void process(Lineage2Connection conn, Injector injector) { + public void process(final Lineage2Connection conn) { + // generate a new key + final byte[] key = conn.getDecrypter().enable(); + if (L2JConstants.SUPPORTED_PROTOCOL != version) { logger.info( "Incorrect protocol version: {0}. Only {1} is supported.", version, L2JConstants.SUPPORTED_PROTOCOL); - conn.close(); + // notify wrong protocol and close connection + conn.write(new KeyPacket(key, 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 KeyPacket(key, true)).addListener( + new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) + throws Exception { + // enable encrypter + conn.getEncrypter().setKey(key); + conn.getEncrypter().setEnabled(true); + } + }); } - public int getVersion() { + public long getVersion() { return version; } - - public void setVersion(int version) { - this.version = version; - } } diff --git a/src/main/java/com/l2jserver/game/net/packet/server/TestPacket.java b/src/main/java/com/l2jserver/game/net/packet/server/TestPacket.java deleted file mode 100644 index 3783ff4af..000000000 --- a/src/main/java/com/l2jserver/game/net/packet/server/TestPacket.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.l2jserver.game.net.packet.server; - -import org.jboss.netty.buffer.ChannelBuffer; - -import com.l2jserver.game.net.packet.AbstractServerPacket; - -public class TestPacket extends AbstractServerPacket { - public static final int OPCODE = 0x00; - - @Override - public void write(ChannelBuffer buffer) { - - } - - public TestPacket() { - super(OPCODE); - } -} diff --git a/src/main/java/com/l2jserver/model/world/AbstractObject.java b/src/main/java/com/l2jserver/model/world/AbstractObject.java index 05d76d4f7..51e3b4372 100644 --- a/src/main/java/com/l2jserver/model/world/AbstractObject.java +++ b/src/main/java/com/l2jserver/model/world/AbstractObject.java @@ -4,6 +4,7 @@ import com.l2jserver.model.id.ObjectID; /** * This is an abstract object representing all the world objects in Lineage II. + * * @author Rogiel */ public abstract class AbstractObject implements WorldObject { @@ -16,4 +17,29 @@ public abstract class AbstractObject implements WorldObject { public void setId(ObjectID id) { this.id = id; } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AbstractObject other = (AbstractObject) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } } diff --git a/src/main/java/com/l2jserver/model/world/Item.java b/src/main/java/com/l2jserver/model/world/Item.java index e9766fa98..89e4256fb 100644 --- a/src/main/java/com/l2jserver/model/world/Item.java +++ b/src/main/java/com/l2jserver/model/world/Item.java @@ -54,4 +54,9 @@ public class Item extends AbstractObject implements Playable, Spawnable, // TODO Auto-generated method stub return null; } + + @Override + public void setPosition(Coordinate coord) { + + } } diff --git a/src/main/java/com/l2jserver/model/world/Character.java b/src/main/java/com/l2jserver/model/world/L2Character.java similarity index 79% rename from src/main/java/com/l2jserver/model/world/Character.java rename to src/main/java/com/l2jserver/model/world/L2Character.java index 690f75187..71d0769b3 100644 --- a/src/main/java/com/l2jserver/model/world/Character.java +++ b/src/main/java/com/l2jserver/model/world/L2Character.java @@ -2,7 +2,7 @@ package com.l2jserver.model.world; import com.l2jserver.model.id.CharacterID; -public class Character extends Player { +public class L2Character extends Player { @Override public CharacterID getId() { return (CharacterID) super.getId(); diff --git a/src/main/java/com/l2jserver/model/world/Pet.java b/src/main/java/com/l2jserver/model/world/Pet.java index d30b231ea..eacef9580 100644 --- a/src/main/java/com/l2jserver/model/world/Pet.java +++ b/src/main/java/com/l2jserver/model/world/Pet.java @@ -1,10 +1,30 @@ package com.l2jserver.model.world; import com.l2jserver.model.world.capability.Child; +import com.l2jserver.model.world.capability.Summonable; +import com.l2jserver.util.Coordinate; -public class Pet extends Player implements Child { +public class Pet extends Player implements Child, Summonable { @Override - public Character getParent() { + public L2Character getParent() { return null; } + + @Override + public void teleport(Coordinate coordinate) { + // TODO Auto-generated method stub + + } + + @Override + public void summon(Coordinate coordinate) { + // TODO Auto-generated method stub + + } + + @Override + public boolean isSummoned() { + // TODO Auto-generated method stub + return false; + } } diff --git a/src/main/java/com/l2jserver/model/world/Player.java b/src/main/java/com/l2jserver/model/world/Player.java index 776dd9bf0..a10d5232e 100644 --- a/src/main/java/com/l2jserver/model/world/Player.java +++ b/src/main/java/com/l2jserver/model/world/Player.java @@ -1,94 +1,42 @@ package com.l2jserver.model.world; -import java.util.List; - -import com.l2jserver.model.template.SkillTemplate; -import com.l2jserver.model.world.capability.Attackable; -import com.l2jserver.model.world.capability.Attacker; -import com.l2jserver.model.world.capability.Castable; -import com.l2jserver.model.world.capability.Caster; -import com.l2jserver.model.world.capability.Levelable; -import com.l2jserver.model.world.capability.Listenable; +import com.l2jserver.game.net.Lineage2Connection; +import com.l2jserver.model.world.capability.Actor; import com.l2jserver.model.world.capability.Parent; import com.l2jserver.model.world.capability.Playable; -import com.l2jserver.model.world.capability.Spawnable; -import com.l2jserver.model.world.player.PlayerEvent; -import com.l2jserver.model.world.player.PlayerListener; +import com.l2jserver.model.world.capability.Teleportable; +import com.l2jserver.model.world.player.PlayerTeleportEvent; import com.l2jserver.util.Coordinate; -import com.l2jserver.util.factory.CollectionFactory; /** * {@link Player} is any object that can be controlled by the player. The most - * common implementation is {@link Character}. + * common implementation is {@link L2Character}. * * @author Rogiel */ -public abstract class Player extends AbstractObject implements Playable, - Spawnable, Attacker, Attackable, - Listenable, Caster, Parent, Levelable { - private final List listeners = CollectionFactory - .newList(PlayerListener.class); +public abstract class Player extends AbstractActor implements Playable, Actor, + Teleportable, Parent { + protected Lineage2Connection connection; @Override - public void spawn(Coordinate coordinate) { - + public void teleport(Coordinate coordinate) { + final PlayerTeleportEvent event = new PlayerTeleportEvent(this, coordinate); + this.setPosition(coordinate); + event.dispatch(); } - @Override - public void attack(Attackable target, - com.l2jserver.model.template.capability.Attackable weapon) { - + /** + * @return the connection + */ + public Lineage2Connection getConnection() { + return connection; } - @Override - public void receiveAttack(Attacker attacker, - com.l2jserver.model.template.capability.Attackable weapon) { - - } - - @Override - public void addListener(PlayerListener listener) { - listeners.add(listener); - } - - @Override - public void removeListener(PlayerListener listener) { - listeners.remove(listener); - } - - @Override - public void dispatch(PlayerEvent e) { - for (final PlayerListener listener : listeners) { - listener.dispatch(e); - } - } - - @Override - public Coordinate getPosition() { - // TODO Auto-generated method stub - return null; - } - - @Override - public void cast(SkillTemplate skill, Castable cast) { - // TODO Auto-generated method stub - - } - - @Override - public boolean isSpawned() { - // TODO Auto-generated method stub - return false; - } - - @Override - public int getLevel() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public void setLevel(int level) { - // TODO Auto-generated method stub + /** + * @param connection + * the connection to set + */ + public void setConnection(Lineage2Connection connection) { + this.connection = connection; } } diff --git a/src/main/java/com/l2jserver/model/world/World.java b/src/main/java/com/l2jserver/model/world/World.java deleted file mode 100644 index 2e91830c8..000000000 --- a/src/main/java/com/l2jserver/model/world/World.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.l2jserver.model.world; - -import java.util.Iterator; -import java.util.Set; - -import com.l2jserver.model.world.event.WorldEventDispatcher; -import com.l2jserver.model.world.filter.WorldObjectFilter; -import com.l2jserver.model.world.iterator.FilterIterator; -import com.l2jserver.util.factory.CollectionFactory; - -public class World implements Iterable { - private final Set objects = CollectionFactory - .newSet(WorldObject.class); - private final WorldEventDispatcher dispatcher = new WorldEventDispatcher( - this); - - public void add(WorldObject object) { - objects.add(object); - } - - public void remove(WorldObject object) { - objects.remove(object); - } - - public boolean contains(WorldObject object) { - return objects.contains(object); - } - - public WorldEventDispatcher getDispatcher() { - return dispatcher; - } - - @Override - public Iterator iterator() { - return objects.iterator(); - } - - public Iterator iterator( - final WorldObjectFilter filter) { - return new FilterIterator(filter, objects.iterator()); - } - - public Iterable iterable( - final WorldObjectFilter filter) { - return new Iterable() { - @Override - public Iterator iterator() { - return new FilterIterator(filter, objects.iterator()); - } - }; - } -} 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 5ac0b5976..53e698f6e 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Conversable.java +++ b/src/main/java/com/l2jserver/model/world/capability/Conversable.java @@ -8,5 +8,5 @@ import com.l2jserver.model.world.AbstractObject; * @author Rogiel */ public interface Conversable extends ObjectCapability { - + void talk(Talker talker); } 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 569af44b4..a7bd5c902 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Dropable.java +++ b/src/main/java/com/l2jserver/model/world/capability/Dropable.java @@ -1,12 +1,19 @@ package com.l2jserver.model.world.capability; import com.l2jserver.model.world.AbstractObject; +import com.l2jserver.util.Coordinate; /** * Defines an {@link AbstractObject} that can be dropped on the ground. * * @author Rogiel */ -public interface Dropable extends ObjectCapability { - void drop(); +public interface Dropable extends Positionable { + /** + * When an item is dropped its position will be set as position + * + * @param position + * the position + */ + void drop(Coordinate position); } diff --git a/src/main/java/com/l2jserver/model/world/capability/Positionable.java b/src/main/java/com/l2jserver/model/world/capability/Positionable.java index 80fc2c3c5..07a793d27 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Positionable.java +++ b/src/main/java/com/l2jserver/model/world/capability/Positionable.java @@ -10,4 +10,5 @@ import com.l2jserver.util.Coordinate; */ public interface Positionable extends ObjectCapability { Coordinate getPosition(); + void setPosition(Coordinate coord); } diff --git a/src/main/java/com/l2jserver/model/world/event/SpawnEvent.java b/src/main/java/com/l2jserver/model/world/event/SpawnEvent.java index a7ecfb698..187e58336 100644 --- a/src/main/java/com/l2jserver/model/world/event/SpawnEvent.java +++ b/src/main/java/com/l2jserver/model/world/event/SpawnEvent.java @@ -1,7 +1,9 @@ package com.l2jserver.model.world.event; import com.l2jserver.model.world.capability.Spawnable; +import com.l2jserver.util.Coordinate; public interface SpawnEvent extends WorldEvent { Spawnable getObject(); + Coordinate getCoordinate(); } \ No newline at end of file diff --git a/src/main/java/com/l2jserver/model/world/event/WorldEventDispatcher.java b/src/main/java/com/l2jserver/model/world/event/WorldEventDispatcher.java deleted file mode 100644 index 7e39fb60f..000000000 --- a/src/main/java/com/l2jserver/model/world/event/WorldEventDispatcher.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.l2jserver.model.world.event; - -import com.l2jserver.model.world.World; - -public class WorldEventDispatcher { - private final World world; - - public WorldEventDispatcher(World world) { - this.world = world; - } - - public void dispatch(WorldEvent event) { - //TODO implement threaded model - event.dispatch(); - } -} diff --git a/src/main/java/com/l2jserver/model/world/item/ItemDropEvent.java b/src/main/java/com/l2jserver/model/world/item/ItemDropEvent.java index 87332265c..d9df73ff7 100644 --- a/src/main/java/com/l2jserver/model/world/item/ItemDropEvent.java +++ b/src/main/java/com/l2jserver/model/world/item/ItemDropEvent.java @@ -3,6 +3,7 @@ package com.l2jserver.model.world.item; import com.l2jserver.model.world.Item; import com.l2jserver.model.world.Player; import com.l2jserver.model.world.WorldObject; +import com.l2jserver.model.world.capability.Actor; import com.l2jserver.model.world.player.PlayerEvent; public class ItemDropEvent implements ItemEvent, PlayerEvent { @@ -35,4 +36,9 @@ public class ItemDropEvent implements ItemEvent, PlayerEvent { if (player != null) player.dispatch(this); } + + @Override + public Actor getActor() { + return player; + } } diff --git a/src/main/java/com/l2jserver/model/world/player/PlayerEvent.java b/src/main/java/com/l2jserver/model/world/player/PlayerEvent.java index be73a7554..c51b14533 100644 --- a/src/main/java/com/l2jserver/model/world/player/PlayerEvent.java +++ b/src/main/java/com/l2jserver/model/world/player/PlayerEvent.java @@ -1,8 +1,8 @@ package com.l2jserver.model.world.player; import com.l2jserver.model.world.Player; -import com.l2jserver.model.world.event.WorldEvent; +import com.l2jserver.model.world.actor.ActorEvent; -public interface PlayerEvent extends WorldEvent { +public interface PlayerEvent extends ActorEvent { Player getPlayer(); } diff --git a/src/main/java/com/l2jserver/model/world/player/PlayerListener.java b/src/main/java/com/l2jserver/model/world/player/PlayerListener.java index 1c926a041..8fa3f4e7c 100644 --- a/src/main/java/com/l2jserver/model/world/player/PlayerListener.java +++ b/src/main/java/com/l2jserver/model/world/player/PlayerListener.java @@ -1,6 +1,22 @@ package com.l2jserver.model.world.player; -import com.l2jserver.model.world.event.WorldListener; +import com.l2jserver.model.world.actor.ActorEvent; +import com.l2jserver.model.world.actor.ActorListener; -public interface PlayerListener extends WorldListener { +public abstract class PlayerListener implements ActorListener { + @Override + public void dispatch(ActorEvent e) { + if (!(e instanceof PlayerEvent)) + return; + dispatch((PlayerEvent) e); + } + + /** + * Once the event call is dispatched, the listener WILL NOT be + * removed. You must manually remove it from the event object. + * + * @param e + * the event + */ + protected abstract void dispatch(PlayerEvent e); } diff --git a/src/main/java/com/l2jserver/model/world/player/PlayerSpawnEvent.java b/src/main/java/com/l2jserver/model/world/player/PlayerSpawnEvent.java index 27606bdbe..32f72f428 100644 --- a/src/main/java/com/l2jserver/model/world/player/PlayerSpawnEvent.java +++ b/src/main/java/com/l2jserver/model/world/player/PlayerSpawnEvent.java @@ -1,14 +1,24 @@ package com.l2jserver.model.world.player; import com.l2jserver.model.world.Player; +import com.l2jserver.model.world.capability.Actor; import com.l2jserver.model.world.capability.Spawnable; import com.l2jserver.model.world.event.SpawnEvent; +import com.l2jserver.util.Coordinate; public class PlayerSpawnEvent implements PlayerEvent, SpawnEvent { private final Player player; + private final Coordinate coordinate; - public PlayerSpawnEvent(Player player) { + public PlayerSpawnEvent(Player player, Coordinate coordinate) { this.player = player; + this.coordinate = coordinate; + } + + @Override + public void dispatch() { + if (player != null) + player.dispatch(this); } @Override @@ -22,8 +32,12 @@ public class PlayerSpawnEvent implements PlayerEvent, SpawnEvent { } @Override - public void dispatch() { - if(player != null) - player.dispatch(this); + public Coordinate getCoordinate() { + return coordinate; + } + + @Override + public Actor getActor() { + return player; } } diff --git a/src/main/java/com/l2jserver/routines/GameServerInitializationRoutine.java b/src/main/java/com/l2jserver/routines/GameServerInitializationRoutine.java index 9eeb19837..b3b6d6e08 100644 --- a/src/main/java/com/l2jserver/routines/GameServerInitializationRoutine.java +++ b/src/main/java/com/l2jserver/routines/GameServerInitializationRoutine.java @@ -1,8 +1,27 @@ package com.l2jserver.routines; +import com.google.inject.Inject; +import com.l2jserver.service.ServiceManager; +import com.l2jserver.service.configuration.ConfigurationService; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.logging.LoggingService; +import com.l2jserver.service.network.NetworkService; + public class GameServerInitializationRoutine implements Routine { + private final ServiceManager serviceManager; + + @Inject + public GameServerInitializationRoutine(ServiceManager serviceManager) { + this.serviceManager = serviceManager; + } + @Override - public Boolean call() { - return false; + public Boolean call() throws Exception { + serviceManager.start(LoggingService.class); + serviceManager.start(ConfigurationService.class); + serviceManager.start(DatabaseService.class); + + serviceManager.start(NetworkService.class); + return true; } } diff --git a/src/main/java/com/l2jserver/service/Service.java b/src/main/java/com/l2jserver/service/Service.java deleted file mode 100644 index 0ac0f13dd..000000000 --- a/src/main/java/com/l2jserver/service/Service.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.l2jserver.service; - -public interface Service { - /** - * Start this service - * - * @throws ServiceStartException - * if an error occurred - */ - void start() throws ServiceStartException; - - /** - * Stop this service - * - * @throws ServiceStartException - * if an error occurred - */ - void stop() throws ServiceStopException; -} diff --git a/src/main/java/com/l2jserver/service/ServiceException.java b/src/main/java/com/l2jserver/service/ServiceException.java deleted file mode 100644 index cd4ca7c39..000000000 --- a/src/main/java/com/l2jserver/service/ServiceException.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.l2jserver.service; - -public class ServiceException extends Exception { - private static final long serialVersionUID = 1L; - - public ServiceException() { - super(); - } - - public ServiceException(String message, Throwable cause) { - super(message, cause); - } - - public ServiceException(String message) { - super(message); - } - - public ServiceException(Throwable cause) { - super(cause); - } -} diff --git a/src/main/java/com/l2jserver/service/ServiceModule.java b/src/main/java/com/l2jserver/service/ServiceModule.java deleted file mode 100644 index 61e48e9b0..000000000 --- a/src/main/java/com/l2jserver/service/ServiceModule.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.l2jserver.service; - -import com.google.inject.AbstractModule; - -public class ServiceModule extends AbstractModule { - @Override - protected void configure() { - install(new BasicServiceModule()); - } -} diff --git a/src/main/java/com/l2jserver/service/ServiceStartException.java b/src/main/java/com/l2jserver/service/ServiceStartException.java deleted file mode 100644 index 9ff9cd53a..000000000 --- a/src/main/java/com/l2jserver/service/ServiceStartException.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.l2jserver.service; - -public class ServiceStartException extends ServiceException { - private static final long serialVersionUID = 1L; - - public ServiceStartException() { - super(); - } - - public ServiceStartException(String message, Throwable cause) { - super(message, cause); - } - - public ServiceStartException(String message) { - super(message); - } - - public ServiceStartException(Throwable cause) { - super(cause); - } -} diff --git a/src/main/java/com/l2jserver/service/ServiceStopException.java b/src/main/java/com/l2jserver/service/ServiceStopException.java deleted file mode 100644 index df856da15..000000000 --- a/src/main/java/com/l2jserver/service/ServiceStopException.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.l2jserver.service; - -public class ServiceStopException extends ServiceException { - private static final long serialVersionUID = 1L; - - public ServiceStopException() { - super(); - } - - public ServiceStopException(String message, Throwable cause) { - super(message, cause); - } - - public ServiceStopException(String message) { - super(message); - } - - public ServiceStopException(Throwable cause) { - super(cause); - } -} diff --git a/src/main/java/com/l2jserver/service/game/world/WorldEventDispatcherImpl.java b/src/main/java/com/l2jserver/service/game/world/WorldEventDispatcherImpl.java new file mode 100644 index 000000000..a9bbad153 --- /dev/null +++ b/src/main/java/com/l2jserver/service/game/world/WorldEventDispatcherImpl.java @@ -0,0 +1,15 @@ +package com.l2jserver.service.game.world; + +import com.l2jserver.model.world.event.WorldEvent; + +/** + * {@link WorldEventDispatcher} implementation + * + * @author Rogiel + */ +public class WorldEventDispatcherImpl implements WorldEventDispatcher { + public void dispatch(WorldEvent event) { + // TODO implement threaded model + event.dispatch(); + } +} diff --git a/src/main/java/com/l2jserver/service/game/world/WorldService.java b/src/main/java/com/l2jserver/service/game/world/WorldService.java index 80c20d263..e30bbee26 100644 --- a/src/main/java/com/l2jserver/service/game/world/WorldService.java +++ b/src/main/java/com/l2jserver/service/game/world/WorldService.java @@ -1,22 +1,95 @@ package com.l2jserver.service.game.world; +import java.util.Iterator; +import java.util.List; + import com.l2jserver.model.world.WorldObject; +import com.l2jserver.model.world.filter.WorldObjectFilter; import com.l2jserver.service.Service; +/** + * Service responsible for managing {@link WorldObject} and dispatch events. + * + * @author Rogiel + */ public interface WorldService extends Service, Iterable { /** - * Register a new {@link WorldObject} to the service. + * Adds an object into the world. * * @param object * the object */ - void register(WorldObject object); + public void add(WorldObject object); /** - * Removes an registered {@link WorldObject} from the service. + * Removes an object of the world * * @param object * the object */ - void unregister(WorldObject object); + public void remove(WorldObject object); + + /** + * Check if this object is in the world. + * + * @param object + * the object + * @return true if object exists + */ + public boolean contains(WorldObject object); + + /** + * Get the event dispatcher + * + * @return the event dispatcher + */ + public WorldEventDispatcher getEventDispatcher(); + + /** + * Creates a list of all objects matching filter + * + * @param + * the object type + * @param filter + * the filter + * @return the list of objects + */ + public List list(WorldObjectFilter filter); + + /** + * Creates a list of all objects of type type + * + * @param + * the type + * @param type + * the type class + * @return the list of objects + */ + List list(Class type); + + /** + * Get the iterator for this filter + * + * @param + * the object type + * @param filter + * the filter + * @return the iterator instance + */ + Iterator iterator( + final WorldObjectFilter filter); + + /** + * Shortcut method for {@link Iterable#iterable()} with filters. The + * iterable instance returns the same {@link Iterator} as + * {@link #iterator(WorldObjectFilter)}. + * + * @param + * the object type + * @param filter + * the filter + * @return the iterable instance + */ + Iterable iterable( + final WorldObjectFilter filter); } diff --git a/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java b/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java index 07ed0f854..f50c2c1d5 100644 --- a/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java @@ -1,45 +1,91 @@ package com.l2jserver.service.game.world; import java.util.Iterator; +import java.util.List; +import java.util.Set; +import com.google.inject.Inject; import com.l2jserver.model.world.WorldObject; import com.l2jserver.model.world.filter.WorldObjectFilter; +import com.l2jserver.model.world.filter.impl.InstanceFilter; +import com.l2jserver.model.world.iterator.FilterIterator; import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; +import com.l2jserver.util.factory.CollectionFactory; public class WorldServiceImpl implements WorldService { + private final Set objects = CollectionFactory + .newSet(WorldObject.class); + private final WorldEventDispatcher dispatcher; + + @Inject + public WorldServiceImpl(WorldEventDispatcher dispatcher) { + this.dispatcher = dispatcher; + } + @Override public void start() throws ServiceStartException { - // TODO Auto-generated method stub - + objects.clear(); } @Override - public void register(WorldObject object) { - // TODO Auto-generated method stub - + public void add(WorldObject object) { + objects.add(object); } @Override - public void unregister(WorldObject object) { - // TODO Auto-generated method stub + public void remove(WorldObject object) { + objects.remove(object); + } + @Override + public boolean contains(WorldObject object) { + return objects.contains(object); + } + + @Override + public WorldEventDispatcher getEventDispatcher() { + return dispatcher; + } + + @Override + public List list(WorldObjectFilter filter) { + final List list = CollectionFactory.newList(null); + for (final T object : this.iterable(filter)) { + list.add(object); + } + return list; + } + + @Override + public List list(Class type) { + return list(new InstanceFilter(type)); } @Override public Iterator iterator() { - // return objects.iterator(); - return null; + return objects.iterator(); } - public Iterator iterator(WorldObjectFilter filter) { - // return objects.iterator(); - return null; + @Override + public Iterator iterator( + final WorldObjectFilter filter) { + return new FilterIterator(filter, objects.iterator()); + } + + @Override + public Iterable iterable( + final WorldObjectFilter filter) { + return new Iterable() { + @Override + public Iterator iterator() { + return new FilterIterator(filter, objects.iterator()); + } + }; } @Override public void stop() throws ServiceStopException { - // TODO Auto-generated method stub - + objects.clear(); } } diff --git a/src/main/java/com/l2jserver/service/network/NettyNetworkService.java b/src/main/java/com/l2jserver/service/network/NettyNetworkService.java index 6d94216c5..86668ac24 100644 --- a/src/main/java/com/l2jserver/service/network/NettyNetworkService.java +++ b/src/main/java/com/l2jserver/service/network/NettyNetworkService.java @@ -7,16 +7,22 @@ import org.jboss.netty.channel.ServerChannel; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import com.google.inject.Inject; +import com.google.inject.Injector; +import com.l2jserver.game.net.Lineage2Connection; +import com.l2jserver.game.net.Lineage2PipelineFactory; import com.l2jserver.service.configuration.ConfigurationService; public class NettyNetworkService implements NetworkService { private final NetworkConfiguration config; + private final Injector injector; private ServerBootstrap server; private ServerChannel channel; @Inject - public NettyNetworkService(ConfigurationService configService) { + public NettyNetworkService(ConfigurationService configService, + Injector injector) { this.config = configService.get(NetworkConfiguration.class); + this.injector = injector; } @Override @@ -24,6 +30,7 @@ public class NettyNetworkService implements NetworkService { server = new ServerBootstrap(new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); + server.setPipelineFactory(new Lineage2PipelineFactory(injector)); channel = (ServerChannel) server.bind(config.getListenAddress()); } diff --git a/src/main/java/com/l2jserver/service/network/NetworkConfiguration.java b/src/main/java/com/l2jserver/service/network/NetworkConfiguration.java index 02f5659c9..18c63d0a5 100644 --- a/src/main/java/com/l2jserver/service/network/NetworkConfiguration.java +++ b/src/main/java/com/l2jserver/service/network/NetworkConfiguration.java @@ -13,7 +13,7 @@ public interface NetworkConfiguration extends Configuration { * * @return the listen address */ - @ConfigurationPropertyGetter(name = "listen", defaultValue = "0.0.0.0:54") + @ConfigurationPropertyGetter(name = "listen", defaultValue = "0.0.0.0:7777") InetSocketAddress getListenAddress(); /** diff --git a/src/main/java/com/l2jserver/service/network/NetworkService.java b/src/main/java/com/l2jserver/service/network/NetworkService.java index 3154e718f..20cbedc20 100644 --- a/src/main/java/com/l2jserver/service/network/NetworkService.java +++ b/src/main/java/com/l2jserver/service/network/NetworkService.java @@ -1,7 +1,7 @@ package com.l2jserver.service.network; +import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.service.Service; public interface NetworkService extends Service { - } diff --git a/src/main/java/com/l2jserver/util/factory/CollectionFactory.java b/src/main/java/com/l2jserver/util/factory/CollectionFactory.java index c8b825408..fa3cb73d2 100644 --- a/src/main/java/com/l2jserver/util/factory/CollectionFactory.java +++ b/src/main/java/com/l2jserver/util/factory/CollectionFactory.java @@ -4,7 +4,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.WeakHashMap; /** * Factory class to create {@link Collection} instances. @@ -37,4 +39,21 @@ public class CollectionFactory { public static final Set newSet(Class type) { return new HashSet(); } + + /** + * Creates a new weak map. + * + * @param + * the key type + * @param + * the value type + * @param key + * the key type class + * @param value + * the value type class + * @return the new map + */ + public static final Map newWeakMap(Class key, Class value) { + return new WeakHashMap(); + } } diff --git a/src/test/java/com/l2jserver/model/world/WorldTest.java b/src/test/java/com/l2jserver/model/world/WorldTest.java deleted file mode 100644 index 959ae9dff..000000000 --- a/src/test/java/com/l2jserver/model/world/WorldTest.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.l2jserver.model.world; - -import java.util.concurrent.atomic.AtomicBoolean; - -import junit.framework.Assert; - -import org.junit.Test; - -import com.l2jserver.model.world.filter.impl.InstanceFilter; -import com.l2jserver.model.world.item.ItemDropEvent; -import com.l2jserver.model.world.item.ItemEvent; -import com.l2jserver.model.world.item.ItemListener; -import com.l2jserver.model.world.player.PlayerEvent; -import com.l2jserver.model.world.player.PlayerListener; -import com.l2jserver.model.world.player.PlayerSpawnEvent; - -public class WorldTest { - @Test - public void testAdd() { - final World world = new World(); - final Character character = new Character(); - world.add(character); - } - - @Test - public void testRemove() { - final World world = new World(); - final Character character = new Character(); - world.add(character); - world.remove(character); - } - - @Test - public void testContains() { - final World world = new World(); - final Character character = new Character(); - world.add(character); - Assert.assertTrue(world.contains(character)); - } - - @Test - public void testIterator() { - final World world = new World(); - final Character character1 = new Character(); - final Character character2 = new Character(); - final Item item1 = new Item(); - world.add(character1); - world.add(character2); - world.add(item1); - - for (final WorldObject o : world) { - Assert.assertNotNull(o); - } - final Iterable it = world.iterable(new InstanceFilter( - Item.class)); - for (final WorldObject o : it) { - Assert.assertNotNull(o); - } - } - - @Test - public void testListeners1() { - final World world = new World(); - final Character character1 = new Character(); - final Character character2 = new Character(); - final Item item1 = new Item(); - world.add(character1); - world.add(character2); - world.add(item1); - - final AtomicBoolean bool = new AtomicBoolean(); - Assert.assertFalse(bool.get()); - character1.addListener(new PlayerListener() { - @Override - public void dispatch(PlayerEvent e) { - bool.set(true); - e.getPlayer().removeListener(this); - } - }); - character1.addListener(new PlayerListener() { - @Override - public void dispatch(PlayerEvent e) { - // bool.set(true); - } - }); - world.getDispatcher().dispatch(new PlayerSpawnEvent(character1)); - Assert.assertTrue(bool.get()); - - bool.set(false); - - world.getDispatcher().dispatch(new PlayerSpawnEvent(character1)); - Assert.assertFalse(bool.get()); - } - - @Test - public void testListeners2() { - final World world = new World(); - final Character character1 = new Character(); - final Character character2 = new Character(); - final Item item1 = new Item(); - final Item item2 = new Item(); - world.add(character1); - world.add(character2); - world.add(item1); - world.add(item2); - - final AtomicBoolean bool1 = new AtomicBoolean(); - final AtomicBoolean bool2 = new AtomicBoolean(); - - Assert.assertFalse(bool1.get()); - Assert.assertFalse(bool2.get()); - - character1.addListener(new PlayerListener() { - @Override - public void dispatch(PlayerEvent e) { - bool1.set(true); - } - }); - item1.addListener(new ItemListener() { - @Override - public void dispatch(ItemEvent e) { - bool2.set(true); - } - }); - - world.getDispatcher().dispatch(new ItemDropEvent(character1, item1)); - Assert.assertTrue(bool1.get()); - Assert.assertTrue(bool2.get()); - } -} diff --git a/src/test/java/com/l2jserver/service/world/WorldServiceImplTest.java b/src/test/java/com/l2jserver/service/world/WorldServiceImplTest.java new file mode 100644 index 000000000..626215be6 --- /dev/null +++ b/src/test/java/com/l2jserver/service/world/WorldServiceImplTest.java @@ -0,0 +1,83 @@ +package com.l2jserver.service.world; + +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Scopes; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.model.world.Item; +import com.l2jserver.model.world.WorldObject; +import com.l2jserver.model.world.filter.impl.InstanceFilter; +import com.l2jserver.service.BasicServiceModule; +import com.l2jserver.service.ServiceStartException; +import com.l2jserver.service.game.world.WorldEventDispatcher; +import com.l2jserver.service.game.world.WorldEventDispatcherImpl; +import com.l2jserver.service.game.world.WorldService; +import com.l2jserver.service.game.world.WorldServiceImpl; + +public class WorldServiceImplTest { + private WorldService world; + + @Before + public void tearUp() throws ServiceStartException { + Injector injector = Guice.createInjector(new BasicServiceModule(), + new AbstractModule() { + @Override + protected void configure() { + bind(WorldService.class).to(WorldServiceImpl.class).in( + Scopes.SINGLETON); + bind(WorldEventDispatcher.class).to( + WorldEventDispatcherImpl.class).in( + Scopes.SINGLETON); + } + }); + + world = injector.getInstance(WorldService.class); + Assert.assertNotNull(world); + world.start(); + } + + @Test + public void testAdd() { + final L2Character character = new L2Character(); + world.add(character); + } + + @Test + public void testRemove() { + final L2Character character = new L2Character(); + world.add(character); + world.remove(character); + } + + @Test + public void testContains() { + final L2Character character = new L2Character(); + world.add(character); + Assert.assertTrue(world.contains(character)); + } + + @Test + public void testIterator() { + final L2Character character1 = new L2Character(); + final L2Character character2 = new L2Character(); + final Item item1 = new Item(); + world.add(character1); + world.add(character2); + world.add(item1); + + for (final WorldObject o : world) { + Assert.assertNotNull(o); + } + final Iterable it = world.iterable(new InstanceFilter( + Item.class)); + for (final WorldObject o : it) { + Assert.assertNotNull(o); + } + } +}