From 3a301cd986f56c7dd5f85dfd2c50593794554b0a Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 27 Feb 2024 18:11:13 +0000 Subject: [PATCH] Add helper functions for network settings admin state --- src/build_vehicle_gui.cpp | 5 +---- src/cheat_gui.cpp | 10 +++++----- src/main_gui.cpp | 2 +- src/network/network.h | 10 ++++++++++ src/settings.cpp | 8 ++++---- src/toolbar_gui.cpp | 4 ++-- src/town_gui.cpp | 8 ++++---- 7 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 7fd43d8c27..4ee0b54ff4 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -2105,10 +2105,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase { this->SetWidgetsDisabledState(this->sel_engine == INVALID_ENGINE, WID_BV_SHOW_HIDE, WID_BV_BUILD); /* Disable renaming engines in network games if you are not the server. */ - this->SetWidgetDisabledState(WID_BV_RENAME, this->sel_engine == INVALID_ENGINE || (_networking && !_network_server)); - - /* disable renaming engines in network games if you are not the server */ - this->SetWidgetDisabledState(WID_BV_RENAME, _networking && !(_network_server || _network_settings_access)); + this->SetWidgetDisabledState(WID_BV_RENAME, this->sel_engine == INVALID_ENGINE || IsNonAdminNetworkClient()); this->DrawWidgets(); diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 001ff52a93..11595c5fc8 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -58,7 +58,7 @@ static int32_t _money_cheat_amount = 10000000; */ static int32_t ClickMoneyCheat(int32_t p1, int32_t p2) { - DoCommandPEx(0, 0, 0, (uint64_t)(p2 * _money_cheat_amount), _network_server || _network_settings_access ? CMD_MONEY_CHEAT_ADMIN : CMD_MONEY_CHEAT); + DoCommandPEx(0, 0, 0, (uint64_t)(p2 * _money_cheat_amount), IsNetworkSettingsAdmin() ? CMD_MONEY_CHEAT_ADMIN : CMD_MONEY_CHEAT); return _money_cheat_amount; } @@ -212,13 +212,13 @@ static bool IsCheatAllowed(CheatNetworkMode mode) { switch (mode) { case CNM_ALL: - return !_networking || _network_server || _network_settings_access; + return !IsNonAdminNetworkClient(); case CNM_LOCAL_ONLY: return !_networking; case CNM_MONEY: - return !_networking || _network_server || _network_settings_access || _settings_game.difficulty.money_cheat_in_multiplayer; + return !IsNonAdminNetworkClient() || _settings_game.difficulty.money_cheat_in_multiplayer; } return false; } @@ -507,7 +507,7 @@ struct CheatWindow : Window { } if (ce->mode == CNM_MONEY) { if (!_networking) *ce->been_used = true; - DoCommandPEx(0, 0, 0, (std::strtoll(str, nullptr, 10) / _currency->rate), _network_server || _network_settings_access ? CMD_MONEY_CHEAT_ADMIN : CMD_MONEY_CHEAT); + DoCommandPEx(0, 0, 0, (std::strtoll(str, nullptr, 10) / _currency->rate), IsNetworkSettingsAdmin() ? CMD_MONEY_CHEAT_ADMIN : CMD_MONEY_CHEAT); return; } @@ -532,7 +532,7 @@ static WindowDesc _cheats_desc(__FILE__, __LINE__, bool CheatWindowMayBeShown() { - return _game_mode != GM_EDITOR && (!_networking || _network_server || _network_settings_access || _settings_game.difficulty.money_cheat_in_multiplayer); + return _game_mode != GM_EDITOR && (!IsNonAdminNetworkClient() || _settings_game.difficulty.money_cheat_in_multiplayer); } /** Open cheat window. */ diff --git a/src/main_gui.cpp b/src/main_gui.cpp index 86392edc04..0798448cfa 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -368,7 +368,7 @@ struct MainWindow : Window /* You can only cheat for money in single player or when otherwise suitably authorised. */ if (!_networking || _settings_game.difficulty.money_cheat_in_multiplayer) { DoCommandP(0, 10000000, 0, CMD_MONEY_CHEAT); - } else if (_network_server || _network_settings_access) { + } else if (IsNetworkSettingsAdmin()) { DoCommandP(0, 10000000, 0, CMD_MONEY_CHEAT_ADMIN); } break; diff --git a/src/network/network.h b/src/network/network.h index c1a32a9770..7f2e935337 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -22,4 +22,14 @@ extern bool _network_dedicated; ///< are we a dedicated server? extern bool _is_network_server; ///< Does this client wants to be a network-server? extern bool _network_settings_access; ///< Can this client change server settings? +inline bool IsNetworkSettingsAdmin() +{ + return _network_server || _network_settings_access; +} + +inline bool IsNonAdminNetworkClient() +{ + return _networking && !(_network_server || _network_settings_access); +} + #endif /* NETWORK_H */ diff --git a/src/settings.cpp b/src/settings.cpp index 228c018b3e..9fe362de8e 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1024,7 +1024,7 @@ void IniSaveWindowSettings(IniFile &ini, const char *grpname, void *desc) */ bool SettingDesc::IsEditable(bool do_command) const { - if (!do_command && !(this->flags & SF_NO_NETWORK_SYNC) && _networking && !(_network_server || _network_settings_access) && !(this->flags & SF_PER_COMPANY)) return false; + if (!do_command && !(this->flags & SF_NO_NETWORK_SYNC) && IsNonAdminNetworkClient() && !(this->flags & SF_PER_COMPANY)) return false; if (do_command && (this->flags & SF_NO_NETWORK_SYNC)) return false; if ((this->flags & SF_NETWORK_ONLY) && !_networking && _game_mode != GM_MENU) return false; if ((this->flags & SF_NO_NETWORK) && _networking) return false; @@ -1772,7 +1772,7 @@ static void MaxNoAIsChange(int32_t new_value) { if (GetGameSettings().difficulty.max_no_competitors != 0 && AI::GetInfoList()->size() == 0 && - (!_networking || (_network_server || _network_settings_access))) { + !IsNonAdminNetworkClient()) { ShowErrorMessage(STR_WARNING_NO_SUITABLE_AI, INVALID_STRING_ID, WL_CRITICAL); } @@ -3296,7 +3296,7 @@ bool SetSettingValue(const IntSettingDesc *sd, int32_t value, bool force_newgame } /* send non-company-based settings over the network */ - if (!_networking || (_networking && (_network_server || _network_settings_access))) { + if (!IsNonAdminNetworkClient()) { return DoCommandP(0, 0, value, CMD_CHANGE_SETTING, nullptr, setting->name); } return false; @@ -3411,7 +3411,7 @@ void IConsoleSetSetting(const char *name, const char *value, bool force_newgame) } if (!success) { - if ((_network_server || _network_settings_access)) { + if (IsNetworkSettingsAdmin()) { IConsoleError("This command/variable is not available during network games."); } else { IConsoleError("This command/variable is only available to a network server."); diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index edb716a3fe..65be956021 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -208,7 +208,7 @@ static CallBackFunction SelectSignTool() static CallBackFunction ToolbarPauseClick(Window *) { - if (_networking && !(_network_server || _network_settings_access)) return CBF_NONE; // only server can pause the game + if (IsNonAdminNetworkClient()) return CBF_NONE; // only server can pause the game if (DoCommandP(0, PM_PAUSED_NORMAL, _pause_mode == PM_UNPAUSED, CMD_PAUSE)) { if (_settings_client.sound.confirm) SndPlayFx(SND_15_BEEP); @@ -2140,7 +2140,7 @@ struct MainToolbarWindow : Window { this->SetWidgetDisabledState(WID_TN_GOAL, Goal::GetNumItems() == 0); this->SetWidgetDisabledState(WID_TN_STORY, StoryPage::GetNumItems() == 0); - this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !(_network_server || _network_settings_access)); // if not server, disable pause button + this->SetWidgetDisabledState(WID_TN_PAUSE, IsNonAdminNetworkClient()); // if not server, disable pause button this->DrawWidgets(); } diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 20f6b7947f..b8cbbf91e0 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -110,7 +110,7 @@ private: static bool ChangeSettingsDisabled() { - return _networking && !(_network_server || _network_settings_access) && + return IsNonAdminNetworkClient() && !(_local_company != COMPANY_SPECTATOR && _settings_game.difficulty.override_town_settings_in_multiplayer); } @@ -508,7 +508,7 @@ public: SetBit(p2, 16); p2 |= (index - 1) << 8; } - Commands cmd = (_networking && !(_network_server || _network_settings_access)) ? CMD_TOWN_SETTING_OVERRIDE_NON_ADMIN : CMD_TOWN_SETTING_OVERRIDE; + Commands cmd = IsNonAdminNetworkClient() ? CMD_TOWN_SETTING_OVERRIDE_NON_ADMIN : CMD_TOWN_SETTING_OVERRIDE; DoCommandP(this->town->xy, this->window_number, p2, cmd | CMD_MSG(STR_ERROR_CAN_T_DO_THIS)); break; } @@ -575,7 +575,7 @@ public: { extern const Town *_viewport_highlight_town; this->SetWidgetLoweredState(WID_TV_CATCHMENT, _viewport_highlight_town == this->town); - this->SetWidgetDisabledState(WID_TV_CHANGE_NAME, _networking && !(_network_server || _network_settings_access) && + this->SetWidgetDisabledState(WID_TV_CHANGE_NAME, IsNonAdminNetworkClient() && !(_local_company != COMPANY_SPECTATOR && _settings_game.difficulty.rename_towns_in_multiplayer)); this->DrawWidgets(); @@ -786,7 +786,7 @@ public: { if (str == nullptr) return; - DoCommandP(0, this->window_number, 0, ((_networking && !(_network_server || _network_settings_access)) ? CMD_RENAME_TOWN_NON_ADMIN : CMD_RENAME_TOWN) | CMD_MSG(STR_ERROR_CAN_T_RENAME_TOWN), nullptr, str); + DoCommandP(0, this->window_number, 0, (IsNonAdminNetworkClient() ? CMD_RENAME_TOWN_NON_ADMIN : CMD_RENAME_TOWN) | CMD_MSG(STR_ERROR_CAN_T_RENAME_TOWN), nullptr, str); } bool IsNewGRFInspectable() const override