Se trata de una renovación del cache de la lista de amigos, creado por Erb para l2j-server.
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 3158)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -45,6 +45,7 @@
import net.sf.l2j.gameserver.SevenSignsFestival;
import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.Universe;
+import net.sf.l2j.gameserver.model.L2Friend;
import net.sf.l2j.gameserver.ai.CtrlIntention;
import net.sf.l2j.gameserver.ai.L2CharacterAI;
import net.sf.l2j.gameserver.ai.L2PlayerAI;
@@ -158,6 +159,7 @@
import net.sf.l2j.gameserver.network.serverpackets.ExSetCompassZoneCode;
import net.sf.l2j.gameserver.network.serverpackets.ExSpawnEmitter;
import net.sf.l2j.gameserver.network.serverpackets.ExStorageMaxCount;
+import net.sf.l2j.gameserver.network.serverpackets.FriendList;
import net.sf.l2j.gameserver.network.serverpackets.GMHide;
import net.sf.l2j.gameserver.network.serverpackets.GameGuardQuery;
import net.sf.l2j.gameserver.network.serverpackets.HennaInfo;
@@ -676,6 +678,7 @@
private int _race[] = new int[2];
private final BlockList _blockList = new BlockList();
+ private FastMap<Integer,L2Friend> _friends = null;
private int _team = 0;
@@ -13297,4 +13300,113 @@
try { con.close(); } catch (Exception e) {}
}
}
+
+ public FastMap<Integer,L2Friend> getFriends()
+ {
+ if(_friends == null)
+ {
+ _friends = new FastMap<Integer,L2Friend>();
+ loadFriends();
+ }
+ return _friends;
+ }
+ public void notifyFriends(boolean loggedIN)
+ {
+ SystemMessage sm = new SystemMessage(SystemMessageId.FRIEND_S1_HAS_LOGGED_IN);
+ sm.addString(getName());
+ for(L2Friend f : getFriends().values())
+ {
+ if(f.isOnline())
+ {
+ f.getPlayer().sendPacket(sm);
+ f.getPlayer().sendPacket(new FriendList(f.getPlayer()));
+ }
+ }
+ }
+ public boolean isFriend(int objectId)
+ {
+ for(L2Friend f : getFriends().values())
+ {
+ if(f.getId() == objectId)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ public void deleteFriend(int friendId)
+ {
+ _friends.remove(friendId);
+ }
+ public void addFriend(int friendId, String friendName)
+ {
+ _friends.put(friendId,new L2Friend(friendId, friendName));
+ }
+ public void loadFriends()
+ {
+ java.sql.Connection con = null;
+
+ try {
+ con = L2DatabaseFactory.getInstance().getConnection();
+ PreparedStatement statement;
+ statement = con.prepareStatement("SELECT friend_name,friendId FROM character_friends WHERE charId=?");
+ statement.setInt(1, getObjectId());
+ ResultSet rset = statement.executeQuery();
+
+ String friendName;
+ int friendId;
+
+ while (rset.next())
+ {
+ friendName = rset.getString("friend_name");
+ friendId = rset.getInt("friendId");
+ _friends.put(friendId,new L2Friend(friendId, friendName));
+ }
+ rset.close();
+ statement.close();
+ }
+ catch (Exception e)
+ {
+ _log.log(Level.SEVERE, "Error restoring friend data.", e);
+ }
+ finally
+ {
+ try {con.close();} catch (Exception e){}
+ }
+ }
+ /**
+ * @param targetID
+ */
+ public void removeFriend(String targetID)
+ {
+ java.sql.Connection con = null;
+ SystemMessage sm;
+ try {
+ con = L2DatabaseFactory.getInstance().getConnection();
+ PreparedStatement statement;
+ int objectId = Integer.parseInt(targetID);
+ deleteFriend(objectId);
+ statement = con.prepareStatement("DELETE FROM character_friends WHERE (charId=? AND friendId=?) OR (charId=? AND friendId=?)");
+ statement.setInt(1, getObjectId());
+ statement.setInt(2, objectId);
+ statement.setInt(3, objectId);
+ statement.setInt(4, getObjectId());
+ statement.execute();
+ // Player deleted from your friendlist
+ sm = new SystemMessage(SystemMessageId.S1_HAS_BEEN_DELETED_FROM_YOUR_FRIENDS_LIST);
+ sm.addString("That User");
+ sendPacket(sm);
+ sm = null;
+
+ statement.close();
+ }
+ catch (Exception e)
+ {
+ _log.log(Level.SEVERE, "Error restoring friend data.", e);
+ }
+ finally
+ {
+ try {con.close();} catch (Exception e){}
+ }
+ }
}
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/model/L2Friend.java
===================================================================
--- java/net/sf/l2j/gameserver/model/L2Friend.java (revision 0)
+++ java/net/sf/l2j/gameserver/model/L2Friend.java (revision 0)
@@ -0,0 +1,66 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+package net.sf.l2j.gameserver.model;
+
+import net.sf.l2j.gameserver.model.L2World;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ *
+ * @author Erb
+ */
+public class L2Friend
+{
+ private final int _id;
+ private final String _name;
+
+ public L2Friend(int id, String name)
+ {
+ _id = id;
+ _name = name;
+ }
+
+ /**
+ * @return Returns the id.
+ */
+ public int getId()
+ {
+ return _id;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName()
+ {
+ return _name;
+ }
+
+ /**
+ * @return Returns the online.
+ */
+ public boolean isOnline()
+ {
+ return (L2World.getInstance().getPlayer(_name) != null);
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return L2World.getInstance().getPlayer(_name);
+ }
+}
Index: java/net/sf/l2j/gameserver/network/serverpackets/FriendList.java
===================================================================
--- java/net/sf/l2j/gameserver/network/serverpackets/FriendList.java (revision 3158)
+++ java/net/sf/l2j/gameserver/network/serverpackets/FriendList.java (working copy)
@@ -14,15 +14,10 @@
*/
package net.sf.l2j.gameserver.network.serverpackets;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
import java.util.List;
-import java.util.logging.Logger;
import javolution.util.FastList;
-import net.sf.l2j.L2DatabaseFactory;
-import net.sf.l2j.gameserver.model.L2World;
+import net.sf.l2j.gameserver.model.L2Friend;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
/**
@@ -42,7 +37,6 @@
*/
public class FriendList extends L2GameServerPacket
{
- private static Logger _log = Logger.getLogger(FriendList.class.getName());
private static final String _S__FA_FRIENDLIST = "[S] 75 FriendList";
private List<FriendStatus> _friends = new FastList<FriendStatus>();
private L2PcInstance _activeChar;
@@ -50,7 +44,6 @@
public FriendList(L2PcInstance character)
{
_activeChar = character;
- getFriendList();
}
private static class FriendStatus
@@ -101,60 +94,17 @@
}
}
- private void getFriendList()
- {
- Connection con = null;
-
- try
- {
- String sqlQuery = "SELECT friendId, friend_name FROM character_friends WHERE " +
- "charId=" + _activeChar.getObjectId() + " ORDER BY friend_name ASC";
-
- con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement = con.prepareStatement(sqlQuery);
- ResultSet rset = statement.executeQuery(sqlQuery);
-
- int friendId;
- String friendName;
- FriendStatus fs;
- while (rset.next())
- {
- friendId = rset.getInt("friendId");
- friendName = rset.getString("friend_name");
-
- if (friendId == _activeChar.getObjectId())
- continue;
-
- L2PcInstance friend = L2World.getInstance().getPlayer(friendName);
-
- fs = new FriendStatus(0x00030b7a,friendId, friendName, friend != null);
- _friends.add(fs);
- }
-
- rset.close();
- statement.close();
- }
- catch (Exception e)
- {
- _log.warning("Error found in " + _activeChar.getName() + "'s FriendList: " + e);
- }
- finally
- {
- try {con.close();} catch (Exception e) {}
- }
- }
-
@Override
protected final void writeImpl()
{
writeC(0x75);
writeD(_friends.size());
- for (FriendStatus fs : _friends)
+ for(L2Friend f : _activeChar.getFriends().values())
{
- writeD(fs.getCharId()); // character id
- writeS(fs.getName());
- writeD(fs.isOnline() ? 0x01 : 0x00); // online
- writeD(fs.isOnline() ? fs.getId() : 0x00); // object id if online
+ writeD(f.getId()); // character id
+ writeS(f.getName());
+ writeD(f.isOnline() ? 0x01 : 0x00); // online
+ writeD(f.isOnline() ? f.getId() : 0x00); // object id if online
}
}
Index: java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java (revision 3158)
+++ java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java (working copy)
@@ -378,7 +378,7 @@
sendPacket(new Die(activeChar));
}
- notifyFriends(activeChar);
+ activeChar.notifyFriends(true);
activeChar.onPlayerEnter();
@@ -485,54 +485,6 @@
/**
* @param activeChar
*/
- private void notifyFriends(L2PcInstance cha)
- {
- Connection con = null;
-
- try
- {
- con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement;
- statement = con.prepareStatement("SELECT friend_name FROM character_friends WHERE charId=?");
- statement.setInt(1, cha.getObjectId());
- ResultSet rset = statement.executeQuery();
-
- L2PcInstance friend;
- String friendName;
-
- SystemMessage sm = new SystemMessage(SystemMessageId.FRIEND_S1_HAS_LOGGED_IN);
- sm.addString(cha.getName());
-
- while (rset.next())
- {
- friendName = rset.getString("friend_name");
-
- friend = L2World.getInstance().getPlayer(friendName);
-
- if (friend != null) //friend logged in.
- {
- friend.sendPacket(new FriendList(friend));
- friend.sendPacket(sm);
- }
- }
- sm = null;
-
- rset.close();
- statement.close();
- }
- catch (Exception e)
- {
- _log.log(Level.SEVERE, "Error restoring friend data.", e);
- }
- finally
- {
- try {con.close();} catch (Exception e){}
- }
- }
-
- /**
- * @param activeChar
- */
private void notifyClanMembers(L2PcInstance activeChar)
{
L2Clan clan = activeChar.getClan();
Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestAnswerFriendInvite.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestAnswerFriendInvite.java (revision 3158)
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestAnswerFriendInvite.java (working copy)
@@ -59,6 +59,9 @@
if (_response == 1)
{
+ player.addFriend(requestor.getObjectId(), requestor.getName());
+ requestor.addFriend(player.getObjectId(), player.getName());
+
Connection con = null;
try
{
Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendList.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendList.java (revision 3158)
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendList.java (working copy)
@@ -14,12 +14,7 @@
*/
package net.sf.l2j.gameserver.network.clientpackets;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.logging.Logger;
-
-import net.sf.l2j.L2DatabaseFactory;
+import net.sf.l2j.gameserver.model.L2Friend;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.network.SystemMessageId;
@@ -32,7 +27,6 @@
*/
public final class RequestFriendList extends L2GameClientPacket
{
- private static Logger _log = Logger.getLogger(RequestFriendList.class.getName());
private static final String _C__60_REQUESTFRIENDLIST = "[C] 60 RequestFriendList";
@Override
@@ -50,54 +44,36 @@
return;
SystemMessage sm;
- Connection con = null;
- try
- {
- con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement = con.prepareStatement("SELECT friendId, friend_name FROM character_friends WHERE charId=?");
- statement.setInt(1, activeChar.getObjectId());
+ //======<Friend List>======
+ activeChar.sendPacket(new SystemMessage(SystemMessageId.FRIEND_LIST_HEADER));
- ResultSet rset = statement.executeQuery();
-
- //======<Friend List>======
- activeChar.sendPacket(new SystemMessage(SystemMessageId.FRIEND_LIST_HEADER));
+ L2PcInstance friend = null;
+ for (L2Friend f : activeChar.getFriends().values())
+ {
+ // int friendId = rset.getInt("friendId");
+ String friendName = f.getName();
+ friend = L2World.getInstance().getPlayer(friendName);
- L2PcInstance friend = null;
- while (rset.next())
+ if (friend == null)
{
- // int friendId = rset.getInt("friendId");
- String friendName = rset.getString("friend_name");
- friend = L2World.getInstance().getPlayer(friendName);
-
- if (friend == null)
- {
- // (Currently: Offline)
- sm = new SystemMessage(SystemMessageId.S1_OFFLINE);
- sm.addString(friendName);
- }
- else
- {
- //(Currently: Online)
- sm = new SystemMessage(SystemMessageId.S1_ONLINE);
- sm.addString(friendName);
- }
-
- activeChar.sendPacket(sm);
+ // (Currently: Offline)
+ sm = new SystemMessage(SystemMessageId.S1_OFFLINE);
+ sm.addString(friendName);
+ }
+ else
+ {
+ //(Currently: Online)
+ sm = new SystemMessage(SystemMessageId.S1_ONLINE);
+ sm.addString(friendName);
}
- //=========================
- activeChar.sendPacket(new SystemMessage(SystemMessageId.FRIEND_LIST_FOOTER));
- sm = null;
- rset.close();
- statement.close();
+ activeChar.sendPacket(sm);
}
- catch (Exception e) {
- _log.warning("Error in /friendlist for " + activeChar + ": " + e);
- }
- finally {
- try {con.close();} catch (Exception e) {}
- }
+
+ //=========================
+ activeChar.sendPacket(new SystemMessage(SystemMessageId.FRIEND_LIST_FOOTER));
+ sm = null;
}
@Override
Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java (revision 3158)
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java (working copy)
@@ -75,6 +75,7 @@
sm = null;
return;
}
+ friend.deleteFriend(activeChar.getObjectId());
} else
{
statement = con.prepareStatement("SELECT friendId FROM character_friends AS cf, characters AS c WHERE cf.charId=? AND cf.friendId=c.charId AND char_name=?");
@@ -96,7 +97,7 @@
int objectId = rset.getInt("friendId");
rset.close();
statement.close();
-
+ activeChar.deleteFriend(objectId);
statement = con.prepareStatement("DELETE FROM character_friends WHERE (charId=? AND friendId=?) OR (charId=? AND friendId=?)");
statement.setInt(1, activeChar.getObjectId());
statement.setInt(2, objectId);
Index: java/net/sf/l2j/gameserver/network/clientpackets/Logout.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/Logout.java (revision 3158)
+++ java/net/sf/l2j/gameserver/network/clientpackets/Logout.java (working copy)
@@ -115,44 +115,7 @@
RegionBBSManager.getInstance().changeCommunityBoard();
player.deleteMe();
- notifyFriends(player);
- }
-
- private void notifyFriends(L2PcInstance cha)
- {
- Connection con = null;
-
- try {
- con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement;
- statement = con.prepareStatement("SELECT friend_name FROM character_friends WHERE charId=?");
- statement.setInt(1, cha.getObjectId());
- ResultSet rset = statement.executeQuery();
-
- L2PcInstance friend;
- String friendName;
-
- while (rset.next())
- {
- friendName = rset.getString("friend_name");
-
- friend = L2World.getInstance().getPlayer(friendName);
-
- if (friend != null) //friend logged in.
- {
- friend.sendPacket(new FriendList(friend));
- }
- }
-
- rset.close();
- statement.close();
- }
- catch (Exception e) {
- _log.warning("could not restore friend data:"+e);
- }
- finally {
- try {con.close();} catch (Exception e){}
- }
+ player.notifyFriends(false);
}
/* (non-Javadoc)
Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java (revision 3158)
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java (working copy)
@@ -14,13 +14,6 @@
*/
package net.sf.l2j.gameserver.network.clientpackets;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import net.sf.l2j.L2DatabaseFactory;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.network.SystemMessageId;
@@ -35,7 +28,6 @@
public final class RequestFriendInvite extends L2GameClientPacket
{
private static final String _C__5E_REQUESTFRIENDINVITE = "[C] 5E RequestFriendInvite";
- private static Logger _log = Logger.getLogger(RequestFriendInvite.class.getName());
private String _name;
@@ -49,7 +41,6 @@
protected void runImpl()
{
SystemMessage sm;
- Connection con = null;
L2PcInstance activeChar = getClient().getActiveChar();
if (activeChar == null)
@@ -74,51 +65,33 @@
return;
}
String name = friend.getName();
- try
- {
- con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement = con.prepareStatement("SELECT charId FROM character_friends WHERE charId=? AND friendId=?");
- statement.setInt(1, activeChar.getObjectId());
- statement.setInt(2, friend.getObjectId());
- ResultSet rset = statement.executeQuery();
-
- if (rset.next())
- {
- //Player already is in your friendlist
- sm = new SystemMessage(SystemMessageId.S1_ALREADY_IN_FRIENDS_LIST);
- sm.addString(name);
- }
+
+ if (activeChar.isFriend(friend.getObjectId()))
+ {
+ //Player already is in your friendlist
+ sm = new SystemMessage(SystemMessageId.S1_ALREADY_IN_FRIENDS_LIST);
+ sm.addString(name);
+ }
+ else
+ {
+ if (!friend.isProcessingRequest())
+ {
+ //requets to become friend
+ activeChar.onTransactionRequest(friend);
+ sm = new SystemMessage(SystemMessageId.C1_REQUESTED_TO_BECOME_FRIENDS);
+ sm.addString(name);
+ FriendAddRequest ajf = new FriendAddRequest(activeChar.getName());
+ friend.sendPacket(ajf);
+ }
else
{
- if (!friend.isProcessingRequest())
- {
- //requets to become friend
- activeChar.onTransactionRequest(friend);
- sm = new SystemMessage(SystemMessageId.C1_REQUESTED_TO_BECOME_FRIENDS);
- sm.addString(name);
- FriendAddRequest ajf = new FriendAddRequest(activeChar.getName());
- friend.sendPacket(ajf);
- }
- else
- {
- sm = new SystemMessage(SystemMessageId.C1_IS_BUSY_TRY_LATER);
- sm.addString(name);
- }
- }
+ sm = new SystemMessage(SystemMessageId.C1_IS_BUSY_TRY_LATER);
+ sm.addString(name);
+ }
+ }
- activeChar.sendPacket(sm);
- sm = null;
- rset.close();
- statement.close();
- }
- catch (Exception e)
- {
- _log.log(Level.WARNING, "could not add friend objectid: ", e);
- }
- finally
- {
- try { con.close(); } catch (Exception e) {}
- }
+ activeChar.sendPacket(sm);
+ sm = null;
}
@Override