aboutsummaryrefslogtreecommitdiff
path: root/src/script/cpp_api/s_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/cpp_api/s_base.cpp')
-rw-r--r--src/script/cpp_api/s_base.cpp55
1 files changed, 47 insertions, 8 deletions
diff --git a/src/script/cpp_api/s_base.cpp b/src/script/cpp_api/s_base.cpp
index 5569a536e..e8d973de1 100644
--- a/src/script/cpp_api/s_base.cpp
+++ b/src/script/cpp_api/s_base.cpp
@@ -120,16 +120,32 @@ ScriptApiBase::ScriptApiBase(ScriptingType type):
#endif
// Add basic globals
- lua_newtable(m_luastack);
- lua_setglobal(m_luastack, "core");
- // vector.metatable is stored in the registry for quick access from C++.
+ // "core" table:
lua_newtable(m_luastack);
- lua_rawseti(m_luastack, LUA_REGISTRYINDEX, CUSTOM_RIDX_VECTOR_METATABLE);
- lua_newtable(m_luastack);
- lua_rawgeti(m_luastack, LUA_REGISTRYINDEX, CUSTOM_RIDX_VECTOR_METATABLE);
- lua_setfield(m_luastack, -2, "metatable");
- lua_setglobal(m_luastack, "vector");
+ // Populate with some internal functions which will be removed in Lua:
+ lua_pushcfunction(m_luastack, [](lua_State *L) -> int {
+ lua_rawseti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_READ_VECTOR);
+ return 0;
+ });
+ lua_setfield(m_luastack, -2, "set_read_vector");
+ lua_pushcfunction(m_luastack, [](lua_State *L) -> int {
+ lua_rawseti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_VECTOR);
+ return 0;
+ });
+ lua_setfield(m_luastack, -2, "set_push_vector");
+ lua_pushcfunction(m_luastack, [](lua_State *L) -> int {
+ lua_rawseti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_READ_NODE);
+ return 0;
+ });
+ lua_setfield(m_luastack, -2, "set_read_node");
+ lua_pushcfunction(m_luastack, [](lua_State *L) -> int {
+ lua_rawseti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_NODE);
+ return 0;
+ });
+ lua_setfield(m_luastack, -2, "set_push_node");
+ // Finally, put the table into the global environment:
+ lua_setglobal(m_luastack, "core");
if (m_type == ScriptingType::Client)
lua_pushstring(m_luastack, "/");
@@ -180,6 +196,29 @@ void ScriptApiBase::clientOpenLibs(lua_State *L)
}
}
+void ScriptApiBase::checkSetByBuiltin()
+{
+ lua_State *L = getStack();
+
+ if (m_gamedef) {
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_READ_VECTOR);
+ FATAL_ERROR_IF(lua_type(L, -1) != LUA_TFUNCTION, "missing read_vector");
+ lua_pop(L, 1);
+
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_VECTOR);
+ FATAL_ERROR_IF(lua_type(L, -1) != LUA_TFUNCTION, "missing push_vector");
+ lua_pop(L, 1);
+
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_READ_NODE);
+ FATAL_ERROR_IF(lua_type(L, -1) != LUA_TFUNCTION, "missing read_node");
+ lua_pop(L, 1);
+
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_NODE);
+ FATAL_ERROR_IF(lua_type(L, -1) != LUA_TFUNCTION, "missing push_node");
+ lua_pop(L, 1);
+ }
+}
+
void ScriptApiBase::loadMod(const std::string &script_path,
const std::string &mod_name)
{