Core/Packets: updated some contactlist packets

This commit is contained in:
joschiwald
2015-02-08 02:51:49 +01:00
parent 8fd7f80b6b
commit e01bb91887
17 changed files with 657 additions and 402 deletions
@@ -0,0 +1 @@
DELETE FROM `trinity_string` WHERE `entry`=48;
+12 -7
View File
@@ -4498,16 +4498,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->setUInt64(0, guid);
PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt);
if (resultFriends)
if (PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt))
{
do
{
if (Player* pFriend = ObjectAccessor::FindPlayer(ObjectGuid::Create<HighGuid::Player>((*resultFriends)[0].GetUInt64())))
if (Player* playerFriend = ObjectAccessor::FindPlayer(ObjectGuid::Create<HighGuid::Player>((*resultFriends)[0].GetUInt64())))
{
pFriend->GetSocial()->RemoveFromSocialList(playerguid, false);
sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, playerguid, false);
playerFriend->GetSocial()->RemoveFromSocialList(playerguid, SOCIAL_FLAG_ALL);
sSocialMgr->SendFriendStatus(playerFriend, FRIEND_REMOVED, playerguid);
}
} while (resultFriends->NextRow());
}
@@ -17580,7 +17579,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff)
if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields))
{
ObjectGuid bagGuid = fields[15].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[15].GetUInt64()) : ObjectGuid::Empty;
uint8 slot = fields[16].GetUInt8();
uint8 slot = fields[16].GetUInt8();
uint8 err = EQUIP_ERR_OK;
// Item is not in bag
@@ -22811,7 +22810,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);
/// SMSG_SPELL_CATEGORY_COOLDOWN
GetSession()->SendSpellCategoryCooldowns();
@@ -27233,3 +27232,9 @@ void Player::RemoveSpecializationSpells()
}
}
}
void Player::RemoveSocial()
{
sSocialMgr->RemovePlayerSocial(GetGUID());
m_social = nullptr;
}
+4 -3
View File
@@ -1384,7 +1384,8 @@ class Player : public Unit, public GridObject<Player>
uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin=NULL);
PlayerSocial *GetSocial() { return m_social; }
PlayerSocial* GetSocial() { return m_social; }
void RemoveSocial();
PlayerTaxi m_taxi;
void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); }
@@ -1835,7 +1836,7 @@ class Player : public Unit, public GridObject<Player>
uint32 GetMailSize() { return m_mail.size();}
Mail* GetMail(uint32 id);
PlayerMails const& GetMails() const { return m_mail; }
PlayerMails const& GetMails() const { return m_mail; }
void SendItemRetrievalMail(uint32 itemEntry, uint32 count); // Item retrieval mails sent by The Postmaster (34337), used in multiple places.
@@ -2912,7 +2913,7 @@ class Player : public Unit, public GridObject<Player>
////////////////////Rest System/////////////////////
// Social
PlayerSocial *m_social;
PlayerSocial* m_social;
// Groups
GroupReference m_group;
+79 -151
View File
@@ -17,60 +17,45 @@
*/
#include "SocialMgr.h"
#include "DatabaseEnv.h"
#include "WorldSession.h"
#include "WorldPacket.h"
#include "Player.h"
#include "ObjectMgr.h"
#include "SocialPackets.h"
#include "World.h"
#include "Util.h"
#include "AccountMgr.h"
#include "WorldSession.h"
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 const& 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);
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_SOCIAL_FLAGS);
stmt->setUInt8(0, itr->second.Flags);
stmt->setUInt64(1, GetPlayerGUID().GetCounter());
stmt->setUInt64(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->setUInt64(0, GetPlayerGUID().GetCounter());
@@ -78,26 +63,20 @@ bool PlayerSocial::AddToSocialList(ObjectGuid const& friendGuid, bool ignore)
stmt->setUInt8(2, flag);
CharacterDatabase.Execute(stmt);
FriendInfo fi;
fi.Flags |= flag;
m_playerSocialMap[friendGuid] = fi;
}
return true;
}
void PlayerSocial::RemoveFromSocialList(ObjectGuid const& 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);
@@ -106,13 +85,13 @@ void PlayerSocial::RemoveFromSocialList(ObjectGuid const& friendGuid, bool ignor
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->setUInt64(1, GetPlayerGUID().GetCounter());
stmt->setUInt64(2, friendGuid.GetCounter());
@@ -120,80 +99,68 @@ void PlayerSocial::RemoveFromSocialList(ObjectGuid const& friendGuid, bool ignor
}
}
void PlayerSocial::SetFriendNote(ObjectGuid const& 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->setString(0, itr->second.Note);
stmt->setUInt64(1, GetPlayerGUID().GetCounter());
stmt->setUInt64(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();
WorldPackets::Social::ContactList contactList;
contactList.Flags = flags;
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
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 << 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()
{
data << uint8(itr->second.Status); // online/offline/etc?
if (itr->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
}
}
sSocialMgr->GetFriendInfo(player, v.first, v.second);
contactList.Contacts.emplace_back(v.first, v.second);
// client's friends list and ignore list limit
if (contactList.Contacts.size() >= (((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(contactList.Write());
}
bool PlayerSocial::_HasContact(ObjectGuid const& guid, SocialFlag flags)
{
PlayerSocialMap::const_iterator itr = _playerSocialMap.find(guid);
if (itr != _playerSocialMap.end())
return (itr->second.Flags & flags) != 0;
return false;
}
bool PlayerSocial::HasFriend(ObjectGuid const& friendGuid)
{
PlayerSocialMap::const_iterator itr = m_playerSocialMap.find(friendGuid);
if (itr != m_playerSocialMap.end())
return itr->second.Flags & SOCIAL_FLAG_FRIEND;
return false;
return _HasContact(friendGuid, SOCIAL_FLAG_FRIEND);
}
bool PlayerSocial::HasIgnore(ObjectGuid const& ignore_guid)
bool PlayerSocial::HasIgnore(ObjectGuid const& ignoreGuid)
{
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(ignoreGuid, SOCIAL_FLAG_IGNORED);
}
SocialMgr::SocialMgr() { }
SocialMgr::~SocialMgr() { }
void SocialMgr::GetFriendInfo(Player* player, ObjectGuid const& friendGUID, FriendInfo &friendInfo)
void SocialMgr::GetFriendInfo(Player* player, ObjectGuid const& friendGUID, FriendInfo& friendInfo)
{
if (!player)
return;
@@ -207,8 +174,8 @@ void SocialMgr::GetFriendInfo(Player* player, ObjectGuid const& friendGUID, Frie
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
@@ -237,59 +204,29 @@ void SocialMgr::GetFriendInfo(Player* player, ObjectGuid const& friendGUID, Frie
}
}
void SocialMgr::MakeFriendStatusPacket(FriendsResult result, ObjectGuid const& guid, WorldPacket* data)
{
data->Initialize(SMSG_FRIEND_STATUS, 9);
*data << uint8(result);
*data << guid;
}
void SocialMgr::SendFriendStatus(Player* player, FriendsResult result, ObjectGuid const& 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);
switch (result)
{
case FRIEND_ADDED_OFFLINE:
case FRIEND_ADDED_ONLINE:
data << fi.Note;
break;
default:
break;
}
switch (result)
{
case FRIEND_ADDED_ONLINE:
case FRIEND_ONLINE:
data << uint8(fi.Status);
data << uint32(fi.Area);
data << uint32(fi.Level);
data << uint32(fi.Class);
break;
default:
break;
}
WorldPackets::Social::FriendStatus friendStatus;
friendStatus.Initialize(friendGuid, result, fi);
if (broadcast)
BroadcastToFriendListers(player, &data);
BroadcastToFriendListers(player, friendStatus.Write());
else
player->GetSession()->SendPacket(&data);
player->SendDirectMessage(friendStatus.Write());
}
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());
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(itr->first);
if (!target)
@@ -310,31 +247,22 @@ void SocialMgr::BroadcastToFriendListers(Player* player, WorldPacket* packet)
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 friendGuid;
uint8 flags = 0;
std::string note = "";
do
if (result)
{
Field* fields = result->Fetch();
do
{
Field* fields = result->Fetch();
friendGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64());
flags = fields[1].GetUInt8();
note = fields[2].GetString();
ObjectGuid friendGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64());
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;
}
+44 -32
View File
@@ -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, FriendInfo> PlayerSocialMap;
typedef std::map<ObjectGuid, PlayerSocial> SocialMap;
/// Results of friend related commands
enum FriendsResult
enum FriendsResult : uint8
{
FRIEND_DB_ERROR = 0x00,
FRIEND_LIST_FULL = 0x01,
@@ -92,39 +88,51 @@ 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 PlayerSocial
{
friend class SocialMgr;
public:
// adding/removing
bool AddToSocialList(ObjectGuid const& friend_guid, bool ignore);
void RemoveFromSocialList(ObjectGuid const& friend_guid, bool ignore);
void SetFriendNote(ObjectGuid const& 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 const& friend_guid);
bool HasIgnore(ObjectGuid const& ignore_guid);
ObjectGuid const& GetPlayerGUID() const { return m_playerGUID; }
void SetPlayerGUID(ObjectGuid const& 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 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()
@@ -134,18 +142,22 @@ class SocialMgr
}
// Misc
void RemovePlayerSocial(ObjectGuid const& 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 const& friendGUID, FriendInfo &friendInfo);
// Packet management
void MakeFriendStatusPacket(FriendsResult result, ObjectGuid const& friend_guid, WorldPacket* data);
void SendFriendStatus(Player* player, FriendsResult result, ObjectGuid const& friend_guid, bool broadcast);
void BroadcastToFriendListers(Player* player, WorldPacket* packet);
// Loading
PlayerSocial *LoadFromDB(PreparedQueryResult result, ObjectGuid const& 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
-177
View File
@@ -39,7 +39,6 @@
#include "Battleground.h"
#include "OutdoorPvP.h"
#include "Pet.h"
#include "SocialMgr.h"
#include "CellImpl.h"
#include "AccountMgr.h"
#include "Vehicle.h"
@@ -529,182 +528,6 @@ void WorldSession::HandleStandStateChangeOpcode(WorldPackets::Misc::StandStateCh
_player->SetStandState(packet.StandState);
}
void WorldSession::HandleContactListOpcode(WorldPacket& recvData)
{
recvData.read_skip<uint32>(); // always 1
_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 = FRIEND_NOT_FOUND;
if (result)
{
Field* fields = result->Fetch();
friendGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64());
team = Player::TeamForRace(fields[1].GetUInt8());
friendAccountId = fields[2].GetUInt32();
if (HasPermission(rbac::RBAC_PERM_ALLOW_GM_FRIEND) || AccountMgr::IsPlayerAccount(AccountMgr::GetSecurity(friendAccountId, realmHandle.Index)))
{
if (!friendGuid.IsEmpty())
{
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, false))
{
friendResult = FRIEND_LIST_FULL;
TC_LOG_DEBUG("network", "WORLD: %s's friend list is full.", GetPlayer()->GetName().c_str());
}
}
GetPlayer()->GetSocial()->SetFriendNote(friendGuid, friendNote);
}
}
}
sSocialMgr->SendFriendStatus(GetPlayer(), friendResult, friendGuid, 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, false);
sSocialMgr->SendFriendStatus(GetPlayer(), FRIEND_REMOVED, FriendGUID, 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 = FRIEND_IGNORE_NOT_FOUND;
if (result)
{
IgnoreGuid = ObjectGuid::Create<HighGuid::Player>((*result)[0].GetUInt64());
if (!IgnoreGuid.IsEmpty())
{
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, true))
ignoreResult = FRIEND_IGNORE_FULL;
}
}
}
sSocialMgr->SendFriendStatus(GetPlayer(), ignoreResult, IgnoreGuid, 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, true);
sSocialMgr->SendFriendStatus(GetPlayer(), FRIEND_IGNORE_REMOVED, IgnoreGUID, 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, note);
}
void WorldSession::HandleBugReportOpcode(WorldPacket& recvData)
{
uint32 suggestion, contentlen, typelen;
+164
View File
@@ -0,0 +1,164 @@
/*
* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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 "SocialPackets.h"
void WorldSession::HandleContactListOpcode(WorldPackets::Social::SendContactList& packet)
{
TC_LOG_DEBUG("network", "WorldSession::HandleContactListOpcode: Flags: %u", packet.Flags);
_player->GetSocial()->SendSocialList(_player, packet.Flags);
}
void WorldSession::HandleAddFriendOpcode(WorldPackets::Social::AddFriend& packet)
{
if (!normalizePlayerName(packet.Name))
return;
TC_LOG_DEBUG("network", "WorldSession::HandleAddFriendOpcode: %s asked to add friend: %s",
GetPlayerInfo().c_str(), packet.Name.c_str());
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_RACE_ACC_BY_NAME);
stmt->setString(0, packet.Name);
_addFriendCallback.SetParam(std::move(packet.Notes));
_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();
if (ObjectGuid::LowType lowGuid = fields[0].GetUInt64())
{
friendGuid = ObjectGuid::Create<HighGuid::Player>(lowGuid);
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, realmHandle.Index)))
{
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* playerFriend = ObjectAccessor::FindPlayer(friendGuid);
if (playerFriend && playerFriend->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(WorldPackets::Social::DelFriend& packet)
{
/// @todo: handle VirtualRealmAddress
TC_LOG_DEBUG("network", "WorldSession::HandleDelFriendOpcode: %s", packet.Player.Guid.ToString().c_str());
GetPlayer()->GetSocial()->RemoveFromSocialList(packet.Player.Guid, SOCIAL_FLAG_FRIEND);
sSocialMgr->SendFriendStatus(GetPlayer(), FRIEND_REMOVED, packet.Player.Guid);
}
void WorldSession::HandleAddIgnoreOpcode(WorldPackets::Social::AddIgnore& packet)
{
if (!normalizePlayerName(packet.Name))
return;
TC_LOG_DEBUG("network", "WorldSession::HandleAddIgnoreOpcode: %s asked to Ignore: %s",
GetPlayerInfo().c_str(), packet.Name.c_str());
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_BY_NAME);
stmt->setString(0, packet.Name);
_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].GetUInt64())
{
ignoreGuid = ObjectGuid::Create<HighGuid::Player>((*result)[0].GetUInt64());
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(WorldPackets::Social::DelIgnore& packet)
{
/// @todo: handle VirtualRealmAddress
TC_LOG_DEBUG("network", "WorldSession::HandleDelIgnoreOpcode: %s", packet.Player.Guid.ToString().c_str());
GetPlayer()->GetSocial()->RemoveFromSocialList(packet.Player.Guid, SOCIAL_FLAG_IGNORED);
sSocialMgr->SendFriendStatus(GetPlayer(), FRIEND_IGNORE_REMOVED, packet.Player.Guid);
}
void WorldSession::HandleSetContactNotesOpcode(WorldPackets::Social::SetContactNotes& packet)
{
/// @todo: handle VirtualRealmAddress
TC_LOG_DEBUG("network", "WorldSession::HandleSetContactNotesOpcode: Contact: %s, Notes: %s", packet.Player.Guid.ToString().c_str(), packet.Notes);
_player->GetSocial()->SetFriendNote(packet.Player.Guid, packet.Notes);
}
+1 -1
View File
@@ -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,
@@ -260,7 +260,7 @@ void WorldPackets::Misc::ResurrectResponse::Read()
WorldPackets::Misc::Weather::Weather() : ServerPacket(SMSG_WEATHER, 4 + 4 + 1) { }
WorldPackets::Misc::Weather::Weather(WeatherState weatherID, float intensity /*= 0.0f*/, bool abrupt /*= false*/)
: ServerPacket(SMSG_WEATHER, 4 + 4 + 1), WeatherID(weatherID), Intensity(intensity), Abrupt(abrupt) { }
: ServerPacket(SMSG_WEATHER, 4 + 4 + 1), Abrupt(abrupt), Intensity(intensity), WeatherID(weatherID) { }
WorldPacket const* WorldPackets::Misc::Weather::Write()
{
@@ -0,0 +1,147 @@
/*
* Copyright (C) 2008-2015 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 "SocialPackets.h"
#include "ObjectMgr.h"
#include "SocialMgr.h"
#include "World.h"
void WorldPackets::Social::SendContactList::Read()
{
_worldPacket >> Flags;
}
WorldPackets::Social::ContactInfo::ContactInfo(ObjectGuid const& guid, FriendInfo const& friendInfo)
{
Guid = guid;
WowAccountGuid = ObjectGuid::Create<HighGuid::WowAccount>(ObjectMgr::GetPlayerAccountIdByGUID(guid));
VirtualRealmAddr = GetVirtualRealmAddress();
NativeRealmAddr = GetVirtualRealmAddress();
TypeFlags = friendInfo.Flags;
Notes = friendInfo.Note;
Status = friendInfo.Status;
AreaID = friendInfo.Area;
Level = friendInfo.Level;
ClassID = friendInfo.Class;
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Social::ContactInfo const& contact)
{
data << contact.Guid;
data << contact.WowAccountGuid;
data << uint32(contact.VirtualRealmAddr);
data << uint32(contact.NativeRealmAddr);
data << uint32(contact.TypeFlags);
data << uint8(contact.Status);
data << uint32(contact.AreaID);
data << uint32(contact.Level);
data << uint32(contact.ClassID);
data.WriteBits(contact.Notes.length(), 10);
data.FlushBits();
data.WriteString(contact.Notes);
return data;
}
WorldPacket const* WorldPackets::Social::ContactList::Write()
{
_worldPacket << uint32(Flags);
_worldPacket.WriteBits(Contacts.size(), 8);
_worldPacket.FlushBits();
for (size_t i = 0; i < Contacts.size(); ++i)
_worldPacket << Contacts[i];
return &_worldPacket;
}
void WorldPackets::Social::FriendStatus::Initialize(ObjectGuid const& guid, FriendsResult result, FriendInfo const& friendInfo)
{
VirtualRealmAddress = GetVirtualRealmAddress();
Notes = friendInfo.Note;
ClassID = friendInfo.Class;
Status = friendInfo.Status;
Guid = guid;
WowAccountGuid = ObjectGuid::Create<HighGuid::WowAccount>(ObjectMgr::GetPlayerAccountIdByGUID(guid));
Level = friendInfo.Level;
AreaID = friendInfo.Area;
FriendResult = result;
}
WorldPacket const* WorldPackets::Social::FriendStatus::Write()
{
_worldPacket << uint8(FriendResult);
_worldPacket << Guid;
_worldPacket << WowAccountGuid;
_worldPacket << uint32(VirtualRealmAddress);
_worldPacket << uint8(Status);
_worldPacket << uint32(AreaID);
_worldPacket << uint32(Level);
_worldPacket << uint32(ClassID);
_worldPacket.WriteBits(Notes.length(), 10);
_worldPacket.FlushBits();
_worldPacket.WriteString(Notes);
return &_worldPacket;
}
ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Social::QualifiedGUID& qGuid)
{
data >> qGuid.VirtualRealmAddress;
data >> qGuid.Guid;
return data;
}
void WorldPackets::Social::AddFriend::Read()
{
uint32 nameLength = _worldPacket.ReadBits(9);
uint32 noteslength = _worldPacket.ReadBits(10);
Name = _worldPacket.ReadString(nameLength);
Notes = _worldPacket.ReadString(noteslength);
}
void WorldPackets::Social::DelFriend::Read()
{
_worldPacket >> Player;
}
void WorldPackets::Social::SetContactNotes::Read()
{
_worldPacket >> Player;
Notes = _worldPacket.ReadString(_worldPacket.ReadBits(10));
}
void WorldPackets::Social::AddIgnore::Read()
{
Name = _worldPacket.ReadString(_worldPacket.ReadBits(9));
}
void WorldPackets::Social::DelIgnore::Read()
{
_worldPacket >> Player;
}
void WorldPackets::Social::VoiceAddIgnore::Read()
{
OffenderName = _worldPacket.ReadString(_worldPacket.ReadBits(9));
}
void WorldPackets::Social::VoiceDelIgnore::Read()
{
_worldPacket >> Player;
}
@@ -0,0 +1,168 @@
/*
* Copyright (C) 2008-2015 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/>.
*/
#ifndef SocialPackets_h__
#define SocialPackets_h__
#include "Packet.h"
#include "ObjectGuid.h"
struct FriendInfo;
enum FriendsResult : uint8;
namespace WorldPackets
{
namespace Social
{
class SendContactList final : public ClientPacket
{
public:
SendContactList(WorldPacket&& packet) : ClientPacket(CMSG_SEND_CONTACT_LIST, std::move(packet)) { }
void Read() override;
uint32 Flags = 0; ///< @see enum SocialFlag
};
struct ContactInfo
{
ContactInfo(ObjectGuid const& guid, FriendInfo const& friendInfo);
ObjectGuid Guid;
ObjectGuid WowAccountGuid;
uint32 VirtualRealmAddr = 0;
uint32 NativeRealmAddr = 0;
uint32 TypeFlags = 0; ///< @see enum SocialFlag
std::string Notes;
uint8 Status = 0; ///< @see enum FriendStatus
uint32 AreaID = 0;
uint32 Level = 0;
uint32 ClassID = CLASS_NONE;
};
class ContactList final : public ServerPacket
{
public:
ContactList() : ServerPacket(SMSG_CONTACT_LIST, 8) { }
WorldPacket const* Write() override;
std::vector<ContactInfo> Contacts;
uint32 Flags = 0; ///< @see enum SocialFlag
};
class FriendStatus final : public ServerPacket
{
public:
FriendStatus() : ServerPacket(SMSG_CONTACT_STATUS, 38) { }
void Initialize(ObjectGuid const& guid, FriendsResult result, FriendInfo const& friendInfo);
WorldPacket const* Write() override;
uint32 VirtualRealmAddress = 0;
std::string Notes;
uint32 ClassID = CLASS_NONE;
uint8 Status = 0; ///< @see enum FriendStatus
ObjectGuid Guid;
ObjectGuid WowAccountGuid;
uint32 Level = 0;
uint32 AreaID = 0;
uint8 FriendResult = 0; ///< @see enum FriendsResult
};
struct QualifiedGUID
{
ObjectGuid Guid;
uint32 VirtualRealmAddress = 0;
};
class AddFriend final : public ClientPacket
{
public:
AddFriend(WorldPacket&& packet) : ClientPacket(CMSG_ADD_FRIEND, std::move(packet)) { }
void Read() override;
std::string Notes;
std::string Name;
};
class DelFriend final : public ClientPacket
{
public:
DelFriend(WorldPacket&& packet) : ClientPacket(CMSG_DEL_FRIEND, std::move(packet)) { }
void Read() override;
QualifiedGUID Player;
};
class SetContactNotes final : public ClientPacket
{
public:
SetContactNotes(WorldPacket&& packet) : ClientPacket(CMSG_SET_CONTACT_NOTES, std::move(packet)) { }
void Read() override;
QualifiedGUID Player;
std::string Notes;
};
class AddIgnore final : public ClientPacket
{
public:
AddIgnore(WorldPacket&& packet) : ClientPacket(CMSG_ADD_IGNORE, std::move(packet)) { }
void Read() override;
std::string Name;
};
class DelIgnore final : public ClientPacket
{
public:
DelIgnore(WorldPacket&& packet) : ClientPacket(CMSG_DEL_IGNORE, std::move(packet)) { }
void Read() override;
QualifiedGUID Player;
};
class VoiceAddIgnore final : public ClientPacket
{
public:
VoiceAddIgnore(WorldPacket&& packet) : ClientPacket(CMSG_VOICE_ADD_IGNORE, std::move(packet)) { }
void Read() override;
std::string OffenderName;
};
class VoiceDelIgnore final : public ClientPacket
{
public:
VoiceDelIgnore(WorldPacket&& packet) : ClientPacket(CMSG_VOICE_DEL_IGNORE, std::move(packet)) { }
void Read() override;
QualifiedGUID Player;
};
}
}
#endif // SocialPackets_h__
+11 -13
View File
@@ -39,6 +39,7 @@
#include "Packets/NPCPackets.h"
#include "Packets/QueryPackets.h"
#include "Packets/QuestPackets.h"
#include "Packets/SocialPackets.h"
#include "Packets/TalentPackets.h"
#include "Packets/TradePackets.h"
#include "Packets/TicketPackets.h"
@@ -147,10 +148,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATE_TAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATE_TAXI_EXPRESS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiExpressOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_FRIEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddFriendOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_IGNORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddIgnoreOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_MUTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_VOICE_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_ADD_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddFriend, &WorldSession::HandleAddFriendOpcode);
DEFINE_HANDLER(CMSG_ADD_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddIgnore, &WorldSession::HandleAddIgnoreOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_ALTER_APPEARANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAlterAppearance );
DEFINE_HANDLER(CMSG_AREATRIGGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::AreaTrigger, &WorldSession::HandleAreaTriggerOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueryOpcode);
@@ -329,10 +328,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_DECLINE_GUILD_INVITES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DECLINE_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionDeclineOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DELETE_EQUIPMENT_SET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_FRIEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDelFriendOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_MUTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_VOICE_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelFriend, &WorldSession::HandleDelFriendOpcode);
DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelIgnore, &WorldSession::HandleDelIgnoreOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEPOSIT_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::DestroyItem, &WorldSession::HandleDestroyItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -768,7 +765,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_SCENE_TRIGGER_EVENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SELF_RES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSelfResOpcode );
DEFINE_HANDLER(CMSG_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SellItem, &WorldSession::HandleSellItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_CONTACT_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleContactListOpcode );
DEFINE_HANDLER(CMSG_SEND_CONTACT_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::SendContactList, &WorldSession::HandleContactListOpcode);
DEFINE_HANDLER(CMSG_SEND_MAIL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::SendMail, &WorldSession::HandleSendMail);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_SOR_REQUEST_VIA_ADDRESS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -783,7 +780,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ASSISTANT_LEADER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_BANK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_CONTACT_NOTES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetContactNotesOpcode );
DEFINE_HANDLER(CMSG_SET_CONTACT_NOTES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::SetContactNotes, &WorldSession::HandleSetContactNotesOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_CURRENCY_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_DIFFICULTY_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_SET_DUNGEON_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetDungeonDifficulty, &WorldSession::HandleSetDungeonDifficultyOpcode);
@@ -892,6 +889,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUseItemOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel);
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOICE_ADD_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOICE_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOICE_SESSION_ENABLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleVoiceSessionEnableOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOID_STORAGE_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleVoidStorageQuery );
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOID_STORAGE_TRANSFER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleVoidStorageTransfer );
@@ -1164,8 +1163,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMSAT_RECONNECT_TRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSOLE_WRITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONVERT_RUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_CHEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1237,7 +1236,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_DISPLAY_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_OBJECT_RELINK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORGE_MASTER_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_ACTIVATE_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_CUSTOM_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+2 -5
View File
@@ -55,8 +55,6 @@ enum OpcodeClient : uint32
CMSG_ADD_BATTLENET_FRIEND = 0x0B36,
CMSG_ADD_FRIEND = 0x0DB9,
CMSG_ADD_IGNORE = 0x1321,
CMSG_ADD_MUTE = 0x098A,
CMSG_ADD_VOICE_IGNORE = 0xBADD,
CMSG_ALTER_APPEARANCE = 0x13E9,
CMSG_AREATRIGGER = 0x01B4,
CMSG_AREA_SPIRIT_HEALER_QUERY = 0x0A08,
@@ -237,8 +235,6 @@ enum OpcodeClient : uint32
CMSG_DELETE_EQUIPMENT_SET = 0x03C3,
CMSG_DEL_FRIEND = 0x0F2A,
CMSG_DEL_IGNORE = 0x033D,
CMSG_DEL_MUTE = 0x0128,
CMSG_DEL_VOICE_IGNORE = 0xBADD,
CMSG_DEPOSIT_REAGENT_BANK = 0x039B,
CMSG_DESTROY_ITEM = 0x01EE,
CMSG_DF_BOOT_PLAYER_VOTE = 0x0308,
@@ -796,6 +792,8 @@ enum OpcodeClient : uint32
CMSG_USE_ITEM = 0x08B6,
CMSG_USE_TOY = 0x16E2,
CMSG_VIOLENCE_LEVEL = 0x098D,
CMSG_VOICE_ADD_IGNORE = 0x098A,
CMSG_VOICE_DEL_IGNORE = 0x0128,
CMSG_VOICE_SESSION_ENABLE = 0x1102,
CMSG_VOID_STORAGE_QUERY = 0x019E,
CMSG_VOID_STORAGE_TRANSFER = 0x0463,
@@ -1139,7 +1137,6 @@ enum OpcodeServer : uint32
SMSG_FORCE_DISPLAY_UPDATE = 0xBADD,
SMSG_FORCE_OBJECT_RELINK = 0x059D,
SMSG_FORGE_MASTER_SET = 0xBADD,
SMSG_FRIEND_STATUS = 0xBADD,
SMSG_GAMEOBJECT_ACTIVATE_ANIM_KIT = 0x038C,
SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x03EB,
SMSG_GAMEOBJECT_DESPAWN = 0x0D29,
+1 -1
View File
@@ -584,7 +584,7 @@ void WorldSession::LogoutPlayer(bool save)
//! Broadcast a logout message to the player's friends
sSocialMgr->SendFriendStatus(_player, FRIEND_OFFLINE, _player->GetGUID(), true);
sSocialMgr->RemovePlayerSocial(_player->GetGUID());
_player->RemoveSocial();
//! Call script hook before deletion
sScriptMgr->OnPlayerLogout(_player);
+19 -6
View File
@@ -266,6 +266,16 @@ namespace WorldPackets
class QuestGiverQueryQuest;
}
namespace Social
{
class AddFriend;
class AddIgnore;
class DelFriend;
class DelIgnore;
class SendContactList;
class SetContactNotes;
}
namespace Spells
{
class CancelAura;
@@ -777,14 +787,17 @@ class WorldSession
void HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet);
void HandleStandStateChangeOpcode(WorldPackets::Misc::StandStateChange& packet);
void HandleEmoteOpcode(WorldPacket& recvPacket);
void HandleContactListOpcode(WorldPacket& recvPacket);
void HandleAddFriendOpcode(WorldPacket& recvPacket);
// Social
void HandleContactListOpcode(WorldPackets::Social::SendContactList& packet);
void HandleAddFriendOpcode(WorldPackets::Social::AddFriend& packet);
void HandleAddFriendOpcodeCallBack(PreparedQueryResult result, std::string const& friendNote);
void HandleDelFriendOpcode(WorldPacket& recvPacket);
void HandleAddIgnoreOpcode(WorldPacket& recvPacket);
void HandleDelFriendOpcode(WorldPackets::Social::DelFriend& packet);
void HandleAddIgnoreOpcode(WorldPackets::Social::AddIgnore& packet);
void HandleAddIgnoreOpcodeCallBack(PreparedQueryResult result);
void HandleDelIgnoreOpcode(WorldPacket& recvPacket);
void HandleSetContactNotesOpcode(WorldPacket& recvPacket);
void HandleDelIgnoreOpcode(WorldPackets::Social::DelIgnore& packet);
void HandleSetContactNotesOpcode(WorldPackets::Social::SetContactNotes& packet);
void HandleBugReportOpcode(WorldPacket& recvPacket);
void HandleAreaTriggerOpcode(WorldPackets::Misc::AreaTrigger& packet);
@@ -430,8 +430,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent) VALUES (?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_GENDER_PLAYERBYTES, "UPDATE characters SET gender = ?, playerBytes = ?, playerBytes2 = ? 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);
@@ -471,7 +470,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);
@@ -362,8 +362,7 @@ enum CharacterDatabaseStatements
CHAR_INS_CHAR_INSTANCE,
CHAR_UPD_GENDER_PLAYERBYTES,
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,