Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Caché de la la lista de Amigos

Iniciado por Swarlog, Ago 19, 2022, 12:29 AM

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