From b68823b4cb25a845986c6d8940d64e4c7b01dcca Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Fri, 17 Nov 2023 18:44:48 -0600 Subject: [PATCH] fix: properly check friend list limits (#1300) * fix: properly check friend list limits added a config for friend list limit for the brave that want to mod the client to sanely go over 50 moved the best friend limit config to chatconfig.ini where it should be cleanup loading these configs options a bit Tested that the BFF limit works and that the new friend limit works as well * fix typo * fix member variable naming --- dChatServer/ChatPacketHandler.cpp | 21 +++++++++++++-------- dChatServer/PlayerContainer.cpp | 18 ++++++++++-------- dChatServer/PlayerContainer.h | 18 +++++++++++------- resources/chatconfig.ini | 9 +++++++++ resources/worldconfig.ini | 4 ---- 5 files changed, 43 insertions(+), 27 deletions(-) diff --git a/dChatServer/ChatPacketHandler.cpp b/dChatServer/ChatPacketHandler.cpp index 72383c38a..f9ab18c9e 100644 --- a/dChatServer/ChatPacketHandler.cpp +++ b/dChatServer/ChatPacketHandler.cpp @@ -96,9 +96,6 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) { } void ChatPacketHandler::HandleFriendRequest(Packet* packet) { - auto maxNumberOfBestFriendsAsString = Game::config->GetValue("max_number_of_best_friends"); - // If this config option doesn't exist, default to 5 which is what live used. - auto maxNumberOfBestFriends = maxNumberOfBestFriendsAsString != "" ? std::stoi(maxNumberOfBestFriendsAsString) : 5U; CINSTREAM_SKIP_HEADER; LWOOBJID requestorPlayerID; inStream.Read(requestorPlayerID); @@ -204,11 +201,12 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { // Only do updates if there was a change in the bff status. if (oldBestFriendStatus != bestFriendStatus) { - if (requestee->countOfBestFriends >= maxNumberOfBestFriends || requestor->countOfBestFriends >= maxNumberOfBestFriends) { - if (requestee->countOfBestFriends >= maxNumberOfBestFriends) { + auto maxBestFriends = playerContainer.GetMaxNumberOfBestFriends(); + if (requestee->countOfBestFriends >= maxBestFriends || requestor->countOfBestFriends >= maxBestFriends) { + if (requestee->countOfBestFriends >= maxBestFriends) { SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::THEIRFRIENDLISTFULL, false); } - if (requestor->countOfBestFriends >= maxNumberOfBestFriends) { + if (requestor->countOfBestFriends >= maxBestFriends) { SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::YOURFRIENDSLISTFULL, false); } } else { @@ -242,8 +240,15 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { if (requestor->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::WAITINGAPPROVAL, true, true); } } else { - // Do not send this if we are requesting to be a best friend. - SendFriendRequest(requestee.get(), requestor); + auto maxFriends = playerContainer.GetMaxNumberOfFriends(); + if (requestee->friends.size() >= maxFriends) { + SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::THEIRFRIENDLISTFULL, false); + } else if (requestor->friends.size() >= maxFriends) { + SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::YOURFRIENDSLISTFULL, false); + } else { + // Do not send this if we are requesting to be a best friend. + SendFriendRequest(requestee.get(), requestor); + } } // If the player is actually a player and not a ghost one defined above, release it from being deleted. diff --git a/dChatServer/PlayerContainer.cpp b/dChatServer/PlayerContainer.cpp index f467cfbe6..bb14a0963 100644 --- a/dChatServer/PlayerContainer.cpp +++ b/dChatServer/PlayerContainer.cpp @@ -14,10 +14,12 @@ #include "dConfig.h" PlayerContainer::PlayerContainer() { + GeneralUtils::TryParse(Game::config->GetValue("max_number_of_best_friends"), m_MaxNumberOfBestFriends); + GeneralUtils::TryParse(Game::config->GetValue("max_number_of_friends"), m_MaxNumberOfFriends); } PlayerContainer::~PlayerContainer() { - mPlayers.clear(); + m_Players.clear(); } TeamData::TeamData() { @@ -41,9 +43,9 @@ void PlayerContainer::InsertPlayer(Packet* packet) { inStream.Read(data->muteExpire); data->sysAddr = packet->systemAddress; - mNames[data->playerID] = GeneralUtils::UTF8ToUTF16(data->playerName); + m_Names[data->playerID] = GeneralUtils::UTF8ToUTF16(data->playerName); - mPlayers.insert(std::make_pair(data->playerID, data)); + m_Players.insert(std::make_pair(data->playerID, data)); LOG("Added user: %s (%llu), zone: %i", data->playerName.c_str(), data->playerID, data->zoneID.GetMapID()); auto* insertLog = Database::CreatePreppedStmt("INSERT INTO activity_log (character_id, activity, time, map_id) VALUES (?, ?, ?, ?);"); @@ -88,7 +90,7 @@ void PlayerContainer::RemovePlayer(Packet* packet) { } LOG("Removed user: %llu", playerID); - mPlayers.erase(playerID); + m_Players.erase(playerID); auto* insertLog = Database::CreatePreppedStmt("INSERT INTO activity_log (character_id, activity, time, map_id) VALUES (?, ?, ?, ?);"); @@ -191,7 +193,7 @@ TeamData* PlayerContainer::CreateLocalTeam(std::vector members) { TeamData* PlayerContainer::CreateTeam(LWOOBJID leader, bool local) { auto* team = new TeamData(); - team->teamID = ++mTeamIDCounter; + team->teamID = ++m_TeamIDCounter; team->leaderID = leader; team->local = local; @@ -376,15 +378,15 @@ void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam) { } std::u16string PlayerContainer::GetName(LWOOBJID playerID) { - const auto& pair = mNames.find(playerID); + const auto& pair = m_Names.find(playerID); - if (pair == mNames.end()) return u""; + if (pair == m_Names.end()) return u""; return pair->second; } LWOOBJID PlayerContainer::GetId(const std::u16string& playerName) { - for (const auto& pair : mNames) { + for (const auto& pair : m_Names) { if (pair.second == playerName) { return pair.first; } diff --git a/dChatServer/PlayerContainer.h b/dChatServer/PlayerContainer.h index a0a400583..000164ac7 100644 --- a/dChatServer/PlayerContainer.h +++ b/dChatServer/PlayerContainer.h @@ -39,13 +39,13 @@ class PlayerContainer { void BroadcastMuteUpdate(LWOOBJID player, time_t time); PlayerData* GetPlayerData(const LWOOBJID& playerID) { - auto it = mPlayers.find(playerID); - if (it != mPlayers.end()) return it->second; + auto it = m_Players.find(playerID); + if (it != m_Players.end()) return it->second; return nullptr; } PlayerData* GetPlayerData(const std::string& playerName) { - for (auto player : mPlayers) { + for (auto player : m_Players) { if (player.second) { std::string pn = player.second->playerName.c_str(); if (pn == playerName) return player.second; @@ -67,13 +67,17 @@ class PlayerContainer { std::u16string GetName(LWOOBJID playerID); LWOOBJID GetId(const std::u16string& playerName); bool GetIsMuted(PlayerData* data); + uint32_t GetMaxNumberOfBestFriends() { return m_MaxNumberOfBestFriends; } + uint32_t GetMaxNumberOfFriends() { return m_MaxNumberOfFriends; } - std::map& GetAllPlayerData() { return mPlayers; } + std::map& GetAllPlayerData() { return m_Players; } private: - LWOOBJID mTeamIDCounter = 0; - std::map mPlayers; + LWOOBJID m_TeamIDCounter = 0; + std::map m_Players; std::vector mTeams; - std::unordered_map mNames; + std::unordered_map m_Names; + uint32_t m_MaxNumberOfBestFriends = 5; + uint32_t m_MaxNumberOfFriends = 50; }; diff --git a/resources/chatconfig.ini b/resources/chatconfig.ini index 26b26cc78..1bb1d1b2f 100644 --- a/resources/chatconfig.ini +++ b/resources/chatconfig.ini @@ -1,2 +1,11 @@ # Port number port=2005 + +# If you would like to increase the maximum number of best friends a player can have on the server +# Change the value below to what you would like this to be (5 is live accurate) +max_number_of_best_friends=5 + +# If you would like to increase the maximum number of friends a player can have on the server +# Change the value below to what you would like this to be (50 is live accurate) +# going over 50 will be allowed in some secnarios, but proper handling will require client modding +max_number_of_friends=50 diff --git a/resources/worldconfig.ini b/resources/worldconfig.ini index 0072fc51f..0b15973da 100644 --- a/resources/worldconfig.ini +++ b/resources/worldconfig.ini @@ -40,10 +40,6 @@ classic_survival_scoring=0 # If this value is 1, pets will consume imagination as they did in live. if 0 they will not consume imagination at all. pets_take_imagination=1 -# If you would like to increase the maximum number of best friends a player can have on the server -# Change the value below to what you would like this to be (5 is live accurate) -max_number_of_best_friends=5 - # Disables loot drops disable_drops=0