Files
Halyde/lib/component.lua
T
WahPlus 3d9ec665b9 Added component.isAvailable()
The function checks if a component of a specified type exists.
2025-09-30 21:15:19 +03:00

127 lines
3.2 KiB
Lua

local compLib
local LLcomponent
if table.copy then
compLib = table.copy(component)
LLcomponent = table.copy(component)
else
compLib = {}
LLcomponent = component
end
--local ocelot = LLcomponent.proxy(LLcomponent.list("ocelot")())
--ocelot.log("loaded")
_G.componentlib = { ["additions"] = {}, ["removals"] = {} }
compLib.virtual = {}
function compLib.virtual.add(address, componentType, proxy)
checkArg(1, address, "string")
checkArg(2, componentType, "string")
checkArg(3, proxy, "table")
proxy["address"] = address
local proc
if _PUBLIC.tsched then
proc = _PUBLIC.tsched.getCurrentTask()
end
componentlib.additions[address] = { ["componentType"] = componentType, ["proxy"] = proxy, ["proc"] = proc }
if componentlib.removals[address] then
componentlib.removals[address] = nil
end
end
function compLib.virtual.remove(address)
checkArg(1, address, "string")
if componentlib.additions[address] then
componentlib.additions[address] = nil
else
table.insert(componentlib.removals, address)
end
end
function compLib.virtual.check(address)
checkArg(1, address, "string")
if _G.componentlib.additions[address] then
return true, _G.componentlib.additions[address].proc
else
return false
end
end
function compLib.list(componentType)
checkArg(1, componentType, "string", "nil")
local componentList = LLcomponent.list(componentType)
for address, dataTable in pairs(componentlib.additions) do
if dataTable.componentType == componentType or not componentType then
componentList[address] = dataTable.componentType
end
end
for _, address in pairs(componentlib.removals) do
componentList[address] = nil
end
local i, value
setmetatable(componentList, {
__call = function(self)
i, value = next(self, i)
return i, value
end,
})
return componentList
end
function compLib.proxy(address)
if componentlib.additions[address] then
--ocelot.log("vcomponent")
return componentlib.additions[address].proxy
else
return LLcomponent.proxy(address)
end
end
function compLib.invoke(address, funcName, ...)
--ocelot.log("Invoking " .. funcName .. " from " .. address)
if componentlib.additions[address] then
--ocelot.log("vcomponent")
if not componentlib.additions[address].proxy[funcName] then
error("no such method")
end
return componentlib.additions[address].proxy[funcName](...)
else
return LLcomponent.invoke(address, funcName, ...)
end
end
function compLib.get(address)
checkArg(1, address, "string")
if #address < 3 then
return nil, "abbreviated address must be at least 3 characters long"
end
for currentAddress, name in compLib.list() do
if currentAddress:find("^" .. address) then
return currentAddress
end
end
return nil, "full address not found"
end
function compLib.isAvailable(componentType)
checkArg(1, componentType, "string")
if LLcomponent.list(componentType)() then
return true
else
return false
end
end
-- Add main component proxies to the library
setmetatable(compLib, {
["__index"] = function(_, item)
if LLcomponent.list(item)() then
return compLib.proxy(compLib.list(item)())
else
return compLib[item]
end
end,
})
return compLib