-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModuleLoader.luau
More file actions
86 lines (76 loc) · 2.88 KB
/
Copy pathModuleLoader.luau
File metadata and controls
86 lines (76 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
--- BY SEVENTYFIVEOF (ASES)
-- ALLOW TO :
-- LOAD ANY MODULES FROM THE FOLLOWING FOLDERS :
-- REPLICATEDSTORAGE :
-- -> Modules
-- -- -> ClientSide
-- -- -> ServerSide
-- -- -> Helpers
-- SERVERSTORAGE :
-- -> Modules
-- -- -> Any modules inside here will be also loaded (AS SERVERSIDE)
local ModuleLoader = {}
local self = ModuleLoader
local RunService = game:GetService("RunService")
self._modules_folder = script.Parent
self._cached_modules = {}
self.is_server = RunService:IsServer()
self.is_client = RunService:IsClient()
local extraFolder = nil
if self.is_server then
extraFolder = game.ServerStorage.Modules
end
function self:_getmodule(name)
return self._cached_modules[name] and self._cached_modules[name].Module
end
function self:_init()
local to_call = {}
local folders_to_scan = {self._modules_folder}
if self.is_server and extraFolder then
table.insert(folders_to_scan, extraFolder)
end
for _, parent_folder in ipairs(folders_to_scan) do
for _, folder in pairs(parent_folder:GetChildren()) do
if folder:IsA("Folder") then
local folder_type
if folder.Name:lower() == "helpers" then
folder_type = "Both"
elseif parent_folder == extraFolder then
folder_type = "Server"
else
folder_type = folder.Name == "ServerSide" and "Server" or "Client"
end
if folder_type == "Both" or (self.is_server and folder_type == "Server") or (self.is_client and folder_type == "Client") then
for _, module_script in pairs(folder:GetDescendants()) do
if module_script:IsA("ModuleScript") then
local module_obj = require(module_script)
self._cached_modules[module_script.Name] = {
Module = module_obj,
Type = folder_type
}
if module_script.Name == folder.Name or type(module_obj) == "function" or
(type(module_obj) == "table" and module_obj.GetModules) then
table.insert(to_call, {Module = module_obj, Type = folder_type})
end
end
end
end
end
end
end
for _, info in ipairs(to_call) do
local modules_of_type = {}
for name, cached in pairs(self._cached_modules) do
if cached.Type == info.Type or cached.Type == "Both" then
modules_of_type[name] = cached.Module
end
end
if type(info.Module) == "function" then
info.Module(modules_of_type)
else
info.Module:GetModules(modules_of_type)
end
end
end
self:_init()
return self