diff options
author | yexo <yexo@openttd.org> | 2009-06-01 22:00:47 +0000 |
---|---|---|
committer | yexo <yexo@openttd.org> | 2009-06-01 22:00:47 +0000 |
commit | 4ea3e511bd71559ab475f49292c8b50f1eace647 (patch) | |
tree | 0c088a58691406daaa43f51ebefe51a2337c4271 /src/ai | |
parent | 9b15b8cd4a6e956e97a6c5f823f181d381684157 (diff) | |
download | openttd-4ea3e511bd71559ab475f49292c8b50f1eace647.tar.xz |
(svn r16502) -Fix [FS#2935]: when an AI was suspended while in a function called (indirectly) via call/acall/pcall OpenTTD crashed. Fix this by disallowing AIs to be suspended while called via call/acall/pcall.
IMPORTANT FOR AI WRITERS: AIs can no longer call any DoCommand functions (change anything, build vehicles, etc.) in a function called (indirectly) via call/acall/pcall. Where possible, please rewrite your code so it doesn't use call/acall/pcall
Diffstat (limited to 'src/ai')
-rw-r--r-- | src/ai/ai_instance.hpp | 1 | ||||
-rw-r--r-- | src/ai/api/ai_object.cpp | 8 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/ai/ai_instance.hpp b/src/ai/ai_instance.hpp index bf501dc23..3ae3aa152 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 7e531ac47..bb17e58f8 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 <squirrel.h> +#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() |