2024-03-06 18:04:49 +01:00
|
|
|
-- Registered metatables, used by the C++ packer
|
2025-02-22 22:40:34 +01:00
|
|
|
local serializable_metatables = {}
|
2024-03-06 18:04:49 +01:00
|
|
|
local known_metatables = {}
|
2025-02-22 22:40:34 +01:00
|
|
|
|
|
|
|
local function dummy_serializer(x)
|
|
|
|
return x
|
|
|
|
end
|
|
|
|
|
|
|
|
function core.register_portable_metatable(name, mt, serializer, deserializer)
|
|
|
|
serializer = serializer or dummy_serializer
|
|
|
|
deserializer = deserializer or function(x) return setmetatable(x, mt) end
|
2024-03-06 18:04:49 +01:00
|
|
|
assert(type(name) == "string", ("attempt to use %s value as metatable name"):format(type(name)))
|
|
|
|
assert(type(mt) == "table", ("attempt to register a %s value as metatable"):format(type(mt)))
|
2025-02-22 22:40:34 +01:00
|
|
|
assert(type(serializer), ("attempt to use a %s value as serializer"):format(type(serializer)))
|
|
|
|
assert(type(deserializer), ("attempt to use a %s value as serialier"):format(type(deserializer)))
|
2024-03-06 18:04:49 +01:00
|
|
|
assert(known_metatables[name] == nil or known_metatables[name] == mt,
|
|
|
|
("attempt to override metatable %s"):format(name))
|
|
|
|
known_metatables[name] = mt
|
|
|
|
known_metatables[mt] = name
|
2025-02-22 22:40:34 +01:00
|
|
|
serializable_metatables[mt] = serializer
|
|
|
|
serializable_metatables[name] = deserializer
|
2024-03-06 18:04:49 +01:00
|
|
|
end
|
2025-02-22 22:40:34 +01:00
|
|
|
|
2024-03-06 18:04:49 +01:00
|
|
|
core.known_metatables = known_metatables
|
2025-02-22 22:40:34 +01:00
|
|
|
core.serializable_metatables = serializable_metatables
|
2024-03-06 18:04:49 +01:00
|
|
|
|
2024-08-02 00:13:25 +02:00
|
|
|
function core.register_async_metatable(...)
|
2024-10-28 19:40:18 +01:00
|
|
|
core.log("deprecated", "core.register_async_metatable is deprecated. " ..
|
|
|
|
"Use core.register_portable_metatable instead.")
|
2024-08-02 00:13:25 +02:00
|
|
|
return core.register_portable_metatable(...)
|
|
|
|
end
|
|
|
|
|
|
|
|
core.register_portable_metatable("__builtin:vector", vector.metatable)
|
2025-02-22 22:46:44 +01:00
|
|
|
|
|
|
|
if ItemStack then
|
|
|
|
local item = ItemStack()
|
|
|
|
local itemstack_mt = getmetatable(item)
|
|
|
|
core.register_portable_metatable("__itemstack", itemstack_mt, item.to_table, ItemStack)
|
|
|
|
end
|