I was thinking about upgrading my code, because i have hundreds of modules and thousands of code lines. One solution that come to my mind was Loader. With this module, I could skip writing full paths and require calls for modules and remote events/functions by few lines of code.
local LoaderService = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
function LoaderService.LoadModules(ModulesFolder : Folder) : {[string] : any}
local modules = {}
for _, module in pairs(ModulesFolder:GetDescendants()) do
if module:IsA("ModuleScript") then
local success, result = pcall(require, module)
if success then
modules[module.Name] = result
else
warn("Error requiring module:", module.Name, "-", result)
end
end
end
return modules
end
function LoaderService.LoadRemotes() : () -> ({ [string]: RemoteEvent }, { [string]: RemoteFunction })
local remoteEvents = {}
local remoteFunctions = {}
for _, remote in pairs(ReplicatedStorage:GetDescendants()) do
if remote:IsA("RemoteEvent") then
remoteEvents[remote.Name] = remote
elseif remote:IsA("RemoteFunction") then
remoteFunctions[remote.Name] = remote
end
end
return remoteEvents, remoteFunctions
end
return LoaderService
i make ServerLoader in ServerScriptService
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LoaderService = require(ReplicatedStorage:WaitForChild("LoaderService"))
local ServerService = game:GetService("ServerStorage")
local ModulesFolder = ServerService:WaitForChild("Modules")
local ModuleLoader = require(ServerService:WaitForChild("ModuleLoader"))
ModuleLoader.Modules = LoaderService.LoadModules(ModulesFolder)
ModuleLoader.RemoteEvents, ModuleLoader.RemoteFunctions = LoaderService.LoadRemotes()
ModuleLoader looks like this
local ModuleLoader = {}
ModuleLoader.Modules = {}
ModuleLoader.RemoteEvents = {}
ModuleLoader.RemoteFunctions = {}
return ModuleLoader
What do you think about that? Will you add or change something?