(svn r17232) -Fix (r17223): Kill an AI when it tries to Sleep / execute a DoCommand during Save() instead of failing to save

pull/155/head
yexo 15 years ago
parent 48f70be5f8
commit 172d4dd23e

@ -602,11 +602,25 @@ void AIInstance::Save()
/* We don't want to be interrupted during the save function. */ /* We don't want to be interrupted during the save function. */
bool backup_allow = AIObject::GetAllowDoCommand(); bool backup_allow = AIObject::GetAllowDoCommand();
AIObject::SetAllowDoCommand(false); AIObject::SetAllowDoCommand(false);
if (!this->engine->CallMethod(*this->instance, "Save", &savedata)) { try {
/* The script crashed in the Save function. We can't kill if (!this->engine->CallMethod(*this->instance, "Save", &savedata)) {
* it here, but do so in the next AI tick. */ /* The script crashed in the Save function. We can't kill
* it here, but do so in the next AI tick. */
SaveEmpty();
this->engine->CrashOccurred();
return;
}
} catch (AI_FatalError e) {
/* If we don't mark the AI as dead here cleaning up the squirrel
* stack could throw AI_FatalError again. */
this->is_dead = true;
this->engine->ThrowError(e.GetErrorMessage());
this->engine->ResumeError();
SaveEmpty(); SaveEmpty();
this->engine->CrashOccurred(); /* We can't kill the AI here, so mark it as crashed (not dead) and
* kill it in the next AI tick. */
this->is_dead = false;
this->engine->CrashOccured();
return; return;
} }
AIObject::SetAllowDoCommand(backup_allow); AIObject::SetAllowDoCommand(backup_allow);

Loading…
Cancel
Save