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