Mercurial > hg > openttd
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; }