* [CSM] Don't load the IO library.
* Rename the function to match the Lua API function name and add a missing `const`
* Add a comment to explain some strange code and fix the other issues pointed out by shadowninja.
AsyncWorkerThread::AsyncWorkerThread(AsyncEngine* jobDispatcher,
const std::string &name) :
Thread(name),
+ ScriptApiBase(ScriptingType::Async),
jobDispatcher(jobDispatcher)
{
lua_State *L = getStack();
ScriptApiBase
*/
-ScriptApiBase::ScriptApiBase()
+ScriptApiBase::ScriptApiBase(ScriptingType type):
+ m_type(type)
{
#ifdef SCRIPTAPI_LOCK_DEBUG
m_lock_recursion_count = 0;
lua_atpanic(m_luastack, &luaPanic);
- luaL_openlibs(m_luastack);
+ if (m_type == ScriptingType::Client)
+ clientOpenLibs(m_luastack);
+ else
+ luaL_openlibs(m_luastack);
// Make the ScriptApiBase* accessible to ModApiBase
lua_pushlightuserdata(m_luastack, this);
lua_newtable(m_luastack);
lua_setglobal(m_luastack, "core");
- lua_pushstring(m_luastack, DIR_DELIM);
+ if (m_type == ScriptingType::Client)
+ lua_pushstring(m_luastack, "/");
+ else
+ lua_pushstring(m_luastack, DIR_DELIM);
lua_setglobal(m_luastack, "DIR_DELIM");
lua_pushstring(m_luastack, porting::getPlatformName());
return 0;
}
+void ScriptApiBase::clientOpenLibs(lua_State *L)
+{
+ static const std::vector<std::pair<std::string, lua_CFunction>> m_libs = {
+ { "", luaopen_base },
+ { LUA_LOADLIBNAME, luaopen_package },
+ { LUA_TABLIBNAME, luaopen_table },
+ { LUA_OSLIBNAME, luaopen_os },
+ { LUA_STRLIBNAME, luaopen_string },
+ { LUA_MATHLIBNAME, luaopen_math },
+ { LUA_DBLIBNAME, luaopen_debug },
+#if USE_LUAJIT
+ { LUA_JITLIBNAME, luaopen_jit },
+#endif
+ };
+
+ for (const std::pair<std::string, lua_CFunction> &lib : m_libs) {
+ lua_pushcfunction(L, lib.second);
+ lua_pushstring(L, lib.first.c_str());
+ lua_call(L, 1, 0);
+ }
+}
+
void ScriptApiBase::loadMod(const std::string &script_path,
const std::string &mod_name)
{
#include <string>
#include <thread>
#include <mutex>
+#include <unordered_map>
#include "util/basic_macros.h"
extern "C" {
#include <lua.h>
+#include <lualib.h>
}
#include "irrlichttypes.h"
#include "common/c_types.h"
#include "common/c_internal.h"
+#include "debug.h"
+#include "cmake_config.h"
#define SCRIPTAPI_LOCK_DEBUG
#define SCRIPTAPI_DEBUG
setOriginFromTableRaw(index, __FUNCTION__)
enum class ScriptingType: u8 {
+ Async,
Client,
- Server,
- MainMenu
+ MainMenu,
+ Server
};
class Server;
class ScriptApiBase {
public:
- ScriptApiBase();
+ ScriptApiBase(ScriptingType type);
+ // fake constructor to allow script API classes (e.g ScriptApiEnv) to virtually inherit from this one.
+ ScriptApiBase()
+ {
+ FATAL_ERROR("ScriptApiBase created without ScriptingType!");
+ }
virtual ~ScriptApiBase();
DISABLE_CLASS_COPY(ScriptApiBase);
IGameDef *getGameDef() { return m_gamedef; }
Server* getServer();
- void setType(ScriptingType type) { m_type = type; }
ScriptingType getType() { return m_type; }
#ifndef SERVER
Client* getClient();
void setOriginDirect(const char *origin);
void setOriginFromTableRaw(int index, const char *fxn);
+ void clientOpenLibs(lua_State *L);
+
protected:
friend class LuaABM;
friend class LuaLBM;
#include "lua_api/l_localplayer.h"
#include "lua_api/l_camera.h"
-ClientScripting::ClientScripting(Client *client)
+ClientScripting::ClientScripting(Client *client):
+ ScriptApiBase(ScriptingType::Client)
{
setGameDef(client);
- setType(ScriptingType::Client);
SCRIPTAPI_PRECHECKHEADER
lua_pushstring(L, "client");
lua_setglobal(L, "INIT");
- lua_pushstring(L, "/");
- lua_setglobal(L, "DIR_DELIM");
-
infostream << "SCRIPTAPI: Initialized client game modules" << std::endl;
}
#define MAINMENU_NUM_ASYNC_THREADS 4
-MainMenuScripting::MainMenuScripting(GUIEngine* guiengine)
+MainMenuScripting::MainMenuScripting(GUIEngine* guiengine):
+ ScriptApiBase(ScriptingType::MainMenu)
{
setGuiEngine(guiengine);
- setType(ScriptingType::MainMenu);
SCRIPTAPI_PRECHECKHEADER
#include "lualib.h"
}
-ServerScripting::ServerScripting(Server* server)
+ServerScripting::ServerScripting(Server* server):
+ ScriptApiBase(ScriptingType::Server)
{
setGameDef(server);
- setType(ScriptingType::Server);
// setEnv(env) is called by ScriptApiEnv::initializeEnvironment()
// once the environment has been created