Reapply "Nonfunctional virtual component support"

This reverts commit bc06ec457d.
This commit is contained in:
Ponali
2025-06-14 17:48:27 +02:00
parent bc06ec457d
commit de035e9d2e
3 changed files with 81 additions and 12 deletions
+2 -2
View File
@@ -12,8 +12,8 @@ local conversionTables = {
}
}
function table.find(table, item)
for k, v in pairs(table) do
function table.find(tab, item)
for k, v in pairs(tab) do
if v == item then
return k
end
+76 -9
View File
@@ -1,15 +1,82 @@
local componentlib
local compLib
local LLcomponent
if table.copy then
componentlib = table.copy(component)
compLib = table.copy(component)
LLcomponent = table.copy(component)
else
componentlib = {}
compLib = {}
LLcomponent = component
end
function componentlib.get(address)
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")
assert(#address >= 3, "abbreviated address must be at least 3 characters long")
local components = component.list()
for currentAddress, name in pairs(components) do
checkArg(2, componentType, "string")
checkArg(3, proxy, "table")
componentlib.additions[address] = {["componentType"] = componentType, ["proxy"] = proxy}
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.list(componentType)
checkArg(1, componentType, "string", "nil")
local componentList = table.copy(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")
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
@@ -17,6 +84,6 @@ function componentlib.get(address)
return nil, "full address not found"
end
componentlib.invoke = component.invoke
compLib.invoke = component.invoke -- trust me, this is needed
return componentlib
return compLib