diff options
23 files changed, 721 insertions, 629 deletions
diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 7695ab45de0..e2b6b16c9f2 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -31,18 +31,16 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): _IsSaved(false), _flags(0), _channelId(channelId), - _Team(team), - _ownerGUID(), - _name(name), - _password("") + _team(team), + _name(name) { // set special flags if built-in channel if (ChatChannelsEntry const* ch = sChatChannelsStore.LookupEntry(channelId)) // check whether it's a built-in channel { - _announce = false; // no join/leave announces - _ownership = false; // no ownership handout + _announce = false; // no join/leave announces + _ownership = false; // no ownership handout - _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels + _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels if (ch->Flags & CHANNEL_DBC_FLAG_TRADE) // for trade channel _flags |= CHANNEL_FLAG_TRADE; @@ -62,31 +60,31 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): // If storing custom channels in the db is enabled either load or save the channel if (sWorld->getBoolConfig(CONFIG_PRESERVE_CUSTOM_CHANNELS)) { - PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL); - stmt->setString(0, name); - stmt->setUInt32(1, _Team); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL); + stmt->setString(0, _name); + stmt->setUInt32(1, _team); PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (result) //load + if (result) // load { Field* fields = result->Fetch(); _announce = fields[0].GetBool(); _ownership = fields[1].GetBool(); _password = fields[2].GetString(); - const char* db_BannedList = fields[3].GetCString(); + std::string bannedList = fields[3].GetString(); - if (db_BannedList) + if (!bannedList.empty()) { - Tokenizer tokens(db_BannedList, ' '); + Tokenizer tokens(bannedList, ' '); for (Tokenizer::const_iterator i = tokens.begin(); i != tokens.end(); ++i) { std::string bannedGuidStr(*i); - ObjectGuid banned_guid; - banned_guid.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), NULL, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), NULL, 16))); - if (!banned_guid.IsEmpty()) + ObjectGuid bannedGuid; + bannedGuid.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), nullptr, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), nullptr, 16))); + if (!bannedGuid.IsEmpty()) { - TC_LOG_DEBUG("chat.system", "Channel(%s) loaded bannedStore %s", name.c_str(), banned_guid.ToString().c_str()); - bannedStore.insert(banned_guid); + TC_LOG_DEBUG("chat.system", "Channel (%s) loaded bannedStore %s", _name.c_str(), bannedGuid.ToString().c_str()); + _bannedStore.insert(bannedGuid); } } } @@ -94,10 +92,10 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): else // save { stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHANNEL); - stmt->setString(0, name); - stmt->setUInt32(1, _Team); + stmt->setString(0, _name); + stmt->setUInt32(1, _team); CharacterDatabase.Execute(stmt); - TC_LOG_DEBUG("chat.system", "Channel(%s) saved in database", name.c_str()); + TC_LOG_DEBUG("chat.system", "Channel (%s) saved in database", _name.c_str()); } _IsSaved = true; @@ -110,22 +108,19 @@ void Channel::UpdateChannelInDB() const if (_IsSaved) { std::ostringstream banlist; - BannedContainer::const_iterator iter; - for (iter = bannedStore.begin(); iter != bannedStore.end(); ++iter) - banlist << *iter << ' '; - - std::string banListStr = banlist.str(); + for (ObjectGuid const& guid : _bannedStore) + banlist << guid << ' '; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL); stmt->setBool(0, _announce); stmt->setBool(1, _ownership); stmt->setString(2, _password); - stmt->setString(3, banListStr); + stmt->setString(3, banlist.str()); stmt->setString(4, _name); - stmt->setUInt32(5, _Team); + stmt->setUInt32(5, _team); CharacterDatabase.Execute(stmt); - TC_LOG_DEBUG("chat.system", "Channel(%s) updated in database", _name.c_str()); + TC_LOG_DEBUG("chat.system", "Channel (%s) updated in database", _name.c_str()); } } @@ -133,7 +128,7 @@ void Channel::UpdateChannelUseageInDB() const { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_USAGE); stmt->setString(0, _name); - stmt->setUInt32(1, _Team); + stmt->setUInt32(1, _team); CharacterDatabase.Execute(stmt); } @@ -151,32 +146,32 @@ void Channel::CleanOldChannelsInDB() void Channel::JoinChannel(Player* player, std::string const& pass) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (IsOn(guid)) { // Do not send error message for built-in channels if (!IsConstant()) { - WorldPacket data; - MakePlayerAlreadyMember(&data, guid); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerAlreadyMember(notify, guid); + player->SendDirectMessage(notify.Write()); } return; } if (IsBanned(guid)) { - WorldPacket data; - MakeBanned(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeBanned(notify); + player->SendDirectMessage(notify.Write()); return; } if (!_password.empty() && pass != _password) { - WorldPacket data; - MakeWrongPassword(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeWrongPassword(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -185,9 +180,9 @@ void Channel::JoinChannel(Player* player, std::string const& pass) AccountMgr::IsPlayerAccount(player->GetSession()->GetSecurity()) && //FIXME: Move to RBAC player->GetGroup()) { - WorldPacket data; - MakeNotInLfg(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotInLfg(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -195,73 +190,90 @@ void Channel::JoinChannel(Player* player, std::string const& pass) if (_announce && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakeJoined(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeJoined(notify, guid); + SendToAll(notify.Write()); } - PlayerInfo pinfo; - pinfo.player = guid; - pinfo.flags = MEMBER_FLAG_NONE; - playersStore[guid] = pinfo; + PlayerInfo playerInfo; + playerInfo.PlayerGuid = guid; + _playersStore[guid] = playerInfo; - WorldPacket data; - MakeYouJoined(&data); - SendToOne(&data, guid); + /* + WorldPackets::Channel::ChannelNotify notify; + MakeYouJoined(notify); + player->SendDirectMessage(notify.Write()); + */ - JoinNotify(guid); + WorldPackets::Channel::ChannelNotifyJoined notify; + //notify.ChannelWelcomeMsg = ""; + notify.ChatChannelID = _channelId; + //notify.InstanceID = 0; + notify.ChannelFlags = _flags; + notify.Channel = _name; + player->SendDirectMessage(notify.Write()); + + JoinNotify(player); // Custom channel handling if (!IsConstant()) { // Update last_used timestamp in db - if (!playersStore.empty()) + if (!_playersStore.empty()) UpdateChannelUseageInDB(); // If the channel has no owner yet and ownership is allowed, set the new owner. - if (!_ownerGUID && _ownership) + if (_ownerGUID.IsEmpty() && _ownership) { - SetOwner(guid, playersStore.size() > 1); - playersStore[guid].SetModerator(true); + SetOwner(guid, _playersStore.size() > 1); + _playersStore[guid].SetModerator(true); } } } void Channel::LeaveChannel(Player* player, bool send) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { if (send) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); } return; } + player->LeftChannel(this); + if (send) { - WorldPacket data; - MakeYouLeft(&data); - SendToOne(&data, guid); - player->LeftChannel(this); - data.clear(); + /* + WorldPackets::Channel::ChannelNotify notify; + MakeYouLeft(notify); + player->SendDirectMessage(notify.Write()); + */ + + WorldPackets::Channel::ChannelNotifyLeft notify; + notify.Channel = _name; + notify.ChatChannelID = 0; + //notify.Suspended = false; + player->SendDirectMessage(notify.Write()); } - bool changeowner = playersStore[guid].IsOwner(); + bool changeowner = _playersStore[guid].IsOwner(); - playersStore.erase(guid); + _playersStore.erase(guid); if (_announce && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakeLeft(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeLeft(notify, guid); + SendToAll(notify.Write()); } - LeaveNotify(guid); + LeaveNotify(player); if (!IsConstant()) { @@ -269,10 +281,10 @@ void Channel::LeaveChannel(Player* player, bool send) UpdateChannelUseageInDB(); // If the channel owner left and there are still playersStore inside, pick a new owner - if (changeowner && _ownership && !playersStore.empty()) + if (changeowner && _ownership && !_playersStore.empty()) { - ObjectGuid newowner = playersStore.begin()->second.player; - playersStore[newowner].SetModerator(true); + ObjectGuid const& newowner = _playersStore.begin()->second.PlayerGuid; + _playersStore[newowner].SetModerator(true); SetOwner(newowner); } } @@ -280,21 +292,21 @@ void Channel::LeaveChannel(Player* player, bool send) void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban) { - ObjectGuid good = player->GetGUID(); + ObjectGuid const& good = player->GetGUID(); if (!IsOn(good)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -302,9 +314,9 @@ void Channel::KickOrBan(Player const* player, std::string const& badname, bool b ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty; if (!victim || !IsOn(victim)) { - WorldPacket data; - MakePlayerNotFound(&data, badname); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, badname); + player->SendDirectMessage(notify.Write()); return; } @@ -312,154 +324,152 @@ void Channel::KickOrBan(Player const* player, std::string const& badname, bool b if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && changeowner && good != _ownerGUID) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } if (ban && !IsBanned(victim)) { - bannedStore.insert(victim); + _bannedStore.insert(victim); UpdateChannelInDB(); if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakePlayerBanned(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerBanned(notify, victim, good); + SendToAll(notify.Write()); } } else if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakePlayerKicked(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerKicked(notify, victim, good); + SendToAll(notify.Write()); } - playersStore.erase(victim); + _playersStore.erase(victim); bad->LeftChannel(this); - if (changeowner && _ownership && !playersStore.empty()) + if (changeowner && _ownership && !_playersStore.empty()) { - ObjectGuid newowner = good; - playersStore[newowner].SetModerator(true); - SetOwner(newowner); + _playersStore[good].SetModerator(true); + SetOwner(good); } } void Channel::UnBan(Player const* player, std::string const& badname) { - ObjectGuid good = player->GetGUID(); + ObjectGuid const& good = player->GetGUID(); if (!IsOn(good)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } Player* bad = ObjectAccessor::FindConnectedPlayerByName(badname); ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty; - if (!victim || !IsBanned(victim)) + if (victim.IsEmpty() || !IsBanned(victim)) { - WorldPacket data; - MakePlayerNotFound(&data, badname); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, badname); + player->SendDirectMessage(notify.Write()); return; } - bannedStore.erase(victim); + _bannedStore.erase(victim); - WorldPacket data; - MakePlayerUnbanned(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerUnbanned(notify, victim, good); + SendToAll(notify.Write()); UpdateChannelInDB(); } void Channel::Password(Player const* player, std::string const& pass) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); - ChatHandler chat(player->GetSession()); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } _password = pass; - WorldPacket data; - MakePasswordChanged(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePasswordChanged(notify, guid); + SendToAll(notify.Write()); UpdateChannelInDB(); } void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bool set) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } - if (guid == _ownerGUID && std::string(p2n) == player->GetName() && mod) + if (guid == _ownerGUID && p2n == player->GetName() && mod) return; Player* newp = ObjectAccessor::FindConnectedPlayerByName(p2n); ObjectGuid victim = newp ? newp->GetGUID() : ObjectGuid::Empty; - if (!victim || !IsOn(victim) || + if (victim.IsEmpty() || !IsOn(victim) || (player->GetTeam() != newp->GetTeam() && (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL)))) { - WorldPacket data; - MakePlayerNotFound(&data, p2n); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, p2n); + player->SendDirectMessage(notify.Write()); return; } if (_ownerGUID == victim && _ownerGUID != guid) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -471,21 +481,21 @@ void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bo void Channel::SetOwner(Player const* player, std::string const& newname) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && guid != _ownerGUID) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -497,55 +507,49 @@ void Channel::SetOwner(Player const* player, std::string const& newname) (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL)))) { - WorldPacket data; - MakePlayerNotFound(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, newname); + player->SendDirectMessage(notify.Write()); return; } - playersStore[victim].SetModerator(true); + _playersStore[victim].SetModerator(true); SetOwner(victim); } -void Channel::SendWhoOwner(ObjectGuid guid) +void Channel::SendWhoOwner(Player const* player) { - WorldPacket data; - if (IsOn(guid)) - MakeChannelOwner(&data); + WorldPackets::Channel::ChannelNotify notify; + if (IsOn(player->GetGUID())) + MakeChannelOwner(notify); else - MakeNotMember(&data); - SendToOne(&data, guid); + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); } void Channel::List(Player const* player) { - ObjectGuid guid = player->GetGUID(); - - if (!IsOn(guid)) + if (!IsOn(player->GetGUID())) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } TC_LOG_DEBUG("chat.system", "SMSG_CHANNEL_LIST %s Channel: %s", player->GetSession()->GetPlayerInfo().c_str(), GetName().c_str()); - WorldPacket data(SMSG_CHANNEL_LIST, 1+(GetName().size()+1)+1+4+playersStore.size()*(8+1)); - data << uint8(1); // channel type? - data << GetName(); // channel name - data << uint8(GetFlags()); // channel flags? - - size_t pos = data.wpos(); - data << uint32(0); // size of list, placeholder + WorldPackets::Channel::ChannelListResponse list; + list.Display = true; /// always true? + list.Channel = GetName(); + list.ChannelFlags = GetFlags(); uint32 gmLevelInWhoList = sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST); - uint32 count = 0; - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) + for (PlayerContainer::value_type const& i : _playersStore) { - Player* member = ObjectAccessor::FindConnectedPlayer(i->first); + Player* member = ObjectAccessor::FindConnectedPlayer(i.first); // PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all @@ -554,50 +558,46 @@ void Channel::List(Player const* player) member->GetSession()->GetSecurity() <= AccountTypes(gmLevelInWhoList)) && member->IsVisibleGloballyFor(player)) { - data << i->first; - data << uint8(i->second.flags); // flags seems to be changed... - ++count; + list.Members.emplace_back(i.second.PlayerGuid, GetVirtualRealmAddress(), i.second.GetFlags()); } } - data.put<uint32>(pos, count); - - SendToOne(&data, guid); + player->SendDirectMessage(list.Write()); } void Channel::Announce(Player const* player) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } _announce = !_announce; - WorldPacket data; + WorldPackets::Channel::ChannelNotify notify; if (_announce) - MakeAnnouncementsOn(&data, guid); + MakeAnnouncementsOn(notify, guid); else - MakeAnnouncementsOff(&data, guid); - SendToAll(&data); + MakeAnnouncementsOff(notify, guid); + SendToAll(notify.Write()); UpdateChannelInDB(); } -void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) +void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang) { if (what.empty()) return; @@ -608,17 +608,17 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + SendToOne(notify.Write(), guid); return; } - if (playersStore[guid].IsMuted()) + if (_playersStore[guid].IsMuted()) { - WorldPacket data; - MakeMuted(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeMuted(notify); + SendToOne(notify.Write(), guid); return; } @@ -632,35 +632,35 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) packet.TargetGUID = guid; } - SendToAll(packet.Write(), !playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty); + SendToAll(packet.Write(), !_playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty); } void Channel::Invite(Player const* player, std::string const& newname) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } Player* newp = ObjectAccessor::FindConnectedPlayerByName(newname); if (!newp || !newp->isGMVisible()) { - WorldPacket data; - MakePlayerNotFound(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, newname); + player->SendDirectMessage(notify.Write()); return; } if (IsBanned(newp->GetGUID())) { - WorldPacket data; - MakePlayerInviteBanned(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerInviteBanned(notify, newname); + player->SendDirectMessage(notify.Write()); return; } @@ -668,169 +668,167 @@ void Channel::Invite(Player const* player, std::string const& newname) (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL))) { - WorldPacket data; - MakeInviteWrongFaction(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeInviteWrongFaction(notify); + player->SendDirectMessage(notify.Write()); return; } if (IsOn(newp->GetGUID())) { - WorldPacket data; - MakePlayerAlreadyMember(&data, newp->GetGUID()); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerAlreadyMember(notify, newp->GetGUID()); + player->SendDirectMessage(notify.Write()); return; } if (!newp->GetSocial()->HasIgnore(guid)) { - WorldPacket data; - MakeInvite(&data, guid); - SendToOne(&data, newp->GetGUID()); - data.clear(); + WorldPackets::Channel::ChannelNotify notify; + MakeInvite(notify, guid); + newp->SendDirectMessage(notify.Write()); } - WorldPacket data; - MakePlayerInvited(&data, newp->GetName()); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerInvited(notify, newp->GetName()); + player->SendDirectMessage(notify.Write()); } -void Channel::SetOwner(ObjectGuid guid, bool exclaim) +void Channel::SetOwner(ObjectGuid const& guid, bool exclaim) { if (!_ownerGUID.IsEmpty()) { // [] will re-add player after it possible removed - PlayerContainer::iterator p_itr = playersStore.find(_ownerGUID); - if (p_itr != playersStore.end()) - p_itr->second.SetOwner(false); + PlayerContainer::iterator itr = _playersStore.find(_ownerGUID); + if (itr != _playersStore.end()) + itr->second.SetOwner(false); } _ownerGUID = guid; if (!_ownerGUID.IsEmpty()) { - uint8 oldFlag = GetPlayerFlags(_ownerGUID); - playersStore[_ownerGUID].SetModerator(true); - playersStore[_ownerGUID].SetOwner(true); + uint8 oldFlag = _playersStore[_ownerGUID].GetFlags(); + _playersStore[_ownerGUID].SetModerator(true); + _playersStore[_ownerGUID].SetOwner(true); - WorldPacket data; - MakeModeChange(&data, _ownerGUID, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeModeChange(notify, _ownerGUID, oldFlag, _playersStore[_ownerGUID].GetFlags()); + SendToAll(notify.Write()); if (exclaim) { - MakeOwnerChanged(&data, _ownerGUID); - SendToAll(&data); + MakeOwnerChanged(notify, _ownerGUID); + SendToAll(notify.Write()); } UpdateChannelInDB(); } } -void Channel::SendToAll(WorldPacket const* data, ObjectGuid guid) +void Channel::SendToAll(WorldPacket const* data, ObjectGuid const& guid) { - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) - if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first)) - if (!guid || !player->GetSocial()->HasIgnore(guid)) - player->GetSession()->SendPacket(data); + for (PlayerContainer::value_type const& i : _playersStore) + if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) + if (guid.IsEmpty() || !player->GetSocial()->HasIgnore(guid)) + player->SendDirectMessage(data); } -void Channel::SendToAllButOne(WorldPacket const* data, ObjectGuid who) +void Channel::SendToAllButOne(WorldPacket const* data, ObjectGuid const& who) { - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) - if (i->first != who) - if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first)) - player->GetSession()->SendPacket(data); + for (PlayerContainer::value_type const& i : _playersStore) + if (i.first != who) + if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) + player->SendDirectMessage(data); } -void Channel::SendToOne(WorldPacket const* data, ObjectGuid who) +void Channel::SendToOne(WorldPacket const* data, ObjectGuid const& who) { if (Player* player = ObjectAccessor::FindConnectedPlayer(who)) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); } -void Channel::Voice(ObjectGuid /*guid1*/, ObjectGuid /*guid2*/) +void Channel::Voice(ObjectGuid const& /*guid1*/, ObjectGuid const& /*guid2*/) { } -void Channel::DeVoice(ObjectGuid /*guid1*/, ObjectGuid /*guid2*/) +void Channel::DeVoice(ObjectGuid const& /*guid1*/, ObjectGuid const& /*guid2*/) { } -void Channel::MakeNotifyPacket(WorldPacket* data, uint8 notify_type) +void Channel::MakeNotifyPacket(WorldPackets::Channel::ChannelNotify& data, uint8 notifyType) { - data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + _name.size()); - *data << uint8(notify_type); - *data << _name; + data.Type = notifyType; + data.Channel = _name; } -void Channel::MakeJoined(WorldPacket* data, ObjectGuid guid) +void Channel::MakeJoined(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_JOINED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeLeft(WorldPacket* data, ObjectGuid guid) +void Channel::MakeLeft(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_LEFT_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeYouJoined(WorldPacket* data) +void Channel::MakeYouJoined(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_YOU_JOINED_NOTICE); - *data << uint8(GetFlags()); - *data << uint32(GetChannelId()); - *data << uint32(0); + //*data << uint8(GetFlags()); + data.ChatChannelID = GetChannelId(); + //*data << uint32(0); } -void Channel::MakeYouLeft(WorldPacket* data) +void Channel::MakeYouLeft(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_YOU_LEFT_NOTICE); - *data << uint32(GetChannelId()); - *data << uint8(IsConstant()); + data.ChatChannelID = GetChannelId(); + //*data << uint8(IsConstant()); } -void Channel::MakeWrongPassword(WorldPacket* data) +void Channel::MakeWrongPassword(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_WRONG_PASSWORD_NOTICE); } -void Channel::MakeNotMember(WorldPacket* data) +void Channel::MakeNotMember(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MEMBER_NOTICE); } -void Channel::MakeNotModerator(WorldPacket* data) +void Channel::MakeNotModerator(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MODERATOR_NOTICE); } -void Channel::MakePasswordChanged(WorldPacket* data, ObjectGuid guid) +void Channel::MakePasswordChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_PASSWORD_CHANGED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeOwnerChanged(WorldPacket* data, ObjectGuid guid) +void Channel::MakeOwnerChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_OWNER_CHANGED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakePlayerNotFound(WorldPacket* data, std::string const& name) +void Channel::MakePlayerNotFound(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_NOT_FOUND_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakeNotOwner(WorldPacket* data) +void Channel::MakeNotOwner(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_OWNER_NOTICE); } -void Channel::MakeChannelOwner(WorldPacket* data) +void Channel::MakeChannelOwner(WorldPackets::Channel::ChannelNotify& data) { std::string name; @@ -838,139 +836,140 @@ void Channel::MakeChannelOwner(WorldPacket* data) name = "PLAYER_NOT_FOUND"; MakeNotifyPacket(data, CHAT_CHANNEL_OWNER_NOTICE); - *data << ((IsConstant() || !_ownerGUID) ? "Nobody" : name); + data.Sender = ((IsConstant() || !_ownerGUID) ? "Nobody" : name); } -void Channel::MakeModeChange(WorldPacket* data, ObjectGuid guid, uint8 oldflags) +void Channel::MakeModeChange(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags) { MakeNotifyPacket(data, CHAT_MODE_CHANGE_NOTICE); - *data << guid; - *data << uint8(oldflags); - *data << uint8(GetPlayerFlags(guid)); + data.SenderGuid = guid; + data.OldFlags = oldFlags; + data.NewFlags = newFlags; } -void Channel::MakeAnnouncementsOn(WorldPacket* data, ObjectGuid guid) +void Channel::MakeAnnouncementsOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_ANNOUNCEMENTS_ON_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeAnnouncementsOff(WorldPacket* data, ObjectGuid guid) +void Channel::MakeAnnouncementsOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_ANNOUNCEMENTS_OFF_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeMuted(WorldPacket* data) +void Channel::MakeMuted(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_MUTED_NOTICE); } -void Channel::MakePlayerKicked(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerKicked(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_KICKED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakeBanned(WorldPacket* data) +void Channel::MakeBanned(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_BANNED_NOTICE); } -void Channel::MakePlayerBanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerBanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_BANNED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerUnbanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_UNBANNED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakePlayerNotBanned(WorldPacket* data, const std::string &name) +void Channel::MakePlayerNotBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_NOT_BANNED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakePlayerAlreadyMember(WorldPacket* data, ObjectGuid guid) +void Channel::MakePlayerAlreadyMember(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_PLAYER_ALREADY_MEMBER_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeInvite(WorldPacket* data, ObjectGuid guid) +void Channel::MakeInvite(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_INVITE_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeInviteWrongFaction(WorldPacket* data) +void Channel::MakeInviteWrongFaction(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_INVITE_WRONG_FACTION_NOTICE); } -void Channel::MakeWrongFaction(WorldPacket* data) +void Channel::MakeWrongFaction(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_WRONG_FACTION_NOTICE); } -void Channel::MakeInvalidName(WorldPacket* data) +void Channel::MakeInvalidName(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_INVALID_NAME_NOTICE); } -void Channel::MakeNotModerated(WorldPacket* data) +void Channel::MakeNotModerated(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MODERATED_NOTICE); } -void Channel::MakePlayerInvited(WorldPacket* data, const std::string& name) +void Channel::MakePlayerInvited(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_INVITED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakePlayerInviteBanned(WorldPacket* data, const std::string& name) +void Channel::MakePlayerInviteBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_INVITE_BANNED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakeThrottled(WorldPacket* data) +void Channel::MakeThrottled(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_THROTTLED_NOTICE); } -void Channel::MakeNotInArea(WorldPacket* data) +void Channel::MakeNotInArea(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_IN_AREA_NOTICE); } -void Channel::MakeNotInLfg(WorldPacket* data) +void Channel::MakeNotInLfg(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_IN_LFG_NOTICE); } -void Channel::MakeVoiceOn(WorldPacket* data, ObjectGuid guid) +void Channel::MakeVoiceOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_VOICE_ON_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeVoiceOff(WorldPacket* data, ObjectGuid guid) +void Channel::MakeVoiceOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_VOICE_OFF_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::JoinNotify(ObjectGuid guid) +void Channel::JoinNotify(Player const* player) { + ObjectGuid const& guid = player->GetGUID(); WorldPacket data(IsConstant() ? SMSG_USERLIST_ADD : SMSG_USERLIST_UPDATE, 8 + 1 + 1 + 4 + GetName().size()); data << guid; data << uint8(GetPlayerFlags(guid)); @@ -984,8 +983,9 @@ void Channel::JoinNotify(ObjectGuid guid) SendToAll(&data); } -void Channel::LeaveNotify(ObjectGuid guid) +void Channel::LeaveNotify(Player const* player) { + ObjectGuid const& guid = player->GetGUID(); WorldPacket data(SMSG_USERLIST_REMOVE, 8 + 1 + 4 + GetName().size()); data << guid; data << uint8(GetFlags()); diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index f1f01e64f44..4ee83b8fbb2 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -19,14 +19,11 @@ #ifndef _CHANNEL_H #define _CHANNEL_H -#include <list> -#include <map> -#include <string> - #include "Common.h" #include "WorldSession.h" -#include "WorldPacket.h" + +#include "Packets/ChannelPackets.h" class Player; @@ -122,33 +119,47 @@ class Channel { struct PlayerInfo { - ObjectGuid player; - uint8 flags; + ObjectGuid PlayerGuid; + + uint8 GetFlags() const { return _flags; } + inline bool HasFlag(uint8 flag) const { return (_flags & flag) != 0; } + inline void SetFlag(uint8 flag) { _flags |= flag; } + inline void RemoveFlag(uint8 flag) { _flags &= ~flag; } - bool HasFlag(uint8 flag) const { return (flags & flag) != 0; } - void SetFlag(uint8 flag) { flags |= flag; } - bool IsOwner() const { return (flags & MEMBER_FLAG_OWNER) != 0; } + bool IsOwner() const { return HasFlag(MEMBER_FLAG_OWNER); } void SetOwner(bool state) { - if (state) flags |= MEMBER_FLAG_OWNER; - else flags &= ~MEMBER_FLAG_OWNER; + if (state) + SetFlag(MEMBER_FLAG_OWNER); + else + RemoveFlag(MEMBER_FLAG_OWNER); } - bool IsModerator() const { return (flags & MEMBER_FLAG_MODERATOR) != 0; } + + bool IsModerator() const { return HasFlag(MEMBER_FLAG_MODERATOR); } void SetModerator(bool state) { - if (state) flags |= MEMBER_FLAG_MODERATOR; - else flags &= ~MEMBER_FLAG_MODERATOR; + if (state) + SetFlag(MEMBER_FLAG_MODERATOR); + else + RemoveFlag(MEMBER_FLAG_MODERATOR); } - bool IsMuted() const { return (flags & MEMBER_FLAG_MUTED) != 0; } + + bool IsMuted() const { return HasFlag(MEMBER_FLAG_MUTED); } void SetMuted(bool state) { - if (state) flags |= MEMBER_FLAG_MUTED; - else flags &= ~MEMBER_FLAG_MUTED; + if (state) + SetFlag(MEMBER_FLAG_MUTED); + else + RemoveFlag(MEMBER_FLAG_MUTED); } + + private: + uint8 _flags = MEMBER_FLAG_NONE; }; public: Channel(std::string const& name, uint32 channel_id, uint32 Team = 0); + std::string const& GetName() const { return _name; } uint32 GetChannelId() const { return _channelId; } bool IsConstant() const { return _channelId != 0; } @@ -157,7 +168,7 @@ class Channel std::string const& GetPassword() const { return _password; } void SetPassword(std::string const& npassword) { _password = npassword; } void SetAnnounce(bool nannounce) { _announce = nannounce; } - uint32 GetNumPlayers() const { return playersStore.size(); } + uint32 GetNumPlayers() const { return _playersStore.size(); } uint8 GetFlags() const { return _flags; } bool HasFlag(uint8 flag) const { return (_flags & flag) != 0; } @@ -169,102 +180,102 @@ class Channel void UnBan(Player const* player, std::string const& badname); void Password(Player const* player, std::string const& pass); void SetMode(Player const* player, std::string const& p2n, bool mod, bool set); - void SetOwner(ObjectGuid guid, bool exclaim = true); + void SetOwner(ObjectGuid const& guid, bool exclaim = true); void SetOwner(Player const* player, std::string const& name); - void SendWhoOwner(ObjectGuid guid); + void SendWhoOwner(Player const* player); void SetModerator(Player const* player, std::string const& newname) { SetMode(player, newname, true, true); } void UnsetModerator(Player const* player, std::string const& newname) { SetMode(player, newname, true, false); } void SetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, true); } void UnsetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, false); } void List(Player const* player); void Announce(Player const* player); - void Say(ObjectGuid guid, std::string const& what, uint32 lang); + void Say(ObjectGuid const& guid, std::string const& what, uint32 lang); void Invite(Player const* player, std::string const& newp); - void Voice(ObjectGuid guid1, ObjectGuid guid2); - void DeVoice(ObjectGuid guid1, ObjectGuid guid2); - void JoinNotify(ObjectGuid guid); // invisible notify - void LeaveNotify(ObjectGuid guid); // invisible notify + void Voice(ObjectGuid const& guid1, ObjectGuid const& guid2); + void DeVoice(ObjectGuid const& guid1, ObjectGuid const& guid2); + void JoinNotify(Player const* player); + void LeaveNotify(Player const* player); void SetOwnership(bool ownership) { _ownership = ownership; }; static void CleanOldChannelsInDB(); private: // initial packet data (notify type and channel name) - void MakeNotifyPacket(WorldPacket* data, uint8 notify_type); + void MakeNotifyPacket(WorldPackets::Channel::ChannelNotify& data, uint8 notifyType); // type specific packet data - void MakeJoined(WorldPacket* data, ObjectGuid guid); //+ 0x00 - void MakeLeft(WorldPacket* data, ObjectGuid guid); //+ 0x01 - void MakeYouJoined(WorldPacket* data); //+ 0x02 - void MakeYouLeft(WorldPacket* data); //+ 0x03 - void MakeWrongPassword(WorldPacket* data); //? 0x04 - void MakeNotMember(WorldPacket* data); //? 0x05 - void MakeNotModerator(WorldPacket* data); //? 0x06 - void MakePasswordChanged(WorldPacket* data, ObjectGuid guid); //+ 0x07 - void MakeOwnerChanged(WorldPacket* data, ObjectGuid guid); //? 0x08 - void MakePlayerNotFound(WorldPacket* data, std::string const& name); //+ 0x09 - void MakeNotOwner(WorldPacket* data); //? 0x0A - void MakeChannelOwner(WorldPacket* data); //? 0x0B - void MakeModeChange(WorldPacket* data, ObjectGuid guid, uint8 oldflags);//+ 0x0C - void MakeAnnouncementsOn(WorldPacket* data, ObjectGuid guid); //+ 0x0D - void MakeAnnouncementsOff(WorldPacket* data, ObjectGuid guid); //+ 0x0E - void MakeMuted(WorldPacket* data); //? 0x11 - void MakePlayerKicked(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x12 - void MakeBanned(WorldPacket* data); //? 0x13 - void MakePlayerBanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x14 - void MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x15 - void MakePlayerNotBanned(WorldPacket* data, std::string const& name); //? 0x16 - void MakePlayerAlreadyMember(WorldPacket* data, ObjectGuid guid); //+ 0x17 - void MakeInvite(WorldPacket* data, ObjectGuid guid); //? 0x18 - void MakeInviteWrongFaction(WorldPacket* data); //? 0x19 - void MakeWrongFaction(WorldPacket* data); //? 0x1A - void MakeInvalidName(WorldPacket* data); //? 0x1B - void MakeNotModerated(WorldPacket* data); //? 0x1C - void MakePlayerInvited(WorldPacket* data, std::string const& name); //+ 0x1D - void MakePlayerInviteBanned(WorldPacket* data, std::string const& name);//? 0x1E - void MakeThrottled(WorldPacket* data); //? 0x1F - void MakeNotInArea(WorldPacket* data); //? 0x20 - void MakeNotInLfg(WorldPacket* data); //? 0x21 - void MakeVoiceOn(WorldPacket* data, ObjectGuid guid); //+ 0x22 - void MakeVoiceOff(WorldPacket* data, ObjectGuid guid); //+ 0x23 + void MakeJoined(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x00 + void MakeLeft(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x01 + void MakeYouJoined(WorldPackets::Channel::ChannelNotify& data); //+ 0x02 + void MakeYouLeft(WorldPackets::Channel::ChannelNotify& data); //+ 0x03 + void MakeWrongPassword(WorldPackets::Channel::ChannelNotify& data); //? 0x04 + void MakeNotMember(WorldPackets::Channel::ChannelNotify& data); //? 0x05 + void MakeNotModerator(WorldPackets::Channel::ChannelNotify& data); //? 0x06 + void MakePasswordChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x07 + void MakeOwnerChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //? 0x08 + void MakePlayerNotFound(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //+ 0x09 + void MakeNotOwner(WorldPackets::Channel::ChannelNotify& data); //? 0x0A + void MakeChannelOwner(WorldPackets::Channel::ChannelNotify& data); //? 0x0B + void MakeModeChange(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags); //+ 0x0C + void MakeAnnouncementsOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x0D + void MakeAnnouncementsOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x0E + void MakeMuted(WorldPackets::Channel::ChannelNotify& data); //? 0x11 + void MakePlayerKicked(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x12 + void MakeBanned(WorldPackets::Channel::ChannelNotify& data); //? 0x13 + void MakePlayerBanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x14 + void MakePlayerUnbanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x15 + void MakePlayerNotBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //? 0x16 + void MakePlayerAlreadyMember(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x17 + void MakeInvite(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //? 0x18 + void MakeInviteWrongFaction(WorldPackets::Channel::ChannelNotify& data); //? 0x19 + void MakeWrongFaction(WorldPackets::Channel::ChannelNotify& data); //? 0x1A + void MakeInvalidName(WorldPackets::Channel::ChannelNotify& data); //? 0x1B + void MakeNotModerated(WorldPackets::Channel::ChannelNotify& data); //? 0x1C + void MakePlayerInvited(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //+ 0x1D + void MakePlayerInviteBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //? 0x1E + void MakeThrottled(WorldPackets::Channel::ChannelNotify& data); //? 0x1F + void MakeNotInArea(WorldPackets::Channel::ChannelNotify& data); //? 0x20 + void MakeNotInLfg(WorldPackets::Channel::ChannelNotify& data); //? 0x21 + void MakeVoiceOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x22 + void MakeVoiceOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x23 - void SendToAll(WorldPacket const* data, ObjectGuid guid = ObjectGuid::Empty); - void SendToAllButOne(WorldPacket const* data, ObjectGuid who); - void SendToOne(WorldPacket const* data, ObjectGuid who); + void SendToAll(WorldPacket const* data, ObjectGuid const& guid = ObjectGuid::Empty); + void SendToAllButOne(WorldPacket const* data, ObjectGuid const& who); + void SendToOne(WorldPacket const* data, ObjectGuid const& who); - bool IsOn(ObjectGuid who) const { return playersStore.find(who) != playersStore.end(); } - bool IsBanned(ObjectGuid guid) const { return bannedStore.find(guid) != bannedStore.end(); } + bool IsOn(ObjectGuid const& who) const { return _playersStore.find(who) != _playersStore.end(); } + bool IsBanned(ObjectGuid const& guid) const { return _bannedStore.find(guid) != _bannedStore.end(); } void UpdateChannelInDB() const; void UpdateChannelUseageInDB() const; - uint8 GetPlayerFlags(ObjectGuid guid) const + uint8 GetPlayerFlags(ObjectGuid const& guid) const { - PlayerContainer::const_iterator itr = playersStore.find(guid); - return itr != playersStore.end() ? itr->second.flags : 0; + PlayerContainer::const_iterator itr = _playersStore.find(guid); + return itr != _playersStore.end() ? itr->second.GetFlags() : 0; } - void SetModerator(ObjectGuid guid, bool set) + void SetModerator(ObjectGuid const& guid, bool set) { - if (playersStore[guid].IsModerator() != set) + if (_playersStore[guid].IsModerator() != set) { - uint8 oldFlag = GetPlayerFlags(guid); - playersStore[guid].SetModerator(set); + uint8 oldFlag = _playersStore[guid].GetFlags(); + _playersStore[guid].SetModerator(set); - WorldPacket data; - MakeModeChange(&data, guid, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify data; + MakeModeChange(data, guid, oldFlag, _playersStore[guid].GetFlags()); + SendToAll(data.Write()); } } - void SetMute(ObjectGuid guid, bool set) + void SetMute(ObjectGuid const& guid, bool set) { - if (playersStore[guid].IsMuted() != set) + if (_playersStore[guid].IsMuted() != set) { - uint8 oldFlag = GetPlayerFlags(guid); - playersStore[guid].SetMuted(set); + uint8 oldFlag = _playersStore[guid].GetFlags(); + _playersStore[guid].SetMuted(set); - WorldPacket data; - MakeModeChange(&data, guid, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify data; + MakeModeChange(data, guid, oldFlag, _playersStore[guid].GetFlags()); + SendToAll(data.Write()); } } @@ -276,12 +287,12 @@ class Channel bool _IsSaved; uint8 _flags; uint32 _channelId; - uint32 _Team; + uint32 _team; ObjectGuid _ownerGUID; std::string _name; std::string _password; - PlayerContainer playersStore; - BannedContainer bannedStore; + PlayerContainer _playersStore; + BannedContainer _bannedStore; }; -#endif +#endif diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp index a3a4ef69e63..ca664abffd9 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.cpp +++ b/src/server/game/Chat/Channels/ChannelMgr.cpp @@ -23,11 +23,11 @@ ChannelMgr::~ChannelMgr() { - for (ChannelMap::iterator itr = channels.begin(); itr != channels.end(); ++itr) + for (ChannelMap::iterator itr = _channels.begin(); itr != _channels.end(); ++itr) delete itr->second; } -ChannelMgr* ChannelMgr::forTeam(uint32 team) +ChannelMgr* ChannelMgr::ForTeam(uint32 team) { static ChannelMgr allianceChannelMgr; static ChannelMgr hordeChannelMgr; @@ -40,49 +40,43 @@ ChannelMgr* ChannelMgr::forTeam(uint32 team) if (team == HORDE) return &hordeChannelMgr; - return NULL; + return nullptr; } Channel* ChannelMgr::GetJoinChannel(std::string const& name, uint32 channelId) { std::wstring wname; if (!Utf8toWStr(name, wname)) - return NULL; + return nullptr; wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) { - Channel* nchan = new Channel(name, channelId, team); - channels[wname] = nchan; + Channel* nchan = new Channel(name, channelId, _team); + _channels[wname] = nchan; return nchan; } return i->second; } -Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool pkt) +Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool notify /*= true*/) { std::wstring wname; if (!Utf8toWStr(name, wname)) - return NULL; + return nullptr; wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) { - if (pkt) - { - WorldPacket data; - MakeNotOnPacket(&data, name); - player->GetSession()->SendPacket(&data); - } - - return NULL; + if (notify) + SendNotOnChannelNotify(player, name); + + return nullptr; } return i->second; @@ -96,22 +90,23 @@ void ChannelMgr::LeftChannel(std::string const& name) wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) return; Channel* channel = i->second; if (!channel->GetNumPlayers() && !channel->IsConstant()) { - channels.erase(wname); + _channels.erase(i); delete channel; } } -void ChannelMgr::MakeNotOnPacket(WorldPacket* data, std::string const& name) +void ChannelMgr::SendNotOnChannelNotify(Player const* player, std::string const& name) { - data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + name.size()); - (*data) << uint8(5) << name; + WorldPackets::Channel::ChannelNotify notify; + notify.Type = CHAT_NOT_MEMBER_NOTICE; + notify.Channel = name; + player->SendDirectMessage(notify.Write()); } diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h index eee45ba5b97..9a8fdb10767 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.h +++ b/src/server/game/Chat/Channels/ChannelMgr.h @@ -21,11 +21,6 @@ #include "Common.h" #include "Channel.h" -#include <map> -#include <string> - -#include "World.h" - #define MAX_CHANNEL_PASS_STR 31 class ChannelMgr @@ -33,22 +28,22 @@ class ChannelMgr typedef std::map<std::wstring, Channel*> ChannelMap; protected: - ChannelMgr() : team(0) { } + ChannelMgr() : _team(0) { } ~ChannelMgr(); public: - static ChannelMgr* forTeam(uint32 team); - void setTeam(uint32 newTeam) { team = newTeam; } + static ChannelMgr* ForTeam(uint32 team); + void SetTeam(uint32 newTeam) { _team = newTeam; } - Channel* GetJoinChannel(std::string const& name, uint32 channel_id); - Channel* GetChannel(std::string const& name, Player* p, bool pkt = true); + Channel* GetJoinChannel(std::string const& name, uint32 channelId); + Channel* GetChannel(std::string const& name, Player* player, bool notify = true); void LeftChannel(std::string const& name); private: - ChannelMap channels; - uint32 team; + ChannelMap _channels; + uint32 _team; - void MakeNotOnPacket(WorldPacket* data, std::string const& name); + static void SendNotOnChannelNotify(Player const* player, std::string const& name); }; #endif diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 3a74d2cc045..6bf579fff14 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2574,7 +2574,7 @@ void Creature::SetDisplayId(uint32 modelId) } } -void Creature::SetTarget(ObjectGuid guid) +void Creature::SetTarget(ObjectGuid const& guid) { if (!_focusSpell) SetGuidValue(UNIT_FIELD_TARGET, guid); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index ef171e311ae..4f805088548 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -674,7 +674,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject bool m_isTempWorldObject; //true when possessed // Handling caster facing during spellcast - void SetTarget(ObjectGuid guid) override; + void SetTarget(ObjectGuid const& guid) override; void FocusTarget(Spell const* focusSpell, WorldObject const* target); void ReleaseFocus(Spell const* focusSpell); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 7e6d56279b2..29d4e12604c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5225,8 +5225,8 @@ void Player::CleanupChannels() { Channel* ch = *m_channels.begin(); m_channels.erase(m_channels.begin()); // remove from player's channel list - ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam())) + ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetTeam())) cMgr->LeftChannel(ch->GetName()); // deleted channel if empty } TC_LOG_DEBUG("chat.system", "Player %s: channels cleaned up!", GetName().c_str()); @@ -5241,12 +5241,10 @@ void Player::UpdateLocalChannels(uint32 newZone) if (!current_zone) return; - ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam()); + ChannelMgr* cMgr = ChannelMgr::ForTeam(GetTeam()); if (!cMgr) return; - std::string current_zone_name = current_zone->ZoneName; - for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i) { if (ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(i)) @@ -5279,7 +5277,7 @@ void Player::UpdateLocalChannels(uint32 newZone) if (channel->Flags & CHANNEL_DBC_FLAG_CITY_ONLY) currentNameExt = sObjectMgr->GetTrinityStringForDBCLocale(LANG_CHANNEL_CITY); else - currentNameExt = current_zone_name.c_str(); + currentNameExt = current_zone->ZoneName; snprintf(new_channel_name_buf, 100, channel->Name_lang, currentNameExt); @@ -16757,7 +16755,8 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) eqSet.State = EQUIPMENT_SET_UNCHANGED; for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) - eqSet.Data.Pieces[i] = ObjectGuid::Create<HighGuid::Item>(fields[5 + i].GetUInt64()); + if (uint64 guid = fields[5 + i].GetUInt64()) + eqSet.Data.Pieces[i] = ObjectGuid::Create<HighGuid::Item>(guid); if (eqSet.Data.SetID >= MAX_EQUIPMENT_SET_INDEX) // client limit continue; @@ -22997,6 +22996,9 @@ void Player::SendInitialPacketsBeforeAddToMap() /// SMSG_SEND_UNLEARN_SPELLS SendDirectMessage(WorldPackets::Spell::SendUnlearnSpells().Write()); + /// @todo: SMSG_SEND_SPELL_HISTORY + /// @todo: SMSG_SEND_SPELL_CHARGES + /// SMSG_ACTION_BUTTONS SendInitialActionButtons(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8a90204b70f..1dcd75a156e 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1758,8 +1758,8 @@ class Player : public Unit, public GridObject<Player> Unit* GetSelectedUnit() const; Player* GetSelectedPlayer() const; - void SetTarget(ObjectGuid /*guid*/) override { } /// Used for serverside target changes, does not apply to players - void SetSelection(ObjectGuid guid) { SetGuidValue(UNIT_FIELD_TARGET, guid); } + void SetTarget(ObjectGuid const& /*guid*/) override { } /// Used for serverside target changes, does not apply to players + void SetSelection(ObjectGuid const& guid) { SetGuidValue(UNIT_FIELD_TARGET, guid); } uint8 GetComboPoints() const { return m_comboPoints; } ObjectGuid GetComboTarget() const { return m_comboTarget; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1905f41e84e..1418dc2ad35 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2164,7 +2164,7 @@ class Unit : public WorldObject TempSummon const* ToTempSummon() const { if (IsSummon()) return reinterpret_cast<TempSummon const*>(this); else return NULL; } ObjectGuid GetTarget() const { return GetGuidValue(UNIT_FIELD_TARGET); } - virtual void SetTarget(ObjectGuid /*guid*/) = 0; + virtual void SetTarget(ObjectGuid const& /*guid*/) = 0; // Movement info Movement::MoveSpline * movespline; diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp index 5826415a201..c6cd5337c5b 100644 --- a/src/server/game/Handlers/ChannelHandler.cpp +++ b/src/server/game/Handlers/ChannelHandler.cpp @@ -18,31 +18,20 @@ #include "ObjectMgr.h" // for normalizePlayerName #include "ChannelMgr.h" +#include "ChannelPackets.h" #include "Player.h" #include "WorldSession.h" #include <cctype> -void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) +void WorldSession::HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet) { - uint32 channelId; - uint32 channelLength, passLength; - std::string channelName, password; + TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s ChatChannelId: %u, CreateVoiceSession: %u, Internal: %u, ChannelName: %s, Password: %s", + GetPlayerInfo().c_str(), packet.ChatChannelId, packet.CreateVoiceSession, packet.Internal, packet.ChannelName.c_str(), packet.Password.c_str()); - recvPacket >> channelId; - uint8 unknown1 = recvPacket.ReadBit(); // unknowns - uint8 unknown2 = recvPacket.ReadBit(); - channelLength = recvPacket.ReadBits(8); - passLength = recvPacket.ReadBits(8); - channelName = recvPacket.ReadString(channelLength); - password = recvPacket.ReadString(passLength); - - TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s Channel: %u, unk1: %u, unk2: %u, channel: %s, password: %s", - GetPlayerInfo().c_str(), channelId, unknown1, unknown2, channelName.c_str(), password.c_str()); - - if (channelId) + if (packet.ChatChannelId) { - ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(channelId); + ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(packet.ChatChannelId); if (!channel) return; @@ -51,53 +40,43 @@ void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) return; } - if (channelName.empty()) + if (packet.ChannelName.empty()) return; - if (isdigit(channelName[0])) + if (isdigit(packet.ChannelName[0])) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { - cMgr->setTeam(GetPlayer()->GetTeam()); - if (Channel* channel = cMgr->GetJoinChannel(channelName, channelId)) - channel->JoinChannel(GetPlayer(), password); + cMgr->SetTeam(GetPlayer()->GetTeam()); + if (Channel* channel = cMgr->GetJoinChannel(packet.ChannelName, packet.ChatChannelId)) + channel->JoinChannel(GetPlayer(), packet.Password); } } -void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) +void WorldSession::HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet) { - uint32 unk; - std::string channelName; - recvPacket >> unk; // channel id? - uint32 length = recvPacket.ReadBits(8); - channelName = recvPacket.ReadString(length); + TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s ChannelName: %s, ZoneChannelID: %u", + GetPlayerInfo().c_str(), packet.ChannelName.c_str(), packet.ZoneChannelID); - TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s Channel: %s, unk1: %u", - GetPlayerInfo().c_str(), channelName.c_str(), unk); - - if (channelName.empty()) + if (packet.ChannelName.empty()) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) channel->LeaveChannel(GetPlayer(), true); - cMgr->LeftChannel(channelName); + cMgr->LeftChannel(packet.ChannelName); } } -void WorldSession::HandleChannelList(WorldPacket& recvPacket) +void WorldSession::HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet) { - uint32 length = recvPacket.ReadBits(8); - std::string channelName = recvPacket.ReadString(length); - - TC_LOG_DEBUG("chat.system", "%s %s Channel: %s", - recvPacket.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST ? "CMSG_CHANNEL_DISPLAY_LIST" : "CMSG_CHANNEL_LIST", - GetPlayerInfo().c_str(), channelName.c_str()); + TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s", + GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) + if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) channel->List(GetPlayer()); } @@ -115,7 +94,7 @@ void WorldSession::HandleChannelPassword(WorldPacket& recvPacket) if (password.length() > MAX_CHANNEL_PASS_STR) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Password(GetPlayer(), password); } @@ -134,7 +113,7 @@ void WorldSession::HandleChannelSetOwner(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetOwner(GetPlayer(), targetName); } @@ -147,9 +126,9 @@ void WorldSession::HandleChannelOwner(WorldPacket& recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_OWNER %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->SendWhoOwner(GetPlayer()->GetGUID()); + channel->SendWhoOwner(GetPlayer()); } void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) @@ -166,7 +145,7 @@ void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetModerator(GetPlayer(), targetName); } @@ -185,7 +164,7 @@ void WorldSession::HandleChannelUnmoderator(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnsetModerator(GetPlayer(), targetName); } @@ -204,7 +183,7 @@ void WorldSession::HandleChannelMute(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetMute(GetPlayer(), targetName); } @@ -223,7 +202,7 @@ void WorldSession::HandleChannelUnmute(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnsetMute(GetPlayer(), targetName); } @@ -242,7 +221,7 @@ void WorldSession::HandleChannelInvite(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Invite(GetPlayer(), targetName); } @@ -261,7 +240,7 @@ void WorldSession::HandleChannelKick(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Kick(GetPlayer(), targetName); } @@ -283,7 +262,7 @@ void WorldSession::HandleChannelBan(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Ban(GetPlayer(), targetName); } @@ -302,7 +281,7 @@ void WorldSession::HandleChannelUnban(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnBan(GetPlayer(), targetName); } @@ -315,17 +294,11 @@ void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_ANNOUNCEMENTS %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Announce(GetPlayer()); } -void WorldSession::HandleChannelDisplayListQuery(WorldPacket &recvPacket) -{ - // this should be OK because the 2 function _were_ the same - HandleChannelList(recvPacket); -} - void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) { std::string channelName; @@ -334,7 +307,7 @@ void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_GET_CHANNEL_MEMBER_COUNT %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) { diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 83844a257cc..2c98d6c1bd6 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -37,6 +37,7 @@ #include "Language.h" #include "LFGMgr.h" #include "Log.h" +#include "MiscPackets.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Opcodes.h" @@ -836,6 +837,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) return; } + SendTutorialsData(); + pCurrChar->GetMotionMaster()->Initialize(); pCurrChar->SendDungeonDifficulty(false); @@ -1107,32 +1110,35 @@ void WorldSession::HandleSetFactionCheat(WorldPacket& /*recvData*/) GetPlayer()->GetReputationMgr().SendStates(); } -void WorldSession::HandleTutorialFlag(WorldPacket& recvData) -{ - uint32 data; - recvData >> data; - - uint8 index = uint8(data / 32); - if (index >= MAX_ACCOUNT_TUTORIAL_VALUES) - return; - - uint32 value = (data % 32); - - uint32 flag = GetTutorialInt(index); - flag |= (1 << value); - SetTutorialInt(index, flag); -} - -void WorldSession::HandleTutorialClear(WorldPacket& /*recvData*/) -{ - for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) - SetTutorialInt(i, 0xFFFFFFFF); -} - -void WorldSession::HandleTutorialReset(WorldPacket& /*recvData*/) +void WorldSession::HandleTutorialFlag(WorldPackets::Misc::TutorialSetFlag& packet) { - for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) - SetTutorialInt(i, 0x00000000); + switch (packet.Action) + { + case TUTORIAL_ACTION_UPDATE: + { + uint8 index = uint8(packet.TutorialBit >> 5); + if (index >= MAX_ACCOUNT_TUTORIAL_VALUES) + { + TC_LOG_ERROR("network", "CMSG_TUTORIAL_FLAG received bad TutorialBit %u.", packet.TutorialBit); + return; + } + uint32 flag = GetTutorialInt(index); + flag |= (1 << (packet.TutorialBit & 0x1F)); + SetTutorialInt(index, flag); + break; + } + case TUTORIAL_ACTION_CLEAR: + for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) + SetTutorialInt(i, 0xFFFFFFFF); + break; + case TUTORIAL_ACTION_RESET: + for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) + SetTutorialInt(i, 0x00000000); + break; + default: + TC_LOG_ERROR("network", "CMSG_TUTORIAL_FLAG received unknown TutorialAction %u.", packet.Action); + return; + } } void WorldSession::HandleSetWatchedFactionOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index a2485d7854b..b51f0d52480 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -354,7 +354,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, } } - if (ChannelMgr* cMgr = ChannelMgr::forTeam(sender->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(sender->GetTeam())) { if (Channel* chn = cMgr->GetChannel(target, sender)) { diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 613f1e46d7b..91ffa3aff87 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -538,12 +538,9 @@ void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/) SendPacket(&data); } -void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData) +void WorldSession::HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet) { - ObjectGuid guid; - recvData >> guid; - - _player->SetSelection(guid); + _player->SetSelection(packet.Selection); } void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData) diff --git a/src/server/game/Server/Packets/ChannelPackets.cpp b/src/server/game/Server/Packets/ChannelPackets.cpp index 28a50a6c9aa..2ece521b42b 100644 --- a/src/server/game/Server/Packets/ChannelPackets.cpp +++ b/src/server/game/Server/Packets/ChannelPackets.cpp @@ -18,7 +18,12 @@ #include "ChannelPackets.h" #include "Channel.h" -WorldPacket const* WorldPackets::Channel::ChannelList::Write() +void WorldPackets::Channel::ChannelListRequest::Read() +{ + ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7)); +} + +WorldPacket const* WorldPackets::Channel::ChannelListResponse::Write() { _worldPacket.WriteBit(Display); _worldPacket.WriteBits(Channel.length(), 7); @@ -43,7 +48,7 @@ WorldPacket const* WorldPackets::Channel::ChannelNotify::Write() _worldPacket.WriteBits(Sender.length(), 6); _worldPacket << SenderGuid; - _worldPacket << SenderBnetAccountID; + _worldPacket << SenderAccountID; _worldPacket << uint32(SenderVirtualRealm); _worldPacket << TargetGuid; _worldPacket << uint32(TargetVirtualRealm); @@ -94,3 +99,9 @@ void WorldPackets::Channel::JoinChannel::Read() ChannelName = _worldPacket.ReadString(channelLength); Password = _worldPacket.ReadString(passwordLength); } + +void WorldPackets::Channel::LeaveChannel::Read() +{ + _worldPacket >> ZoneChannelID; + ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7)); +} diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h index 3fe2a353070..36a0a516928 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -25,7 +25,20 @@ namespace WorldPackets { namespace Channel { - class ChannelList final : public ServerPacket + class ChannelListRequest final : public ClientPacket + { + public: + ChannelListRequest(WorldPacket&& packet) : ClientPacket(std::move(packet)) + { + ASSERT(packet.GetOpcode() == CMSG_CHANNEL_LIST || packet.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST); + } + + void Read() override; + + std::string ChannelName; + }; + + class ChannelListResponse final : public ServerPacket { public: struct ChannelPlayer @@ -38,7 +51,7 @@ namespace WorldPackets uint8 Flags = 0; ///< @see enum ChannelMemberFlags }; - ChannelList() : ServerPacket(SMSG_CHANNEL_LIST) { } + ChannelListResponse() : ServerPacket(SMSG_CHANNEL_LIST) { } WorldPacket const* Write() override; @@ -57,11 +70,11 @@ namespace WorldPackets std::string Sender; ObjectGuid SenderGuid; - ObjectGuid SenderBnetAccountID; + ObjectGuid SenderAccountID; uint8 Type = 0; ///< @see enum ChatNotify uint8 OldFlags = 0; ///< @see enum ChannelMemberFlags uint8 NewFlags = 0; ///< @see enum ChannelMemberFlags - std::string Channel; + std::string Channel; ///< Channel Name uint32 SenderVirtualRealm = 0; ObjectGuid TargetGuid; uint32 TargetVirtualRealm = 0; @@ -79,7 +92,7 @@ namespace WorldPackets int32 ChatChannelID = 0; int32 InstanceID = 0; uint8 ChannelFlags = 0; ///< @see enum ChannelFlags - std::string Channel; + std::string Channel; ///< Channel Name }; class ChannelNotifyLeft final : public ServerPacket @@ -89,9 +102,9 @@ namespace WorldPackets WorldPacket const* Write() override; - std::string Channel; + std::string Channel; ///< Channel Name int32 ChatChannelID = 0; - bool Suspended = false; + bool Suspended = false; ///< User Leave - false, On Zone Change - true }; class JoinChannel final : public ClientPacket @@ -107,6 +120,17 @@ namespace WorldPackets int32 ChatChannelId = 0; bool Internal = false; }; + + class LeaveChannel final : public ClientPacket + { + public: + LeaveChannel(WorldPacket&& packet) : ClientPacket(CMSG_LEAVE_CHANNEL, std::move(packet)) { } + + void Read() override; + + int32 ZoneChannelID = 0; + std::string ChannelName; + }; } } diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index e406829a760..154ff134a6a 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -46,6 +46,11 @@ WorldPacket const* WorldPackets::Misc::LoginSetTimeSpeed::Write() return &_worldPacket; } +void WorldPackets::Misc::SetSelection::Read() +{ + _worldPacket >> Selection; +} + void WorldPackets::Misc::ViolenceLevel::Read() { _worldPacket >> ViolenceLvl; @@ -78,6 +83,12 @@ WorldPacket const* WorldPackets::Misc::TutorialFlags::Write() return &_worldPacket; } +void WorldPackets::Misc::TutorialSetFlag::Read() +{ + Action = _worldPacket.ReadBits(2); + _worldPacket >> TutorialBit; +} + WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write() { _worldPacket << uint32(DifficultyID); diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 7bb2cb3fb9b..c25370505d3 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -62,6 +62,16 @@ namespace WorldPackets int32 GameTimeHolidayOffset = 0; }; + class SetSelection final : public ClientPacket + { + public: + SetSelection(WorldPacket&& packet) : ClientPacket(CMSG_SET_SELECTION, std::move(packet)) { } + + void Read() override; + + ObjectGuid Selection; ///< Target + }; + class ViolenceLevel final : public ClientPacket { public: @@ -116,6 +126,17 @@ namespace WorldPackets uint32 TutorialData[MAX_ACCOUNT_TUTORIAL_VALUES]; }; + class TutorialSetFlag final : public ClientPacket + { + public: + TutorialSetFlag(WorldPacket&& packet) : ClientPacket(CMSG_TUTORIAL_FLAG, std::move(packet)) { } + + void Read() override; + + uint8 Action = 0; + uint32 TutorialBit = 0; + }; + class WorldServerInfo final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index c3f7906e0fd..bab7ad89ce4 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -242,6 +242,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonster data << movementMonsterSpline.Destination; data << movementMonsterSpline.Move; data.WriteBit(movementMonsterSpline.CrzTeleport); + + // Unk bits. 0 if monster is moving, 1 or 2 if stopped + if (movementMonsterSpline.Move.Flags) + data.WriteBits(0, 2); + else + data.WriteBits(2, 2); + data.FlushBits(); return data; @@ -252,15 +259,6 @@ WorldPacket const* WorldPackets::Movement::MonsterMove::Write() _worldPacket << MoverGUID; _worldPacket << Pos; _worldPacket << SplineData; - - // Unk bits. 0 if monster is moving, 1 or 2 if stopped - if (SplineData.Move.Flags) - _worldPacket.WriteBits(0, 2); - else - _worldPacket.WriteBits(2, 2); - - _worldPacket.FlushBits(); - return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 2b92fe4fed9..6f3b19a661d 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -171,7 +171,7 @@ namespace WorldPackets class WorldPortAck final : public ClientPacket { public: - WorldPortAck(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + WorldPortAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_WORLDPORT_ACK, std::move(packet)) { } void Read() override { } }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index acc3b67f12c..9d6ab2514b8 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -215,10 +215,10 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelAnnouncements ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_BAN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelBan ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_DISPLAY_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelDisplayListQuery ); + DEFINE_HANDLER(CMSG_CHANNEL_DISPLAY_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelListRequest, &WorldSession::HandleChannelList); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelInvite ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_KICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelKick ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelList ); + DEFINE_HANDLER(CMSG_CHANNEL_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelListRequest, &WorldSession::HandleChannelList); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MODERATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MODERATOR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelModerator ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MUTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelMute ); @@ -364,12 +364,12 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefundInfoRequest ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemTextQuery ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleJoinChannel ); + DEFINE_HANDLER(CMSG_JOIN_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::JoinChannel, &WorldSession::HandleJoinChannel); DEFINE_OPCODE_HANDLER_OLD(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_PREVIEW_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalents ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_PREVIEW_TALENTS_PET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalentsPet ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LEAVE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannel ); + DEFINE_HANDLER(CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::LeaveChannel, &WorldSession::HandleLeaveChannel); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_GET_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetStatus ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode ); @@ -594,7 +594,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PREFERED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_RELATIVE_POSITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SELECTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSetSelectionOpcode ); + DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SKILL_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode ); @@ -634,16 +634,14 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_TRAINER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerListOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TURN_IN_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTurnInPetitionOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_CLEAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialClear ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_FLAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialFlag ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_RESET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialReset ); + DEFINE_HANDLER(CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode ); DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNDELETE_COOLDOWN_STATUS_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUndeleteCooldownStatusQuery); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAddonPrefixesOpcode); - DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData ); + DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData); DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_PROJECTILE_POSITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition ); DEFINE_OPCODE_HANDLER_OLD(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -697,12 +695,14 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_UNHANDLED); @@ -762,6 +762,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE, STATUS_UNHANDLED); @@ -800,11 +801,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_MEMBER_COUNT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_START, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_UNHANDLED); @@ -921,6 +922,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_EVENT_DEBUG_LOG, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_DB_ERROR, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_RECEIVED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_STATUS_UPDATE, STATUS_UNHANDLED); @@ -933,6 +935,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_STATUS_UPDATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GODMODE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_UNHANDLED); @@ -964,6 +967,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_DECLINE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PRESENCE_CHANGE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_FLAGGED_FOR_RENAME, STATUS_UNHANDLED); @@ -1075,6 +1079,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_SLOT_CHANGED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_START_ROLL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_IN_PROGRESS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_NEVER); @@ -1244,6 +1249,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFORGE_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVED_SPELL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_AFK_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_UNHANDLED); @@ -1261,6 +1267,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RWHOIS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_ITEM, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVERTIME, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_UNHANDLED); @@ -1268,6 +1276,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_MESSAGE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_PERF, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ALL_TASK_PROGRESS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DF_FAST_LAUNCH_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_ATWAR, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_NOT_VISIBLE, STATUS_UNHANDLED); @@ -1275,6 +1285,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MOVEMENT_ANIM_KIT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_UNHANDLED); @@ -1341,6 +1352,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_HOVER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STABLE_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STANDSTATE_UPDATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_DANCE, STATUS_UNHANDLED); @@ -1391,6 +1403,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_SERVER_PLAYER_POSITION, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TASK_PROGRESS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WORLD_STATE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_UNHANDLED); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 06654acb0bc..cf98d5335db 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -149,10 +149,10 @@ enum OpcodeClient : uint32 CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0xBADD, CMSG_CHANNEL_ANNOUNCEMENTS = 0xBADD, CMSG_CHANNEL_BAN = 0xBADD, - CMSG_CHANNEL_DISPLAY_LIST = 0xBADD, + CMSG_CHANNEL_DISPLAY_LIST = 0x093B, CMSG_CHANNEL_INVITE = 0xBADD, CMSG_CHANNEL_KICK = 0xBADD, - CMSG_CHANNEL_LIST = 0xBADD, + CMSG_CHANNEL_LIST = 0x093B, CMSG_CHANNEL_MODERATE = 0xBADD, CMSG_CHANNEL_MODERATOR = 0xBADD, CMSG_CHANNEL_MUTE = 0xBADD, @@ -193,7 +193,7 @@ enum OpcodeClient : uint32 CMSG_COMPLAIN = 0xBADD, CMSG_COMPLETE_CINEMATIC = 0xBADD, CMSG_COMPLETE_MOVIE = 0xBADD, - CMSG_CONNECT_TO_FAILED = 0xBADD, + CMSG_CONNECT_TO_FAILED = 0x0135, CMSG_CONTACT_LIST = 0xBADD, CMSG_CORPSE_MAP_POSITION_QUERY = 0xBADD, CMSG_CREATURE_QUERY = 0x0505, @@ -315,7 +315,7 @@ enum OpcodeClient : uint32 CMSG_LEARN_PREVIEW_TALENTS = 0xBADD, CMSG_LEARN_PREVIEW_TALENTS_PET = 0xBADD, CMSG_LEARN_TALENT = 0xBADD, - CMSG_LEAVE_CHANNEL = 0xBADD, + CMSG_LEAVE_CHANNEL = 0x19F2, CMSG_LFG_GET_STATUS = 0xBADD, CMSG_LFG_JOIN = 0xBADD, CMSG_LFG_LEAVE = 0xBADD, @@ -459,7 +459,7 @@ enum OpcodeClient : uint32 CMSG_PET_SPELL_AUTOCAST = 0xBADD, CMSG_PET_STOP_ATTACK = 0xBADD, CMSG_PING = 0x0416, - CMSG_PLAYED_TIME = 0xBADD, + CMSG_PLAYED_TIME = 0x1BB2, CMSG_PLAYER_DIFFICULTY_CHANGE = 0xBADD, CMSG_PLAYER_LOGIN = 0x0B1D, CMSG_PLAYER_LOGOUT = 0xBADD, @@ -508,7 +508,7 @@ enum OpcodeClient : uint32 CMSG_REPORT_PVP_AFK = 0xBADD, CMSG_REQUEST_ACCOUNT_DATA = 0x0F3E, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0xBADD, - CMSG_REQUEST_CEMETERY_LIST = 0xBADD, + CMSG_REQUEST_CEMETERY_LIST = 0x10A2, CMSG_REQUEST_HOTFIX = 0xBADD, CMSG_REQUEST_INSPECT_RATED_BG_STATS = 0xBADD, CMSG_REQUEST_PARTY_MEMBER_STATS = 0xBADD, @@ -543,7 +543,7 @@ enum OpcodeClient : uint32 CMSG_SET_ACTIONBAR_TOGGLES = 0xBADD, CMSG_SET_ACTION_BUTTON = 0x0599, CMSG_SET_ACTIVE_MOVER = 0xBADD, - CMSG_SET_ACTIVE_VOICE_CHANNEL = 0xBADD, + CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x031E, CMSG_SET_ALLOW_LOW_LEVEL_RAID1 = 0xBADD, CMSG_SET_ALLOW_LOW_LEVEL_RAID2 = 0xBADD, CMSG_SET_CHANNEL_WATCH = 0xBADD, @@ -608,9 +608,7 @@ enum OpcodeClient : uint32 CMSG_TRANSMOGRIFY_ITEMS = 0x0A85, CMSG_TRIGGER_CINEMATIC_CHEAT = 0xBADD, CMSG_TURN_IN_PETITION = 0xBADD, - CMSG_TUTORIAL_CLEAR = 0xBADD, - CMSG_TUTORIAL_FLAG = 0xBADD, - CMSG_TUTORIAL_RESET = 0xBADD, + CMSG_TUTORIAL_FLAG = 0x0B16, CMSG_UNACCEPT_TRADE = 0xBADD, CMSG_UNDELETE_CHARACTER = 0x0D99, CMSG_UNDELETE_COOLDOWN_STATUS_QUERY = 0x19A9, @@ -623,7 +621,7 @@ enum OpcodeClient : uint32 CMSG_USED_FOLLOW = 0xBADD, CMSG_USE_ITEM = 0x08B6, CMSG_VIOLENCE_LEVEL = 0x098D, - CMSG_VOICE_SESSION_ENABLE = 0xBADD, + CMSG_VOICE_SESSION_ENABLE = 0x1102, CMSG_VOID_STORAGE_QUERY = 0x019E, CMSG_VOID_STORAGE_TRANSFER = 0x0463, CMSG_VOID_STORAGE_UNLOCK = 0x13BB, @@ -685,12 +683,14 @@ enum OpcodeServer : uint32 SMSG_ACCOUNT_INFO_RESPONSE = 0xBADD, SMSG_ACCOUNT_MOUNT_UPDATE = 0x0140, SMSG_ACCOUNT_RESTRICTED_WARNING = 0xBADD, + SMSG_ACCOUNT_TOYS_UPDATE = 0x0590, SMSG_ACHIEVEMENT_DELETED = 0xBADD, SMSG_ACHIEVEMENT_EARNED = 0xBADD, SMSG_ACTION_BUTTONS = 0x1D1F, SMSG_ACTIVATETAXIREPLY = 0xBADD, SMSG_ADDON_INFO = 0x1D9F, SMSG_ADD_RUNE_POWER = 0xBADD, + SMSG_ADJUST_SPLINE_DURATION = 0x0104, SMSG_AI_REACTION = 0x0BA1, SMSG_ALL_ACHIEVEMENT_DATA = 0xBADD, SMSG_ALL_ACHIEVEMENT_DATA_ACCOUNT = 0x0123, @@ -724,12 +724,12 @@ enum OpcodeServer : uint32 SMSG_AUCTION_OWNER_NOTIFICATION = 0xBADD, SMSG_AUCTION_REMOVED_NOTIFICATION = 0xBADD, SMSG_AURACASTLOG = 0xBADD, - SMSG_AURA_POINTS_DEPLETED = 0xBADD, + SMSG_AURA_POINTS_DEPLETED = 0x093B, SMSG_AURA_UPDATE = 0x091C, SMSG_AURA_UPDATE_ALL = 0xBADD, SMSG_AUTH_CHALLENGE = 0x1759, SMSG_AUTH_RESPONSE = 0x0DA9, - SMSG_AVAILABLE_VOICE_CHANNEL = 0xBADD, + SMSG_AVAILABLE_VOICE_CHANNEL = 0x04D4, SMSG_AVERAGE_ITEM_LEVEL_INFORM = 0xBADD, SMSG_BARBER_SHOP_RESULT = 0xBADD, SMSG_BATTLEFIELD_LIST = 0xBADD, @@ -753,6 +753,7 @@ enum OpcodeServer : uint32 SMSG_BATTLEGROUND_INFO_THROTTLED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_JOINED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_LEFT = 0xBADD, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x0BE3, SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x0F2A, SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x12A4, SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x168A, @@ -787,7 +788,7 @@ enum OpcodeServer : uint32 SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0xBADD, SMSG_CALENDAR_SEND_CALENDAR = 0xBADD, SMSG_CALENDAR_SEND_EVENT = 0xBADD, - SMSG_CALENDAR_SEND_NUM_PENDING = 0xBADD, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x1B3A, SMSG_CALENDAR_UPDATE_INVITE_LIST = 0xBADD, SMSG_CAMERA_SHAKE = 0xBADD, SMSG_CANCEL_AUTO_REPEAT = 0xBADD, @@ -922,6 +923,7 @@ enum OpcodeServer : uint32 SMSG_GAMETIME_UPDATE = 0xBADD, SMSG_GAME_EVENT_DEBUG_LOG = 0xBADD, SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x0952, + SMSG_GARRISON_REMOTE_INFO = 0x0151, SMSG_GMRESPONSE_DB_ERROR = 0xBADD, SMSG_GMRESPONSE_RECEIVED = 0xBADD, SMSG_GMRESPONSE_STATUS_UPDATE = 0xBADD, @@ -934,6 +936,7 @@ enum OpcodeServer : uint32 SMSG_GM_PLAYER_INFO = 0xBADD, SMSG_GM_TICKET_CASE_STATUS = 0x1D8D, SMSG_GM_TICKET_STATUS_UPDATE = 0xBADD, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x1229, SMSG_GODMODE = 0xBADD, SMSG_GOSSIP_COMPLETE = 0x15D1, SMSG_GOSSIP_MESSAGE = 0x1746, @@ -966,6 +969,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_CRITERIA_UPDATE = 0x1208, SMSG_GUILD_DECLINE = 0xBADD, SMSG_GUILD_EVENT = 0x1027, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x1077, SMSG_GUILD_EVENT_LOG_QUERY_RESULT = 0xBADD, SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x1228, SMSG_GUILD_FLAGGED_FOR_RENAME = 0xBADD, @@ -992,7 +996,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0xBADD, SMSG_GUILD_REPUTATION_WEEKLY_CAP = 0xBADD, SMSG_GUILD_RESET = 0xBADD, - SMSG_GUILD_REWARDS_LIST = 0xBADD, + SMSG_GUILD_REWARDS_LIST = 0x1818, SMSG_GUILD_ROSTER = 0x1026, SMSG_GUILD_SET_NOTE = 0xBADD, SMSG_GUILD_TRADESKILL_UPDATE = 0xBADD, @@ -1088,6 +1092,7 @@ enum OpcodeServer : uint32 SMSG_LOOT_SLOT_CHANGED = 0xBADD, SMSG_LOOT_START_ROLL = 0xBADD, SMSG_MAIL_LIST_RESULT = 0x0B3F, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x153D, SMSG_MAP_OBJ_EVENTS = 0xBADD, SMSG_MEETINGSTONE_COMPLETE = 0xBADD, SMSG_MEETINGSTONE_IN_PROGRESS = 0xBADD, @@ -1267,9 +1272,10 @@ enum OpcodeServer : uint32 SMSG_REFER_A_FRIEND_EXPIRED = 0xBADD, SMSG_REFER_A_FRIEND_FAILURE = 0xBADD, SMSG_REFORGE_RESULT = 0xBADD, + SMSG_REFRESH_SPELL_HISTORY = 0x0A2A, SMSG_REMOVED_SPELL = 0xBADD, SMSG_REPORT_PVP_AFK_RESULT = 0xBADD, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0xBADD, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x059E, SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0xBADD, SMSG_RESEARCH_COMPLETE = 0xBADD, SMSG_RESEARCH_SETUP_HISTORY = 0x0A25, @@ -1285,13 +1291,17 @@ enum OpcodeServer : uint32 SMSG_RWHOIS = 0xBADD, SMSG_SELL_ITEM = 0xBADD, SMSG_SEND_MAIL_RESULT = 0x0302, - SMSG_SEND_UNLEARN_SPELLS = 0x1A82, + SMSG_SEND_SPELL_CHARGES = 0x1A82, + SMSG_SEND_SPELL_HISTORY = 0x1933, + SMSG_SEND_UNLEARN_SPELLS = 0x0BCB, SMSG_SERVERTIME = 0xBADD, SMSG_SERVER_FIRST_ACHIEVEMENT = 0xBADD, SMSG_SERVER_INFO_RESPONSE = 0xBADD, SMSG_SERVER_MESSAGE = 0x0683, SMSG_SERVER_PERF = 0xBADD, SMSG_SET_AI_ANIM_KIT = 0x0335, + SMSG_SET_ALL_TASK_PROGRESS = 0x1B52, + SMSG_SET_CURRENCY = 0x17BE, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0xBADD, SMSG_SET_FACTION_ATWAR = 0xBADD, SMSG_SET_FACTION_NOT_VISIBLE = 0xBADD, @@ -1299,6 +1309,7 @@ enum OpcodeServer : uint32 SMSG_SET_FACTION_VISIBLE = 0x138B, SMSG_SET_FLAT_SPELL_MODIFIER = 0x1884, SMSG_SET_FORCED_REACTIONS = 0x09A9, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x1489, SMSG_SET_MELEE_ANIM_KIT = 0xBADD, SMSG_SET_MOVEMENT_ANIM_KIT = 0xBADD, SMSG_SET_PCT_SPELL_MODIFIER = 0x113C, @@ -1367,6 +1378,7 @@ enum OpcodeServer : uint32 SMSG_SPLINE_MOVE_WATER_WALK = 0xBADD, SMSG_STABLE_RESULT = 0xBADD, SMSG_STANDSTATE_UPDATE = 0x1311, + SMSG_START_ELAPSED_TIMERS = 0x093F, SMSG_START_MIRROR_TIMER = 0xBADD, SMSG_START_TIMER = 0xBADD, SMSG_STOP_DANCE = 0xBADD, @@ -1381,7 +1393,7 @@ enum OpcodeServer : uint32 SMSG_TALENTS_ERROR = 0xBADD, SMSG_TALENTS_INFO = 0x012D, SMSG_TALENTS_INVOLUNTARILY_RESET = 0xBADD, - SMSG_TAXINODE_STATUS = 0xBADD, + SMSG_TAXINODE_STATUS = 0x0338, SMSG_TEST_DROP_RATE_RESULT = 0xBADD, SMSG_TEXT_EMOTE = 0x0383, SMSG_THREAT_CLEAR = 0xBADD, @@ -1417,6 +1429,7 @@ enum OpcodeServer : uint32 SMSG_UPDATE_LAST_INSTANCE = 0xBADD, SMSG_UPDATE_OBJECT = 0x122C, SMSG_UPDATE_SERVER_PLAYER_POSITION = 0xBADD, + SMSG_UPDATE_TASK_PROGRESS = 0x1209, SMSG_UPDATE_WORLD_STATE = 0x03EC, SMSG_USERLIST_ADD = 0xBADD, SMSG_USERLIST_REMOVE = 0xBADD, @@ -1424,7 +1437,7 @@ enum OpcodeServer : uint32 SMSG_VOICESESSION_FULL = 0xBADD, SMSG_VOICE_CHAT_STATUS = 0xBADD, SMSG_VOICE_PARENTAL_CONTROLS = 0xBADD, - SMSG_VOICE_SESSION_LEAVE = 0xBADD, + SMSG_VOICE_SESSION_LEAVE = 0x0403, SMSG_VOICE_SESSION_ROSTER_UPDATE = 0xBADD, SMSG_VOICE_SET_TALKER_MUTED = 0xBADD, SMSG_VOID_ITEM_SWAP_RESPONSE = 0x1131, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index eae081f2b74..6bb4daf9fc3 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -104,7 +104,9 @@ namespace WorldPackets namespace Channel { + class ChannelListRequest; class JoinChannel; + class LeaveChannel; } namespace Chat @@ -148,8 +150,10 @@ namespace WorldPackets namespace Misc { + class SetSelection; class ViolenceLevel; class TimeSyncResponse; + class TutorialSetFlag; } namespace Query @@ -191,17 +195,38 @@ enum AccountDataType #define REGISTERED_ADDON_PREFIX_SOFTCAP 64 +enum TutorialAction +{ + TUTORIAL_ACTION_UPDATE = 0, + TUTORIAL_ACTION_CLEAR = 1, + TUTORIAL_ACTION_RESET = 2 +}; + +/* enum Tutorials { - TUTORIAL_TALENT = 0, - TUTORIAL_SPEC = 1, - TUTORIAL_GLYPH = 2, - TUTORIAL_SPELLBOOK = 3, - TUTORIAL_PROFESSIONS = 4, - TUTORIAL_CORE_ABILITITES = 5, - TUTORIAL_PET_JOURNAL = 6, - TUTORIAL_WHAT_HAS_CHANGED = 7 + TUTORIAL_TALENT = 0, + TUTORIAL_SPEC = 1, + TUTORIAL_GLYPH = 2, + TUTORIAL_SPELLBOOK = 3, + TUTORIAL_PROFESSIONS = 4, + TUTORIAL_CORE_ABILITITES = 5, + TUTORIAL_PET_JOURNAL = 6, + TUTORIAL_WHAT_HAS_CHANGED = 7, + TUTORIAL_GARRISON_BUILDING = 8, + TUTORIAL_GARRISON_MISSION_LIST = 9, + TUTORIAL_GARRISON_MISSION_PAGE = 10, + TUTORIAL_GARRISON_LANDING = 11, + TUTORIAL_GARRISON_ZONE_ABILITY = 12, + TUTORIAL_WORLD_MAP_FRAME = 13, + TUTORIAL_CLEAN_UP_BAGS = 14, + TUTORIAL_BAG_SETTINGS = 15, + TUTORIAL_REAGENT_BANK_UNLOCK = 16, + TUTORIAL_TOYBOX_FAVORITE = 17, + TUTORIAL_TOYBOX_MOUSEWHEEL_PAGING = 18, + TUTORIAL_LFG_LIST = 19 }; +*/ #define MAX_ACCOUNT_TUTORIAL_VALUES 8 @@ -621,7 +646,7 @@ class WorldSession void HandleTogglePvP(WorldPacket& recvPacket); void HandleZoneUpdateOpcode(WorldPacket& recvPacket); - void HandleSetSelectionOpcode(WorldPacket& recvPacket); + void HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet); void HandleStandStateChangeOpcode(WorldPacket& recvPacket); void HandleEmoteOpcode(WorldPacket& recvPacket); void HandleContactListOpcode(WorldPacket& recvPacket); @@ -887,9 +912,9 @@ class WorldSession void HandleResurrectResponseOpcode(WorldPacket& recvPacket); void HandleSummonResponseOpcode(WorldPacket& recvData); - void HandleJoinChannel(WorldPacket& recvPacket); - void HandleLeaveChannel(WorldPacket& recvPacket); - void HandleChannelList(WorldPacket& recvPacket); + void HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet); + void HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet); + void HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet); void HandleChannelPassword(WorldPacket& recvPacket); void HandleChannelSetOwner(WorldPacket& recvPacket); void HandleChannelOwner(WorldPacket& recvPacket); @@ -904,7 +929,6 @@ class WorldSession void HandleChannelAnnouncements(WorldPacket& recvPacket); void HandleChannelModerate(WorldPacket& recvPacket); void HandleChannelDeclineInvite(WorldPacket& recvPacket); - void HandleChannelDisplayListQuery(WorldPacket& recvPacket); void HandleGetChannelMemberCount(WorldPacket& recvPacket); void HandleSetChannelWatch(WorldPacket& recvPacket); @@ -913,9 +937,7 @@ class WorldSession void HandlePageTextQueryOpcode(WorldPackets::Query::QueryPageText& packet); - void HandleTutorialFlag (WorldPacket& recvData); - void HandleTutorialClear(WorldPacket& recvData); - void HandleTutorialReset(WorldPacket& recvData); + void HandleTutorialFlag(WorldPackets::Misc::TutorialSetFlag& packet); //Pet void HandlePetAction(WorldPacket& recvData); diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index 715487eff99..664c8f3d216 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -74,7 +74,7 @@ public: Player* player = handler->GetSession()->GetPlayer(); Channel* channcel = NULL; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(player->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(player->GetTeam())) channcel = cMgr->GetChannel(channelStr, player); if (strcmp(argStr, "on") == 0) |