diff options
author | joschiwald <joschiwald.trinity@gmail.com> | 2015-02-08 02:51:49 +0100 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2015-02-08 02:51:49 +0100 |
commit | e01bb918875f88ede211fc13ff3908e30249de33 (patch) | |
tree | b4f97cdae4b08103833b5cabd6f9773d2f452721 /src | |
parent | 8fd7f80b6b20071227e849365709ab3f6403efb4 (diff) |
Core/Packets: updated some contactlist packets
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 7 | ||||
-rw-r--r-- | src/server/game/Entities/Player/SocialMgr.cpp | 228 | ||||
-rw-r--r-- | src/server/game/Entities/Player/SocialMgr.h | 76 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 177 | ||||
-rw-r--r-- | src/server/game/Handlers/SocialHandler.cpp | 164 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Language.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SocialPackets.cpp | 147 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SocialPackets.h | 168 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 7 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 25 | ||||
-rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.cpp | 5 | ||||
-rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.h | 3 |
16 files changed, 655 insertions, 401 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 84197b90626..a26a728de81 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -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; +} diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ec8c5933e25..e3e927bee7b 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -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; diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index 3b7eba89b58..9d91f8792a4 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -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; + + 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()); 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::HasFriend(ObjectGuid const& 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 const& 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); +} -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(); - - friendGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); - flags = fields[1].GetUInt8(); - note = fields[2].GetString(); + do + { + Field* fields = result->Fetch(); - social->m_playerSocialMap[friendGuid] = FriendInfo(flags, note); + ObjectGuid friendGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); - // 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; } diff --git a/src/server/game/Entities/Player/SocialMgr.h b/src/server/game/Entities/Player/SocialMgr.h index 8f389d4afdf..d4ac04b08ed 100644 --- a/src/server/game/Entities/Player/SocialMgr.h +++ b/src/server/game/Entities/Player/SocialMgr.h @@ -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 diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 53b3208b771..0af8f69c0ad 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -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; diff --git a/src/server/game/Handlers/SocialHandler.cpp b/src/server/game/Handlers/SocialHandler.cpp new file mode 100644 index 00000000000..af3a38f92c6 --- /dev/null +++ b/src/server/game/Handlers/SocialHandler.cpp @@ -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); +} diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index af02c1af6f3..ef4035469a9 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -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, diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 422bd749d82..dbd14c469f4 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -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() { diff --git a/src/server/game/Server/Packets/SocialPackets.cpp b/src/server/game/Server/Packets/SocialPackets.cpp new file mode 100644 index 00000000000..9f87bf4414f --- /dev/null +++ b/src/server/game/Server/Packets/SocialPackets.cpp @@ -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; +} diff --git a/src/server/game/Server/Packets/SocialPackets.h b/src/server/game/Server/Packets/SocialPackets.h new file mode 100644 index 00000000000..fb562619b11 --- /dev/null +++ b/src/server/game/Server/Packets/SocialPackets.h @@ -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__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index e2c097c8fc4..039e73a2e7d 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -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); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index ba2914c7901..394448a21b2 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -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, diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index b61a0237ac2..114b303e7f4 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -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); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index d90cb1f1770..b2c2e94534e 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -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); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 727a03b85f1..899d1a0e743 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -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); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index 3dee607da48..003d32fbc07 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -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, |