Skip to content

Instantly share code, notes, and snippets.

@michicc
Last active July 8, 2022 20:13
Show Gist options
  • Save michicc/fb2e89df61c1d1a723ac70364bef9403 to your computer and use it in GitHub Desktop.
Save michicc/fb2e89df61c1d1a723ac70364bef9403 to your computer and use it in GitHub Desktop.
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<CompanyID> &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 @@ struct CommandHelper<Tcmd, Tret(*)(DoCommandFlag, Targs...), true> : protected C
template <typename Tcallback>
static bool PostFromNet(StringID err_message, Tcallback *callback, bool my_cmd, TileIndex location, std::tuple<Targs...> args)
{
+ if constexpr (std::is_same_v<TileIndex, std::tuple_element_t<0, decltype(args)>>) {
+ /* 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<Tcmd>() & CMD_ALL_TILES) == 0))) return false;
+ }
+
return InternalPost(err_message, callback, my_cmd, true, location, std::move(args));
}
@@ -299,6 +305,9 @@ struct CommandHelper<Tcmd, Tret(*)(DoCommandFlag, Targs...), true> : protected C
template <typename Tcallback>
static bool InternalPost(StringID err_message, Tcallback *callback, bool my_cmd, bool network_command, TileIndex tile, std::tuple<Targs...> args)
{
+ /* Do not even think about executing out-of-bounds tile-commands. */
+ if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (GetCommandFlags<Tcmd>() & CMD_ALL_TILES) == 0))) return false;
+
auto [err, estimate_only, only_sending] = InternalPostBefore(Tcmd, GetCommandFlags<Tcmd>(), tile, err_message, network_command);
if (err) return false;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment