diff --git a/src/command.cpp b/src/command.cpp index 007fce35c3..65e5acf10c 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -287,9 +287,6 @@ void CommandHelperBase::LogCommandExecution(Commands cmd, StringID err_message, */ bool CommandHelperBase::InternalExecutePrepTest(CommandFlags cmd_flags, TileIndex tile, Backup &cur_company) { - /* Do not even think about executing out-of-bounds tile-commands */ - if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (cmd_flags & CMD_ALL_TILES) == 0))) return false; - /* Always execute server and spectator commands as spectator */ bool exec_as_spectator = (cmd_flags & (CMD_SPECTATOR | CMD_SERVER)) != 0; diff --git a/src/command_func.h b/src/command_func.h index 861dd480b2..d78c8229a4 100644 --- a/src/command_func.h +++ b/src/command_func.h @@ -222,6 +222,12 @@ public: template static bool PostFromNet(StringID err_message, Tcallback *callback, bool my_cmd, TileIndex location, std::tuple args) { + if constexpr (std::is_same_v>) { + /* Do not even think about executing out-of-bounds tile-commands. */ + TileIndex tile = std::get<0>(args); + if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (GetCommandFlags() & CMD_ALL_TILES) == 0))) return false; + } + return InternalPost(err_message, callback, my_cmd, true, location, std::move(args)); } @@ -299,6 +305,9 @@ protected: template static bool InternalPost(StringID err_message, Tcallback *callback, bool my_cmd, bool network_command, TileIndex tile, std::tuple args) { + /* Do not even think about executing out-of-bounds tile-commands. */ + if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (GetCommandFlags() & CMD_ALL_TILES) == 0))) return false; + auto [err, estimate_only, only_sending] = InternalPostBefore(Tcmd, GetCommandFlags(), tile, err_message, network_command); if (err) return false;