(svn r15084) -Fix [NoAI] (r15027): by removing the threads for NoAIs, it is no longer possible to use DoCommand (even indirect) in AIAbstractList::Valuator().

pull/155/head
truebrain 16 years ago
parent a45b3c4304
commit 61093eb211

@ -756,6 +756,10 @@ SQInteger AIAbstractList::Valuate(HSQUIRRELVM vm) {
return sq_throwerror(vm, _SC("parameter 2 has an invalid type (expected function)"));
}
/* Don't allow docommand from a Valuator, as we can't resume in
* mid-code */
AIObject::SetAllowDoCommand(false);
sq_addref(vm, &obj_func);
/* Read the params */
@ -782,7 +786,10 @@ SQInteger AIAbstractList::Valuate(HSQUIRRELVM vm) {
}
/* Call the function */
if (SQ_FAILED(sq_call(vm, nparam + 2, SQTrue, SQTrue))) return SQ_ERROR;
if (SQ_FAILED(sq_call(vm, nparam + 2, SQTrue, SQTrue))) {
AIObject::SetAllowDoCommand(true);
return SQ_ERROR;
}
/* Retreive the return value */
SQInteger value;
@ -802,6 +809,7 @@ SQInteger AIAbstractList::Valuate(HSQUIRRELVM vm) {
sq_release(vm, &obj_func);
for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
AIObject::SetAllowDoCommand(true);
return sq_throwerror(vm, _SC("return value of valuator is not valid (not integer/bool)"));
}
}
@ -814,5 +822,7 @@ SQInteger AIAbstractList::Valuate(HSQUIRRELVM vm) {
sq_release(vm, &obj_func);
for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
AIObject::SetAllowDoCommand(true);
return 0;
}

@ -198,7 +198,7 @@ int AIObject::GetCallbackVariable(int index)
bool AIObject::DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint cmd, const char *text, AISuspendCallbackProc *callback)
{
if (AIObject::GetAllowDoCommand() == false) {
AILog::Error("You are not allowed to execute any DoCommand (even indirect) in your constructor, Save(), and Load().\n");
AILog::Error("You are not allowed to execute any DoCommand (even indirect) in your constructor, Save(), Load(), and any valuator.\n");
return false;
}

Loading…
Cancel
Save