changeset 11095:c126c8718572 draft

(svn r15440) -Fix: Backup AIObject::GetAllowDoCommand and restore the old value so AIs can't work around it.
author yexo <yexo@openttd.org>
date Tue, 10 Feb 2009 19:22:09 +0000
parents 6a6a59f20daf
children 144981ef1dbb
files src/ai/ai_instance.cpp src/ai/api/ai_abstractlist.cpp
diffstat 2 files changed, 8 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/ai/ai_instance.cpp
+++ b/src/ai/ai_instance.cpp
@@ -272,13 +272,13 @@
 
 	if (!this->is_started) {
 		try {
+			AIObject::SetAllowDoCommand(false);
 			/* Run the constructor if it exists. Don't allow any DoCommands in it. */
 			if (this->engine->MethodExists(*this->instance, "constructor")) {
-				AIObject::SetAllowDoCommand(false);
 				this->engine->CallMethod(*this->instance, "constructor");
-				AIObject::SetAllowDoCommand(true);
 			}
 			this->CallLoad();
+			AIObject::SetAllowDoCommand(true);
 			/* Start the AI by calling Start() */
 			if (!this->engine->CallMethod(*this->instance, "Start",  _settings_game.ai.ai_max_opcode_till_suspend)) this->Died();
 		} catch (AI_VMSuspend e) {
@@ -524,9 +524,10 @@
 	} else if (this->engine->MethodExists(*this->instance, "Save")) {
 		HSQOBJECT savedata;
 		/* We don't want to be interrupted during the save function. */
+		bool backup_allow = AIObject::GetAllowDoCommand();
 		AIObject::SetAllowDoCommand(false);
 		this->engine->CallMethod(*this->instance, "Save", &savedata);
-		AIObject::SetAllowDoCommand(true);
+		AIObject::SetAllowDoCommand(backup_allow);
 
 		if (!sq_istable(savedata)) {
 			AILog::Error("Save function should return a table.");
@@ -653,8 +654,6 @@
 		return;
 	}
 
-	AIObject::SetAllowDoCommand(false);
-
 	/* Go to the instance-root */
 	sq_pushobject(vm, *this->instance);
 	/* Find the function-name inside the script */
@@ -673,6 +672,4 @@
 
 	/* Pop 1) The version, 2) the savegame data, 3) the object instance, 4) the function pointer. */
 	sq_pop(vm, 4);
-
-	AIObject::SetAllowDoCommand(true);
 }
--- a/src/ai/api/ai_abstractlist.cpp
+++ b/src/ai/api/ai_abstractlist.cpp
@@ -759,6 +759,7 @@
 
 	/* Don't allow docommand from a Valuator, as we can't resume in
 	 *  mid-code */
+	bool backup_allow = AIObject::GetAllowDoCommand();
 	AIObject::SetAllowDoCommand(false);
 
 	sq_addref(vm, &obj_func);
@@ -788,7 +789,7 @@
 
 		/* Call the function */
 		if (SQ_FAILED(sq_call(vm, nparam + 2, SQTrue, SQTrue))) {
-			AIObject::SetAllowDoCommand(true);
+			AIObject::SetAllowDoCommand(backup_allow);
 			return SQ_ERROR;
 		}
 
@@ -810,7 +811,7 @@
 				sq_release(vm, &obj_func);
 				for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
 
-				AIObject::SetAllowDoCommand(true);
+				AIObject::SetAllowDoCommand(backup_allow);
 				return sq_throwerror(vm, _SC("return value of valuator is not valid (not integer/bool)"));
 			}
 		}
@@ -826,6 +827,6 @@
 	sq_release(vm, &obj_func);
 	for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
 
-	AIObject::SetAllowDoCommand(true);
+	AIObject::SetAllowDoCommand(backup_allow);
 	return 0;
 }