From 99541725d478e8e04347a593f18b288f6bd7c668 Mon Sep 17 00:00:00 2001 From: kimden <23140380+kimden@users.noreply.github.com> Date: Mon, 10 Mar 2025 00:14:18 +0400 Subject: [PATCH 1/2] Move everything to LobbyContext, use less ServerConfig Seems to work --- src/items/bowling.cpp | 20 +- src/items/cake.cpp | 18 +- src/items/powerup.cpp | 8 +- src/items/swatter.cpp | 9 +- src/karts/abstract_kart.cpp | 7 + src/karts/abstract_kart.hpp | 3 + src/karts/explosion_animation.cpp | 11 +- src/network/game_setup.cpp | 3 +- src/network/game_setup.hpp | 3 +- src/network/protocols/command_manager.cpp | 626 +++++++++++----------- src/network/protocols/command_manager.hpp | 27 +- src/network/protocols/server_lobby.cpp | 475 ++++++++-------- src/network/protocols/server_lobby.hpp | 25 +- src/race/race_manager.hpp | 10 + src/utils/hit_processor.cpp | 21 +- src/utils/hit_processor.hpp | 9 +- src/utils/kart_elimination.cpp | 4 +- src/utils/kart_elimination.hpp | 9 +- src/utils/lobby_asset_manager.cpp | 15 +- src/utils/lobby_asset_manager.hpp | 10 +- src/utils/lobby_context.cpp | 61 +++ src/utils/lobby_context.hpp | 97 ++++ src/utils/lobby_queues.cpp | 5 +- src/utils/lobby_queues.hpp | 7 +- src/utils/lobby_settings.cpp | 103 +++- src/utils/lobby_settings.hpp | 132 ++++- src/utils/map_vote_handler.cpp | 23 +- src/utils/map_vote_handler.hpp | 9 +- src/utils/tournament.cpp | 20 +- src/utils/tournament.hpp | 10 +- 30 files changed, 1038 insertions(+), 742 deletions(-) create mode 100644 src/utils/lobby_context.cpp create mode 100644 src/utils/lobby_context.hpp diff --git a/src/items/bowling.cpp b/src/items/bowling.cpp index 6c44d003bbe..34c3fc4303e 100644 --- a/src/items/bowling.cpp +++ b/src/items/bowling.cpp @@ -24,10 +24,10 @@ #include "graphics/material.hpp" #include "io/xml_node.hpp" #include "karts/abstract_kart.hpp" +#include "guiengine/engine.hpp" +#include "config/stk_config.hpp" // #include "modes/linear_world.hpp" -#include "network/protocols/server_lobby.hpp" - #include "utils/hit_processor.hpp" #include "utils/log.hpp" //TODO: remove after debugging is done @@ -157,9 +157,9 @@ bool Bowling::updateAndDelete(int ticks) */ bool Bowling::hit(AbstractKart* kart, PhysicalObject* obj) { - auto sl = LobbyProtocol::get(); - if (sl) - sl->getHitProcessor()->setTeammateHitOwner(getOwnerId(),m_ticks_since_thrown); + auto hp = kart->getHitProcessor(); + if (hp) + hp->setTeammateHitOwner(getOwnerId(),m_ticks_since_thrown); bool was_real_hit = Flyable::hit(kart, obj); if (was_real_hit) @@ -167,10 +167,10 @@ bool Bowling::hit(AbstractKart* kart, PhysicalObject* obj) if (kart && kart->isShielded()) { kart->decreaseShieldTime(); - if (sl) + if (hp) { - sl->getHitProcessor()->registerTeammateHit(kart->getWorldKartId()); - sl->getHitProcessor()->handleTeammateHits(); + hp->registerTeammateHit(kart->getWorldKartId()); + hp->handleTeammateHits(); } return true; } @@ -180,8 +180,8 @@ bool Bowling::hit(AbstractKart* kart, PhysicalObject* obj) explode(kart, obj, /*hit_secondary*/false); } } - if (sl) - sl->getHitProcessor()->handleTeammateHits(); + if (hp) + hp->handleTeammateHits(); return was_real_hit; } // hit diff --git a/src/items/cake.cpp b/src/items/cake.cpp index dd3f2de6b2f..199b73d2b74 100644 --- a/src/items/cake.cpp +++ b/src/items/cake.cpp @@ -27,8 +27,6 @@ #include "utils/hit_processor.hpp" #include "utils/random_generator.hpp" -#include "network/protocols/server_lobby.hpp" - #include "utils/log.hpp" //TODO: remove after debugging is done float Cake::m_st_max_distance_squared; @@ -64,9 +62,9 @@ void Cake::init(const XMLNode &node, scene::IMesh *cake_model) */ bool Cake::hit(AbstractKart* kart, PhysicalObject* obj) { - auto sl = LobbyProtocol::get(); - if (sl) - sl->getHitProcessor()->setTeammateHitOwner(getOwnerId()); + auto hp = kart->getHitProcessor(); + if (hp) + hp->setTeammateHitOwner(getOwnerId()); bool was_real_hit = Flyable::hit(kart, obj); if (was_real_hit) @@ -74,18 +72,18 @@ bool Cake::hit(AbstractKart* kart, PhysicalObject* obj) if (kart && kart->isShielded()) { kart->decreaseShieldTime(); - if (sl) + if (hp) { - sl->getHitProcessor()->registerTeammateHit(kart->getWorldKartId()); - sl->getHitProcessor()->handleTeammateHits(); + hp->registerTeammateHit(kart->getWorldKartId()); + hp->handleTeammateHits(); } return false; //Not sure if a shield hit is a real hit. } explode(kart, obj); } - if (sl) - sl->getHitProcessor()->handleTeammateHits(); + if (hp) + hp->handleTeammateHits(); return was_real_hit; } // hit diff --git a/src/items/powerup.cpp b/src/items/powerup.cpp index 253fe2af95d..822f40abbe9 100644 --- a/src/items/powerup.cpp +++ b/src/items/powerup.cpp @@ -39,8 +39,6 @@ #include "utils/string_utils.hpp" #include "utils/log.hpp" //TODO: remove after debugging is done -#include "network/protocols/server_lobby.hpp" - //----------------------------------------------------------------------------- /** Constructor, stores the kart to which this powerup belongs. * \param kart The kart to which this powerup belongs. @@ -404,9 +402,9 @@ void Powerup::use() if(kart->getPosition() == 1) { // check if we are in team gp and hit a teammate and should punish the attacker - auto sl = LobbyProtocol::get(); - if(sl && !kart->hasFinishedRace()) - sl->getHitProcessor()->handleAnvilHit(m_kart->getWorldKartId(), kart->getWorldKartId()); + auto hp = kart->getHitProcessor(); + if(hp && !kart->hasFinishedRace()) + hp->handleAnvilHit(m_kart->getWorldKartId(), kart->getWorldKartId()); kart->getAttachment()->set(Attachment::ATTACH_ANVIL, stk_config-> diff --git a/src/items/swatter.cpp b/src/items/swatter.cpp index 9f15af56d63..b6674b1377b 100644 --- a/src/items/swatter.cpp +++ b/src/items/swatter.cpp @@ -42,7 +42,6 @@ #include "modes/capture_the_flag.hpp" #include "network/network_string.hpp" #include "network/rewind_manager.hpp" -#include "network/protocols/server_lobby.hpp" #include "utils/hit_processor.hpp" #include @@ -398,7 +397,7 @@ void Swatter::squashThingsAround() const KartProperties *kp = m_kart->getKartProperties(); float duration = kp->getSwatterSquashDuration(); - float slowdown = kp->getSwatterSquashSlowdown(); + float slowdown = kp->getSwatterSquashSlowdown(); // The squash attempt may fail because of invulnerability, shield, etc. // Making a bomb explode counts as a success bool wasHit = !m_closest_kart->isInvulnerable() && !m_closest_kart->getKartAnimation(); @@ -411,9 +410,9 @@ void Swatter::squashThingsAround() if (wasHit) { // check if we are in team gp and hit a teammate and should punish attacker - auto sl = LobbyProtocol::get(); - if (sl && !m_closest_kart->hasFinishedRace()) - sl->getHitProcessor()->handleSwatterHit(m_kart->getWorldKartId(), + auto hp = m_kart->getHitProcessor(); + if (hp && !m_closest_kart->hasFinishedRace()) + hp->handleSwatterHit(m_kart->getWorldKartId(), m_closest_kart->getWorldKartId(), success, m_has_hit_kart, World::getWorld()->getTicksSinceStart() - m_created_ticks); } diff --git a/src/karts/abstract_kart.cpp b/src/karts/abstract_kart.cpp index b83f2473fb3..800f9d73ebe 100644 --- a/src/karts/abstract_kart.cpp +++ b/src/karts/abstract_kart.cpp @@ -28,6 +28,7 @@ #include "karts/kart_properties_manager.hpp" #include "karts/official_karts.hpp" #include "network/network_config.hpp" +#include "utils/hit_processor.hpp" #include "physics/physics.hpp" #include "utils/log.hpp" #include "utils/string_utils.hpp" @@ -276,3 +277,9 @@ void AbstractKart::makeKartRest() body->proceedToTransform(t); setTrans(t); } // makeKartRest + +// ---------------------------------------------------------------------------- +std::shared_ptr AbstractKart::getHitProcessor() const +{ + return RaceManager::get()->getHitProcessor(); +} // getHitProcessor diff --git a/src/karts/abstract_kart.hpp b/src/karts/abstract_kart.hpp index dafd3c70a6d..8b512b0cd24 100644 --- a/src/karts/abstract_kart.hpp +++ b/src/karts/abstract_kart.hpp @@ -25,6 +25,7 @@ #include "karts/moveable.hpp" #include "karts/controller/kart_control.hpp" #include "race/race_manager.hpp" +class HitProcessor; namespace irr { @@ -550,6 +551,8 @@ class AbstractKart : public Moveable /** Return the confirmed finish ticks (sent by the server) * indicating that this kart has really finished the race. */ virtual int getNetworkConfirmedFinishTicks() const = 0; + // ------------------------------------------------------------------------ + std::shared_ptr getHitProcessor() const; }; // AbstractKart diff --git a/src/karts/explosion_animation.cpp b/src/karts/explosion_animation.cpp index 799cf8e8e46..79326e11454 100644 --- a/src/karts/explosion_animation.cpp +++ b/src/karts/explosion_animation.cpp @@ -28,7 +28,6 @@ #include "modes/follow_the_leader.hpp" #include "network/network_string.hpp" #include "network/protocols/client_lobby.hpp" -#include "network/protocols/server_lobby.hpp" #include "race/race_manager.hpp" #include "tracks/track.hpp" #include "utils/hit_processor.hpp" @@ -57,13 +56,13 @@ ExplosionAnimation *ExplosionAnimation::create(AbstractKart *kart, // Ignore explosion that are too far away. if(!direct_hit && pos.distance2(kart->getXYZ())>r*r) return NULL; - auto sl = LobbyProtocol::get(); + auto hp = kart->getHitProcessor(); if(kart->isShielded()) { kart->decreaseShieldTime(); - if (sl) - sl->getHitProcessor()->registerTeammateHit(kart->getWorldKartId()); + if (hp) + hp->registerTeammateHit(kart->getWorldKartId()); return NULL; } @@ -75,8 +74,8 @@ ExplosionAnimation *ExplosionAnimation::create(AbstractKart *kart, ftl_world->leaderHit(); } - if (sl) - sl->getHitProcessor()->registerTeammateExplode(kart->getWorldKartId()); + if (hp) + hp->registerTeammateExplode(kart->getWorldKartId()); return new ExplosionAnimation(kart, direct_hit); } // create diff --git a/src/network/game_setup.cpp b/src/network/game_setup.cpp index d86a62721d1..a09fd83369b 100644 --- a/src/network/game_setup.cpp +++ b/src/network/game_setup.cpp @@ -30,6 +30,7 @@ #include "network/stk_host.hpp" #include "race/race_manager.hpp" #include "utils/file_utils.hpp" +#include "utils/lobby_settings.hpp" #include "utils/log.hpp" #include "utils/stk_process.hpp" #include "utils/string_utils.hpp" @@ -145,7 +146,7 @@ void GameSetup::addServerInfo(NetworkString* ns) ns->encodeString16(m_message_of_today); ns->addUInt8((uint8_t)ServerConfig::m_server_configurable); - ns->addUInt8(ServerConfig::m_live_players? 1 : 0); + ns->addUInt8(getSettings()->isLivePlayers() ? 1 : 0); } // addServerInfo //----------------------------------------------------------------------------- diff --git a/src/network/game_setup.hpp b/src/network/game_setup.hpp index 36811d51b16..20c4c35c3f7 100644 --- a/src/network/game_setup.hpp +++ b/src/network/game_setup.hpp @@ -23,6 +23,7 @@ #define GAME_SETUP_HPP #include +#include "utils/lobby_context.hpp" #include #include @@ -39,7 +40,7 @@ class PeerVote; * \brief Used to store the needed data about the players that join a game. * This class stores all the possible information about players in a lobby. */ -class GameSetup +class GameSetup: public LobbyContextUser { private: std::vector m_tracks; diff --git a/src/network/protocols/command_manager.cpp b/src/network/protocols/command_manager.cpp index 29f2267a766..3dbe978567b 100644 --- a/src/network/protocols/command_manager.cpp +++ b/src/network/protocols/command_manager.cpp @@ -37,6 +37,7 @@ #include "utils/hourglass_reason.hpp" #include "utils/kart_elimination.hpp" #include "utils/lobby_asset_manager.hpp" +#include "utils/lobby_context.hpp" #include "utils/lobby_settings.hpp" #include "utils/lobby_queues.hpp" #include "utils/log.hpp" @@ -244,7 +245,7 @@ CommandManager::Command::Command(std::string name, void CommandManager::initCommandsInfo() { // "commands.xml" - const std::string file_name = file_manager->getAsset(ServerConfig::m_commands_file); + const std::string file_name = file_manager->getAsset(getSettings()->getCommandsFile()); const XMLNode *root = file_manager->createXMLTree(file_name); uint32_t version = 1; root->get("version", &version); @@ -541,8 +542,8 @@ void CommandManager::initCommands() applyFunctionIfPossible("liststkaddon", &CM::special); applyFunctionIfPossible("listlocaladdon", &CM::special); - addTextResponse("description", m_lobby_settings->getMotd()); - addTextResponse("moreinfo", m_lobby_settings->getHelpMessage()); + addTextResponse("description", getSettings()->getMotd()); + addTextResponse("moreinfo", getSettings()->getHelpMessage()); std::string version = "1.3 k 210fff beta"; #ifdef GIT_VERSION version = std::string(GIT_VERSION); @@ -602,19 +603,8 @@ void CommandManager::initAssets() } // initAssets // ======================================================================== -CommandManager::CommandManager(ServerLobby* lobby): - m_lobby(lobby) +void CommandManager::setupContextUser() { - if (!lobby) - return; - - m_hit_processor = lobby->getHitProcessor(); - m_asset_manager = lobby->getLobbyAssetManager(); - m_tournament = lobby->getTournament(); - m_lobby_queues = lobby->getLobbyQueues(); - m_lobby_settings = lobby->getLobbySettings(); - m_kart_elimination = lobby->getKartElimination(); - initCommands(); initAssets(); @@ -660,7 +650,7 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) return; CommandManager::restoreCmdByArgv(cmd, argv, ' ', '"', '"', '\\'); - permissions = m_lobby->getPermissions(peer); + permissions = getLobby()->getPermissions(peer); voting = false; std::string action = "invoke"; std::string username = ""; @@ -673,7 +663,7 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) if (argv.size() == 1 || argv[1] == "vote") { std::string msg = "Usage: /vote (a command with arguments)"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } std::reverse(argv.begin(), argv.end()); @@ -704,7 +694,7 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) msg = "Pick one of " + std::to_string(-1 + (int)m_user_command_replacements[username].size()) + " options using /1, etc., or use /0, or type a different command"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } } @@ -737,20 +727,20 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) { // todo change message std::string msg = "There is no such command but there should be. Very strange. Please report it."; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } else if (!isAvailable(command)) { std::string msg = "You don't have permissions to " + action + " this command"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } int mask = (permissions & command->m_permissions); if (mask == 0) { std::string msg = "You don't have permissions to " + action + " this command"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } int mask_without_voting = (mask & ~PE_VOTED); @@ -790,7 +780,7 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) first_time = false; } } - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); auto res = response.second; if (!res.empty()) { @@ -800,7 +790,7 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) auto new_argv = StringUtils::splitQuoted(new_cmd, ' ', '"', '"', '\\'); CommandManager::restoreCmdByArgv(new_cmd, new_argv, ' ', '"', '"', '\\'); std::string msg2 = "Command \"/" + new_cmd + "\" has been successfully voted"; - m_lobby->sendStringToAllPeers(msg2); + getLobby()->sendStringToAllPeers(msg2); Context new_context(event, std::shared_ptr(nullptr), new_argv, new_cmd, UP_EVERYONE, false); execute(executed_command, new_context); } @@ -822,7 +812,7 @@ int CommandManager::getCurrentModeScope() int CommandManager::getCurrentStateScope() { - auto state = m_lobby->m_state.load(); + auto state = getLobby()->m_state.load(); if (state < ServerLobby::WAITING_FOR_START_GAME || state > ServerLobby::RESULT_DISPLAY) return 0; @@ -875,7 +865,7 @@ void CommandManager::update() auto new_argv = StringUtils::splitQuoted(new_cmd, ' ', '"', '"', '\\'); CommandManager::restoreCmdByArgv(new_cmd, new_argv, ' ', '"', '"', '\\'); std::string msg = "Command \"/" + new_cmd + "\" has been successfully voted"; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); // Happily the name of the votable coincides with the command full name std::shared_ptr command = m_full_name_to_command[votable_pairs.first].lock(); if (!command) @@ -913,7 +903,7 @@ void CommandManager::error(Context& context, bool is_error) msg = "An error occurred while invoking command \"" + command->getFullName() + "\"."; if (is_error) msg += "\n/!\\ Please report this error to the server owner"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // error // ======================================================================== @@ -953,7 +943,7 @@ void CommandManager::process_help(Context& context) return; } std::string msg = command->getHelp(); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_help // ======================================================================== @@ -973,7 +963,7 @@ void CommandManager::process_text(Context& context) + " is defined without text"; else response = it->second; - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_text // ======================================================================== @@ -993,7 +983,7 @@ void CommandManager::process_file(Context& context) + command->getFullName(); else response = it->second.get(); - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_text // ======================================================================== @@ -1022,7 +1012,7 @@ void CommandManager::process_auth(Context& context) else response = it->second.get(username, online_id); } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_text // ======================================================================== @@ -1058,7 +1048,7 @@ void CommandManager::process_commands(Context& context) if (!valid_prefix) { result = "There are no available commands with such prefix"; - m_lobby->sendStringToPeer(result, peer); + getLobby()->sendStringToPeer(result, peer); return; } result = (command == m_root_command ? "Available commands" @@ -1091,7 +1081,7 @@ void CommandManager::process_commands(Context& context) } if (had_any_subcommands) result += "\n* has subcommands"; - m_lobby->sendStringToPeer(result, peer); + getLobby()->sendStringToPeer(result, peer); } // process_commands // ======================================================================== @@ -1106,7 +1096,7 @@ void CommandManager::process_replay(Context& context) } if (ServerConfig::m_record_replays) { - bool current_state = m_lobby_settings->hasConsentOnReplays(); + bool current_state = getSettings()->hasConsentOnReplays(); if (argv.size() >= 2 && argv[1] == "0") current_state = false; else if (argv.size() >= 2 && argv[1] == "1") @@ -1114,15 +1104,15 @@ void CommandManager::process_replay(Context& context) else current_state ^= 1; - m_lobby_settings->setConsentOnReplays(current_state); + getSettings()->setConsentOnReplays(current_state); std::string msg = "Recording ghost replays is now "; msg += (current_state ? "on" : "off"); - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } else { std::string msg = "This server doesn't allow recording replays"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } } // process_replay // ======================================================================== @@ -1138,7 +1128,7 @@ void CommandManager::process_start(Context& context) vote(context, "start", ""); return; } - m_lobby->startSelection(context.m_event); + getLobby()->startSelection(context.m_event); } // process_start // ======================================================================== @@ -1150,9 +1140,9 @@ void CommandManager::process_config(Context& context) error(context, true); return; } - int difficulty = m_lobby->getDifficulty(); - int mode = m_lobby->getGameMode(); - bool goal_target = (m_lobby->m_game_setup->hasExtraServerInfo() ? m_lobby->isSoccerGoalTarget() : false); + int difficulty = getLobby()->getDifficulty(); + int mode = getLobby()->getGameMode(); + bool goal_target = (getLobby()->m_game_setup->hasExtraServerInfo() ? getLobby()->isSoccerGoalTarget() : false); // m_aux_goal_aliases[goal_target ? 1 : 0][0] std::string msg = "Current config: "; auto get_first_if_exists = [&](std::vector& v) -> std::string { @@ -1168,7 +1158,7 @@ void CommandManager::process_config(Context& context) msg += get_first_if_exists(m_aux_goal_aliases[goal_target ? 1 : 0]); if (!ServerConfig::m_server_configurable) msg += " (not configurable)"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_config // ======================================================================== @@ -1178,13 +1168,13 @@ void CommandManager::process_config_assign(Context& context) if (!ServerConfig::m_server_configurable) { std::string msg = "Server is not configurable, this command cannot be invoked."; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } const auto& argv = context.m_argv; - int difficulty = m_lobby->getDifficulty(); - int mode = m_lobby->getGameMode(); - bool goal_target = (m_lobby->m_game_setup->hasExtraServerInfo() ? m_lobby->isSoccerGoalTarget() : false); + int difficulty = getLobby()->getDifficulty(); + int mode = getLobby()->getGameMode(); + bool goal_target = (getLobby()->m_game_setup->hasExtraServerInfo() ? getLobby()->isSoccerGoalTarget() : false); bool user_chose_difficulty = false; bool user_chose_mode = false; bool user_chose_target = false; @@ -1223,11 +1213,11 @@ void CommandManager::process_config_assign(Context& context) // if (mode != 6) { // goal_target = false; // } - if (!m_lobby_settings->isDifficultyAvailable(difficulty) - || !m_lobby_settings->isModeAvailable(mode)) + if (!getSettings()->isDifficultyAvailable(difficulty) + || !getSettings()->isModeAvailable(mode)) { std::string response = "Mode or difficulty are not permitted on this server"; - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); return; } if (context.m_voting) @@ -1242,7 +1232,7 @@ void CommandManager::process_config_assign(Context& context) vote(context, "config target", m_aux_goal_aliases[goal_target ? 1 : 0][0]); return; } - m_lobby->handleServerConfiguration(peer, difficulty, mode, goal_target); + getLobby()->handleServerConfiguration(peer, difficulty, mode, goal_target); } // process_config_assign // ======================================================================== @@ -1257,12 +1247,12 @@ void CommandManager::process_spectate(Context& context) return; } - if (/*m_game_setup->isGrandPrix() || */!ServerConfig::m_live_players) + if (/*m_game_setup->isGrandPrix() || */!getSettings()->isLivePlayers()) response = "Server doesn't support spectating"; if (!response.empty()) { - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); return; } @@ -1283,22 +1273,22 @@ void CommandManager::process_spectate(Context& context) } if (value >= 1) { - if (m_lobby->m_process_type == PT_CHILD && - peer->getHostId() == m_lobby->m_client_server_host_id.load()) + if (getLobby()->m_process_type == PT_CHILD && + peer->getHostId() == getLobby()->m_client_server_host_id.load()) { std::string msg = "Graphical client server cannot spectate"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } AlwaysSpectateMode type = (value == 2 ? ASM_COMMAND_ABSENT : ASM_COMMAND); - m_lobby->setSpectateModeProperly(peer, type); + getLobby()->setSpectateModeProperly(peer, type); } else { - m_lobby->setSpectateModeProperly(peer, ASM_NONE); + getLobby()->setSpectateModeProperly(peer, ASM_NONE); } - m_lobby->updateServerOwner(true); - m_lobby->updatePlayerList(); + getLobby()->updateServerOwner(true); + getLobby()->updatePlayerList(); } // process_spectate // ======================================================================== @@ -1320,16 +1310,17 @@ void CommandManager::process_addons(Context& context) apply_filters = true; argv[1] = getAddonPreferredType(); } + auto asset_manager = getAssetManager(); // removed const reference so that I can modify `from` // without changing the original container, we copy everything anyway std::set from = - (argv[1] == "kart" ? m_asset_manager->getAddonKarts() : - (argv[1] == "track" ? m_asset_manager->getAddonTracks() : - (argv[1] == "arena" ? m_asset_manager->getAddonArenas() : - /*argv[1] == "soccer" ?*/ m_asset_manager->getAddonSoccers() + (argv[1] == "kart" ? asset_manager->getAddonKarts() : + (argv[1] == "track" ? asset_manager->getAddonTracks() : + (argv[1] == "arena" ? asset_manager->getAddonArenas() : + /*argv[1] == "soccer" ?*/ asset_manager->getAddonSoccers() ))); if (apply_filters) - m_lobby->applyAllFilters(from, false); // happily the type is never karts in this line + getLobby()->applyAllFilters(from, false); // happily the type is never karts in this line std::vector>> result; for (const std::string& s: from) result.push_back({s, {}}); @@ -1341,7 +1332,7 @@ void CommandManager::process_addons(Context& context) if (!p || !p->isValidated()) continue; if ((!more_own || p != peer) && (p->isWaitingForGame() - || !m_lobby->canRace(p) || p->isCommandSpectator())) + || !getLobby()->canRace(p) || p->isCommandSpectator())) continue; if (!p->hasPlayerProfiles()) continue; @@ -1439,7 +1430,7 @@ void CommandManager::process_addons(Context& context) response = "No one in the lobby can play. Found " + std::to_string(all_have.size()) + " assets on the server."; } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_addons // ======================================================================== @@ -1467,20 +1458,21 @@ void CommandManager::process_checkaddon(Context& context) unsigned server_status = 0; std::vector players[4]; - if (m_asset_manager->hasAddonKart(id)) + auto asset_manager = getAssetManager(); + if (asset_manager->hasAddonKart(id)) server_status |= HAS_KART; - if (m_asset_manager->hasAddonTrack(id)) + if (asset_manager->hasAddonTrack(id)) server_status |= HAS_MAP; - if (m_asset_manager->hasAddonArena(id)) + if (asset_manager->hasAddonArena(id)) server_status |= HAS_MAP; - if (m_asset_manager->hasAddonSoccer(id)) + if (asset_manager->hasAddonSoccer(id)) server_status |= HAS_MAP; auto peers = STKHost::get()->getPeers(); for (auto p : peers) { if (!p || !p->isValidated() || p->isWaitingForGame() - || !m_lobby->canRace(p) || p->isCommandSpectator() + || !getLobby()->canRace(p) || p->isCommandSpectator() || !p->hasPlayerProfiles()) continue; std::string username = StringUtils::wideToUtf8( @@ -1558,7 +1550,7 @@ void CommandManager::process_checkaddon(Context& context) } response.pop_back(); } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_checkaddon // ======================================================================== @@ -1581,7 +1573,7 @@ void CommandManager::process_id(Context& context) return; std::string id = argv[1]; std::string response = "Server knows this map, copy it below:\n" + id; - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_id // ======================================================================== @@ -1621,28 +1613,29 @@ void CommandManager::process_lsa(Context& context) } std::set total_addons; + auto asset_manager = getAssetManager(); if (type.empty() || // not specify addon type (!type.empty() && type.compare("kart") == 0)) // list kart addon { - const auto& collection = m_asset_manager->getAddonKarts(); + const auto& collection = asset_manager->getAddonKarts(); total_addons.insert(collection.begin(), collection.end()); } if (type.empty() || // not specify addon type (!type.empty() && type.compare("track") == 0)) { - const auto& collection = m_asset_manager->getAddonTracks(); + const auto& collection = asset_manager->getAddonTracks(); total_addons.insert(collection.begin(), collection.end()); } if (type.empty() || // not specify addon type (!type.empty() && type.compare("arena") == 0)) { - const auto& collection = m_asset_manager->getAddonArenas(); + const auto& collection = asset_manager->getAddonArenas(); total_addons.insert(collection.begin(), collection.end()); } if (type.empty() || // not specify addon type (!type.empty() && type.compare("soccer") == 0)) { - const auto& collection = m_asset_manager->getAddonSoccers(); + const auto& collection = asset_manager->getAddonSoccers(); total_addons.insert(collection.begin(), collection.end()); } std::string msg = ""; @@ -1662,7 +1655,7 @@ void CommandManager::process_lsa(Context& context) msg = msg.substr(0, msg.size() - 2); response = "Server's addons: " + msg; } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_lsa // ======================================================================== @@ -1731,7 +1724,7 @@ void CommandManager::process_pha(Context& context) { response = player_name + " has no addon " + addon_id; } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_pha // ======================================================================== @@ -1762,7 +1755,7 @@ void CommandManager::process_kick(Context& context) { std::string msg = "This player is the owner of this server, " "and is protected from your actions now"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } if (context.m_voting) @@ -1775,15 +1768,15 @@ void CommandManager::process_kick(Context& context) if (ServerConfig::m_track_kicks) { std::string auto_report = "[ Auto report caused by kick ]"; - m_lobby->writeOwnReport(player_peer, peer, auto_report); + getLobby()->writeOwnReport(player_peer, peer, auto_report); } if (argv[0] == "kickban") { Log::info("CommandManager", "%s is now banned", player_name.c_str()); - m_lobby->m_temp_banned.insert(player_name); + getLobby()->m_temp_banned.insert(player_name); std::string msg = StringUtils::insertValues( "%s is now banned", player_name.c_str()); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } } // process_kick // ======================================================================== @@ -1809,10 +1802,10 @@ void CommandManager::process_unban(Context& context) return; } Log::info("CommandManager", "%s is now unbanned", player_name.c_str()); - m_lobby->m_temp_banned.erase(player_name); + getLobby()->m_temp_banned.erase(player_name); std::string msg = StringUtils::insertValues( "%s is now unbanned", player_name.c_str()); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_unban // ======================================================================== @@ -1838,10 +1831,10 @@ void CommandManager::process_ban(Context& context) return; } Log::info("CommandManager", "%s is now banned", player_name.c_str()); - m_lobby->m_temp_banned.insert(player_name); + getLobby()->m_temp_banned.insert(player_name); std::string msg = StringUtils::insertValues( "%s is now banned", player_name.c_str()); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_ban // ======================================================================== @@ -1903,7 +1896,7 @@ void CommandManager::process_pas(Context& context) msg.pop_back(); response = msg; } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_pas // ======================================================================== @@ -1984,7 +1977,7 @@ void CommandManager::process_everypas(Context& context) response += msg; } } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_everypas // ======================================================================== @@ -2005,10 +1998,11 @@ void CommandManager::process_sha(Context& context) } std::set total_addons; - const auto all_karts = m_asset_manager->getAddonKarts(); - const auto all_tracks = m_asset_manager->getAddonTracks(); - const auto all_arenas = m_asset_manager->getAddonArenas(); - const auto all_soccers = m_asset_manager->getAddonSoccers(); + auto asset_manager = getAssetManager(); + const auto all_karts = asset_manager->getAddonKarts(); + const auto all_tracks = asset_manager->getAddonTracks(); + const auto all_arenas = asset_manager->getAddonArenas(); + const auto all_soccers = asset_manager->getAddonSoccers(); total_addons.insert(all_karts.begin(), all_karts.end()); total_addons.insert(all_tracks.begin(), all_tracks.end()); total_addons.insert(all_arenas.begin(), all_arenas.end()); @@ -2023,7 +2017,7 @@ void CommandManager::process_sha(Context& context) { response = "Server has no addon " + argv[1]; } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_sha // ======================================================================== @@ -2059,9 +2053,9 @@ void CommandManager::process_mute(Context& context) return; } - m_lobby_settings->addMutedPlayerFor(peer, player_name); + getSettings()->addMutedPlayerFor(peer, player_name); result_msg = "Muted player " + argv[1]; - m_lobby->sendStringToPeer(result_msg, peer); + getLobby()->sendStringToPeer(result_msg, peer); } // process_mute // ======================================================================== @@ -2085,14 +2079,14 @@ void CommandManager::process_unmute(Context& context) player_name = StringUtils::utf8ToWide(argv[1]); - if (!m_lobby_settings->removeMutedPlayerFor(peer, player_name)) + if (!getSettings()->removeMutedPlayerFor(peer, player_name)) { error(context); return; } std::string result_msg = "Unmuted player " + StringUtils::wideToUtf8(player_name); - m_lobby->sendStringToPeer(result_msg, peer); + getLobby()->sendStringToPeer(result_msg, peer); } // process_unmute // ======================================================================== @@ -2106,8 +2100,8 @@ void CommandManager::process_listmute(Context& context) return; } - std::string muted_players = m_lobby_settings->getMutedPlayersAsString(peer); - m_lobby->sendStringToPeer(muted_players, peer); + std::string muted_players = getSettings()->getMutedPlayersAsString(peer); + getLobby()->sendStringToPeer(muted_players, peer); } // process_listmute // ======================================================================== @@ -2125,16 +2119,17 @@ void CommandManager::process_gnu(Context& context) } // "nognu" and "gnu off" are equivalent bool turn_on = (argv.size() < 2 || argv[1] != "off"); - if (turn_on && m_kart_elimination->isEnabled()) + auto kart_elimination = getKartElimination(); + if (turn_on && kart_elimination->isEnabled()) { std::string msg = "Gnu Elimination mode was already enabled!"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } - if (!turn_on && !m_kart_elimination->isEnabled()) + if (!turn_on && !kart_elimination->isEnabled()) { std::string msg = "Gnu Elimination mode was already off!"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } if (turn_on && @@ -2142,7 +2137,7 @@ void CommandManager::process_gnu(Context& context) RaceManager::get()->getMinorMode() != RaceManager::MINOR_MODE_TIME_TRIAL) { std::string msg = "Gnu Elimination is available only with racing modes"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } std::string kart; @@ -2155,7 +2150,7 @@ void CommandManager::process_gnu(Context& context) if (peer) { kart = "gnu"; - if (argv.size() > 1 && m_asset_manager->isKartAvailable(argv[1])) + if (argv.size() > 1 && getAssetManager()->isKartAvailable(argv[1])) { kart = argv[1]; } @@ -2181,15 +2176,15 @@ void CommandManager::process_gnu(Context& context) m_votables["gnu"].reset("gnu kart"); if (kart == "off") { - m_kart_elimination->disable(); + kart_elimination->disable(); std::string msg = "Gnu Elimination is now off"; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } else { - m_kart_elimination->enable(kart); - std::string msg = m_kart_elimination->getStartingMessage(); - m_lobby->sendStringToAllPeers(msg); + kart_elimination->enable(kart); + std::string msg = kart_elimination->getStartingMessage(); + getLobby()->sendStringToAllPeers(msg); } } // process_gnu // ======================================================================== @@ -2215,7 +2210,7 @@ void CommandManager::process_tell(Context& context) ans.push_back(' '); ans += argv[i]; } - m_lobby->writeOwnReport(peer, peer, ans); + getLobby()->writeOwnReport(peer, peer, ans); } // process_tell // ======================================================================== @@ -2248,7 +2243,7 @@ void CommandManager::process_standings(Context& context) } if (!isGP && !isGnu) { - if (m_lobby->m_game_setup->isGrandPrix()) + if (getLobby()->m_game_setup->isGrandPrix()) isGP = true; else isGnu = true; @@ -2257,11 +2252,11 @@ void CommandManager::process_standings(Context& context) { // the function will decide itself what to show if nothing is specified: // if there are teams, teams will be shown, otherwise players - msg = m_lobby->getGrandPrixStandings(isGPPlayers, isGPTeams); + msg = getLobby()->getGrandPrixStandings(isGPPlayers, isGPTeams); } else if (isGnu) - msg = m_kart_elimination->getStandings(); - m_lobby->sendStringToPeer(msg, peer); + msg = getKartElimination()->getStandings(); + getLobby()->sendStringToPeer(msg, peer); } // process_standings // ======================================================================== @@ -2273,9 +2268,9 @@ void CommandManager::process_teamchat(Context& context) error(context, true); return; } - m_lobby_settings->addTeamSpeaker(peer); + getSettings()->addTeamSpeaker(peer); std::string msg = "Your messages are now addressed to team only"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_teamchat // ======================================================================== @@ -2301,9 +2296,9 @@ void CommandManager::process_to(Context& context) return; receivers.push_back(argv[i]); } - m_lobby_settings->setMessageReceiversFor(peer, receivers); + getSettings()->setMessageReceiversFor(peer, receivers); std::string msg = "Successfully changed chat settings"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_to // ======================================================================== @@ -2315,9 +2310,9 @@ void CommandManager::process_public(Context& context) error(context, true); return; } - m_lobby_settings->makeChatPublicFor(peer); + getSettings()->makeChatPublicFor(peer); std::string s = "Your messages are now public"; - m_lobby->sendStringToPeer(s, peer); + getLobby()->sendStringToPeer(s, peer); } // process_public // ======================================================================== @@ -2360,12 +2355,12 @@ void CommandManager::process_record(Context& context) } else { - response = m_lobby->getRecord(track_name, mode_name, reverse_name, laps_count); + response = getLobby()->getRecord(track_name, mode_name, reverse_name, laps_count); } #else response = "This command is not supported."; #endif - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_record // ======================================================================== @@ -2382,8 +2377,8 @@ void CommandManager::process_power(Context& context) { peer->setAngryHost(false); std::string msg = "You are now a normal player"; - m_lobby->sendStringToPeer(msg, peer); - m_lobby->updatePlayerList(); + getLobby()->sendStringToPeer(msg, peer); + getLobby()->updatePlayerList(); return; } std::string username = ""; @@ -2397,18 +2392,18 @@ void CommandManager::process_power(Context& context) std::string password = ServerConfig::m_power_password; bool bad_password = (password.empty() || argv.size() <= 1 || argv[1] != password); - bool good_player = (m_lobby_settings->isInHammerWhitelist(username) + bool good_player = (getSettings()->isInHammerWhitelist(username) && online_id != 0); if (bad_password && !good_player) { std::string msg = "You need to provide the password to have the power"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } peer->setAngryHost(true); std::string msg = "Now you finally have the power!"; - m_lobby->sendStringToPeer(msg, peer); - m_lobby->updatePlayerList(); + getLobby()->sendStringToPeer(msg, peer); + getLobby()->updatePlayerList(); } // process_power // ======================================================================== void CommandManager::process_length(Context& context) @@ -2419,8 +2414,8 @@ void CommandManager::process_length(Context& context) error(context, true); return; } - std::string msg = m_lobby_settings->getLapRestrictionsAsString(); - m_lobby->sendStringToPeer(msg, peer); + std::string msg = getSettings()->getLapRestrictionsAsString(); + getLobby()->sendStringToPeer(msg, peer); } // process_length // ======================================================================== void CommandManager::process_length_multi(Context& context) @@ -2434,9 +2429,9 @@ void CommandManager::process_length_multi(Context& context) return; } double value = std::max(0.0, temp_double); - m_lobby_settings->setMultiplier(value); + getSettings()->setMultiplier(value); std::string msg = StringUtils::insertValues("Game length is now %f x default", value); - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_length_multi // ======================================================================== void CommandManager::process_length_fixed(Context& context) @@ -2450,23 +2445,23 @@ void CommandManager::process_length_fixed(Context& context) return; } int value = std::max(0, temp_int); - m_lobby_settings->setFixedLapCount(value); + getSettings()->setFixedLapCount(value); std::string msg = StringUtils::insertValues("Game length is now %d", value); - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_length_fixed // ======================================================================== void CommandManager::process_length_clear(Context& context) { - m_lobby_settings->resetLapRestrictions(); + getSettings()->resetLapRestrictions(); std::string msg = "Game length will be chosen by players"; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_length_clear // ======================================================================== void CommandManager::process_direction(Context& context) { - std::string msg = m_lobby_settings->getDirectionAsString(); - m_lobby->sendStringToAllPeers(msg); + std::string msg = getSettings()->getDirectionAsString(); + getLobby()->sendStringToAllPeers(msg); } // process_direction // ======================================================================== @@ -2480,13 +2475,13 @@ void CommandManager::process_direction_assign(Context& context) return; } int temp_int = -1; - if (!StringUtils::parseString(argv[1], &temp_int) || !m_lobby_settings->setDirection(temp_int)) + if (!StringUtils::parseString(argv[1], &temp_int) || !getSettings()->setDirection(temp_int)) { error(context); return; } - msg = m_lobby_settings->getDirectionAsString(true); - m_lobby->sendStringToAllPeers(msg); + msg = getSettings()->getDirectionAsString(true); + getLobby()->sendStringToAllPeers(msg); } // process_direction_assign // ======================================================================== @@ -2513,7 +2508,7 @@ void CommandManager::process_queue(Context& context) } } msg.pop_back(); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_queue // ======================================================================== @@ -2535,10 +2530,11 @@ void CommandManager::process_queue_push(Context& context) int mask = get_queue_mask(argv[0]); bool to_front = (argv[1] == "push_front"); + auto asset_manager = getAssetManager(); if (argv.size() == 3 && argv[2] == "-") // kept until there's filter-type replacement - argv[2] = m_asset_manager->getRandomMap(); + argv[2] = asset_manager->getRandomMap(); else if (argv.size() == 3 && argv[2] == "-addon") // kept until there's filter-type replacement - argv[2] = m_asset_manager->getRandomAddonMap(); + argv[2] = asset_manager->getRandomAddonMap(); std::string filter_text = ""; CommandManager::restoreCmdByArgv(filter_text, argv, ' ', '"', '"', '\\', 2); @@ -2603,8 +2599,8 @@ void CommandManager::process_queue_push(Context& context) } msg.pop_back(); - m_lobby->sendStringToAllPeers(msg); - m_lobby->updatePlayerList(); + getLobby()->sendStringToAllPeers(msg); + getLobby()->updatePlayerList(); } // process_queue_push // ======================================================================== @@ -2658,8 +2654,8 @@ void CommandManager::process_queue_pop(Context& context) } } msg.pop_back(); - m_lobby->sendStringToAllPeers(msg); - m_lobby->updatePlayerList(); + getLobby()->sendStringToAllPeers(msg); + getLobby()->updatePlayerList(); } // process_queue_pop // ======================================================================== @@ -2686,8 +2682,8 @@ void CommandManager::process_queue_clear(Context& context) } } msg.pop_back(); - m_lobby->sendStringToAllPeers(msg); - m_lobby->updatePlayerList(); + getLobby()->sendStringToAllPeers(msg); + getLobby()->updatePlayerList(); } // process_queue_clear // ======================================================================== @@ -2726,8 +2722,8 @@ void CommandManager::process_queue_shuffle(Context& context) } } msg.pop_back(); - m_lobby->sendStringToAllPeers(msg); - m_lobby->updatePlayerList(); + getLobby()->sendStringToAllPeers(msg); + getLobby()->updatePlayerList(); } // process_queue_shuffle // ======================================================================== @@ -2740,8 +2736,8 @@ void CommandManager::process_allowstart(Context& context) return; } - std::string msg = m_lobby_settings->getAllowedToStartAsString(); - m_lobby->sendStringToPeer(msg, peer); + std::string msg = getSettings()->getAllowedToStartAsString(); + getLobby()->sendStringToPeer(msg, peer); } // process_allowstart // ======================================================================== @@ -2756,9 +2752,9 @@ void CommandManager::process_allowstart_assign(Context& context) error(context); return; } - m_lobby_settings->setAllowedToStart(argv[1] != "0"); - std::string msg = m_lobby_settings->getAllowedToStartAsString(true); - m_lobby->sendStringToAllPeers(msg); + getSettings()->setAllowedToStart(argv[1] != "0"); + std::string msg = getSettings()->getAllowedToStartAsString(true); + getLobby()->sendStringToAllPeers(msg); } // process_allowstart_assign // ======================================================================== @@ -2770,8 +2766,8 @@ void CommandManager::process_shuffle(Context& context) error(context, true); return; } - std::string msg = m_lobby_settings->getWhetherShuffledGPGridAsString(); - m_lobby->sendStringToPeer(msg, peer); + std::string msg = getSettings()->getWhetherShuffledGPGridAsString(); + getLobby()->sendStringToPeer(msg, peer); } // process_shuffle // ======================================================================== @@ -2784,9 +2780,9 @@ void CommandManager::process_shuffle_assign(Context& context) error(context); return; } - m_lobby_settings->setGPGridShuffled(argv[1] != "0"); - std::string msg = m_lobby_settings->getWhetherShuffledGPGridAsString(true); - m_lobby->sendStringToAllPeers(msg); + getSettings()->setGPGridShuffled(argv[1] != "0"); + std::string msg = getSettings()->getWhetherShuffledGPGridAsString(true); + getLobby()->sendStringToAllPeers(msg); } // process_shuffle_assign // ======================================================================== @@ -2806,11 +2802,11 @@ void CommandManager::process_timeout(Context& context) error(context); return; } - m_lobby->m_timeout.store((int64_t)StkTime::getMonoTimeMs() + + getLobby()->m_timeout.store((int64_t)StkTime::getMonoTimeMs() + (int64_t)(seconds * 1000.0f)); - m_lobby->updatePlayerList(); + getLobby()->updatePlayerList(); msg = "Successfully changed timeout"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_timeout // ======================================================================== @@ -2838,7 +2834,7 @@ void CommandManager::process_team(Context& context) if (!argv[1].empty()) { std::string temp(1, argv[1][0]); - if (m_lobby_settings->getAvailableTeams().find(temp) != std::string::npos) + if (getSettings()->getAvailableTeams().find(temp) != std::string::npos) allowed_color = true; } int team = TeamUtils::getIndexByCode(argv[1]); @@ -2847,12 +2843,12 @@ void CommandManager::process_team(Context& context) { std::string msg = StringUtils::insertValues("Color %s is not allowed", argv[1].c_str()); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } - m_lobby->setTemporaryTeamInLobby(player, team); + getLobby()->setTemporaryTeamInLobby(player, team); - m_lobby->updatePlayerList(); + getLobby()->updatePlayerList(); } // process_team // ======================================================================== @@ -2910,9 +2906,9 @@ void CommandManager::process_swapteams(Context& context) int to = TeamUtils::getIndexByCode(std::string(1, p.second)); permutation_map_int[from] = to; } - m_lobby->shuffleTemporaryTeams(permutation_map_int); - m_lobby->sendStringToPeer(msg, peer); // todo make public? - m_lobby->updatePlayerList(); + getLobby()->shuffleTemporaryTeams(permutation_map_int); + getLobby()->sendStringToPeer(msg, peer); // todo make public? + getLobby()->updatePlayerList(); } // process_swapteams // ======================================================================== @@ -2925,9 +2921,9 @@ void CommandManager::process_resetteams(Context& context) return; } std::string msg = "Teams are reset now"; - m_lobby->clearTemporaryTeams(); - m_lobby->sendStringToPeer(msg, peer); - m_lobby->updatePlayerList(); + getLobby()->clearTemporaryTeams(); + getLobby()->sendStringToPeer(msg, peer); + getLobby()->updatePlayerList(); } // process_resetteams // ======================================================================== @@ -2955,13 +2951,13 @@ void CommandManager::process_randomteams(Context& context) msg = "No one can play!"; else msg = "Teams are currently not allowed"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } std::string msg = StringUtils::insertValues( "Created %d teams for %d players", final_number, players_number); - m_lobby->sendStringToPeer(msg, peer); - m_lobby->updatePlayerList(); + getLobby()->sendStringToPeer(msg, peer); + getLobby()->updatePlayerList(); } // process_randomteams // ======================================================================== @@ -2977,10 +2973,10 @@ void CommandManager::process_resetgp(Context& context) error(context); return; } - m_lobby->getGameSetup()->setGrandPrixTrack(number_of_games); + getLobby()->getGameSetup()->setGrandPrixTrack(number_of_games); } - m_lobby->resetGrandPrix(); - m_lobby->sendStringToAllPeers(msg); + getLobby()->resetGrandPrix(); + getLobby()->sendStringToAllPeers(msg); } // process_resetgp // ======================================================================== @@ -3006,8 +3002,8 @@ void CommandManager::process_cat(Context& context) 2, m_stf_present_users, 3, false, true)) return; std::string player = argv[2]; - m_lobby_settings->addPlayerToCategory(player, category); - m_lobby->updatePlayerList(); + getSettings()->addPlayerToCategory(player, category); + getLobby()->updatePlayerList(); return; } if (argv[0] == "cat-") @@ -3023,8 +3019,8 @@ void CommandManager::process_cat(Context& context) 2, m_stf_present_users, 3, false, true)) return; player = argv[2]; - m_lobby_settings->erasePlayerFromCategory(player, category); - m_lobby->updatePlayerList(); + getSettings()->erasePlayerFromCategory(player, category); + getLobby()->updatePlayerList(); return; } if (argv[0] == "catshow") @@ -3038,8 +3034,8 @@ void CommandManager::process_cat(Context& context) return; } std::string category = argv[1]; - m_lobby_settings->makeCategoryVisible(category, displayed); - m_lobby->updatePlayerList(); + getSettings()->makeCategoryVisible(category, displayed); + getLobby()->updatePlayerList(); return; } } // process_cat @@ -3054,11 +3050,12 @@ void CommandManager::process_troll(Context& context) error(context, true); return; } - if (m_hit_processor->isAntiTrollActive()) + auto hit_processor = getHitProcessor(); + if (hit_processor->isAntiTrollActive()) msg = "Trolls will be kicked"; else msg = "Trolls can stay"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_troll // ======================================================================== @@ -3071,15 +3068,16 @@ void CommandManager::process_troll_assign(Context& context) error(context); return; } + auto hit_processor = getHitProcessor(); if (argv[1] == "0") { - m_hit_processor->setAntiTroll(false); + hit_processor->setAntiTroll(false); msg = "Trolls can stay"; } else { - m_hit_processor->setAntiTroll(true); + hit_processor->setAntiTroll(true); msg = "Trolls will be kicked"; } - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_troll_assign // ======================================================================== @@ -3092,11 +3090,12 @@ void CommandManager::process_hitmsg(Context& context) error(context, true); return; } - if (m_hit_processor->showTeammateHits()) + auto hit_processor = getHitProcessor(); + if (hit_processor->showTeammateHits()) msg = "Teammate hits are sent to all players"; else msg = "Teammate hits are not sent"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_hitmsg // ======================================================================== @@ -3109,15 +3108,16 @@ void CommandManager::process_hitmsg_assign(Context& context) error(context); return; } + auto hit_processor = getHitProcessor(); if (argv[1] == "0") { - m_hit_processor->setShowTeammateHits(false); + hit_processor->setShowTeammateHits(false); msg = "Teammate hits will not be sent"; } else { - m_hit_processor->setShowTeammateHits(true); + hit_processor->setShowTeammateHits(true); msg = "Teammate hits will be sent to all players"; } - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_hitmsg_assign // ======================================================================== @@ -3130,11 +3130,12 @@ void CommandManager::process_teamhit(Context& context) error(context, true); return; } - if (m_hit_processor->isTeammateHitMode()) + auto hit_processor = getHitProcessor(); + if (hit_processor->isTeammateHitMode()) msg = "Teammate hits are punished"; else msg = "Teammate hits are not punished"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_teamhit // ======================================================================== @@ -3147,17 +3148,18 @@ void CommandManager::process_teamhit_assign(Context& context) error(context); return; } + auto hit_processor = getHitProcessor(); if (argv[1] == "0") { - m_hit_processor->setTeammateHitMode(false); + hit_processor->setTeammateHitMode(false); msg = "Teammate hits are not punished now"; } else { - m_hit_processor->setTeammateHitMode(true); + hit_processor->setTeammateHitMode(true); msg = "Teammate hits are punished now"; } - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_teamhit_assign // ======================================================================== @@ -3169,8 +3171,8 @@ void CommandManager::process_scoring(Context& context) error(context, true); return; } - std::string msg = m_lobby_settings->getScoringAsString(); - m_lobby->sendStringToPeer(msg, peer); + std::string msg = getSettings()->getScoringAsString(); + getLobby()->sendStringToPeer(msg, peer); } // process_scoring // ======================================================================== @@ -3186,15 +3188,15 @@ void CommandManager::process_scoring_assign(Context& context) } std::string cmd2; CommandManager::restoreCmdByArgv(cmd2, argv, ' ', '"', '"', '\\', 1); - if (m_lobby_settings->loadCustomScoring(cmd2)) + if (getSettings()->loadCustomScoring(cmd2)) { msg = "Scoring set to \"" + cmd2 + "\""; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } else { msg = "Scoring could not be parsed from \"" + cmd2 + "\""; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } } // process_scoring_assign // ======================================================================== @@ -3214,7 +3216,7 @@ void CommandManager::process_register(Context& context) if (online_id <= 0) { std::string msg = "Please join with a valid online STK account."; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } std::string ans = ""; @@ -3226,11 +3228,11 @@ void CommandManager::process_register(Context& context) } std::string message_ok = "Your registration request is being processed"; std::string message_wrong = "Sorry, an error occurred. Please try again."; - if (m_lobby->writeOnePlayerReport(peer, ServerConfig::m_register_table_name, + if (getLobby()->writeOnePlayerReport(peer, ServerConfig::m_register_table_name, ans)) - m_lobby->sendStringToPeer(message_ok, peer); + getLobby()->sendStringToPeer(message_ok, peer); else - m_lobby->sendStringToPeer(message_wrong, peer); + getLobby()->sendStringToPeer(message_wrong, peer); } // process_register // ======================================================================== @@ -3238,7 +3240,8 @@ void CommandManager::process_muteall(Context& context) { auto& argv = context.m_argv; auto peer = context.m_peer.lock(); - if (!peer || !m_tournament) + auto tournament = getTournament(); + if (!peer || !tournament) { error(context, true); return; @@ -3254,14 +3257,14 @@ void CommandManager::process_muteall(Context& context) else if (argv.size() >= 2 && argv[1] == "1") op = SWF_OP_ADD; - int status = m_tournament->editMuteall(peer_username, op); + int status = tournament->editMuteall(peer_username, op); std::string msg; if (status) msg = "You are now receiving messages only from players and referees"; else msg = "You are now receiving messages from spectators too"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_muteall // ======================================================================== @@ -3269,7 +3272,8 @@ void CommandManager::process_game(Context& context) { auto& argv = context.m_argv; auto peer = context.m_peer.lock(); - if (!peer || !m_tournament) + auto tournament = getTournament(); + if (!peer || !tournament) { error(context, true); return; @@ -3282,9 +3286,9 @@ void CommandManager::process_game(Context& context) int old_game_number; int old_duration; int old_addition; - m_tournament->getGameCmdInput(old_game_number, old_duration, old_addition); - int new_game_number = m_tournament->getNextGameNumber(); - int new_duration = m_tournament->getDefaultDuration(); // Was m_length for argv.size >= 2 + tournament->getGameCmdInput(old_game_number, old_duration, old_addition); + int new_game_number = tournament->getNextGameNumber(); + int new_duration = tournament->getDefaultDuration(); // Was m_length for argv.size >= 2 int new_addition = 0; if (1 < argv.size()) @@ -3301,7 +3305,7 @@ void CommandManager::process_game(Context& context) if (!bad && argv.size() >= 4 && !StringUtils::parseString(argv[3], &new_addition)) bad = true; - if (!bad && !m_tournament->isValidGameCmdInput(new_game_number, new_duration, new_addition)) + if (!bad && !tournament->isValidGameCmdInput(new_game_number, new_duration, new_addition)) { bad = true; } @@ -3311,32 +3315,32 @@ void CommandManager::process_game(Context& context) std::string msg = StringUtils::insertValues( "Please specify a correct number. " "Format: /game [number %d..%d] [length in minutes] [0..59 additional seconds]", - m_tournament->minGameNumber(), - m_tournament->maxGameNumber()); + tournament->minGameNumber(), + tournament->maxGameNumber()); // error(context) ? - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } } - m_tournament->setGameCmdInput(new_game_number, new_duration, new_addition); - m_lobby_settings->setFixedLapCount(new_duration); + tournament->setGameCmdInput(new_game_number, new_duration, new_addition); + getSettings()->setFixedLapCount(new_duration); - if (m_tournament->hasColorsSwapped(new_game_number) ^ m_tournament->hasColorsSwapped(old_game_number)) - m_lobby->changeColors(); + if (tournament->hasColorsSwapped(new_game_number) ^ tournament->hasColorsSwapped(old_game_number)) + getLobby()->changeColors(); - if (m_tournament->hasGoalsLimit(new_game_number) ^ m_tournament->hasGoalsLimit(old_game_number)) - m_lobby->changeLimitForTournament(m_tournament->hasGoalsLimit()); + if (tournament->hasGoalsLimit(new_game_number) ^ tournament->hasGoalsLimit(old_game_number)) + getLobby()->changeLimitForTournament(tournament->hasGoalsLimit()); std::string msg = StringUtils::insertValues( "Ready to start game %d for %d %s", new_game_number, new_duration, - (m_tournament->hasGoalsLimit() ? "goals" : "minutes")); + (tournament->hasGoalsLimit() ? "goals" : "minutes")); - if (!m_tournament->hasGoalsLimit() && new_addition > 0) + if (!tournament->hasGoalsLimit() && new_addition > 0) { msg += StringUtils::insertValues(" %d seconds", new_addition); - m_lobby_settings->setFixedLapCount(m_lobby_settings->getFixedLapCount() + 1); + getSettings()->setFixedLapCount(getSettings()->getFixedLapCount() + 1); } - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); Log::info("CommandManager", "SoccerMatchLog: Game number changed from %d to %d", old_game_number, new_game_number); } // process_game @@ -3346,7 +3350,8 @@ void CommandManager::process_role(Context& context) { auto& argv = context.m_argv; auto peer = context.m_peer.lock(); - if (!peer || !m_tournament) + auto tournament = getTournament(); + if (!peer || !tournament) { error(context, true); return; @@ -3383,72 +3388,72 @@ void CommandManager::process_role(Context& context) if (!username.empty()) { if (username[0] == '#') - changed_usernames = m_lobby_settings->getPlayersInCategory(username.substr(1)); + changed_usernames = getSettings()->getPlayersInCategory(username.substr(1)); else changed_usernames.insert(username); } for (const std::string& u: changed_usernames) { - m_tournament->eraseFromAllTournamentCategories(u, permanent); + tournament->eraseFromAllTournamentCategories(u, permanent); std::string role_changed = "The referee has updated your role - you are now %s"; std::shared_ptr player_peer = STKHost::get()->findPeerByName( StringUtils::utf8ToWide(u)); std::vector missing_assets; if (player_peer) - missing_assets = m_lobby_settings->getMissingAssets(player_peer); + missing_assets = getSettings()->getMissingAssets(player_peer); bool fail = false; switch (role_char) { case 'r': { fail = !missing_assets.empty(); - if (m_tournament->hasColorsSwapped()) + if (tournament->hasColorsSwapped()) { - m_tournament->setTeam(KART_TEAM_BLUE, u, permanent); + tournament->setTeam(KART_TEAM_BLUE, u, permanent); } else { - m_tournament->setTeam(KART_TEAM_RED, u, permanent); + tournament->setTeam(KART_TEAM_RED, u, permanent); } if (player_peer) { role_changed = StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char)); if (player_peer->hasPlayerProfiles()) - m_lobby->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_RED); - m_lobby->sendStringToPeer(role_changed, player_peer); + getLobby()->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_RED); + getLobby()->sendStringToPeer(role_changed, player_peer); } break; } case 'b': { fail = !missing_assets.empty(); - if (m_tournament->hasColorsSwapped()) + if (tournament->hasColorsSwapped()) { - m_tournament->setTeam(KART_TEAM_RED, u, permanent); + tournament->setTeam(KART_TEAM_RED, u, permanent); } else { - m_tournament->setTeam(KART_TEAM_BLUE, u, permanent); + tournament->setTeam(KART_TEAM_BLUE, u, permanent); } if (player_peer) { role_changed = StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char)); if (player_peer->hasPlayerProfiles()) - m_lobby->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_BLUE); - m_lobby->sendStringToPeer(role_changed, player_peer); + getLobby()->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_BLUE); + getLobby()->sendStringToPeer(role_changed, player_peer); } break; } case 'j': { fail = !missing_assets.empty(); - m_tournament->setReferee(u, permanent); + tournament->setReferee(u, permanent); if (player_peer) { role_changed = StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char)); if (player_peer->hasPlayerProfiles()) - m_lobby->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_NONE); - m_lobby->sendStringToPeer(role_changed, player_peer); + getLobby()->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_NONE); + getLobby()->sendStringToPeer(role_changed, player_peer); } break; } @@ -3458,8 +3463,8 @@ void CommandManager::process_role(Context& context) { role_changed = StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char)); if (player_peer->hasPlayerProfiles()) - m_lobby->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_NONE); - m_lobby->sendStringToPeer(role_changed, player_peer); + getLobby()->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_NONE); + getLobby()->sendStringToPeer(role_changed, player_peer); } break; } @@ -3484,15 +3489,15 @@ void CommandManager::process_role(Context& context) msg += " " + missing_assets[i]; } } - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } - m_lobby->updatePlayerList(); + getLobby()->updatePlayerList(); } // process_role // ======================================================================== void CommandManager::process_stop(Context& context) { - if (!m_tournament) + if (!getTournament()) { error(context, true); return; @@ -3503,14 +3508,14 @@ void CommandManager::process_stop(Context& context) SoccerWorld *sw = dynamic_cast(w); sw->stop(); std::string msg = "The game is stopped."; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); Log::info("CommandManager", "SoccerMatchLog: The game is stopped"); } // process_stop // ======================================================================== void CommandManager::process_go(Context& context) { - if (!m_tournament) + if (!getTournament()) { error(context, true); return; @@ -3521,14 +3526,14 @@ void CommandManager::process_go(Context& context) SoccerWorld *sw = dynamic_cast(w); sw->resume(); std::string msg = "The game is resumed."; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); Log::info("CommandManager", "SoccerMatchLog: The game is resumed"); } // process_go // ======================================================================== void CommandManager::process_lobby(Context& context) { - if (!m_tournament) + if (!getTournament()) { error(context, true); return; @@ -3539,7 +3544,7 @@ void CommandManager::process_lobby(Context& context) SoccerWorld *sw = dynamic_cast(w); sw->allToLobby(); std::string msg = "The game will be restarted."; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_lobby // ======================================================================== @@ -3547,7 +3552,7 @@ void CommandManager::process_init(Context& context) { auto& argv = context.m_argv; auto peer = context.m_peer.lock(); - if (!peer || !m_tournament) + if (!peer || !getTournament()) { error(context, true); return; @@ -3570,7 +3575,7 @@ void CommandManager::process_init(Context& context) std::string msg = "Please set the count when the karts " "are ready. Setting the initial count in lobby is " "not implemented yet, sorry."; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } SoccerWorld *sw = dynamic_cast(w); @@ -3594,7 +3599,7 @@ void CommandManager::process_mimiz(Context& context) msg = "please provide text"; else msg = cmd.substr(argv[0].length() + 1); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_mimiz // ======================================================================== @@ -3605,7 +3610,7 @@ void CommandManager::process_test(Context& context) if (argv.size() == 1) { std::string msg = "/test is now deprecated. Use /test *2 [something] [something]"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } argv.resize(4, ""); @@ -3627,7 +3632,7 @@ void CommandManager::process_test(Context& context) } username = "{" + argv[1].substr(4) + "} " + username; std::string msg = username + ", " + argv[2] + ", " + argv[3]; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_test // ======================================================================== @@ -3639,9 +3644,9 @@ void CommandManager::process_slots(Context& context) error(context, true); return; } - int current = m_lobby->m_current_max_players_in_game.load(); + int current = getLobby()->m_current_max_players_in_game.load(); std::string msg = "Number of slots is currently " + std::to_string(current); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_slots // ======================================================================== @@ -3651,7 +3656,7 @@ void CommandManager::process_slots_assign(Context& context) { std::string msg = "Changing slots is not possible in the singleplayer mode"; auto peer = context.m_peer.lock(); // may be nullptr, here we don't care - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return; } auto& argv = context.m_argv; @@ -3671,10 +3676,10 @@ void CommandManager::process_slots_assign(Context& context) vote(context, "slots", argv[1]); return; } - m_lobby->m_current_max_players_in_game.store((unsigned)number); - m_lobby->updatePlayerList(); + getLobby()->m_current_max_players_in_game.store((unsigned)number); + getLobby()->updatePlayerList(); std::string msg = "Number of playable slots is now " + argv[1]; - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_slots_assign // ======================================================================== @@ -3687,7 +3692,7 @@ void CommandManager::process_time(Context& context) return; } std::string msg = "Server time: " + StkTime::getLogTime(); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_time // ======================================================================== @@ -3713,7 +3718,7 @@ void CommandManager::process_result(Context& context) } else msg = "This command is not yet supported for this game mode"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_result // ======================================================================== @@ -3725,8 +3730,8 @@ void CommandManager::process_preserve(Context& context) error(context, true); return; } - std::string msg = m_lobby_settings->getPreservedSettingsAsString(); - m_lobby->sendStringToPeer(msg, peer); + std::string msg = getSettings()->getPreservedSettingsAsString(); + getLobby()->sendStringToPeer(msg, peer); } // process_preserve // ======================================================================== @@ -3749,31 +3754,32 @@ void CommandManager::process_preserve_assign(Context& context) { msg = StringUtils::insertValues( "'%s' isn't preserved on server reset anymore", argv[1].c_str()); - m_lobby_settings->eraseFromPreserved(argv[1]); + getSettings()->eraseFromPreserved(argv[1]); } else { msg = StringUtils::insertValues( "'%s' is now preserved on server reset", argv[1].c_str()); - m_lobby_settings->insertIntoPreserved(argv[1]); + getSettings()->insertIntoPreserved(argv[1]); } - m_lobby->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(msg); } // process_preserve_assign // ======================================================================== void CommandManager::process_history(Context& context) { auto peer = context.m_peer.lock(); - if (!peer || !m_tournament) + auto tournament = getTournament(); + if (!peer || !tournament) { error(context, true); return; } std::string msg = "Map history:"; - std::vector arenas = m_tournament->getMapHistory(); + std::vector arenas = tournament->getMapHistory(); for (unsigned i = 0; i < arenas.size(); i++) msg += StringUtils::insertValues(" [%d]: %s", i, arenas[i].c_str()); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_history // ======================================================================== @@ -3781,7 +3787,8 @@ void CommandManager::process_history_assign(Context& context) { auto& argv = context.m_argv; auto peer = context.m_peer.lock(); - if (!peer || !m_tournament) + auto tournament = getTournament(); + if (!peer || !tournament) { error(context, true); return; @@ -3802,14 +3809,14 @@ void CommandManager::process_history_assign(Context& context) 2, m_stf_all_maps, 3, false, false)) return; std::string id = argv[2]; - if (!m_tournament->assignToHistory(index, id)) + if (!tournament->assignToHistory(index, id)) { error(context); return; } msg = StringUtils::insertValues("Assigned [%d] to %s in the map history", index, id.c_str()); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_history_assign // ======================================================================== @@ -3822,8 +3829,8 @@ void CommandManager::process_voting(Context& context) return; } std::string msg = StringUtils::insertValues("Voting method: %d", - m_lobby->m_map_vote_handler->getAlgorithm()); - m_lobby->sendStringToPeer(msg, peer); + getMapVoteHandler()->getAlgorithm()); + getLobby()->sendStringToPeer(msg, peer); } // process_voting // ======================================================================== @@ -3848,9 +3855,9 @@ void CommandManager::process_voting_assign(Context& context) error(context); return; } - m_lobby->m_map_vote_handler->setAlgorithm(value); + getMapVoteHandler()->setAlgorithm(value); msg = StringUtils::insertValues("Set voting method to %s", value); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_voting_assign // ======================================================================== @@ -3890,8 +3897,8 @@ void CommandManager::process_why_hourglass(Context& context) error(context); return; } - auto it = m_lobby->m_why_peer_cannot_play.find(player_peer); - if (it == m_lobby->m_why_peer_cannot_play.end()) + auto it = getLobby()->m_why_peer_cannot_play.find(player_peer); + if (it == getLobby()->m_why_peer_cannot_play.end()) { response = "For some reason, server doesn't know about the hourglass status of this player."; } @@ -3944,7 +3951,7 @@ void CommandManager::process_why_hourglass(Context& context) } response = StringUtils::insertValues(response, player_name.c_str()); } - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); } // process_why_hourglass // ======================================================================== @@ -3957,8 +3964,8 @@ void CommandManager::process_available_teams(Context& context) return; } std::string msg = StringUtils::insertValues("Currently available teams: \"%s\"", - m_lobby_settings->getInternalAvailableTeams().c_str()); - m_lobby->sendStringToPeer(msg, peer); + getSettings()->getInternalAvailableTeams().c_str()); + getLobby()->sendStringToPeer(msg, peer); } // process_available_teams // ======================================================================== @@ -4001,12 +4008,12 @@ void CommandManager::process_available_teams_assign(Context& context) ignored.push_back(c); for (char c: value_set) value.push_back(c); - m_lobby_settings->setInternalAvailableTeams(value); + getSettings()->setInternalAvailableTeams(value); msg = StringUtils::insertValues("Set available teams to \"%s\"", value); if (!ignored.empty()) msg += StringUtils::insertValues( ", but teams \"%s\" were not recognized", ignored); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // process_available_teams_assign // ======================================================================== @@ -4032,7 +4039,7 @@ void CommandManager::special(Context& context) "If you believe that is a bug, please report it. Full input:\n" "/%s"; msg = StringUtils::insertValues(msg, command->getFullName(), cmd); - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); } // special // ======================================================================== @@ -4044,7 +4051,7 @@ bool CommandManager::assignRandomTeams(int intended_number, int player_number = 0; for (auto& p : STKHost::get()->getPeers()) { - if (!m_lobby->canRace(p)) + if (!getLobby()->canRace(p)) continue; if (p->alwaysSpectateButNotNeutral()) continue; @@ -4056,7 +4063,7 @@ bool CommandManager::assignRandomTeams(int intended_number, return false; } int max_number_of_teams = TeamUtils::getNumberOfTeams(); - std::string available_colors_string = m_lobby_settings->getAvailableTeams(); + std::string available_colors_string = getSettings()->getAvailableTeams(); if (available_colors_string.empty()) return false; if (max_number_of_teams > (int)available_colors_string.length()) @@ -4087,15 +4094,15 @@ bool CommandManager::assignRandomTeams(int intended_number, std::shuffle(profile_colors.begin(), profile_colors.end(), g); - m_lobby->clearTemporaryTeams(); + getLobby()->clearTemporaryTeams(); for (auto& p : STKHost::get()->getPeers()) { - if (!m_lobby->canRace(p)) + if (!getLobby()->canRace(p)) continue; if (p->alwaysSpectateButNotNeutral()) continue; for (auto& profile : p->getPlayerProfiles()) { - m_lobby->setTemporaryTeamInLobby(profile, profile_colors.back()); + getLobby()->setTemporaryTeamInLobby(profile, profile_colors.back()); if (profile_colors.size() > 1) // prevent crash just in case profile_colors.pop_back(); } @@ -4183,7 +4190,7 @@ bool CommandManager::hasTypo(std::shared_ptr peer, bool voting, if (closest_commands.empty()) { std::string msg = "Command " + cmd + " not found"; - m_lobby->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(msg, peer); return true; } bool no_zeros = closest_commands[0].second != 0; @@ -4220,7 +4227,7 @@ bool CommandManager::hasTypo(std::shared_ptr peer, bool voting, } argv[idx] = initial_argument; CommandManager::restoreCmdByArgv(cmd, argv, ' ', '"', '"', '\\'); - m_lobby->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(response, peer); return true; } @@ -4277,7 +4284,7 @@ void CommandManager::Command::changePermissions(int permissions, std::string CommandManager::getAddonPreferredType() const { - int mode = m_lobby->m_game_mode.load(); + int mode = getLobby()->m_game_mode.load(); if (0 <= mode && mode <= 4) return "track"; if (mode == 6) @@ -4290,17 +4297,18 @@ std::string CommandManager::getAddonPreferredType() const std::deque>& CommandManager::get_queue(int x) const { + auto queues = getQueues(); if (x == QM_MAP_ONETIME) - return m_lobby_queues->getOnetimeTracksQueue(); + return queues->getOnetimeTracksQueue(); if (x == QM_MAP_CYCLIC) - return m_lobby_queues->getCyclicTracksQueue(); + return queues->getCyclicTracksQueue(); if (x == QM_KART_ONETIME) - return m_lobby_queues->getOnetimeKartsQueue(); + return queues->getOnetimeKartsQueue(); if (x == QM_KART_CYCLIC) - return m_lobby_queues->getCyclicKartsQueue(); + return queues->getCyclicKartsQueue(); Log::error("CommandManager", "Unknown queue mask %d, revert to map onetime", x); - return m_lobby_queues->getOnetimeTracksQueue(); + return queues->getOnetimeTracksQueue(); } // get_queue // ======================================================================== diff --git a/src/network/protocols/command_manager.hpp b/src/network/protocols/command_manager.hpp index dcc519fdd52..f8bbd4d3015 100644 --- a/src/network/protocols/command_manager.hpp +++ b/src/network/protocols/command_manager.hpp @@ -41,22 +41,19 @@ #include "network/protocols/command_voting.hpp" #include "network/protocols/command_permissions.hpp" #include "utils/enum_extended_reader.hpp" +#include "utils/lobby_context.hpp" #include "utils/set_typo_fixer.hpp" #include "utils/team_utils.hpp" #include "utils/track_filter.hpp" #include "utils/types.hpp" -class ServerLobby; class Event; -class STKPeer; -class HitProcessor; -class LobbyAssetManager; -class Tournament; -class LobbyQueues; -class LobbySettings; class KartElimination; +class LobbySettings; +class ServerLobby; +class STKPeer; -class CommandManager +class CommandManager: public LobbyContextComponent { struct FileResource { @@ -201,15 +198,6 @@ class CommandManager private: - ServerLobby* m_lobby; - - std::shared_ptr m_hit_processor; - std::shared_ptr m_asset_manager; - std::shared_ptr m_tournament; - std::shared_ptr m_lobby_queues; - std::shared_ptr m_lobby_settings; - std::shared_ptr m_kart_elimination; - std::vector> m_all_commands; std::map> m_full_name_to_command; @@ -360,13 +348,12 @@ class CommandManager void special(Context& context); public: + CommandManager(LobbyContext* context): LobbyContextComponent(context) {} - CommandManager(ServerLobby* lobby = nullptr); + void setupContextUser() OVERRIDE; void handleCommand(Event* event, std::shared_ptr peer); - bool isInitialized() { return m_lobby != nullptr; } - template void addTextResponse(std::string key, T&& value) { m_text_response[key] = value; } diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 6bf50ec2b02..171c03cb73e 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -190,21 +190,10 @@ ServerLobby::ServerLobby() : LobbyProtocol() m_current_max_players_in_game.store(ServerConfig::m_max_players_in_game); - m_kart_elimination = std::make_shared(); - m_lobby_queues = std::make_shared(); - m_asset_manager = std::make_shared(this); - if (ServerConfig::m_soccer_tournament) - m_tournament = std::make_shared(this, m_lobby_settings); - - m_lobby_settings = std::make_shared( - getGameSetup(), m_lobby_queues, m_kart_elimination, m_asset_manager, m_tournament - ); - - m_map_vote_handler = std::make_shared(m_lobby_settings); - m_hit_processor = std::make_shared(this, m_lobby_settings); - - - m_map_vote_handler->setAlgorithm(ServerConfig::m_map_vote_handling); + m_lobby_context = std::make_shared(this, (bool)ServerConfig::m_soccer_tournament); + m_lobby_context->setup(); + m_context = m_lobby_context.get(); + m_game_setup->setContext(m_context); m_current_ai_count.store(0); @@ -237,9 +226,6 @@ ServerLobby::ServerLobby() : LobbyProtocol() #endif m_game_info = {}; - - // Init CM later than all the above shared_ptrs - m_command_manager = std::make_shared(nullptr); } // ServerLobby //----------------------------------------------------------------------------- @@ -278,7 +264,7 @@ void ServerLobby::updateMapsForMode() { RaceManager::MinorRaceModeType m = ServerConfig::getLocalGameMode(m_game_mode.load()).first; - m_asset_manager->updateMapsForMode(m); + getAssetManager()->updateMapsForMode(m); } // updateMapsForMode //----------------------------------------------------------------------------- @@ -308,8 +294,8 @@ void ServerLobby::setup() ai->setKartName(""); StateManager::get()->resetActivePlayers(); - m_asset_manager->onServerSetup(); - NetworkConfig::get()->setTuxHitboxAddon(ServerConfig::m_live_players); + getAssetManager()->onServerSetup(); + getSettings()->onServerSetup(); updateMapsForMode(); m_server_has_loaded_world.store(false); @@ -354,7 +340,7 @@ bool ServerLobby::notifyEvent(Event* event) //----------------------------------------------------------------------------- void ServerLobby::handleChat(Event* event) { - if (!checkDataSize(event, 1) || !ServerConfig::m_chat) return; + if (!checkDataSize(event, 1) || !getSettings()->getChat()) return; // Update so that the peer is not kicked event->getPeer()->updateLastActivity(); @@ -364,15 +350,15 @@ void ServerLobby::handleChat(Event* event) int64_t elapsed_time = (int64_t)StkTime::getMonoTimeMs() - last_message; // Read ServerConfig for formula and details - if (ServerConfig::m_chat_consecutive_interval > 0 && - elapsed_time < ServerConfig::m_chat_consecutive_interval * 1000) + if (getSettings()->getChatConsecutiveInterval() > 0 && + elapsed_time < getSettings()->getChatConsecutiveInterval() * 1000) event->getPeer()->updateConsecutiveMessages(true); else event->getPeer()->updateConsecutiveMessages(false); - if (ServerConfig::m_chat_consecutive_interval > 0 && + if (getSettings()->getChatConsecutiveInterval() > 0 && event->getPeer()->getConsecutiveMessages() > - ServerConfig::m_chat_consecutive_interval / 2) + getSettings()->getChatConsecutiveInterval() / 2) { std::string msg = "Spam detected"; sendStringToPeer(msg, event->getPeerSP()); @@ -413,10 +399,10 @@ void ServerLobby::handleChat(Event* event) chat->setSynchronous(true); const bool game_started = m_state.load() != WAITING_FOR_START_GAME; std::shared_ptr sender = event->getPeerSP(); - auto can_receive = m_lobby_settings->getMessageReceiversFor(sender); + auto can_receive = getSettings()->getMessageReceiversFor(sender); if (!can_receive.empty()) message = StringUtils::utf32ToWide({0x1f512, 0x20}) + message; - bool team_speak = m_lobby_settings->isTeamSpeaker(sender); + bool team_speak = getSettings()->isTeamSpeaker(sender); team_speak &= ( RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_SOCCER || RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_CAPTURE_THE_FLAG @@ -439,17 +425,17 @@ void ServerLobby::handleChat(Event* event) if (add_red_emoji) message = StringUtils::utf32ToWide({0x1f7e5, 0x20}) + message; bool tournament_limit = false; - if (m_tournament) - tournament_limit = !m_tournament->checkSenderInRefsOrPlayers(sender); + if (isTournament()) + tournament_limit = !getTournament()->checkSenderInRefsOrPlayers(sender); std::set sees_teamchats; - if (m_tournament) - sees_teamchats = m_tournament->getThoseWhoSeeTeamchats(); + if (isTournament()) + sees_teamchats = getTournament()->getThoseWhoSeeTeamchats(); // Note that mutealls are still spectators std::set important_players; - if (m_tournament && tournament_limit) + if (getTournament() && tournament_limit) { - important_players = m_tournament->getImportantChatPlayers(); + important_players = getTournament()->getImportantChatPlayers(); } chat->addUInt8(LE_CHAT).encodeString16(message); core::stringw sender_name = @@ -502,7 +488,7 @@ void ServerLobby::handleChat(Event* event) return false; } } - if (m_lobby_settings->isMuting(p, sender_name)) + if (getSettings()->isMuting(p, sender_name)) return false; if (team_speak) { @@ -539,7 +525,7 @@ void ServerLobby::handleChat(Event* event) //----------------------------------------------------------------------------- void ServerLobby::changeTeam(Event* event) { - if (!ServerConfig::m_team_choosing || + if (!getSettings()->getTeamChoosing() || !RaceManager::get()->teamEnabled()) return; if (!checkDataSize(event, 1)) return; @@ -547,7 +533,7 @@ void ServerLobby::changeTeam(Event* event) uint8_t local_id = data.getUInt8(); auto& player = event->getPeer()->getPlayerProfiles().at(local_id); auto red_blue = STKHost::get()->getAllPlayersTeamInfo(); - if (m_tournament && !m_tournament->canChangeTeam()) + if (getTournament() && !getTournament()->canChangeTeam()) { Log::info("ServerLobby", "Team change requested by %s, but tournament forbids it.", player->getName().c_str()); return; @@ -561,13 +547,13 @@ void ServerLobby::changeTeam(Event* event) // At most 7 players on each team (for live join) if (player->getTeam() == KART_TEAM_BLUE) { - if (red_blue.first >= 7 && !ServerConfig::m_free_teams) + if (red_blue.first >= 7 && !getSettings()->getFreeTeams()) return; setTeamInLobby(player, KART_TEAM_RED); } else { - if (red_blue.second >= 7 && !ServerConfig::m_free_teams) + if (red_blue.second >= 7 && !getSettings()->getFreeTeams()) return; setTeamInLobby(player, KART_TEAM_BLUE); } @@ -579,7 +565,7 @@ void ServerLobby::kickHost(Event* event) { if (m_server_owner.lock() != event->getPeerSP()) return; - if (!ServerConfig::m_kicks_allowed) + if (!getSettings()->getKicksAllowed()) { std::string msg = "Kicking players is not allowed on this server"; auto crown = event->getPeerSP(); @@ -591,7 +577,7 @@ void ServerLobby::kickHost(Event* event) uint32_t host_id = data.getUInt32(); std::shared_ptr peer = STKHost::get()->findPeerByHostId(host_id); // Ignore kicking ai peer if ai handling is on - if (peer && (!ServerConfig::m_ai_handling || !peer->isAIPeer())) + if (peer && (!getSettings()->getAiHandling() || !peer->isAIPeer())) { if (peer->isAngryHost()) { @@ -612,7 +598,7 @@ void ServerLobby::kickHost(Event* event) Log::info("ServerLobby", "Crown player kicks %s", player_name.c_str()); } peer->kick(); - if (ServerConfig::m_track_kicks) + if (getSettings()->getTrackKicks()) { std::string auto_report = "[ Auto report caused by kick ]"; writeOwnReport(peer, event->getPeerSP(), auto_report); @@ -670,7 +656,7 @@ bool ServerLobby::notifyEventAsynchronous(Event* event) */ void ServerLobby::pollDatabase() { - if (!ServerConfig::m_sql_management || !m_db_connector->hasDatabase()) + if (!getSettings()->getSqlManagement() || !m_db_connector->hasDatabase()) return; if (!m_db_connector->isTimeToPoll()) @@ -811,7 +797,7 @@ void ServerLobby::asynchronousUpdate() m_rs_state.store(RS_NONE); } - m_lobby_settings->clearAllExpiredWeakPtrs(); + getSettings()->clearAllExpiredWeakPtrs(); #ifdef ENABLE_SQLITE3 pollDatabase(); @@ -820,7 +806,7 @@ void ServerLobby::asynchronousUpdate() // Check if server owner has left updateServerOwner(); - if (ServerConfig::m_ranked && m_state.load() == WAITING_FOR_START_GAME) + if (getSettings()->getRanked() && m_state.load() == WAITING_FOR_START_GAME) m_ranking->cleanup(); if (allowJoinedPlayersWaiting() /*|| (m_game_setup->isGrandPrix() && @@ -911,10 +897,10 @@ void ServerLobby::asynchronousUpdate() } case WAITING_FOR_START_GAME: { - if (ServerConfig::m_owner_less) + if (getSettings()->getOwnerLess()) { // Ensure that a game can auto-start if the server meets the config's starting limit or if it's already full. - int starting_limit = std::min((int)ServerConfig::m_min_start_game_players, (int)ServerConfig::m_server_max_players); + int starting_limit = std::min((int)getSettings()->getMinStartGamePlayers(), (int)getSettings()->getServerMaxPlayers()); unsigned current_max_players_in_game = m_current_max_players_in_game.load(); if (current_max_players_in_game > 0) // 0 here means it's not the limit starting_limit = std::min(starting_limit, (int)current_max_players_in_game); @@ -925,11 +911,11 @@ void ServerLobby::asynchronousUpdate() m_game_setup->isGrandPrixStarted()) && m_timeout.load() == std::numeric_limits::max()) { - if (ServerConfig::m_start_game_counter >= -1e-5) + if (getSettings()->getStartGameCounter() >= -1e-5) { m_timeout.store((int64_t)StkTime::getMonoTimeMs() + (int64_t) - (ServerConfig::m_start_game_counter * 1000.0f)); + (getSettings()->getStartGameCounter() * 1000.0f)); } else { @@ -945,7 +931,7 @@ void ServerLobby::asynchronousUpdate() m_timeout.store(std::numeric_limits::max()); } bool forbid_starting = false; - if (m_tournament && m_tournament->forbidStarting()) + if (getTournament() && getTournament()->forbidStarting()) forbid_starting = true; bool timer_finished = (!forbid_starting && m_timeout.load() < (int64_t)StkTime::getMonoTimeMs()); @@ -982,7 +968,7 @@ void ServerLobby::asynchronousUpdate() unsigned player_in_game = 0; STKHost::get()->updatePlayers(&player_in_game); // Reset lobby will be done in main thread - if ((player_in_game == 1 && ServerConfig::m_ranked) || + if ((player_in_game == 1 && getSettings()->getRanked()) || player_in_game == 0) { resetVotingTime(); @@ -993,7 +979,7 @@ void ServerLobby::asynchronousUpdate() if (m_server_has_loaded_world.load() == false) return; if (!checkPeersReady( - ServerConfig::m_ai_handling && m_ai_count == 0/*ignore_ai_peer*/, LOADING_WORLD)) + getSettings()->getAiHandling() && m_ai_count == 0/*ignore_ai_peer*/, LOADING_WORLD)) return; // Reset for next state usage resetPeersReady(); @@ -1006,7 +992,7 @@ void ServerLobby::asynchronousUpdate() return; unsigned player_in_game = 0; STKHost::get()->updatePlayers(&player_in_game); - if ((player_in_game == 1 && ServerConfig::m_ranked) || + if ((player_in_game == 1 && getSettings()->getRanked()) || player_in_game == 0) { resetVotingTime(); @@ -1014,40 +1000,40 @@ void ServerLobby::asynchronousUpdate() } PeerVote winner_vote; - m_lobby_settings->resetWinnerPeerId(); + getSettings()->resetWinnerPeerId(); bool go_on_race = false; - if (ServerConfig::m_track_voting) + if (getSettings()->getTrackVoting()) go_on_race = handleAllVotes(&winner_vote); else if (/*m_game_setup->isGrandPrixStarted() || */isVotingOver()) { - winner_vote = m_lobby_settings->getDefaultVote(); + winner_vote = getSettings()->getDefaultVote(); go_on_race = true; } if (go_on_race) { - if (m_lobby_settings->hasFixedLapCount()) + if (getSettings()->hasFixedLapCount()) { - winner_vote.m_num_laps = m_lobby_settings->getFixedLapCount(); - Log::info("ServerLobby", "Enforcing %d lap race", m_lobby_settings->getFixedLapCount()); + winner_vote.m_num_laps = getSettings()->getFixedLapCount(); + Log::info("ServerLobby", "Enforcing %d lap race", getSettings()->getFixedLapCount()); } - if (m_lobby_settings->hasFixedDirection()) + if (getSettings()->hasFixedDirection()) { - winner_vote.m_reverse = (m_lobby_settings->getDirection() == 1); - Log::info("ServerLobby", "Enforcing direction %d", (int)m_lobby_settings->getDirection()); + winner_vote.m_reverse = (getSettings()->getDirection() == 1); + Log::info("ServerLobby", "Enforcing direction %d", (int)getSettings()->getDirection()); } - m_lobby_settings->setDefaultVote(winner_vote); + getSettings()->setDefaultVote(winner_vote); m_item_seed = (uint32_t)StkTime::getTimeSinceEpoch(); ItemManager::updateRandomSeed(m_item_seed); float extra_seconds = 0.0f; - if (m_tournament) - extra_seconds = m_tournament->getExtraSeconds(); + if (isTournament()) + extra_seconds = getTournament()->getExtraSeconds(); m_game_setup->setRace(winner_vote, extra_seconds); // For spectators that don't have the track, remember their // spectate mode and don't load the track std::string track_name = winner_vote.m_track_name; - if (m_tournament) - m_tournament->fillNextArena(track_name); + if (isTournament()) + getTournament()->fillNextArena(track_name); auto peers = STKHost::get()->getPeers(); std::map, @@ -1088,7 +1074,7 @@ void ServerLobby::asynchronousUpdate() m_ai_profiles.end()); } } - m_game_setup->sortPlayersForGrandPrix(players, m_lobby_settings->isGPGridShuffled()); + m_game_setup->sortPlayersForGrandPrix(players, getSettings()->isGPGridShuffled()); m_game_setup->sortPlayersForGame(players); for (unsigned i = 0; i < players.size(); i++) { @@ -1114,7 +1100,7 @@ void ServerLobby::asynchronousUpdate() std::string current_kart = players[i]->getKartName(); if (!players[i]->getPeer().get()) continue; - if (m_lobby_queues->areKartFiltersIgnoringKarts()) + if (getQueues()->areKartFiltersIgnoringKarts()) current_kart = ""; std::string name = StringUtils::wideToUtf8(players[i]->getName()); // Note 1: setKartName also resets KartData, and should be called @@ -1138,17 +1124,18 @@ void ServerLobby::asynchronousUpdate() NetworkString* load_world_message = getLoadWorldMessage(players, false/*live_join*/); - m_game_setup->setHitCaptureTime(m_lobby_settings->getBattleHitCaptureLimit(), - m_lobby_settings->getBattleTimeLimit()); + m_game_setup->setHitCaptureTime(getSettings()->getBattleHitCaptureLimit(), + getSettings()->getBattleTimeLimit()); uint16_t flag_return_time = (uint16_t)stk_config->time2Ticks( - ServerConfig::m_flag_return_timeout); + getSettings()->getFlagReturnTimeout()); + RaceManager::get()->setHitProcessor(getHitProcessor()); RaceManager::get()->setFlagReturnTicks(flag_return_time); - if (ServerConfig::m_record_replays && m_lobby_settings->hasConsentOnReplays() && + if (getSettings()->getRecordReplays() && getSettings()->hasConsentOnReplays() && (RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_TIME_TRIAL || RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE)) RaceManager::get()->setRecordRace(true); uint16_t flag_deactivated_time = (uint16_t)stk_config->time2Ticks( - ServerConfig::m_flag_deactivated_time); + getSettings()->getFlagDeactivatedTime()); RaceManager::get()->setFlagDeactivatedTicks(flag_deactivated_time); configRemoteKart(players, 0); @@ -1230,19 +1217,19 @@ NetworkString* ServerLobby::getLoadWorldMessage( NetworkString* load_world_message = getNetworkString(); load_world_message->setSynchronous(true); load_world_message->addUInt8(LE_LOAD_WORLD); - m_lobby_settings->encodeDefaultVote(load_world_message); + getSettings()->encodeDefaultVote(load_world_message); load_world_message->addUInt8(live_join ? 1 : 0); encodePlayers(load_world_message, players); load_world_message->addUInt32(m_item_seed); if (RaceManager::get()->isBattleMode()) { - load_world_message->addUInt32(m_lobby_settings->getBattleHitCaptureLimit()) - .addFloat(m_lobby_settings->getBattleTimeLimit()); + load_world_message->addUInt32(getSettings()->getBattleHitCaptureLimit()) + .addFloat(getSettings()->getBattleTimeLimit()); uint16_t flag_return_time = (uint16_t)stk_config->time2Ticks( - ServerConfig::m_flag_return_timeout); + getSettings()->getFlagReturnTimeout()); load_world_message->addUInt16(flag_return_time); uint16_t flag_deactivated_time = (uint16_t)stk_config->time2Ticks( - ServerConfig::m_flag_deactivated_time); + getSettings()->getFlagDeactivatedTime()); load_world_message->addUInt16(flag_deactivated_time); } for (unsigned i = 0; i < players.size(); i++) @@ -1255,7 +1242,7 @@ NetworkString* ServerLobby::getLoadWorldMessage( */ bool ServerLobby::canLiveJoinNow() const { - bool live_join = ServerConfig::m_live_players && worldIsActive(); + bool live_join = getSettings()->isLivePlayers() && worldIsActive(); if (!live_join) return false; if (RaceManager::get()->modeHasLaps()) @@ -1420,7 +1407,7 @@ int ServerLobby::getReservedId(std::shared_ptr& p, rki.copyFrom(p, local_id); return i; } - if (ServerConfig::m_team_choosing) + if (getSettings()->getTeamChoosing()) { if ((p->getTeam() == KART_TEAM_RED && rki.getKartTeam() == KART_TEAM_RED) || @@ -1529,7 +1516,7 @@ void ServerLobby::finishedLoadingLiveJoinClient(Event* event) } if (RaceManager::get()->isBattleMode()) { - if (ServerConfig::m_preserve_battle_scores) + if (getSettings()->getPreserveBattleScores()) points = m_game_info->m_saved_ffa_points[name]; info.m_result -= points; } @@ -1597,7 +1584,7 @@ void ServerLobby::update(int ticks) bool world_started = m_state.load() >= WAIT_FOR_WORLD_LOADED && m_state.load() <= RACING && m_server_has_loaded_world.load(); bool all_players_in_world_disconnected = (w != NULL && world_started); - int sec = ServerConfig::m_kick_idle_player_seconds; + int sec = getSettings()->getKickIdlePlayerSeconds(); if (world_started) { for (unsigned i = 0; i < RaceManager::get()->getNumPlayers(); i++) @@ -1642,7 +1629,7 @@ void ServerLobby::update(int ticks) StringUtils::wideToUtf8(rki.getPlayerName()).c_str(), sec); peer->kick(); } - if (m_hit_processor->isAntiTrollActive() && !peer->isAIPeer()) + if (getHitProcessor()->isAntiTrollActive() && !peer->isAIPeer()) { // for all human players // if they troll, kick them @@ -1655,7 +1642,7 @@ void ServerLobby::update(int ticks) break; case 1: { - std::string msg = ServerConfig::m_troll_warn_msg; + std::string msg = getSettings()->getTrollWarnMsg(); sendStringToPeer(msg, peer); std::string player_name = StringUtils::wideToUtf8(peer->getPlayerProfiles()[0]->getName()); Log::info("ServerLobby-AntiTroll", "Sent WARNING to %s", player_name.c_str()); @@ -1675,7 +1662,7 @@ void ServerLobby::update(int ticks) } } if (m_state.load() == WAITING_FOR_START_GAME) { - sec = ServerConfig::m_kick_idle_lobby_player_seconds; + sec = getSettings()->getKickIdleLobbyPlayerSeconds(); auto peers = STKHost::get()->getPeers(); for (auto peer: peers) { @@ -1766,7 +1753,7 @@ void ServerLobby::update(int ticks) return; // Reset for ranked server if in kart / track selection has only 1 player - if (ServerConfig::m_ranked && + if (getSettings()->getRanked() && m_state.load() == SELECTING && STKHost::get()->getPlayersInGame() == 1) { @@ -1803,7 +1790,7 @@ void ServerLobby::update(int ticks) Log::info("ServerLobby", "Starting the race loading."); // This will create the world instance, i.e. load track and karts loadWorld(); - m_lobby_settings->updateWorldSettings(m_game_info); + getSettings()->updateWorldSettings(m_game_info); m_state = WAIT_FOR_WORLD_LOADED; break; case RACING: @@ -1867,12 +1854,12 @@ void ServerLobby::registerServer(bool first_time) request->addParameter("private_port", STKHost::get()->getPrivatePort() ); request->addParameter("name", m_game_setup->getServerNameUtf8()); - request->addParameter("max_players", ServerConfig::m_server_max_players); + request->addParameter("max_players", getSettings()->getServerMaxPlayers()); int difficulty = m_difficulty.load(); request->addParameter("difficulty", difficulty); int game_mode = m_game_mode.load(); request->addParameter("game_mode", game_mode); - const std::string& pw = ServerConfig::m_private_server_password; + const std::string& pw = getSettings()->getPrivateServerPassword(); request->addParameter("password", (unsigned)(!pw.empty())); request->addParameter("version", (unsigned)ServerConfig::m_server_version); @@ -1945,16 +1932,16 @@ void ServerLobby::startSelection(const Event *event) m_state.load()); return; } - if (ServerConfig::m_sleeping_server) + if (getSettings()->getSleepingServer()) { Log::warn("ServerLobby", "An attempt to start a race on a sleeping server."); return; } auto peer = event->getPeerSP(); - if (ServerConfig::m_owner_less) + if (getSettings()->getOwnerLess()) { - if (!m_lobby_settings->isAllowedToStart()) + if (!getSettings()->isAllowedToStart()) { std::string msg = "Starting the game is forbidden by server owner"; sendStringToPeer(msg, peer); @@ -1974,7 +1961,7 @@ void ServerLobby::startSelection(const Event *event) return; } } - if (!m_lobby_settings->isAllowedToStart()) + if (!getSettings()->isAllowedToStart()) { std::string msg = "Starting the game is forbidden by server owner"; sendStringToPeer(msg, peer); @@ -1991,15 +1978,15 @@ void ServerLobby::startSelection(const Event *event) } } } else { - if (!m_lobby_settings->isAllowedToStart()) + if (!getSettings()->isAllowedToStart()) { // Produce no log spam return; } } - if (!ServerConfig::m_owner_less && ServerConfig::m_team_choosing && - !ServerConfig::m_free_teams && RaceManager::get()->teamEnabled()) + if (!getSettings()->getOwnerLess() && getSettings()->getTeamChoosing() && + !getSettings()->getFreeTeams() && RaceManager::get()->teamEnabled()) { auto red_blue = STKHost::get()->getAllPlayersTeamInfo(); if ((red_blue.first == 0 || red_blue.second == 0) && @@ -2094,7 +2081,7 @@ void ServerLobby::startSelection(const Event *event) peer->setWaitingForGame(true); } - m_asset_manager->eraseAssetsWithPeers(erasingPeers); + getAssetManager()->eraseAssetsWithPeers(erasingPeers); max_player = 0; STKHost::get()->updatePlayers(&max_player); @@ -2121,13 +2108,13 @@ void ServerLobby::startSelection(const Event *event) else m_ai_count = 0; - if (!m_asset_manager->tryApplyingMapFilters()) + if (!getAssetManager()->tryApplyingMapFilters()) { Log::error("ServerLobby", "No tracks for playing!"); return; } - m_lobby_settings->initializeDefaultVote(); + getSettings()->initializeDefaultVote(); if (!allowJoinedPlayersWaiting()) { @@ -2139,7 +2126,7 @@ void ServerLobby::startSelection(const Event *event) } } - startVotingPeriod(ServerConfig::m_voting_timeout); + startVotingPeriod(getSettings()->getVotingTimeout()); std::string ignored_choice_string = "The server will ignore your kart choice"; @@ -2156,10 +2143,10 @@ void ServerLobby::startSelection(const Event *event) // a new screen, which must be done from the main thread. ns->setSynchronous(true); ns->addUInt8(LE_START_SELECTION) - .addFloat(ServerConfig::m_voting_timeout) + .addFloat(getSettings()->getVotingTimeout()) .addUInt8(/*m_game_setup->isGrandPrixStarted() ? 1 : */0) - .addUInt8((!m_lobby_settings->hasNoLapRestrictions() ? 1 : 0)) - .addUInt8(ServerConfig::m_track_voting ? 1 : 0); + .addUInt8((!getSettings()->hasNoLapRestrictions() ? 1 : 0)) + .addUInt8(getSettings()->getTrackVoting() ? 1 : 0); std::set all_k = peer->getClientAssets().first; @@ -2167,20 +2154,20 @@ void ServerLobby::startSelection(const Event *event) // std::string username = StringUtils::wideToUtf8(profile->getName()); applyAllKartFilters(username, all_k); - if (!m_kart_elimination->getRemainingParticipants().empty() && m_kart_elimination->getRemainingParticipants().count(username) == 0) + if (!getKartElimination()->getRemainingParticipants().empty() && getKartElimination()->getRemainingParticipants().count(username) == 0) { - if (all_k.count(m_kart_elimination->getKart())) - all_k = {m_kart_elimination->getKart()}; + if (all_k.count(getKartElimination()->getKart())) + all_k = {getKartElimination()->getKart()}; else all_k = {}; } - m_asset_manager->encodePlayerKartsAndCommonMaps(ns, all_k); + getAssetManager()->encodePlayerKartsAndCommonMaps(ns, all_k); peer->sendPacket(ns, PRM_RELIABLE); delete ns; - if (m_lobby_queues->areKartFiltersIgnoringKarts()) + if (getQueues()->areKartFiltersIgnoringKarts()) sendStringToPeer(ignored_choice_string, peer); } @@ -2240,7 +2227,7 @@ void ServerLobby::checkIncomingConnectionRequests() // Keep the port open, it can be sent to anywhere as we will send to the // correct peer later in ConnectToPeer. - if (ServerConfig::m_firewalled_server) + if (getSettings()->getFirewalledServer()) { BareNetworkString data; data.addUInt8(0); @@ -2285,8 +2272,8 @@ void ServerLobby::checkRaceFinished() assert(World::getWorld()); if (!RaceEventManager::get()->isRaceOver()) return; - if (m_tournament) - m_tournament->onRaceFinished(); + if (isTournament()) + getTournament()->onRaceFinished(); if (RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_SOCCER) @@ -2295,6 +2282,7 @@ void ServerLobby::checkRaceFinished() Log::info("ServerLobby", "The game is considered finished."); // notify the network world that it is stopped RaceEventManager::get()->stop(); + RaceManager::get()->resetHitProcessor(); // stop race protocols before going back to lobby (end race) RaceEventManager::get()->getProtocol()->requestTerminate(); @@ -2354,7 +2342,7 @@ void ServerLobby::checkRaceFinished() gp_changes.back() += points_fl; cur_score += points_fl; } - int team = m_lobby_settings->getTeamForUsername(username); + int team = getSettings()->getTeamForUsername(username); if (team > 0) { m_gp_team_scores[team].score += cur_score; @@ -2385,25 +2373,25 @@ void ServerLobby::checkRaceFinished() } uint8_t ranking_changes_indication = 0; - if (ServerConfig::m_ranked && RaceManager::get()->modeHasLaps()) + if (getSettings()->getRanked() && RaceManager::get()->modeHasLaps()) ranking_changes_indication = 1; if (m_game_setup->isGrandPrix()) ranking_changes_indication = 1; m_result_ns->addUInt8(ranking_changes_indication); - if (m_kart_elimination->isEnabled()) + if (getKartElimination()->isEnabled()) { // ServerLobby's function because we need to take // the list of players from somewhere updateGnuElimination(); } - if (ServerConfig::m_store_results) + if (getSettings()->getStoreResults()) { storeResults(); } - if (ServerConfig::m_ranked) + if (getSettings()->getRanked()) { computeNewRankings(); submitRankingsToAddons(); @@ -2421,7 +2409,7 @@ void ServerLobby::checkRaceFinished() m_map_history.push_back(RaceManager::get()->getTrackName()); - m_lobby_queues->popOnRaceFinished(); + getQueues()->popOnRaceFinished(); } // checkRaceFinished //----------------------------------------------------------------------------- @@ -2486,7 +2474,7 @@ void ServerLobby::clientDisconnected(Event* event) World* w = World::getWorld(); std::shared_ptr peer = event->getPeerSP(); - m_lobby_settings->onPeerDisconnect(peer); + getSettings()->onPeerDisconnect(peer); // No warnings otherwise, as it could happen during lobby period if (w && m_game_info) saveDisconnectingPeerInfo(peer); @@ -2570,7 +2558,7 @@ bool ServerLobby::handleAssets(const NetworkString& ns, std::shared_ptr client_tracks.insert(track); } - if (!m_asset_manager->handleAssetsForPeer(peer, client_karts, client_tracks)) + if (!getAssetManager()->handleAssetsForPeer(peer, client_karts, client_tracks)) { if (peer->isValidated()) { @@ -2585,7 +2573,7 @@ bool ServerLobby::handleAssets(const NetworkString& ns, std::shared_ptr message->addUInt8(LE_CONNECTION_REFUSED) .addUInt8(RR_INCOMPATIBLE_DATA); - std::string advice = ServerConfig::m_incompatible_advice; + std::string advice = getSettings()->getIncompatibleAdvice(); if (!advice.empty()) { NetworkString *incompatible_reason = getNetworkString(); incompatible_reason->addUInt8(LE_CHAT); @@ -2608,7 +2596,7 @@ bool ServerLobby::handleAssets(const NetworkString& ns, std::shared_ptr } - std::array addons_scores = m_asset_manager->getAddonScores(client_karts, client_tracks); + std::array addons_scores = getAssetManager()->getAddonScores(client_karts, client_tracks); // Save available karts and tracks from clients in STKPeer so if this peer // disconnects later in lobby it won't affect current players @@ -2619,12 +2607,12 @@ bool ServerLobby::handleAssets(const NetworkString& ns, std::shared_ptr peer->getHostId() == m_client_server_host_id.load()) { // Update child process addons list too so player can choose later - m_asset_manager->updateAddons(); + getAssetManager()->updateAddons(); updateMapsForMode(); } - if (m_tournament) - m_tournament->updateTournamentRole(peer); + if (isTournament()) + getTournament()->updateTournamentRole(peer); updatePlayerList(); return true; } // handleAssets @@ -2709,7 +2697,7 @@ void ServerLobby::connectionRequested(Event* event) unsigned total_players = 0; STKHost::get()->updatePlayers(NULL, NULL, &total_players); if (total_players + player_count + m_ai_profiles.size() > - (unsigned)ServerConfig::m_server_max_players) + (unsigned)getSettings()->getServerMaxPlayers()) { NetworkString *message = getNetworkString(2); message->setSynchronous(true); @@ -2734,12 +2722,12 @@ void ServerLobby::connectionRequested(Event* event) !(peer->getAddress().isPublicAddressLocalhost() || peer->getAddress().isLAN()) && NetworkConfig::get()->isWAN() && - ServerConfig::m_validating_player) || - (ServerConfig::m_strict_players && + getSettings()->getValidatingPlayer()) || + (getSettings()->getStrictPlayers() && (player_count != 1 || online_id == 0 || duplicated_ranked_player)) || - (peer->isAIPeer() && !peer->getAddress().isLAN() &&!ServerConfig::m_ai_anywhere) || + (peer->isAIPeer() && !peer->getAddress().isLAN() && !getSettings()->canConnectAiAnywhere()) || (peer->isAIPeer() && - ServerConfig::m_ai_handling && !m_ai_peer.expired())) + getSettings()->getAiHandling() && !m_ai_peer.expired())) { NetworkString* message = getNetworkString(2); message->setSynchronous(true); @@ -2751,7 +2739,7 @@ void ServerLobby::connectionRequested(Event* event) return; } - if (ServerConfig::m_ai_handling && peer->isAIPeer()) + if (getSettings()->getAiHandling() && peer->isAIPeer()) m_ai_peer = peer; if (encrypted_size != 0) @@ -2780,7 +2768,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, // Check for password std::string password; data.decodeString(&password); - const std::string& server_pw = ServerConfig::m_private_server_password; + const std::string& server_pw = getSettings()->getPrivateServerPassword(); if (online_id > 0) { std::string username = StringUtils::wideToUtf8(online_name); @@ -2798,7 +2786,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, Log::verbose("ServerLobby", "Player refused: invalid player"); return; } - if (m_lobby_settings->isInWhitelist(username)) + if (getSettings()->isInWhitelist(username)) password = server_pw; } if (password != server_pw) @@ -2823,7 +2811,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, { STKHost::get()->updatePlayers(NULL, NULL, &total_players); if (total_players + player_count > - (unsigned)ServerConfig::m_server_max_players) + (unsigned)getSettings()->getServerMaxPlayers()) { NetworkString *message = getNetworkString(2); message->setSynchronous(true); @@ -2840,7 +2828,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, STKHost::get()->getAllPlayerOnlineIds(); bool duplicated_ranked_player = all_online_ids.find(online_id) != all_online_ids.end(); - if (ServerConfig::m_ranked && duplicated_ranked_player) + if (getSettings()->getRanked() && duplicated_ranked_player) { NetworkString* message = getNetworkString(2); message->setSynchronous(true); @@ -2887,13 +2875,13 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, std::string username = StringUtils::wideToUtf8(player->getName()); // kimden: I'm not sure why the check is double - if (m_lobby_settings->hasTeam(username)) - previous_team = m_lobby_settings->getTeamForUsername(username); + if (getSettings()->hasTeam(username)) + previous_team = getSettings()->getTeamForUsername(username); bool can_change_teams = true; - if (m_tournament && !m_tournament->canChangeTeam()) + if (getTournament() && !getTournament()->canChangeTeam()) can_change_teams = false; - if (ServerConfig::m_team_choosing && can_change_teams) + if (getSettings()->getTeamChoosing() && can_change_teams) { KartTeam cur_team = KART_TEAM_NONE; @@ -2913,9 +2901,9 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, if (cur_team != KART_TEAM_NONE) setTeamInLobby(player, cur_team); } - if (m_tournament) + if (isTournament()) { - KartTeam team = m_tournament->getTeam(utf8_online_name); + KartTeam team = getTournament()->getTeam(utf8_online_name); if (team != KART_TEAM_NONE) setTeamInLobby(player, team); } @@ -2974,8 +2962,8 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, message_ack->encodeString(cap); message_ack->addFloat(auto_start_timer) - .addUInt32(ServerConfig::m_state_frequency) - .addUInt8(ServerConfig::m_chat ? 1 : 0) + .addUInt32(getSettings()->getStateFrequency()) + .addUInt8(getSettings()->getChat() ? 1 : 0) .addUInt8(playerReportsTableExists() ? 1 : 0); peer->setSpectator(false); @@ -2984,7 +2972,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, if (m_ai_profiles.empty() && peer->getAddress().isLoopback()) { unsigned ai_add = NetworkConfig::get()->getNumFixedAI(); - unsigned max_players = ServerConfig::m_server_max_players; + unsigned max_players = getSettings()->getServerMaxPlayers(); // We need to reserve at least 1 slot for new player if (player_count + ai_add + 1 > max_players) { @@ -3019,7 +3007,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, { peer->setWaitingForGame(false); m_peers_ready[peer] = false; - if (!ServerConfig::m_sql_management) + if (!getSettings()->getSqlManagement()) { for (std::shared_ptr& npp : peer->getPlayerProfiles()) @@ -3035,7 +3023,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, peer->sendPacket(message_ack); delete message_ack; - if (ServerConfig::m_ranked) + if (getSettings()->getRanked()) { getRankingForPlayer(peer->getPlayerProfiles()[0]); } @@ -3044,14 +3032,14 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, #ifdef ENABLE_SQLITE3 m_db_connector->onPlayerJoinQueries(peer, online_id, player_count, country_code); #endif - if (m_kart_elimination->isEnabled()) + if (getKartElimination()->isEnabled()) { bool hasEliminatedPlayer = false; for (unsigned i = 0; i < peer->getPlayerProfiles().size(); ++i) { std::string name = StringUtils::wideToUtf8( peer->getPlayerProfiles()[i]->getName()); - if (m_kart_elimination->isEliminated(name)) + if (getKartElimination()->isEliminated(name)) { hasEliminatedPlayer = true; break; @@ -3060,15 +3048,15 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, NetworkString* chat = getNetworkString(); chat->addUInt8(LE_CHAT); chat->setSynchronous(true); - std::string warning = m_kart_elimination->getWarningMessage(hasEliminatedPlayer); + std::string warning = getKartElimination()->getWarningMessage(hasEliminatedPlayer); chat->encodeString16(StringUtils::utf8ToWide(warning)); peer->sendPacket(chat, PRM_RELIABLE); delete chat; } - if (ServerConfig::m_record_replays) + if (getSettings()->getRecordReplays()) { std::string msg; - if (m_lobby_settings->hasConsentOnReplays()) + if (getSettings()->hasConsentOnReplays()) msg = "Recording ghost replays is enabled. " "The crowned player can change that " "using /replay 0 (to disable) or /replay 1 (to enable). " @@ -3081,8 +3069,8 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, } getMessagesFromHost(peer, online_id); - if (m_tournament) - m_tournament->updateTournamentRole(peer); + if (isTournament()) + getTournament()->updateTournamentRole(peer); } // handleUnencryptedConnection //----------------------------------------------------------------------------- @@ -3166,7 +3154,7 @@ void ServerLobby::updatePlayerList(bool update_when_reset_server) std::string os_type_str = version_os.second; std::string utf8_profile_name = StringUtils::wideToUtf8(profile_name); // Add a Mobile emoji for mobile OS - if (ServerConfig::m_expose_mobile && + if (getSettings()->getExposeMobile() && (os_type_str == "iOS" || os_type_str == "Android")) profile_name = StringUtils::utf32ToWide({0x1F4F1}) + profile_name; @@ -3179,7 +3167,7 @@ void ServerLobby::updatePlayerList(bool update_when_reset_server) profile_name = StringUtils::utf32ToWide({0x1F528}) + profile_name; std::string prefix = ""; - for (const std::string& category: m_lobby_settings->getVisibleCategoriesForPlayer(utf8_profile_name)) + for (const std::string& category: getSettings()->getVisibleCategoriesForPlayer(utf8_profile_name)) { prefix += category + ", "; } @@ -3209,7 +3197,7 @@ void ServerLobby::updatePlayerList(bool update_when_reset_server) boolean_combine |= (1 << 1); if (p && m_server_owner_id.load() == p->getHostId()) boolean_combine |= (1 << 2); - if (ServerConfig::m_owner_less && !game_started && + if (getSettings()->getOwnerLess() && !game_started && m_peers_ready.find(p) != m_peers_ready.end() && m_peers_ready.at(p)) boolean_combine |= (1 << 3); @@ -3217,7 +3205,7 @@ void ServerLobby::updatePlayerList(bool update_when_reset_server) boolean_combine |= (1 << 4); pl->addUInt8(boolean_combine); pl->addUInt8(profile->getHandicap()); - if (ServerConfig::m_team_choosing) + if (getSettings()->getTeamChoosing()) pl->addUInt8(profile->getTeam()); else pl->addUInt8(KART_TEAM_NONE); @@ -3242,7 +3230,7 @@ void ServerLobby::updateServerOwner(bool force) { if (m_state.load() < WAITING_FOR_START_GAME || m_state.load() > RESULT_DISPLAY || - ServerConfig::m_owner_less) + getSettings()->getOwnerLess()) return; if (!force && !m_server_owner.expired()) return; @@ -3315,7 +3303,7 @@ void ServerLobby::kartSelectionRequested(Event* event) */ void ServerLobby::handlePlayerVote(Event* event) { - if (m_state != SELECTING || !ServerConfig::m_track_voting) + if (m_state != SELECTING || !getSettings()->getTrackVoting()) { Log::warn("ServerLobby", "Received track vote while in state %d.", m_state.load()); @@ -3341,19 +3329,19 @@ void ServerLobby::handlePlayerVote(Event* event) Track* t = TrackManager::get()->getTrack(vote.m_track_name); if (!t) { - vote.m_track_name = m_asset_manager->getAnyMapForVote(); + vote.m_track_name = getAssetManager()->getAnyMapForVote(); t = TrackManager::get()->getTrack(vote.m_track_name); assert(t); } // Remove / adjust any invalid settings - if (m_tournament) + if (isTournament()) { - m_tournament->applyRestrictionsOnVote(&vote); + getTournament()->applyRestrictionsOnVote(&vote); } else { - m_lobby_settings->applyRestrictionsOnVote(&vote, t); + getSettings()->applyRestrictionsOnVote(&vote, t); } // Store vote: @@ -3404,7 +3392,7 @@ bool ServerLobby::handleAllVotes(PeerVote* winner_vote) cur_players++; } - return m_map_vote_handler->handleAllVotes( + return getMapVoteHandler()->handleAllVotes( m_peers_votes, getRemainingVotingTime(), getMaxVotingTime(), @@ -3422,20 +3410,20 @@ void ServerLobby::getHitCaptureLimit() if (RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_CAPTURE_THE_FLAG) { - if (ServerConfig::m_capture_limit > 0) - hit_capture_limit = ServerConfig::m_capture_limit; - if (ServerConfig::m_time_limit_ctf > 0) - time_limit = (float)ServerConfig::m_time_limit_ctf; + if (getSettings()->getCaptureLimit() > 0) + hit_capture_limit = getSettings()->getCaptureLimit(); + if (getSettings()->getTimeLimitCtf() > 0) + time_limit = (float)getSettings()->getTimeLimitCtf(); } else { - if (ServerConfig::m_hit_limit > 0) - hit_capture_limit = ServerConfig::m_hit_limit; - if (ServerConfig::m_time_limit_ffa > 0.0f) - time_limit = (float)ServerConfig::m_time_limit_ffa; + if (getSettings()->getHitLimit() > 0) + hit_capture_limit = getSettings()->getHitLimit(); + if (getSettings()->getTimeLimitFfa() > 0.0f) + time_limit = (float)getSettings()->getTimeLimitFfa(); } - m_lobby_settings->setBattleHitCaptureLimit(hit_capture_limit); - m_lobby_settings->setBattleTimeLimit(time_limit); + getSettings()->setBattleHitCaptureLimit(hit_capture_limit); + getSettings()->setBattleTimeLimit(time_limit); } // getHitCaptureLimit // ---------------------------------------------------------------------------- @@ -3616,7 +3604,7 @@ void ServerLobby::submitRankingsToAddons() void ServerLobby::configPeersStartTime() { uint32_t max_ping = 0; - const unsigned max_ping_from_peers = ServerConfig::m_max_ping; + const unsigned max_ping_from_peers = getSettings()->getMaxPing(); bool peer_exceeded_max_ping = false; for (auto p : m_peers_ready) { @@ -3634,12 +3622,12 @@ void ServerLobby::configPeersStartTime() } max_ping = std::max(peer->getAveragePing(), max_ping); } - if ((ServerConfig::m_high_ping_workaround && peer_exceeded_max_ping) || - (ServerConfig::m_live_players && RaceManager::get()->supportsLiveJoining())) + if ((getSettings()->getHighPingWorkaround() && peer_exceeded_max_ping) || + (getSettings()->isLivePlayers() && RaceManager::get()->supportsLiveJoining())) { Log::info("ServerLobby", "Max ping to ServerConfig::m_max_ping for " "live joining or high ping workaround."); - max_ping = ServerConfig::m_max_ping; + max_ping = getSettings()->getMaxPing(); } // Start up time will be after 2500ms, so even if this packet is sent late // (due to packet loss), the start time will still ahead of current time @@ -3654,7 +3642,7 @@ void ServerLobby::configPeersStartTime() m_client_starting_time = start_time; sendMessageToPeers(ns, PRM_RELIABLE); - const unsigned jitter_tolerance = ServerConfig::m_jitter_tolerance; + const unsigned jitter_tolerance = getSettings()->getJitterTolerance(); Log::info("ServerLobby", "Max ping from peers: %d, jitter tolerance: %d", max_ping, jitter_tolerance); // Delay server for max ping / 2 from peers and jitter tolerance. @@ -3702,7 +3690,7 @@ void ServerLobby::addWaitingPlayersToGame() if (m_peers_ready.find(peer) == m_peers_ready.end()) { m_peers_ready[peer] = false; - if (!ServerConfig::m_sql_management) + if (!getSettings()->getSqlManagement()) { Log::info("ServerLobby", "New player %s with online id %u from %s with %s.", @@ -3713,7 +3701,7 @@ void ServerLobby::addWaitingPlayersToGame() } } uint32_t online_id = profile->getOnlineId(); - if (ServerConfig::m_ranked && !m_ranking->has(online_id)) + if (getSettings()->getRanked() && !m_ranking->has(online_id)) { getRankingForPlayer(peer->getPlayerProfiles()[0]); } @@ -3900,7 +3888,7 @@ void ServerLobby::handleServerConfiguration(std::shared_ptr peer, m_state.load()); return; } - if (!ServerConfig::m_server_configurable) + if (!getSettings()->getServerConfigurable()) { Log::warn("ServerLobby", "server-configurable is not enabled."); return; @@ -3908,8 +3896,8 @@ void ServerLobby::handleServerConfiguration(std::shared_ptr peer, bool teams_before = RaceManager::get()->teamEnabled(); unsigned total_players = 0; STKHost::get()->updatePlayers(NULL, NULL, &total_players); - bool bad_mode = !m_lobby_settings->isModeAvailable(mode); - bool bad_difficulty = !m_lobby_settings->isDifficultyAvailable(difficulty); + bool bad_mode = !getSettings()->isModeAvailable(mode); + bool bad_difficulty = !getSettings()->isDifficultyAvailable(difficulty); if (bad_mode || bad_difficulty) { // It remains just in case, but kimden thinks that @@ -3969,7 +3957,7 @@ void ServerLobby::handleServerConfiguration(std::shared_ptr peer, auto assets = peer->getClientAssets(); if (!peer->isValidated() || assets.second.empty()) // this check will fail hard when I introduce vavriable limits continue; - if (m_asset_manager->checkIfNoCommonMaps(assets)) + if (getAssetManager()->checkIfNoCommonMaps(assets)) { NetworkString *message = getNetworkString(2); message->setSynchronous(true); @@ -3989,8 +3977,8 @@ void ServerLobby::handleServerConfiguration(std::shared_ptr peer, if (teams_after) { int final_number, players_number; - m_lobby_settings->clearTeams(); - m_command_manager->assignRandomTeams(2, &final_number, &players_number); + getSettings()->clearTeams(); + getCommandManager()->assignRandomTeams(2, &final_number, &players_number); } else { @@ -4016,11 +4004,11 @@ void ServerLobby::handleServerConfiguration(std::shared_ptr peer, delete server_info; updatePlayerList(); - if (m_kart_elimination->isEnabled() && + if (getKartElimination()->isEnabled() && RaceManager::get()->getMinorMode() != RaceManager::MINOR_MODE_NORMAL_RACE && RaceManager::get()->getMinorMode() != RaceManager::MINOR_MODE_TIME_TRIAL) { - m_kart_elimination->disable(); + getKartElimination()->disable(); NetworkString* chat = getNetworkString(); chat->addUInt8(LE_CHAT); chat->setSynchronous(true); @@ -4051,9 +4039,9 @@ void ServerLobby::handleServerConfiguration(Event* event) event->getPeer()->getHostId()); return; } - int new_difficulty = ServerConfig::m_server_difficulty; - int new_game_mode = ServerConfig::m_server_mode; - bool new_soccer_goal_target = ServerConfig::m_soccer_goal_target; + int new_difficulty = getSettings()->getServerDifficulty(); + int new_game_mode = getSettings()->getServerMode(); + bool new_soccer_goal_target = getSettings()->getSoccerGoalTarget(); if (event != NULL) { NetworkString& data = event->data(); @@ -4152,7 +4140,7 @@ void ServerLobby::handlePlayerDisconnection() const World::getWorld()->eliminateKart(i, false/*notify_of_elimination*/); - if (ServerConfig::m_ranked) + if (getSettings()->getRanked()) { // Handle disconnection earlier to prevent cheating by joining // another ranked server @@ -4174,7 +4162,7 @@ void ServerLobby::handlePlayerDisconnection() const } // If live players is enabled, don't end the game if unfair team - if (!ServerConfig::m_live_players && + if (!getSettings()->isLivePlayers() && total != 1 && World::getWorld()->hasTeam() && (red_count == 0 || blue_count == 0)) World::getWorld()->setUnfairTeam(true); @@ -4187,13 +4175,13 @@ void ServerLobby::handlePlayerDisconnection() const void ServerLobby::addLiveJoinPlaceholder( std::vector >& players) const { - if (!ServerConfig::m_live_players || !RaceManager::get()->supportsLiveJoining()) + if (!getSettings()->isLivePlayers() || !RaceManager::get()->supportsLiveJoining()) return; if (RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_FREE_FOR_ALL) { Track* t = TrackManager::get()->getTrack(m_game_setup->getCurrentTrack()); assert(t); - int max_players = std::min((int)ServerConfig::m_server_max_players, + int max_players = std::min((int)getSettings()->getServerMaxPlayers(), (int)t->getMaxArenaPlayers()); int add_size = max_players - (int)players.size(); assert(add_size >= 0); @@ -4241,19 +4229,19 @@ void ServerLobby::setPlayerKarts(const NetworkString& ns, std::shared_ptrgetPlayerProfiles()[i]->getName()); - if (m_kart_elimination->isEliminated(username)) + if (getKartElimination()->isEliminated(username)) { - peer->getPlayerProfiles()[i]->setKartName(m_kart_elimination->getKart()); + peer->getPlayerProfiles()[i]->setKartName(getKartElimination()->getKart()); continue; } std::string current_kart = kart; if (kart.find("randomkart") != std::string::npos || (kart.find("addon_") == std::string::npos && - !m_asset_manager->isKartAvailable(kart))) + !getAssetManager()->isKartAvailable(kart))) { current_kart = ""; } - if (m_lobby_queues->areKartFiltersIgnoringKarts()) + if (getQueues()->areKartFiltersIgnoringKarts()) current_kart = ""; std::string name = StringUtils::wideToUtf8(peer->getPlayerProfiles()[i]->getName()); peer->getPlayerProfiles()[i]->setKartName(getKartForBadKartChoice(peer, name, current_kart)); @@ -4461,7 +4449,7 @@ std::set>& ServerLobby::getSpectatorsByLimit(bool updat auto peers = STKHost::get()->getPeers(); - unsigned player_limit = ServerConfig::m_server_max_players; + unsigned player_limit = getSettings()->getServerMaxPlayers(); // If the server has an in-game player limit lower than the lobby limit, apply it, // A value of 0 for this parameter means no limit. unsigned current_max_players_in_game = m_current_max_players_in_game.load(); @@ -4603,7 +4591,7 @@ void ServerLobby::updateGnuElimination() else order[username] = RaceManager::get()->getKartRaceTime(i); } - std::string msg = m_kart_elimination->update(order); + std::string msg = getKartElimination()->update(order); if (!msg.empty()) sendStringToAllPeers(msg); } // updateGnuElimination @@ -4635,8 +4623,8 @@ void ServerLobby::storeResults() if (rm->getMinorMode() == RaceManager::MINOR_MODE_CAPTURE_THE_FLAG) { m_game_info->m_value_limit = rm->getHitCaptureLimit(); - m_game_info->m_flag_return_timeout = ServerConfig::m_flag_return_timeout; - m_game_info->m_flag_deactivated_time = ServerConfig::m_flag_deactivated_time; + m_game_info->m_flag_return_timeout = getSettings()->getFlagReturnTimeout(); + m_game_info->m_flag_deactivated_time = getSettings()->getFlagDeactivatedTime(); } else if (rm->getMinorMode() == RaceManager::MINOR_MODE_FREE_FOR_ALL) { @@ -4853,10 +4841,10 @@ void ServerLobby::storeResults() //----------------------------------------------------------------------------- void ServerLobby::resetToDefaultSettings() { - if (ServerConfig::m_server_configurable && !m_lobby_settings->isPreservingMode()) + if (getSettings()->getServerConfigurable() && !getSettings()->isPreservingMode()) handleServerConfiguration(NULL); - m_lobby_settings->onResetToDefaultSettings(); + getSettings()->onResetToDefaultSettings(); } // resetToDefaultSettings //----------------------------------------------------------------------------- void ServerLobby::writeOwnReport(std::shared_ptr reporter, std::shared_ptr reporting, const std::string& info) @@ -4957,7 +4945,7 @@ bool ServerLobby::canRace(std::shared_ptr peer) } std::string username = StringUtils::wideToUtf8( peer->getPlayerProfiles()[0]->getName()); - if (m_tournament && !m_tournament->canPlay(username)) + if (getTournament() && !getTournament()->canPlay(username)) { m_why_peer_cannot_play[peer] = HR_NOT_A_TOURNAMENT_PLAYER; return false; @@ -4968,28 +4956,28 @@ bool ServerLobby::canRace(std::shared_ptr peer) return false; } - if (!m_lobby_settings->getMissingAssets(peer).empty()) + if (!getSettings()->getMissingAssets(peer).empty()) { m_why_peer_cannot_play[peer] = HR_LACKING_REQUIRED_MAPS; return false; } - if (peer->addon_karts_count < ServerConfig::m_addon_karts_play_threshold) + if (peer->addon_karts_count < getSettings()->getAddonKartsPlayThreshold()) { m_why_peer_cannot_play[peer] = HR_ADDON_KARTS_PLAY_THRESHOLD; return false; } - if (peer->addon_tracks_count < ServerConfig::m_addon_tracks_play_threshold) + if (peer->addon_tracks_count < getSettings()->getAddonTracksPlayThreshold()) { m_why_peer_cannot_play[peer] = HR_ADDON_TRACKS_PLAY_THRESHOLD; return false; } - if (peer->addon_arenas_count < ServerConfig::m_addon_arenas_play_threshold) + if (peer->addon_arenas_count < getSettings()->getAddonArenasPlayThreshold()) { m_why_peer_cannot_play[peer] = HR_ADDON_ARENAS_PLAY_THRESHOLD; return false; } - if (peer->addon_soccers_count < ServerConfig::m_addon_soccers_play_threshold) + if (peer->addon_soccers_count < getSettings()->getAddonSoccersPlayThreshold()) { m_why_peer_cannot_play[peer] = HR_ADDON_FIELDS_PLAY_THRESHOLD; return false; @@ -4998,15 +4986,15 @@ bool ServerLobby::canRace(std::shared_ptr peer) std::set maps = peer->getClientAssets().second; std::set karts = peer->getClientAssets().first; - float karts_fraction = m_asset_manager->officialKartsFraction(karts); - float maps_fraction = m_asset_manager->officialMapsFraction(maps); + float karts_fraction = getAssetManager()->officialKartsFraction(karts); + float maps_fraction = getAssetManager()->officialMapsFraction(maps); - if (karts_fraction < ServerConfig::m_official_karts_play_threshold) + if (karts_fraction < getSettings()->getOfficialKartsPlayThreshold()) { m_why_peer_cannot_play[peer] = HR_OFFICIAL_KARTS_PLAY_THRESHOLD; return false; } - if (maps_fraction < ServerConfig::m_official_tracks_play_threshold) + if (maps_fraction < getSettings()->getOfficialTracksPlayThreshold()) { m_why_peer_cannot_play[peer] = HR_OFFICIAL_TRACKS_PLAY_THRESHOLD; return false; @@ -5035,10 +5023,10 @@ bool ServerLobby::canVote(std::shared_ptr peer) const if (!peer || peer->getPlayerProfiles().empty()) return false; - if (!m_tournament) + if (!getTournament()) return true; - return m_tournament->canVote(peer); + return getTournament()->canVote(peer); } // canVote //----------------------------------------------------------------------------- bool ServerLobby::hasHostRights(std::shared_ptr peer) const @@ -5049,8 +5037,8 @@ bool ServerLobby::hasHostRights(std::shared_ptr peer) const return true; if (peer->isAngryHost()) return true; - if (m_tournament) - return m_tournament->hasHostRights(peer); + if (isTournament()) + return getTournament()->hasHostRights(peer); return false; } // hasHostRights @@ -5074,14 +5062,14 @@ int ServerLobby::getPermissions(std::shared_ptr peer) const if (peer == m_server_owner.lock()) { mask |= CommandPermissions::PE_CROWNED; - if (ServerConfig::m_only_host_riding) + if (getSettings()->getOnlyHostRiding()) mask |= CommandPermissions::PE_SINGLE; } if (peer->isAngryHost()) { mask |= CommandPermissions::PE_HAMMER; } - else if (m_tournament && m_tournament->hasHammerRights(peer)) + else if (getTournament() && getTournament()->hasHammerRights(peer)) { mask |= CommandPermissions::PE_HAMMER; } @@ -5181,16 +5169,6 @@ void ServerLobby::changeLimitForTournament(bool goal_target) } // changeLimitForTournament //----------------------------------------------------------------------------- -std::shared_ptr ServerLobby::getCommandManager() -{ - if (!m_command_manager->isInitialized()) - { - m_command_manager = std::make_shared(this); - } - return m_command_manager; -} // getCommandManager -//----------------------------------------------------------------------------- - #ifdef ENABLE_SQLITE3 std::string ServerLobby::getRecord(std::string& track, std::string& mode, std::string& direction, int laps) @@ -5257,7 +5235,7 @@ void ServerLobby::setTemporaryTeamInLobby(const std::string& username, int team) // todo This should be moved later to another unit. void ServerLobby::clearTemporaryTeams() { - m_lobby_settings->clearTeams(); + getSettings()->clearTeams(); for (auto& peer : STKHost::get()->getPeers()) { @@ -5272,7 +5250,7 @@ void ServerLobby::clearTemporaryTeams() // todo This should be moved later to another unit. void ServerLobby::shuffleTemporaryTeams(const std::map& permutation) { - m_lobby_settings->applyPermutationToTeams(permutation); + getSettings()->applyPermutationToTeams(permutation); for (auto& peer : STKHost::get()->getPeers()) { for (auto &profile: peer->getPlayerProfiles()) @@ -5340,14 +5318,14 @@ void ServerLobby::applyAllFilters(std::set& maps, bool use_history) map_context.wildcards = m_map_history; map_context.applied_at_selection_start = true; map_context.elements = maps; - m_lobby_settings->applyGlobalFilter(map_context); + getSettings()->applyGlobalFilter(map_context); if (use_history) { - if (m_tournament) - m_tournament->applyFiltersForThisGame(map_context); + if (isTournament()) + getTournament()->applyFiltersForThisGame(map_context); map_context.wildcards = m_map_history; - m_lobby_queues->applyFrontMapFilters(map_context); + getQueues()->applyFrontMapFilters(map_context); } swap(maps, map_context.elements); } // applyAllFilters @@ -5362,19 +5340,19 @@ void ServerLobby::applyAllKartFilters(const std::string& username, std::setapplyGlobalKartsFilter(kart_context); - m_lobby_queues->applyFrontKartFilters(kart_context); + getSettings()->applyGlobalKartsFilter(kart_context); + getQueues()->applyFrontKartFilters(kart_context); swap(karts, kart_context.elements); } // applyAllKartFilters //----------------------------------------------------------------------------- std::string ServerLobby::getKartForBadKartChoice(std::shared_ptr peer, const std::string& username, const std::string& check_choice) const { - std::set karts = (peer->isAIPeer() ? m_asset_manager->getAvailableKarts() : peer->getClientAssets().first); + std::set karts = (peer->isAIPeer() ? getAssetManager()->getAvailableKarts() : peer->getClientAssets().first); applyAllKartFilters(username, karts, true); - if (m_kart_elimination->isEliminated(username) - && karts.count(m_kart_elimination->getKart())) + if (getKartElimination()->isEliminated(username) + && karts.count(getKartElimination()->getKart())) { - return m_kart_elimination->getKart(); + return getKartElimination()->getKart(); } if (!check_choice.empty() && karts.count(check_choice)) // valid choice return check_choice; @@ -5404,7 +5382,7 @@ void ServerLobby::setKartDataProperly(KartData& kart_data, const std::string& ka { const KartProperties* real_addon = kart_properties_manager->getKart(kart_name); - if (ServerConfig::m_real_addon_karts && real_addon) + if (getSettings()->getRealAddonKarts() && real_addon) { kart_data = KartData(real_addon); } @@ -5458,7 +5436,7 @@ void ServerLobby::saveDisconnectingIdInfo(int id) const if (ffa_world) points = ffa_world->getKartScore(id); info.m_result += points; - if (ServerConfig::m_preserve_battle_scores) + if (getSettings()->getPreserveBattleScores()) m_game_info->m_saved_ffa_points[StringUtils::wideToUtf8(rki.getPlayerName())] = points; } info.m_when_left = stk_config->ticks2Time(w->getTicksSinceStart()); @@ -5491,7 +5469,7 @@ void ServerLobby::setTeamInLobby(std::shared_ptr profile, // Used for soccer+CTF, where everything can be defined by KartTeam profile->setTeam(team); profile->setTemporaryTeam(TeamUtils::getIndexFromKartTeam(team)); - m_lobby_settings->setTeamForUsername( + getSettings()->setTeamForUsername( StringUtils::wideToUtf8(profile->getName()), profile->getTemporaryTeam() ); @@ -5508,7 +5486,7 @@ void ServerLobby::setTemporaryTeamInLobby(std::shared_ptr profile->setTeam((KartTeam)(TeamUtils::getKartTeamFromIndex(team))); else profile->setTeam(KART_TEAM_NONE); - m_lobby_settings->setTeamForUsername( + getSettings()->setTeamForUsername( StringUtils::wideToUtf8(profile->getName()), profile->getTemporaryTeam() ); @@ -5564,5 +5542,4 @@ void ServerLobby::setSpectateModeProperly(std::shared_ptr peer, AlwaysS if (mode == ASM_NONE) checkNoTeamSpectator(peer); } // setSpectateModeProperly - //----------------------------------------------------------------------------- diff --git a/src/network/protocols/server_lobby.hpp b/src/network/protocols/server_lobby.hpp index 430bd5abffe..cc697015374 100644 --- a/src/network/protocols/server_lobby.hpp +++ b/src/network/protocols/server_lobby.hpp @@ -24,6 +24,7 @@ #include "network/requests.hpp" // only needed in header as long as KeyData is there #include "utils/cpp2011.hpp" #include "utils/hourglass_reason.hpp" +#include "utils/lobby_context.hpp" #include "utils/team_utils.hpp" #include "utils/time.hpp" #include "utils/track_filter.hpp" @@ -81,7 +82,7 @@ struct GPScore } }; -class ServerLobby : public LobbyProtocol +class ServerLobby : public LobbyProtocol, public LobbyContextUser { public: /* The state for a small finite state machine. */ @@ -190,17 +191,11 @@ class ServerLobby : public LobbyProtocol uint64_t m_last_unsuccess_poll_time, m_server_started_at, m_server_delay; // Other units previously used in ServerLobby + std::shared_ptr m_lobby_context; + std::shared_ptr m_ranking; - std::shared_ptr m_hit_processor; - std::shared_ptr m_asset_manager; - std::shared_ptr m_kart_elimination; - std::shared_ptr m_map_vote_handler; - std::shared_ptr m_tournament; - std::shared_ptr m_lobby_queues; - std::shared_ptr m_lobby_settings; friend CommandManager; - std::shared_ptr m_command_manager; unsigned m_item_seed; @@ -319,7 +314,6 @@ class ServerLobby : public LobbyProtocol bool hasHostRights(std::shared_ptr peer) const; std::string getGrandPrixStandings(bool showIndividual = false, bool showTeam = true) const; void changeLimitForTournament(bool goal_target); - std::shared_ptr getCommandManager(); public: ServerLobby(); @@ -401,17 +395,6 @@ class ServerLobby : public LobbyProtocol void checkNoTeamSpectator(std::shared_ptr peer); void setSpectateModeProperly(std::shared_ptr peer, AlwaysSpectateMode mode); - std::shared_ptr getHitProcessor() const - { return m_hit_processor; } - std::shared_ptr getLobbyAssetManager() const - { return m_asset_manager; } - std::shared_ptr getTournament() const { return m_tournament; } - std::shared_ptr getLobbyQueues() const - { return m_lobby_queues; } - std::shared_ptr getLobbySettings() const - { return m_lobby_settings; } - std::shared_ptr getKartElimination() const - { return m_kart_elimination; } std::shared_ptr getGameInfo() const { return m_game_info; } // Functions that arose from requests separation diff --git a/src/race/race_manager.hpp b/src/race/race_manager.hpp index 9706e563da6..71469551ff2 100644 --- a/src/race/race_manager.hpp +++ b/src/race/race_manager.hpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include "network/remote_kart_info.hpp" @@ -37,6 +38,7 @@ #include "utils/types.hpp" class AbstractKart; +class HitProcessor; class NetworkString; class SavedGrandPrix; class Track; @@ -388,6 +390,8 @@ class RaceManager bool m_benchmarking; bool m_scheduled_benchmark; + std::shared_ptr m_hit_processor; + public: // ---------------------------------------------------------------------------------------- static RaceManager* get(); @@ -969,6 +973,12 @@ class RaceManager void setRandomItemsIndicator(bool value) { m_random_items = value; } // ---------------------------------------------------------------------------------------- bool getRandomItemsIndicator() const { return m_random_items; } + // ---------------------------------------------------------------------------------------- + std::shared_ptr getHitProcessor() const { return m_hit_processor; } + // ---------------------------------------------------------------------------------------- + void setHitProcessor(std::shared_ptr hp) { m_hit_processor = hp; } + // ---------------------------------------------------------------------------------------- + void resetHitProcessor() { m_hit_processor = {}; } }; // RaceManager #endif diff --git a/src/utils/hit_processor.cpp b/src/utils/hit_processor.cpp index b1072e3eb81..5dfe85b2231 100644 --- a/src/utils/hit_processor.cpp +++ b/src/utils/hit_processor.cpp @@ -41,8 +41,7 @@ namespace } // namespace //----------------------------------------------------------------------------- -HitProcessor::HitProcessor(ServerLobby* lobby, std::shared_ptr settings) - : m_lobby(lobby), m_lobby_settings(settings) +void HitProcessor::setupContextUser() { m_troll_active = ServerConfig::m_troll_active; m_show_hits = ServerConfig::m_show_teammate_hits; @@ -97,7 +96,7 @@ void HitProcessor::sendTeammateHitMsg(std::string& s) if (ticks - m_last_hit_msg > stk_config->time2Ticks(1.5f)) { m_last_hit_msg = ticks; - m_lobby->sendStringToAllPeers(s); + getLobby()->sendStringToAllPeers(s); } } // sendTeammateHitMsg //----------------------------------------------------------------------------- @@ -109,7 +108,7 @@ void HitProcessor::handleTeammateHits() // Get team of item owner auto kart_info = RaceManager::get()->getKartInfo(m_current_item_owner_id); const std::string owner_name = StringUtils::wideToUtf8(kart_info.getPlayerName()); - const int owner_team = m_lobby_settings->getTeamForUsername(owner_name); + const int owner_team = getSettings()->getTeamForUsername(owner_name); if (owner_team == TeamUtils::NO_TEAM) return; @@ -144,7 +143,7 @@ void HitProcessor::processHitMessage(const std::string& owner_name, int owner_te { const std::string player_name = StringUtils::wideToUtf8( RaceManager::get()->getKartInfo(m_karts_exploded[i]).getPlayerName()); - const int playerTeam = m_lobby_settings->getTeamForUsername(player_name); + const int playerTeam = getSettings()->getTeamForUsername(player_name); if (owner_team != playerTeam) continue; @@ -171,7 +170,7 @@ void HitProcessor::processTeammateHit(AbstractKart* owner, { const std::string player_name = StringUtils::wideToUtf8( RaceManager::get()->getKartInfo(m_karts_exploded[i]).getPlayerName()); - const int playerTeam = m_lobby_settings->getTeamForUsername(player_name); + const int playerTeam = getSettings()->getTeamForUsername(player_name); if (owner_team != playerTeam) continue; @@ -195,7 +194,7 @@ void HitProcessor::processTeammateHit(AbstractKart* owner, { const std::string player_name = StringUtils::wideToUtf8( RaceManager::get()->getKartInfo(m_karts_hit[i]).getPlayerName()); - const int playerTeam = m_lobby_settings->getTeamForUsername(player_name); + const int playerTeam = getSettings()->getTeamForUsername(player_name); if (owner_team != playerTeam) continue; @@ -225,13 +224,13 @@ void HitProcessor::handleSwatterHit(unsigned int ownerID, unsigned int victimID, { const std::string owner_name = StringUtils::wideToUtf8( RaceManager::get()->getKartInfo(ownerID).getPlayerName()); - const int owner_team = m_lobby_settings->getTeamForUsername(owner_name); + const int owner_team = getSettings()->getTeamForUsername(owner_name); if (owner_team == TeamUtils::NO_TEAM) return; const std::string victim_name = StringUtils::wideToUtf8( RaceManager::get()->getKartInfo(victimID).getPlayerName()); - const int victim_team = m_lobby_settings->getTeamForUsername(victim_name); + const int victim_team = getSettings()->getTeamForUsername(victim_name); if (victim_team != owner_team) return; @@ -269,13 +268,13 @@ void HitProcessor::handleAnvilHit(unsigned int ownerID, unsigned int victimID) { const std::string owner_name = StringUtils::wideToUtf8( RaceManager::get()->getKartInfo(ownerID).getPlayerName()); - const int owner_team = m_lobby_settings->getTeamForUsername(owner_name); + const int owner_team = getSettings()->getTeamForUsername(owner_name); if (owner_team == TeamUtils::NO_TEAM) return; const std::string victim_name = StringUtils::wideToUtf8( RaceManager::get()->getKartInfo(victimID).getPlayerName()); - const int victim_team = m_lobby_settings->getTeamForUsername(victim_name); + const int victim_team = getSettings()->getTeamForUsername(victim_name); if (victim_team != owner_team) return; diff --git a/src/utils/hit_processor.hpp b/src/utils/hit_processor.hpp index 8bcc9f8748a..333aaa7e8aa 100644 --- a/src/utils/hit_processor.hpp +++ b/src/utils/hit_processor.hpp @@ -19,6 +19,7 @@ #ifndef HIT_PROCESSOR_HPP #define HIT_PROCESSOR_HPP +#include "utils/lobby_context.hpp" #include "utils/types.hpp" #include @@ -36,14 +37,14 @@ class ServerLobby; // Note that this class currently (March 2025) processes *team* hits. // It will be modified to process all hits later. -class HitProcessor +class HitProcessor: public LobbyContextComponent { public: - HitProcessor(ServerLobby* lobby, std::shared_ptr settings); + HitProcessor(LobbyContext* context): LobbyContextComponent(context) {} + + void setupContextUser() OVERRIDE; private: - ServerLobby* m_lobby = nullptr; - std::shared_ptr m_lobby_settings; bool m_troll_active; // Whether the anti-troll system is active. diff --git a/src/utils/kart_elimination.cpp b/src/utils/kart_elimination.cpp index b27a57eb46a..0b34e804394 100644 --- a/src/utils/kart_elimination.cpp +++ b/src/utils/kart_elimination.cpp @@ -29,12 +29,12 @@ #include #include -KartElimination::KartElimination() +void KartElimination::setupContextUser() { m_enabled = false; m_remained = 0; m_kart = ""; -} // KartElimination +} // setupContextUser //----------------------------------------------------------------------------- bool KartElimination::isEliminated(std::string username) const diff --git a/src/utils/kart_elimination.hpp b/src/utils/kart_elimination.hpp index ba2112c3bc7..82f91d1aace 100644 --- a/src/utils/kart_elimination.hpp +++ b/src/utils/kart_elimination.hpp @@ -19,6 +19,7 @@ #ifndef HEADER_KART_ELIMINATION_HPP #define HEADER_KART_ELIMINATION_HPP +#include "utils/lobby_context.hpp" #include "utils/string_utils.hpp" #include "utils/types.hpp" @@ -30,7 +31,8 @@ // A class that contains Gnu Elimination data -class KartElimination { +class KartElimination: public LobbyContextComponent +{ private: bool m_enabled; int m_remained; @@ -39,7 +41,10 @@ class KartElimination { public: static constexpr double INF_TIME = 1e9; - KartElimination(); + + KartElimination(LobbyContext* context): LobbyContextComponent(context) {} + + void setupContextUser() OVERRIDE; bool isEliminated(std::string username) const; std::string getKart() const { return m_kart; } std::set getRemainingParticipants() const; diff --git a/src/utils/lobby_asset_manager.cpp b/src/utils/lobby_asset_manager.cpp index d1c0061a44f..19ec4c20897 100644 --- a/src/utils/lobby_asset_manager.cpp +++ b/src/utils/lobby_asset_manager.cpp @@ -28,13 +28,14 @@ #include "tracks/track.hpp" #include "tracks/track_manager.hpp" #include "utils/random_generator.hpp" +#include "utils/lobby_settings.hpp" #include "utils/string_utils.hpp" -LobbyAssetManager::LobbyAssetManager(ServerLobby* lobby): m_lobby(lobby) +void LobbyAssetManager::setupContextUser() { init(); updateAddons(); -} // LobbyAssetManager +} // setupContextUser //----------------------------------------------------------------------------- void LobbyAssetManager::init() @@ -117,7 +118,7 @@ void LobbyAssetManager::updateAddons() all_k.resize(65535 - (unsigned)oks.size()); for (const std::string& k : oks) all_k.push_back(k); - if (ServerConfig::m_live_players) + if (getSettings()->isLivePlayers()) m_available_kts.first = m_official_kts.first; else m_available_kts.first = { all_k.begin(), all_k.end() }; @@ -211,7 +212,7 @@ void LobbyAssetManager::onServerSetup() auto all_k = kart_properties_manager->getAllAvailableKarts(); if (all_k.size() >= 65536) all_k.resize(65535); - if (ServerConfig::m_live_players) + if (getSettings()->isLivePlayers()) m_available_kts.first = m_official_kts.first; else m_available_kts.first = { all_k.begin(), all_k.end() }; @@ -244,7 +245,7 @@ void LobbyAssetManager::eraseAssetsWithPeers( bool LobbyAssetManager::tryApplyingMapFilters() { std::set available_tracks_fallback = m_available_kts.second; - m_lobby->applyAllFilters(m_available_kts.second, true); + getLobby()->applyAllFilters(m_available_kts.second, true); /* auto iter = m_available_kts.second.begin(); while (iter != m_available_kts.second.end()) @@ -539,7 +540,7 @@ std::string LobbyAssetManager::getRandomMap() const for (const std::string& s: m_entering_kts.second) { items.insert(s); } - m_lobby->applyAllFilters(items, false); + getLobby()->applyAllFilters(items, false); if (items.empty()) return ""; RandomGenerator rg; @@ -557,7 +558,7 @@ std::string LobbyAssetManager::getRandomAddonMap() const if (t->isAddon()) items.insert(s); } - m_lobby->applyAllFilters(items, false); + getLobby()->applyAllFilters(items, false); if (items.empty()) return ""; RandomGenerator rg; diff --git a/src/utils/lobby_asset_manager.hpp b/src/utils/lobby_asset_manager.hpp index 71c2b0862bf..8839a411011 100644 --- a/src/utils/lobby_asset_manager.hpp +++ b/src/utils/lobby_asset_manager.hpp @@ -21,6 +21,7 @@ #include "network/stk_peer.hpp" #include "race/race_manager.hpp" +#include "utils/lobby_context.hpp" #include "utils/types.hpp" #include @@ -32,10 +33,12 @@ class NetworkString; class ServerLobby; class STKPeer; -class LobbyAssetManager +class LobbyAssetManager: public LobbyContextComponent { public: - LobbyAssetManager(ServerLobby* lobby); + LobbyAssetManager(LobbyContext* context): LobbyContextComponent(context) {} + + void setupContextUser() OVERRIDE; void init(); void updateAddons(); @@ -85,9 +88,6 @@ class LobbyAssetManager bool hasAddonSoccer(const std::string& id) const { return m_addon_soccers.find(id) != m_addon_soccers.end(); } -private: - ServerLobby* m_lobby; - public: /** Official karts and maps available in server. */ std::pair, std::set > m_official_kts; diff --git a/src/utils/lobby_context.cpp b/src/utils/lobby_context.cpp new file mode 100644 index 00000000000..1a826e87f47 --- /dev/null +++ b/src/utils/lobby_context.cpp @@ -0,0 +1,61 @@ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2025 kimden +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "utils/lobby_context.hpp" + +#include "network/protocols/command_manager.hpp" +#include "utils/hit_processor.hpp" +#include "utils/kart_elimination.hpp" +#include "utils/lobby_asset_manager.hpp" +#include "utils/lobby_queues.hpp" +#include "utils/lobby_settings.hpp" +#include "utils/map_vote_handler.hpp" +#include "utils/tournament.hpp" + +LobbyContext::LobbyContext(ServerLobby* lobby, bool make_tournament) + : m_lobby(lobby) +{ + // Nothing for ServerLobby, as we create LC inside SL + m_asset_manager = std::make_shared(this); + m_hit_processor = std::make_shared(this); + m_kart_elimination = std::make_shared(this); + m_lobby_queues = std::make_shared(this); + m_lobby_settings = std::make_shared(this); + m_map_vote_handler = std::make_shared(this); + m_command_manager = std::make_shared(this); + + if (make_tournament) + m_tournament = std::make_shared(this); +} // LobbyContext +//----------------------------------------------------------------------------- + +void LobbyContext::setup() +{ + // Nothing for ServerLobby + m_asset_manager->setupContextUser(); + m_hit_processor->setupContextUser(); + m_kart_elimination->setupContextUser(); + m_lobby_queues->setupContextUser(); + m_lobby_settings->setupContextUser(); + m_map_vote_handler->setupContextUser(); + m_command_manager->setupContextUser(); + + if (m_tournament) + m_tournament->setupContextUser(); +} // setup +//----------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/utils/lobby_context.hpp b/src/utils/lobby_context.hpp new file mode 100644 index 00000000000..f83db6888fe --- /dev/null +++ b/src/utils/lobby_context.hpp @@ -0,0 +1,97 @@ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2025 kimden +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef LOBBY_CONTEXT_HPP +#define LOBBY_CONTEXT_HPP + +#include "utils/cpp2011.hpp" + +#include + +class CommandManager; +class HitProcessor; +class KartElimination; +class LobbyAssetManager; +class LobbyQueues; +class LobbySettings; +class MapVoteHandler; +class ServerLobby; +class Tournament; + +class LobbyContext +{ +private: + ServerLobby* m_lobby; + std::shared_ptr m_hit_processor; + std::shared_ptr m_asset_manager; + std::shared_ptr m_tournament; + std::shared_ptr m_lobby_queues; + std::shared_ptr m_lobby_settings; + std::shared_ptr m_kart_elimination; + std::shared_ptr m_map_vote_handler; + std::shared_ptr m_command_manager; + +public: + + LobbyContext(ServerLobby* lobby, bool make_tournament); + + void setup(); + + ServerLobby* getLobby() const { return m_lobby; } + std::shared_ptr getHitProcessor() const { return m_hit_processor; } + std::shared_ptr getAssetManager() const { return m_asset_manager; } + bool isTournament() const { return m_tournament.get() != nullptr; } + std::shared_ptr getTournament() const { return m_tournament; } + std::shared_ptr getQueues() const { return m_lobby_queues; } + std::shared_ptr getSettings() const { return m_lobby_settings; } + std::shared_ptr getKartElimination() const { return m_kart_elimination; } + std::shared_ptr getMapVoteHandler() const { return m_map_vote_handler; } + std::shared_ptr getCommandManager() const { return m_command_manager; } +}; + +class LobbyContextUser +{ +protected: + LobbyContext* m_context; + ServerLobby* getLobby() const { return m_context->getLobby(); } + std::shared_ptr getHitProcessor() const { return m_context->getHitProcessor(); } + std::shared_ptr getAssetManager() const { return m_context->getAssetManager(); } + bool isTournament() const { return m_context->isTournament(); } + std::shared_ptr getTournament() const { return m_context->getTournament(); } + std::shared_ptr getQueues() const { return m_context->getQueues(); } + std::shared_ptr getSettings() const { return m_context->getSettings(); } + std::shared_ptr getKartElimination() const { return m_context->getKartElimination(); } + std::shared_ptr getMapVoteHandler() const { return m_context->getMapVoteHandler(); } + std::shared_ptr getCommandManager() const { return m_context->getCommandManager(); } + +public: + void setContext(LobbyContext* context) { m_context = context; } +}; + +class LobbyContextComponent: public LobbyContextUser +{ +public: + + LobbyContextComponent(LobbyContext* context) + { + m_context = context; + } + virtual void setupContextUser() = 0; +}; + +#endif // LOBBY_CONTEXT_HPP diff --git a/src/utils/lobby_queues.cpp b/src/utils/lobby_queues.cpp index 82a5716fe37..e46314de2b1 100644 --- a/src/utils/lobby_queues.cpp +++ b/src/utils/lobby_queues.cpp @@ -18,14 +18,13 @@ #include "utils/lobby_queues.hpp" -#include "network/protocols/server_lobby.hpp" #include "network/server_config.hpp" #include "utils/string_utils.hpp" -LobbyQueues::LobbyQueues() +void LobbyQueues::setupContextUser() { loadTracksQueueFromConfig(); -} // LobbyQueues +} // setupContextUser //----------------------------------------------------------------------------- void LobbyQueues::loadTracksQueueFromConfig() diff --git a/src/utils/lobby_queues.hpp b/src/utils/lobby_queues.hpp index f66c2b088b9..7b88d2ba05f 100644 --- a/src/utils/lobby_queues.hpp +++ b/src/utils/lobby_queues.hpp @@ -21,14 +21,17 @@ #include "irrString.h" #include "utils/track_filter.hpp" +#include "utils/lobby_context.hpp" #include #include -class LobbyQueues +class LobbyQueues: public LobbyContextComponent { public: - LobbyQueues(); + LobbyQueues(LobbyContext* context): LobbyContextComponent(context) {} + + void setupContextUser() OVERRIDE; void loadTracksQueueFromConfig(); diff --git a/src/utils/lobby_settings.cpp b/src/utils/lobby_settings.cpp index 488bfa4c40e..10902a51a82 100644 --- a/src/utils/lobby_settings.cpp +++ b/src/utils/lobby_settings.cpp @@ -22,10 +22,13 @@ #include "modes/world.hpp" #include "network/game_setup.hpp" #include "network/game_setup.hpp" +#include "network/network_config.hpp" #include "network/network_string.hpp" #include "network/peer_vote.hpp" #include "network/server_config.hpp" #include "network/stk_peer.hpp" +#include "network/protocols/server_lobby.hpp" +#include "network/game_setup.hpp" #include "tracks/track.hpp" #include "tracks/track_manager.hpp" #include "utils/game_info.hpp" @@ -36,17 +39,10 @@ #include "utils/string_utils.hpp" #include "utils/tournament.hpp" -LobbySettings::LobbySettings(GameSetup* game_setup, - std::shared_ptr queues, - std::shared_ptr elim, - std::shared_ptr asset_manager, - std::shared_ptr tournament) - : m_game_setup(game_setup) - , m_lobby_queues(queues) - , m_kart_elimination(elim) - , m_asset_manager(asset_manager) - , m_tournament(tournament) +void LobbySettings::setupContextUser() { + m_game_setup = getLobby()->getGameSetup(); + m_motd = StringUtils::wideToUtf8( m_game_setup->readOrLoadFromFile( (std::string) ServerConfig::m_motd @@ -76,19 +72,68 @@ LobbySettings::LobbySettings(GameSetup* game_setup, loadWhiteList(); loadPreservedSettings(); - // The following was called in SL::setup, I doubt it's any different - // but just in case - - m_battle_hit_capture_limit = 0; - m_battle_time_limit = 0.0f; - m_winner_peer_id = 0; -} // LobbySettings + m_live_players = ServerConfig::m_live_players; + + m_addon_arenas_play_threshold = ServerConfig::m_addon_arenas_play_threshold; + m_addon_karts_play_threshold = ServerConfig::m_addon_karts_play_threshold; + m_addon_soccers_play_threshold = ServerConfig::m_addon_soccers_play_threshold; + m_addon_tracks_play_threshold = ServerConfig::m_addon_tracks_play_threshold; + m_ai_anywhere = ServerConfig::m_ai_anywhere; + m_ai_handling = ServerConfig::m_ai_handling; + m_capture_limit = ServerConfig::m_capture_limit; + m_chat = ServerConfig::m_chat; + m_chat_consecutive_interval = ServerConfig::m_chat_consecutive_interval; + m_expose_mobile = ServerConfig::m_expose_mobile; + m_firewalled_server = ServerConfig::m_firewalled_server; + m_flag_deactivated_time = ServerConfig::m_flag_deactivated_time; + m_flag_return_timeout = ServerConfig::m_flag_return_timeout; + m_free_teams = ServerConfig::m_free_teams; + m_high_ping_workaround = ServerConfig::m_high_ping_workaround; + m_hit_limit = ServerConfig::m_hit_limit; + m_incompatible_advice = ServerConfig::m_incompatible_advice; + m_jitter_tolerance = ServerConfig::m_jitter_tolerance; + m_kick_idle_lobby_player_seconds = ServerConfig::m_kick_idle_lobby_player_seconds; + m_kick_idle_player_seconds = ServerConfig::m_kick_idle_player_seconds; + m_kicks_allowed = ServerConfig::m_kicks_allowed; + m_max_ping = ServerConfig::m_max_ping; + m_min_start_game_players = ServerConfig::m_min_start_game_players; + m_official_karts_play_threshold = ServerConfig::m_official_karts_play_threshold; + m_official_tracks_play_threshold = ServerConfig::m_official_tracks_play_threshold; + m_only_host_riding = ServerConfig::m_only_host_riding; + m_owner_less = ServerConfig::m_owner_less; + m_preserve_battle_scores = ServerConfig::m_preserve_battle_scores; + m_private_server_password = ServerConfig::m_private_server_password; + m_ranked = ServerConfig::m_ranked; + m_real_addon_karts = ServerConfig::m_real_addon_karts; + m_record_replays = ServerConfig::m_record_replays; + m_server_configurable = ServerConfig::m_server_configurable; + m_server_difficulty = ServerConfig::m_server_difficulty; + m_server_max_players = ServerConfig::m_server_max_players; + m_server_mode = ServerConfig::m_server_mode; + m_sleeping_server = ServerConfig::m_sleeping_server; + m_soccer_goal_target = ServerConfig::m_soccer_goal_target; + m_sql_management = ServerConfig::m_sql_management; + m_start_game_counter = ServerConfig::m_start_game_counter; + m_state_frequency = ServerConfig::m_state_frequency; + m_store_results = ServerConfig::m_store_results; + m_strict_players = ServerConfig::m_strict_players; + m_team_choosing = ServerConfig::m_team_choosing; + m_time_limit_ctf = ServerConfig::m_time_limit_ctf; + m_time_limit_ffa = ServerConfig::m_time_limit_ffa; + m_track_kicks = ServerConfig::m_track_kicks; + m_track_voting = ServerConfig::m_track_voting; + m_troll_warn_msg = ServerConfig::m_troll_warn_msg; + m_validating_player = ServerConfig::m_validating_player; + m_voting_timeout = ServerConfig::m_voting_timeout; + m_commands_file = ServerConfig::m_commands_file; +} // setupContextUser //----------------------------------------------------------------------------- LobbySettings::~LobbySettings() { delete m_default_vote; -} +} // ~LobbySettings +//----------------------------------------------------------------------------- void LobbySettings::initCategories() { @@ -177,7 +222,7 @@ void LobbySettings::initAvailableTracks() { m_global_filter = TrackFilter(ServerConfig::m_only_played_tracks_string); m_global_karts_filter = KartFilter(ServerConfig::m_only_played_karts_string); - m_asset_manager->setMustHaveMaps(ServerConfig::m_must_have_tracks_string); + getAssetManager()->setMustHaveMaps(ServerConfig::m_must_have_tracks_string); m_play_requirement_tracks = StringUtils::split( ServerConfig::m_play_requirement_tracks_string, ' ', false); } // initAvailableTracks @@ -555,10 +600,10 @@ void LobbySettings::updateWorldSettings(std::shared_ptr game_info) void LobbySettings::onResetToDefaultSettings() { - m_lobby_queues->resetToDefaultSettings(m_preserve); + getQueues()->resetToDefaultSettings(m_preserve); if (!m_preserve.count("elim")) - m_kart_elimination->disable(); + getKartElimination()->disable(); if (!m_preserve.count("laps")) { @@ -682,7 +727,7 @@ void LobbySettings::clearAllExpiredWeakPtrs() void LobbySettings::initializeDefaultVote() { - m_default_vote->m_track_name = m_asset_manager->getRandomAvailableMap(); + m_default_vote->m_track_name = getAssetManager()->getRandomAvailableMap(); RandomGenerator rg; switch (RaceManager::get()->getMinorMode()) { @@ -721,9 +766,9 @@ void LobbySettings::initializeDefaultVote() } case RaceManager::MINOR_MODE_SOCCER: { - if (m_tournament) + if (isTournament()) { - m_tournament->applyRestrictionsOnDefaultVote(m_default_vote); + getTournament()->applyRestrictionsOnDefaultVote(m_default_vote); } else { @@ -886,3 +931,13 @@ std::string LobbySettings::getAvailableTeams() const return m_available_teams; } // getAvailableTeams //----------------------------------------------------------------------------- + +void LobbySettings::onServerSetup() +{ + m_battle_hit_capture_limit = 0; + m_battle_time_limit = 0.0f; + m_winner_peer_id = 0; + + NetworkConfig::get()->setTuxHitboxAddon(m_live_players); +} // onServerSetup +//----------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/utils/lobby_settings.hpp b/src/utils/lobby_settings.hpp index 1ad4ce3c2e3..8e5986e10fa 100644 --- a/src/utils/lobby_settings.hpp +++ b/src/utils/lobby_settings.hpp @@ -20,6 +20,7 @@ #define LOBBY_SETTINGS_HPP #include "irrString.h" +#include "utils/lobby_context.hpp" #include "utils/team_utils.hpp" #include "utils/track_filter.hpp" @@ -39,14 +40,12 @@ struct GameInfo; /** @brief A class that manipulates server settings, such as resetting, * scoring, goal policies, etc. Might be split into a few parts later, * or even merged back into ServerLobby if proved useless. */ -class LobbySettings +class LobbySettings: public LobbyContextComponent { public: - LobbySettings(GameSetup* game_setup, - std::shared_ptr queues, - std::shared_ptr elim, - std::shared_ptr asset_manager, - std::shared_ptr tournament); + LobbySettings(LobbyContext* context): LobbyContextComponent(context) {} + + void setupContextUser() OVERRIDE; ~LobbySettings(); void initCategories(); @@ -145,17 +144,66 @@ class LobbySettings bool isInHammerWhitelist(const std::string& str) const { return m_hammer_whitelist.find(str) != m_hammer_whitelist.end(); } + void onServerSetup(); + + // These were used unchanged from ServerConfig + bool isLivePlayers() const { return m_live_players; } + int getAddonArenasPlayThreshold() const { return m_addon_arenas_play_threshold; } + int getAddonKartsPlayThreshold() const { return m_addon_karts_play_threshold; } + int getAddonSoccersPlayThreshold() const { return m_addon_soccers_play_threshold; } + int getAddonTracksPlayThreshold() const { return m_addon_tracks_play_threshold; } + bool canConnectAiAnywhere() const { return m_ai_anywhere; } + bool getAiHandling() const { return m_ai_handling; } + int getCaptureLimit() const { return m_capture_limit; } + bool getChat() const { return m_chat; } + int getChatConsecutiveInterval() const { return m_chat_consecutive_interval; } + bool getExposeMobile() const { return m_expose_mobile; } + bool getFirewalledServer() const { return m_firewalled_server; } + float getFlagDeactivatedTime() const { return m_flag_deactivated_time; } + float getFlagReturnTimeout() const { return m_flag_return_timeout; } + bool getFreeTeams() const { return m_free_teams; } + bool getHighPingWorkaround() const { return m_high_ping_workaround; } + int getHitLimit() const { return m_hit_limit; } + std::string getIncompatibleAdvice() const { return m_incompatible_advice; } + int getJitterTolerance() const { return m_jitter_tolerance; } + int getKickIdleLobbyPlayerSeconds() const { return m_kick_idle_lobby_player_seconds; } + int getKickIdlePlayerSeconds() const { return m_kick_idle_player_seconds; } + bool getKicksAllowed() const { return m_kicks_allowed; } + int getMaxPing() const { return m_max_ping; } + int getMinStartGamePlayers() const { return m_min_start_game_players; } + float getOfficialKartsPlayThreshold() const { return m_official_karts_play_threshold; } + float getOfficialTracksPlayThreshold() const { return m_official_tracks_play_threshold; } + bool getOnlyHostRiding() const { return m_only_host_riding; } + bool getOwnerLess() const { return m_owner_less; } + bool getPreserveBattleScores() const { return m_preserve_battle_scores; } + std::string getPrivateServerPassword() const { return m_private_server_password; } + bool getRanked() const { return m_ranked; } + bool getRealAddonKarts() const { return m_real_addon_karts; } + bool getRecordReplays() const { return m_record_replays; } + bool getServerConfigurable() const { return m_server_configurable; } + int getServerDifficulty() const { return m_server_difficulty; } + int getServerMaxPlayers() const { return m_server_max_players; } + int getServerMode() const { return m_server_mode; } + bool getSleepingServer() const { return m_sleeping_server; } + bool getSoccerGoalTarget() const { return m_soccer_goal_target; } + bool getSqlManagement() const { return m_sql_management; } + float getStartGameCounter() const { return m_start_game_counter; } + int getStateFrequency() const { return m_state_frequency; } + bool getStoreResults() const { return m_store_results; } + bool getStrictPlayers() const { return m_strict_players; } + bool getTeamChoosing() const { return m_team_choosing; } + int getTimeLimitCtf() const { return m_time_limit_ctf; } + int getTimeLimitFfa() const { return m_time_limit_ffa; } + bool getTrackKicks() const { return m_track_kicks; } + bool getTrackVoting() const { return m_track_voting; } + std::string getTrollWarnMsg() const { return m_troll_warn_msg; } + bool getValidatingPlayer() const { return m_validating_player; } + float getVotingTimeout() const { return m_voting_timeout; } + std::string getCommandsFile() const { return m_commands_file; } + private: GameSetup* m_game_setup; - std::shared_ptr m_lobby_queues; - - std::shared_ptr m_kart_elimination; - - std::shared_ptr m_asset_manager; - - std::shared_ptr m_tournament; - // These are fine here ======================================================== int m_battle_hit_capture_limit; @@ -202,6 +250,62 @@ class LobbySettings std::string m_available_teams; + bool m_live_players; + + int m_addon_arenas_play_threshold; + int m_addon_karts_play_threshold; + int m_addon_soccers_play_threshold; + int m_addon_tracks_play_threshold; + bool m_ai_anywhere; + bool m_ai_handling; + int m_capture_limit; + bool m_chat; + int m_chat_consecutive_interval; + bool m_expose_mobile; + bool m_firewalled_server; + float m_flag_deactivated_time; + float m_flag_return_timeout; + bool m_free_teams; + bool m_high_ping_workaround; + int m_hit_limit; + std::string m_incompatible_advice; + int m_jitter_tolerance; + int m_kick_idle_lobby_player_seconds; + int m_kick_idle_player_seconds; + bool m_kicks_allowed; + int m_max_ping; + int m_min_start_game_players; + float m_official_karts_play_threshold; + float m_official_tracks_play_threshold; + bool m_only_host_riding; + bool m_owner_less; + bool m_preserve_battle_scores; + std::string m_private_server_password; + bool m_ranked; + bool m_real_addon_karts; + bool m_record_replays; + bool m_server_configurable; + int m_server_difficulty; + int m_server_max_players; + int m_server_mode; + bool m_sleeping_server; + bool m_soccer_goal_target; + bool m_sql_management; + float m_start_game_counter; + int m_state_frequency; + bool m_store_results; + bool m_strict_players; + bool m_team_choosing; + int m_time_limit_ctf; + int m_time_limit_ffa; + bool m_track_kicks; + bool m_track_voting; + std::string m_troll_warn_msg; + bool m_validating_player; + float m_voting_timeout; + std::string m_commands_file; + + // These should be moved to voting manager ==================================== diff --git a/src/utils/map_vote_handler.cpp b/src/utils/map_vote_handler.cpp index 975412fb43b..320601fbb86 100644 --- a/src/utils/map_vote_handler.cpp +++ b/src/utils/map_vote_handler.cpp @@ -16,17 +16,18 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +#include "utils/map_vote_handler.hpp" + +#include "network/server_config.hpp" #include "utils/lobby_settings.hpp" #include "utils/log.hpp" -#include "utils/map_vote_handler.hpp" #include "utils/random_generator.hpp" #include "utils/string_utils.hpp" -MapVoteHandler::MapVoteHandler(std::shared_ptr settings) - : algorithm(0), m_lobby_settings(settings) +void MapVoteHandler::setupContextUser() { - -} // MapVoteHandler + algorithm = ServerConfig::m_map_vote_handling; +} // setupContextUser //----------------------------------------------------------------------------- @@ -90,14 +91,14 @@ bool MapVoteHandler::random(std::map& peers_votes, if (peers_votes.empty()) { - *winner_vote = m_lobby_settings->getDefaultVote(); + *winner_vote = getSettings()->getDefaultVote(); return true; } RandomGenerator rg; std::map::iterator it = peers_votes.begin(); std::advance(it, rg.get((int)peers_votes.size())); - m_lobby_settings->setWinnerPeerId(it->first); + getSettings()->setWinnerPeerId(it->first); *winner_vote = it->second; return true; } // random @@ -119,13 +120,13 @@ bool MapVoteHandler::standard(std::map& peers_votes, { if (is_over) { - *winner_vote = m_lobby_settings->getDefaultVote(); + *winner_vote = getSettings()->getDefaultVote(); return true; } return false; } - PeerVote default_vote = m_lobby_settings->getDefaultVote(); + PeerVote default_vote = getSettings()->getDefaultVote(); std::string top_track = default_vote.m_track_name; unsigned top_laps = default_vote.m_num_laps; bool top_reverse = default_vote.m_reverse; @@ -184,7 +185,7 @@ bool MapVoteHandler::standard(std::map& peers_votes, if (!is_over) return false; } - m_lobby_settings->setWinnerPeerId(it->first); + getSettings()->setWinnerPeerId(it->first); *winner_vote = it->second; return true; } @@ -205,7 +206,7 @@ bool MapVoteHandler::standard(std::map& peers_votes, else it++; } - m_lobby_settings->setWinnerPeerId(closest_lap->first); + getSettings()->setWinnerPeerId(closest_lap->first); *winner_vote = closest_lap->second; return true; } diff --git a/src/utils/map_vote_handler.hpp b/src/utils/map_vote_handler.hpp index 9d061b4b2bb..d140ee795db 100644 --- a/src/utils/map_vote_handler.hpp +++ b/src/utils/map_vote_handler.hpp @@ -21,6 +21,7 @@ #include "irrString.h" #include "network/peer_vote.hpp" +#include "utils/lobby_context.hpp" #include #include @@ -36,7 +37,7 @@ class LobbySettings; // It can be extended to store some information about previous choices, // but currently it doesn't store or use it. -class MapVoteHandler +class MapVoteHandler: public LobbyContextComponent { // STANDARD = 0 // RANDOM = 1 @@ -44,8 +45,6 @@ class MapVoteHandler private: int algorithm; - std::shared_ptr m_lobby_settings; - template static void findMajorityValue(const std::map& choices, unsigned cur_players, T* best_choice, float* rate); @@ -58,7 +57,9 @@ class MapVoteHandler float remaining_time, float max_time, bool is_over, unsigned cur_players, PeerVote* winner_vote) const; public: - MapVoteHandler(std::shared_ptr settings); + MapVoteHandler(LobbyContext* context): LobbyContextComponent(context) {} + + void setupContextUser() OVERRIDE; void setAlgorithm(int x) { algorithm = x; } int getAlgorithm() const { return algorithm; } diff --git a/src/utils/tournament.cpp b/src/utils/tournament.cpp index 72f8d9a2941..529f98f7ac3 100644 --- a/src/utils/tournament.cpp +++ b/src/utils/tournament.cpp @@ -21,8 +21,8 @@ #include "utils/track_filter.hpp" #include "network/stk_peer.hpp" #include "network/network_player_profile.hpp" -#include "network/server_config.hpp" #include "network/protocols/server_lobby.hpp" +#include "network/server_config.hpp" #include "network/peer_vote.hpp" #include "modes/world.hpp" #include "modes/soccer_world.hpp" @@ -34,14 +34,12 @@ namespace static int g_history_limit = 100; } -Tournament::Tournament(ServerLobby* lobby, - std::shared_ptr settings) - : m_lobby(lobby), m_lobby_settings(settings) +void Tournament::setupContextUser() { initTournamentPlayers(); m_game = 0; m_extra_seconds = 0.0f; -} // Tournament +} // setupContextUser //----------------------------------------------------------------------------- void Tournament::applyFiltersForThisGame(FilterContext& track_context) @@ -141,17 +139,17 @@ void Tournament::updateTournamentRole(std::shared_ptr peer) core::stringw name = player->getName(); std::string utf8_name = StringUtils::wideToUtf8(name); if (m_red_players.count(utf8_online_name)) - m_lobby->setTeamInLobby(player, KART_TEAM_RED); + getLobby()->setTeamInLobby(player, KART_TEAM_RED); else if (m_blue_players.count(utf8_online_name)) - m_lobby->setTeamInLobby(player, KART_TEAM_BLUE); + getLobby()->setTeamInLobby(player, KART_TEAM_BLUE); else - m_lobby->setTeamInLobby(player, KART_TEAM_NONE); + getLobby()->setTeamInLobby(player, KART_TEAM_NONE); if (hasColorsSwapped()) { if (player->getTeam() == KART_TEAM_BLUE) - m_lobby->setTeamInLobby(player, KART_TEAM_RED); + getLobby()->setTeamInLobby(player, KART_TEAM_RED); else if (player->getTeam() == KART_TEAM_RED) - m_lobby->setTeamInLobby(player, KART_TEAM_BLUE); + getLobby()->setTeamInLobby(player, KART_TEAM_BLUE); } } } // updateTournamentRole @@ -223,7 +221,7 @@ void Tournament::initTournamentPlayers() type == "B" ? m_blue_players : m_referees); - auto categories = m_lobby_settings->getCategories(); + auto categories = getSettings()->getCategories(); for (const std::string& member: categories[cat_name]) dest.insert(member); } diff --git a/src/utils/tournament.hpp b/src/utils/tournament.hpp index 1c3884b3057..3bc0f758cee 100644 --- a/src/utils/tournament.hpp +++ b/src/utils/tournament.hpp @@ -19,6 +19,7 @@ #ifndef TOURNAMENT_HPP #define TOURNAMENT_HPP +#include "utils/lobby_context.hpp" #include "utils/set_with_flip.hpp" #include "utils/tournament_role.hpp" #include "utils/types.hpp" @@ -40,10 +41,12 @@ struct FilterContext; * The current plan is to make it contain generic tournament things, while * specific things like format, modes, etc would be in other new classes. */ -class Tournament +class Tournament: public LobbyContextComponent { public: - Tournament(ServerLobby* lobby, std::shared_ptr settings); + Tournament(LobbyContext* context): LobbyContextComponent(context) {} + + void setupContextUser() OVERRIDE; void initTournamentPlayers(); void applyFiltersForThisGame(FilterContext& track_context); std::set getThoseWhoSeeTeamchats() const; @@ -84,9 +87,6 @@ class Tournament float getExtraSeconds() const { return m_extra_seconds; } private: - ServerLobby* m_lobby; - - std::shared_ptr m_lobby_settings; std::set m_red_players; From e9f28f5a7d698d73b426abae5a5fc483333251d3 Mon Sep 17 00:00:00 2001 From: kimden <23140380+kimden@users.noreply.github.com> Date: Thu, 13 Mar 2025 03:33:43 +0400 Subject: [PATCH 2/2] Even less ServerConfig, chat stuff moved to another unit Also refactors for sendString*, getMainName, KartTeamSet, and some functions moved to asset manager. Chat manager will be heavily refactored further. --- src/network/database_connector.cpp | 4 +- src/network/game_setup.cpp | 4 +- src/network/protocols/command_manager.cpp | 442 +++++++++------------- src/network/protocols/server_lobby.cpp | 331 +++------------- src/network/protocols/server_lobby.hpp | 10 +- src/network/remote_kart_info.hpp | 12 + src/network/stk_host.cpp | 3 +- src/network/stk_peer.cpp | 17 +- src/network/stk_peer.hpp | 2 + src/utils/chat_manager.cpp | 318 ++++++++++++++++ src/utils/chat_manager.hpp | 92 +++++ src/utils/hit_processor.cpp | 11 +- src/utils/hit_processor.hpp | 2 + src/utils/lobby_asset_manager.cpp | 103 ++++- src/utils/lobby_asset_manager.hpp | 7 + src/utils/lobby_context.cpp | 5 +- src/utils/lobby_context.hpp | 4 + src/utils/lobby_queues.cpp | 2 +- src/utils/lobby_settings.cpp | 136 +------ src/utils/lobby_settings.hpp | 63 ++- src/utils/tournament.cpp | 74 +++- src/utils/tournament.hpp | 8 + 22 files changed, 893 insertions(+), 757 deletions(-) create mode 100644 src/utils/chat_manager.cpp create mode 100644 src/utils/chat_manager.hpp diff --git a/src/network/database_connector.cpp b/src/network/database_connector.cpp index 95bff2c6648..55a6776617e 100644 --- a/src/network/database_connector.cpp +++ b/src/network/database_connector.cpp @@ -1016,7 +1016,7 @@ void DatabaseConnector::onPlayerJoinQueries(std::shared_ptr peer, peer->getAddress().toString(false), peer->getAddress().getPort(), online_id, - Binder(coll, StringUtils::wideToUtf8(peer->getPlayerProfiles()[0]->getName()), "player_name"), + Binder(coll, peer->getMainName(), "player_name"), player_count, Binder(coll, country_code, "country_code", true), Binder(coll, version_os.first, "version"), @@ -1043,7 +1043,7 @@ void DatabaseConnector::onPlayerJoinQueries(std::shared_ptr peer, peer->getAddress().getIP(), peer->getAddress().getPort(), online_id, - Binder(coll, StringUtils::wideToUtf8(peer->getPlayerProfiles()[0]->getName()), "player_name"), + Binder(coll, peer->getMainName(), "player_name"), player_count, Binder(coll, country_code, "country_code", true), Binder(coll, version_os.first, "version"), diff --git a/src/network/game_setup.cpp b/src/network/game_setup.cpp index a09fd83369b..a74abed6856 100644 --- a/src/network/game_setup.cpp +++ b/src/network/game_setup.cpp @@ -139,13 +139,13 @@ void GameSetup::addServerInfo(NetworkString* ns) if (ServerConfig::m_owner_less) { ns->addUInt8(ServerConfig::m_min_start_game_players) - .addFloat(std::max(0.0f, ServerConfig::m_start_game_counter)); + .addFloat(std::max(0.0f, getSettings()->getStartGameCounter())); } else ns->addUInt8(0).addFloat(0.0f); ns->encodeString16(m_message_of_today); - ns->addUInt8((uint8_t)ServerConfig::m_server_configurable); + ns->addUInt8((uint8_t)getSettings()->getServerConfigurable()); ns->addUInt8(getSettings()->isLivePlayers() ? 1 : 0); } // addServerInfo diff --git a/src/network/protocols/command_manager.cpp b/src/network/protocols/command_manager.cpp index 3dbe978567b..c274aa4c0e2 100644 --- a/src/network/protocols/command_manager.cpp +++ b/src/network/protocols/command_manager.cpp @@ -32,6 +32,7 @@ #include "network/stk_peer.hpp" #include "tracks/track.hpp" #include "tracks/track_manager.hpp" +#include "utils/chat_manager.hpp" #include "utils/file_utils.hpp" #include "utils/hit_processor.hpp" #include "utils/hourglass_reason.hpp" @@ -411,7 +412,7 @@ void CommandManager::initCommands() // special permissions according to ServerConfig options std::shared_ptr kick_command = mp["kick"].lock(); if (kick_command) { - if (ServerConfig::m_kicks_allowed) + if (getSettings()->getKicksAllowed()) kick_command->m_permissions |= PE_CROWNED; else kick_command->m_permissions &= ~PE_CROWNED; @@ -655,15 +656,13 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) std::string action = "invoke"; std::string username = ""; if (peer->hasPlayerProfiles()) - username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + username = peer->getMainName(); if (argv[0] == "vote") { if (argv.size() == 1 || argv[1] == "vote") { - std::string msg = "Usage: /vote (a command with arguments)"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Usage: /vote (a command with arguments)"); return; } std::reverse(argv.begin(), argv.end()); @@ -694,7 +693,7 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) msg = "Pick one of " + std::to_string(-1 + (int)m_user_command_replacements[username].size()) + " options using /1, etc., or use /0, or type a different command"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); return; } } @@ -726,21 +725,21 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) if (!command) { // todo change message - std::string msg = "There is no such command but there should be. Very strange. Please report it."; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, + "There is no such command but there should be. Very strange. Please report it."); return; } else if (!isAvailable(command)) { - std::string msg = "You don't have permissions to " + action + " this command"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, + "You don't have permissions to " + action + " this command"); return; } int mask = (permissions & command->m_permissions); if (mask == 0) { - std::string msg = "You don't have permissions to " + action + " this command"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, + "You don't have permissions to " + action + " this command"); return; } int mask_without_voting = (mask & ~PE_VOTED); @@ -804,7 +803,7 @@ void CommandManager::handleCommand(Event* event, std::shared_ptr peer) int CommandManager::getCurrentModeScope() { int mask = MS_DEFAULT; - if (ServerConfig::m_soccer_tournament) + if (isTournament()) mask |= MS_SOCCER_TOURNAMENT; return mask; } // getCurrentModeScope @@ -840,8 +839,7 @@ void CommandManager::vote(Context& context, std::string category, std::string va } if (!peer->hasPlayerProfiles()) return; - std::string username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string username = peer->getMainName(); auto& votable = m_votables[command->m_prefix_name]; bool neededCheck = votable.needsCheck(); votable.castVote(username, category, value); @@ -903,7 +901,7 @@ void CommandManager::error(Context& context, bool is_error) msg = "An error occurred while invoking command \"" + command->getFullName() + "\"."; if (is_error) msg += "\n/!\\ Please report this error to the server owner"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // error // ======================================================================== @@ -942,8 +940,7 @@ void CommandManager::process_help(Context& context) error(context); return; } - std::string msg = command->getHelp(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, command->getHelp()); } // process_help // ======================================================================== @@ -963,7 +960,7 @@ void CommandManager::process_text(Context& context) + " is defined without text"; else response = it->second; - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_text // ======================================================================== @@ -983,7 +980,7 @@ void CommandManager::process_file(Context& context) + command->getFullName(); else response = it->second.get(); - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_text // ======================================================================== @@ -1012,7 +1009,7 @@ void CommandManager::process_auth(Context& context) else response = it->second.get(username, online_id); } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_text // ======================================================================== @@ -1047,8 +1044,7 @@ void CommandManager::process_commands(Context& context) } if (!valid_prefix) { - result = "There are no available commands with such prefix"; - getLobby()->sendStringToPeer(result, peer); + getLobby()->sendStringToPeer(peer, "There are no available commands with such prefix"); return; } result = (command == m_root_command ? "Available commands" @@ -1081,7 +1077,7 @@ void CommandManager::process_commands(Context& context) } if (had_any_subcommands) result += "\n* has subcommands"; - getLobby()->sendStringToPeer(result, peer); + getLobby()->sendStringToPeer(peer, result); } // process_commands // ======================================================================== @@ -1094,7 +1090,7 @@ void CommandManager::process_replay(Context& context) error(context, true); return; } - if (ServerConfig::m_record_replays) + if (getSettings()->getRecordReplays()) { bool current_state = getSettings()->hasConsentOnReplays(); if (argv.size() >= 2 && argv[1] == "0") @@ -1105,21 +1101,19 @@ void CommandManager::process_replay(Context& context) current_state ^= 1; getSettings()->setConsentOnReplays(current_state); - std::string msg = "Recording ghost replays is now "; - msg += (current_state ? "on" : "off"); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(std::string("Recording ghost replays is now ") + + (current_state ? "on" : "off")); } else { - std::string msg = "This server doesn't allow recording replays"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "This server doesn't allow recording replays"); } } // process_replay // ======================================================================== void CommandManager::process_start(Context& context) { - if (!ServerConfig::m_owner_less && (context.m_user_permissions & UP_CROWNED) == 0) + if (!getSettings()->getOwnerLess() && (context.m_user_permissions & UP_CROWNED) == 0) { context.m_voting = true; } @@ -1156,19 +1150,18 @@ void CommandManager::process_config(Context& context) msg += get_first_if_exists(m_aux_difficulty_aliases[difficulty]); msg += " "; msg += get_first_if_exists(m_aux_goal_aliases[goal_target ? 1 : 0]); - if (!ServerConfig::m_server_configurable) + if (!getSettings()->getServerConfigurable()) msg += " (not configurable)"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_config // ======================================================================== void CommandManager::process_config_assign(Context& context) { auto peer = context.m_peer.lock(); - if (!ServerConfig::m_server_configurable) + if (!getSettings()->getServerConfigurable()) { - std::string msg = "Server is not configurable, this command cannot be invoked."; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Server is not configurable, this command cannot be invoked."); return; } const auto& argv = context.m_argv; @@ -1216,8 +1209,8 @@ void CommandManager::process_config_assign(Context& context) if (!getSettings()->isDifficultyAvailable(difficulty) || !getSettings()->isModeAvailable(mode)) { - std::string response = "Mode or difficulty are not permitted on this server"; - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, + "Mode or difficulty are not permitted on this server"); return; } if (context.m_voting) @@ -1252,7 +1245,7 @@ void CommandManager::process_spectate(Context& context) if (!response.empty()) { - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); return; } @@ -1276,8 +1269,7 @@ void CommandManager::process_spectate(Context& context) if (getLobby()->m_process_type == PT_CHILD && peer->getHostId() == getLobby()->m_client_server_host_id.load()) { - std::string msg = "Graphical client server cannot spectate"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Graphical client server cannot spectate"); return; } AlwaysSpectateMode type = (value == 2 ? ASM_COMMAND_ABSENT : ASM_COMMAND); @@ -1320,7 +1312,7 @@ void CommandManager::process_addons(Context& context) /*argv[1] == "soccer" ?*/ asset_manager->getAddonSoccers() ))); if (apply_filters) - getLobby()->applyAllFilters(from, false); // happily the type is never karts in this line + getAssetManager()->applyAllFilters(from, false); // happily the type is never karts in this line std::vector>> result; for (const std::string& s: from) result.push_back({s, {}}); @@ -1337,8 +1329,7 @@ void CommandManager::process_addons(Context& context) if (!p->hasPlayerProfiles()) continue; ++num_players; - std::string username = StringUtils::wideToUtf8( - p->getPlayerProfiles()[0]->getName()); + std::string username = p->getMainName(); const auto& kt = p->getClientAssets(); const auto& container = (argv[1] == "kart" ? kt.first : kt.second); for (auto& pr: result) @@ -1372,8 +1363,7 @@ void CommandManager::process_addons(Context& context) result.clear(); std::string asking_username = ""; if (peer->hasPlayerProfiles()) - asking_username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + asking_username = peer->getMainName(); for (unsigned i = 0; i < result2.size(); ++i) { bool present = false; @@ -1430,7 +1420,7 @@ void CommandManager::process_addons(Context& context) response = "No one in the lobby can play. Found " + std::to_string(all_have.size()) + " assets on the server."; } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_addons // ======================================================================== @@ -1475,8 +1465,7 @@ void CommandManager::process_checkaddon(Context& context) || !getLobby()->canRace(p) || p->isCommandSpectator() || !p->hasPlayerProfiles()) continue; - std::string username = StringUtils::wideToUtf8( - p->getPlayerProfiles()[0]->getName()); + std::string username = p->getMainName(); const auto& kt = p->getClientAssets(); unsigned status = 0; if (kt.first.find(id) != kt.first.end()) @@ -1550,7 +1539,7 @@ void CommandManager::process_checkaddon(Context& context) } response.pop_back(); } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_checkaddon // ======================================================================== @@ -1571,9 +1560,8 @@ void CommandManager::process_id(Context& context) if (hasTypo(peer, context.m_voting, context.m_argv, context.m_cmd, 1, m_stf_all_maps, 3, false, true)) return; - std::string id = argv[1]; - std::string response = "Server knows this map, copy it below:\n" + id; - getLobby()->sendStringToPeer(response, peer); + + getLobby()->sendStringToPeer(peer, "Server knows this map, copy it below:\n" + argv[1]); } // process_id // ======================================================================== @@ -1655,7 +1643,7 @@ void CommandManager::process_lsa(Context& context) msg = msg.substr(0, msg.size() - 2); response = "Server's addons: " + msg; } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_lsa // ======================================================================== @@ -1716,17 +1704,10 @@ void CommandManager::process_pha(Context& context) } } } - if (found) - { - response = player_name + " has addon " + addon_id; - } - else - { - response = player_name + " has no addon " + addon_id; - } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, player_name + + " has " + (found ? "" : "no ") + "addon " + addon_id); } // process_pha -// ======================================================================== +// ============================================================================ void CommandManager::process_kick(Context& context) { @@ -1753,9 +1734,8 @@ void CommandManager::process_kick(Context& context) } if (player_peer->isAngryHost()) { - std::string msg = "This player is the owner of this server, " - "and is protected from your actions now"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "This player is the owner of " + "this server, and is protected from your actions now"); return; } if (context.m_voting) @@ -1765,7 +1745,7 @@ void CommandManager::process_kick(Context& context) } Log::info("CommandManager", "%s kicks %s", (peer.get() ? "Crown player" : "Vote"), player_name.c_str()); player_peer->kick(); - if (ServerConfig::m_track_kicks) + if (getSettings()->getTrackKicks()) { std::string auto_report = "[ Auto report caused by kick ]"; getLobby()->writeOwnReport(player_peer, peer, auto_report); @@ -1774,9 +1754,8 @@ void CommandManager::process_kick(Context& context) { Log::info("CommandManager", "%s is now banned", player_name.c_str()); getLobby()->m_temp_banned.insert(player_name); - std::string msg = StringUtils::insertValues( - "%s is now banned", player_name.c_str()); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "%s is now banned", player_name.c_str())); } } // process_kick // ======================================================================== @@ -1803,9 +1782,8 @@ void CommandManager::process_unban(Context& context) } Log::info("CommandManager", "%s is now unbanned", player_name.c_str()); getLobby()->m_temp_banned.erase(player_name); - std::string msg = StringUtils::insertValues( - "%s is now unbanned", player_name.c_str()); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "%s is now unbanned", player_name.c_str())); } // process_unban // ======================================================================== @@ -1832,9 +1810,8 @@ void CommandManager::process_ban(Context& context) } Log::info("CommandManager", "%s is now banned", player_name.c_str()); getLobby()->m_temp_banned.insert(player_name); - std::string msg = StringUtils::insertValues( - "%s is now banned", player_name.c_str()); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "%s is now banned", player_name.c_str())); } // process_ban // ======================================================================== @@ -1858,8 +1835,7 @@ void CommandManager::process_pas(Context& context) error(context); return; } - player_name = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + player_name = peer->getMainName(); } else { @@ -1896,7 +1872,7 @@ void CommandManager::process_pas(Context& context) msg.pop_back(); response = msg; } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_pas // ======================================================================== @@ -1924,8 +1900,7 @@ void CommandManager::process_everypas(Context& context) continue; if (!p->hasPlayerProfiles()) continue; - std::string player_name = StringUtils::wideToUtf8( - p->getPlayerProfiles()[0]->getName()); + std::string player_name = p->getMainName(); auto &scores = p->getAddonsScores(); std::vector overall; for (int item = 0; item < AS_TOTAL; item++) @@ -1977,7 +1952,7 @@ void CommandManager::process_everypas(Context& context) response += msg; } } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_everypas // ======================================================================== @@ -1989,7 +1964,6 @@ void CommandManager::process_sha(Context& context) error(context, true); return; } - std::string response; auto& argv = context.m_argv; if (argv.size() != 2) { @@ -2009,15 +1983,8 @@ void CommandManager::process_sha(Context& context) total_addons.insert(all_soccers.begin(), all_soccers.end()); std::string addon_id_test = Addon::createAddonId(argv[1]); bool found = total_addons.find(addon_id_test) != total_addons.end(); - if (found) - { - response = "Server has addon " + argv[1]; - } - else - { - response = "Server has no addon " + argv[1]; - } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, std::string("Server has ") + + (found ? "" : "no ") + "addon " + argv[1]); } // process_sha // ======================================================================== @@ -2032,7 +1999,6 @@ void CommandManager::process_mute(Context& context) return; } std::string result_msg; - core::stringw player_name; if (argv.size() != 2 || argv[1].empty()) { @@ -2044,8 +2010,9 @@ void CommandManager::process_mute(Context& context) 1, m_stf_present_users, 3, false, false)) return; - player_name = StringUtils::utf8ToWide(argv[1]); - player_peer = STKHost::get()->findPeerByName(player_name); + + std::string player_name = argv[1]; + player_peer = STKHost::get()->findPeerByName(StringUtils::utf8ToWide(player_name)); if (!player_peer || player_peer == peer) { @@ -2053,9 +2020,8 @@ void CommandManager::process_mute(Context& context) return; } - getSettings()->addMutedPlayerFor(peer, player_name); - result_msg = "Muted player " + argv[1]; - getLobby()->sendStringToPeer(result_msg, peer); + getChatManager()->addMutedPlayerFor(peer, player_name); + getLobby()->sendStringToPeer(peer, "Muted player " + player_name); } // process_mute // ======================================================================== @@ -2069,7 +2035,6 @@ void CommandManager::process_unmute(Context& context) error(context, true); return; } - core::stringw player_name; if (argv.size() != 2 || argv[1].empty()) { @@ -2077,16 +2042,15 @@ void CommandManager::process_unmute(Context& context) return; } - player_name = StringUtils::utf8ToWide(argv[1]); + std::string player_name = argv[1]; - if (!getSettings()->removeMutedPlayerFor(peer, player_name)) + if (!getChatManager()->removeMutedPlayerFor(peer, player_name)) { error(context); return; } - std::string result_msg = "Unmuted player " + StringUtils::wideToUtf8(player_name); - getLobby()->sendStringToPeer(result_msg, peer); + getLobby()->sendStringToPeer(peer, "Unmuted player " + player_name); } // process_unmute // ======================================================================== @@ -2100,8 +2064,8 @@ void CommandManager::process_listmute(Context& context) return; } - std::string muted_players = getSettings()->getMutedPlayersAsString(peer); - getLobby()->sendStringToPeer(muted_players, peer); + getLobby()->sendStringToPeer(peer, + getChatManager()->getMutedPlayersAsString(peer)); } // process_listmute // ======================================================================== @@ -2122,22 +2086,19 @@ void CommandManager::process_gnu(Context& context) auto kart_elimination = getKartElimination(); if (turn_on && kart_elimination->isEnabled()) { - std::string msg = "Gnu Elimination mode was already enabled!"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Gnu Elimination mode was already enabled!"); return; } if (!turn_on && !kart_elimination->isEnabled()) { - std::string msg = "Gnu Elimination mode was already off!"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Gnu Elimination mode was already off!"); return; } if (turn_on && RaceManager::get()->getMinorMode() != RaceManager::MINOR_MODE_NORMAL_RACE && RaceManager::get()->getMinorMode() != RaceManager::MINOR_MODE_TIME_TRIAL) { - std::string msg = "Gnu Elimination is available only with racing modes"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Gnu Elimination is available only with racing modes"); return; } std::string kart; @@ -2177,14 +2138,12 @@ void CommandManager::process_gnu(Context& context) if (kart == "off") { kart_elimination->disable(); - std::string msg = "Gnu Elimination is now off"; - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers("Gnu Elimination is now off"); } else { kart_elimination->enable(kart); - std::string msg = kart_elimination->getStartingMessage(); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(kart_elimination->getStartingMessage()); } } // process_gnu // ======================================================================== @@ -2256,7 +2215,7 @@ void CommandManager::process_standings(Context& context) } else if (isGnu) msg = getKartElimination()->getStandings(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_standings // ======================================================================== @@ -2268,9 +2227,8 @@ void CommandManager::process_teamchat(Context& context) error(context, true); return; } - getSettings()->addTeamSpeaker(peer); - std::string msg = "Your messages are now addressed to team only"; - getLobby()->sendStringToPeer(msg, peer); + getChatManager()->addTeamSpeaker(peer); + getLobby()->sendStringToPeer(peer, "Your messages are now addressed to team only"); } // process_teamchat // ======================================================================== @@ -2296,9 +2254,8 @@ void CommandManager::process_to(Context& context) return; receivers.push_back(argv[i]); } - getSettings()->setMessageReceiversFor(peer, receivers); - std::string msg = "Successfully changed chat settings"; - getLobby()->sendStringToPeer(msg, peer); + getChatManager()->setMessageReceiversFor(peer, receivers); + getLobby()->sendStringToPeer(peer, "Successfully changed chat settings"); } // process_to // ======================================================================== @@ -2310,9 +2267,8 @@ void CommandManager::process_public(Context& context) error(context, true); return; } - getSettings()->makeChatPublicFor(peer); - std::string s = "Your messages are now public"; - getLobby()->sendStringToPeer(s, peer); + getChatManager()->makeChatPublicFor(peer); + getLobby()->sendStringToPeer(peer, "Your messages are now public"); } // process_public // ======================================================================== @@ -2360,7 +2316,7 @@ void CommandManager::process_record(Context& context) #else response = "This command is not supported."; #endif - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_record // ======================================================================== @@ -2376,8 +2332,7 @@ void CommandManager::process_power(Context& context) if (peer->isAngryHost()) { peer->setAngryHost(false); - std::string msg = "You are now a normal player"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "You are now a normal player"); getLobby()->updatePlayerList(); return; } @@ -2390,19 +2345,17 @@ void CommandManager::process_power(Context& context) online_id = profiles[0]->getOnlineId(); } - std::string password = ServerConfig::m_power_password; + std::string password = getSettings()->getPowerPassword(); bool bad_password = (password.empty() || argv.size() <= 1 || argv[1] != password); bool good_player = (getSettings()->isInHammerWhitelist(username) && online_id != 0); if (bad_password && !good_player) { - std::string msg = "You need to provide the password to have the power"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "You need to provide the password to have the power"); return; } peer->setAngryHost(true); - std::string msg = "Now you finally have the power!"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Now you finally have the power!"); getLobby()->updatePlayerList(); } // process_power // ======================================================================== @@ -2414,8 +2367,7 @@ void CommandManager::process_length(Context& context) error(context, true); return; } - std::string msg = getSettings()->getLapRestrictionsAsString(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, getSettings()->getLapRestrictionsAsString()); } // process_length // ======================================================================== void CommandManager::process_length_multi(Context& context) @@ -2430,8 +2382,8 @@ void CommandManager::process_length_multi(Context& context) } double value = std::max(0.0, temp_double); getSettings()->setMultiplier(value); - std::string msg = StringUtils::insertValues("Game length is now %f x default", value); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(StringUtils::insertValues( + "Game length is now %f x default", value)); } // process_length_multi // ======================================================================== void CommandManager::process_length_fixed(Context& context) @@ -2446,29 +2398,26 @@ void CommandManager::process_length_fixed(Context& context) } int value = std::max(0, temp_int); getSettings()->setFixedLapCount(value); - std::string msg = StringUtils::insertValues("Game length is now %d", value); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(StringUtils::insertValues( + "Game length is now %d", value)); } // process_length_fixed // ======================================================================== void CommandManager::process_length_clear(Context& context) { getSettings()->resetLapRestrictions(); - std::string msg = "Game length will be chosen by players"; - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers("Game length will be chosen by players"); } // process_length_clear // ======================================================================== void CommandManager::process_direction(Context& context) { - std::string msg = getSettings()->getDirectionAsString(); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(getSettings()->getDirectionAsString()); } // process_direction // ======================================================================== void CommandManager::process_direction_assign(Context& context) { auto& argv = context.m_argv; - std::string msg; if (argv.size() < 2) { error(context); @@ -2480,8 +2429,7 @@ void CommandManager::process_direction_assign(Context& context) error(context); return; } - msg = getSettings()->getDirectionAsString(true); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(getSettings()->getDirectionAsString(true)); } // process_direction_assign // ======================================================================== @@ -2508,7 +2456,7 @@ void CommandManager::process_queue(Context& context) } } msg.pop_back(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_queue // ======================================================================== @@ -2736,8 +2684,7 @@ void CommandManager::process_allowstart(Context& context) return; } - std::string msg = getSettings()->getAllowedToStartAsString(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, getSettings()->getAllowedToStartAsString()); } // process_allowstart // ======================================================================== @@ -2753,8 +2700,7 @@ void CommandManager::process_allowstart_assign(Context& context) return; } getSettings()->setAllowedToStart(argv[1] != "0"); - std::string msg = getSettings()->getAllowedToStartAsString(true); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(getSettings()->getAllowedToStartAsString(true)); } // process_allowstart_assign // ======================================================================== @@ -2766,8 +2712,7 @@ void CommandManager::process_shuffle(Context& context) error(context, true); return; } - std::string msg = getSettings()->getWhetherShuffledGPGridAsString(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, getSettings()->getWhetherShuffledGPGridAsString()); } // process_shuffle // ======================================================================== @@ -2781,8 +2726,7 @@ void CommandManager::process_shuffle_assign(Context& context) return; } getSettings()->setGPGridShuffled(argv[1] != "0"); - std::string msg = getSettings()->getWhetherShuffledGPGridAsString(true); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(getSettings()->getWhetherShuffledGPGridAsString(true)); } // process_shuffle_assign // ======================================================================== @@ -2794,7 +2738,6 @@ void CommandManager::process_timeout(Context& context) error(context, true); return; } - std::string msg; int seconds; auto& argv = context.m_argv; if (argv.size() < 2 || !StringUtils::parseString(argv[1], &seconds) || seconds <= 0) @@ -2805,8 +2748,7 @@ void CommandManager::process_timeout(Context& context) getLobby()->m_timeout.store((int64_t)StkTime::getMonoTimeMs() + (int64_t)(seconds * 1000.0f)); getLobby()->updatePlayerList(); - msg = "Successfully changed timeout"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Successfully changed timeout"); } // process_timeout // ======================================================================== @@ -2841,9 +2783,8 @@ void CommandManager::process_team(Context& context) // Resetting should be allowed anyway if (!allowed_color && team != TeamUtils::NO_TEAM) { - std::string msg = StringUtils::insertValues("Color %s is not allowed", - argv[1].c_str()); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "Color %s is not allowed", argv[1])); return; } getLobby()->setTemporaryTeamInLobby(player, team); @@ -2907,7 +2848,7 @@ void CommandManager::process_swapteams(Context& context) permutation_map_int[from] = to; } getLobby()->shuffleTemporaryTeams(permutation_map_int); - getLobby()->sendStringToPeer(msg, peer); // todo make public? + getLobby()->sendStringToPeer(peer, msg); // todo make public? getLobby()->updatePlayerList(); } // process_swapteams // ======================================================================== @@ -2920,9 +2861,8 @@ void CommandManager::process_resetteams(Context& context) error(context, true); return; } - std::string msg = "Teams are reset now"; getLobby()->clearTemporaryTeams(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Teams are reset now"); getLobby()->updatePlayerList(); } // process_resetteams // ======================================================================== @@ -2951,19 +2891,17 @@ void CommandManager::process_randomteams(Context& context) msg = "No one can play!"; else msg = "Teams are currently not allowed"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); return; } - std::string msg = StringUtils::insertValues( - "Created %d teams for %d players", final_number, players_number); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "Created %d teams for %d players", final_number, players_number)); getLobby()->updatePlayerList(); } // process_randomteams // ======================================================================== void CommandManager::process_resetgp(Context& context) { - std::string msg = "GP is now reset"; auto& argv = context.m_argv; if (argv.size() >= 2) { int number_of_games; @@ -2976,7 +2914,7 @@ void CommandManager::process_resetgp(Context& context) getLobby()->getGameSetup()->setGrandPrixTrack(number_of_games); } getLobby()->resetGrandPrix(); - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers("GP is now reset"); } // process_resetgp // ======================================================================== @@ -3055,7 +2993,7 @@ void CommandManager::process_troll(Context& context) msg = "Trolls will be kicked"; else msg = "Trolls can stay"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_troll // ======================================================================== @@ -3095,7 +3033,7 @@ void CommandManager::process_hitmsg(Context& context) msg = "Teammate hits are sent to all players"; else msg = "Teammate hits are not sent"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_hitmsg // ======================================================================== @@ -3135,7 +3073,7 @@ void CommandManager::process_teamhit(Context& context) msg = "Teammate hits are punished"; else msg = "Teammate hits are not punished"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_teamhit // ======================================================================== @@ -3171,8 +3109,7 @@ void CommandManager::process_scoring(Context& context) error(context, true); return; } - std::string msg = getSettings()->getScoringAsString(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, getSettings()->getScoringAsString()); } // process_scoring // ======================================================================== @@ -3190,13 +3127,11 @@ void CommandManager::process_scoring_assign(Context& context) CommandManager::restoreCmdByArgv(cmd2, argv, ' ', '"', '"', '\\', 1); if (getSettings()->loadCustomScoring(cmd2)) { - msg = "Scoring set to \"" + cmd2 + "\""; - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers("Scoring set to \"" + cmd2 + "\""); } else { - msg = "Scoring could not be parsed from \"" + cmd2 + "\""; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Scoring could not be parsed from \"" + cmd2 + "\""); } } // process_scoring_assign // ======================================================================== @@ -3215,8 +3150,7 @@ void CommandManager::process_register(Context& context) int online_id = peer->getPlayerProfiles()[0]->getOnlineId(); if (online_id <= 0) { - std::string msg = "Please join with a valid online STK account."; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Please join with a valid online STK account."); return; } std::string ans = ""; @@ -3226,13 +3160,11 @@ void CommandManager::process_register(Context& context) ans.push_back(' '); ans += argv[i]; } - std::string message_ok = "Your registration request is being processed"; - std::string message_wrong = "Sorry, an error occurred. Please try again."; - if (getLobby()->writeOnePlayerReport(peer, ServerConfig::m_register_table_name, + if (getLobby()->writeOnePlayerReport(peer, getSettings()->getRegisterTableName(), ans)) - getLobby()->sendStringToPeer(message_ok, peer); + getLobby()->sendStringToPeer(peer, "Your registration request is being processed"); else - getLobby()->sendStringToPeer(message_wrong, peer); + getLobby()->sendStringToPeer(peer, "Sorry, an error occurred. Please try again."); } // process_register // ======================================================================== @@ -3248,8 +3180,7 @@ void CommandManager::process_muteall(Context& context) } if (!peer->hasPlayerProfiles()) return; - std::string peer_username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string peer_username = peer->getMainName(); int op = SWF_OP_FLIP; if (argv.size() >= 2 && argv[1] == "0") @@ -3264,7 +3195,7 @@ void CommandManager::process_muteall(Context& context) msg = "You are now receiving messages only from players and referees"; else msg = "You are now receiving messages from spectators too"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_muteall // ======================================================================== @@ -3280,8 +3211,7 @@ void CommandManager::process_game(Context& context) } if (!peer->hasPlayerProfiles()) return; - std::string peer_username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string peer_username = peer->getMainName(); int old_game_number; int old_duration; @@ -3312,13 +3242,12 @@ void CommandManager::process_game(Context& context) if (bad) { - std::string msg = StringUtils::insertValues( + // error(context) ? + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( "Please specify a correct number. " "Format: /game [number %d..%d] [length in minutes] [0..59 additional seconds]", tournament->minGameNumber(), - tournament->maxGameNumber()); - // error(context) ? - getLobby()->sendStringToPeer(msg, peer); + tournament->maxGameNumber())); return; } } @@ -3358,8 +3287,7 @@ void CommandManager::process_role(Context& context) } if (!peer->hasPlayerProfiles()) return; - std::string peer_username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string peer_username = peer->getMainName(); if (argv.size() < 3) { error(context); @@ -3417,10 +3345,10 @@ void CommandManager::process_role(Context& context) } if (player_peer) { - role_changed = StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char)); if (player_peer->hasPlayerProfiles()) getLobby()->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_RED); - getLobby()->sendStringToPeer(role_changed, player_peer); + getLobby()->sendStringToPeer(player_peer, + StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char))); } break; } @@ -3437,10 +3365,10 @@ void CommandManager::process_role(Context& context) } if (player_peer) { - role_changed = StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char)); if (player_peer->hasPlayerProfiles()) getLobby()->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_BLUE); - getLobby()->sendStringToPeer(role_changed, player_peer); + getLobby()->sendStringToPeer(player_peer, + StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char))); } break; } @@ -3450,10 +3378,10 @@ void CommandManager::process_role(Context& context) tournament->setReferee(u, permanent); if (player_peer) { - role_changed = StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char)); if (player_peer->hasPlayerProfiles()) getLobby()->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_NONE); - getLobby()->sendStringToPeer(role_changed, player_peer); + getLobby()->sendStringToPeer(player_peer, + StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char))); } break; } @@ -3461,10 +3389,10 @@ void CommandManager::process_role(Context& context) { if (player_peer) { - role_changed = StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char)); if (player_peer->hasPlayerProfiles()) getLobby()->setTeamInLobby(player_peer->getPlayerProfiles()[0], KART_TEAM_NONE); - getLobby()->sendStringToPeer(role_changed, player_peer); + getLobby()->sendStringToPeer(player_peer, + StringUtils::insertValues(role_changed, Conversions::roleCharToString(role_char))); } break; } @@ -3489,7 +3417,7 @@ void CommandManager::process_role(Context& context) msg += " " + missing_assets[i]; } } - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } getLobby()->updatePlayerList(); } // process_role @@ -3507,8 +3435,7 @@ void CommandManager::process_stop(Context& context) return; SoccerWorld *sw = dynamic_cast(w); sw->stop(); - std::string msg = "The game is stopped."; - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers("The game is stopped."); Log::info("CommandManager", "SoccerMatchLog: The game is stopped"); } // process_stop // ======================================================================== @@ -3525,8 +3452,7 @@ void CommandManager::process_go(Context& context) return; SoccerWorld *sw = dynamic_cast(w); sw->resume(); - std::string msg = "The game is resumed."; - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers("The game is resumed."); Log::info("CommandManager", "SoccerMatchLog: The game is resumed"); } // process_go // ======================================================================== @@ -3543,8 +3469,7 @@ void CommandManager::process_lobby(Context& context) return; SoccerWorld *sw = dynamic_cast(w); sw->allToLobby(); - std::string msg = "The game will be restarted."; - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers("The game will be restarted."); } // process_lobby // ======================================================================== @@ -3559,8 +3484,7 @@ void CommandManager::process_init(Context& context) } if (!peer->hasPlayerProfiles()) return; - std::string peer_username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string peer_username = peer->getMainName(); int red, blue; if (argv.size() < 3 || !StringUtils::parseString(argv[1], &red) || @@ -3572,10 +3496,9 @@ void CommandManager::process_init(Context& context) World* w = World::getWorld(); if (!w) { - std::string msg = "Please set the count when the karts " - "are ready. Setting the initial count in lobby is " - "not implemented yet, sorry."; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Please set the count " + "when the karts are ready. Setting the initial count " + "in the lobby is not implemented yet, sorry."); return; } SoccerWorld *sw = dynamic_cast(w); @@ -3599,7 +3522,7 @@ void CommandManager::process_mimiz(Context& context) msg = "please provide text"; else msg = cmd.substr(argv[0].length() + 1); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_mimiz // ======================================================================== @@ -3609,8 +3532,8 @@ void CommandManager::process_test(Context& context) auto peer = context.m_peer.lock(); if (argv.size() == 1) { - std::string msg = "/test is now deprecated. Use /test *2 [something] [something]"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, + "/test is now deprecated. Use /test *2 [something] [something]"); return; } argv.resize(4, ""); @@ -3627,12 +3550,10 @@ void CommandManager::process_test(Context& context) std::string username = "Vote"; if (peer.get() && peer->hasPlayerProfiles()) { - username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + username = peer->getMainName(); } username = "{" + argv[1].substr(4) + "} " + username; - std::string msg = username + ", " + argv[2] + ", " + argv[3]; - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers(username + ", " + argv[2] + ", " + argv[3]); } // process_test // ======================================================================== @@ -3645,18 +3566,18 @@ void CommandManager::process_slots(Context& context) return; } int current = getLobby()->m_current_max_players_in_game.load(); - std::string msg = "Number of slots is currently " + std::to_string(current); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Number of slots is currently " + + std::to_string(current)); } // process_slots // ======================================================================== void CommandManager::process_slots_assign(Context& context) { - if (ServerConfig::m_only_host_riding) + if (getSettings()->getOnlyHostRiding()) { - std::string msg = "Changing slots is not possible in the singleplayer mode"; auto peer = context.m_peer.lock(); // may be nullptr, here we don't care - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, + "Changing slots is not possible in the singleplayer mode"); return; } auto& argv = context.m_argv; @@ -3664,7 +3585,7 @@ void CommandManager::process_slots_assign(Context& context) int number = 0; if (argv.size() < 2 || !StringUtils::parseString(argv[1], &number)) fail = true; - else if (number <= 0 || number > ServerConfig::m_server_max_players) + else if (number <= 0 || number > getSettings()->getServerMaxPlayers()) fail = true; if (fail) { @@ -3678,8 +3599,7 @@ void CommandManager::process_slots_assign(Context& context) } getLobby()->m_current_max_players_in_game.store((unsigned)number); getLobby()->updatePlayerList(); - std::string msg = "Number of playable slots is now " + argv[1]; - getLobby()->sendStringToAllPeers(msg); + getLobby()->sendStringToAllPeers("Number of playable slots is now " + argv[1]); } // process_slots_assign // ======================================================================== @@ -3691,8 +3611,7 @@ void CommandManager::process_time(Context& context) error(context, true); return; } - std::string msg = "Server time: " + StkTime::getLogTime(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Server time: " + StkTime::getLogTime()); } // process_time // ======================================================================== @@ -3718,7 +3637,7 @@ void CommandManager::process_result(Context& context) } else msg = "This command is not yet supported for this game mode"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_result // ======================================================================== @@ -3730,8 +3649,7 @@ void CommandManager::process_preserve(Context& context) error(context, true); return; } - std::string msg = getSettings()->getPreservedSettingsAsString(); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, getSettings()->getPreservedSettingsAsString()); } // process_preserve // ======================================================================== @@ -3779,7 +3697,7 @@ void CommandManager::process_history(Context& context) std::vector arenas = tournament->getMapHistory(); for (unsigned i = 0; i < arenas.size(); i++) msg += StringUtils::insertValues(" [%d]: %s", i, arenas[i].c_str()); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_history // ======================================================================== @@ -3815,8 +3733,8 @@ void CommandManager::process_history_assign(Context& context) return; } - msg = StringUtils::insertValues("Assigned [%d] to %s in the map history", index, id.c_str()); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "Assigned [%d] to %s in the map history", index, id.c_str())); } // process_history_assign // ======================================================================== @@ -3828,9 +3746,9 @@ void CommandManager::process_voting(Context& context) error(context, true); return; } - std::string msg = StringUtils::insertValues("Voting method: %d", - getMapVoteHandler()->getAlgorithm()); - getLobby()->sendStringToPeer(msg, peer); + + getLobby()->sendStringToPeer(peer, StringUtils::insertValues("Voting method: %d", + getMapVoteHandler()->getAlgorithm())); } // process_voting // ======================================================================== @@ -3856,8 +3774,8 @@ void CommandManager::process_voting_assign(Context& context) return; } getMapVoteHandler()->setAlgorithm(value); - msg = StringUtils::insertValues("Set voting method to %s", value); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "Set voting method to %s", value)); } // process_voting_assign // ======================================================================== @@ -3880,8 +3798,7 @@ void CommandManager::process_why_hourglass(Context& context) error(context); return; } - player_name = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + player_name = peer->getMainName(); } else { @@ -3900,6 +3817,7 @@ void CommandManager::process_why_hourglass(Context& context) auto it = getLobby()->m_why_peer_cannot_play.find(player_peer); if (it == getLobby()->m_why_peer_cannot_play.end()) { + Log::error("CommandManager", "Hourglass status undefined for a player!"); response = "For some reason, server doesn't know about the hourglass status of this player."; } else @@ -3951,7 +3869,7 @@ void CommandManager::process_why_hourglass(Context& context) } response = StringUtils::insertValues(response, player_name.c_str()); } - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); } // process_why_hourglass // ======================================================================== @@ -3963,9 +3881,9 @@ void CommandManager::process_available_teams(Context& context) error(context, true); return; } - std::string msg = StringUtils::insertValues("Currently available teams: \"%s\"", - getSettings()->getInternalAvailableTeams().c_str()); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "Currently available teams: \"%s\"", + getSettings()->getInternalAvailableTeams().c_str())); } // process_available_teams // ======================================================================== @@ -4013,7 +3931,7 @@ void CommandManager::process_available_teams_assign(Context& context) if (!ignored.empty()) msg += StringUtils::insertValues( ", but teams \"%s\" were not recognized", ignored); - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, msg); } // process_available_teams_assign // ======================================================================== @@ -4034,12 +3952,12 @@ void CommandManager::special(Context& context) Log::warn("CommandManager", "Command %s was invoked " "but not implemented or unavailable for this server", command->getFullName().c_str()); - std::string msg = "This command (%s) is not implemented, or " + + getLobby()->sendStringToPeer(peer, StringUtils::insertValues( + "This command (%s) is not implemented, or " "not available for this server. " "If you believe that is a bug, please report it. Full input:\n" - "/%s"; - msg = StringUtils::insertValues(msg, command->getFullName(), cmd); - getLobby()->sendStringToPeer(msg, peer); + "/%s", command->getFullName(), cmd)); } // special // ======================================================================== @@ -4171,8 +4089,7 @@ bool CommandManager::hasTypo(std::shared_ptr peer, bool voting, return false; std::string username = ""; if (peer->hasPlayerProfiles()) - username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + username = peer->getMainName(); auto it = m_user_last_correct_argument.find(username); if (it != m_user_last_correct_argument.end() && std::make_pair(idx, subidx) <= it->second) @@ -4189,8 +4106,7 @@ bool CommandManager::hasTypo(std::shared_ptr peer, bool voting, auto closest_commands = stf.getClosest(text, top, case_sensitive); if (closest_commands.empty()) { - std::string msg = "Command " + cmd + " not found"; - getLobby()->sendStringToPeer(msg, peer); + getLobby()->sendStringToPeer(peer, "Command " + cmd + " not found"); return true; } bool no_zeros = closest_commands[0].second != 0; @@ -4227,7 +4143,7 @@ bool CommandManager::hasTypo(std::shared_ptr peer, bool voting, } argv[idx] = initial_argument; CommandManager::restoreCmdByArgv(cmd, argv, ' ', '"', '"', '\\'); - getLobby()->sendStringToPeer(response, peer); + getLobby()->sendStringToPeer(peer, response); return true; } diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 171c03cb73e..967e28be04b 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -49,6 +49,7 @@ #include "tracks/check_manager.hpp" #include "tracks/track.hpp" #include "tracks/track_manager.hpp" +#include "utils/chat_manager.hpp" #include "utils/kart_elimination.hpp" #include "utils/game_info.hpp" #include "utils/hit_processor.hpp" @@ -262,9 +263,9 @@ void ServerLobby::initServerStatsTable() * whenever server is reset or game mode is changed. */ void ServerLobby::updateMapsForMode() { - RaceManager::MinorRaceModeType m = - ServerConfig::getLocalGameMode(m_game_mode.load()).first; - getAssetManager()->updateMapsForMode(m); + getAssetManager()->updateMapsForMode( + ServerConfig::getLocalGameMode(m_game_mode.load()).first + ); } // updateMapsForMode //----------------------------------------------------------------------------- @@ -325,12 +326,13 @@ bool ServerLobby::notifyEvent(Event* event) message_type); switch (message_type) { - case LE_RACE_FINISHED_ACK: playerFinishedResult(event); break; - case LE_LIVE_JOIN: liveJoinRequest(event); break; + case LE_RACE_FINISHED_ACK: playerFinishedResult(event); break; + case LE_LIVE_JOIN: liveJoinRequest(event); break; case LE_CLIENT_LOADED_WORLD: finishedLoadingLiveJoinClient(event); break; - case LE_KART_INFO: handleKartInfo(event); break; - case LE_CLIENT_BACK_LOBBY: clientInGameWantsToBackLobby(event); break; - default: Log::error("ServerLobby", "Unknown message of type %d - ignored.", + case LE_KART_INFO: handleKartInfo(event); break; + case LE_CLIENT_BACK_LOBBY: clientInGameWantsToBackLobby(event); break; + default: + Log::error("ServerLobby", "Unknown message of type %d - ignored.", message_type); break; } // switch message_type @@ -340,186 +342,19 @@ bool ServerLobby::notifyEvent(Event* event) //----------------------------------------------------------------------------- void ServerLobby::handleChat(Event* event) { - if (!checkDataSize(event, 1) || !getSettings()->getChat()) return; - - // Update so that the peer is not kicked - event->getPeer()->updateLastActivity(); - const bool sender_in_game = event->getPeer()->isWaitingForGame(); - - int64_t last_message = event->getPeer()->getLastMessage(); - int64_t elapsed_time = (int64_t)StkTime::getMonoTimeMs() - last_message; - - // Read ServerConfig for formula and details - if (getSettings()->getChatConsecutiveInterval() > 0 && - elapsed_time < getSettings()->getChatConsecutiveInterval() * 1000) - event->getPeer()->updateConsecutiveMessages(true); - else - event->getPeer()->updateConsecutiveMessages(false); + if (!checkDataSize(event, 1) || !getChatManager()->getChat()) return; - if (getSettings()->getChatConsecutiveInterval() > 0 && - event->getPeer()->getConsecutiveMessages() > - getSettings()->getChatConsecutiveInterval() / 2) - { - std::string msg = "Spam detected"; - sendStringToPeer(msg, event->getPeerSP()); - return; - } + auto peer = event->getPeerSP(); core::stringw message; event->data().decodeString16(&message, 360/*max_len*/); - // Check if the message starts with "(the name of main profile): " to prevent - // impersonation, see #5121. - std::string message_utf8 = StringUtils::wideToUtf8(message); - std::string prefix = StringUtils::wideToUtf8( - event->getPeer()->getPlayerProfiles()[0]->getName()) + ": "; - - if (!StringUtils::startsWith(message_utf8, prefix)) - { - std::string warn = "Don't try to impersonate others!"; - sendStringToPeer(warn, event->getPeerSP()); - return; - } - KartTeam target_team = KART_TEAM_NONE; if (event->data().size() > 0) target_team = (KartTeam)event->data().getUInt8(); - if (message.size() > 0) - { - bool add_red_emoji = false; - bool add_blue_emoji = false; - // Red or blue square emoji - if (target_team == KART_TEAM_RED) - add_red_emoji = true; - else if (target_team == KART_TEAM_BLUE) - add_blue_emoji = true; - - NetworkString* chat = getNetworkString(); - chat->setSynchronous(true); - const bool game_started = m_state.load() != WAITING_FOR_START_GAME; - std::shared_ptr sender = event->getPeerSP(); - auto can_receive = getSettings()->getMessageReceiversFor(sender); - if (!can_receive.empty()) - message = StringUtils::utf32ToWide({0x1f512, 0x20}) + message; - bool team_speak = getSettings()->isTeamSpeaker(sender); - team_speak &= ( - RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_SOCCER || - RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_CAPTURE_THE_FLAG - ); - std::set teams; - for (auto& profile: sender->getPlayerProfiles()) - teams.insert(profile->getTeam()); - if (team_speak) - { - for (auto &team: teams) - { - if (team == KART_TEAM_RED) - add_red_emoji = true; - else if (team == KART_TEAM_BLUE) - add_blue_emoji = true; - } - } - if (add_blue_emoji) - message = StringUtils::utf32ToWide({0x1f7e6, 0x20}) + message; - if (add_red_emoji) - message = StringUtils::utf32ToWide({0x1f7e5, 0x20}) + message; - bool tournament_limit = false; - if (isTournament()) - tournament_limit = !getTournament()->checkSenderInRefsOrPlayers(sender); - std::set sees_teamchats; - if (isTournament()) - sees_teamchats = getTournament()->getThoseWhoSeeTeamchats(); - - // Note that mutealls are still spectators - std::set important_players; - if (getTournament() && tournament_limit) - { - important_players = getTournament()->getImportantChatPlayers(); - } - chat->addUInt8(LE_CHAT).encodeString16(message); - core::stringw sender_name = - event->getPeer()->getPlayerProfiles()[0]->getName(); - - STKHost::get()->sendPacketToAllPeersWith( - [game_started, sender_in_game, target_team, can_receive, - sender, team_speak, teams, tournament_limit, - important_players, sender_name, sees_teamchats, this](std::shared_ptr p) - { - if (sender == p) - return true; - if (game_started) - { - if (p->isWaitingForGame() && !sender_in_game) - return false; - if (!p->isWaitingForGame() && sender_in_game) - return false; - if (tournament_limit) - { - bool all_are_important = true; - for (auto& player : p->getPlayerProfiles()) - { - std::string name = StringUtils::wideToUtf8( - player->getName()); - if (important_players.count(name) == 0) - { - all_are_important = false; - break; - } - } - if (all_are_important) - return false; - } - if (target_team != KART_TEAM_NONE) - { - if (p->isSpectator()) - return false; - bool someone_good = false; - for (auto& player : p->getPlayerProfiles()) - { - if (player->getTeam() == target_team) - someone_good = true; - std::string name = StringUtils::wideToUtf8( - player->getName()); - if (sees_teamchats.count(name)) - someone_good = true; - } - if (!someone_good) - return false; - } - } - if (getSettings()->isMuting(p, sender_name)) - return false; - if (team_speak) - { - bool someone_good = false; - for (auto& profile: p->getPlayerProfiles()) - { - if (teams.count(profile->getTeam()) > 0) - someone_good = true; - std::string name = StringUtils::wideToUtf8( - profile->getName()); - if (sees_teamchats.count(name)) - someone_good = true; - } - if (!someone_good) - return false; - } - if (can_receive.empty()) - return true; - for (auto& profile : p->getPlayerProfiles()) - { - if (can_receive.find(profile->getName()) != - can_receive.end()) - { - return true; - } - } - return false; - }, chat); - event->getPeer()->updateLastMessage(); - delete chat; - } + getChatManager()->handleNormalChatMessage(peer, + StringUtils::wideToUtf8(message), target_team); } // handleChat //----------------------------------------------------------------------------- @@ -567,9 +402,7 @@ void ServerLobby::kickHost(Event* event) return; if (!getSettings()->getKicksAllowed()) { - std::string msg = "Kicking players is not allowed on this server"; - auto crown = event->getPeerSP(); - sendStringToPeer(msg, crown); + sendStringToPeer(event->getPeerSP(), "Kicking players is not allowed on this server"); return; } if (!checkDataSize(event, 4)) return; @@ -581,10 +414,8 @@ void ServerLobby::kickHost(Event* event) { if (peer->isAngryHost()) { - std::string msg = "This player is the owner of this server, " - "and is protected from your actions now"; - auto crown = event->getPeerSP(); - sendStringToPeer(msg, crown); + sendStringToPeer(event->getPeerSP(), "This player is the owner of this server, " + "and is protected from your actions now"); return; } if (!peer->hasPlayerProfiles()) @@ -797,7 +628,7 @@ void ServerLobby::asynchronousUpdate() m_rs_state.store(RS_NONE); } - getSettings()->clearAllExpiredWeakPtrs(); + getChatManager()->clearAllExpiredWeakPtrs(); #ifdef ENABLE_SQLITE3 pollDatabase(); @@ -1642,15 +1473,14 @@ void ServerLobby::update(int ticks) break; case 1: { - std::string msg = getSettings()->getTrollWarnMsg(); - sendStringToPeer(msg, peer); - std::string player_name = StringUtils::wideToUtf8(peer->getPlayerProfiles()[0]->getName()); + sendStringToPeer(peer, getSettings()->getTrollWarnMsg()); + std::string player_name = peer->getMainName(); Log::info("ServerLobby-AntiTroll", "Sent WARNING to %s", player_name.c_str()); break; } default: { - std::string player_name = StringUtils::wideToUtf8(peer->getPlayerProfiles()[0]->getName()); + std::string player_name = peer->getMainName(); Log::info("ServerLobby-AntiTroll", "KICKING %s", player_name.c_str()); peer->kick(); break; @@ -1676,8 +1506,7 @@ void ServerLobby::update(int ticks) continue; std::string peer_name = ""; if (peer->hasPlayerProfiles()) - peer_name = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()).c_str(); + peer_name = peer->getMainName().c_str(); Log::info("ServerLobby", "%s %s has been idle on the server for " "more than %d seconds, kick.", peer->getAddress().toString().c_str(), peer_name.c_str(), sec); @@ -1943,14 +1772,12 @@ void ServerLobby::startSelection(const Event *event) { if (!getSettings()->isAllowedToStart()) { - std::string msg = "Starting the game is forbidden by server owner"; - sendStringToPeer(msg, peer); + sendStringToPeer(peer, "Starting the game is forbidden by server owner"); return; } if (!canRace(peer)) { - std::string msg = "You cannot play so pressing ready has no action"; - sendStringToPeer(msg, peer); + sendStringToPeer(peer, "You cannot play so pressing ready has no action"); return; } else @@ -1963,8 +1790,7 @@ void ServerLobby::startSelection(const Event *event) } if (!getSettings()->isAllowedToStart()) { - std::string msg = "Starting the game is forbidden by server owner"; - sendStringToPeer(msg, peer); + sendStringToPeer(peer, "Starting the game is forbidden by server owner"); return; } if (!hasHostRights(peer)) @@ -2062,8 +1888,7 @@ void ServerLobby::startSelection(const Event *event) // inside if to not produce log spam for ownerless Log::warn("ServerLobby", "An attempt to start a game while no one can play."); - std::string msg = "No one can play!"; - sendStringToPeer(msg, event->getPeerSP()); + sendStringToPeer(event->getPeerSP(), "No one can play!"); } addWaitingPlayersToGame(); return; @@ -2128,8 +1953,6 @@ void ServerLobby::startSelection(const Event *event) startVotingPeriod(getSettings()->getVotingTimeout()); - std::string ignored_choice_string = "The server will ignore your kart choice"; - peers = STKHost::get()->getPeers(); for (auto& peer: peers) { @@ -2150,9 +1973,9 @@ void ServerLobby::startSelection(const Event *event) std::set all_k = peer->getClientAssets().first; - std::string username = StringUtils::wideToUtf8(peer->getPlayerProfiles()[0]->getName()); + std::string username = peer->getMainName(); // std::string username = StringUtils::wideToUtf8(profile->getName()); - applyAllKartFilters(username, all_k); + getAssetManager()->applyAllKartFilters(username, all_k); if (!getKartElimination()->getRemainingParticipants().empty() && getKartElimination()->getRemainingParticipants().count(username) == 0) { @@ -2168,7 +1991,7 @@ void ServerLobby::startSelection(const Event *event) delete ns; if (getQueues()->areKartFiltersIgnoringKarts()) - sendStringToPeer(ignored_choice_string, peer); + sendStringToPeer(peer, "The server will ignore your kart choice"); } m_state = SELECTING; @@ -2407,7 +2230,7 @@ void ServerLobby::checkRaceFinished() } m_state.store(WAIT_FOR_RACE_STOPPED); - m_map_history.push_back(RaceManager::get()->getTrackName()); + getAssetManager()->gameFinishedOn(RaceManager::get()->getTrackName()); getQueues()->popOnRaceFinished(); } // checkRaceFinished @@ -2474,7 +2297,7 @@ void ServerLobby::clientDisconnected(Event* event) World* w = World::getWorld(); std::shared_ptr peer = event->getPeerSP(); - getSettings()->onPeerDisconnect(peer); + getChatManager()->onPeerDisconnect(peer); // No warnings otherwise, as it could happen during lobby period if (w && m_game_info) saveDisconnectingPeerInfo(peer); @@ -2562,8 +2385,7 @@ bool ServerLobby::handleAssets(const NetworkString& ns, std::shared_ptr { if (peer->isValidated()) { - std::string msg = "You deleted some assets that are required to stay on the server"; - sendStringToPeer(msg, peer); + sendStringToPeer(peer, "You deleted some assets that are required to stay on the server"); peer->kick(); } else @@ -2963,7 +2785,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, message_ack->addFloat(auto_start_timer) .addUInt32(getSettings()->getStateFrequency()) - .addUInt8(getSettings()->getChat() ? 1 : 0) + .addUInt8(getChatManager()->getChat() ? 1 : 0) .addUInt8(playerReportsTableExists() ? 1 : 0); peer->setSpectator(false); @@ -3065,7 +2887,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, msg = "Recording ghost replays is disabled. " "The crowned player can change that " "using /replay 0 (to disable) or /replay 1 (to enable). "; - sendStringToPeer(msg, peer); + sendStringToPeer(peer, msg); } getMessagesFromHost(peer, online_id); @@ -3774,9 +3596,8 @@ void ServerLobby::getMessagesFromHost(std::shared_ptr peer, int online_ for (const auto& message: messages) { Log::info("ServerLobby", "A message from server was delivered"); - std::string msg = "A message from the server (" + - std::string(message.timestamp) + "):\n" + std::string(message.message); - sendStringToPeer(msg, peer); + sendStringToPeer(peer, "A message from the server (" + + std::string(message.timestamp) + "):\n" + std::string(message.message)); m_db_connector->deleteServerMessage(message.row_id); } #endif @@ -3911,7 +3732,7 @@ void ServerLobby::handleServerConfiguration(std::shared_ptr peer, msg = "This mode is not permitted on this server"; else msg = "This difficulty is not permitted on this server"; - sendStringToPeer(msg, peer); + sendStringToPeer(peer, msg); return; } auto modes = ServerConfig::getLocalGameMode(mode); @@ -4009,13 +3830,7 @@ void ServerLobby::handleServerConfiguration(std::shared_ptr peer, RaceManager::get()->getMinorMode() != RaceManager::MINOR_MODE_TIME_TRIAL) { getKartElimination()->disable(); - NetworkString* chat = getNetworkString(); - chat->addUInt8(LE_CHAT); - chat->setSynchronous(true); - chat->encodeString16( - L"Gnu Elimination is disabled because of non-racing mode"); - sendMessageToPeers(chat); - delete chat; + sendStringToAllPeers("Gnu Elimination is disabled because of non-racing mode"); } } // handleServerConfiguration //----------------------------------------------------------------------------- @@ -4907,7 +4722,8 @@ void ServerLobby::changeColors() updatePlayerList(); } // changeColors //----------------------------------------------------------------------------- -void ServerLobby::sendStringToPeer(std::string& s, std::shared_ptr peer) + +void ServerLobby::sendStringToPeer(std::shared_ptr peer, const std::string& s) { if (!peer) { @@ -4922,7 +4738,8 @@ void ServerLobby::sendStringToPeer(std::string& s, std::shared_ptr peer delete chat; } // sendStringToPeer //----------------------------------------------------------------------------- -void ServerLobby::sendStringToAllPeers(std::string& s) + +void ServerLobby::sendStringToAllPeers(const std::string& s) { NetworkString* chat = getNetworkString(); chat->addUInt8(LE_CHAT); @@ -4932,6 +4749,7 @@ void ServerLobby::sendStringToAllPeers(std::string& s) delete chat; } // sendStringToAllPeers //----------------------------------------------------------------------------- + bool ServerLobby::canRace(std::shared_ptr peer) { auto it = m_why_peer_cannot_play.find(peer); @@ -4943,8 +4761,7 @@ bool ServerLobby::canRace(std::shared_ptr peer) m_why_peer_cannot_play[peer] = HR_ABSENT_PEER; return false; } - std::string username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string username = peer->getMainName(); if (getTournament() && !getTournament()->canPlay(username)) { m_why_peer_cannot_play[peer] = HR_NOT_A_TOURNAMENT_PLAYER; @@ -5000,8 +4817,8 @@ bool ServerLobby::canRace(std::shared_ptr peer) return false; } - applyAllFilters(maps, true); - applyAllKartFilters(username, karts, false); + getAssetManager()->applyAllFilters(maps, true); + getAssetManager()->applyAllKartFilters(username, karts, false); if (karts.empty()) { @@ -5291,64 +5108,10 @@ void ServerLobby::resetGrandPrix() } // resetGrandPrix //----------------------------------------------------------------------------- -void ServerLobby::applyAllFilters(std::set& maps, bool use_history) const -{ - unsigned max_player = 0; - STKHost::get()->updatePlayers(&max_player); - if (RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_FREE_FOR_ALL) - { - auto it = maps.begin(); - while (it != maps.end()) - { - Track* t = TrackManager::get()->getTrack(*it); - if (t && t->getMaxArenaPlayers() < max_player) - { - it = maps.erase(it); - } - else - it++; - } - } - - // Please note that use_history refers to using queue filters too - - // calls with false only get map sets, etc - FilterContext map_context; - map_context.username = ""; // unused - map_context.num_players = max_player; - map_context.wildcards = m_map_history; - map_context.applied_at_selection_start = true; - map_context.elements = maps; - getSettings()->applyGlobalFilter(map_context); - - if (use_history) - { - if (isTournament()) - getTournament()->applyFiltersForThisGame(map_context); - map_context.wildcards = m_map_history; - getQueues()->applyFrontMapFilters(map_context); - } - swap(maps, map_context.elements); -} // applyAllFilters -//----------------------------------------------------------------------------- - -void ServerLobby::applyAllKartFilters(const std::string& username, std::set& karts, bool afterSelection) const -{ - FilterContext kart_context; - kart_context.username = username; - kart_context.num_players = 0; // unused - kart_context.wildcards = {}; // unused - kart_context.applied_at_selection_start = !afterSelection; - kart_context.elements = karts; - - getSettings()->applyGlobalKartsFilter(kart_context); - getQueues()->applyFrontKartFilters(kart_context); - swap(karts, kart_context.elements); -} // applyAllKartFilters -//----------------------------------------------------------------------------- std::string ServerLobby::getKartForBadKartChoice(std::shared_ptr peer, const std::string& username, const std::string& check_choice) const { std::set karts = (peer->isAIPeer() ? getAssetManager()->getAvailableKarts() : peer->getClientAssets().first); - applyAllKartFilters(username, karts, true); + getAssetManager()->applyAllKartFilters(username, karts, true); if (getKartElimination()->isEliminated(username) && karts.count(getKartElimination()->getKart())) { diff --git a/src/network/protocols/server_lobby.hpp b/src/network/protocols/server_lobby.hpp index cc697015374..4382e0987b1 100644 --- a/src/network/protocols/server_lobby.hpp +++ b/src/network/protocols/server_lobby.hpp @@ -210,8 +210,6 @@ class ServerLobby : public LobbyProtocol, public LobbyContextUser std::set m_temp_banned; - std::vector m_map_history; - std::map m_gp_scores; std::map m_gp_team_scores; @@ -359,8 +357,10 @@ class ServerLobby : public LobbyProtocol, public LobbyContextUser const std::string& info); // int getTrackMaxPlayers(std::string& name) const; void updateGnuElimination(); - void sendStringToPeer(std::string& s, std::shared_ptr peer); - void sendStringToAllPeers(std::string& s); + + void sendStringToPeer(std::shared_ptr peer, const std::string& s); + void sendStringToAllPeers(const std::string& s); + int getPermissions(std::shared_ptr peer) const; bool isSoccerGoalTarget() const; @@ -375,8 +375,6 @@ class ServerLobby : public LobbyProtocol, public LobbyContextUser void resetGrandPrix(); void erasePeerReady(std::shared_ptr peer) { m_peers_ready.erase(peer); } - void applyAllFilters(std::set& maps, bool use_history) const; - void applyAllKartFilters(const std::string& username, std::set& karts, bool afterSelection = false) const; bool areKartFiltersIgnoringKarts() const; std::string getKartForBadKartChoice(std::shared_ptr peer, const std::string& username, const std::string& check_choice) const; void setKartDataProperly(KartData& kart_data, const std::string& kart_name, diff --git a/src/network/remote_kart_info.hpp b/src/network/remote_kart_info.hpp index 829ace8d4a2..f7c1e936c87 100644 --- a/src/network/remote_kart_info.hpp +++ b/src/network/remote_kart_info.hpp @@ -38,6 +38,18 @@ enum KartTeam : int8_t KART_TEAM_BLUE=1, }; +struct KartTeamSet +{ + int state; + KartTeamSet(int x = 0): state(x) {} + KartTeamSet add (KartTeam team) const { return KartTeamSet(state | (1 << (team + 1))); } + KartTeamSet remove (KartTeam team) const { return KartTeamSet(state & ~(1 << (team + 1))); } + KartTeamSet flip (KartTeam team) const { return KartTeamSet(state ^ (1 << (team + 1))); } + bool has (KartTeam team) const { return ((state >> (team + 1)) & 1); } + KartTeamSet intersect (KartTeamSet rhs) const { return KartTeamSet(state & rhs.state); } + bool empty () const { return state == 0; } +}; + /** Handicap per player. */ enum HandicapLevel : uint8_t { diff --git a/src/network/stk_host.cpp b/src/network/stk_host.cpp index 9808b10deee..60ee0b5b058 100644 --- a/src/network/stk_host.cpp +++ b/src/network/stk_host.cpp @@ -896,8 +896,7 @@ void STKHost::mainLoop(ProcessType pt) std::string player_name; if (!p.second->getPlayerProfiles().empty()) { - player_name = StringUtils::wideToUtf8 - (p.second->getPlayerProfiles()[0]->getName()); + player_name = p.second->getMainName(); } const bool peer_not_in_game = sl->getCurrentState() <= ServerLobby::SELECTING diff --git a/src/network/stk_peer.cpp b/src/network/stk_peer.cpp index 146fe8bfa03..5032ecde567 100644 --- a/src/network/stk_peer.cpp +++ b/src/network/stk_peer.cpp @@ -23,6 +23,7 @@ #include "network/event.hpp" #include "network/network.hpp" #include "network/network_config.hpp" +#include "network/network_player_profile.hpp" #include "network/network_string.hpp" #include "network/socket_address.hpp" #include "network/stk_ipv6.hpp" @@ -188,9 +189,23 @@ uint32_t STKPeer::getPing() } return m_enet_peer->roundTripTime; } // getPing - //----------------------------------------------------------------------------- + void STKPeer::setCrypto(std::unique_ptr&& c) { m_crypto = std::move(c); } // setCrypto +// ---------------------------------------------------------------------------- + +// A method for convenience only. +// For now, returns an empty string if there are no profiles. +// Might be better to throw an exception. I will see later. +// For now, make sure there are profiles before calling. +std::string STKPeer::getMainName() const +{ + if (m_players.empty()) + return ""; + + return StringUtils::wideToUtf8(m_players[0]->getName()); +} // getMainName +// ------------------------------------------------------------------------ \ No newline at end of file diff --git a/src/network/stk_peer.hpp b/src/network/stk_peer.hpp index aabe28aaf5f..97a0a3f4c1a 100644 --- a/src/network/stk_peer.hpp +++ b/src/network/stk_peer.hpp @@ -383,6 +383,8 @@ class STKPeer : public NoCopy // ------------------------------------------------------------------------ void setAngryHost(bool val) { m_angry_host.store(val); } // ------------------------------------------------------------------------ + std::string getMainName() const; + // ------------------------------------------------------------------------ }; // STKPeer #endif // STK_PEER_HPP diff --git a/src/utils/chat_manager.cpp b/src/utils/chat_manager.cpp new file mode 100644 index 00000000000..644f7b9728d --- /dev/null +++ b/src/utils/chat_manager.cpp @@ -0,0 +1,318 @@ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2025 kimden +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "utils/chat_manager.hpp" + +#include "network/server_config.hpp" +#include "utils/string_utils.hpp" +#include "utils/tournament.hpp" +#include "network/protocols/server_lobby.hpp" +#include "utils/string_utils.hpp" +#include "network/stk_peer.hpp" +#include "network/network_player_profile.hpp" +#include "network/network_string.hpp" +#include "network/stk_host.hpp" +#include "network/remote_kart_info.hpp" + +namespace +{ + const std::string g_red_team = StringUtils::utf32ToUtf8({0x1f7e5, 0x20}); + const std::string g_blue_team = StringUtils::utf32ToUtf8({0x1f7e6, 0x20}); + const std::string g_private_chat = StringUtils::utf32ToUtf8({0x1f512, 0x20}); +}; + + +void ChatManager::setupContextUser() +{ + m_chat = ServerConfig::m_chat; + m_chat_consecutive_interval = ServerConfig::m_chat_consecutive_interval; +} // setupContextUser +//----------------------------------------------------------------------------- + +void ChatManager::addMutedPlayerFor(std::shared_ptr peer, + const std::string& name) +{ + m_peers_muted_players[std::weak_ptr(peer)].insert(name); +} // addMutedPlayerFor +//----------------------------------------------------------------------------- + +bool ChatManager::removeMutedPlayerFor(std::shared_ptr peer, + const std::string& name) +{ + // I'm not sure why the implementation was so long + auto& collection = m_peers_muted_players[std::weak_ptr(peer)]; + for (auto it = collection.begin(); it != collection.end(); ) + { + if (*it == name) + { + it = collection.erase(it); + return true; + } + else + it++; + } + return false; +} // removeMutedPlayerFor +//----------------------------------------------------------------------------- + +bool ChatManager::isMuting(std::shared_ptr peer, + const std::string& name) const +{ + auto it = m_peers_muted_players.find(std::weak_ptr(peer)); + if (it == m_peers_muted_players.end()) + return false; + + return it->second.find(name) != it->second.end(); +} // isMuting +//----------------------------------------------------------------------------- + +std::string ChatManager::getMutedPlayersAsString(std::shared_ptr peer) +{ + std::string response; + int num_players = 0; + for (auto& name : m_peers_muted_players[std::weak_ptr(peer)]) + { + response += name; + response += " "; + ++num_players; + } + if (num_players == 0) + response = "No player has been muted by you"; + else + { + response += (num_players == 1 ? "is" : "are"); + response += StringUtils::insertValues(" muted (total: %s)", num_players); + } + return response; +} // getMutedPlayersAsString +//----------------------------------------------------------------------------- + +void ChatManager::addTeamSpeaker(std::shared_ptr peer) +{ + m_team_speakers.insert(peer); +} // addTeamSpeaker +//----------------------------------------------------------------------------- + +void ChatManager::setMessageReceiversFor(std::shared_ptr peer, + const std::vector& receivers) +{ + auto& thing = m_message_receivers[peer]; + thing.clear(); + for (unsigned i = 0; i < receivers.size(); ++i) + thing.insert(receivers[i]); +} // setMessageReceiversFor +//----------------------------------------------------------------------------- + +std::set ChatManager::getMessageReceiversFor( + std::shared_ptr peer) const +{ + auto it = m_message_receivers.find(peer); + if (it == m_message_receivers.end()) + return {}; + + return it->second; +} // getMessageReceiversFor +//----------------------------------------------------------------------------- + +bool ChatManager::isTeamSpeaker(std::shared_ptr peer) const +{ + return m_team_speakers.find(peer) != m_team_speakers.end(); +} // isTeamSpeaker +//----------------------------------------------------------------------------- + +void ChatManager::makeChatPublicFor(std::shared_ptr peer) +{ + m_message_receivers[peer].clear(); + m_team_speakers.erase(peer); +} // makeChatPublicFor +//----------------------------------------------------------------------------- + +void ChatManager::clearAllExpiredWeakPtrs() +{ + for (auto it = m_peers_muted_players.begin(); + it != m_peers_muted_players.end();) + { + if (it->first.expired()) + it = m_peers_muted_players.erase(it); + else + it++; + } +} // clearAllExpiredWeakPtrs +//----------------------------------------------------------------------------- + +void ChatManager::onPeerDisconnect(std::shared_ptr peer) +{ + m_message_receivers.erase(peer); +} // onPeerDisconnect +//----------------------------------------------------------------------------- + +void ChatManager::handleNormalChatMessage(std::shared_ptr peer, + std::string message, KartTeam target_team) +{ + // Update so that the peer is not kicked + peer->updateLastActivity(); + + int64_t last_message = peer->getLastMessage(); + int64_t elapsed_time = (int64_t)StkTime::getMonoTimeMs() - last_message; + + int interval = getChatConsecutiveInterval(); + + + // Read ServerConfig for formula and details + bool too_fast = interval > 0 && elapsed_time < interval * 1000; + peer->updateConsecutiveMessages(too_fast); + + if (interval > 0 && peer->getConsecutiveMessages() > interval / 2) + { + getLobby()->sendStringToPeer(peer, "Spam detected"); + return; + } + + + // Check if the message starts with "(the name of main profile): " to prevent + // impersonation, see #5121. + std::string prefix = peer->getMainName() + ": "; + + if (!StringUtils::startsWith(message, prefix)) + { + getLobby()->sendStringToPeer(peer, "Don't try to impersonate others!"); + return; + } + + if (message.size() == 0) + return; + + const bool game_started = !getLobby()->isWaitingForStartGame(); + auto can_receive = getMessageReceiversFor(peer); + if (!can_receive.empty()) + message = g_private_chat + message; + + bool team_mode = ( + RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_SOCCER || + RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_CAPTURE_THE_FLAG + ); + + bool team_speaker = isTeamSpeaker(peer); + KartTeamSet teams = getTeamsForPeer(peer); + + // Add team emojis + if (target_team == KART_TEAM_RED || (team_speaker && team_mode && teams.has(KART_TEAM_RED))) + message = g_red_team + message; + + if (target_team == KART_TEAM_BLUE || (team_speaker && team_mode && teams.has(KART_TEAM_BLUE))) + message = g_blue_team + message; + + NetworkString* chat = getLobby()->getNetworkString(); + chat->setSynchronous(true); + chat->addUInt8(getLobby()->LE_CHAT).encodeString16(StringUtils::utf8ToWide(message)); + + STKHost::get()->sendPacketToAllPeersWith( + std::bind(&ChatManager::shouldMessageBeSent, + this, + peer, + std::placeholders::_1, + game_started, + target_team + ), chat + ); + delete chat; + + peer->updateLastMessage(); +} // handleNormalChatMessage +//----------------------------------------------------------------------------- + +bool ChatManager::shouldMessageBeSent(std::shared_ptr sender, + std::shared_ptr target, + bool game_started, + KartTeam target_team) +{ + if (sender == target) + return true; + if (game_started) + { + if (target->isWaitingForGame() ^ sender->isWaitingForGame()) + return false; + + if (target_team != KART_TEAM_NONE) + { + if (target->isSpectator()) + return false; + } + + if (isTournament()) + { + auto tournament = getTournament(); + if (tournament->cannotSendForSureDueToRoles(sender, target)) + return false; + + if (target_team != KART_TEAM_NONE) + { + if (!tournament->hasProfileThatSeesTeamchats(target) && + !tournament->hasProfileFromTeam(target, target_team)) + return false; + } + } + } + if (isMuting(target, sender->getMainName())) + return false; + + if (isTeamSpeaker(sender)) + { + // this should be moved into a new function for peer, + // unless all profiles have the same team forcibly rn + bool someone_good = !(getTeamsForPeer(sender).intersect(getTeamsForPeer(target))).empty(); + if (!someone_good && (!isTournament() || !getTournament()->hasProfileThatSeesTeamchats(target))) + return false; + } + return isInPrivateChatRecipients(sender, target); +} // lambda +//----------------------------------------------------------------------------- + +// Should be called not once per message. Fix later +KartTeamSet ChatManager::getTeamsForPeer(std::shared_ptr peer) const +{ + KartTeamSet teams; + + for (auto& profile: peer->getPlayerProfiles()) + teams.add(profile->getTeam()); + + return teams; +} // getTeamsForPeer +//----------------------------------------------------------------------------- + +bool ChatManager::isInPrivateChatRecipients(std::shared_ptr sender, + std::shared_ptr target) const +{ + // shouldn't be called every time, fix later + std::set can_receive = getMessageReceiversFor(sender); + + // If no private chat enabled, send + if (can_receive.empty()) + return true; + + for (auto& profile : target->getPlayerProfiles()) + { + if (can_receive.find(StringUtils::wideToUtf8(profile->getName())) != + can_receive.end()) + { + return true; + } + } + return false; +} // isInPrivateChatRecipients +//----------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/utils/chat_manager.hpp b/src/utils/chat_manager.hpp new file mode 100644 index 00000000000..77350d4c89c --- /dev/null +++ b/src/utils/chat_manager.hpp @@ -0,0 +1,92 @@ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2025 kimden +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef CHAT_MANAGER_HPP +#define CHAT_MANAGER_HPP + +#include "irrString.h" +#include "utils/lobby_context.hpp" +#include "utils/types.hpp" + +#include +#include +#include + +class STKPeer; +enum KartTeam : int8_t; +struct KartTeamSet; + +class ChatManager: public LobbyContextComponent +{ +public: + ChatManager(LobbyContext* context): LobbyContextComponent(context) {} + + void setupContextUser() OVERRIDE; + +private: + std::map, std::set, + std::owner_less > > m_peers_muted_players; + + std::map, std::set> m_message_receivers; + + std::set> m_team_speakers; + + bool m_chat; + + int m_chat_consecutive_interval; + +public: + void addMutedPlayerFor(std::shared_ptr peer, + const std::string& name); + + bool removeMutedPlayerFor(std::shared_ptr peer, + const std::string& name); + + bool isMuting(std::shared_ptr peer, + const std::string& name) const; + + std::string getMutedPlayersAsString(std::shared_ptr peer); + void addTeamSpeaker(std::shared_ptr peer); + + void setMessageReceiversFor(std::shared_ptr peer, + const std::vector& receivers); + + std::set getMessageReceiversFor( + std::shared_ptr peer) const; + + bool isTeamSpeaker(std::shared_ptr peer) const; + void makeChatPublicFor(std::shared_ptr peer); + void clearAllExpiredWeakPtrs(); + void onPeerDisconnect(std::shared_ptr peer); + bool getChat() const { return m_chat; } + int getChatConsecutiveInterval() const { return m_chat_consecutive_interval; } + + void handleNormalChatMessage(std::shared_ptr peer, + std::string message, KartTeam target_team); + + bool shouldMessageBeSent(std::shared_ptr sender, + std::shared_ptr target, + bool game_started, + KartTeam target_team); + + KartTeamSet getTeamsForPeer(std::shared_ptr peer) const; + bool isInPrivateChatRecipients(std::shared_ptr sender, + std::shared_ptr target) const; +}; + +#endif // CHAT_MANAGER_HPP \ No newline at end of file diff --git a/src/utils/hit_processor.cpp b/src/utils/hit_processor.cpp index 5dfe85b2231..4944817c8ab 100644 --- a/src/utils/hit_processor.cpp +++ b/src/utils/hit_processor.cpp @@ -38,6 +38,8 @@ namespace return kart->getAttachment()->getType(); } + const float g_hit_message_delay = 1.5f; + } // namespace //----------------------------------------------------------------------------- @@ -46,6 +48,7 @@ void HitProcessor::setupContextUser() m_troll_active = ServerConfig::m_troll_active; m_show_hits = ServerConfig::m_show_teammate_hits; m_hit_mode = ServerConfig::m_teammate_hit_mode; + m_message_prefix = ServerConfig::m_teammate_hit_msg_prefix; m_last_hit_msg = 0; m_swatter_punish.clear(); @@ -93,7 +96,7 @@ void HitProcessor::sendTeammateHitMsg(std::string& s) return; int ticks = w->getTicksSinceStart(); - if (ticks - m_last_hit_msg > stk_config->time2Ticks(1.5f)) + if (ticks - m_last_hit_msg > stk_config->time2Ticks(g_hit_message_delay)) { m_last_hit_msg = ticks; getLobby()->sendStringToAllPeers(s); @@ -134,7 +137,7 @@ void HitProcessor::processHitMessage(const std::string& owner_name, int owner_te { // prepare string int num_victims = 0; - std::string msg = ServerConfig::m_teammate_hit_msg_prefix; + std::string msg = m_message_prefix; std::string victims; msg += owner_name; msg += " just shot "; @@ -239,7 +242,7 @@ void HitProcessor::handleSwatterHit(unsigned int ownerID, unsigned int victimID, { std::string msg = StringUtils::insertValues( "%s%s just swattered teammate %s", - std::string(ServerConfig::m_teammate_hit_msg_prefix).c_str(), + m_message_prefix.c_str(), owner_name.c_str(), victim_name.c_str() ); @@ -285,7 +288,7 @@ void HitProcessor::handleAnvilHit(unsigned int ownerID, unsigned int victimID) { std::string msg = StringUtils::insertValues( "%s%s just gave an anchor to teammate %s", - std::string(ServerConfig::m_teammate_hit_msg_prefix).c_str(), + m_message_prefix.c_str(), owner_name.c_str(), victim_name.c_str() ); diff --git a/src/utils/hit_processor.hpp b/src/utils/hit_processor.hpp index 333aaa7e8aa..5fef119c358 100644 --- a/src/utils/hit_processor.hpp +++ b/src/utils/hit_processor.hpp @@ -51,6 +51,8 @@ class HitProcessor: public LobbyContextComponent bool m_show_hits; // Whether to show messages about team hits. bool m_hit_mode; // Whether to anvil the team hitters. + + std::string m_message_prefix; int m_last_hit_msg; // Last tick when the message was shown. diff --git a/src/utils/lobby_asset_manager.cpp b/src/utils/lobby_asset_manager.cpp index 19ec4c20897..dc94a1aa387 100644 --- a/src/utils/lobby_asset_manager.cpp +++ b/src/utils/lobby_asset_manager.cpp @@ -24,12 +24,16 @@ #include "network/network_string.hpp" #include "network/protocols/server_lobby.hpp" #include "network/server_config.hpp" +#include "network/stk_host.hpp" #include "network/stk_peer.hpp" #include "tracks/track.hpp" #include "tracks/track_manager.hpp" -#include "utils/random_generator.hpp" +#include "utils/lobby_queues.hpp" #include "utils/lobby_settings.hpp" +#include "utils/random_generator.hpp" #include "utils/string_utils.hpp" +#include "utils/tournament.hpp" + void LobbyAssetManager::setupContextUser() { @@ -245,7 +249,7 @@ void LobbyAssetManager::eraseAssetsWithPeers( bool LobbyAssetManager::tryApplyingMapFilters() { std::set available_tracks_fallback = m_available_kts.second; - getLobby()->applyAllFilters(m_available_kts.second, true); + applyAllFilters(m_available_kts.second, true); /* auto iter = m_available_kts.second.begin(); while (iter != m_available_kts.second.end()) @@ -344,16 +348,18 @@ bool LobbyAssetManager::handleAssetsForPeer(std::shared_ptr peer, } } + auto settings = getSettings(); + Log::info("LobbyAssetManager", "Player has the following addons: %d/%d(%d) karts," " %d/%d(%d) tracks, %d/%d(%d) arenas, %d/%d(%d) soccer fields.", - addon_karts, (int)ServerConfig::m_addon_karts_join_threshold, - (int)ServerConfig::m_addon_karts_play_threshold, - addon_tracks, (int)ServerConfig::m_addon_tracks_join_threshold, - (int)ServerConfig::m_addon_tracks_play_threshold, - addon_arenas, (int)ServerConfig::m_addon_arenas_join_threshold, - (int)ServerConfig::m_addon_arenas_play_threshold, - addon_soccers, (int)ServerConfig::m_addon_soccers_join_threshold, - (int)ServerConfig::m_addon_soccers_play_threshold); + addon_karts, settings->getAddonKartsJoinThreshold(), + settings->getAddonKartsPlayThreshold(), + addon_tracks, settings->getAddonTracksJoinThreshold(), + settings->getAddonTracksPlayThreshold(), + addon_arenas, settings->getAddonArenasJoinThreshold(), + settings->getAddonArenasPlayThreshold(), + addon_soccers, settings->getAddonSoccersJoinThreshold(), + settings->getAddonSoccersPlayThreshold()); bool bad = false; @@ -386,37 +392,37 @@ bool LobbyAssetManager::handleAssetsForPeer(std::shared_ptr peer, bad = true; } - if (okt < ServerConfig::m_official_karts_threshold) + if (okt < getSettings()->getOfficialKartsThreshold()) { Log::verbose("LobbyAssetManager", "Bad player: bad official kart threshold"); bad = true; } - if (ott < ServerConfig::m_official_tracks_threshold) + if (ott < getSettings()->getOfficialTracksThreshold()) { Log::verbose("LobbyAssetManager", "Bad player: bad official track threshold"); bad = true; } - if (addon_karts < (int)ServerConfig::m_addon_karts_join_threshold) + if (addon_karts < getSettings()->getAddonKartsJoinThreshold()) { Log::verbose("LobbyAssetManager", "Bad player: too little addon karts"); bad = true; } - if (addon_tracks < (int)ServerConfig::m_addon_tracks_join_threshold) + if (addon_tracks < getSettings()->getAddonTracksJoinThreshold()) { Log::verbose("LobbyAssetManager", "Bad player: too little addon tracks"); bad = true; } - if (addon_arenas < (int)ServerConfig::m_addon_arenas_join_threshold) + if (addon_arenas < getSettings()->getAddonArenasJoinThreshold()) { Log::verbose("LobbyAssetManager", "Bad player: too little addon arenas"); bad = true; } - if (addon_soccers < (int)ServerConfig::m_addon_soccers_join_threshold) + if (addon_soccers < getSettings()->getAddonSoccersJoinThreshold()) { Log::verbose("LobbyAssetManager", "Bad player: too little addon soccers"); bad = true; @@ -540,7 +546,7 @@ std::string LobbyAssetManager::getRandomMap() const for (const std::string& s: m_entering_kts.second) { items.insert(s); } - getLobby()->applyAllFilters(items, false); + applyAllFilters(items, false); if (items.empty()) return ""; RandomGenerator rg; @@ -558,7 +564,7 @@ std::string LobbyAssetManager::getRandomAddonMap() const if (t->isAddon()) items.insert(s); } - getLobby()->applyAllFilters(items, false); + applyAllFilters(items, false); if (items.empty()) return ""; RandomGenerator rg; @@ -573,3 +579,64 @@ void LobbyAssetManager::setMustHaveMaps(const std::string& input) m_must_have_maps = StringUtils::split(input, ' ', false); } // setMustHaveMaps //----------------------------------------------------------------------------- + +void LobbyAssetManager::gameFinishedOn(const std::string& map_name) +{ + m_map_history.push_back(map_name); +} // gameFinishedOn +//----------------------------------------------------------------------------- + +void LobbyAssetManager::applyAllFilters(std::set& maps, bool use_history) const +{ + unsigned max_player = 0; + STKHost::get()->updatePlayers(&max_player); + if (RaceManager::get()->getMinorMode() == RaceManager::MINOR_MODE_FREE_FOR_ALL) + { + auto it = maps.begin(); + while (it != maps.end()) + { + Track* t = TrackManager::get()->getTrack(*it); + if (t && t->getMaxArenaPlayers() < max_player) + { + it = maps.erase(it); + } + else + it++; + } + } + + // Please note that use_history refers to using queue filters too - + // calls with false only get map sets, etc + FilterContext map_context; + map_context.username = ""; // unused + map_context.num_players = max_player; + map_context.wildcards = m_map_history; + map_context.applied_at_selection_start = true; + map_context.elements = maps; + getSettings()->applyGlobalFilter(map_context); + + if (use_history) + { + if (isTournament()) + getTournament()->applyFiltersForThisGame(map_context); + map_context.wildcards = m_map_history; + getQueues()->applyFrontMapFilters(map_context); + } + swap(maps, map_context.elements); +} // applyAllFilters +//----------------------------------------------------------------------------- + +void LobbyAssetManager::applyAllKartFilters(const std::string& username, std::set& karts, bool afterSelection) const +{ + FilterContext kart_context; + kart_context.username = username; + kart_context.num_players = 0; // unused + kart_context.wildcards = {}; // unused + kart_context.applied_at_selection_start = !afterSelection; + kart_context.elements = karts; + + getSettings()->applyGlobalKartsFilter(kart_context); + getQueues()->applyFrontKartFilters(kart_context); + swap(karts, kart_context.elements); +} // applyAllKartFilters +//----------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/utils/lobby_asset_manager.hpp b/src/utils/lobby_asset_manager.hpp index 8839a411011..d2e0e7ff3b9 100644 --- a/src/utils/lobby_asset_manager.hpp +++ b/src/utils/lobby_asset_manager.hpp @@ -73,6 +73,11 @@ class LobbyAssetManager: public LobbyContextComponent std::set getAvailableKarts() const { return m_available_kts.first; } void setMustHaveMaps(const std::string& input); + void gameFinishedOn(const std::string& map_name); + + void applyAllFilters(std::set& maps, bool use_history) const; + void applyAllKartFilters(const std::string& username, std::set& karts, bool afterSelection = false) const; + std::set getAddonKarts() const { return m_addon_kts.first; } std::set getAddonTracks() const { return m_addon_kts.second; } @@ -110,6 +115,8 @@ class LobbyAssetManager: public LobbyContextComponent std::pair, std::set > m_entering_kts; std::vector m_must_have_maps; + + std::vector m_map_history; }; #endif // LOBBY_ASSET_MANAGER_HPP diff --git a/src/utils/lobby_context.cpp b/src/utils/lobby_context.cpp index 1a826e87f47..48db3bc2546 100644 --- a/src/utils/lobby_context.cpp +++ b/src/utils/lobby_context.cpp @@ -19,6 +19,7 @@ #include "utils/lobby_context.hpp" #include "network/protocols/command_manager.hpp" +#include "utils/chat_manager.hpp" #include "utils/hit_processor.hpp" #include "utils/kart_elimination.hpp" #include "utils/lobby_asset_manager.hpp" @@ -38,6 +39,7 @@ LobbyContext::LobbyContext(ServerLobby* lobby, bool make_tournament) m_lobby_settings = std::make_shared(this); m_map_vote_handler = std::make_shared(this); m_command_manager = std::make_shared(this); + m_chat_manager = std::make_shared(this); if (make_tournament) m_tournament = std::make_shared(this); @@ -53,9 +55,10 @@ void LobbyContext::setup() m_lobby_queues->setupContextUser(); m_lobby_settings->setupContextUser(); m_map_vote_handler->setupContextUser(); + m_chat_manager->setupContextUser(); m_command_manager->setupContextUser(); if (m_tournament) m_tournament->setupContextUser(); } // setup -//----------------------------------------------------------------------------- \ No newline at end of file +//----------------------------------------------------------------------------- diff --git a/src/utils/lobby_context.hpp b/src/utils/lobby_context.hpp index f83db6888fe..e6c65023d96 100644 --- a/src/utils/lobby_context.hpp +++ b/src/utils/lobby_context.hpp @@ -23,6 +23,7 @@ #include +class ChatManager; class CommandManager; class HitProcessor; class KartElimination; @@ -45,6 +46,7 @@ class LobbyContext std::shared_ptr m_kart_elimination; std::shared_ptr m_map_vote_handler; std::shared_ptr m_command_manager; + std::shared_ptr m_chat_manager; public: @@ -62,6 +64,7 @@ class LobbyContext std::shared_ptr getKartElimination() const { return m_kart_elimination; } std::shared_ptr getMapVoteHandler() const { return m_map_vote_handler; } std::shared_ptr getCommandManager() const { return m_command_manager; } + std::shared_ptr getChatManager() const { return m_chat_manager; } }; class LobbyContextUser @@ -78,6 +81,7 @@ class LobbyContextUser std::shared_ptr getKartElimination() const { return m_context->getKartElimination(); } std::shared_ptr getMapVoteHandler() const { return m_context->getMapVoteHandler(); } std::shared_ptr getCommandManager() const { return m_context->getCommandManager(); } + std::shared_ptr getChatManager() const { return m_context->getChatManager(); } public: void setContext(LobbyContext* context) { m_context = context; } diff --git a/src/utils/lobby_queues.cpp b/src/utils/lobby_queues.cpp index e46314de2b1..839f90baddb 100644 --- a/src/utils/lobby_queues.cpp +++ b/src/utils/lobby_queues.cpp @@ -147,5 +147,5 @@ bool LobbyQueues::areKartFiltersIgnoringKarts() const return true; return false; -} // applyAllKartFilters +} // areKartFiltersIgnoringKarts //----------------------------------------------------------------------------- diff --git a/src/utils/lobby_settings.cpp b/src/utils/lobby_settings.cpp index 10902a51a82..e9f5af7dbf7 100644 --- a/src/utils/lobby_settings.cpp +++ b/src/utils/lobby_settings.cpp @@ -74,15 +74,9 @@ void LobbySettings::setupContextUser() m_live_players = ServerConfig::m_live_players; - m_addon_arenas_play_threshold = ServerConfig::m_addon_arenas_play_threshold; - m_addon_karts_play_threshold = ServerConfig::m_addon_karts_play_threshold; - m_addon_soccers_play_threshold = ServerConfig::m_addon_soccers_play_threshold; - m_addon_tracks_play_threshold = ServerConfig::m_addon_tracks_play_threshold; m_ai_anywhere = ServerConfig::m_ai_anywhere; m_ai_handling = ServerConfig::m_ai_handling; m_capture_limit = ServerConfig::m_capture_limit; - m_chat = ServerConfig::m_chat; - m_chat_consecutive_interval = ServerConfig::m_chat_consecutive_interval; m_expose_mobile = ServerConfig::m_expose_mobile; m_firewalled_server = ServerConfig::m_firewalled_server; m_flag_deactivated_time = ServerConfig::m_flag_deactivated_time; @@ -126,6 +120,18 @@ void LobbySettings::setupContextUser() m_validating_player = ServerConfig::m_validating_player; m_voting_timeout = ServerConfig::m_voting_timeout; m_commands_file = ServerConfig::m_commands_file; + m_addon_karts_join_threshold = ServerConfig::m_addon_karts_join_threshold; + m_addon_tracks_join_threshold = ServerConfig::m_addon_tracks_join_threshold; + m_addon_arenas_join_threshold = ServerConfig::m_addon_arenas_join_threshold; + m_addon_soccers_join_threshold = ServerConfig::m_addon_soccers_join_threshold; + m_addon_arenas_play_threshold = ServerConfig::m_addon_arenas_play_threshold; + m_addon_karts_play_threshold = ServerConfig::m_addon_karts_play_threshold; + m_addon_soccers_play_threshold = ServerConfig::m_addon_soccers_play_threshold; + m_addon_tracks_play_threshold = ServerConfig::m_addon_tracks_play_threshold; + m_power_password = ServerConfig::m_power_password; + m_register_table_name = ServerConfig::m_register_table_name; + m_official_karts_threshold = ServerConfig::m_official_karts_threshold; + m_official_tracks_threshold = ServerConfig::m_official_tracks_threshold; } // setupContextUser //----------------------------------------------------------------------------- @@ -299,104 +305,6 @@ int LobbySettings::getTeamForUsername(const std::string& name) } // getTeamForUsername //----------------------------------------------------------------------------- -void LobbySettings::addMutedPlayerFor(std::shared_ptr peer, - const irr::core::stringw& name) -{ - m_peers_muted_players[std::weak_ptr(peer)].insert(name); -} // addMutedPlayerFor -//----------------------------------------------------------------------------- - -bool LobbySettings::removeMutedPlayerFor(std::shared_ptr peer, - const irr::core::stringw& name) -{ - // I'm not sure why the implementation was so long - auto& collection = m_peers_muted_players[std::weak_ptr(peer)]; - for (auto it = collection.begin(); it != collection.end(); ) - { - if (*it == name) - { - it = collection.erase(it); - return true; - } - else - it++; - } - return false; -} // removeMutedPlayerFor -//----------------------------------------------------------------------------- - -bool LobbySettings::isMuting(std::shared_ptr peer, - const irr::core::stringw& name) const -{ - auto it = m_peers_muted_players.find(std::weak_ptr(peer)); - if (it == m_peers_muted_players.end()) - return false; - - return it->second.find(name) != it->second.end(); -} // isMuting -//----------------------------------------------------------------------------- - -std::string LobbySettings::getMutedPlayersAsString(std::shared_ptr peer) -{ - std::string response; - int num_players = 0; - for (auto& name : m_peers_muted_players[std::weak_ptr(peer)]) - { - response += StringUtils::wideToUtf8(name); - response += " "; - ++num_players; - } - if (num_players == 0) - response = "No player has been muted by you"; - else - { - response += (num_players == 1 ? "is" : "are"); - response += StringUtils::insertValues(" muted (total: %s)", num_players); - } - return response; -} // getMutedPlayersAsString -//----------------------------------------------------------------------------- - -void LobbySettings::addTeamSpeaker(std::shared_ptr peer) -{ - m_team_speakers.insert(peer); -} // addTeamSpeaker -//----------------------------------------------------------------------------- - -void LobbySettings::setMessageReceiversFor(std::shared_ptr peer, - const std::vector& receivers) -{ - auto& thing = m_message_receivers[peer]; - thing.clear(); - for (unsigned i = 0; i < receivers.size(); ++i) - thing.insert(StringUtils::utf8ToWide(receivers[i])); -} // setMessageReceiversFor -//----------------------------------------------------------------------------- - -std::set LobbySettings::getMessageReceiversFor( - std::shared_ptr peer) const -{ - auto it = m_message_receivers.find(peer); - if (it == m_message_receivers.end()) - return {}; - - return it->second; -} // getMessageReceiversFor -//----------------------------------------------------------------------------- - -bool LobbySettings::isTeamSpeaker(std::shared_ptr peer) const -{ - return m_team_speakers.find(peer) != m_team_speakers.end(); -} // isTeamSpeaker -//----------------------------------------------------------------------------- - -void LobbySettings::makeChatPublicFor(std::shared_ptr peer) -{ - m_message_receivers[peer].clear(); - m_team_speakers.erase(peer); -} // makeChatPublicFor -//----------------------------------------------------------------------------- - bool LobbySettings::hasNoLapRestrictions() const { return m_default_lap_multiplier < 0. && m_fixed_lap < 0; @@ -712,19 +620,6 @@ void LobbySettings::insertIntoPreserved(const std::string& value) } // insertIntoPreserved //----------------------------------------------------------------------------- -void LobbySettings::clearAllExpiredWeakPtrs() -{ - for (auto it = m_peers_muted_players.begin(); - it != m_peers_muted_players.end();) - { - if (it->first.expired()) - it = m_peers_muted_players.erase(it); - else - it++; - } -} // clearAllExpiredWeakPtrs -//----------------------------------------------------------------------------- - void LobbySettings::initializeDefaultVote() { m_default_vote->m_track_name = getAssetManager()->getRandomAvailableMap(); @@ -887,13 +782,6 @@ PeerVote LobbySettings::getDefaultVote() const } // getDefaultVote //----------------------------------------------------------------------------- - -void LobbySettings::onPeerDisconnect(std::shared_ptr peer) -{ - m_message_receivers.erase(peer); -} // onPeerDisconnect -//----------------------------------------------------------------------------- - bool LobbySettings::isInWhitelist(const std::string& username) const { return m_usernames_white_list.find(username) != m_usernames_white_list.end(); diff --git a/src/utils/lobby_settings.hpp b/src/utils/lobby_settings.hpp index 8e5986e10fa..b155073a01f 100644 --- a/src/utils/lobby_settings.hpp +++ b/src/utils/lobby_settings.hpp @@ -69,20 +69,6 @@ class LobbySettings: public LobbyContextComponent std::string getHelpMessage() const { return m_help_message; } std::string getMotd() const { return m_motd; } - void addMutedPlayerFor(std::shared_ptr peer, - const irr::core::stringw& name); - bool removeMutedPlayerFor(std::shared_ptr peer, - const irr::core::stringw& name); - bool isMuting(std::shared_ptr peer, - const irr::core::stringw& name) const; - std::string getMutedPlayersAsString(std::shared_ptr peer); - void addTeamSpeaker(std::shared_ptr peer); - void setMessageReceiversFor(std::shared_ptr peer, - const std::vector& receivers); - std::set getMessageReceiversFor( - std::shared_ptr peer) const; - bool isTeamSpeaker(std::shared_ptr peer) const; - void makeChatPublicFor(std::shared_ptr peer); bool hasNoLapRestrictions() const; bool hasMultiplier() const; bool hasFixedLapCount() const; @@ -117,7 +103,6 @@ class LobbySettings: public LobbyContextComponent std::string getPreservedSettingsAsString() const; void eraseFromPreserved(const std::string& value); void insertIntoPreserved(const std::string& value); - void clearAllExpiredWeakPtrs(); void initializeDefaultVote(); void applyGlobalFilter(FilterContext& map_context) const; void applyGlobalKartsFilter(FilterContext& kart_context) const; @@ -125,7 +110,6 @@ class LobbySettings: public LobbyContextComponent void encodeDefaultVote(NetworkString* ns) const; void setDefaultVote(PeerVote winner_vote); PeerVote getDefaultVote() const; - void onPeerDisconnect(std::shared_ptr peer); bool isInWhitelist(const std::string& username) const; bool isModeAvailable(int mode) const; bool isDifficultyAvailable(int difficulty) const; @@ -148,15 +132,9 @@ class LobbySettings: public LobbyContextComponent // These were used unchanged from ServerConfig bool isLivePlayers() const { return m_live_players; } - int getAddonArenasPlayThreshold() const { return m_addon_arenas_play_threshold; } - int getAddonKartsPlayThreshold() const { return m_addon_karts_play_threshold; } - int getAddonSoccersPlayThreshold() const { return m_addon_soccers_play_threshold; } - int getAddonTracksPlayThreshold() const { return m_addon_tracks_play_threshold; } bool canConnectAiAnywhere() const { return m_ai_anywhere; } bool getAiHandling() const { return m_ai_handling; } int getCaptureLimit() const { return m_capture_limit; } - bool getChat() const { return m_chat; } - int getChatConsecutiveInterval() const { return m_chat_consecutive_interval; } bool getExposeMobile() const { return m_expose_mobile; } bool getFirewalledServer() const { return m_firewalled_server; } float getFlagDeactivatedTime() const { return m_flag_deactivated_time; } @@ -200,6 +178,18 @@ class LobbySettings: public LobbyContextComponent bool getValidatingPlayer() const { return m_validating_player; } float getVotingTimeout() const { return m_voting_timeout; } std::string getCommandsFile() const { return m_commands_file; } + int getAddonKartsJoinThreshold() const { return m_addon_karts_join_threshold; } + int getAddonTracksJoinThreshold() const { return m_addon_tracks_join_threshold; } + int getAddonArenasJoinThreshold() const { return m_addon_arenas_join_threshold; } + int getAddonSoccersJoinThreshold() const { return m_addon_soccers_join_threshold; } + int getAddonKartsPlayThreshold() const { return m_addon_karts_play_threshold; } + int getAddonTracksPlayThreshold() const { return m_addon_tracks_play_threshold; } + int getAddonArenasPlayThreshold() const { return m_addon_arenas_play_threshold; } + int getAddonSoccersPlayThreshold() const { return m_addon_soccers_play_threshold; } + std::string getPowerPassword() const { return m_power_password; } + std::string getRegisterTableName() const { return m_register_table_name; } + float getOfficialKartsThreshold() const { return m_official_karts_threshold; } + float getOfficialTracksThreshold() const { return m_official_tracks_threshold; } private: GameSetup* m_game_setup; @@ -252,15 +242,9 @@ class LobbySettings: public LobbyContextComponent bool m_live_players; - int m_addon_arenas_play_threshold; - int m_addon_karts_play_threshold; - int m_addon_soccers_play_threshold; - int m_addon_tracks_play_threshold; bool m_ai_anywhere; bool m_ai_handling; int m_capture_limit; - bool m_chat; - int m_chat_consecutive_interval; bool m_expose_mobile; bool m_firewalled_server; float m_flag_deactivated_time; @@ -304,7 +288,18 @@ class LobbySettings: public LobbyContextComponent bool m_validating_player; float m_voting_timeout; std::string m_commands_file; - + int m_addon_karts_join_threshold; + int m_addon_tracks_join_threshold; + int m_addon_arenas_join_threshold; + int m_addon_soccers_join_threshold; + int m_addon_arenas_play_threshold; + int m_addon_karts_play_threshold; + int m_addon_soccers_play_threshold; + int m_addon_tracks_play_threshold; + std::string m_power_password; + std::string m_register_table_name; + float m_official_karts_threshold; + float m_official_tracks_threshold; // These should be moved to voting manager ==================================== @@ -316,16 +311,6 @@ class LobbySettings: public LobbyContextComponent uint32_t m_winner_peer_id; -// These should be moved to chat handler ====================================== - - std::map, std::set, - std::owner_less > > m_peers_muted_players; - - std::map, std::set> m_message_receivers; - - std::set> m_team_speakers; - - // These should be moved to category and team manager ========================= std::map> m_player_categories; diff --git a/src/utils/tournament.cpp b/src/utils/tournament.cpp index 529f98f7ac3..6747b192fca 100644 --- a/src/utils/tournament.cpp +++ b/src/utils/tournament.cpp @@ -132,8 +132,7 @@ void Tournament::updateTournamentRole(std::shared_ptr peer) { if (peer->getPlayerProfiles().empty()) return; - std::string utf8_online_name = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string utf8_online_name = peer->getMainName(); for (auto& player: peer->getPlayerProfiles()) { core::stringw name = player->getName(); @@ -296,7 +295,7 @@ void Tournament::initTournamentPlayers() } else m_length = 10; - ServerConfig::m_fixed_lap_count = m_length; + getSettings()->setFixedLapCount(m_length); m_game_limits = general[2]; m_colors = general[3]; @@ -317,8 +316,7 @@ bool Tournament::canPlay(const std::string& username) const bool Tournament::canVote(std::shared_ptr peer) const { - std::string username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string username = peer->getMainName(); bool first = m_red_players.count(username) > 0; bool second = m_blue_players.count(username) > 0; @@ -333,16 +331,14 @@ bool Tournament::canVote(std::shared_ptr peer) const bool Tournament::hasHostRights(std::shared_ptr peer) { - std::string username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string username = peer->getMainName(); return m_referees.count(username) > 0; } // hasHostRights //----------------------------------------------------------------------------- bool Tournament::hasHammerRights(std::shared_ptr peer) { - std::string username = StringUtils::wideToUtf8( - peer->getPlayerProfiles()[0]->getName()); + std::string username = peer->getMainName(); return m_referees.count(username) > 0; } // hasHammerRights //----------------------------------------------------------------------------- @@ -365,7 +361,7 @@ int Tournament::getNextGameNumber() const int Tournament::getDefaultDuration() const { - return ServerConfig::m_fixed_lap_count; + return getSettings()->getFixedLapCount(); } // getDefaultDuration //----------------------------------------------------------------------------- @@ -452,4 +448,62 @@ bool Tournament::assignToHistory(int index, const std::string& map_id) m_arenas[index] = map_id; return true; } // assignToHistory +//----------------------------------------------------------------------------- + +bool Tournament::peerHasOnlyImportantProfiles(std::shared_ptr peer) const +{ + // This has to be called much rarer than once per call + std::set important = getImportantChatPlayers(); + + for (auto& player : peer->getPlayerProfiles()) + { + std::string name = StringUtils::wideToUtf8( + player->getName()); + if (important.count(name) == 0) + { + return false; + } + } + return true; +} // peerHasOnlyImportantProfiles +//----------------------------------------------------------------------------- + +bool Tournament::cannotSendForSureDueToRoles(std::shared_ptr sender, + std::shared_ptr target) const +{ + if (checkSenderInRefsOrPlayers(sender)) + return false; + if (peerHasOnlyImportantProfiles(target)) + return true; + + return false; +} // cannotSendForSureDueToRoles +//----------------------------------------------------------------------------- + +bool Tournament::hasProfileThatSeesTeamchats(std::shared_ptr peer) const +{ + // shouldn't be done once per call - obviously I could just say they should be + // referees, but what if I change it? Better to rework it separately + std::set those_who_see_teamchats = getThoseWhoSeeTeamchats(); + + for (auto& player : peer->getPlayerProfiles()) + { + std::string name = StringUtils::wideToUtf8( + player->getName()); + if (those_who_see_teamchats.count(name)) + return true; + } + return false; +} // hasProfileThatSeesTeamchats +//----------------------------------------------------------------------------- + +bool Tournament::hasProfileFromTeam(std::shared_ptr peer, KartTeam target_team) const +{ + for (auto& player : peer->getPlayerProfiles()) + { + if (player->getTeam() == target_team) + return true; + } + return false; +} // hasProfileFromTeam //----------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/utils/tournament.hpp b/src/utils/tournament.hpp index 3bc0f758cee..035e1c70cd3 100644 --- a/src/utils/tournament.hpp +++ b/src/utils/tournament.hpp @@ -86,6 +86,14 @@ class Tournament: public LobbyContextComponent float getExtraSeconds() const { return m_extra_seconds; } + bool peerHasOnlyImportantProfiles(std::shared_ptr peer) const; + + bool cannotSendForSureDueToRoles(std::shared_ptr sender, + std::shared_ptr target) const; + + bool hasProfileThatSeesTeamchats(std::shared_ptr peer) const; + bool hasProfileFromTeam(std::shared_ptr peer, KartTeam target_team) const; + private: std::set m_red_players;