From bb3f24e8f4b0ca6dd915e6997ca519ee8f860092 Mon Sep 17 00:00:00 2001 From: Rogiel Date: Fri, 13 May 2011 15:46:33 -0300 Subject: [PATCH] Character Friend implementation Signed-off-by: Rogiel --- .../l2jserver/db/dao/CharacterFriendDAO.java | 69 +++++++++ .../com/l2jserver/db/dao/DAOModuleMySQL5.java | 3 + .../db/dao/mysql5/MySQL5CharacterDAO.java | 19 ++- .../dao/mysql5/MySQL5CharacterFriendDAO.java | 137 ++++++++++++++++++ .../object/iterator/WorldObjectIterable.java | 26 ++++ .../object/iterator/WorldObjectIterator.java | 44 ++++++ .../java/com/l2jserver/model/world/Clan.java | 15 +- .../l2jserver/model/world/L2Character.java | 12 ++ .../java/com/l2jserver/model/world/Party.java | 7 + .../model/world/capability/Joinable.java | 2 +- .../model/world/capability/Scriptable.java | 27 ---- .../world/character/CharacterFriendList.java | 18 ++- .../com/l2jserver/service/ServiceModule.java | 4 +- .../service/game/scripting/Script.java | 16 -- .../service/game/world/WorldService.java | 1 + .../service/game/world/WorldServiceImpl.java | 1 + .../{ => event}/WorldEventDispatcher.java | 2 +- .../{ => event}/WorldEventDispatcherImpl.java | 2 +- src/main/resources/sql/character.sql | 2 +- src/main/resources/sql/character_friend.sql | 5 + .../character/CharacterFriendListTest.java | 51 +++++++ .../world/WorldEventDispatcherImplTest.java | 9 +- .../service/world/WorldServiceImplTest.java | 4 +- 23 files changed, 404 insertions(+), 72 deletions(-) create mode 100644 src/dao/com/l2jserver/db/dao/CharacterFriendDAO.java create mode 100644 src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterFriendDAO.java create mode 100644 src/main/java/com/l2jserver/model/id/object/iterator/WorldObjectIterable.java create mode 100644 src/main/java/com/l2jserver/model/id/object/iterator/WorldObjectIterator.java delete mode 100644 src/main/java/com/l2jserver/model/world/capability/Scriptable.java delete mode 100644 src/main/java/com/l2jserver/service/game/scripting/Script.java rename src/main/java/com/l2jserver/service/game/world/{ => event}/WorldEventDispatcher.java (97%) rename src/main/java/com/l2jserver/service/game/world/{ => event}/WorldEventDispatcherImpl.java (98%) create mode 100644 src/main/resources/sql/character_friend.sql create mode 100644 src/test/java/com/l2jserver/model/world/character/CharacterFriendListTest.java diff --git a/src/dao/com/l2jserver/db/dao/CharacterFriendDAO.java b/src/dao/com/l2jserver/db/dao/CharacterFriendDAO.java new file mode 100644 index 000000000..f47c38f39 --- /dev/null +++ b/src/dao/com/l2jserver/db/dao/CharacterFriendDAO.java @@ -0,0 +1,69 @@ +package com.l2jserver.db.dao; + +import java.util.List; + +import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.model.world.character.CharacterFriendList; +import com.l2jserver.service.cache.Cacheable; +import com.l2jserver.service.cache.IgnoreCaching; +import com.l2jserver.service.database.DataAccessObject; + +/** + * The {@link CharacterFriendDAO} is can load and save + * {@link CharacterFriendList character friend list}. + * + * @author Rogiel + */ +public interface CharacterFriendDAO extends DataAccessObject, + Cacheable { + /** + * Load the friend list for character represented by id from the + * database + * + * @param id + * the id + */ + List load(CharacterID id); + + /** + * Load the friend list for character represented by character from + * the database + * + * @param character + * the character + */ + void load(L2Character character); + + /** + * Save the instance to the database. If a new database entry was created + * returns true. + * + * @param friends + * the friend list + * @return true if created a new entry in database (i.e. insert), false if + * not created (i.e. update) + */ + @IgnoreCaching + boolean save(CharacterFriendList friends); + + /** + * Delete an entire friend list + * + * @param friends + * the friend list + * @return true if at least 1 item was removed + */ + boolean delete(CharacterFriendList friends); + + /** + * Delete an friend from an character + * + * @param character + * the character id + * @param friend + * the friend id + * @return true if the item was removed + */ + boolean delete(CharacterID character, CharacterID friend); +} diff --git a/src/dao/mysql5/com/l2jserver/db/dao/DAOModuleMySQL5.java b/src/dao/mysql5/com/l2jserver/db/dao/DAOModuleMySQL5.java index 2c6d6277d..2e8281b9f 100644 --- a/src/dao/mysql5/com/l2jserver/db/dao/DAOModuleMySQL5.java +++ b/src/dao/mysql5/com/l2jserver/db/dao/DAOModuleMySQL5.java @@ -3,6 +3,7 @@ package com.l2jserver.db.dao; import com.google.inject.AbstractModule; import com.google.inject.Scopes; import com.l2jserver.db.dao.mysql5.MySQL5CharacterDAO; +import com.l2jserver.db.dao.mysql5.MySQL5CharacterFriendDAO; import com.l2jserver.db.dao.mysql5.MySQL5ItemDAO; public class DAOModuleMySQL5 extends AbstractModule { @@ -10,6 +11,8 @@ public class DAOModuleMySQL5 extends AbstractModule { protected void configure() { bind(CharacterDAO.class).to(MySQL5CharacterDAO.class).in( Scopes.SINGLETON); + bind(CharacterFriendDAO.class).to(MySQL5CharacterFriendDAO.class).in( + Scopes.SINGLETON); bind(ItemDAO.class).to(MySQL5ItemDAO.class).in(Scopes.SINGLETON); } } diff --git a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterDAO.java b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterDAO.java index 86dbd07eb..76861c7f3 100644 --- a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterDAO.java +++ b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterDAO.java @@ -71,6 +71,11 @@ public class MySQL5CharacterDAO extends AbstractMySQL5DAO */ private final CharacterMapper mapper = new CharacterMapper(); + /** + * Character mapper class + * + * @author Rogiel + */ private final class CharacterMapper implements Mapper { @Override public L2Character map(ResultSet rs) throws SQLException { @@ -199,12 +204,12 @@ public class MySQL5CharacterDAO extends AbstractMySQL5DAO return database.query(new InsertUpdateQuery(character) { @Override protected String query() { - return "INSERT INTO `" + TABLE + "` (`" + CHAR_ID + "`,`" + ACCOUNT_ID + "`,`" - + NAME + "`,`" + RACE + "`,`" + CLASS + "`,`" + SEX - + "`,`" + LEVEL + "`,`" + COORD_X + "`,`" + COORD_Y - + "`,`" + COORD_Z + "`,`" + APPEARANCE_HAIR_STYLE - + "`,`" + APPEARANCE_HAIR_COLOR + "`,`" - + APPEARANCE_FACE + return "INSERT INTO `" + TABLE + "` (`" + CHAR_ID + "`,`" + + ACCOUNT_ID + "`,`" + NAME + "`,`" + RACE + "`,`" + + CLASS + "`,`" + SEX + "`,`" + LEVEL + "`,`" + COORD_X + + "`,`" + COORD_Y + "`,`" + COORD_Z + "`,`" + + APPEARANCE_HAIR_STYLE + "`,`" + APPEARANCE_HAIR_COLOR + + "`,`" + APPEARANCE_FACE + "`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)"; } @@ -233,6 +238,6 @@ public class MySQL5CharacterDAO extends AbstractMySQL5DAO st.setString(i++, appearance.getHairColor().name()); st.setString(i++, appearance.getFace().name()); } - }); + }) > 0; } } diff --git a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterFriendDAO.java b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterFriendDAO.java new file mode 100644 index 000000000..d03c43161 --- /dev/null +++ b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterFriendDAO.java @@ -0,0 +1,137 @@ +package com.l2jserver.db.dao.mysql5; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import com.google.inject.Inject; +import com.l2jserver.db.dao.CharacterFriendDAO; +import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.model.id.object.factory.CharacterIDFactory; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.model.world.character.CharacterFriendList; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.database.MySQLDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.MySQLDatabaseService.Mapper; +import com.l2jserver.service.database.MySQLDatabaseService.SelectListQuery; + +public class MySQL5CharacterFriendDAO extends AbstractMySQL5DAO + implements CharacterFriendDAO { + private final CharacterIDFactory idFactory; + + /** + * Character table name + */ + public static final String TABLE = "character_friend"; + // FIELDS + public static final String CHAR_ID = MySQL5CharacterDAO.CHAR_ID; + public static final String CHAR_ID_FRIEND = MySQL5CharacterDAO.CHAR_ID + + "_friend"; + + @Inject + public MySQL5CharacterFriendDAO(DatabaseService database, + final CharacterIDFactory idFactory) { + super(database); + this.idFactory = idFactory; + } + + /** + * The {@link Mapper} instance + */ + private final CharacterFriendMapper mapper = new CharacterFriendMapper(); + + /** + * The friend list mapper + * + * @author Rogiel + */ + private final class CharacterFriendMapper implements Mapper { + @Override + public CharacterID map(ResultSet rs) throws SQLException { + return idFactory.createID(rs.getInt(CHAR_ID_FRIEND)); + } + } + + @Override + public List load(final CharacterID id) { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + CHAR_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setInt(1, id.getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public void load(L2Character character) { + final List list = load(character.getID()); + character.getFriendList().load(list); + } + + @Override + public boolean save(final CharacterFriendList friends) { + return database.query(new InsertUpdateQuery(friends + .idIterator()) { + @Override + protected String query() { + return "REPLACE INTO `" + TABLE + "` (`" + CHAR_ID + "`,`" + + CHAR_ID_FRIEND + "`) VALUES(?,?)"; + } + + @Override + protected void parametize(PreparedStatement st, CharacterID id) + throws SQLException { + st.setInt(1, friends.getCharacter().getID().getID()); + st.setInt(2, id.getID()); + } + }) > 0; + } + + @Override + public boolean delete(final CharacterFriendList friends) { + return database.query(new InsertUpdateQuery( + friends) { + @Override + protected String query() { + return "DELETE FROM `" + TABLE + "` WHERE `" + CHAR_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, + CharacterFriendList friends) throws SQLException { + st.setInt(1, friends.getCharacter().getID().getID()); + } + }) > 0; + } + + @Override + public boolean delete(final CharacterID character, final CharacterID friend) { + return database.query(new InsertUpdateQuery((Object) null) { + @Override + protected String query() { + return "DELETE FROM `" + TABLE + "` WHERE `" + CHAR_ID + + "` = ?, `" + CHAR_ID_FRIEND + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, Object friends) + throws SQLException { + st.setInt(1, character.getID()); + st.setInt(2, friend.getID()); + } + }) == 1; + } +} diff --git a/src/main/java/com/l2jserver/model/id/object/iterator/WorldObjectIterable.java b/src/main/java/com/l2jserver/model/id/object/iterator/WorldObjectIterable.java new file mode 100644 index 000000000..557fb7445 --- /dev/null +++ b/src/main/java/com/l2jserver/model/id/object/iterator/WorldObjectIterable.java @@ -0,0 +1,26 @@ +package com.l2jserver.model.id.object.iterator; + +import java.util.Iterator; + +import com.l2jserver.model.world.WorldObject; + +/** + * This is a simple {@link Iterable} implementation that always return the same + * {@link Iterator}. + * + * @author Rogiel + * @param + * the return object type + */ +public class WorldObjectIterable implements Iterable { + private final Iterator iterator; + + public WorldObjectIterable(Iterator iterator) { + this.iterator = iterator; + } + + @Override + public Iterator iterator() { + return iterator; + } +} diff --git a/src/main/java/com/l2jserver/model/id/object/iterator/WorldObjectIterator.java b/src/main/java/com/l2jserver/model/id/object/iterator/WorldObjectIterator.java new file mode 100644 index 000000000..dc9dbd46e --- /dev/null +++ b/src/main/java/com/l2jserver/model/id/object/iterator/WorldObjectIterator.java @@ -0,0 +1,44 @@ +package com.l2jserver.model.id.object.iterator; + +import java.util.Iterator; + +import com.l2jserver.model.id.ObjectID; +import com.l2jserver.model.world.WorldObject; +import com.l2jserver.util.ArrayIterator; + +/** + * This {@link Iterator} will iterate trough another {@link Iterator} which + * return {@link ObjectID} instances. For each ID, the + * {@link ObjectID#getObject()} method will be called and its result will be + * returned. + * + * @author Rogiel + * @param + * the object type + */ +public class WorldObjectIterator implements Iterator { + private final Iterator> ids; + + public WorldObjectIterator(ObjectID... ids) { + this(new ArrayIterator>(ids)); + } + + public WorldObjectIterator(Iterator> ids) { + this.ids = ids; + } + + @Override + public boolean hasNext() { + return ids.hasNext(); + } + + @Override + public T next() { + return ids.next().getObject(); + } + + @Override + public void remove() { + ids.remove(); + } +} diff --git a/src/main/java/com/l2jserver/model/world/Clan.java b/src/main/java/com/l2jserver/model/world/Clan.java index 47cd93d66..533d3dbf0 100644 --- a/src/main/java/com/l2jserver/model/world/Clan.java +++ b/src/main/java/com/l2jserver/model/world/Clan.java @@ -1,24 +1,18 @@ package com.l2jserver.model.world; -import java.util.List; +import java.util.Iterator; import com.l2jserver.model.id.object.CharacterID; import com.l2jserver.model.id.object.ClanID; +import com.l2jserver.model.id.object.iterator.WorldObjectIterator; import com.l2jserver.model.world.capability.Joinable; import com.l2jserver.model.world.capability.Listenable; import com.l2jserver.model.world.clan.ClanEvent; import com.l2jserver.model.world.clan.ClanListener; import com.l2jserver.model.world.clan.ClanMembers; -import com.l2jserver.util.factory.CollectionFactory; public class Clan extends AbstractObject implements Listenable, Joinable { - /** - * This clan listeners - */ - private final List listeners = CollectionFactory - .newList(ClanListener.class); - /** * Clan leader */ @@ -68,4 +62,9 @@ public class Clan extends AbstractObject implements public ClanID getID() { return (ClanID) super.getID(); } + + @Override + public Iterator iterator() { + return new WorldObjectIterator(members.iterator()); + } } diff --git a/src/main/java/com/l2jserver/model/world/L2Character.java b/src/main/java/com/l2jserver/model/world/L2Character.java index 2ed770105..8062f929f 100644 --- a/src/main/java/com/l2jserver/model/world/L2Character.java +++ b/src/main/java/com/l2jserver/model/world/L2Character.java @@ -10,6 +10,7 @@ import com.l2jserver.model.world.character.CharacterAttributes; import com.l2jserver.model.world.character.CharacterBaseAttributes; import com.l2jserver.model.world.character.CharacterCalculatedAttributes; import com.l2jserver.model.world.character.CharacterClass; +import com.l2jserver.model.world.character.CharacterFriendList; import com.l2jserver.model.world.character.CharacterInventory; /** @@ -59,6 +60,10 @@ public class L2Character extends Player { * The attributes of this character */ private final CharacterAttributes attributes; + /** + * The list of friend of this character + */ + private final CharacterFriendList friendList = new CharacterFriendList(this); /** * Creates a new instance @@ -211,4 +216,11 @@ public class L2Character extends Player { public CharacterAttributes getAttributes() { return attributes; } + + /** + * @return the friendList + */ + public CharacterFriendList getFriendList() { + return friendList; + } } diff --git a/src/main/java/com/l2jserver/model/world/Party.java b/src/main/java/com/l2jserver/model/world/Party.java index 1ffb6a577..0778ee662 100644 --- a/src/main/java/com/l2jserver/model/world/Party.java +++ b/src/main/java/com/l2jserver/model/world/Party.java @@ -1,9 +1,11 @@ package com.l2jserver.model.world; +import java.util.Iterator; import java.util.List; import com.l2jserver.model.id.object.CharacterID; import com.l2jserver.model.id.object.ClanID; +import com.l2jserver.model.id.object.iterator.WorldObjectIterator; import com.l2jserver.model.world.capability.Joinable; import com.l2jserver.model.world.capability.Listenable; import com.l2jserver.model.world.party.PartyEvent; @@ -30,4 +32,9 @@ public class Party extends AbstractObject implements // TODO Auto-generated method stub } + + @Override + public Iterator iterator() { + return new WorldObjectIterator(members.iterator()); + } } diff --git a/src/main/java/com/l2jserver/model/world/capability/Joinable.java b/src/main/java/com/l2jserver/model/world/capability/Joinable.java index 64e30fcdb..ba61a0683 100644 --- a/src/main/java/com/l2jserver/model/world/capability/Joinable.java +++ b/src/main/java/com/l2jserver/model/world/capability/Joinable.java @@ -7,7 +7,7 @@ import com.l2jserver.model.world.AbstractObject; * * @author Rogiel */ -public interface Joinable extends ObjectCapability { +public interface Joinable extends ObjectCapability, Iterable { /** * Join an member to this object. * diff --git a/src/main/java/com/l2jserver/model/world/capability/Scriptable.java b/src/main/java/com/l2jserver/model/world/capability/Scriptable.java deleted file mode 100644 index a2bb70e32..000000000 --- a/src/main/java/com/l2jserver/model/world/capability/Scriptable.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.l2jserver.model.world.capability; - -import com.l2jserver.model.world.AbstractObject; -import com.l2jserver.service.game.scripting.Script; - -/** - * Defines an {@link AbstractObject} that can be controller by an {@link Script} - * implementation. - * - * @author Rogiel - */ -public interface Scriptable extends ObjectCapability { - /** - * The the current script attached to this object - * - * @return the attached script - */ - Script getScript(); - - /** - * Set the attached script to this object - * - * @param script - * the script - */ - void setScript(Script script); -} diff --git a/src/main/java/com/l2jserver/model/world/character/CharacterFriendList.java b/src/main/java/com/l2jserver/model/world/character/CharacterFriendList.java index f82065f4d..f8180c18e 100644 --- a/src/main/java/com/l2jserver/model/world/character/CharacterFriendList.java +++ b/src/main/java/com/l2jserver/model/world/character/CharacterFriendList.java @@ -1,9 +1,11 @@ package com.l2jserver.model.world.character; +import java.util.Collection; import java.util.Iterator; import java.util.Set; import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.model.id.object.iterator.WorldObjectIterator; import com.l2jserver.model.world.L2Character; import com.l2jserver.util.factory.CollectionFactory; @@ -29,9 +31,21 @@ public class CharacterFriendList implements Iterable { return character; } + /** + * Iterator containing all friends IDs + * + * @return an iterator with friend ids + */ + public Iterator idIterator() { + return friends.iterator(); + } + @Override public Iterator iterator() { - // TODO - return null; + return new WorldObjectIterator(friends.iterator()); + } + + public void load(Collection list) { + friends.addAll(list); } } diff --git a/src/main/java/com/l2jserver/service/ServiceModule.java b/src/main/java/com/l2jserver/service/ServiceModule.java index ea8815627..988c85dc1 100644 --- a/src/main/java/com/l2jserver/service/ServiceModule.java +++ b/src/main/java/com/l2jserver/service/ServiceModule.java @@ -6,10 +6,10 @@ import com.l2jserver.service.game.scripting.ScriptingService; import com.l2jserver.service.game.scripting.ScriptingServiceImpl; import com.l2jserver.service.game.template.StaticTemplateService; import com.l2jserver.service.game.template.TemplateService; -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; +import com.l2jserver.service.game.world.event.WorldEventDispatcher; +import com.l2jserver.service.game.world.event.WorldEventDispatcherImpl; import com.l2jserver.service.network.NettyNetworkService; import com.l2jserver.service.network.NetworkService; diff --git a/src/main/java/com/l2jserver/service/game/scripting/Script.java b/src/main/java/com/l2jserver/service/game/scripting/Script.java deleted file mode 100644 index 44fcf67bb..000000000 --- a/src/main/java/com/l2jserver/service/game/scripting/Script.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.l2jserver.service.game.scripting; - -import com.l2jserver.model.world.capability.Scriptable; - -public interface Script extends Runnable { - /** - * Load this script for object - * - * @param object - */ - void load(O object); - - void unload(); - - O getObject(); -} 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 e30bbee26..8d8d45b44 100644 --- a/src/main/java/com/l2jserver/service/game/world/WorldService.java +++ b/src/main/java/com/l2jserver/service/game/world/WorldService.java @@ -6,6 +6,7 @@ import java.util.List; import com.l2jserver.model.world.WorldObject; import com.l2jserver.model.world.filter.WorldObjectFilter; import com.l2jserver.service.Service; +import com.l2jserver.service.game.world.event.WorldEventDispatcher; /** * Service responsible for managing {@link WorldObject} and dispatch events. 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 c75f7f57a..825100339 100644 --- a/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java @@ -15,6 +15,7 @@ import com.l2jserver.model.world.iterator.FilterIterator; import com.l2jserver.service.AbstractService; import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; +import com.l2jserver.service.game.world.event.WorldEventDispatcher; import com.l2jserver.util.factory.CollectionFactory; public class WorldServiceImpl extends AbstractService implements WorldService { diff --git a/src/main/java/com/l2jserver/service/game/world/WorldEventDispatcher.java b/src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcher.java similarity index 97% rename from src/main/java/com/l2jserver/service/game/world/WorldEventDispatcher.java rename to src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcher.java index 029d6f2da..93321e3ae 100644 --- a/src/main/java/com/l2jserver/service/game/world/WorldEventDispatcher.java +++ b/src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcher.java @@ -1,4 +1,4 @@ -package com.l2jserver.service.game.world; +package com.l2jserver.service.game.world.event; import com.l2jserver.model.id.ObjectID; import com.l2jserver.model.world.capability.Listenable; diff --git a/src/main/java/com/l2jserver/service/game/world/WorldEventDispatcherImpl.java b/src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcherImpl.java similarity index 98% rename from src/main/java/com/l2jserver/service/game/world/WorldEventDispatcherImpl.java rename to src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcherImpl.java index 7cbae575f..bbf50d3ea 100644 --- a/src/main/java/com/l2jserver/service/game/world/WorldEventDispatcherImpl.java +++ b/src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcherImpl.java @@ -1,4 +1,4 @@ -package com.l2jserver.service.game.world; +package com.l2jserver.service.game.world.event; import java.util.Queue; import java.util.Timer; diff --git a/src/main/resources/sql/character.sql b/src/main/resources/sql/character.sql index 826adbece..b1b064e36 100644 --- a/src/main/resources/sql/character.sql +++ b/src/main/resources/sql/character.sql @@ -2,7 +2,7 @@ CREATE TABLE `character` ( `character_id` int(12) NOT NULL, `account_id` varchar(50) NOT NULL, `name` varchar(50) NOT NULL, - `race` enum('HUMAN') NOT NULL, + `race` enum('HUMAN', 'ELF', 'DARK_ELF', 'ORC', 'DWARF', 'KAMAEL') NOT NULL, `class` enum('HUMAN_FIGHTER','WARRIOR','GLADIATOR','WARLORD','KNIGHT','PALADIN','DARK_AVENGER','ROGUE','TREASURE_HUNTER','HAWKEYE','DUELIST','DREADNOUGHT','phoenixKnight','hellKnight','sagittarius','adventurer','HUMAN_MYSTIC','WIZARD','SORCEROR','NECROMANCER','WARLOCK','CLERIC','BISHOP','PROPHET','ARCHMAGE','SOULTAKER','ARCANA_LORD','CARDINAL','HIEROPHANT','ELVEN_FIGHTER','ELVEN_KNIGHT','TEMPLE_KNIGHT','SWORD_SINGER','ELVEN_SCOUT','PLAINS_WALKER','SILVER_RANGER','EVA_TEMPLAR','SWORD_MUSE','WIND_RIDER','MOONLIGHT_SENTINEL','ELVEN_MYSTIC','ELVEN_WIZARD','SPELLSINGER','ELEMENTAL_SUMMONER','ORACLE','ELDER','MYSTIC_MUSE','ELEMENTAL_MASTER','EVA_SAINT','DARK_FIGHTER','PALUS_KNIGHT','SHILLIEN_KNIGHT','BLADEDANCER','ASSASSIN','ABYSS_WALKER','PHANTOM_RANGER','SHILLIEN_TEMPLAR','spectralDancer','ghostHunter','ghostSentinel','DARK_MYSTIC','DARK_WIZARD','SPELLHOWLER','PHANTOM_SUMMONER','SHILLIEN_ORACLE','SHILLIEN_ELDER','STORM_SCREAMER','SPECTRAL_MASTER','SHILLIEAN_SAINT','ORC_FIGHTER','ORC_RAIDER','DESTROYER','ORC_MONK','TYRANT','TITAN','GRAND_KHAUATARI','ORC_MYSTIC','ORC_SHAMAN','OVERLORD','WARCRYER','DOMINATOR','DOOMCRYER','DWARVEN_FIGHTER','SCAVENGER','BOUNTY_HUNTER','ARTISAN','WARSMITH','FORTUNE_SEEKER','MAESTRO','MALE_SOLDIER','TROOPER','BERSEKER','MALE_SOULBREAKER','DOOMBRINGER','MALE_SOULDHOUND','FEMALE_SOLDIER','WARDER','FEMALE_SOULBREAKER','ARBALESTER','FEMALE_SOULDHOUND','TRICKSTER','INSPECTOR','JUDICATOR') NOT NULL DEFAULT 'HUMAN_FIGHTER', `sex` enum('MALE','FEMALE') NOT NULL, `level` int(3) NOT NULL, diff --git a/src/main/resources/sql/character_friend.sql b/src/main/resources/sql/character_friend.sql new file mode 100644 index 000000000..dac7f0b88 --- /dev/null +++ b/src/main/resources/sql/character_friend.sql @@ -0,0 +1,5 @@ +CREATE TABLE `character_friend` ( + `character_id` int(10) NOT NULL, + `character_id_friend` int(10) NOT NULL, + PRIMARY KEY (`character_id`,`character_id_friend`) +) ENGINE=MyISAM; \ No newline at end of file diff --git a/src/test/java/com/l2jserver/model/world/character/CharacterFriendListTest.java b/src/test/java/com/l2jserver/model/world/character/CharacterFriendListTest.java new file mode 100644 index 000000000..31dd63b31 --- /dev/null +++ b/src/test/java/com/l2jserver/model/world/character/CharacterFriendListTest.java @@ -0,0 +1,51 @@ +package com.l2jserver.model.world.character; + +import junit.framework.Assert; + +import org.apache.log4j.BasicConfigurator; +import org.junit.Test; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.l2jserver.db.dao.CharacterFriendDAO; +import com.l2jserver.db.dao.DAOModuleMySQL5; +import com.l2jserver.model.id.factory.IDFactoryModule; +import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.model.id.object.factory.CharacterIDFactory; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.service.BasicServiceModule; +import com.l2jserver.service.ServiceModule; +import com.l2jserver.service.ServiceStartException; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.game.scripting.ScriptingService; +import com.l2jserver.service.game.template.TemplateService; + +public class CharacterFriendListTest { + private final Injector injector = Guice.createInjector(new ServiceModule(), + new BasicServiceModule(), new DAOModuleMySQL5(), + new IDFactoryModule()); + private final CharacterIDFactory charIdFactory = injector + .getInstance(CharacterIDFactory.class); + + @Test + public void testIterator() throws ServiceStartException { + BasicConfigurator.configure(); + injector.getInstance(ScriptingService.class).start(); + injector.getInstance(TemplateService.class).start(); + + injector.getInstance(DatabaseService.class).start(); + final CharacterID id = charIdFactory.createID(268437456); + final L2Character character = id.getObject(); + + final CharacterFriendDAO friendDao = injector + .getInstance(CharacterFriendDAO.class); + friendDao.load(character); + + for (final L2Character friend : character.getFriendList()) { + Assert.assertNotNull(friend); + Assert.assertNotSame(friend.getID(), character.getID()); + Assert.assertFalse(friend.getID().equals(character.getID())); + } + } + +} diff --git a/src/test/java/com/l2jserver/service/world/WorldEventDispatcherImplTest.java b/src/test/java/com/l2jserver/service/world/WorldEventDispatcherImplTest.java index e40baca3b..78ffe0df8 100644 --- a/src/test/java/com/l2jserver/service/world/WorldEventDispatcherImplTest.java +++ b/src/test/java/com/l2jserver/service/world/WorldEventDispatcherImplTest.java @@ -24,11 +24,12 @@ import com.l2jserver.model.world.player.PlayerEvent; import com.l2jserver.model.world.player.PlayerListener; import com.l2jserver.model.world.player.PlayerSpawnEvent; import com.l2jserver.service.BasicServiceModule; +import com.l2jserver.service.ServiceModule; 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; +import com.l2jserver.service.game.world.event.WorldEventDispatcher; +import com.l2jserver.service.game.world.event.WorldEventDispatcherImpl; public class WorldEventDispatcherImplTest { private WorldService world; @@ -40,8 +41,8 @@ public class WorldEventDispatcherImplTest { @Before public void tearUp() throws ServiceStartException { Injector injector = Guice.createInjector(new BasicServiceModule(), - new DAOModuleMySQL5(), new IDFactoryModule(), - new AbstractModule() { + new ServiceModule(), new DAOModuleMySQL5(), + new IDFactoryModule(), new AbstractModule() { @Override protected void configure() { bind(WorldService.class).to(WorldServiceImpl.class).in( diff --git a/src/test/java/com/l2jserver/service/world/WorldServiceImplTest.java b/src/test/java/com/l2jserver/service/world/WorldServiceImplTest.java index 6613c6818..f206765c5 100644 --- a/src/test/java/com/l2jserver/service/world/WorldServiceImplTest.java +++ b/src/test/java/com/l2jserver/service/world/WorldServiceImplTest.java @@ -15,10 +15,10 @@ 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; +import com.l2jserver.service.game.world.event.WorldEventDispatcher; +import com.l2jserver.service.game.world.event.WorldEventDispatcherImpl; public class WorldServiceImplTest { private WorldService world;