MRI QCarKeys

mri_Qcarkeys 🔑

Sistema completo de gerenciamento de chaves veiculares para FiveM com chaves permanentes/temporárias, lockpick, hotwiring, carjacking e key stacking. Baseado no mm_carkeys do Master Mind.

Principais recursos

  • 🔑 Chaves permanentes e temporárias — Sistema dual de chaves com itens de inventário.
  • 🔒 Trancar/destrancar com animação — Key fob animation + sons de lock/unlock.
  • 🔧 Hotwiring — Minigame de ligação direta com chance escalada por nível de reputação.
  • 🪛 Lockpick de porta e motor — Suporte a ox_lib skill check ou minigame alternativo.
  • 🚗 Carjacking — Roubo de veículos de NPCs com chance baseada na arma utilizada.
  • 📦 Key stacking — Consolidar todas as chaves em um único keybag.
  • 🎒 Key grabbing — Pegar chaves de NPCs vivos ou mortos em veículos.
  • 🌐 Multi-framework — Compatível com QBCore, QBX, ESX e ox_core.
  • 📦 Multi-inventory — Compatível com ox_inventory, qb-inventory, ps-inventory, mm_inventory, qs-inventory.

Instalação rápida

  1. Copie a pasta mri_Qcarkeys para a pasta de resources do servidor.
  2. Adicione ensure mri_Qcarkeys no server.cfg (após o framework e inventory).
  3. Tenha ox_lib instalado e disponível.
  4. Adicione os itens necessários ao seu inventory (veja Itens necessários).

Configuração (shared/shared.lua) ⚙️

Opções gerais

OpçãoPadrãoDescrição
LockNPCVehiclefalseTrancar todos os veículos NPCs quando o jogador se aproxima.
playerDraggabletruePermitir que jogadores arrastem outros jogadores.
toggleLightsOnlyRemotetrueAlternar luzes apenas quando fora do veículo.
keepVehicleEngineOntrueManter motor ligado ao sair do veículo.
keepKeysInVehicletrueChaves ficam no veículo; motor não liga sem elas.

Carjacking (steal)

OpçãoPadrãoDescrição
steal.availabletrueHabilitar carjacking.
steal.getKey"permanent"Tipo de chave recebida: "permanent", "temporary", "none".
steal.chancePor armaChance de sucesso por categoria de arma (hash).

Lockpick (lockpick)

OpçãoPadrãoDescrição
lockpick.minigameScript"ox_lib""ox_lib" ou "inside-lockpicking".
lockpick.breakChance0.5Chance do lockpick quebrar (normal).
lockpick.advancedBreakChance0.1Chance do lockpick quebrar (avançado).

Hotwiring (hotwire)

OpçãoPadrãoDescrição
hotwire.availabletrueHabilitar hotwiring.
hotwire.chance0.1Chance base de sucesso (escalada por nível cw-rep).

Key Grabbing (grab)

OpçãoPadrãoDescrição
grab.alivetruePermitir pegar chaves de NPCs vivos.
grab.leaveKeysOnVehicletrueDeixar chaves no veículo ao pegar.

Classes e armas bloqueadas

  • blacklistedClasses: 13-16, 21 (bicicletas, barcos, helicópteros, aviões, trens)
  • BlackListedWeapon: 28 armas corpo a corpo/arremessáveis que não podem fazer carjacking.

Controles

TeclaAção
LTrancar/destrancar veículo (togglelocks).
ZLigar/desligar motor (mri:engine).
HHotwiring (quando dentro de veículo sem chave).

Comandos

ComandoRestritoDescrição
/givetempkeys [target] [plate]group.adminDar chaves temporárias.
/removetempkeys [target] [plate]group.adminRemover chaves temporárias.
/givekeyspolice/cardealer/adminDar chave permanente do veículo atual.
/removekeyspolice/cardealer/adminRemover chave permanente do veículo atual.
/stackkeysNãoConsolidar todas as chaves em um keybag.
/unstackkeysNãoSeparar keybag em chaves individuais.

Exports

Client

ExportParâmetrosDescrição
GiveTempKeys(plate)Dar chave temporária para uma placa.
RemoveTempKeys(plate)Remover chave temporária para uma placa.
GiveKeyItem(plate)Dar item de chave permanente.
RemoveKeyItem(plate)Remover item de chave permanente.
HaveTemporaryKey(plate)Retorna boolean.
HavePermanentKey(plate)Retorna boolean.

Server

ExportParâmetrosDescrição
GiveTempKeys(src, plate)Dar chave temporária ao jogador.
RemoveTempKeys(src, plate)Remover chave temporária do jogador.
GiveKeyItem(src, plate, netId)Dar item de chave permanente.
RemoveKeyItem(src, plate)Remover item de chave permanente.
HaveTemporaryKey(src, plate)Retorna boolean via callback.
HavePermanentKey(src, plate)Retorna boolean via callback.

Itens necessários (inventory)

['vehiclekey'] = {
    label = 'CHAVE',
    weight = 50,
    type = 'item',
    image = 'vehiclekey.png',
    description = 'Chave de veículo',
    client = { status = { hunger = -10000 } },
},
['keybag'] = {
    label = 'Chaveiro',
    weight = 100,
    type = 'item',
    image = 'keybag.png',
    description = 'Um chaveiro com várias chaves',
},
['lockpick'] = {
    label = 'Gazuas',
    weight = 100,
    type = 'item',
    image = 'lockpick.png',
    description = 'Gazuas para abrir fechaduras',
},
['advancedlockpick'] = {
    label = 'Gazuas Avançadas',
    weight = 150,
    type = 'item',
    image = 'advancedlockpick.png',
    description = 'Gazuas avançadas com menor chance de quebrar',
},

Dependências

Obrigatórias

  • ox_lib — UI, menus, progress bars, notificações.

Opcionais (auto-detected)

  • Frameworks: qb-core, qbx_core, es_extended, ox_core
  • Inventories: ox_inventory, qb-inventory, ps-inventory, mm_inventory, qs-inventory
  • rep-enginewire — Minigame alternativo de hotwiring.
  • inside-lockpicking — Minigame alternativo de lockpick.
  • cw-rep — Sistema de reputação/habilidade para hotwiring e lockpick.
  • InteractSound — Sons de lock/unlock.

Estrutura de arquivos 📁

mri_Qcarkeys/
├── bridge/
│   ├── framework/
│   │   ├── esx.lua              # Integração ESX
│   │   ├── ox.lua               # Integração ox_core
│   │   ├── qb.lua               # Integração QBCore
│   │   └── qbox.lua             # Integração QBX
│   └── inventory/
│       └── client.lua           # Abstração de inventory
├── client/
│   ├── init.lua                 # Entry point: vehicle cache hooks, exports
│   ├── interface.lua            # Objeto VehicleKeys state
│   └── modules/
│       ├── keys.lua             # Gerenciamento de chaves, lock/unlock, engine
│       ├── hotwire.lua          # Minigame de hotwiring
│       ├── lockpick.lua         # Lockpick de porta e motor
│       ├── steal.lua            # Carjacking e key grabbing
│       └── utils.lua            # Helpers: weapon blacklist, ped enumeration
├── server/
│   ├── bridge.lua               # Abstração framework/inventory
│   ├── commands.lua             # Comandos admin/player
│   └── server.lua               # Lógica principal: distribuição, stacking
├── shared/
│   ├── init.lua                 # Auto-detecção de framework e inventory
│   └── shared.lua               # Configurações
├── fxmanifest.lua
└── README.md

Eventos principais

Client → Server

EventoDescrição
mm_carkeys:server:setVehLockStateDefinir estado de trancamento do veículo.
mm_carkeys:server:acquiretempvehiclekeysRequisitar chaves temporárias.
mm_carkeys:server:removetempvehiclekeysRemover chaves temporárias.
mm_carkeys:server:acquirevehiclekeysRequisitar chave permanente.
mm_carkeys:server:removevehiclekeysRemover chave permanente.
mm_carkeys:server:stackkeysStack de chaves em keybag.
mm_carkeys:server:unstackkeysUnstack keybag em chaves individuais.

Server → Client

EventoDescrição
mm_carkeys:client:addtempkeysAdicionar chave temporária na lista do cliente.
mm_carkeys:client:removetempkeysRemover chave temporária da lista do cliente.
mm_carkeys:client:setplayerkeyDefinir chave permanente.
mm_carkeys:client:removeplayerkeyRemover chave permanente.
mm_carkeys:client:givekeyitemProgress bar de dar chave.
mm_carkeys:client:stackkeysProgress bar de stack.
mm_carkeys:client:unstackkeysProgress bar de unstack.

Observações importantes ⚠️

  • Quando keepKeysInVehicle = true, o veículo verifica o entity state keysIn antes de permitir ligar o motor. Desligar o motor consome a chave permanente e concede temporária.
  • O stacking converte todos os itens vehiclekey em um único keybag com metadata de placas.
  • A chance de hotwiring é escalada pelo nível de reputação no cw-rep (níveis 1-8).
  • Carjacking tem cooldown de 5 segundos entre tentativas.
  • NPCs ocupantes fogem quando um carjacking é bem-sucedido.

Contribuições e melhorias são bem-vindas — abra PRs ou issues. 🙌