- 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

@ -1,48 +0,0 @@
/*
* 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.serverpackets;
import java.util.List;
import com.l2jserver.gameserver.data.sql.impl.CharNameTable;
/**
* @author Sdw
*/
public class BlockListPacket extends L2GameServerPacket
{
private final List<Integer> _playersId;
public BlockListPacket(List<Integer> playersId)
{
_playersId = playersId;
}
@Override
protected final void writeImpl()
{
writeC(0xD5);
writeD(_playersId.size());
for (int playerId : _playersId)
{
writeS(CharNameTable.getInstance().getNameById(playerId));
writeS(""); // memo ?
}
}
}

View File

@ -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;
}

View File

@ -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();

View File

@ -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;
}

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 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
}
}
}

View File

@ -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. <br />
* This packet is sent only at login.
* @author mrTJO, UnAfraid
* @author Erlandys
*/
public class FriendList extends L2GameServerPacket
{
private final List<FriendInfo> _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<Friend> _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");
}
}
}
}

View File

@ -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. <br />
* This packet is sent only at login.
* @author Tempy
* @author Erlandys
*/
public class L2FriendList extends L2GameServerPacket
{
private final List<FriendInfo> _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<Friend> _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);
}
}