# HG changeset patch # User Niels Martin Hansen # Date 2019-09-07 17:16:31 # Node ID b46d3930800a8d09c31203f9ea03c04065e9b0be # Parent 7609f20f21045e52a12ff56ebef4a8b1fbfec733 Fix b3fd7879: Ignore command flags when verifying script commands Multiplayer games has the server add some flags to the cmd value during the handling. These flags should not be included in the verification, mask them out. Without this masking out, scripts tend to die when executing their first command in multiplayer. diff --git a/src/script/api/script_object.cpp b/src/script/api/script_object.cpp --- a/src/script/api/script_object.cpp +++ b/src/script/api/script_object.cpp @@ -23,6 +23,7 @@ #include "../script_instance.hpp" #include "../script_fatalerror.hpp" #include "script_error.hpp" +#include "../../debug.h" #include "../../safeguards.h" @@ -85,18 +86,22 @@ ScriptObject::ActiveInstance::~ActiveIns /* static */ void ScriptObject::SetLastCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd) { - GetStorage()->last_tile = tile; - GetStorage()->last_p1 = p1; - GetStorage()->last_p2 = p2; - GetStorage()->last_cmd = cmd; + ScriptStorage *s = GetStorage(); + DEBUG(script, 6, "SetLastCommand company=%02d tile=%06x p1=%08x p2=%08x cmd=%d", s->root_company, tile, p1, p2, cmd); + s->last_tile = tile; + s->last_p1 = p1; + s->last_p2 = p2; + s->last_cmd = cmd & CMD_ID_MASK; } /* static */ bool ScriptObject::CheckLastCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd) { - if (GetStorage()->last_tile != tile) return false; - if (GetStorage()->last_p1 != p1) return false; - if (GetStorage()->last_p2 != p2) return false; - if (GetStorage()->last_cmd != cmd) return false; + ScriptStorage *s = GetStorage(); + DEBUG(script, 6, "CheckLastCommand company=%02d tile=%06x p1=%08x p2=%08x cmd=%d", s->root_company, tile, p1, p2, cmd); + if (s->last_tile != tile) return false; + if (s->last_p1 != p1) return false; + if (s->last_p2 != p2) return false; + if (s->last_cmd != (cmd & CMD_ID_MASK)) return false; return true; } diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -684,7 +684,10 @@ bool ScriptInstance::DoCommandCallback(c { ScriptObject::ActiveInstance active(this); - if (!ScriptObject::CheckLastCommand(tile, p1, p2, cmd)) return false; + if (!ScriptObject::CheckLastCommand(tile, p1, p2, cmd)) { + DEBUG(script, 1, "DoCommandCallback terminating a script, last command does not match expected command"); + return false; + } ScriptObject::SetLastCommandRes(result.Succeeded());