diff --git a/src/3rdparty/squirrel/include/squirrel.h b/src/3rdparty/squirrel/include/squirrel.h index e611d0853b..5623760fac 100644 --- a/src/3rdparty/squirrel/include/squirrel.h +++ b/src/3rdparty/squirrel/include/squirrel.h @@ -275,6 +275,7 @@ typedef struct tagSQRegFunction{ }SQRegFunction; /*vm*/ +SQUIRREL_API bool sq_can_suspend(HSQUIRRELVM v); SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize); SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize); SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v); diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp index 10b3469f4e..82527f4a7e 100644 --- a/src/3rdparty/squirrel/squirrel/sqapi.cpp +++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp @@ -90,6 +90,11 @@ SQInteger sq_getvmstate(HSQUIRRELVM v) } } +bool sq_can_suspend(HSQUIRRELVM v) +{ + return v->_can_suspend; +} + void sq_seterrorhandler(HSQUIRRELVM v) { SQObject o = stack_get(v, -1); diff --git a/src/ai/ai_instance.hpp b/src/ai/ai_instance.hpp index bf501dc232..3ae3aa152a 100644 --- a/src/ai/ai_instance.hpp +++ b/src/ai/ai_instance.hpp @@ -30,6 +30,7 @@ private: class AIInstance { public: + friend class AIObject; AIInstance(class AIInfo *info); ~AIInstance(); diff --git a/src/ai/api/ai_object.cpp b/src/ai/api/ai_object.cpp index 7e531ac479..bb17e58f82 100644 --- a/src/ai/api/ai_object.cpp +++ b/src/ai/api/ai_object.cpp @@ -2,6 +2,11 @@ /** @file ai_object.cpp Implementation of AIObject. */ +#include "../../stdafx.h" +#include +#include "../../script/squirrel.hpp" +#include "../../company_base.h" + #include "ai_log.hpp" #include "table/strings.h" #include "../ai.hpp" @@ -158,7 +163,8 @@ void AIObject::SetAllowDoCommand(bool allow) bool AIObject::GetAllowDoCommand() { - return GetStorage()->allow_do_command; + Squirrel *squirrel = Company::Get(_current_company)->ai_instance->engine; + return GetStorage()->allow_do_command && squirrel->CanSuspend(); } void *&AIObject::GetEventPointer() diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index 6737fd3ef3..6955d2d24e 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -508,3 +508,8 @@ void Squirrel::ResetCrashed() { this->crashed = false; } + +bool Squirrel::CanSuspend() +{ + return sq_can_suspend(this->vm); +} diff --git a/src/script/squirrel.hpp b/src/script/squirrel.hpp index ee597f87ad..b878c2b95a 100644 --- a/src/script/squirrel.hpp +++ b/src/script/squirrel.hpp @@ -213,6 +213,11 @@ public: * Reset the crashed status. */ void ResetCrashed(); + + /** + * Are we allowed to suspend the squirrel script at this moment? + */ + bool CanSuspend(); }; #endif /* SQUIRREL_HPP */