99 lines
2.5 KiB
Lua
99 lines
2.5 KiB
Lua
local function safeRequire(moduleName)
|
|
local ok, result = pcall(require, moduleName)
|
|
if ok and type(result) == "table" then
|
|
return result
|
|
end
|
|
return {}
|
|
end
|
|
|
|
local function appendArray(target, source)
|
|
if type(source) ~= "table" then
|
|
return
|
|
end
|
|
for _, value in ipairs(source) do
|
|
target[#target + 1] = value
|
|
end
|
|
end
|
|
|
|
local function mergeSpec(baseSpec, extraSpec)
|
|
local merged = {
|
|
items = {},
|
|
prefixes = {},
|
|
}
|
|
|
|
if type(baseSpec) == "table" then
|
|
appendArray(merged.items, baseSpec.items)
|
|
appendArray(merged.prefixes, baseSpec.prefixes)
|
|
end
|
|
|
|
if type(extraSpec) == "table" then
|
|
appendArray(merged.items, extraSpec.items)
|
|
appendArray(merged.prefixes, extraSpec.prefixes)
|
|
end
|
|
|
|
return merged
|
|
end
|
|
|
|
local function mergeAliasTables(baseAliases, extraAliases)
|
|
local merged = {}
|
|
if type(baseAliases) == "table" then
|
|
for key, list in pairs(baseAliases) do
|
|
merged[key] = merged[key] or {}
|
|
appendArray(merged[key], list)
|
|
end
|
|
end
|
|
if type(extraAliases) == "table" then
|
|
for key, list in pairs(extraAliases) do
|
|
merged[key] = merged[key] or {}
|
|
appendArray(merged[key], list)
|
|
end
|
|
end
|
|
return merged
|
|
end
|
|
|
|
local function mergeRuleTables(baseRules, extraRules)
|
|
local merged = {}
|
|
appendArray(merged, baseRules)
|
|
appendArray(merged, extraRules)
|
|
return merged
|
|
end
|
|
|
|
local function mergeByList(baseByList, extraByList)
|
|
local merged = {}
|
|
|
|
if type(baseByList) == "table" then
|
|
for listName, spec in pairs(baseByList) do
|
|
merged[listName] = mergeSpec(nil, spec)
|
|
end
|
|
end
|
|
|
|
if type(extraByList) == "table" then
|
|
for listName, spec in pairs(extraByList) do
|
|
merged[listName] = mergeSpec(merged[listName], spec)
|
|
end
|
|
end
|
|
|
|
return merged
|
|
end
|
|
|
|
local defaults = safeRequire("OFBlockRules_Default")
|
|
local user = safeRequire("OFBlockRules_User")
|
|
local sourceCatalog = safeRequire("OFSourceCatalog")
|
|
|
|
local aliasCatalog = {
|
|
firearms = sourceCatalog.firearms or {},
|
|
attachments = sourceCatalog.attachments or {},
|
|
ggs_all = sourceCatalog.ggs_all or {},
|
|
}
|
|
|
|
local merged = {
|
|
global = mergeSpec(defaults.global, user.global),
|
|
byList = mergeByList(defaults.byList, user.byList),
|
|
rules = mergeRuleTables(defaults.rules, user.rules),
|
|
aliases = mergeAliasTables(defaults.aliases, user.aliases),
|
|
}
|
|
|
|
merged.aliases = mergeAliasTables(aliasCatalog, merged.aliases)
|
|
|
|
return merged
|