Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions NETWORKING.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,15 @@ A typical current server configuration xml that fits the current code version is
<!-- Clients below this value will be rejected from playing games. It's determined by number of addon soccer fields in client -->
<addon-soccers-play-threshold value="0" />

<!-- Karts needed to enter the server, leave empty for no restriction. -->
<must-have-karts value="" />

<!-- Tracks needed to enter the server, leave empty for no restriction. -->
<must-have-tracks value="" />

<!-- Karts needed to be able to play, leave empty for no restriction. -->
<play-requirement-karts value="" />

<!-- Tracks needed to be able to play, leave empty for no restriction. -->
<play-requirement-tracks value="" />

Expand Down
10 changes: 10 additions & 0 deletions src/network/server_config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,11 +296,21 @@ namespace ServerConfig
"Clients below this value will be rejected from playing games. "
"It's determined by number of addon soccer fields in client"));

SERVER_CFG_PREFIX StringServerConfigParam m_must_have_karts_string
SERVER_CFG_DEFAULT(StringServerConfigParam("",
"must-have-karts", "Karts needed to enter the server, "
"leave empty for no restriction."));

SERVER_CFG_PREFIX StringServerConfigParam m_must_have_tracks_string
SERVER_CFG_DEFAULT(StringServerConfigParam("",
"must-have-tracks", "Tracks needed to enter the server, "
"leave empty for no restriction."));

SERVER_CFG_PREFIX StringServerConfigParam m_play_requirement_karts_string
SERVER_CFG_DEFAULT(StringServerConfigParam("",
"play-requirement-karts", "Karts needed to be able to play, "
"leave empty for no restriction."));

SERVER_CFG_PREFIX StringServerConfigParam m_play_requirement_tracks_string
SERVER_CFG_DEFAULT(StringServerConfigParam("",
"play-requirement-tracks", "Tracks needed to be able to play, "
Expand Down
31 changes: 29 additions & 2 deletions src/utils/lobby_asset_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -376,8 +376,20 @@ bool LobbyAssetManager::handleAssetsForPeer(std::shared_ptr<STKPeer> peer,

bool bad = false;

bool has_required_karts = true;
for (const std::string& required_kart: m_must_have_karts)
{
if (client_karts.find(required_kart) == client_karts.end())
{
has_required_karts = false;
bad = true;
Log::verbose("LobbyAssetManager", "Player does not have a required kart '%s'.", required_kart.c_str());
break;
}
}

bool has_required_tracks = true;
for (const std::string& required_track : m_must_have_maps)
for (const std::string& required_track: m_must_have_maps)
{
if (client_tracks.find(required_track) == client_tracks.end())
{
Expand Down Expand Up @@ -578,6 +590,12 @@ std::string LobbyAssetManager::getRandomAddonMap() const
} // getRandomAddonMap
//-----------------------------------------------------------------------------

void LobbyAssetManager::setMustHaveKarts(const std::string& input)
{
m_must_have_karts = StringUtils::split(input, ' ', false);
} // setMustHaveKarts
//-----------------------------------------------------------------------------

void LobbyAssetManager::setMustHaveMaps(const std::string& input)
{
m_must_have_maps = StringUtils::split(input, ' ', false);
Expand Down Expand Up @@ -736,19 +754,28 @@ void LobbyAssetManager::initAvailableTracks()
{
m_global_filter = TrackFilter(ServerConfig::m_only_played_tracks_string);
m_global_karts_filter = KartFilter(ServerConfig::m_only_played_karts_string);
setMustHaveKarts(ServerConfig::m_must_have_karts_string);
setMustHaveMaps(ServerConfig::m_must_have_tracks_string);
m_play_requirement_karts = StringUtils::split(
ServerConfig::m_play_requirement_karts_string, ' ', false);
m_play_requirement_tracks = StringUtils::split(
ServerConfig::m_play_requirement_tracks_string, ' ', false);
} // initAvailableTracks
//-----------------------------------------------------------------------------

// Initially it was only for maps, but for the current purposes
// I guess it's fine to list both karts and maps at once without separating
std::vector<std::string> LobbyAssetManager::getMissingAssets(
std::shared_ptr<STKPeer> peer) const
{
if (m_play_requirement_tracks.empty())
if (m_play_requirement_karts.empty() && m_play_requirement_tracks.empty())
return {};

std::vector<std::string> ans;
for (const std::string& required_kart : m_play_requirement_karts)
if (peer->getClientAssets().first.count(required_kart) == 0)
ans.push_back(required_kart);

for (const std::string& required_track : m_play_requirement_tracks)
if (peer->getClientAssets().second.count(required_track) == 0)
ans.push_back(required_track);
Expand Down
3 changes: 3 additions & 0 deletions src/utils/lobby_asset_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class LobbyAssetManager: public LobbyContextComponent

std::set<std::string> getAvailableKarts() const
{ return m_available_kts.first; }
void setMustHaveKarts(const std::string& input);
void setMustHaveMaps(const std::string& input);
void gameFinishedOn(const std::string& map_name);

Expand Down Expand Up @@ -141,6 +142,7 @@ class LobbyAssetManager: public LobbyContextComponent
* with data in server first. */
std::pair<std::set<std::string>, std::set<std::string> > m_entering_kts;

std::vector<std::string> m_must_have_karts;
std::vector<std::string> m_must_have_maps;

std::vector<std::string> m_map_history;
Expand All @@ -149,6 +151,7 @@ class LobbyAssetManager: public LobbyContextComponent

KartFilter m_global_karts_filter;

std::vector<std::string> m_play_requirement_karts;
std::vector<std::string> m_play_requirement_tracks;

float m_official_karts_play_threshold;
Expand Down
Loading