diff --git a/game/engines/default/engine/Module.lua b/game/engines/default/engine/Module.lua index 50fc200217d75de10f60d84f541d16da4143037c..8a3388885183455a700670ab77e12836115afdd0 100644 --- a/game/engines/default/engine/Module.lua +++ b/game/engines/default/engine/Module.lua @@ -255,8 +255,8 @@ end --- List all available addons function _M:loadAddons(mod) local adds = {} - local load = function(dir) - local add_def = loadfile(team and (dir.."/mod/init.lua") or (dir.."/init.lua")) + local load = function(dir, teaa) + local add_def = loadfile(dir.."/init.lua") if add_def then local add = {} setfenv(add_def, add) @@ -264,6 +264,7 @@ function _M:loadAddons(mod) if engine.version_string(add.version) == engine.version_string(mod.version) and add.for_module == mod.short_name then add.dir = dir + add.teaa = teaa adds[#adds+1] = add end end @@ -273,24 +274,39 @@ function _M:loadAddons(mod) local dir = "/addons/"..short_name print("Checking addon", short_name, ":: (as dir)", fs.exists(dir.."/init.lua"), ":: (as teaa)", short_name:find(".teaa$"), "") if fs.exists(dir.."/init.lua") then - load(dir) - elseif short_name:find(".team$") then + load(dir, nil) + elseif short_name:find(".teaa$") then + fs.mount(fs.getRealPath(dir), "/testload", false) + local mod + if fs.exists("/testload/init.lua") then + load("/testload", dir) + end + fs.umount(fs.getRealPath(dir)) end end end table.sort(adds, function(a, b) return a.weight < b.weight end) for i, add in ipairs(adds) do - print("Binding addon", add.long_name) - if add.data then fs.mount(fs.getRealPath(add.dir).."/data", "/data-"..add.short_name, false) print(" * with data") end - if add.superload then fs.mount(fs.getRealPath(add.dir).."/superload", "/mod/addons/"..add.short_name.."/superload", false) print(" * with superload") end - if add.overload then fs.mount(fs.getRealPath(add.dir).."/overload", "/", true) print(" * with overload") end + print("Binding addon", add.long_name, add.teaa) + local base + if add.teaa then + fs.mount(fs.getRealPath(add.teaa), "/loaded-addons/"..add.short_name, true) + base = "bind::/loaded-addons/"..add.short_name + else + base = fs.getRealPath(add.dir) + end + + if add.data then fs.mount(base.."/data", "/data-"..add.short_name, true) print(" * with data") end + if add.superload then fs.mount(base.."/superload", "/mod/addons/"..add.short_name.."/superload", true) print(" * with superload") end + if add.overload then fs.mount(base.."/overload", "/", false) print(" * with overload") end if add.hooks then - fs.mount(fs.getRealPath(add.dir).."/hooks", "/hooks/"..add.short_name, true) + fs.mount(base.."/hooks", "/hooks/"..add.short_name, true) dofile("/hooks/"..add.short_name.."/load.lua") print(" * with hooks") end end + table.print(fs.getSearchPath(true)) end --- Make a module loadscreen diff --git a/src/physfs/archivers/bind_physfs.c b/src/physfs/archivers/bind_physfs.c index e40f89d12ea8251728723722383ae1ea424535a8..15156e4783b9428a31f830647e6a7f6275c74e0f 100644 --- a/src/physfs/archivers/bind_physfs.c +++ b/src/physfs/archivers/bind_physfs.c @@ -14,6 +14,22 @@ #define __PHYSICSFS_INTERNAL__ #include "physfs_internal.h" +static char *__BIND_PHYSFS_toDependent(dvoid *opaque, const char *name, const char *append) +{ + char *f = __PHYSFS_platformCvtToDependent((char *)opaque, name, NULL); + + // Forbid recursions + if (!strncmp(name, opaque+1, strlen(opaque+1))) + { + return NULL; + } + else + { + char *f = __PHYSFS_platformCvtToDependent((char *)opaque, name, NULL); + return f; + } +} + static PHYSFS_sint64 BIND_PHYSFS_read(fvoid *opaque, void *buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount) { @@ -107,7 +123,7 @@ static void BIND_PHYSFS_enumerateFiles(dvoid *opaque, const char *dname, int omitSymLinks, PHYSFS_EnumFilesCallback cb, const char *origdir, void *callbackdata) { - char *d = __PHYSFS_platformCvtToDependent((char *)opaque, dname, NULL); + char *d = __BIND_PHYSFS_toDependent((char *)opaque, dname, NULL); if (d != NULL) { @@ -119,7 +135,7 @@ static void BIND_PHYSFS_enumerateFiles(dvoid *opaque, const char *dname, static int BIND_PHYSFS_exists(dvoid *opaque, const char *name) { - char *f = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL); + char *f = __BIND_PHYSFS_toDependent((char *) opaque, name, NULL); int retval; BAIL_IF_MACRO(f == NULL, NULL, 0); @@ -131,7 +147,7 @@ static int BIND_PHYSFS_exists(dvoid *opaque, const char *name) static int BIND_PHYSFS_isDirectory(dvoid *opaque, const char *name, int *fileExists) { - char *d = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL); + char *d = __BIND_PHYSFS_toDependent((char *) opaque, name, NULL); int retval = 0; BAIL_IF_MACRO(d == NULL, NULL, 0); @@ -153,7 +169,7 @@ static PHYSFS_sint64 BIND_PHYSFS_getLastModTime(dvoid *opaque, const char *name, int *fileExists) { - char *d = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL); + char *d = __BIND_PHYSFS_toDependent((char *) opaque, name, NULL); PHYSFS_sint64 retval = -1; BAIL_IF_MACRO(d == NULL, NULL, 0); @@ -169,7 +185,7 @@ static fvoid *doOpen(dvoid *opaque, const char *name, void *(*openFunc)(const char *filename), int *fileExists) { - char *f = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL); + char *f = __BIND_PHYSFS_toDependent((char *) opaque, name, NULL); void *rc = NULL; BAIL_IF_MACRO(f == NULL, NULL, NULL);