diff options
-rw-r--r-- | src/server/game/Chat/Channels/Channel.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Chat/Channels/Channel.h | 8 | ||||
-rw-r--r-- | src/server/game/Chat/Channels/ChannelMgr.cpp | 69 | ||||
-rw-r--r-- | src/server/game/Chat/Channels/ChannelMgr.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Handlers/ChannelHandler.cpp | 19 |
6 files changed, 69 insertions, 39 deletions
diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 669d1c0acfb..37bb0ad6732 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -204,7 +204,7 @@ void Channel::JoinChannel(Player* player, std::string const& pass) return; } - if (!_channelPassword.empty() && pass != _channelPassword) + if (!CheckPassword(pass)) { WrongPasswordAppend appender; ChannelNameBuilder<WrongPasswordAppend> builder(this, appender); diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index 074d8368ccf..1f9f7fb402c 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -162,10 +162,10 @@ class TC_GAME_API Channel bool IsLFG() const { return (GetFlags() & CHANNEL_FLAG_LFG) != 0; } bool IsAnnounce() const { return _announceEnabled; } - void SetAnnounce(bool nannounce) { _announceEnabled = nannounce; } + void SetAnnounce(bool announce) { _announceEnabled = announce; } - std::string const& GetPassword() const { return _channelPassword; } - void SetPassword(std::string const& npassword) { _channelPassword = npassword; } + void SetPassword(std::string const& password) { _channelPassword = password; } + bool CheckPassword(std::string const& password) const { return _channelPassword.empty() || (_channelPassword == password); } uint32 GetNumPlayers() const { return _playersStore.size(); } @@ -174,7 +174,7 @@ class TC_GAME_API Channel AreaTableEntry const* GetZoneEntry() const { return _zoneEntry; } - void JoinChannel(Player* player, std::string const& pass); + void JoinChannel(Player* player, std::string const& pass = ""); void LeaveChannel(Player* player, bool send = true); void KickOrBan(Player const* player, std::string const& badname, bool ban); diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp index d1bcbb64eb9..95de940d824 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.cpp +++ b/src/server/game/Chat/Channels/ChannelMgr.cpp @@ -72,40 +72,53 @@ Channel* ChannelMgr::GetChannelForPlayerByNamePart(std::string const& namePart, return nullptr; } -Channel* ChannelMgr::GetJoinChannel(uint32 channelId, std::string const& name, AreaTableEntry const* zoneEntry /*= nullptr*/) +Channel* ChannelMgr::GetSystemChannel(uint32 channelId, AreaTableEntry const* zoneEntry) { - if (channelId) // builtin - { - ChatChannelsEntry const* channelEntry = sChatChannelsStore.AssertEntry(channelId); - uint32 zoneId = zoneEntry ? zoneEntry->ID : 0; - if (channelEntry->flags & (CHANNEL_DBC_FLAG_GLOBAL | CHANNEL_DBC_FLAG_CITY_ONLY)) - zoneId = 0; + ChatChannelsEntry const* channelEntry = sChatChannelsStore.AssertEntry(channelId); + uint32 zoneId = zoneEntry ? zoneEntry->ID : 0; + if (channelEntry->flags & (CHANNEL_DBC_FLAG_GLOBAL | CHANNEL_DBC_FLAG_CITY_ONLY)) + zoneId = 0; - std::pair<uint32, uint32> key = std::make_pair(channelId, zoneId); + std::pair<uint32, uint32> key = std::make_pair(channelId, zoneId); - auto itr = _channels.find(key); - if (itr != _channels.end()) - return itr->second; + auto itr = _channels.find(key); + if (itr != _channels.end()) + return itr->second; - Channel* newChannel = new Channel(channelId, _team, zoneEntry); - _channels[key] = newChannel; - return newChannel; - } - else // custom - { - std::wstring channelName; - if (!Utf8toWStr(name, channelName)) - return nullptr; + Channel* newChannel = new Channel(channelId, _team, zoneEntry); + _channels[key] = newChannel; + return newChannel; +} - wstrToLower(channelName); - auto itr = _customChannels.find(channelName); - if (itr != _customChannels.end()) - return itr->second; +Channel* ChannelMgr::CreateCustomChannel(std::string const& name) +{ + std::wstring channelName; + if (!Utf8toWStr(name, channelName)) + return nullptr; - Channel* newChannel = new Channel(name, _team); - _customChannels[channelName] = newChannel; - return newChannel; - } + wstrToLower(channelName); + + Channel*& c = _customChannels[channelName]; + if (c) + return nullptr; + + Channel* newChannel = new Channel(name, _team); + c = newChannel; + return newChannel; +} + +Channel* ChannelMgr::GetCustomChannel(std::string const& name) const +{ + std::wstring channelName; + if (!Utf8toWStr(name, channelName)) + return nullptr; + + wstrToLower(channelName); + auto itr = _customChannels.find(channelName); + if (itr != _customChannels.end()) + return itr->second; + else + return nullptr; } Channel* ChannelMgr::GetChannel(uint32 channelId, std::string const& name, Player* player, bool pkt /*= true*/, AreaTableEntry const* zoneEntry /*= nullptr*/) const diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h index be8943bf1a9..0c55d605c02 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.h +++ b/src/server/game/Chat/Channels/ChannelMgr.h @@ -41,7 +41,9 @@ class TC_GAME_API ChannelMgr static ChannelMgr* forTeam(uint32 team); static Channel* GetChannelForPlayerByNamePart(std::string const& namePart, Player* playerSearcher); - Channel* GetJoinChannel(uint32 channelId, std::string const& name, AreaTableEntry const* zoneEntry = nullptr); + Channel* GetSystemChannel(uint32 channelId, AreaTableEntry const* zoneEntry = nullptr); + Channel* CreateCustomChannel(std::string const& name); + Channel* GetCustomChannel(std::string const& name) const; Channel* GetChannel(uint32 channelId, std::string const& name, Player* player, bool pkt = true, AreaTableEntry const* zoneEntry = nullptr) const; void LeftChannel(std::string const& name); void LeftChannel(uint32 channelId, AreaTableEntry const* zoneEntry); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a62d8873264..355c1de617c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5099,7 +5099,7 @@ void Player::UpdateLocalChannels(uint32 newZone) if (channelEntry->flags & CHANNEL_DBC_FLAG_CITY_ONLY && usedChannel) continue; // Already on the channel, as city channel names are not changing - joinChannel = cMgr->GetJoinChannel(channelEntry->ChannelID, std::string(), current_zone); + joinChannel = cMgr->GetSystemChannel(channelEntry->ChannelID, current_zone); if (usedChannel) { if (joinChannel != usedChannel) @@ -5112,13 +5112,13 @@ void Player::UpdateLocalChannels(uint32 newZone) } } else - joinChannel = cMgr->GetJoinChannel(channelEntry->ChannelID, std::string()); + joinChannel = cMgr->GetSystemChannel(channelEntry->ChannelID); } else removeChannel = usedChannel; if (joinChannel) - joinChannel->JoinChannel(this, ""); // Changed Channel: ... or Joined Channel: ... + joinChannel->JoinChannel(this); // Changed Channel: ... or Joined Channel: ... if (removeChannel) { diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp index bb6eab2565e..531642d6958 100644 --- a/src/server/game/Handlers/ChannelHandler.cpp +++ b/src/server/game/Handlers/ChannelHandler.cpp @@ -68,8 +68,23 @@ void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) return; if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetJoinChannel(channelId, channelName, zone)) - channel->JoinChannel(GetPlayer(), password); + { + if (channelId) + { // system channel + if (Channel* channel = cMgr->GetSystemChannel(channelId, zone)) + channel->JoinChannel(GetPlayer()); + } + else + { // custom channel + if (Channel* channel = cMgr->GetCustomChannel(channelName)) + channel->JoinChannel(GetPlayer(), password); + else if (Channel* channel = cMgr->CreateCustomChannel(channelName)) + { + channel->SetPassword(password); + channel->JoinChannel(GetPlayer(), password); + } + } + } } void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) |