mri-QboxResourcesMRI Qfleecaheist

mri_Qfleecaheist — Manual

Assalto aos 6 bancos Fleeca do mapa, com cutscene de abertura do cofre, minigame de furadeira a laser, carrinhos de loot e venda para um comprador.


Sumário

  1. Dependências
  2. Instalação
  3. Fluxo do assalto
  4. Configuração
  5. Bancos
  6. Comandos
  7. Log no Discord
  8. Integrações
  9. Entrypoints para outros recursos
  10. Estrutura de arquivos

Dependências

RecursoObrigatórioObservação
qb-coreSimexports['qb-core']:GetCoreObject() no cliente e no servidor; callbacks, itens, dinheiro e notificações
ox_inventorySimA furadeira usa exports.ox_inventory:Search('count', item) para checar drill e bag
ps-dispatchSimO alerta policial chama exports['ps-dispatch']:FleecaBankRobbery(1) ao iniciar o assalto
qb-logNãoSe presente, registra o reset do cenário no canal heistreset

O fxmanifest.lua não declara dependencies — as dependências acima vêm dos exports chamados no código.


Instalação

  1. Copie a pasta mri_Qfleecaheist para resources/.

  2. Adicione ao server.cfg:

    ensure mri_Qfleecaheist
  3. Cadastre os itens usados pelo recurso no inventário:

    ItemUso
    drillExigido para usar a furadeira nos pontos de drill
    bagExigido para pegar o loot (grab central, carrinhos e furadeira)
    diamondRecompensa (carrinho de diamante e caixa-forte)
    goldbarRecompensa (carrinho de ouro, grab central e caixa-forte)
    cryptostickRecompensa aleatória na venda ao comprador

    Os nomes de drill, bag, diamond e goldbar podem ser trocados em config.lua. O cryptostick está fixo no server.lua.

  4. Troque o webhook do Discord em server.lua — veja Log no Discord.


Fluxo do assalto

  1. Início — o jogador chega a até 10 metros do scenePos do banco e atira (IsPedShooting). O servidor checa a contagem de policiais em serviço e o cooldown do banco.
  2. Cutscene — o NPC refém (scenePed) executa a cena sincronizada mp_missheist_ruralbank, o alerta é enviado à polícia via ps-dispatch, e as portas do cofre (v_ilev_gb_teldr e hei_prop_heist_sec_door / v_ilev_gb_vauldr) giram até o doorHeading configurado.
  3. Loot — dentro do cofre, o jogador se aproxima dos pontos e pressiona E:
    • Grab central — pilha de ouro ou de dinheiro (sorteada por grabReward). Rende multiGrabCount de goldTrolly (15 barras) ou de cashTrolly (100.000 em dinheiro).
    • Carrinhos — cada carrinho é sorteado por trollyReward entre ouro, dinheiro e diamante. A animação dura cerca de 37 segundos e entrega o item correspondente.
    • Furadeira — abre o minigame de scaleform (drilling.lua). Se concluído, entrega a recompensa lockbox (20 unidades de ouro ou diamante, sorteado). Se falhar, o ponto volta a ficar disponível.
  4. Saída — ao se afastar mais de 30 metros do banco depois de ter pego algum loot, um blip do comprador aparece no mapa.
  5. Venda — chegando a até 15 metros do buyerPos, roda a cutscene hs3f_all_drp3 e o servidor vende todo o diamond e o goldbar do inventário pelos sellPrice configurados.

Configuração

Tudo fica em config.lua.

Config['FleecaMain']

CampoTipoObrigatórioDescrição
requiredPoliceCountnumberSimMínimo de policiais em serviço para o assalto poder começar. 0 desativa a exigência
requiredItemstabelaSim[1] = item da furadeira (drill), [2] = item da mochila (bag). A ordem importa: o código indexa por posição
rewardItems.diamondTrolly.itemstringSimItem entregue pelo carrinho de diamante
rewardItems.diamondTrolly.countnumberSimQuantidade entregue pelo carrinho
rewardItems.diamondTrolly.sellPricenumberSimPreço unitário pago pelo comprador
rewardItems.goldTrolly.itemstringSimItem entregue pelo carrinho de ouro
rewardItems.goldTrolly.countnumberSimQuantidade entregue pelo carrinho
rewardItems.goldTrolly.multiGrabCountnumberSimQuantidade entregue pelo grab central quando ele sorteia ouro
rewardItems.goldTrolly.sellPricenumberSimPreço unitário pago pelo comprador
rewardItems.cashTrolly.itemnilSimMantenha nil — é o que sinaliza ao servidor para dar dinheiro em vez de item
rewardItems.cashTrolly.countnumberSimDinheiro entregue pelo carrinho de dinheiro
rewardItems.cashTrolly.multiGrabCountnumberSimDinheiro entregue pelo grab central quando ele sorteia dinheiro
rewardItems.lockboxfunctionSimRetorna a recompensa da furadeira. Padrão: 20 unidades de ouro ou diamante, sorteado
grabRewardfunctionSimSorteia o modelo do grab central entre goldbar e cash
trollyRewardfunctionSimSorteia o conteúdo de cada carrinho entre goldbar, cash e diamond
finishHeist.buyerPosvector3SimLocal do comprador onde o loot é vendido

Config['FleecaHeist'][n]

Uma entrada por banco. Todos os campos são obrigatórios.

CampoTipoDescrição
scenePed.modelstringModelo do NPC da cena (padrão csb_tomcasino)
scenePed.coordsvector3Posição do NPC
scenePed.headingnumberRotação do NPC
scenePosvector3Ponto de referência do banco. Define onde o assalto pode ser iniciado (raio de 10m) e onde as portas são procuradas
sceneRotvector3Rotação da cena sincronizada de abertura
scenePedWalkCoordsvector3Para onde o NPC caminha depois da cena
doorHeadingtabela {n, n}Rotação final da porta externa [1] e da porta do cofre [2]
grab.posvector3Posição da pilha central de loot
grab.headingnumberRotação da pilha central
grab.lootboolEstado de runtime — deixe false
drills[]tabelaPontos de furadeira: coords, rotation e loot
trollys[]tabelaPontos de carrinho: coords, heading e loot
nextRobnumberCooldown do banco em segundos (padrão 3600 = 1 hora)

Strings

Tabela de textos exibidos ao jogador (wait_nextheist, minute, need_item, police_alert, drill, grab_trolly, grab, deliver_to_buyer, buyer_blip, need_police, total_money). Não há sistema de locales — edite direto no config.lua.

As tabelas GrabCash, LaserDrill e Trolly no fim do arquivo definem os dicionários de animação das cenas sincronizadas. Não devem ser alteradas.


Bancos

#LocalPonto de início (scenePos)Cooldown
1Great Ocean Highway-2958.70, 478.27, 14.703600s
2Rockford Hills-1214.84, -336.37, 36.783600s
3Alta Street-356.53, -52.27, 48.053600s
4Legion Square308.60, -281.35, 53.163600s
5Grapeseed1179.56, 2710.88, 37.093600s
6Burton144.26, -1042.97, 28.373600s

O cooldown é guardado em memória (lastRob) e reseta quando o recurso reinicia.


Comandos

ComandoPermissãoDescrição
/pdfleecaPolicial em serviço, ou permissão god do qb-coreLimpa o cenário do banco mais próximo (a até 20m): fecha as portas, remove o NPC e os props, e libera os pontos de loot

Log no Discord

O server.lua envia um embed via webhook em dois momentos: quando um assalto começa e quando um jogador vende o loot ao comprador.

discord = {
    ['webhook'] = 'https://discord.com/api/webhooks/...',
    ['name'] = 'rm_fleecaheist',
    ['image'] = 'https://cdn.discordapp.com/avatars/...'
}
CampoTipoObrigatórioDescrição
webhookstringSimURL do webhook de destino
namestringSimNome de usuário exibido na mensagem
imagestringSimAvatar exibido na mensagem

O valor que vem no repositório é o webhook do autor original. Troque pelo seu antes de subir o recurso, ou os logs do seu servidor vão para um Discord de terceiros.


Integrações

ps-dispatch

O alerta policial é enviado exclusivamente por exports['ps-dispatch']:FleecaBankRobbery(1), chamado no início de cada assalto. O código de alerta interno (fleecaheist:client:policeAlert, que desenha um blip de raio) continua registrado, mas nada no recurso o dispara.

qb-log

Ao usar /pdfleeca ou o evento radialmenu:resetFleeca, o recurso dispara qb-log:server:CreateLog no canal heistreset. Se o qb-log não estiver instalado, o evento simplesmente não é tratado.

Radial menu

O evento de servidor radialmenu:resetFleeca faz o mesmo que /pdfleeca, mas sem o fallback de permissão god — só funciona para policial em serviço. Registre-o no seu menu radial para dar aos policiais a opção de limpar a cena.


Entrypoints para outros recursos

Evento radialmenu:resetFleeca (servidor)

Limpa o cenário do banco mais próximo do jogador. Exige job police em serviço.

TriggerServerEvent('radialmenu:resetFleeca')

Evento fleecaheist:client:nearBank (cliente)

Dispara o reset a partir do cliente: procura um banco a até 20 metros e pede ao servidor para resetá-lo.

TriggerClientEvent('fleecaheist:client:nearBank', source)

Callbacks de servidor

Registrados via QBCore.Functions.CreateCallback:

-- retorna true se há policiais em serviço suficientes
QBCore.Functions.TriggerCallback('fleecaheist:server:checkPoliceCount', function(ok) end)
 
-- retorna true se o banco `index` não está em cooldown (e marca o início do assalto)
QBCore.Functions.TriggerCallback('fleecaheist:server:checkTime', function(ok) end, index)
 
-- retorna se o jogador tem ao menos 1 unidade do item, e o label do item
QBCore.Functions.TriggerCallback('fleecaheist:server:hasItem', function(has, label) end, 'bag')

Estrutura de arquivos

mri_Qfleecaheist/
├── client.lua        — início do assalto, cenas sincronizadas, portas do cofre, grab/carrinhos/furadeira, venda ao comprador
├── server.lua        — callbacks de polícia/cooldown/item, entrega e venda de recompensas, sync de estado, /pdfleeca, webhook do Discord
├── drilling.lua      — minigame de furadeira (scaleform, base do meta-hub)
├── config.lua        — Config.FleecaMain, Config.FleecaHeist (6 bancos), Strings e dicionários de animação
└── fxmanifest.lua