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);
+ }
+ }
+}