Luanti 5.16.0-dev
 
Loading...
Searching...
No Matches
s_base.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include <iostream>
8#include <string>
9#include <thread>
10#include <mutex>
11#include "common/helper.h"
12#include "util/basic_macros.h"
13
14extern "C" {
15#include <lua.h>
16#include <lualib.h>
17}
18
19#include "irrlichttypes.h"
20#include "common/c_internal.h"
21#include "debug.h"
22#include "config.h"
23
24#define SCRIPTAPI_LOCK_DEBUG
25
26// MUST be an invalid mod name so that mods can't
27// use that name to bypass security!
28#define BUILTIN_MOD_NAME "*builtin*"
29
30#define PCALL_RES(RES) { \
31 int result_ = (RES); \
32 if (result_ != 0) { \
33 scriptError(result_, __FUNCTION__); \
34 } \
35}
36
37#define runCallbacks(nargs, mode) \
38 runCallbacksRaw((nargs), (mode), __FUNCTION__)
39
40#define setOriginFromTable(index) \
41 setOriginFromTableRaw(index, __FUNCTION__)
42
43enum class ScriptingType: u8 {
44 Async, // either mainmenu (client) or ingame (server)
45 Client, // CPCSM
47 Server,
48 Emerge,
50 SSCSM,
51};
52
53class Server;
54#if CHECK_CLIENT_BUILD()
55class Client;
56#endif
57class EmergeThread;
58class IGameDef;
59class Environment;
60class GUIEngine;
64struct ModVFS;
65
66class ScriptApiBase : protected LuaHelper {
67public:
69 // fake constructor to allow script API classes (e.g ScriptApiEnv) to virtually inherit from this one.
71 {
72 FATAL_ERROR("ScriptApiBase created without ScriptingType!");
73 }
74 virtual ~ScriptApiBase();
76
77 // These throw a ModError on failure
78 void loadMod(const std::string &script_path, const std::string &mod_name);
79 void loadScript(const std::string &script_path);
80
81#if CHECK_CLIENT_BUILD()
82 void loadModFromMemory(const std::string &mod_name, std::string init_path = "");
83#endif
84
85 void runCallbacksRaw(int nargs,
86 RunCallbacksMode mode, const char *fxn);
87
88 /* object */
91
93
96#if CHECK_CLIENT_BUILD()
97 Client *getClient();
98 ModVFS *getModVFS();
99#endif
100
101 // IMPORTANT: These cannot be used for any security-related uses, they exist
102 // only to enrich error messages.
103 const std::string &getOrigin() { return m_last_run_mod; }
104 void setOriginDirect(const char *origin);
105 void setOriginFromTableRaw(int index, const char *fxn);
106
115 static std::string getCurrentModNameInsecure(lua_State *L);
116
117#if !CHECK_CLIENT_BUILD()
118 inline void clientOpenLibs(lua_State *L) { assert(false); }
119#else
120 void clientOpenLibs(lua_State *L);
121#endif
122
123 // Check things that should be set by the builtin mod.
124 void checkSetByBuiltin();
125
126protected:
127 friend class LuaABM;
128 friend class LuaLBM;
129 friend class InvRef;
130 friend class ObjectRef;
131 friend class NodeMetaRef;
132 friend class ModApiBase;
133 friend class ModApiEnv;
134 friend class LuaVoxelManip;
135 friend class TestMoveAction; // needs getStack()
136
137 /*
138 Subtle edge case with coroutines: If for whatever reason you have a
139 method in a subclass that's called from existing lua_CFunction
140 (any of the l_*.cpp files) then make it static and take the lua_State*
141 as an argument. This is REQUIRED because getStack() will not return the
142 correct state if called inside coroutines.
143
144 Also note that src/script/common/ is the better place for such helpers.
145 */
146 lua_State* getStack()
147 { return m_luastack; }
148
149 // Checks that stack size is sane
150 void realityCheck();
151 // Takes an error from lua_pcall and throws it as a LuaError
152 void scriptError(int result, const char *fxn);
153 // Dumps stack contents for debugging
154 void stackDump(std::ostream &o);
155
156 void setGameDef(IGameDef* gamedef) { m_gamedef = gamedef; }
157
159 void setEnv(Environment* env) { m_environment = env; }
160
161#if CHECK_CLIENT_BUILD()
162 GUIEngine* getGuiEngine() { return m_guiengine; }
163 void setGuiEngine(GUIEngine* guiengine) { m_guiengine = guiengine; }
164
165 SSCSMEnvironment *getSSCSMEnv() { return m_sscsm_environment; }
166 void setSSCSMEnv(SSCSMEnvironment *env) { m_sscsm_environment = env; }
167#endif
168
170 void setEmergeThread(EmergeThread *emerge) { m_emerge = emerge; }
171
172 void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj);
173
174 void pushPlayerHPChangeReason(lua_State *L, const PlayerHPChangeReason& reason);
175
176 std::recursive_mutex m_luastackmutex;
177 std::string m_last_run_mod;
178
179#ifdef SCRIPTAPI_LOCK_DEBUG
181 std::thread::id m_owning_thread;
182#endif
183
184private:
185 static int luaPanic(lua_State *L);
186
187 lua_State *m_luastack = nullptr;
188
189 IGameDef *m_gamedef = nullptr;
191#if CHECK_CLIENT_BUILD()
192 GUIEngine *m_guiengine = nullptr;
193 SSCSMEnvironment *m_sscsm_environment = nullptr;
194#endif
196
198};
RunCallbacksMode
Definition c_internal.h:83
Definition client.h:107
Definition emerge_internal.h:25
Definition environment.h:31
implementation of main menu based uppon formspecs
Definition guiEngine.h:113
Definition gamedef.h:26
Definition l_inventory.h:17
Definition s_env.cpp:20
Definition helper.h:14
Definition s_env.cpp:92
Definition l_vmanip.h:17
Definition l_base.h:28
Definition l_env.h:44
Definition l_nodemeta.h:16
Definition l_object.h:20
The thread that runs SSCSM code.
Definition sscsm_environment.h:26
Definition s_base.h:66
static std::string getCurrentModNameInsecure(lua_State *L)
Returns the currently running mod, only during init time.
Definition s_base.cpp:229
void setOriginDirect(const char *origin)
Definition s_base.cpp:400
void addObjectReference(ServerActiveObject *cobj)
Definition s_base.cpp:422
std::recursive_mutex m_luastackmutex
Definition s_base.h:176
void setEnv(Environment *env)
Definition s_base.h:159
void stackDump(std::ostream &o)
Definition s_base.cpp:373
void pushPlayerHPChangeReason(lua_State *L, const PlayerHPChangeReason &reason)
Definition s_base.cpp:507
Environment * getEnv()
Definition s_base.h:158
IGameDef * getGameDef()
Definition s_base.h:94
EmergeThread * m_emerge
Definition s_base.h:195
IGameDef * m_gamedef
Definition s_base.h:189
void realityCheck()
Definition s_base.cpp:357
ScriptingType getType()
Definition s_base.h:92
DISABLE_CLASS_COPY(ScriptApiBase)
EmergeThread * getEmergeThread()
Definition s_base.h:169
int m_lock_recursion_count
Definition s_base.h:180
void clientOpenLibs(lua_State *L)
Definition s_base.h:118
void setEmergeThread(EmergeThread *emerge)
Definition s_base.h:170
ScriptApiBase()
Definition s_base.h:70
ScriptingType m_type
Definition s_base.h:197
std::string m_last_run_mod
Definition s_base.h:177
void loadScript(const std::string &script_path)
Definition s_base.cpp:245
void loadMod(const std::string &script_path, const std::string &mod_name)
Definition s_base.cpp:237
void removeObjectReference(ServerActiveObject *cobj)
Definition s_base.cpp:455
Server * getServer()
Definition s_base.cpp:539
lua_State * m_luastack
Definition s_base.h:187
void setGameDef(IGameDef *gamedef)
Definition s_base.h:156
static int luaPanic(lua_State *L)
Definition s_base.cpp:167
const std::string & getOrigin()
Definition s_base.h:103
lua_State * getStack()
Definition s_base.h:146
void runCallbacksRaw(int nargs, RunCallbacksMode mode, const char *fxn)
Definition s_base.cpp:316
void checkSetByBuiltin()
Definition s_base.cpp:206
virtual ~ScriptApiBase()
Definition s_base.cpp:162
std::thread::id m_owning_thread
Definition s_base.h:181
void scriptError(int result, const char *fxn)
Definition s_base.cpp:368
void setOriginFromTableRaw(int index, const char *fxn)
Definition s_base.cpp:405
Environment * m_environment
Definition s_base.h:190
void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj)
Definition s_base.cpp:490
Definition serveractiveobject.h:41
Definition server.h:178
Definition test_moveaction.cpp:13
#define FATAL_ERROR(msg)
Definition debug.h:32
ScriptingType
Definition s_base.h:43
Definition mod_vfs.h:11
Definition player_sao.h:235