From b38ffdec279bcded98e34f5116c8d676aa9f73a7 Mon Sep 17 00:00:00 2001 From: Jude Melton-Houghton Date: Tue, 18 Oct 2022 18:01:44 -0400 Subject: Implement vector and node conversion in Lua (#12609) Co-authored-by: sfan5 --- src/script/cpp_api/s_base.cpp | 55 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 8 deletions(-) (limited to 'src/script/cpp_api/s_base.cpp') 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) { -- cgit v1.2.3