Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Caché de la la lista de Amigos

Iniciado por Swarlog, Jul 25, 2025, 11:24 PM

Tema anterior - Siguiente tema

Swarlog

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