Files
OpinionatedFirearms/common/media/lua/shared/OFBlockConfig.lua
2026-02-12 15:09:07 -05:00

138 lines
3.4 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 function isMagazineType(itemType)
local s = tostring(itemType or ""):lower()
if s == "" then
return false
end
if s:sub(1, 10) == "base.clip_" then
return true
end
if s:find("magazine", 1, true) then
return true
end
if s:find("drum", 1, true) then
return true
end
if s:find("clip", 1, true) then
return true
end
return false
end
local function collectMagazines(values)
local out = {}
local seen = {}
if type(values) ~= "table" then
return out
end
for _, value in ipairs(values) do
if isMagazineType(value) then
local key = tostring(value):lower()
if not seen[key] then
seen[key] = true
out[#out + 1] = value
end
end
end
return out
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 {},
magazines = sourceCatalog.magazines or collectMagazines(sourceCatalog.attachments),
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