summaryrefslogtreecommitdiff
path: root/src/ai
diff options
context:
space:
mode:
authoryexo <yexo@openttd.org>2009-06-01 22:00:47 +0000
committeryexo <yexo@openttd.org>2009-06-01 22:00:47 +0000
commit4ea3e511bd71559ab475f49292c8b50f1eace647 (patch)
tree0c088a58691406daaa43f51ebefe51a2337c4271 /src/ai
parent9b15b8cd4a6e956e97a6c5f823f181d381684157 (diff)
downloadopenttd-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.hpp1
-rw-r--r--src/ai/api/ai_object.cpp8
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()