X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fscript%2Fcpp_api%2Fs_base.h;h=19d71df6517f27660f0ef2ec225ab3fd94709271;hb=0727bb3ddd9c550ff962af4546bac8cc058bce73;hp=3cb59634b01f2b576ea1d8d44667c40899e58a4f;hpb=4e1f50035e860a00636ca5d804c267119df99601;p=dragonfireclient.git diff --git a/src/script/cpp_api/s_base.h b/src/script/cpp_api/s_base.h index 3cb59634b..19d71df65 100644 --- a/src/script/cpp_api/s_base.h +++ b/src/script/cpp_api/s_base.h @@ -28,32 +28,70 @@ extern "C" { } #include "irrlichttypes.h" -#include "jmutex.h" -#include "jmutexautolock.h" +#include "threads.h" +#include "threading/mutex.h" +#include "threading/mutex_auto_lock.h" #include "common/c_types.h" +#include "common/c_internal.h" #define SCRIPTAPI_LOCK_DEBUG +#define SCRIPTAPI_DEBUG + +// MUST be an invalid mod name so that mods can't +// use that name to bypass security! +#define BUILTIN_MOD_NAME "*builtin*" + +#define PCALL_RES(RES) do { \ + int result_ = (RES); \ + if (result_ != 0) { \ + scriptError(result_, __FUNCTION__); \ + } \ +} while (0) + +#define runCallbacks(nargs, mode) \ + runCallbacksRaw((nargs), (mode), __FUNCTION__) + +#define setOriginFromTable(index) \ + setOriginFromTableRaw(index, __FUNCTION__) class Server; +#ifndef SERVER +class Client; +#endif +class IGameDef; class Environment; class GUIEngine; class ServerActiveObject; class ScriptApiBase { public: - ScriptApiBase(); virtual ~ScriptApiBase(); - bool loadMod(const std::string &scriptpath, const std::string &modname); - bool loadScript(const std::string &scriptpath); + // These throw a ModError on failure + void loadMod(const std::string &script_path, const std::string &mod_name); + void loadScript(const std::string &script_path); + + void runCallbacksRaw(int nargs, + RunCallbacksMode mode, const char *fxn); /* object */ void addObjectReference(ServerActiveObject *cobj); void removeObjectReference(ServerActiveObject *cobj); + IGameDef *getGameDef() { return m_gamedef; } + Server* getServer(); +#ifndef SERVER + Client* getClient(); +#endif + + std::string getOrigin() { return m_last_run_mod; } + void setOriginDirect(const char *origin); + void setOriginFromTableRaw(int index, const char *fxn); + protected: friend class LuaABM; + friend class LuaLBM; friend class InvRef; friend class ObjectRef; friend class NodeMetaRef; @@ -65,11 +103,10 @@ class ScriptApiBase { { return m_luastack; } void realityCheck(); - void scriptError(const char *fmt, ...); + void scriptError(int result, const char *fxn); void stackDump(std::ostream &o); - Server* getServer() { return m_server; } - void setServer(Server* server) { m_server = server; } + void setGameDef(IGameDef* gamedef) { m_gamedef = gamedef; } Environment* getEnv() { return m_environment; } void setEnv(Environment* env) { m_environment = env; } @@ -77,17 +114,23 @@ class ScriptApiBase { GUIEngine* getGuiEngine() { return m_guiengine; } void setGuiEngine(GUIEngine* guiengine) { m_guiengine = guiengine; } - void objectrefGetOrCreate(ServerActiveObject *cobj); - void objectrefGet(u16 id); + void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj); + void objectrefGet(lua_State *L, u16 id); - JMutex m_luastackmutex; + RecursiveMutex m_luastackmutex; + std::string m_last_run_mod; + bool m_secure; #ifdef SCRIPTAPI_LOCK_DEBUG - bool m_locked; + int m_lock_recursion_count; + threadid_t m_owning_thread; #endif + private: + static int luaPanic(lua_State *L); + lua_State* m_luastack; - Server* m_server; + IGameDef* m_gamedef; Environment* m_environment; GUIEngine* m_guiengine; };