mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 06:15:04 +00:00
(svn r15084) -Fix [NoAI] (r15027): by removing the threads for NoAIs, it is no longer possible to use DoCommand (even indirect) in AIAbstractList::Valuator().
This commit is contained in:
parent
a483ddf7ae
commit
3cd6bf0ead
@ -756,6 +756,10 @@ SQInteger AIAbstractList::Valuate(HSQUIRRELVM vm) {
|
|||||||
return sq_throwerror(vm, _SC("parameter 2 has an invalid type (expected function)"));
|
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);
|
sq_addref(vm, &obj_func);
|
||||||
|
|
||||||
/* Read the params */
|
/* Read the params */
|
||||||
@ -782,7 +786,10 @@ SQInteger AIAbstractList::Valuate(HSQUIRRELVM vm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Call the function */
|
/* 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 */
|
/* Retreive the return value */
|
||||||
SQInteger value;
|
SQInteger value;
|
||||||
@ -802,6 +809,7 @@ SQInteger AIAbstractList::Valuate(HSQUIRRELVM vm) {
|
|||||||
sq_release(vm, &obj_func);
|
sq_release(vm, &obj_func);
|
||||||
for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
|
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)"));
|
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);
|
sq_release(vm, &obj_func);
|
||||||
for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
|
for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
|
||||||
|
|
||||||
|
AIObject::SetAllowDoCommand(true);
|
||||||
return 0;
|
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)
|
bool AIObject::DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint cmd, const char *text, AISuspendCallbackProc *callback)
|
||||||
{
|
{
|
||||||
if (AIObject::GetAllowDoCommand() == false) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user