|
28 | 28 | #include "utils/module_names.hpp" |
29 | 29 |
|
30 | 30 | #include <godot_cpp/core/binder_common.hpp> |
31 | | -#include <godot_cpp/classes/file_access.hpp> |
| 31 | +#include <godot_cpp/classes/engine.hpp> |
| 32 | +#include <godot_cpp/classes/os.hpp> |
| 33 | +#include <godot_cpp/classes/project_settings.hpp> |
| 34 | +#include <luaconf.h> |
32 | 35 |
|
33 | 36 | namespace luagdextension { |
34 | 37 |
|
@@ -166,6 +169,58 @@ LuaTable *LuaState::get_registry() const { |
166 | 169 | return memnew(LuaTable(lua_state.registry())); |
167 | 170 | } |
168 | 171 |
|
| 172 | +String LuaState::get_package_path() const { |
| 173 | + if (auto package = lua_state.get<sol::optional<sol::table>>("package")) { |
| 174 | + return package->get<String>("path"); |
| 175 | + } |
| 176 | + else { |
| 177 | + ERR_FAIL_V_MSG("", "LUA_PACKAGE library is not opened"); |
| 178 | + } |
| 179 | +} |
| 180 | + |
| 181 | +String LuaState::get_package_cpath() const { |
| 182 | + if (auto package = lua_state.get<sol::optional<sol::table>>("package")) { |
| 183 | + return package->get<String>("cpath"); |
| 184 | + } |
| 185 | + else { |
| 186 | + ERR_FAIL_V_MSG("", "LUA_PACKAGE library is not opened"); |
| 187 | + } |
| 188 | +} |
| 189 | + |
| 190 | +void LuaState::set_package_path(const String& path) { |
| 191 | + if (auto package = lua_state.get<sol::optional<sol::table>>("package")) { |
| 192 | + package->set("path", |
| 193 | + path.replace(";;", LUA_PATH_SEP LUA_PATH_DEFAULT LUA_PATH_SEP) |
| 194 | + .rstrip(LUA_PATH_SEP) |
| 195 | + .lstrip(LUA_PATH_SEP) |
| 196 | + .replace(LUA_EXEC_DIR, get_lua_exec_dir()) |
| 197 | + ); |
| 198 | + } |
| 199 | + else { |
| 200 | + ERR_FAIL_MSG("LUA_PACKAGE library is not opened"); |
| 201 | + } |
| 202 | +} |
| 203 | + |
| 204 | +void LuaState::set_package_cpath(const String& cpath) { |
| 205 | + if (auto package = lua_state.get<sol::optional<sol::table>>("package")) { |
| 206 | + package->set("cpath", |
| 207 | + cpath.replace(";;", LUA_PATH_SEP LUA_CPATH_DEFAULT LUA_PATH_SEP) |
| 208 | + .rstrip(LUA_PATH_SEP) |
| 209 | + .lstrip(LUA_PATH_SEP) |
| 210 | + .replace(LUA_EXEC_DIR, get_lua_exec_dir()) |
| 211 | + ); |
| 212 | + } |
| 213 | + else { |
| 214 | + ERR_FAIL_MSG("LUA_PACKAGE library is not opened"); |
| 215 | + } |
| 216 | +} |
| 217 | + |
| 218 | +String LuaState::get_lua_exec_dir() { |
| 219 | + return Engine::get_singleton()->is_editor_hint() |
| 220 | + ? ProjectSettings::get_singleton()->globalize_path("res://") |
| 221 | + : OS::get_singleton()->get_executable_path().get_base_dir(); |
| 222 | +} |
| 223 | + |
169 | 224 | LuaState *LuaState::find_lua_state(lua_State *L) { |
170 | 225 | L = sol::main_thread(L); |
171 | 226 | if (LuaState **ptr = valid_states.getptr(L)) { |
@@ -219,10 +274,17 @@ void LuaState::_bind_methods() { |
219 | 274 | ClassDB::bind_method(D_METHOD("do_file", "filename", "mode", "env"), &LuaState::do_file, DEFVAL(LOAD_MODE_ANY), DEFVAL(nullptr)); |
220 | 275 | ClassDB::bind_method(D_METHOD("get_globals"), &LuaState::get_globals); |
221 | 276 | ClassDB::bind_method(D_METHOD("get_registry"), &LuaState::get_registry); |
| 277 | + ClassDB::bind_method(D_METHOD("get_package_path"), &LuaState::get_package_path); |
| 278 | + ClassDB::bind_method(D_METHOD("get_package_cpath"), &LuaState::get_package_cpath); |
| 279 | + ClassDB::bind_method(D_METHOD("set_package_path", "path"), &LuaState::set_package_path); |
| 280 | + ClassDB::bind_method(D_METHOD("set_package_cpath", "cpath"), &LuaState::set_package_cpath); |
| 281 | + ClassDB::bind_static_method(LuaState::get_class_static(), D_METHOD("get_lua_exec_dir"), &LuaState::get_lua_exec_dir); |
222 | 282 |
|
223 | 283 | // Properties |
224 | 284 | ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "globals", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE, LuaTable::get_class_static()), "", "get_globals"); |
225 | 285 | ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "registry", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE, LuaTable::get_class_static()), "", "get_registry"); |
| 286 | + ADD_PROPERTY(PropertyInfo(Variant::STRING, "package_path", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_package_path", "get_package_path"); |
| 287 | + ADD_PROPERTY(PropertyInfo(Variant::STRING, "package_cpath", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_package_cpath", "get_package_cpath"); |
226 | 288 | } |
227 | 289 |
|
228 | 290 | LuaState::operator String() const { |
|
0 commit comments