Changeset - r23819:b46d3930800a
[Not reviewed]
master
0 2 0
Niels Martin Hansen - 5 years ago 2019-09-07 17:16:31
nielsm@indvikleren.dk
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.
2 files changed with 17 insertions and 9 deletions:
0 comments (0 inline, 0 general)
src/script/api/script_object.cpp
Show inline comments
 
@@ -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;
 
}
 

	
src/script/script_instance.cpp
Show inline comments
 
@@ -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());
 

	
0 comments (0 inline, 0 general)