Core/Packets: updated some contactlist packets
(cherry picked from commit e01bb91)
This commit is contained in:
1 parent
904bbf9f5a
commit
8a63c4919e
19 files changed
+362
-379
No files matched your search
@@ -428,8 +428,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
||||
PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent, extendState) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_GENDER_AND_APPEARANCE, "UPDATE characters SET gender = ?, skin = ?, face = ?, hairStyle = ?, hairColor = ?, facialStyle = ? WHERE guid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags | ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags & ~ ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_INS_CHARACTER_SOCIAL, "INSERT INTO character_social (guid, friend, flags) VALUES (?, ?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
|
||||
@@ -472,7 +471,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
||||
PrepareStatement(CHAR_SEL_MAIL_ITEMS_BY_ENTRY, "SELECT mi.item_guid, m.sender, m.receiver, cs.account, cs.name, cr.account, cr.name "
|
||||
"FROM mail m INNER JOIN mail_items mi ON mi.mail_id = m.id INNER JOIN item_instance ii ON ii.guid = mi.item_guid "
|
||||
"INNER JOIN characters cs ON cs.guid = m.sender INNER JOIN characters cr ON cr.guid = m.receiver WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY, "SELECT ah.itemguid, ah.itemowner, c.account, c.name FROM auctionhouse ah INNER JOIN characters c ON c.guid = ah.itemowner INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY, "SELECT ah.itemguid, ah.itemowner, c.account, c.name FROM auctionhouse ah INNER JOIN characters c ON c.guid = ah.itemowner INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
|
||||
|
||||
@@ -353,8 +353,7 @@ enum CharacterDatabaseStatements
|
||||
CHAR_INS_CHAR_INSTANCE,
|
||||
CHAR_UPD_GENDER_AND_APPEARANCE,
|
||||
CHAR_DEL_CHARACTER_SKILL,
|
||||
CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS,
|
||||
CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS,
|
||||
CHAR_UPD_CHARACTER_SOCIAL_FLAGS,
|
||||
CHAR_INS_CHARACTER_SOCIAL,
|
||||
CHAR_DEL_CHARACTER_SOCIAL,
|
||||
CHAR_UPD_CHARACTER_SOCIAL_NOTE,
|
||||
|
||||
@@ -797,7 +797,7 @@ void Channel::Invite(Player const* player, std::string const& newname)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!newp->GetSocial()->HasIgnore(guid.GetCounter()))
|
||||
if (!newp->GetSocial()->HasIgnore(guid))
|
||||
{
|
||||
InviteAppend appender(guid);
|
||||
ChannelNameBuilder<InviteAppend> builder(this, appender);
|
||||
@@ -900,7 +900,7 @@ void Channel::SendToAll(Builder& builder, ObjectGuid guid /*= ObjectGuid::Empty*
|
||||
|
||||
for (PlayerContainer::const_iterator i = _playersStore.begin(); i != _playersStore.end(); ++i)
|
||||
if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first))
|
||||
if (!guid || !player->GetSocial()->HasIgnore(guid.GetCounter()))
|
||||
if (!guid || !player->GetSocial()->HasIgnore(guid))
|
||||
localizer(player);
|
||||
}
|
||||
|
||||
|
||||
@@ -1828,7 +1828,7 @@ bool LFGMgr::HasIgnore(ObjectGuid guid1, ObjectGuid guid2)
|
||||
{
|
||||
Player* plr1 = ObjectAccessor::FindConnectedPlayer(guid1);
|
||||
Player* plr2 = ObjectAccessor::FindConnectedPlayer(guid2);
|
||||
return plr1 && plr2 && (plr1->GetSocial()->HasIgnore(guid2.GetCounter()) || plr2->GetSocial()->HasIgnore(guid1.GetCounter()));
|
||||
return plr1 && plr2 && (plr1->GetSocial()->HasIgnore(guid2) || plr2->GetSocial()->HasIgnore(guid1));
|
||||
}
|
||||
|
||||
void LFGMgr::SendLfgRoleChosen(ObjectGuid guid, ObjectGuid pguid, uint8 roles)
|
||||
|
||||
@@ -4422,16 +4422,15 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
|
||||
// Delete char from social list of online chars
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_SOCIAL);
|
||||
stmt->setUInt32(0, guid);
|
||||
PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt);
|
||||
|
||||
if (resultFriends)
|
||||
if (PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt))
|
||||
{
|
||||
do
|
||||
{
|
||||
if (Player* pFriend = ObjectAccessor::FindPlayer(ObjectGuid(HighGuid::Player, 0, (*resultFriends)[0].GetUInt32())))
|
||||
if (Player* playerFriend = ObjectAccessor::FindPlayer(ObjectGuid(HighGuid::Player, 0, (*resultFriends)[0].GetUInt32())))
|
||||
{
|
||||
pFriend->GetSocial()->RemoveFromSocialList(guid, false);
|
||||
sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, guid, false);
|
||||
playerFriend->GetSocial()->RemoveFromSocialList(playerguid, SOCIAL_FLAG_ALL);
|
||||
sSocialMgr->SendFriendStatus(playerFriend, FRIEND_REMOVED, playerguid);
|
||||
}
|
||||
} while (resultFriends->NextRow());
|
||||
}
|
||||
@@ -17761,7 +17760,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
|
||||
// unread mails and next delivery time, actual mails not loaded
|
||||
_LoadMailInit(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_COUNT), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_DATE));
|
||||
|
||||
m_social = sSocialMgr->LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID().GetCounter());
|
||||
m_social = sSocialMgr->LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID());
|
||||
|
||||
// check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
|
||||
// note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
|
||||
@@ -23171,7 +23170,7 @@ void Player::SetGroup(Group* group, int8 subgroup)
|
||||
void Player::SendInitialPacketsBeforeAddToMap()
|
||||
{
|
||||
/// Pass 'this' as argument because we're not stored in ObjectAccessor yet
|
||||
GetSocial()->SendSocialList(this);
|
||||
GetSocial()->SendSocialList(this, SOCIAL_FLAG_ALL);
|
||||
|
||||
// guild bank list wtf?
|
||||
|
||||
@@ -27884,3 +27883,9 @@ uint32 Player::DoRandomRoll(uint32 minimum, uint32 maximum)
|
||||
|
||||
return roll;
|
||||
}
|
||||
|
||||
void Player::RemoveSocial()
|
||||
{
|
||||
sSocialMgr->RemovePlayerSocial(GetGUID());
|
||||
m_social = nullptr;
|
||||
}
|
||||
@@ -1269,7 +1269,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
|
||||
uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin = nullptr) const;
|
||||
|
||||
PlayerSocial *GetSocial() const { return m_social; }
|
||||
PlayerSocial* GetSocial() { return m_social; }
|
||||
void RemoveSocial();
|
||||
|
||||
PlayerTaxi m_taxi;
|
||||
void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); }
|
||||
@@ -2765,7 +2766,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
////////////////////Rest System/////////////////////
|
||||
|
||||
// Social
|
||||
PlayerSocial *m_social;
|
||||
PlayerSocial* m_social;
|
||||
|
||||
// Groups
|
||||
GroupReference m_group;
|
||||
|
||||
@@ -17,105 +17,86 @@
|
||||
*/
|
||||
|
||||
#include "SocialMgr.h"
|
||||
|
||||
#include "DatabaseEnv.h"
|
||||
#include "WorldSession.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "Player.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "World.h"
|
||||
#include "Util.h"
|
||||
#include "AccountMgr.h"
|
||||
#include "WorldSession.h"
|
||||
|
||||
PlayerSocial::PlayerSocial(): m_playerGUID()
|
||||
PlayerSocial::PlayerSocial(): _playerGUID()
|
||||
{ }
|
||||
|
||||
uint32 PlayerSocial::GetNumberOfSocialsWithFlag(SocialFlag flag)
|
||||
{
|
||||
uint32 counter = 0;
|
||||
for (PlayerSocialMap::const_iterator itr = m_playerSocialMap.begin(); itr != m_playerSocialMap.end(); ++itr)
|
||||
if (itr->second.Flags & flag)
|
||||
for (PlayerSocialMap::const_iterator itr = _playerSocialMap.begin(); itr != _playerSocialMap.end(); ++itr)
|
||||
if ((itr->second.Flags & flag) != 0)
|
||||
++counter;
|
||||
|
||||
return counter;
|
||||
}
|
||||
|
||||
bool PlayerSocial::AddToSocialList(ObjectGuid::LowType friendGuid, bool ignore)
|
||||
bool PlayerSocial::AddToSocialList(ObjectGuid const& friendGuid, SocialFlag flag)
|
||||
{
|
||||
// check client limits
|
||||
if (ignore)
|
||||
{
|
||||
if (GetNumberOfSocialsWithFlag(SOCIAL_FLAG_IGNORED) >= SOCIALMGR_IGNORE_LIMIT)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetNumberOfSocialsWithFlag(SOCIAL_FLAG_FRIEND) >= SOCIALMGR_FRIEND_LIMIT)
|
||||
return false;
|
||||
}
|
||||
if (GetNumberOfSocialsWithFlag(flag) >= (((flag & SOCIAL_FLAG_FRIEND) != 0) ? SOCIALMGR_FRIEND_LIMIT : SOCIALMGR_IGNORE_LIMIT))
|
||||
return false;
|
||||
|
||||
uint8 flag = SOCIAL_FLAG_FRIEND;
|
||||
if (ignore)
|
||||
flag = SOCIAL_FLAG_IGNORED;
|
||||
|
||||
PlayerSocialMap::const_iterator itr = m_playerSocialMap.find(friendGuid);
|
||||
if (itr != m_playerSocialMap.end())
|
||||
PlayerSocialMap::iterator itr = _playerSocialMap.find(friendGuid);
|
||||
if (itr != _playerSocialMap.end())
|
||||
{
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS);
|
||||
itr->second.Flags |= flag;
|
||||
|
||||
stmt->setUInt8(0, flag);
|
||||
stmt->setUInt32(1, GetPlayerGUID());
|
||||
stmt->setUInt32(2, friendGuid);
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_SOCIAL_FLAGS);
|
||||
|
||||
stmt->setUInt8(0, itr->second.Flags);
|
||||
stmt->setUInt32(1, GetPlayerGUID().GetCounter());
|
||||
stmt->setUInt32(2, friendGuid.GetCounter());
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
m_playerSocialMap[friendGuid].Flags |= flag;
|
||||
}
|
||||
else
|
||||
{
|
||||
_playerSocialMap[friendGuid].Flags |= flag;
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SOCIAL);
|
||||
|
||||
stmt->setUInt32(0, GetPlayerGUID());
|
||||
stmt->setUInt32(1, friendGuid);
|
||||
stmt->setUInt32(0, GetPlayerGUID().GetCounter());
|
||||
stmt->setUInt32(1, friendGuid.GetCounter());
|
||||
stmt->setUInt8(2, flag);
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
FriendInfo fi;
|
||||
fi.Flags |= flag;
|
||||
m_playerSocialMap[friendGuid] = fi;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void PlayerSocial::RemoveFromSocialList(ObjectGuid::LowType friendGuid, bool ignore)
|
||||
void PlayerSocial::RemoveFromSocialList(ObjectGuid const& friendGuid, SocialFlag flag)
|
||||
{
|
||||
PlayerSocialMap::iterator itr = m_playerSocialMap.find(friendGuid);
|
||||
if (itr == m_playerSocialMap.end()) // not exist
|
||||
PlayerSocialMap::iterator itr = _playerSocialMap.find(friendGuid);
|
||||
if (itr == _playerSocialMap.end())
|
||||
return;
|
||||
|
||||
uint8 flag = SOCIAL_FLAG_FRIEND;
|
||||
if (ignore)
|
||||
flag = SOCIAL_FLAG_IGNORED;
|
||||
|
||||
itr->second.Flags &= ~flag;
|
||||
if (itr->second.Flags == 0)
|
||||
|
||||
if (!itr->second.Flags)
|
||||
{
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_SOCIAL);
|
||||
|
||||
stmt->setUInt32(0, GetPlayerGUID());
|
||||
stmt->setUInt32(1, friendGuid);
|
||||
stmt->setUInt32(0, GetPlayerGUID().GetCounter());
|
||||
stmt->setUInt32(1, friendGuid.GetCounter());
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
m_playerSocialMap.erase(itr);
|
||||
_playerSocialMap.erase(itr);
|
||||
}
|
||||
else
|
||||
{
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS);
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_SOCIAL_FLAGS);
|
||||
|
||||
stmt->setUInt8(0, flag);
|
||||
stmt->setUInt8(0, itr->second.Flags);
|
||||
stmt->setUInt32(1, GetPlayerGUID());
|
||||
stmt->setUInt32(2, friendGuid);
|
||||
|
||||
@@ -123,78 +104,83 @@ void PlayerSocial::RemoveFromSocialList(ObjectGuid::LowType friendGuid, bool ign
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerSocial::SetFriendNote(ObjectGuid::LowType friendGuid, std::string note)
|
||||
void PlayerSocial::SetFriendNote(ObjectGuid const& friendGuid, std::string const& note)
|
||||
{
|
||||
PlayerSocialMap::const_iterator itr = m_playerSocialMap.find(friendGuid);
|
||||
if (itr == m_playerSocialMap.end()) // not exist
|
||||
PlayerSocialMap::iterator itr = _playerSocialMap.find(friendGuid);
|
||||
if (itr == _playerSocialMap.end()) // not exist
|
||||
return;
|
||||
|
||||
utf8truncate(note, 48); // DB and client size limitation
|
||||
itr->second.Note = note;
|
||||
utf8truncate(itr->second.Note, 48); // DB and client size limitation
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE);
|
||||
|
||||
stmt->setString(0, note);
|
||||
stmt->setUInt32(1, GetPlayerGUID());
|
||||
stmt->setUInt32(2, friendGuid);
|
||||
stmt->setString(0, itr->second.Note);
|
||||
stmt->setUInt32(1, GetPlayerGUID().GetCounter());
|
||||
stmt->setUInt32(2, friendGuid.GetCounter());
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
m_playerSocialMap[friendGuid].Note = note;
|
||||
}
|
||||
|
||||
void PlayerSocial::SendSocialList(Player* player)
|
||||
void PlayerSocial::SendSocialList(Player* player, uint32 flags)
|
||||
{
|
||||
if (!player)
|
||||
return;
|
||||
ASSERT(player);
|
||||
|
||||
uint32 size = m_playerSocialMap.size();
|
||||
uint32 size = _playerSocialMap.size();
|
||||
|
||||
WorldPacket data(SMSG_CONTACT_LIST, (4+4+size*25)); // just can guess size
|
||||
data << uint32(7); // 0x1 = Friendlist update. 0x2 = Ignorelist update. 0x4 = Mutelist update.
|
||||
data << uint32(size); // friends count
|
||||
uint32 count = 0;
|
||||
WorldPacket data(SMSG_CONTACT_LIST, (4 + 4 + size * 25)); // just can guess size
|
||||
data << uint32(flags); // 0x1 = Friendlist update. 0x2 = Ignorelist update. 0x4 = Mutelist update.
|
||||
data << uint32(size); // friends count
|
||||
|
||||
for (PlayerSocialMap::iterator itr = m_playerSocialMap.begin(); itr != m_playerSocialMap.end(); ++itr)
|
||||
for (PlayerSocialMap::value_type& v : _playerSocialMap)
|
||||
{
|
||||
sSocialMgr->GetFriendInfo(player, itr->first, itr->second);
|
||||
if (!(v.second.Flags & flags))
|
||||
continue;
|
||||
|
||||
data << uint64(itr->first); // player guid
|
||||
data << uint32(itr->second.Flags); // player flag (0x1 = Friend, 0x2 = Ignored, 0x4 = Muted)
|
||||
data << itr->second.Note; // string note
|
||||
if (itr->second.Flags & SOCIAL_FLAG_FRIEND) // if IsFriend()
|
||||
++count;
|
||||
sSocialMgr->GetFriendInfo(player, v.first, v.second);
|
||||
|
||||
data << uint64(v.first); // player guid
|
||||
data << uint32(v.second.Flags); // player flag (0x1 = Friend, 0x2 = Ignored, 0x4 = Muted)
|
||||
data << v.second.Note; // string note
|
||||
if (v.second.Flags & SOCIAL_FLAG_FRIEND) // if IsFriend()
|
||||
{
|
||||
data << uint8(itr->second.Status); // online/offline/etc?
|
||||
if (itr->second.Status) // if online
|
||||
data << uint8(v.second.Status); // online/offline/etc?
|
||||
if (v.second.Status) // if online
|
||||
{
|
||||
data << uint32(itr->second.Area); // player area
|
||||
data << uint32(itr->second.Level); // player level
|
||||
data << uint32(itr->second.Class); // player class
|
||||
data << uint32(v.second.Area); // player area
|
||||
data << uint32(v.second.Level); // player level
|
||||
data << uint32(v.second.Class); // player class
|
||||
}
|
||||
}
|
||||
|
||||
// client's friends list and ignore list limit
|
||||
if (count >= (((flags & SOCIAL_FLAG_FRIEND) != 0) ? SOCIALMGR_FRIEND_LIMIT : SOCIALMGR_IGNORE_LIMIT))
|
||||
break;
|
||||
}
|
||||
|
||||
player->GetSession()->SendPacket(&data);
|
||||
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_CONTACT_LIST");
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
|
||||
bool PlayerSocial::HasFriend(ObjectGuid::LowType friendGuid)
|
||||
bool PlayerSocial::_HasContact(ObjectGuid const& guid, SocialFlag flags)
|
||||
{
|
||||
PlayerSocialMap::const_iterator itr = m_playerSocialMap.find(friendGuid);
|
||||
if (itr != m_playerSocialMap.end())
|
||||
return itr->second.Flags & SOCIAL_FLAG_FRIEND;
|
||||
PlayerSocialMap::const_iterator itr = _playerSocialMap.find(guid);
|
||||
if (itr != _playerSocialMap.end())
|
||||
return (itr->second.Flags & flags) != 0;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PlayerSocial::HasIgnore(ObjectGuid::LowType ignore_guid)
|
||||
bool PlayerSocial::HasFriend(ObjectGuid const& friendGuid)
|
||||
{
|
||||
PlayerSocialMap::const_iterator itr = m_playerSocialMap.find(ignore_guid);
|
||||
if (itr != m_playerSocialMap.end())
|
||||
return (itr->second.Flags & SOCIAL_FLAG_IGNORED) != 0;
|
||||
return false;
|
||||
return _HasContact(friendGuid, SOCIAL_FLAG_FRIEND);
|
||||
}
|
||||
|
||||
SocialMgr::SocialMgr() { }
|
||||
|
||||
SocialMgr::~SocialMgr() { }
|
||||
bool PlayerSocial::HasIgnore(ObjectGuid const& ignoreGuid)
|
||||
{
|
||||
return _HasContact(ignoreGuid, SOCIAL_FLAG_IGNORED);
|
||||
}
|
||||
|
||||
SocialMgr* SocialMgr::instance()
|
||||
{
|
||||
@@ -202,7 +188,7 @@ SocialMgr* SocialMgr::instance()
|
||||
return &instance;
|
||||
}
|
||||
|
||||
void SocialMgr::GetFriendInfo(Player* player, ObjectGuid::LowType friendGUID, FriendInfo &friendInfo)
|
||||
void SocialMgr::GetFriendInfo(Player* player, ObjectGuid const& friendGUID, FriendInfo& friendInfo)
|
||||
{
|
||||
if (!player)
|
||||
return;
|
||||
@@ -212,12 +198,12 @@ void SocialMgr::GetFriendInfo(Player* player, ObjectGuid::LowType friendGUID, Fr
|
||||
friendInfo.Level = 0;
|
||||
friendInfo.Class = 0;
|
||||
|
||||
Player* target = ObjectAccessor::FindPlayer(ObjectGuid(HighGuid::Player, friendGUID));
|
||||
Player* target = ObjectAccessor::FindPlayer(friendGUID);
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
PlayerSocialMap::iterator itr = player->GetSocial()->m_playerSocialMap.find(friendGUID);
|
||||
if (itr != player->GetSocial()->m_playerSocialMap.end())
|
||||
PlayerSocial::PlayerSocialMap::iterator itr = player->GetSocial()->_playerSocialMap.find(friendGUID);
|
||||
if (itr != player->GetSocial()->_playerSocialMap.end())
|
||||
friendInfo.Note = itr->second.Note;
|
||||
|
||||
// PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters
|
||||
@@ -246,20 +232,15 @@ void SocialMgr::GetFriendInfo(Player* player, ObjectGuid::LowType friendGUID, Fr
|
||||
}
|
||||
}
|
||||
|
||||
void SocialMgr::MakeFriendStatusPacket(FriendsResult result, ObjectGuid::LowType guid, WorldPacket* data)
|
||||
{
|
||||
data->Initialize(SMSG_FRIEND_STATUS, 9);
|
||||
*data << uint8(result);
|
||||
*data << uint64(guid);
|
||||
}
|
||||
|
||||
void SocialMgr::SendFriendStatus(Player* player, FriendsResult result, ObjectGuid::LowType friendGuid, bool broadcast)
|
||||
void SocialMgr::SendFriendStatus(Player* player, FriendsResult result, ObjectGuid const& friendGuid, bool broadcast /*= false*/)
|
||||
{
|
||||
FriendInfo fi;
|
||||
|
||||
WorldPacket data;
|
||||
MakeFriendStatusPacket(result, friendGuid, &data);
|
||||
GetFriendInfo(player, friendGuid, fi);
|
||||
|
||||
WorldPacket data(SMSG_FRIEND_STATUS, 9);
|
||||
data << uint8(result);
|
||||
data << friendGuid;
|
||||
switch (result)
|
||||
{
|
||||
case FRIEND_ADDED_OFFLINE:
|
||||
@@ -286,21 +267,20 @@ void SocialMgr::SendFriendStatus(Player* player, FriendsResult result, ObjectGui
|
||||
if (broadcast)
|
||||
BroadcastToFriendListers(player, &data);
|
||||
else
|
||||
player->GetSession()->SendPacket(&data);
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
|
||||
void SocialMgr::BroadcastToFriendListers(Player* player, WorldPacket* packet)
|
||||
void SocialMgr::BroadcastToFriendListers(Player* player, WorldPacket const* packet)
|
||||
{
|
||||
if (!player)
|
||||
return;
|
||||
ASSERT(player);
|
||||
|
||||
AccountTypes gmSecLevel = AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST));
|
||||
for (SocialMap::const_iterator itr = m_socialMap.begin(); itr != m_socialMap.end(); ++itr)
|
||||
for (SocialMap::const_iterator itr = _socialMap.begin(); itr != _socialMap.end(); ++itr)
|
||||
{
|
||||
PlayerSocialMap::const_iterator itr2 = itr->second.m_playerSocialMap.find(player->GetGUID().GetCounter());
|
||||
if (itr2 != itr->second.m_playerSocialMap.end() && (itr2->second.Flags & SOCIAL_FLAG_FRIEND))
|
||||
PlayerSocial::PlayerSocialMap::const_iterator itr2 = itr->second._playerSocialMap.find(player->GetGUID());
|
||||
if (itr2 != itr->second._playerSocialMap.end() && (itr2->second.Flags & SOCIAL_FLAG_FRIEND) != 0)
|
||||
{
|
||||
Player* target = ObjectAccessor::FindPlayer(ObjectGuid(HighGuid::Player, 0, itr->first));
|
||||
Player* target = ObjectAccessor::FindPlayer(itr->first);
|
||||
if (!target)
|
||||
continue;
|
||||
|
||||
@@ -317,33 +297,24 @@ void SocialMgr::BroadcastToFriendListers(Player* player, WorldPacket* packet)
|
||||
}
|
||||
}
|
||||
|
||||
PlayerSocial* SocialMgr::LoadFromDB(PreparedQueryResult result, ObjectGuid::LowType guid)
|
||||
PlayerSocial* SocialMgr::LoadFromDB(PreparedQueryResult result, ObjectGuid const& guid)
|
||||
{
|
||||
PlayerSocial *social = &m_socialMap[guid];
|
||||
PlayerSocial* social = &_socialMap[guid];
|
||||
social->SetPlayerGUID(guid);
|
||||
|
||||
if (!result)
|
||||
return social;
|
||||
|
||||
ObjectGuid::LowType friendGuid = 0;
|
||||
uint8 flags = 0;
|
||||
std::string note = "";
|
||||
|
||||
do
|
||||
if (result)
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
friendGuid = fields[0].GetUInt32();
|
||||
flags = fields[1].GetUInt8();
|
||||
note = fields[2].GetString();
|
||||
ObjectGuid friendGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt32());
|
||||
|
||||
social->m_playerSocialMap[friendGuid] = FriendInfo(flags, note);
|
||||
|
||||
// client's friends list and ignore list limit
|
||||
if (social->m_playerSocialMap.size() >= (SOCIALMGR_FRIEND_LIMIT + SOCIALMGR_IGNORE_LIMIT))
|
||||
break;
|
||||
uint8 flag = fields[1].GetUInt8();
|
||||
social->_playerSocialMap[friendGuid] = FriendInfo(flag, fields[2].GetString());
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
while (result->NextRow());
|
||||
|
||||
return social;
|
||||
}
|
||||
@@ -23,10 +23,7 @@
|
||||
#include "Common.h"
|
||||
#include "ObjectGuid.h"
|
||||
|
||||
class SocialMgr;
|
||||
class PlayerSocial;
|
||||
class Player;
|
||||
class WorldPacket;
|
||||
|
||||
enum FriendStatus
|
||||
{
|
||||
@@ -42,7 +39,9 @@ enum SocialFlag
|
||||
SOCIAL_FLAG_FRIEND = 0x01,
|
||||
SOCIAL_FLAG_IGNORED = 0x02,
|
||||
SOCIAL_FLAG_MUTED = 0x04, // guessed
|
||||
SOCIAL_FLAG_UNK = 0x08 // Unknown - does not appear to be RaF
|
||||
SOCIAL_FLAG_UNK = 0x08, // Unknown - does not appear to be RaF
|
||||
|
||||
SOCIAL_FLAG_ALL = SOCIAL_FLAG_FRIEND | SOCIAL_FLAG_IGNORED | SOCIAL_FLAG_MUTED
|
||||
};
|
||||
|
||||
struct FriendInfo
|
||||
@@ -61,11 +60,8 @@ struct FriendInfo
|
||||
{ }
|
||||
};
|
||||
|
||||
typedef std::map<ObjectGuid::LowType, FriendInfo> PlayerSocialMap;
|
||||
typedef std::map<ObjectGuid::LowType, PlayerSocial> SocialMap;
|
||||
|
||||
/// Results of friend related commands
|
||||
enum FriendsResult
|
||||
enum FriendsResult : uint8
|
||||
{
|
||||
FRIEND_DB_ERROR = 0x00,
|
||||
FRIEND_LIST_FULL = 0x01,
|
||||
@@ -92,57 +88,73 @@ enum FriendsResult
|
||||
FRIEND_MUTE_ADDED = 0x16,
|
||||
FRIEND_MUTE_REMOVED = 0x17,
|
||||
FRIEND_MUTE_AMBIGUOUS = 0x18, // That name is ambiguous, type more of the player's server name
|
||||
FRIEND_UNK7 = 0x19, // no message at client
|
||||
FRIEND_UNKNOWN = 0x1A // Unknown friend response from server
|
||||
FRIEND_UNK1 = 0x19, // no message at client
|
||||
FRIEND_UNK2 = 0x1A,
|
||||
FRIEND_UNK3 = 0x1B,
|
||||
FRIEND_UNKNOWN = 0x1C // Unknown friend response from server
|
||||
};
|
||||
|
||||
#define SOCIALMGR_FRIEND_LIMIT 50
|
||||
#define SOCIALMGR_IGNORE_LIMIT 50
|
||||
#define SOCIALMGR_FRIEND_LIMIT 50u
|
||||
#define SOCIALMGR_IGNORE_LIMIT 50u
|
||||
|
||||
class TC_GAME_API PlayerSocial
|
||||
{
|
||||
friend class SocialMgr;
|
||||
|
||||
public:
|
||||
PlayerSocial();
|
||||
// adding/removing
|
||||
bool AddToSocialList(ObjectGuid::LowType friendGuid, bool ignore);
|
||||
void RemoveFromSocialList(ObjectGuid::LowType friend_guid, bool ignore);
|
||||
void SetFriendNote(ObjectGuid::LowType friendGuid, std::string note);
|
||||
bool AddToSocialList(ObjectGuid const& guid, SocialFlag flag);
|
||||
void RemoveFromSocialList(ObjectGuid const& guid, SocialFlag flag);
|
||||
void SetFriendNote(ObjectGuid const& guid, std::string const& note);
|
||||
|
||||
// Packet send's
|
||||
void SendSocialList(Player* player);
|
||||
void SendSocialList(Player* player, uint32 flags);
|
||||
|
||||
// Misc
|
||||
bool HasFriend(ObjectGuid::LowType friend_guid);
|
||||
bool HasIgnore(ObjectGuid::LowType ignore_guid);
|
||||
ObjectGuid::LowType GetPlayerGUID() const { return m_playerGUID; }
|
||||
void SetPlayerGUID(ObjectGuid::LowType guid) { m_playerGUID = guid; }
|
||||
bool HasFriend(ObjectGuid const& friendGuid);
|
||||
bool HasIgnore(ObjectGuid const& ignoreGuid);
|
||||
|
||||
ObjectGuid const& GetPlayerGUID() const { return _playerGUID; }
|
||||
void SetPlayerGUID(ObjectGuid const& guid) { _playerGUID = guid; }
|
||||
|
||||
uint32 GetNumberOfSocialsWithFlag(SocialFlag flag);
|
||||
|
||||
private:
|
||||
PlayerSocialMap m_playerSocialMap;
|
||||
ObjectGuid::LowType m_playerGUID;
|
||||
bool _HasContact(ObjectGuid const& guid, SocialFlag flags);
|
||||
|
||||
typedef std::map<ObjectGuid, FriendInfo> PlayerSocialMap;
|
||||
PlayerSocialMap _playerSocialMap;
|
||||
|
||||
ObjectGuid _playerGUID;
|
||||
};
|
||||
|
||||
class SocialMgr
|
||||
{
|
||||
private:
|
||||
SocialMgr();
|
||||
~SocialMgr();
|
||||
SocialMgr() { }
|
||||
~SocialMgr() { }
|
||||
|
||||
public:
|
||||
static SocialMgr* instance();
|
||||
|
||||
// Misc
|
||||
void RemovePlayerSocial(ObjectGuid::LowType guid) { m_socialMap.erase(guid); }
|
||||
void RemovePlayerSocial(ObjectGuid const& guid) { _socialMap.erase(guid); }
|
||||
|
||||
void GetFriendInfo(Player* player, ObjectGuid const& friendGUID, FriendInfo& friendInfo);
|
||||
|
||||
// Packet send's
|
||||
void SendFriendStatus(Player* player, FriendsResult result, ObjectGuid const& friendGuid, bool broadcast = false);
|
||||
void BroadcastToFriendListers(Player* player, WorldPacket const* packet);
|
||||
|
||||
void GetFriendInfo(Player* player, ObjectGuid::LowType friendGUID, FriendInfo &friendInfo);
|
||||
// Packet management
|
||||
void MakeFriendStatusPacket(FriendsResult result, ObjectGuid::LowType friend_guid, WorldPacket* data);
|
||||
void SendFriendStatus(Player* player, FriendsResult result, ObjectGuid::LowType friend_guid, bool broadcast);
|
||||
void BroadcastToFriendListers(Player* player, WorldPacket* packet);
|
||||
// Loading
|
||||
PlayerSocial *LoadFromDB(PreparedQueryResult result, ObjectGuid::LowType guid);
|
||||
PlayerSocial* LoadFromDB(PreparedQueryResult result, ObjectGuid const& guid);
|
||||
|
||||
private:
|
||||
SocialMap m_socialMap;
|
||||
typedef std::map<ObjectGuid, PlayerSocial> SocialMap;
|
||||
SocialMap _socialMap;
|
||||
};
|
||||
|
||||
#define sSocialMgr SocialMgr::instance()
|
||||
|
||||
#endif
|
||||
@@ -1769,7 +1769,7 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
|
||||
|
||||
Player* player = session->GetPlayer();
|
||||
// Do not show invitations from ignored players
|
||||
if (pInvitee->GetSocial()->HasIgnore(player->GetGUID().GetCounter()))
|
||||
if (pInvitee->GetSocial()->HasIgnore(player->GetGUID()))
|
||||
return;
|
||||
|
||||
if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeam() != player->GetTeam())
|
||||
@@ -2628,7 +2628,7 @@ void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::strin
|
||||
for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
|
||||
if (Player* player = itr->second->FindConnectedPlayer())
|
||||
if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) &&
|
||||
!player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID().GetCounter()))
|
||||
!player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
|
||||
player->GetSession()->SendPacket(&data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket& recvData)
|
||||
}
|
||||
|
||||
// OK result but don't send invite
|
||||
if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUID().GetCounter()))
|
||||
if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUID()))
|
||||
return;
|
||||
|
||||
if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != GetPlayer()->GetTeam())
|
||||
|
||||
@@ -1013,7 +1013,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
|
||||
}
|
||||
|
||||
// friend status
|
||||
sSocialMgr->SendFriendStatus(pCurrChar, FRIEND_ONLINE, pCurrChar->GetGUID().GetCounter(), true);
|
||||
sSocialMgr->SendFriendStatus(pCurrChar, FRIEND_ONLINE, pCurrChar->GetGUID(), true);
|
||||
|
||||
// Place character in world (and load zone) before some object loading
|
||||
pCurrChar->LoadCorpse(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION));
|
||||
|
||||
@@ -146,13 +146,13 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
|
||||
return;
|
||||
}
|
||||
|
||||
if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUID().GetCounter()))
|
||||
if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUID()))
|
||||
{
|
||||
SendPartyResult(PARTY_OP_INVITE, memberName, ERR_IGNORING_YOU_S);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!player->GetSocial()->HasFriend(GetPlayer()->GetGUID().GetCounter()) && GetPlayer()->getLevel() < sWorld->getIntConfig(CONFIG_PARTY_LEVEL_REQ))
|
||||
if (!player->GetSocial()->HasFriend(GetPlayer()->GetGUID()) && GetPlayer()->getLevel() < sWorld->getIntConfig(CONFIG_PARTY_LEVEL_REQ))
|
||||
{
|
||||
SendPartyResult(PARTY_OP_INVITE, memberName, ERR_INVITE_RESTRICTED);
|
||||
return;
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include "Object.h"
|
||||
#include "Battleground.h"
|
||||
#include "OutdoorPvP.h"
|
||||
#include "SocialMgr.h"
|
||||
#include "AccountMgr.h"
|
||||
#include "DBCEnums.h"
|
||||
#include "ScriptMgr.h"
|
||||
@@ -547,187 +546,6 @@ void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData)
|
||||
_player->SetStandState(animstate);
|
||||
}
|
||||
|
||||
void WorldSession::HandleContactListOpcode(WorldPacket& recvData)
|
||||
{
|
||||
recvData.read_skip<uint32>(); // always 1
|
||||
TC_LOG_DEBUG("network", "WORLD: Received CMSG_CONTACT_LIST");
|
||||
_player->GetSocial()->SendSocialList(_player);
|
||||
}
|
||||
|
||||
void WorldSession::HandleAddFriendOpcode(WorldPacket& recvData)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "WORLD: Received CMSG_ADD_FRIEND");
|
||||
|
||||
std::string friendName = GetTrinityString(LANG_FRIEND_IGNORE_UNKNOWN);
|
||||
std::string friendNote;
|
||||
|
||||
recvData >> friendName;
|
||||
|
||||
recvData >> friendNote;
|
||||
|
||||
if (!normalizePlayerName(friendName))
|
||||
return;
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: %s asked to add friend : '%s'",
|
||||
GetPlayer()->GetName().c_str(), friendName.c_str());
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_RACE_ACC_BY_NAME);
|
||||
|
||||
stmt->setString(0, friendName);
|
||||
|
||||
_addFriendCallback.SetParam(friendNote);
|
||||
_addFriendCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
|
||||
}
|
||||
|
||||
void WorldSession::HandleAddFriendOpcodeCallBack(PreparedQueryResult result, std::string const& friendNote)
|
||||
{
|
||||
if (!GetPlayer())
|
||||
return;
|
||||
|
||||
ObjectGuid friendGuid;
|
||||
uint32 friendAccountId;
|
||||
uint32 team;
|
||||
FriendsResult friendResult;
|
||||
|
||||
friendResult = FRIEND_NOT_FOUND;
|
||||
|
||||
if (result)
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
friendGuid = ObjectGuid(HighGuid::Player, 0, fields[0].GetUInt32());
|
||||
team = Player::TeamForRace(fields[1].GetUInt8());
|
||||
friendAccountId = fields[2].GetUInt32();
|
||||
|
||||
if (HasPermission(rbac::RBAC_PERM_ALLOW_GM_FRIEND) || AccountMgr::IsPlayerAccount(AccountMgr::GetSecurity(friendAccountId, realm.Id.Realm)))
|
||||
{
|
||||
if (friendGuid)
|
||||
{
|
||||
if (friendGuid == GetPlayer()->GetGUID())
|
||||
friendResult = FRIEND_SELF;
|
||||
else if (GetPlayer()->GetTeam() != team && !HasPermission(rbac::RBAC_PERM_TWO_SIDE_ADD_FRIEND))
|
||||
friendResult = FRIEND_ENEMY;
|
||||
else if (GetPlayer()->GetSocial()->HasFriend(friendGuid.GetCounter()))
|
||||
friendResult = FRIEND_ALREADY;
|
||||
else
|
||||
{
|
||||
Player* pFriend = ObjectAccessor::FindPlayer(friendGuid);
|
||||
if (pFriend && pFriend->IsVisibleGloballyFor(GetPlayer()))
|
||||
friendResult = FRIEND_ADDED_ONLINE;
|
||||
else
|
||||
friendResult = FRIEND_ADDED_OFFLINE;
|
||||
if (!GetPlayer()->GetSocial()->AddToSocialList(friendGuid.GetCounter(), false))
|
||||
{
|
||||
friendResult = FRIEND_LIST_FULL;
|
||||
TC_LOG_DEBUG("network", "WORLD: %s's friend list is full.", GetPlayer()->GetName().c_str());
|
||||
}
|
||||
}
|
||||
GetPlayer()->GetSocial()->SetFriendNote(friendGuid.GetCounter(), friendNote);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sSocialMgr->SendFriendStatus(GetPlayer(), friendResult, friendGuid.GetCounter(), false);
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: Sent (SMSG_FRIEND_STATUS)");
|
||||
}
|
||||
|
||||
void WorldSession::HandleDelFriendOpcode(WorldPacket& recvData)
|
||||
{
|
||||
ObjectGuid FriendGUID;
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: Received CMSG_DEL_FRIEND");
|
||||
|
||||
recvData >> FriendGUID;
|
||||
|
||||
_player->GetSocial()->RemoveFromSocialList(FriendGUID.GetCounter(), false);
|
||||
|
||||
sSocialMgr->SendFriendStatus(GetPlayer(), FRIEND_REMOVED, FriendGUID.GetCounter(), false);
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: Sent motd (SMSG_FRIEND_STATUS)");
|
||||
}
|
||||
|
||||
void WorldSession::HandleAddIgnoreOpcode(WorldPacket& recvData)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "WORLD: Received CMSG_ADD_IGNORE");
|
||||
|
||||
std::string ignoreName = GetTrinityString(LANG_FRIEND_IGNORE_UNKNOWN);
|
||||
|
||||
recvData >> ignoreName;
|
||||
|
||||
if (!normalizePlayerName(ignoreName))
|
||||
return;
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: %s asked to Ignore: '%s'",
|
||||
GetPlayer()->GetName().c_str(), ignoreName.c_str());
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_BY_NAME);
|
||||
|
||||
stmt->setString(0, ignoreName);
|
||||
|
||||
_addIgnoreCallback = CharacterDatabase.AsyncQuery(stmt);
|
||||
}
|
||||
|
||||
void WorldSession::HandleAddIgnoreOpcodeCallBack(PreparedQueryResult result)
|
||||
{
|
||||
if (!GetPlayer())
|
||||
return;
|
||||
|
||||
ObjectGuid IgnoreGuid;
|
||||
FriendsResult ignoreResult;
|
||||
|
||||
ignoreResult = FRIEND_IGNORE_NOT_FOUND;
|
||||
|
||||
if (result)
|
||||
{
|
||||
IgnoreGuid = ObjectGuid(HighGuid::Player, (*result)[0].GetUInt32());
|
||||
|
||||
if (IgnoreGuid)
|
||||
{
|
||||
if (IgnoreGuid == GetPlayer()->GetGUID()) //not add yourself
|
||||
ignoreResult = FRIEND_IGNORE_SELF;
|
||||
else if (GetPlayer()->GetSocial()->HasIgnore(IgnoreGuid.GetCounter()))
|
||||
ignoreResult = FRIEND_IGNORE_ALREADY;
|
||||
else
|
||||
{
|
||||
ignoreResult = FRIEND_IGNORE_ADDED;
|
||||
|
||||
// ignore list full
|
||||
if (!GetPlayer()->GetSocial()->AddToSocialList(IgnoreGuid.GetCounter(), true))
|
||||
ignoreResult = FRIEND_IGNORE_FULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sSocialMgr->SendFriendStatus(GetPlayer(), ignoreResult, IgnoreGuid.GetCounter(), false);
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: Sent (SMSG_FRIEND_STATUS)");
|
||||
}
|
||||
|
||||
void WorldSession::HandleDelIgnoreOpcode(WorldPacket& recvData)
|
||||
{
|
||||
ObjectGuid IgnoreGUID;
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: Received CMSG_DEL_IGNORE");
|
||||
|
||||
recvData >> IgnoreGUID;
|
||||
|
||||
_player->GetSocial()->RemoveFromSocialList(IgnoreGUID.GetCounter(), true);
|
||||
|
||||
sSocialMgr->SendFriendStatus(GetPlayer(), FRIEND_IGNORE_REMOVED, IgnoreGUID.GetCounter(), false);
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: Sent motd (SMSG_FRIEND_STATUS)");
|
||||
}
|
||||
|
||||
void WorldSession::HandleSetContactNotesOpcode(WorldPacket& recvData)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "CMSG_SET_CONTACT_NOTES");
|
||||
ObjectGuid guid;
|
||||
std::string note;
|
||||
recvData >> guid >> note;
|
||||
_player->GetSocial()->SetFriendNote(guid.GetCounter(), note);
|
||||
}
|
||||
|
||||
void WorldSession::HandleBugOpcode(WorldPacket& recvData)
|
||||
{
|
||||
uint32 suggestion, contentlen, typelen;
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 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/>.
|
||||
*/
|
||||
|
||||
#include "WorldSession.h"
|
||||
#include "Player.h"
|
||||
#include "SocialMgr.h"
|
||||
#include "ObjectMgr.h"
|
||||
|
||||
void WorldSession::HandleContactListOpcode(WorldPacket& recvData)
|
||||
{
|
||||
uint32 flags;
|
||||
recvData >> flags;
|
||||
_player->GetSocial()->SendSocialList(_player, flags);
|
||||
}
|
||||
|
||||
void WorldSession::HandleAddFriendOpcode(WorldPacket& recvData)
|
||||
{
|
||||
std::string friendName, friendNote;
|
||||
recvData >> friendName >> friendNote;
|
||||
|
||||
if (!normalizePlayerName(friendName))
|
||||
return;
|
||||
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleAddFriendOpcode: %s asked to add friend: %s",
|
||||
GetPlayer()->GetName().c_str(), friendName.c_str());
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_RACE_ACC_BY_NAME);
|
||||
stmt->setString(0, friendName);
|
||||
|
||||
_addFriendCallback.SetParam(friendNote);
|
||||
_addFriendCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
|
||||
}
|
||||
|
||||
void WorldSession::HandleAddFriendOpcodeCallback(PreparedQueryResult result, std::string const& friendNote)
|
||||
{
|
||||
if (!GetPlayer())
|
||||
return;
|
||||
|
||||
ObjectGuid friendGuid;
|
||||
FriendsResult friendResult = FRIEND_NOT_FOUND;
|
||||
|
||||
if (result)
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
friendGuid = ObjectGuid(HighGuid::Player, 0, fields[0].GetUInt32());
|
||||
uint32 team = Player::TeamForRace(fields[1].GetUInt8());
|
||||
uint32 friendAccountId = fields[2].GetUInt32();
|
||||
|
||||
if (HasPermission(rbac::RBAC_PERM_ALLOW_GM_FRIEND) || AccountMgr::IsPlayerAccount(AccountMgr::GetSecurity(friendAccountId, realm.Id.Realm)))
|
||||
{
|
||||
if (friendGuid)
|
||||
{
|
||||
if (friendGuid == GetPlayer()->GetGUID())
|
||||
friendResult = FRIEND_SELF;
|
||||
else if (GetPlayer()->GetTeam() != team && !HasPermission(rbac::RBAC_PERM_TWO_SIDE_ADD_FRIEND))
|
||||
friendResult = FRIEND_ENEMY;
|
||||
else if (GetPlayer()->GetSocial()->HasFriend(friendGuid))
|
||||
friendResult = FRIEND_ALREADY;
|
||||
else
|
||||
{
|
||||
Player* pFriend = ObjectAccessor::FindPlayer(friendGuid);
|
||||
if (pFriend && pFriend->IsVisibleGloballyFor(GetPlayer()))
|
||||
friendResult = FRIEND_ADDED_ONLINE;
|
||||
else
|
||||
friendResult = FRIEND_ADDED_OFFLINE;
|
||||
if (GetPlayer()->GetSocial()->AddToSocialList(friendGuid, SOCIAL_FLAG_FRIEND))
|
||||
GetPlayer()->GetSocial()->SetFriendNote(friendGuid, friendNote);
|
||||
else
|
||||
friendResult = FRIEND_LIST_FULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sSocialMgr->SendFriendStatus(GetPlayer(), friendResult, friendGuid);
|
||||
}
|
||||
|
||||
void WorldSession::HandleDelFriendOpcode(WorldPacket& recvData)
|
||||
{
|
||||
ObjectGuid friendGuid;
|
||||
recvData >> friendGuid;
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleDelFriendOpcode: %s", friendGuid.ToString().c_str());
|
||||
|
||||
_player->GetSocial()->RemoveFromSocialList(friendGuid, SOCIAL_FLAG_FRIEND);
|
||||
|
||||
sSocialMgr->SendFriendStatus(GetPlayer(), FRIEND_REMOVED, friendGuid);
|
||||
}
|
||||
|
||||
void WorldSession::HandleAddIgnoreOpcode(WorldPacket& recvData)
|
||||
{
|
||||
std::string ignoreName;
|
||||
recvData >> ignoreName;
|
||||
|
||||
if (!normalizePlayerName(ignoreName))
|
||||
return;
|
||||
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleAddIgnoreOpcode: %s asked to Ignore: %s",
|
||||
GetPlayer()->GetName().c_str(), ignoreName.c_str());
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_BY_NAME);
|
||||
stmt->setString(0, ignoreName);
|
||||
|
||||
_addIgnoreCallback = CharacterDatabase.AsyncQuery(stmt);
|
||||
}
|
||||
|
||||
void WorldSession::HandleAddIgnoreOpcodeCallback(PreparedQueryResult result)
|
||||
{
|
||||
if (!GetPlayer())
|
||||
return;
|
||||
|
||||
ObjectGuid ignoreGuid;
|
||||
FriendsResult ignoreResult = FRIEND_IGNORE_NOT_FOUND;
|
||||
|
||||
if (result)
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
if (ObjectGuid::LowType lowGuid = fields[0].GetUInt32())
|
||||
{
|
||||
ignoreGuid = ObjectGuid::Create<HighGuid::Player>(lowGuid);
|
||||
|
||||
if (ignoreGuid == GetPlayer()->GetGUID()) //not add yourself
|
||||
ignoreResult = FRIEND_IGNORE_SELF;
|
||||
else if (GetPlayer()->GetSocial()->HasIgnore(ignoreGuid))
|
||||
ignoreResult = FRIEND_IGNORE_ALREADY;
|
||||
else
|
||||
{
|
||||
ignoreResult = FRIEND_IGNORE_ADDED;
|
||||
|
||||
// ignore list full
|
||||
if (!GetPlayer()->GetSocial()->AddToSocialList(ignoreGuid, SOCIAL_FLAG_IGNORED))
|
||||
ignoreResult = FRIEND_IGNORE_FULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sSocialMgr->SendFriendStatus(GetPlayer(), ignoreResult, ignoreGuid);
|
||||
}
|
||||
|
||||
void WorldSession::HandleDelIgnoreOpcode(WorldPacket& recvData)
|
||||
{
|
||||
ObjectGuid ignoreGuid;
|
||||
recvData >> ignoreGuid;
|
||||
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleDelIgnoreOpcode: %s", ignoreGuid.ToString().c_str());
|
||||
|
||||
_player->GetSocial()->RemoveFromSocialList(ignoreGuid, SOCIAL_FLAG_IGNORED);
|
||||
|
||||
sSocialMgr->SendFriendStatus(GetPlayer(), FRIEND_IGNORE_REMOVED, ignoreGuid);
|
||||
}
|
||||
|
||||
void WorldSession::HandleSetContactNotesOpcode(WorldPacket& recvData)
|
||||
{
|
||||
ObjectGuid guid;
|
||||
std::string note;
|
||||
recvData >> guid >> note;
|
||||
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleSetContactNotesOpcode: Contact: %s, Notes: %s", guid.ToString().c_str(), note.c_str());
|
||||
|
||||
_player->GetSocial()->SetFriendNote(guid, note);
|
||||
}
|
||||
@@ -772,7 +772,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
|
||||
return;
|
||||
}
|
||||
|
||||
if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUID().GetCounter()))
|
||||
if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUID()))
|
||||
{
|
||||
info.Status = TRADE_STATUS_IGNORE_YOU;
|
||||
SendTradeStatus(info);
|
||||
|
||||
@@ -78,7 +78,7 @@ enum TrinityStrings
|
||||
LANG_UNKNOWN = 45,
|
||||
LANG_ERROR = 46,
|
||||
LANG_NON_EXIST_CHARACTER = 47,
|
||||
LANG_FRIEND_IGNORE_UNKNOWN = 48,
|
||||
// unused = 48,
|
||||
LANG_LEVEL_MINREQUIRED = 49,
|
||||
LANG_LEVEL_MINREQUIRED_AND_ITEM = 50,
|
||||
LANG_NPC_TAINER_HELLO = 51,
|
||||
|
||||
@@ -573,8 +573,8 @@ void WorldSession::LogoutPlayer(bool save)
|
||||
}
|
||||
|
||||
//! Broadcast a logout message to the player's friends
|
||||
sSocialMgr->SendFriendStatus(_player, FRIEND_OFFLINE, _player->GetGUID().GetCounter(), true);
|
||||
sSocialMgr->RemovePlayerSocial(_player->GetGUID().GetCounter());
|
||||
sSocialMgr->SendFriendStatus(_player, FRIEND_OFFLINE, _player->GetGUID(), true);
|
||||
_player->RemoveSocial();
|
||||
|
||||
//! Call script hook before deletion
|
||||
sScriptMgr->OnPlayerLogout(_player);
|
||||
@@ -1066,7 +1066,7 @@ void WorldSession::ProcessQueryCallbacks()
|
||||
{
|
||||
std::string param = _addFriendCallback.GetParam();
|
||||
_addFriendCallback.GetResult(result);
|
||||
HandleAddFriendOpcodeCallBack(result, param);
|
||||
HandleAddFriendOpcodeCallback(result, param);
|
||||
_addFriendCallback.FreeResult();
|
||||
}
|
||||
|
||||
@@ -1084,7 +1084,7 @@ void WorldSession::ProcessQueryCallbacks()
|
||||
if (_addIgnoreCallback.valid() && _addIgnoreCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
|
||||
{
|
||||
result = _addIgnoreCallback.get();
|
||||
HandleAddIgnoreOpcodeCallBack(result);
|
||||
HandleAddIgnoreOpcodeCallback(result);
|
||||
}
|
||||
|
||||
//- SendStabledPet
|
||||
|
||||
@@ -556,12 +556,14 @@ class TC_GAME_API WorldSession
|
||||
void HandleSetSelectionOpcode(WorldPacket& recvPacket);
|
||||
void HandleStandStateChangeOpcode(WorldPacket& recvPacket);
|
||||
void HandleEmoteOpcode(WorldPacket& recvPacket);
|
||||
|
||||
// Social
|
||||
void HandleContactListOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddFriendOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddFriendOpcodeCallBack(PreparedQueryResult result, std::string const& friendNote);
|
||||
void HandleAddFriendOpcodeCallback(PreparedQueryResult result, std::string const& friendNote);
|
||||
void HandleDelFriendOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddIgnoreOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddIgnoreOpcodeCallBack(PreparedQueryResult result);
|
||||
void HandleAddIgnoreOpcodeCallback(PreparedQueryResult result);
|
||||
void HandleDelIgnoreOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetContactNotesOpcode(WorldPacket& recvPacket);
|
||||
void HandleBugOpcode(WorldPacket& recvPacket);
|
||||
|
||||
@@ -3765,7 +3765,7 @@ void Spell::EffectDuel(SpellEffIndex effIndex)
|
||||
Player* target = unitTarget->ToPlayer();
|
||||
|
||||
// caster or target already have requested duel
|
||||
if (caster->duel || target->duel || !target->GetSocial() || target->GetSocial()->HasIgnore(caster->GetGUID().GetCounter()))
|
||||
if (caster->duel || target->duel || !target->GetSocial() || target->GetSocial()->HasIgnore(caster->GetGUID()))
|
||||
return;
|
||||
|
||||
// Players can only fight a duel in zones with this flag
|
||||
|
||||
Reference in new issue
Block a user