- Implemented jumping system client packets.

- Reworked friend / block manager to containg memo and show correct data.
 - Fixed throwing exception, on player login if 2 invisible GMs are next to each other.
This commit is contained in:
erlandys56
2015-01-25 01:07:05 +00:00
parent 093b3d3841
commit b35469b996
21 changed files with 636 additions and 226 deletions

View File

@@ -21,20 +21,19 @@ package com.l2jserver.gameserver.model;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javolution.util.FastMap;
import com.l2jserver.L2DatabaseFactory; import com.l2jserver.L2DatabaseFactory;
import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.data.sql.impl.CharNameTable;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.network.SystemMessageId; 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.SystemMessage;
import com.l2jserver.gameserver.network.serverpackets.friend.BlockListPacket;
/** /**
* This class ... * This class ...
@@ -43,10 +42,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
public class BlockList public class BlockList
{ {
private static Logger _log = Logger.getLogger(BlockList.class.getName()); private static Logger _log = Logger.getLogger(BlockList.class.getName());
private static Map<Integer, List<Integer>> _offlineList = new FastMap<Integer, List<Integer>>().shared(); private static Map<Integer, HashMap<Integer, String>> _offlineList = new HashMap<>();
private final L2PcInstance _owner; private final L2PcInstance _owner;
private List<Integer> _blockList; private HashMap<Integer, String> _blockList;
private final ArrayList<Integer> _updateMemos = new ArrayList<>();
public BlockList(L2PcInstance owner) public BlockList(L2PcInstance owner)
{ {
@@ -60,26 +60,62 @@ public class BlockList
private void addToBlockList(int target) private void addToBlockList(int target)
{ {
_blockList.add(target); _blockList.put(target, "");
updateInDB(target, true); updateInDB(target, true);
} }
private void removeFromBlockList(int target) private void removeFromBlockList(int target)
{ {
_blockList.remove(Integer.valueOf(target)); _blockList.remove(Integer.valueOf(target));
if (_updateMemos.contains(target))
{
_updateMemos.remove(Integer.valueOf(target));
}
updateInDB(target, false); 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() public void playerLogout()
{ {
_offlineList.put(_owner.getObjectId(), _blockList); _offlineList.put(_owner.getObjectId(), _blockList);
} }
private static List<Integer> loadList(int ObjId) private static HashMap<Integer, String> loadList(int ObjId)
{ {
List<Integer> list = new ArrayList<>(); HashMap<Integer, String> list = new HashMap<>();
try (Connection con = L2DatabaseFactory.getInstance().getConnection(); 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); statement.setInt(1, ObjId);
try (ResultSet rset = statement.executeQuery()) try (ResultSet rset = statement.executeQuery())
@@ -92,7 +128,8 @@ public class BlockList
{ {
continue; 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) public boolean isInBlockList(L2PcInstance target)
{ {
return _blockList.contains(target.getObjectId()); return _blockList.containsKey(target.getObjectId());
} }
public boolean isInBlockList(int targetId) public boolean isInBlockList(int targetId)
{ {
return _blockList.contains(targetId); return _blockList.containsKey(targetId);
} }
public boolean isBlockAll() public boolean isBlockAll()
@@ -165,7 +202,7 @@ public class BlockList
_owner.setMessageRefusal(state); _owner.setMessageRefusal(state);
} }
private List<Integer> getBlockList() public HashMap<Integer, String> getBlockList()
{ {
return _blockList; return _blockList;
} }
@@ -179,7 +216,7 @@ public class BlockList
String charName = CharNameTable.getInstance().getNameById(targetId); 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); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THIS_PLAYER_IS_ALREADY_REGISTERED_ON_YOUR_FRIENDS_LIST);
sm.addString(charName); sm.addString(charName);
@@ -187,7 +224,7 @@ public class BlockList
return; return;
} }
if (listOwner.getBlockList().getBlockList().contains(targetId)) if (listOwner.getBlockList().getBlockList().containsKey(targetId))
{ {
listOwner.sendMessage("Already in ignore list."); listOwner.sendMessage("Already in ignore list.");
return; return;
@@ -220,7 +257,7 @@ public class BlockList
String charName = CharNameTable.getInstance().getNameById(targetId); 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); sm = SystemMessage.getSystemMessage(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET);
listOwner.sendPacket(sm); listOwner.sendPacket(sm);
@@ -251,7 +288,7 @@ public class BlockList
public static void sendListToOwner(L2PcInstance listOwner) 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)); _offlineList.put(ownerId, loadList(ownerId));
} }
return _offlineList.get(ownerId).contains(targetId); return _offlineList.get(ownerId).containsKey(targetId);
} }
} }

View File

@@ -190,6 +190,7 @@ import com.l2jserver.gameserver.model.effects.L2EffectType;
import com.l2jserver.gameserver.model.entity.Castle; import com.l2jserver.gameserver.model.entity.Castle;
import com.l2jserver.gameserver.model.entity.Duel; import com.l2jserver.gameserver.model.entity.Duel;
import com.l2jserver.gameserver.model.entity.Fort; 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.Hero;
import com.l2jserver.gameserver.model.entity.Instance; import com.l2jserver.gameserver.model.entity.Instance;
import com.l2jserver.gameserver.model.entity.L2Event; import com.l2jserver.gameserver.model.entity.L2Event;
@@ -7580,6 +7581,8 @@ public final class L2PcInstance extends L2Playable
{ {
storeUISettings(); storeUISettings();
} }
getBlockList().updateBlockMemos();
updateMemos();
final PlayerVariables vars = getScript(PlayerVariables.class); final PlayerVariables vars = getScript(PlayerVariables.class);
if (vars != null) if (vars != null)
@@ -11530,6 +11533,16 @@ public final class L2PcInstance extends L2Playable
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerLogout(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerLogout(this), this);
for (Friend friend : _friendList.values())
{
L2PcInstance player = friend.getFriend();
if (player == null)
{
continue;
}
player.putFriendDetailInfo(this);
}
try try
{ {
for (L2ZoneType zone : ZoneManager.getInstance().getZones(this)) for (L2ZoneType zone : ZoneManager.getInstance().getZones(this))
@@ -13593,18 +13606,66 @@ public final class L2PcInstance extends L2Playable
/** /**
* list of character friends * list of character friends
*/ */
private final List<Integer> _friendList = new FastList<>(); private final HashMap<Integer, Friend> _friendList = new HashMap<>();
private final ArrayList<Integer> _updateMemos = new ArrayList<>();
public List<Integer> getFriendList() public HashMap<Integer, Friend> getFriendList()
{ {
return _friendList; 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() public void restoreFriendList()
{ {
_friendList.clear(); _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(); try (Connection con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(sqlQuery)) PreparedStatement statement = con.prepareStatement(sqlQuery))
{ {
@@ -13618,7 +13679,9 @@ public final class L2PcInstance extends L2Playable
{ {
continue; 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) public void notifyFriends(int type)
{ {
L2FriendStatus pkt = new L2FriendStatus(this, type); L2FriendStatus pkt = new L2FriendStatus(this, type);
for (int id : _friendList) for (int id : _friendList.keySet())
{ {
L2PcInstance friend = L2World.getInstance().getPlayer(id); L2PcInstance friend = L2World.getInstance().getPlayer(id);
if (friend != null) if (friend != null)
@@ -14898,5 +15056,4 @@ public final class L2PcInstance extends L2Playable
} }
getSubClasses().get(getClassIndex()).setVitalityPoints(points); getSubClasses().get(getClassIndex()).setVitalityPoints(points);
} }
} }

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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.RequestFriendDetailInfo;
import com.l2jserver.gameserver.network.clientpackets.friend.RequestFriendList; import com.l2jserver.gameserver.network.clientpackets.friend.RequestFriendList;
import com.l2jserver.gameserver.network.clientpackets.friend.RequestSendFriendMsg; 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.ConfirmMenteeAdd;
import com.l2jserver.gameserver.network.clientpackets.mentoring.RequestMenteeAdd; import com.l2jserver.gameserver.network.clientpackets.mentoring.RequestMenteeAdd;
import com.l2jserver.gameserver.network.clientpackets.mentoring.RequestMenteeWaitingList; import com.l2jserver.gameserver.network.clientpackets.mentoring.RequestMenteeWaitingList;
@@ -1302,7 +1304,7 @@ public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>,
// @ msg = new RequestExEscapeScene(); // @ msg = new RequestExEscapeScene();
break; break;
case 0x91: case 0x91:
// msg = new RequestFlyMove(); msg = new RequestFlyMove();
break; break;
case 0x92: case 0x92:
// msg = new RequestSurrenderPledgeWarEX(); (chS) // msg = new RequestSurrenderPledgeWarEX(); (chS)
@@ -1332,10 +1334,10 @@ public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>,
msg = new RequestFriendDetailInfo(); msg = new RequestFriendDetailInfo();
break; break;
case 0x95: case 0x95:
// msg = new RequestUpdateFriendMemo(); msg = new RequestUpdateFriendMemo();
break; break;
case 0x96: case 0x96:
// msg = new RequestUpdateBlockMemo(); msg = new RequestUpdateBlockMemo();
break; break;
case 0x97: case 0x97:
// msg = new RequestInzonePartyInfoHistory(); // msg = new RequestInzonePartyInfoHistory();
@@ -1392,7 +1394,7 @@ public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>,
// msg = new RequestFirstPlayStart(); // msg = new RequestFirstPlayStart();
break; break;
case 0xAD: case 0xAD:
// msg = new RequestFlyMoveStart(); msg = new RequestFlyMoveStart();
break; break;
case 0xAE: case 0xAE:
case 0xAF: case 0xAF:

View File

@@ -461,7 +461,7 @@ public class EnterWorld extends L2GameClientPacket
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOUR_FRIEND_S1_JUST_LOGGED_IN); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOUR_FRIEND_S1_JUST_LOGGED_IN);
sm.addString(activeChar.getName()); sm.addString(activeChar.getName());
for (int id : activeChar.getFriendList()) for (int id : activeChar.getFriendList().keySet())
{ {
L2Object obj = L2World.getInstance().findObject(id); L2Object obj = L2World.getInstance().findObject(id);
if (obj != null) if (obj != null)

View File

@@ -22,6 +22,7 @@ import com.l2jserver.gameserver.data.sql.impl.CharNameTable;
import com.l2jserver.gameserver.model.BlockList; import com.l2jserver.gameserver.model.BlockList;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.friend.BlockListPacket;
public final class RequestBlock extends L2GameClientPacket public final class RequestBlock extends L2GameClientPacket
{ {
@@ -91,6 +92,7 @@ public final class RequestBlock extends L2GameClientPacket
{ {
BlockList.removeFromBlockList(activeChar, targetId); BlockList.removeFromBlockList(activeChar, targetId);
} }
activeChar.sendPacket(new BlockListPacket(activeChar));
break; break;
case BLOCKLIST: case BLOCKLIST:
BlockList.sendListToOwner(activeChar); BlockList.sendListToOwner(activeChar);

View File

@@ -83,7 +83,7 @@ public final class RequestFriendInvite extends L2GameClientPacket
return; return;
} }
// Target already in friend list. // 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 = SystemMessage.getSystemMessage(SystemMessageId.THIS_PLAYER_IS_ALREADY_REGISTERED_ON_YOUR_FRIENDS_LIST);
sm.addString(_name); sm.addString(_name);

View File

@@ -28,6 +28,7 @@ import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket; import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.network.serverpackets.friend.FriendAddRequestResult; import com.l2jserver.gameserver.network.serverpackets.friend.FriendAddRequestResult;
import com.l2jserver.gameserver.network.serverpackets.friend.FriendList;
public final class RequestAnswerFriendInvite extends L2GameClientPacket 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 = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_BEEN_ADDED_TO_YOUR_FRIENDS_LIST);
msg.addString(player.getName()); msg.addString(player.getName());
requestor.sendPacket(msg); requestor.sendPacket(msg);
requestor.getFriendList().add(player.getObjectId()); requestor.addFriend(player);
// has joined as friend. // has joined as friend.
msg = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_JOINED_AS_A_FRIEND); msg = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_JOINED_AS_A_FRIEND);
msg.addString(requestor.getName()); msg.addString(requestor.getName());
player.sendPacket(msg); player.sendPacket(msg);
player.getFriendList().add(requestor.getObjectId()); player.addFriend(requestor);
// Send notifications for both player in order to show them online // Send notifications for both player in order to show them online
player.sendPacket(new FriendAddRequestResult(requestor, 1)); player.sendPacket(new FriendAddRequestResult(requestor, 1));
requestor.sendPacket(new FriendAddRequestResult(player, 1)); requestor.sendPacket(new FriendAddRequestResult(player, 1));
player.sendPacket(new FriendList(player));
requestor.sendPacket(new FriendList(requestor));
} }
catch (Exception e) catch (Exception e)
{ {

View File

@@ -29,6 +29,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket; import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.network.serverpackets.friend.FriendList;
import com.l2jserver.gameserver.network.serverpackets.friend.FriendRemove; import com.l2jserver.gameserver.network.serverpackets.friend.FriendRemove;
/** /**
@@ -68,7 +69,7 @@ public final class RequestFriendDel extends L2GameClientPacket
return; return;
} }
if (!activeChar.getFriendList().contains(id)) if (!activeChar.getFriendList().containsKey(id))
{ {
sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_NOT_ON_YOUR_FRIEND_LIST); sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_NOT_ON_YOUR_FRIEND_LIST);
sm.addString(_name); sm.addString(_name);
@@ -90,7 +91,7 @@ public final class RequestFriendDel extends L2GameClientPacket
sm.addString(_name); sm.addString(_name);
activeChar.sendPacket(sm); activeChar.sendPacket(sm);
activeChar.getFriendList().remove(Integer.valueOf(id)); activeChar.getFriendList().remove(id);
activeChar.sendPacket(new FriendRemove(_name, 1)); activeChar.sendPacket(new FriendRemove(_name, 1));
L2PcInstance player = L2World.getInstance().getPlayer(_name); L2PcInstance player = L2World.getInstance().getPlayer(_name);
@@ -99,6 +100,8 @@ public final class RequestFriendDel extends L2GameClientPacket
player.getFriendList().remove(Integer.valueOf(activeChar.getObjectId())); player.getFriendList().remove(Integer.valueOf(activeChar.getObjectId()));
player.sendPacket(new FriendRemove(activeChar.getName(), 1)); player.sendPacket(new FriendRemove(activeChar.getName(), 1));
} }
player.sendPacket(new FriendList(player));
activeChar.sendPacket(new FriendList(activeChar));
} }
catch (Exception e) catch (Exception e)
{ {

View File

@@ -86,7 +86,7 @@ public final class RequestFriendInvite extends L2GameClientPacket
} }
// Target already in friend list. // 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 = SystemMessage.getSystemMessage(SystemMessageId.THIS_PLAYER_IS_ALREADY_REGISTERED_ON_YOUR_FRIENDS_LIST);
sm.addString(_name); sm.addString(_name);

View File

@@ -55,7 +55,7 @@ public final class RequestFriendList extends L2GameClientPacket
activeChar.sendPacket(SystemMessageId.FRIENDS_LIST); activeChar.sendPacket(SystemMessageId.FRIENDS_LIST);
L2PcInstance friend = null; L2PcInstance friend = null;
for (int id : activeChar.getFriendList()) for (int id : activeChar.getFriendList().keySet())
{ {
// int friendId = rset.getInt("friendId"); // int friendId = rset.getInt("friendId");
String friendName = CharNameTable.getInstance().getNameById(id); String friendName = CharNameTable.getInstance().getNameById(id);

View File

@@ -63,7 +63,7 @@ public final class RequestSendFriendMsg extends L2GameClientPacket
} }
final L2PcInstance targetPlayer = L2World.getInstance().getPlayer(_reciever); 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); activeChar.sendPacket(SystemMessageId.THAT_PLAYER_IS_NOT_ONLINE);
return; return;

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -16,33 +16,37 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package com.l2jserver.gameserver.network.serverpackets; package com.l2jserver.gameserver.network.clientpackets.friend;
import java.util.List;
import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.data.sql.impl.CharNameTable;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
/** public final class RequestUpdateFriendMemo extends L2GameClientPacket
* @author Sdw
*/
public class BlockListPacket extends L2GameServerPacket
{ {
private final List<Integer> _playersId; private static final String _C__D0_95_REQUESTUPDATEFRIENDMEMO = "[C] D0:95 RequestUpdateFriendMemo";
String cName;
String memo;
public BlockListPacket(List<Integer> playersId) @Override
protected void readImpl()
{ {
_playersId = playersId; cName = readS();
memo = readS();
} }
@Override @Override
protected final void writeImpl() protected void runImpl()
{ {
writeC(0xD5); L2PcInstance player = getClient().getActiveChar();
writeD(_playersId.size()); int id = CharNameTable.getInstance().getIdByName(cName);
for (int playerId : _playersId) player.getFriend(id).setMemo(memo);
{ player.updateMemo(id);
writeS(CharNameTable.getInstance().getNameById(playerId));
writeS(""); // memo ?
} }
@Override
public String getType()
{
return _C__D0_95_REQUESTUPDATEFRIENDMEMO;
} }
} }

View File

@@ -52,7 +52,7 @@ public final class CreatureSay extends L2GameServerPacket
_charLevel = sender.getLevel(); _charLevel = sender.getLevel();
_textType = messageType; _textType = messageType;
_text = text; _text = text;
if (receiver.getFriendList().contains(sender.getObjectId())) if (receiver.getFriendList().containsKey(sender.getObjectId()))
{ {
_mask |= 0x01; _mask |= 0x01;
} }

View File

@@ -85,7 +85,8 @@ public final class RelationChanged extends L2GameServerPacket
{ {
if (activeChar.isInvisible()) 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(); Relation r = new Relation();
r._objId = activeChar.getObjectId(); r._objId = activeChar.getObjectId();

View File

@@ -39,7 +39,7 @@ public final class TradeStart extends AbstractItemPacket
if (_partner != null) if (_partner != null)
{ {
if (player.getFriendList().contains(_partner.getObjectId())) if (player.getFriendList().containsKey(_partner.getObjectId()))
{ {
_mask |= 0x01; _mask |= 0x01;
} }

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, String> entry : player.getBlockList().getBlockList().entrySet())
{
writeS(CharNameTable.getInstance().getNameById(entry.getKey()));
writeS(entry.getValue());
}
}
}

View File

@@ -20,8 +20,9 @@ package com.l2jserver.gameserver.network.serverpackets.friend;
import java.util.Calendar; 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.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.entity.Friend;
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
/** /**
@@ -45,42 +46,47 @@ public class ExFriendDetailInfo extends L2GameServerPacket
writeH(0xEC); writeH(0xEC);
writeD(_player.getObjectId()); writeD(_player.getObjectId());
Friend friend = _player.getFriend(CharNameTable.getInstance().getIdByName(_name));
L2PcInstance friend = L2World.getInstance().getPlayer(_name); L2PcInstance player = friend.getFriend();
if (friend == null) if (player == null)
{ {
writeS(_name); writeS(_name);
writeD(0); writeD(0x00);
writeD(0); writeD(0x00);
writeH(0); writeH(friend.getLevel());
writeH(0); writeH(friend.getClassId());
writeD(0); writeD(friend.getClanId());
writeD(0); writeD(friend.getClanCrestId());
writeS(""); writeS(friend.getClanName());
writeD(0); writeD(friend.getAllyId());
writeD(0); writeD(friend.getAllyCrestId());
writeS(""); writeS(friend.getAllyName());
writeD(0); Calendar createDate = Calendar.getInstance();
writeS(""); // memo 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 else
{ {
writeS(friend.getName()); writeS(player.getName());
writeD(friend.isOnlineInt()); writeD(player.isOnlineInt());
writeD(friend.getObjectId()); writeD(player.getObjectId());
writeH(friend.getLevel()); writeH(player.getLevel());
writeH(friend.getClassIndex()); writeH(player.getClassId().getId());
writeD(friend.getClanId()); writeD(player.getClanId());
writeD(friend.getClanCrestId()); writeD(player.getClanCrestId());
writeS(friend.getClan() != null ? friend.getClan().getName() : ""); writeS(player.getClan() != null ? player.getClan().getName() : "");
writeD(friend.getAllyId()); writeD(player.getAllyId());
writeD(friend.getAllyCrestId()); writeD(player.getAllyCrestId());
writeS(friend.getClan() != null ? friend.getClan().getAllyName() : ""); writeS(player.getClan() != null ? player.getClan().getAllyName() : "");
Calendar createDate = friend.getCreateDate(); Calendar createDate = player.getCreateDate();
writeC(createDate.get(Calendar.MONTH)); writeC(createDate.get(Calendar.MONTH) + 1);
writeC(createDate.get(Calendar.DAY_OF_MONTH)); writeC(createDate.get(Calendar.DAY_OF_MONTH));
writeD(friend.isOnline() ? (int) System.currentTimeMillis() : (int) (System.currentTimeMillis() - friend.getLastAccess()) / 1000); writeD(player.isOnline() ? -1 : (int) ((System.currentTimeMillis() - player.getLastAccess()) / 1000));
writeS(""); // memo writeS(friend.getMemo()); // memo
} }
} }
} }

View File

@@ -18,104 +18,52 @@
*/ */
package com.l2jserver.gameserver.network.serverpackets.friend; package com.l2jserver.gameserver.network.serverpackets.friend;
import java.sql.Connection; import java.util.Collection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
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.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.entity.Friend;
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
/** /**
* Support for "Chat with Friends" dialog. <br /> * @author Erlandys
* This packet is sent only at login.
* @author mrTJO, UnAfraid
*/ */
public class FriendList extends L2GameServerPacket public class FriendList extends L2GameServerPacket
{ {
private final List<FriendInfo> _info; Collection<Friend> _friends;
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;
}
}
public FriendList(L2PcInstance player) public FriendList(L2PcInstance player)
{ {
_info = new FastList<>(player.getFriendList().size()); _friends = player.getFriendList().values();
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));
}
} }
@Override @Override
protected final void writeImpl() protected final void writeImpl()
{ {
writeC(0x58); writeC(0x58);
writeD(_info.size()); writeD(_friends.size());
for (FriendInfo info : _info) for (Friend friend : _friends)
{ {
writeD(info._objId); // character id L2PcInstance player = friend.getFriend();
writeS(info._name); if (player != null)
writeD(info._online ? 0x01 : 0x00); // online {
writeD(info._online ? info._objId : 0x00); // object id if online writeD(player.getObjectId());
writeD(info._classid); writeS(player.getName());
writeD(info._level); 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");
}
} }
} }
} }

View File

@@ -18,81 +18,50 @@
*/ */
package com.l2jserver.gameserver.network.serverpackets.friend; 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.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.entity.Friend;
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
/** /**
* Support for "Chat with Friends" dialog. <br /> * @author Erlandys
* This packet is sent only at login.
* @author Tempy
*/ */
public class L2FriendList extends L2GameServerPacket public class L2FriendList extends L2GameServerPacket
{ {
private final List<FriendInfo> _info; Collection<Friend> _friends;
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;
}
}
public L2FriendList(L2PcInstance player) public L2FriendList(L2PcInstance player)
{ {
_info = new FastList<>(player.getFriendList().size()); _friends = player.getFriendList().values();
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));
}
} }
@Override @Override
protected final void writeImpl() protected final void writeImpl()
{ {
writeC(0x75); writeC(0x75);
writeD(_info.size()); writeD(_friends.size());
for (FriendInfo info : _info) for (Friend friend : _friends)
{ {
writeD(info._objId); // character id L2PcInstance player = friend.getFriend();
writeS(info._name); if (player != null)
writeD(info._online ? 0x01 : 0x00); // online {
writeD(info._online ? info._objId : 0x00); // object id if online writeD(player.getObjectId());
writeD(info._level); writeS(player.getName());
writeD(info._classId); 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); writeH(0x00);
} }
} }