diff --git a/trunk/java/com/l2jserver/gameserver/model/BlockList.java b/trunk/java/com/l2jserver/gameserver/model/BlockList.java index c955202250..cb7db7de1f 100644 --- a/trunk/java/com/l2jserver/gameserver/model/BlockList.java +++ b/trunk/java/com/l2jserver/gameserver/model/BlockList.java @@ -21,20 +21,19 @@ package com.l2jserver.gameserver.model; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javolution.util.FastMap; - import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; -import com.l2jserver.gameserver.network.serverpackets.BlockListPacket; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.network.serverpackets.friend.BlockListPacket; /** * This class ... @@ -43,10 +42,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage; public class BlockList { private static Logger _log = Logger.getLogger(BlockList.class.getName()); - private static Map> _offlineList = new FastMap>().shared(); + private static Map> _offlineList = new HashMap<>(); private final L2PcInstance _owner; - private List _blockList; + private HashMap _blockList; + private final ArrayList _updateMemos = new ArrayList<>(); public BlockList(L2PcInstance owner) { @@ -60,26 +60,62 @@ public class BlockList private void addToBlockList(int target) { - _blockList.add(target); + _blockList.put(target, ""); updateInDB(target, true); } private void removeFromBlockList(int target) { _blockList.remove(Integer.valueOf(target)); + if (_updateMemos.contains(target)) + { + _updateMemos.remove(Integer.valueOf(target)); + } updateInDB(target, false); } + public void setBlockMemo(int target, String memo) + { + if (_blockList.containsKey(target)) + { + _blockList.put(target, memo); + _updateMemos.add(target); + } + } + + public void updateBlockMemos() + { + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + for (int target : _updateMemos) + { + try (PreparedStatement statement = con.prepareStatement("UPDATE character_friends SET memo=? WHERE charId=? AND friendId=? AND relation=1")) + { + statement.setString(1, _blockList.get(target)); + statement.setInt(2, _owner.getObjectId()); + statement.setInt(3, target); + statement.execute(); + } + } + } + catch (SQLException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + _blockList.clear(); + } + public void playerLogout() { _offlineList.put(_owner.getObjectId(), _blockList); } - private static List loadList(int ObjId) + private static HashMap loadList(int ObjId) { - List list = new ArrayList<>(); + HashMap list = new HashMap<>(); try (Connection con = L2DatabaseFactory.getInstance().getConnection(); - PreparedStatement statement = con.prepareStatement("SELECT friendId FROM character_friends WHERE charId=? AND relation=1")) + PreparedStatement statement = con.prepareStatement("SELECT friendId, memo FROM character_friends WHERE charId=? AND relation=1")) { statement.setInt(1, ObjId); try (ResultSet rset = statement.executeQuery()) @@ -92,7 +128,8 @@ public class BlockList { continue; } - list.add(friendId); + String memo = rset.getString("memo"); + list.put(friendId, memo); } } } @@ -135,12 +172,12 @@ public class BlockList public boolean isInBlockList(L2PcInstance target) { - return _blockList.contains(target.getObjectId()); + return _blockList.containsKey(target.getObjectId()); } public boolean isInBlockList(int targetId) { - return _blockList.contains(targetId); + return _blockList.containsKey(targetId); } public boolean isBlockAll() @@ -165,7 +202,7 @@ public class BlockList _owner.setMessageRefusal(state); } - private List getBlockList() + public HashMap getBlockList() { return _blockList; } @@ -179,7 +216,7 @@ public class BlockList String charName = CharNameTable.getInstance().getNameById(targetId); - if (listOwner.getFriendList().contains(targetId)) + if (listOwner.getFriendList().containsKey(targetId)) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THIS_PLAYER_IS_ALREADY_REGISTERED_ON_YOUR_FRIENDS_LIST); sm.addString(charName); @@ -187,7 +224,7 @@ public class BlockList return; } - if (listOwner.getBlockList().getBlockList().contains(targetId)) + if (listOwner.getBlockList().getBlockList().containsKey(targetId)) { listOwner.sendMessage("Already in ignore list."); return; @@ -220,7 +257,7 @@ public class BlockList String charName = CharNameTable.getInstance().getNameById(targetId); - if (!listOwner.getBlockList().getBlockList().contains(targetId)) + if (!listOwner.getBlockList().getBlockList().containsKey(targetId)) { sm = SystemMessage.getSystemMessage(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET); listOwner.sendPacket(sm); @@ -251,7 +288,7 @@ public class BlockList public static void sendListToOwner(L2PcInstance listOwner) { - listOwner.sendPacket(new BlockListPacket(listOwner.getBlockList().getBlockList())); + listOwner.sendPacket(new BlockListPacket(listOwner)); } /** @@ -270,6 +307,6 @@ public class BlockList { _offlineList.put(ownerId, loadList(ownerId)); } - return _offlineList.get(ownerId).contains(targetId); + return _offlineList.get(ownerId).containsKey(targetId); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java index daa75d67f5..ee62f554eb 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java @@ -190,6 +190,7 @@ import com.l2jserver.gameserver.model.effects.L2EffectType; import com.l2jserver.gameserver.model.entity.Castle; import com.l2jserver.gameserver.model.entity.Duel; import com.l2jserver.gameserver.model.entity.Fort; +import com.l2jserver.gameserver.model.entity.Friend; import com.l2jserver.gameserver.model.entity.Hero; import com.l2jserver.gameserver.model.entity.Instance; import com.l2jserver.gameserver.model.entity.L2Event; @@ -7580,6 +7581,8 @@ public final class L2PcInstance extends L2Playable { storeUISettings(); } + getBlockList().updateBlockMemos(); + updateMemos(); final PlayerVariables vars = getScript(PlayerVariables.class); if (vars != null) @@ -11530,6 +11533,16 @@ public final class L2PcInstance extends L2Playable { EventDispatcher.getInstance().notifyEventAsync(new OnPlayerLogout(this), this); + for (Friend friend : _friendList.values()) + { + L2PcInstance player = friend.getFriend(); + if (player == null) + { + continue; + } + player.putFriendDetailInfo(this); + } + try { for (L2ZoneType zone : ZoneManager.getInstance().getZones(this)) @@ -13593,18 +13606,66 @@ public final class L2PcInstance extends L2Playable /** * list of character friends */ - private final List _friendList = new FastList<>(); + private final HashMap _friendList = new HashMap<>(); + private final ArrayList _updateMemos = new ArrayList<>(); - public List getFriendList() + public HashMap getFriendList() { return _friendList; } + public Friend getFriend(int friendOID) + { + if (getFriendList().containsKey(friendOID)) + { + return getFriendList().get(friendOID); + } + return null; + } + + public void updateMemo(int friendOID) + { + if (!_updateMemos.contains(friendOID)) + { + _updateMemos.add(friendOID); + } + } + + public void updateMemos() + { + final String sqlQuery = "UPDATE character_friends SET memo=? WHERE charId=? AND friendId=? AND relation=0"; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + for (int target : _updateMemos) + { + try (PreparedStatement statement = con.prepareStatement(sqlQuery)) + { + Friend friend = _friendList.get(target); + statement.setString(1, friend.getMemo()); + statement.setInt(2, getObjectId()); + statement.setInt(3, target); + statement.executeUpdate(); + } + } + } + catch (Exception e) + { + _log.log(Level.WARNING, "Error found in " + getName() + "'s FriendList: " + e.getMessage(), e); + } + _updateMemos.clear(); + } + + public void addFriend(L2PcInstance player) + { + _friendList.put(player.getObjectId(), new Friend(0, player.getObjectId(), "")); + putFriendDetailInfo(player); + } + public void restoreFriendList() { _friendList.clear(); - final String sqlQuery = "SELECT friendId FROM character_friends WHERE charId=? AND relation=0"; + final String sqlQuery = "SELECT friendId, memo FROM character_friends WHERE charId=? AND relation=0"; try (Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement(sqlQuery)) { @@ -13618,7 +13679,9 @@ public final class L2PcInstance extends L2Playable { continue; } - _friendList.add(friendId); + String memo = rset.getString("memo"); + _friendList.put(friendId, new Friend(0, friendId, memo)); + putFriendDetailInfo(friendId); } } } @@ -13628,10 +13691,105 @@ public final class L2PcInstance extends L2Playable } } + public void putFriendDetailInfo(L2PcInstance player) + { + Friend friend = _friendList.get(player.getObjectId()); + friend.setLevel(player.getLevel()); + friend.setClassId(player.getClassId().getId()); + if (player.getClan() != null) + { + friend.setClanId(player.getClan().getId()); + friend.setClanName(player.getClan().getName()); + friend.setClanCrestId(player.getClan().getCrestId()); + friend.setAllyId(player.getClan().getAllyId()); + friend.setAllyName(player.getClan().getAllyName()); + friend.setAllyCrestId(player.getClan().getAllyCrestId()); + } + friend.setLastLogin(System.currentTimeMillis()); + friend.setCreateDate(player.getCreateDate().getTimeInMillis()); + } + + public void putFriendDetailInfo(int friendId) + { + Friend friend = _friendList.get(friendId); + int bClassId = 0; + + try (Connection con = L2DatabaseFactory.getInstance().getConnection(); + PreparedStatement statement = con.prepareStatement("SELECT * FROM characters WHERE charId=?");) + { + statement.setInt(1, friendId); + ResultSet rset = statement.executeQuery(); + while (rset.next()) + { + friend.setLevel(rset.getByte("level")); + friend.setClassId(rset.getInt("classid")); + bClassId = (rset.getInt("base_class")); + friend.setClanId(rset.getInt("clanid")); + friend.setLastLogin(rset.getLong("lastAccess")); + friend.setCreateDate(rset.getLong("createDate")); + } + statement.execute(); + + rset.close(); + } + catch (Exception e) + { + System.out.println("Failed loading character. " + e); + e.printStackTrace(); + } + if (friend.getClassId() != bClassId) + { + try (Connection con = L2DatabaseFactory.getInstance().getConnection(); + PreparedStatement statement = con.prepareStatement("SELECT level FROM character_subclasses WHERE charId=? AND class_id=?");) + { + statement.setInt(1, friendId); + statement.setInt(2, friend.getClassId()); + ResultSet rset = statement.executeQuery(); + + while (rset.next()) + { + friend.setLevel(rset.getByte("level")); + } + + statement.execute(); + rset.close(); + } + catch (Exception e) + { + System.out.println("Failed loading character_subclasses. " + e); + e.printStackTrace(); + } + } + if (friend.getClanId() != 0) + { + try (Connection con = L2DatabaseFactory.getInstance().getConnection(); + PreparedStatement statement = con.prepareStatement("SELECT * FROM clan_data WHERE clan_id=?");) + { + statement.setInt(1, friend.getClanId()); + ResultSet rset = statement.executeQuery(); + while (rset.next()) + { + friend.setClanName(rset.getString("clan_name")); + friend.setClanCrestId(rset.getInt("crest_id")); + friend.setAllyId(rset.getInt("ally_id")); + friend.setAllyName(rset.getString("ally_name")); + friend.setAllyCrestId(rset.getInt("ally_crest_id")); + } + statement.execute(); + rset.close(); + } + catch (Exception e) + { + System.out.println("Failed loading clan_data. " + e); + e.printStackTrace(); + } + } + } + public void notifyFriends(int type) { L2FriendStatus pkt = new L2FriendStatus(this, type); - for (int id : _friendList) + for (int id : _friendList.keySet()) { L2PcInstance friend = L2World.getInstance().getPlayer(id); if (friend != null) @@ -14898,5 +15056,4 @@ public final class L2PcInstance extends L2Playable } getSubClasses().get(getClassIndex()).setVitalityPoints(points); } - } diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/Friend.java b/trunk/java/com/l2jserver/gameserver/model/entity/Friend.java new file mode 100644 index 0000000000..1009172f3c --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/model/entity/Friend.java @@ -0,0 +1,177 @@ +/* + * 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 3 of the License, 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, see . + */ +package com.l2jserver.gameserver.model.entity; + +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.model.L2World; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; + +/** + * @author Erlandys + */ +public class Friend +{ + int _relation; + int _friendOID; + String _memo; + + int _level = 1; + int _classId = 0; + int _clanId = 0; + int _clanCrestId = 0; + int _allyId = 0; + int _allyCrestId = 0; + String _name = ""; + String _clanName = ""; + String _allyName = ""; + long _createDate = -1; + long _lastLogin = -1; + + public Friend(int relation, int friendOID, String memo) + { + _relation = relation; + _friendOID = friendOID; + _memo = memo; + } + + public L2PcInstance getFriend() + { + return L2World.getInstance().getPlayer(_friendOID); + } + + public int getFriendOID() + { + return _friendOID; + } + + public String getMemo() + { + return _memo; + } + + public void setMemo(String memo) + { + _memo = memo; + } + + public int getLevel() + { + return _level; + } + + public void setLevel(int level) + { + _level = level; + } + + public int getClassId() + { + return _classId; + } + + public void setClassId(int classId) + { + _classId = classId; + } + + public int getClanId() + { + return _clanId; + } + + public void setClanId(int clanId) + { + _clanId = clanId; + } + + public int getClanCrestId() + { + return _clanCrestId; + } + + public void setClanCrestId(int clanCrestId) + { + _clanCrestId = clanCrestId; + } + + public int getAllyId() + { + return _allyId; + } + + public void setAllyId(int allyId) + { + _allyId = allyId; + } + + public int getAllyCrestId() + { + return _allyCrestId; + } + + public void setAllyCrestId(int allyCrestId) + { + _allyCrestId = allyCrestId; + } + + public String getName() + { + if (_name == "") + { + _name = CharNameTable.getInstance().getNameById(_friendOID); + } + return _name; + } + + public String getClanName() + { + return _clanName; + } + + public void setClanName(String clanName) + { + _clanName = clanName; + } + + public String getAllyName() + { + return _allyName; + } + + public void setAllyName(String allyName) + { + _allyName = allyName; + } + + public long getCreateDate() + { + return _createDate; + } + + public void setCreateDate(long createDate) + { + _createDate = createDate; + } + + public long getLastLogin() + { + return _lastLogin; + } + + public void setLastLogin(long lastLogin) + { + _lastLogin = lastLogin; + } +} diff --git a/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java b/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java index c9c7e5e2da..ea7ebfe079 100644 --- a/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java +++ b/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java @@ -37,6 +37,8 @@ import com.l2jserver.gameserver.network.clientpackets.friend.RequestFriendDel; import com.l2jserver.gameserver.network.clientpackets.friend.RequestFriendDetailInfo; import com.l2jserver.gameserver.network.clientpackets.friend.RequestFriendList; import com.l2jserver.gameserver.network.clientpackets.friend.RequestSendFriendMsg; +import com.l2jserver.gameserver.network.clientpackets.friend.RequestUpdateBlockMemo; +import com.l2jserver.gameserver.network.clientpackets.friend.RequestUpdateFriendMemo; import com.l2jserver.gameserver.network.clientpackets.mentoring.ConfirmMenteeAdd; import com.l2jserver.gameserver.network.clientpackets.mentoring.RequestMenteeAdd; import com.l2jserver.gameserver.network.clientpackets.mentoring.RequestMenteeWaitingList; @@ -1302,7 +1304,7 @@ public final class L2GamePacketHandler implements IPacketHandler, // @ msg = new RequestExEscapeScene(); break; case 0x91: - // msg = new RequestFlyMove(); + msg = new RequestFlyMove(); break; case 0x92: // msg = new RequestSurrenderPledgeWarEX(); (chS) @@ -1332,10 +1334,10 @@ public final class L2GamePacketHandler implements IPacketHandler, msg = new RequestFriendDetailInfo(); break; case 0x95: - // msg = new RequestUpdateFriendMemo(); + msg = new RequestUpdateFriendMemo(); break; case 0x96: - // msg = new RequestUpdateBlockMemo(); + msg = new RequestUpdateBlockMemo(); break; case 0x97: // msg = new RequestInzonePartyInfoHistory(); @@ -1392,7 +1394,7 @@ public final class L2GamePacketHandler implements IPacketHandler, // msg = new RequestFirstPlayStart(); break; case 0xAD: - // msg = new RequestFlyMoveStart(); + msg = new RequestFlyMoveStart(); break; case 0xAE: case 0xAF: diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java index b7754d0b9c..ffd7ceacc7 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java @@ -461,7 +461,7 @@ public class EnterWorld extends L2GameClientPacket SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOUR_FRIEND_S1_JUST_LOGGED_IN); sm.addString(activeChar.getName()); - for (int id : activeChar.getFriendList()) + for (int id : activeChar.getFriendList().keySet()) { L2Object obj = L2World.getInstance().findObject(id); if (obj != null) diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBlock.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBlock.java index 2106b13a9e..e615802315 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBlock.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBlock.java @@ -22,6 +22,7 @@ import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.BlockList; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.friend.BlockListPacket; public final class RequestBlock extends L2GameClientPacket { @@ -91,6 +92,7 @@ public final class RequestBlock extends L2GameClientPacket { BlockList.removeFromBlockList(activeChar, targetId); } + activeChar.sendPacket(new BlockListPacket(activeChar)); break; case BLOCKLIST: BlockList.sendListToOwner(activeChar); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java index c924af2438..4d128d76a9 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java @@ -83,7 +83,7 @@ public final class RequestFriendInvite extends L2GameClientPacket return; } // Target already in friend list. - if (activeChar.getFriendList().contains(friend.getObjectId())) + if (activeChar.getFriendList().containsKey(friend.getObjectId())) { sm = SystemMessage.getSystemMessage(SystemMessageId.THIS_PLAYER_IS_ALREADY_REGISTERED_ON_YOUR_FRIENDS_LIST); sm.addString(_name); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestAnswerFriendInvite.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestAnswerFriendInvite.java index 5574a5ab78..0f169753dc 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestAnswerFriendInvite.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestAnswerFriendInvite.java @@ -28,6 +28,7 @@ import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.network.serverpackets.friend.FriendAddRequestResult; +import com.l2jserver.gameserver.network.serverpackets.friend.FriendList; public final class RequestAnswerFriendInvite extends L2GameClientPacket { @@ -70,17 +71,19 @@ public final class RequestAnswerFriendInvite extends L2GameClientPacket msg = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_BEEN_ADDED_TO_YOUR_FRIENDS_LIST); msg.addString(player.getName()); requestor.sendPacket(msg); - requestor.getFriendList().add(player.getObjectId()); + requestor.addFriend(player); // has joined as friend. msg = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_JOINED_AS_A_FRIEND); msg.addString(requestor.getName()); player.sendPacket(msg); - player.getFriendList().add(requestor.getObjectId()); + player.addFriend(requestor); // Send notifications for both player in order to show them online player.sendPacket(new FriendAddRequestResult(requestor, 1)); requestor.sendPacket(new FriendAddRequestResult(player, 1)); + player.sendPacket(new FriendList(player)); + requestor.sendPacket(new FriendList(requestor)); } catch (Exception e) { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendDel.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendDel.java index 31fc5566e8..355c2fd5d2 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendDel.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendDel.java @@ -29,6 +29,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.network.serverpackets.friend.FriendList; import com.l2jserver.gameserver.network.serverpackets.friend.FriendRemove; /** @@ -68,7 +69,7 @@ public final class RequestFriendDel extends L2GameClientPacket return; } - if (!activeChar.getFriendList().contains(id)) + if (!activeChar.getFriendList().containsKey(id)) { sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_NOT_ON_YOUR_FRIEND_LIST); sm.addString(_name); @@ -90,7 +91,7 @@ public final class RequestFriendDel extends L2GameClientPacket sm.addString(_name); activeChar.sendPacket(sm); - activeChar.getFriendList().remove(Integer.valueOf(id)); + activeChar.getFriendList().remove(id); activeChar.sendPacket(new FriendRemove(_name, 1)); L2PcInstance player = L2World.getInstance().getPlayer(_name); @@ -99,6 +100,8 @@ public final class RequestFriendDel extends L2GameClientPacket player.getFriendList().remove(Integer.valueOf(activeChar.getObjectId())); player.sendPacket(new FriendRemove(activeChar.getName(), 1)); } + player.sendPacket(new FriendList(player)); + activeChar.sendPacket(new FriendList(activeChar)); } catch (Exception e) { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendInvite.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendInvite.java index fcfee56c26..6b4dfb3aa7 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendInvite.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendInvite.java @@ -86,7 +86,7 @@ public final class RequestFriendInvite extends L2GameClientPacket } // Target already in friend list. - if (activeChar.getFriendList().contains(friend.getObjectId())) + if (activeChar.getFriendList().containsKey(friend.getObjectId())) { sm = SystemMessage.getSystemMessage(SystemMessageId.THIS_PLAYER_IS_ALREADY_REGISTERED_ON_YOUR_FRIENDS_LIST); sm.addString(_name); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendList.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendList.java index 91792dbd04..10aa11d21d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendList.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendList.java @@ -55,7 +55,7 @@ public final class RequestFriendList extends L2GameClientPacket activeChar.sendPacket(SystemMessageId.FRIENDS_LIST); L2PcInstance friend = null; - for (int id : activeChar.getFriendList()) + for (int id : activeChar.getFriendList().keySet()) { // int friendId = rset.getInt("friendId"); String friendName = CharNameTable.getInstance().getNameById(id); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestSendFriendMsg.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestSendFriendMsg.java index 56d7ceadf5..4a105101ce 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestSendFriendMsg.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestSendFriendMsg.java @@ -63,7 +63,7 @@ public final class RequestSendFriendMsg extends L2GameClientPacket } final L2PcInstance targetPlayer = L2World.getInstance().getPlayer(_reciever); - if ((targetPlayer == null) || !targetPlayer.getFriendList().contains(activeChar.getObjectId())) + if ((targetPlayer == null) || !targetPlayer.getFriendList().containsKey(activeChar.getObjectId())) { activeChar.sendPacket(SystemMessageId.THAT_PLAYER_IS_NOT_ONLINE); return; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestUpdateBlockMemo.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestUpdateBlockMemo.java new file mode 100644 index 0000000000..e899d1bc14 --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestUpdateBlockMemo.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server 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 3 of the License, or + * (at your option) any later version. + * + * L2J Server 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, see . + */ +package com.l2jserver.gameserver.network.clientpackets.friend; + +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket; +import com.l2jserver.gameserver.network.serverpackets.friend.BlockListPacket; + +public final class RequestUpdateBlockMemo extends L2GameClientPacket +{ + private static final String _C__D0_96_REQUESTUPDATEBLOCKMEMO = "[C] D0:96 RequestUpdateBlockMemo"; + + private String cName; + private String memo; + + @Override + protected void readImpl() + { + cName = readS(); + memo = readS(); + } + + @Override + protected void runImpl() + { + L2PcInstance player = getClient().getActiveChar(); + player.getBlockList().setBlockMemo(CharNameTable.getInstance().getIdByName(cName), memo); + player.sendPacket(new BlockListPacket(player)); + } + + @Override + public String getType() + { + return _C__D0_96_REQUESTUPDATEBLOCKMEMO; + } + +} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/BlockListPacket.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestUpdateFriendMemo.java similarity index 50% rename from trunk/java/com/l2jserver/gameserver/network/serverpackets/BlockListPacket.java rename to trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestUpdateFriendMemo.java index 7b03e04ab0..823e6e71d3 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/BlockListPacket.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestUpdateFriendMemo.java @@ -16,33 +16,37 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.network.serverpackets; - -import java.util.List; +package com.l2jserver.gameserver.network.clientpackets.friend; import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket; -/** - * @author Sdw - */ -public class BlockListPacket extends L2GameServerPacket +public final class RequestUpdateFriendMemo extends L2GameClientPacket { - private final List _playersId; + private static final String _C__D0_95_REQUESTUPDATEFRIENDMEMO = "[C] D0:95 RequestUpdateFriendMemo"; + String cName; + String memo; - public BlockListPacket(List playersId) + @Override + protected void readImpl() { - _playersId = playersId; + cName = readS(); + memo = readS(); } @Override - protected final void writeImpl() + protected void runImpl() { - writeC(0xD5); - writeD(_playersId.size()); - for (int playerId : _playersId) - { - writeS(CharNameTable.getInstance().getNameById(playerId)); - writeS(""); // memo ? - } + L2PcInstance player = getClient().getActiveChar(); + int id = CharNameTable.getInstance().getIdByName(cName); + player.getFriend(id).setMemo(memo); + player.updateMemo(id); + } + + @Override + public String getType() + { + return _C__D0_95_REQUESTUPDATEFRIENDMEMO; } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/CreatureSay.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/CreatureSay.java index e42fe9c578..3afc3be7b1 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/CreatureSay.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/CreatureSay.java @@ -52,7 +52,7 @@ public final class CreatureSay extends L2GameServerPacket _charLevel = sender.getLevel(); _textType = messageType; _text = text; - if (receiver.getFriendList().contains(sender.getObjectId())) + if (receiver.getFriendList().containsKey(sender.getObjectId())) { _mask |= 0x01; } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/RelationChanged.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/RelationChanged.java index db9038b6d2..1739553b05 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/RelationChanged.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/RelationChanged.java @@ -85,7 +85,8 @@ public final class RelationChanged extends L2GameServerPacket { if (activeChar.isInvisible()) { - throw new IllegalArgumentException("Cannot add insivisble character to multi relation packet"); + _log.severe("Cannot add insivisble character to multi relation packet"); + return; } Relation r = new Relation(); r._objId = activeChar.getObjectId(); diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/TradeStart.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/TradeStart.java index b9f8d8ff6d..add902b94e 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/TradeStart.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/TradeStart.java @@ -39,7 +39,7 @@ public final class TradeStart extends AbstractItemPacket if (_partner != null) { - if (player.getFriendList().contains(_partner.getObjectId())) + if (player.getFriendList().containsKey(_partner.getObjectId())) { _mask |= 0x01; } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/BlockListPacket.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/BlockListPacket.java new file mode 100644 index 0000000000..4067e1a3c5 --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/BlockListPacket.java @@ -0,0 +1,47 @@ +/* + * 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 3 of the License, 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, see . + */ +package com.l2jserver.gameserver.network.serverpackets.friend; + +import java.util.Map; + +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; + +/** + * @author Erlandys + */ +public class BlockListPacket extends L2GameServerPacket +{ + private final L2PcInstance player; + + public BlockListPacket(L2PcInstance activeChar) + { + player = activeChar; + } + + @Override + protected void writeImpl() + { + writeC(0xD5); + writeD(player.getBlockList().getBlockList().size()); + for (Map.Entry entry : player.getBlockList().getBlockList().entrySet()) + { + writeS(CharNameTable.getInstance().getNameById(entry.getKey())); + writeS(entry.getValue()); + } + + } +} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/ExFriendDetailInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/ExFriendDetailInfo.java index f54835c9f5..e0061f7f05 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/ExFriendDetailInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/ExFriendDetailInfo.java @@ -20,8 +20,9 @@ package com.l2jserver.gameserver.network.serverpackets.friend; import java.util.Calendar; -import com.l2jserver.gameserver.model.L2World; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.Friend; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; /** @@ -45,42 +46,47 @@ public class ExFriendDetailInfo extends L2GameServerPacket writeH(0xEC); writeD(_player.getObjectId()); + Friend friend = _player.getFriend(CharNameTable.getInstance().getIdByName(_name)); - L2PcInstance friend = L2World.getInstance().getPlayer(_name); - if (friend == null) + L2PcInstance player = friend.getFriend(); + if (player == null) { writeS(_name); - writeD(0); - writeD(0); - writeH(0); - writeH(0); - writeD(0); - writeD(0); - writeS(""); - writeD(0); - writeD(0); - writeS(""); - writeD(0); - writeS(""); // memo + writeD(0x00); + writeD(0x00); + writeH(friend.getLevel()); + writeH(friend.getClassId()); + writeD(friend.getClanId()); + writeD(friend.getClanCrestId()); + writeS(friend.getClanName()); + writeD(friend.getAllyId()); + writeD(friend.getAllyCrestId()); + writeS(friend.getAllyName()); + Calendar createDate = Calendar.getInstance(); + createDate.setTimeInMillis(friend.getCreateDate()); + writeC(createDate.get(Calendar.MONTH) + 1); + writeC(createDate.get(Calendar.DAY_OF_MONTH)); + writeD((int) ((System.currentTimeMillis() - friend.getLastLogin()) / 1000)); + writeS(friend.getMemo()); // memo } else { - writeS(friend.getName()); - writeD(friend.isOnlineInt()); - writeD(friend.getObjectId()); - writeH(friend.getLevel()); - writeH(friend.getClassIndex()); - writeD(friend.getClanId()); - writeD(friend.getClanCrestId()); - writeS(friend.getClan() != null ? friend.getClan().getName() : ""); - writeD(friend.getAllyId()); - writeD(friend.getAllyCrestId()); - writeS(friend.getClan() != null ? friend.getClan().getAllyName() : ""); - Calendar createDate = friend.getCreateDate(); - writeC(createDate.get(Calendar.MONTH)); + writeS(player.getName()); + writeD(player.isOnlineInt()); + writeD(player.getObjectId()); + writeH(player.getLevel()); + writeH(player.getClassId().getId()); + writeD(player.getClanId()); + writeD(player.getClanCrestId()); + writeS(player.getClan() != null ? player.getClan().getName() : ""); + writeD(player.getAllyId()); + writeD(player.getAllyCrestId()); + writeS(player.getClan() != null ? player.getClan().getAllyName() : ""); + Calendar createDate = player.getCreateDate(); + writeC(createDate.get(Calendar.MONTH) + 1); writeC(createDate.get(Calendar.DAY_OF_MONTH)); - writeD(friend.isOnline() ? (int) System.currentTimeMillis() : (int) (System.currentTimeMillis() - friend.getLastAccess()) / 1000); - writeS(""); // memo + writeD(player.isOnline() ? -1 : (int) ((System.currentTimeMillis() - player.getLastAccess()) / 1000)); + writeS(friend.getMemo()); // memo } } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/FriendList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/FriendList.java index 3e482b5597..928171987e 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/FriendList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/FriendList.java @@ -18,104 +18,52 @@ */ package com.l2jserver.gameserver.network.serverpackets.friend; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.List; +import java.util.Collection; -import javolution.util.FastList; - -import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.data.sql.impl.CharNameTable; -import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.Friend; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; /** - * Support for "Chat with Friends" dialog.
- * This packet is sent only at login. - * @author mrTJO, UnAfraid + * @author Erlandys */ public class FriendList extends L2GameServerPacket { - private final List _info; - - private static class FriendInfo - { - int _objId; - String _name; - boolean _online; - int _classid; - int _level; - - public FriendInfo(int objId, String name, boolean online, int classid, int level) - { - _objId = objId; - _name = name; - _online = online; - _classid = classid; - _level = level; - } - } + Collection _friends; public FriendList(L2PcInstance player) { - _info = new FastList<>(player.getFriendList().size()); - for (int objId : player.getFriendList()) - { - String name = CharNameTable.getInstance().getNameById(objId); - L2PcInstance player1 = L2World.getInstance().getPlayer(objId); - - boolean online = false; - int classid = 0; - int level = 0; - - if (player1 == null) - { - try (Connection con = L2DatabaseFactory.getInstance().getConnection(); - PreparedStatement statement = con.prepareStatement("SELECT char_name, online, classid, level FROM characters WHERE charId = ?")) - { - statement.setInt(1, objId); - try (ResultSet rset = statement.executeQuery()) - { - if (rset.next()) - { - _info.add(new FriendInfo(objId, rset.getString(1), rset.getInt(2) == 1, rset.getInt(3), rset.getInt(4))); - } - } - } - catch (Exception e) - { - // Who cares? - } - continue; - } - - if (player1.isOnline()) - { - online = true; - } - - classid = player1.getClassId().getId(); - level = player1.getLevel(); - - _info.add(new FriendInfo(objId, name, online, classid, level)); - } + _friends = player.getFriendList().values(); } @Override protected final void writeImpl() { writeC(0x58); - writeD(_info.size()); - for (FriendInfo info : _info) + writeD(_friends.size()); + for (Friend friend : _friends) { - writeD(info._objId); // character id - writeS(info._name); - writeD(info._online ? 0x01 : 0x00); // online - writeD(info._online ? info._objId : 0x00); // object id if online - writeD(info._classid); - writeD(info._level); + L2PcInstance player = friend.getFriend(); + if (player != null) + { + writeD(player.getObjectId()); + writeS(player.getName()); + writeD(0x01); + writeD(player.getObjectId()); + writeD(player.getLevel()); + writeD(player.getClassId().getId()); + writeS("testing"); + } + else + { + writeD(friend.getFriendOID()); + writeS(friend.getName()); + writeD(0x00); + writeD(0x00); + writeD(friend.getLevel()); + writeD(friend.getClassId()); + writeS("testing"); + } } } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2FriendList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2FriendList.java index 6fe3a6684a..d509e9d5f6 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2FriendList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2FriendList.java @@ -18,81 +18,50 @@ */ package com.l2jserver.gameserver.network.serverpackets.friend; -import java.util.List; +import java.util.Collection; -import javolution.util.FastList; - -import com.l2jserver.gameserver.data.sql.impl.CharNameTable; -import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.Friend; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; /** - * Support for "Chat with Friends" dialog.
- * This packet is sent only at login. - * @author Tempy + * @author Erlandys */ public class L2FriendList extends L2GameServerPacket { - private final List _info; - - private static class FriendInfo - { - int _objId; - String _name; - int _level; - int _classId; - boolean _online; - - public FriendInfo(int objId, String name, boolean online, int level, int classId) - { - _objId = objId; - _name = name; - _online = online; - _level = level; - _classId = classId; - } - } + Collection _friends; public L2FriendList(L2PcInstance player) { - _info = new FastList<>(player.getFriendList().size()); - for (int objId : player.getFriendList()) - { - String name = CharNameTable.getInstance().getNameById(objId); - L2PcInstance player1 = L2World.getInstance().getPlayer(objId); - boolean online = false; - int level = 0; - int classId = 0; - - if (player1 != null) - { - online = true; - level = player1.getLevel(); - classId = player1.getClassId().getId(); - } - else - { - level = CharNameTable.getInstance().getLevelById(objId); - classId = CharNameTable.getInstance().getClassIdById(objId); - } - _info.add(new FriendInfo(objId, name, online, level, classId)); - } + _friends = player.getFriendList().values(); } @Override protected final void writeImpl() { writeC(0x75); - writeD(_info.size()); - for (FriendInfo info : _info) + writeD(_friends.size()); + for (Friend friend : _friends) { - writeD(info._objId); // character id - writeS(info._name); - writeD(info._online ? 0x01 : 0x00); // online - writeD(info._online ? info._objId : 0x00); // object id if online - writeD(info._level); - writeD(info._classId); + L2PcInstance player = friend.getFriend(); + if (player != null) + { + writeD(player.getObjectId()); + writeS(player.getName()); + writeD(0x01); + writeD(player.getObjectId()); + writeD(player.getLevel()); + writeD(player.getClassId().getId()); + } + else + { + writeD(friend.getFriendOID()); + writeS(friend.getName()); + writeD(0x00); + writeD(0x00); + writeD(friend.getLevel()); + writeD(friend.getClassId()); + } writeH(0x00); } }