# HG changeset patch # User truebrain # Date 2009-01-14 18:25:48 # Node ID 8bea4563bd26a1f9736be580e33a7643449e1593 # Parent 3efcb08f2f723ce6a8ec7606c8c87360687fdf4b (svn r15084) -Fix [NoAI] (r15027): by removing the threads for NoAIs, it is no longer possible to use DoCommand (even indirect) in AIAbstractList::Valuator(). diff --git a/src/ai/api/ai_abstractlist.cpp b/src/ai/api/ai_abstractlist.cpp --- a/src/ai/api/ai_abstractlist.cpp +++ b/src/ai/api/ai_abstractlist.cpp @@ -756,6 +756,10 @@ SQInteger AIAbstractList::Valuate(HSQUIR 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(HSQUIR } /* 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(HSQUIR 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(HSQUIR sq_release(vm, &obj_func); for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]); + + AIObject::SetAllowDoCommand(true); return 0; } diff --git a/src/ai/api/ai_object.cpp b/src/ai/api/ai_object.cpp --- a/src/ai/api/ai_object.cpp +++ b/src/ai/api/ai_object.cpp @@ -198,7 +198,7 @@ int AIObject::GetCallbackVariable(int in 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; }