diff --git a/Basalt/main.lua b/Basalt/main.lua index 65a3105..40d9ab5 100644 --- a/Basalt/main.lua +++ b/Basalt/main.lua @@ -1,5 +1,6 @@ local basaltEvent = require("basaltEvent")() -local _OBJECTS = require("loadObjects") +local baseObjects = require("loadObjects") +local moddedObjects local pluginSystem = require("plugin") local utils = require("utils") local log = require("basaltLogs") @@ -9,6 +10,7 @@ local count = utils.tableCount local moveThrottle = 300 local dragThrottle = 0 local renderingThrottle = 0 +local newObjects = {} local baseTerm = term.current() local version = "1.7.0" @@ -123,16 +125,15 @@ local bInstance = { schedule = schedule, stop = stop, - newFrame = Frame, debug = basalt.debug, log = basalt.log, getObjects = function() - return _OBJECTS + return moddedObjects end, getObject = function(id) - return _OBJECTS[id] + return moddedObjects[id] end, getDirectory = function() @@ -151,7 +152,7 @@ local function defaultErrorHandler(errMsg) local text = wrapText("Basalt error: "..errMsg, w) local yPos = 1 - for k,v in pairs(text)do + for _,v in pairs(text)do baseTerm.setCursorPos(1,yPos) baseTerm.write(v) yPos = yPos + 1 @@ -303,10 +304,10 @@ local function basaltUpdateEvent(event, ...) elseif(event=="timer")and(a[1]==renderingTimer)then renderingUpdateTimer() else - for k, v in pairs(frames) do + for _, v in pairs(frames) do v:eventHandler(event, ...) end - for k, v in pairs(monFrames) do + for _, v in pairs(monFrames) do v:eventHandler(event, ...) end handleSchedules(event, ...) @@ -314,13 +315,69 @@ local function basaltUpdateEvent(event, ...) end end +local loadedObjects = false +local loadedPlugins = false +local function InitializeBasalt() + if not(loadedObjects)then + for _,v in pairs(newObjects)do + if(fs.exists(v))then + if(fs.isDir(v))then + local files = fs.list(v) + for _,object in pairs(files)do + if not(fs.isDir(v.."/"..object))then + local name = object:gsub(".lua", "") + if(name~="example.lua")and not(name:find(".disabled"))then + if(baseObjects[name]==nil)then + baseObjects[name] = require(v.."."..object:gsub(".lua", "")) + else + error("Duplicate object name: "..name) + end + end + end + end + else + local name = v:gsub(".lua", "") + if(baseObjects[name]==nil)then + baseObjects[name] = require(name) + else + error("Duplicate object name: "..name) + end + end + end + end + loadedObjects = true + end + if not(loadedPlugins)then + moddedObjects = pluginSystem.loadPlugins(baseObjects, bInstance) + local basaltPlugins = pluginSystem.get("basalt") + if(basaltPlugins~=nil)then + for k,v in pairs(basaltPlugins)do + for a,b in pairs(v(basalt))do + basalt[a] = b + bInstance[a] = b + end + end + end + local basaltPlugins = pluginSystem.get("basaltInternal") + if(basaltPlugins~=nil)then + for _,v in pairs(basaltPlugins)do + for a,b in pairs(v(basalt))do + bInstance[a] = b + end + end + end + loadedPlugins = true + end +end + local function createFrame(name) + InitializeBasalt() for _, v in pairs(frames) do if (v:getName() == name) then return nil end end - local newFrame = _OBJECTS["BaseFrame"](name, bInstance) + local newFrame = moddedObjects["BaseFrame"](name, bInstance) newFrame:init() newFrame:load() newFrame:draw() @@ -344,6 +401,28 @@ basalt = { memory = function() return math.floor(collectgarbage("count")+0.5).."KB" end, + + addObject = function(path) + if(fs.exists(path))then + table.insert(newObjects, path) + end + end, + + addPlugin = function(path) + pluginSystem.addPlugin(path) + end, + + getAvailablePlugins = function() + return pluginSystem.getAvailablePlugins() + end, + + getAvailableObjects = function() + local objectNames = {} + for k,_ in pairs(baseObjects)do + table.insert(objectNames, k) + end + return objectNames + end, setVariable = setVariable, getVariable = getVariable, @@ -465,12 +544,13 @@ basalt = { createFrame = createFrame, addMonitor = function(name) + InitializeBasalt() for _, v in pairs(frames) do if (v:getName() == name) then return nil end end - local newFrame = _OBJECTS["MonitorFrame"](name, bInstance) + local newFrame = moddedObjects["MonitorFrame"](name, bInstance) newFrame:init() newFrame:load() newFrame:draw() @@ -487,8 +567,6 @@ basalt = { end, } -_OBJECTS = pluginSystem.addPlugins(_OBJECTS, bInstance) - local basaltPlugins = pluginSystem.get("basalt") if(basaltPlugins~=nil)then for k,v in pairs(basaltPlugins)do diff --git a/Basalt/plugin.lua b/Basalt/plugin.lua index 706bad7..016ac6d 100644 --- a/Basalt/plugin.lua +++ b/Basalt/plugin.lua @@ -1,10 +1,12 @@ -local args = {...} -local plugins = {} +local args = {...} +local plugins = {} +local pluginNames = {} local dir = fs.getDir(args[2] or "Basalt") local pluginDir = fs.combine(dir, "plugins") if(packaged)then for k,v in pairs(getProject("plugins"))do + table.insert(pluginNames, k) local newPlugin = v() if(type(newPlugin)=="table")then for a,b in pairs(newPlugin)do @@ -18,6 +20,7 @@ if(packaged)then end if(fs.exists(pluginDir))then for _,v in pairs(fs.list(pluginDir))do + table.insert(pluginNames, v) local newPlugin = require(v:gsub(".lua", "")) if(type(newPlugin)=="table")then for a,b in pairs(newPlugin)do @@ -35,14 +38,60 @@ local function get(name) end return { + --- Gets a plugin list + --- @param name string name of plugin list + --- @return table plugins get = get, - addPlugins = function(objects, basalt) + getAvailablePlugins = function() + return pluginNames + end, + + --- Adds a plugin to basalt's plugin list + --- @param path string path to plugin + addPlugin = function(path) + if(fs.exists(path))then + if(fs.isDir(path))then + for _,v in pairs(fs.list(path))do + table.insert(pluginNames, v) + if not(fs.isDir(fs.combine(path, v)))then + local pluginName = v:gsub(".lua", "") + local newPlugin = require(fs.combine(path, pluginName)) + if(type(newPlugin)=="table")then + for a,b in pairs(newPlugin)do + if(type(a)=="string")then + if(plugins[a]==nil)then plugins[a] = {} end + table.insert(plugins[a], b) + end + end + end + end + end + else + local newPlugin = require(path:gsub(".lua", "")) + table.insert(pluginNames, path:match("[\\/]?([^\\/]-([^%.]+))$")) + if(type(newPlugin)=="table")then + for a,b in pairs(newPlugin)do + if(type(a)=="string")then + if(plugins[a]==nil)then plugins[a] = {} end + table.insert(plugins[a], b) + end + end + end + end + end + end, + + --- Loads all available plugins into basalt's objects + --- @param objects table objects to load plugins into + --- @param basalt table basalt + --- @return table objects modified objects + loadPlugins = function(objects, basalt) for k,v in pairs(objects)do local plugList = plugins[k] if(plugList~=nil)then objects[k] = function(...) local moddedObject = v(...) - for a,b in pairs(plugList)do + for _,b in pairs(plugList)do local ext = b(moddedObject, basalt, ...) ext.__index = ext moddedObject = setmetatable(ext, moddedObject)