functions/garage.lua
Adapter de veículos. Default usa snt_characters_vehicles + mtg_garages.
Globals esperadas
getUserVehicles(userId)getAvailableVehicles()tryRemoveVehicle(userId, plate)addVehicle(userId, model, plate, opts)getTrunkChest(plate)tryRemoveTrunkItem(plate, item, amount, slot)
Tabelas e exports
snt_characters_vehicles—(plate, owner, index, ipva, status, ...). O campoindexé o modelo.mtg_containers— porta-malas em JSON, key"trunk_<model>:<plate>".exports['mtg_garages']:getAllVehicles(),generateVehicle(),generateRentalVehicle(),deleteVehicle().exports['mtg_inventory']:withdrawContainer()— pra remover item do trunk.
getUserVehicles(userId) — open-schema
Devolva quantas chaves o seu schema oferecer.
plate e model são obrigatórios; o resto vira linha extra no painel.functions/garage.lua·lua
function getUserVehicles(userId)
local rows = exports.oxmysql:query_async(
"SELECT plate, `index` AS model, ipva, status FROM snt_characters_vehicles WHERE owner = ?",
{ userId }
)
local out = {}
for _, v in ipairs(rows or {}) do
out[#out+1] = {
plate = v.plate,
model = v.model,
ipva = v.ipva, -- chave extra: aparece como "Ipva: em-dia"
status = v.status, -- chave extra: "Status: livre"
image = (Config.VehicleImageBaseUrl or "")..(v.model or "")..".png"
}
end
return out
endgetAvailableVehicles()
lua
function getAvailableVehicles()
local cat = exports['mtg_garages']:getAllVehicles()
local out = {}
for model, meta in pairs(cat or {}) do
out[#out+1] = {
model = model,
name = meta.name or model,
category = meta.category or "uncategorized",
price = tonumber(meta.price) or 0,
image = (Config.VehicleImageBaseUrl or "")..model..".png"
}
end
table.sort(out, function(a, b) return a.name < b.name end)
return out
endaddVehicle / tryRemoveVehicle
lua
function tryRemoveVehicle(userId, plate)
return exports['mtg_garages']:deleteVehicle(plate, userId)
end
function addVehicle(userId, model, plate, opts)
if opts and opts.permanent == false then
-- Aluguer
return exports['mtg_garages']:generateRentalVehicle(userId, model, plate, opts.days or 7)
end
return exports['mtg_garages']:generateVehicle(userId, model, plate)
endTrunk
lua
function getTrunkChest(plate)
local row = exports.oxmysql:query_async(
"SELECT `key`, inventory FROM mtg_containers WHERE `key` LIKE ? LIMIT 1",
{ "trunk_%:"..plate }
)
if not row or #row == 0 then return { plate = plate, items = {} } end
local ok, decoded = pcall(json.decode, row[1].inventory or "[]")
local items = ok and decoded or {}
local out = {}
for slot, entry in pairs(items) do
if entry and entry.item then
out[#out+1] = {
slot = tonumber(slot) or 0,
item = entry.item,
name = vRP.getItemName(entry.item) or entry.item,
amount = tonumber(entry.amount) or 0,
image = (Config.ItemImageBaseUrl or "")..entry.item..".png"
}
end
end
return { plate = plate, items = out }
end
function tryRemoveTrunkItem(plate, item, amount, slot)
return exports['mtg_inventory']:withdrawContainer(
"trunk_"..plate, item, amount or 1, slot
)
end