Changeset - r10751:8bea4563bd26
[Not reviewed]
master
0 2 0
truebrain - 15 years ago 2009-01-14 18:25:48
truebrain@openttd.org
(svn r15084) -Fix [NoAI] (r15027): by removing the threads for NoAIs, it is no longer possible to use DoCommand (even indirect) in AIAbstractList::Valuator().
2 files changed with 12 insertions and 2 deletions:
0 comments (0 inline, 0 general)
src/ai/api/ai_abstractlist.cpp
Show inline comments
 
@@ -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;
 
}
src/ai/api/ai_object.cpp
Show inline comments
 
@@ -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;
 
	}
 

	
0 comments (0 inline, 0 general)