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