mri-QboxResourcesScully Emotemenu

scully_emotemenu — Manual

Menu de animações para FiveM com emotes, danças, cenários, expressões faciais, estilos de caminhada, emotes com props, emotes sincronizados entre dois jogadores e efeitos de partícula. Standalone, com camada de compatibilidade opcional para QBCore.


Sumário

  1. Dependências
  2. Instalação
  3. Configuração
  4. Comandos
  5. Teclas
  6. Categorias de animação
  7. Estrutura de uma animação
  8. Emotes customizados
  9. Binds de emote
  10. Emotes sincronizados
  11. Prop dump
  12. Integrações
  13. Entrypoints para outros recursos
  14. Localização
  15. Estrutura de arquivos

Dependências

RecursoObrigatórioObservação
ox_libSimDeclarado no fxmanifest. Menus, radial, notificações, textUI, keybinds, callbacks
OneSyncSimDeclarado como dependência /onesync. Necessário para props em rede e emotes sincronizados
Artifacts do servidorSimBuild mínima 5848 (/server:5848)
qb-coreNãoSe estiver rodando, o compat/qbcore.lua ativa os eventos legacy animations:* e bloqueia emotes quando o jogador está morto, algemado ou em last stand

Não usa framework, banco de dados nem ACE. Funciona standalone.


Instalação

  1. Copie a pasta scully_emotemenu para resources/.
  2. Adicione ao server.cfg:
    ensure scully_emotemenu
  3. A pasta stream/ já traz as animações e props customizados; os .ytyp são declarados no fxmanifest.lua e carregam sozinhos.
  4. Ajuste o idioma e as teclas em config.lua.
  5. Conflitos — não rode junto com outro menu de emotes (rpemotes, dpemotes, qb-smallresources com emotes). Os comandos /e, /emote e /w colidem, e dois recursos disputando TaskPlayAnim no mesmo ped brigam entre si.

No boot, o servidor consulta o GitHub do autor e avisa no console se a versão instalada (1.9.9f) está desatualizada.


Configuração

Tudo fica em config.lua.

CampoTipoObrigatórioDescrição
LanguagestringSimIdioma do menu. Só é usado se a convar ox_locale não estiver definida. Padrão: pt-br
EnableSearchboolNãoMostra a opção de busca de animação no menu principal
EnablePropDumpboolNãoRegrava o prop_dump.lua a cada start do recurso. Ver Prop dump
EnableEmotePreviewboolNãoPermite pré-visualizar um emote num clone do seu personagem segurando E ao selecionar no menu
EnableEmotePlacementboolNãoAtiva o seletor de posição nos emotes com a flag Placement (encostar na parede, sentar em superfície etc.)
EnableEmoteBindsboolNãoDeclarado no config, mas não é lido pelo código atual — o sistema de binds do client/keybinds.lua sempre carrega
EnableWeaponBlockboolNãoImpede tocar emote com arma na mão
EnableAimShootBlockboolNãoCancela o emote quando o jogador mira ou atira
CancelEmoteKeystringNãoTecla de cancelar o emote. '' desativa. Padrão: F6
HandsUpKeystringNãoTecla de mãos ao alto (segurar). '' desativa. Vem desativada
StanceKeystringNãoTecla que cicla a postura (em pé → agachado → deitado). '' desativa. Vem desativada
PointKeystringNãoTecla de apontar com o dedo, seguindo a câmera. '' desativa. Padrão: b
AllowedInVehiclesboolNãotrue permite emotes dentro do carro (só a parte superior do corpo anima). false bloqueia
EmoteCooldownnumberNãoMilissegundos de espera entre um emote e o próximo
EmotePlayCommandsarraySimComandos que tocam um emote. Padrão: e, emote, eplay
WalkSetCommandsarraySimComandos que definem o estilo de caminhada. Padrão: w, walk, andar
MenuOpenCommandsarraySimComandos que abrem o menu. Padrão: em, emotemenu
MenuKeybindstringNãoTecla que abre o menu, mapeada sobre o primeiro MenuOpenCommands. '' desativa. Padrão: F5
MenuPositionstringNãoPosição do menu: top-left, top-right, bottom-left, bottom-right
NotificationPositionstringNãoPosição das notificações: top, bottom, top-left, top-right, bottom-left, bottom-right
HelpAlertPositionstringNãoPosição do textUI de ajuda: right-center, left-center, top-center
RagdollKeybindstringNãoTecla que joga o personagem no chão (alterna). '' desativa. Padrão: u
PtfxKeybindstringNãoTecla que dispara o efeito de partícula do emote atual. Padrão: g
EnableAutoPtfxboolNãoEmotes com a flag Auto no Ptfx disparam a partícula sozinhos, sem apertar a tecla
EnableNSFWEmotestrue | false | 'limited'Nãofalse remove os emotes NSFW do menu. 'limited' os mantém, mas só toca se o statebag allowNSFWEmotes do jogador for verdadeiro — dá para liberar por zona ou por job de outro recurso
EnableGangEmotesboolNãofalse remove os emotes marcados com Gang
EnableSocialMovementEmotesboolNãofalse remove os emotes marcados com SocialMovement
EnableConsumableEmotesboolNãofalse esconde a categoria de emotes de consumo (comer, beber, fumar)
EnableSynchronizedEmotesboolNãofalse esconde a categoria de emotes sincronizados
EnableAnimalEmotesboolNãofalse esconde a categoria de emotes de animais
EnableRadialMenuboolNãoRegistra o item “Emotes” no radial do ox_lib, com submenus de caminhadas e expressões

As três flags EnableNSFWEmotes, EnableGangEmotes e EnableSocialMovementEmotes removem a animação da lista inteira quando desligadas — ela some do menu, dos comandos e do radial. As flags EnableConsumableEmotes, EnableSynchronizedEmotes e EnableAnimalEmotes apenas escondem a categoria do menu; os comandos continuam funcionando.


Comandos

Todos os comandos são de client, sem restrição de permissão.

ComandoPermissãoDescrição
/em, /emotemenuQualquer jogadorAbre e fecha o menu de animações
/e <emote> [variante]Qualquer jogadorToca um emote pelo comando dele. O segundo argumento escolhe a variante do prop, quando o emote tiver Variations
/emote <emote> [variante]Qualquer jogadorAlias de /e
/eplay <emote> [variante]Qualquer jogadorAlias de /e
/e cQualquer jogadorCancela o emote atual
/e lQualquer jogadorLista todos os emotes disponíveis
/w <caminhada>Qualquer jogadorDefine o estilo de caminhada
/walk <caminhada>, /andar <caminhada>Qualquer jogadorAliases de /w
/w cQualquer jogadorVolta à caminhada padrão
/w lQualquer jogadorLista todos os estilos de caminhada

Os nomes dos comandos vêm de EmotePlayCommands, WalkSetCommands e MenuOpenCommands — renomeie no config se quiser outros.


Teclas

Tecla padrãoNome do keybindAção
F5(mapeada sobre /em)Abre o menu
F6mri_Qbox-ecancelCancela o emote atual
bpointAponta com o dedo, acompanhando a câmera. Aperte de novo para parar
uragdollJoga o personagem no chão. Aperte de novo para levantar
gplayptfxDispara o efeito de partícula do emote atual (quando o emote tem um)
mri_Qbox-handsupMãos ao alto enquanto segura. Desativado por padrão (HandsUpKey = '')
stanceCicla postura: em pé → agachado → deitado. Desativado por padrão (StanceKey = '')
emotebind_1 a emotebind_1010 slots de emote configuráveis. Sem tecla padrão

Todas as teclas são remapeáveis pelo jogador em Configurações > Controles > FiveM.


Categorias de animação

Cada categoria é um arquivo em data/animations/.

CategoriaArquivoConteúdo
Emotesemotes.luaEmotes gerais (ações, poses, gestos)
DanceEmotesdance_emotes.luaDanças
PropEmotesprop_emotes.luaEmotes que carregam um ou mais props
ConsumableEmotesconsumable_emotes.luaComer, beber, fumar
SynchronizedEmotessynchronized_emotes.luaEmotes em par, entre dois jogadores
AnimalEmotesanimal_emotes.luaEmotes restritos a peds de animais
Walkswalks.luaEstilos de caminhada
Scenariosscenarios.luaCenários nativos do GTA (WORLD_HUMAN_*)
Expressionsexpressions.luaExpressões faciais (moods)

Cada arquivo tem um par _pt-br.lua com os comandos e rótulos traduzidos — ver Localização.


Estrutura de uma animação

{
    Label = 'Adjust Tie',        -- nome exibido no menu
    Command = 'adjusttie',       -- comando usado em /e adjusttie
    Animation = 'try_tie_positive_a',
    Dictionary = 'clothingtie',
    Options = {
        Duration = 5000,
        Flags = {
            Move = true,
        },
    },
}

Campos de topo

CampoTipoDescrição
LabelstringNome exibido no menu, na busca e na listagem
CommandstringIdentificador usado nos comandos e nos exports
AnimationstringNome do clip
DictionarystringDicionário de animação
WalkstringSó em Walks. Clipset da caminhada, no lugar de Animation/Dictionary
ScenariostringSó em Scenarios. Nome do cenário nativo
ExpressionstringSó em Expressions. Nome do mood
NSFWboolMarca a animação como NSFW. Ver EnableNSFWEmotes
GangboolMarca como emote de gangue. Ver EnableGangEmotes
SocialMovementboolMarca como emote de movimento social. Ver EnableSocialMovementEmotes
PedTypesarrayRestringe a animação a tipos de ped listados em data/ped_types.lua (dogs, cats, birds, …)
PlacementboolAtiva o seletor de posição livre antes de tocar, quando EnableEmotePlacement está ligado
SkipRequestboolSó em SynchronizedEmotes. O alvo não precisa aceitar o convite
HideboolEsconde a animação do menu e do radial. Ela continua acessível por comando e por export

Options

CampoTipoDescrição
DurationnumberDuração em ms. Ausente ou -1 toca até ser cancelado
Flags.LoopboolRepete a animação
Flags.MoveboolPermite andar durante a animação
PropsarrayProps anexados. Cada um tem Name (modelo), Bone, Placement (offset e rotação) e, opcionalmente, Variations / Variant
PtfxtableEfeito de partícula: Asset, Name, Placement, Color, CanHold (segurar a tecla mantém o efeito), AttachToProp, Auto (dispara sozinho quando EnableAutoPtfx)
SharedtableSó em SynchronizedEmotes. OtherAnimation aponta para o Command da animação que o outro jogador vai tocar

Emotes customizados

O arquivo custom_emotes.lua existe para você adicionar animações sem tocar nos arquivos de data/animations/, que são sobrescritos a cada atualização do recurso.

return {
    Walks = {},
    Scenarios = {},
    Expressions = {},
    Emotes = {
        {
            Label = 'Meu Emote',
            Command = 'meuemote',
            Animation = 'idle_a',
            Dictionary = 'anim@amb@nightclub@lazlow@ig1_hi@',
            Options = {
                Flags = { Loop = true },
            },
        },
    },
    PropEmotes = {},
    ConsumableEmotes = {},
    DanceEmotes = {},
    SynchronizedEmotes = {},
    AnimalEmotes = {}
}

As listas são concatenadas às nativas na inicialização, no client e no servidor. Guarde uma cópia deste arquivo antes de atualizar o recurso.

Para registrar emotes em runtime, a partir de outro recurso, use o export registerEmote.


Binds de emote

O menu tem uma seção Emote Keybinds com 10 slots. Em cada slot você associa um comando de emote e um rótulo; a tecla em si é escolhida pelo jogador em Configurações > Controles, procurando por Emote Bind Slot 1 a 10.

Os binds são salvos localmente no KVP do cliente (scully_emotemenu_binds_v2), ou seja, ficam por máquina e sobrevivem a reconexões. O menu também permite exportar os binds para a área de transferência e limpar todos de uma vez.


Emotes sincronizados

Um emote sincronizado toca duas animações em par — uma no jogador que iniciou e outra em quem aceitou. O campo Options.Shared.OtherAnimation liga uma à outra.

Fluxo:

  1. O jogador toca o emote (ex.: /e sbaseball). O client procura o jogador mais próximo em 3 metros.
  2. O servidor entrega o convite ao alvo, que vê um alerta para aceitar ou recusar. Emotes com SkipRequest = true pulam esta etapa.
  3. Ao aceitar, o servidor confere que os dois estão a menos de 5 metros e dispara as duas animações, uma em cada cliente.

Cancelar o emote de qualquer um dos lados encerra a animação dos dois.


Prop dump

Com EnablePropDump = true, o servidor varre todas as animações a cada start e regrava o prop_dump.lua na raiz do recurso com a lista completa de props usados por emotes, em formato de tabela de hashes:

return {
	[`p_amb_bottle_01`] = true,
	[`prop_cs_burger_01`] = true,
}

Serve para alimentar a whitelist de objetos do seu anti-cheat. Depois de gerar o arquivo, dá para desligar a flag para não regravá-lo a cada restart.


Integrações

QBCore (compat/qbcore.lua)

O arquivo só age se o qb-core estiver presente (GetResourceState diferente de unknown/missing). Ele registra os eventos legacy do qb-smallresources/rpemotes e os traduz para os exports oficiais, bloqueando a ação se o jogador estiver morto, em last stand ou algemado (metadados isdead, inlaststand, ishandcuffed).

Evento legacyEfeito
animations:client:PlayEmoteplayEmoteByCommand(data[1])
animations:client:EmoteCommandStartplayEmoteByCommand(data[1]), respeitando também o estado de limitação
animations:client:EmoteMenutoggleMenu()
animations:client:ListEmoteslistEmotes('Emotes')
animations:client:WalksetWalk(data[1])
animations:client:ListWalkslistEmotes('Walks')
animations:ToggleCanDoAnimssetLimitation(bool)

O comentário no topo do arquivo avisa que essa camada pode ser removida no futuro: prefira os exports oficiais em código novo.

Radial do ox_lib

Com EnableRadialMenu = true, o recurso adiciona um item “Emotes” ao radial global do ox_lib, com submenus para caminhadas e expressões e uma opção de cancelar. Emotes com Hide = true não aparecem no radial.


Entrypoints para outros recursos

Todos os exports são de client.

exports.scully_emotemenu:toggleMenu()
exports.scully_emotemenu:closeMenu()
 
-- Abre um alerta listando as animações de uma categoria.
-- Categorias válidas: Emotes, Walks, Scenarios, Expressions, PropEmotes,
-- ConsumableEmotes, DanceEmotes, SynchronizedEmotes, AnimalEmotes.
exports.scully_emotemenu:listEmotes('Emotes')

Tocar e cancelar

-- Toca pelo Command da animação. O 3º argumento é opcional e aplica o emote em outro ped.
exports.scully_emotemenu:playEmoteByCommand('adjusttie', variant, ped)
 
-- Toca passando a tabela da animação diretamente.
exports.scully_emotemenu:playEmote(emoteTable, variant)
 
exports.scully_emotemenu:cancelEmote()

Emotes registrados

-- Registra uma animação em runtime, indexada pelo campo Name.
exports.scully_emotemenu:registerEmote({
    Name = 'meuemote',
    Type = 'Emotes',              -- 'Walks' faz o playRegisteredEmote chamar setWalk
    Animation = 'idle_a',
    Dictionary = 'anim@amb@nightclub@lazlow@ig1_hi@',
    Options = { Flags = { Loop = true } },
})
 
exports.scully_emotemenu:playRegisteredEmote('meuemote')

Emotes registrados assim não aparecem no menu — servem para outros recursos dispararem animações próprias reaproveitando o gerenciamento de props e partículas.

Caminhada e expressão

local walk = exports.scully_emotemenu:getCurrentWalk()
exports.scully_emotemenu:setWalk('move_m@hipster@a')
exports.scully_emotemenu:resetWalk()
 
local expression = exports.scully_emotemenu:getCurrentExpression()
exports.scully_emotemenu:setExpression('mood_angry_1')
exports.scully_emotemenu:resetExpression()

Caminhada e expressão são persistidas no KVP do cliente (animations_walkstyle e animations_expression) e reaplicadas a cada spawn.

Estado

-- true enquanto uma animação do recurso está tocando.
local inEmote = exports.scully_emotemenu:isInEmote()
 
-- Última animação tocada e a variante usada.
local emote, variant = exports.scully_emotemenu:getLastEmote()
 
-- Bloqueia o jogador de usar qualquer emote, comando ou tecla do recurso.
exports.scully_emotemenu:setLimitation(true)
local limited = exports.scully_emotemenu:isLimited()

Use setLimitation(true) em situações como algemas, morte ou minigames — é o mesmo gancho que o compat/qbcore.lua usa.

Substituir notificação e textUI

exports.scully_emotemenu:customNotifyFn(function(type, message)
    -- type é 'error' ou 'success'
    exports.meu_hud:Notify(message, type)
end)
 
exports.scully_emotemenu:customHelpAlertFn(function(icon, text)
    exports.meu_hud:ShowHelp(text, icon)
end)

Permite trocar as notificações e o textUI do ox_lib pelos do seu HUD sem editar o recurso.

exports.scully_emotemenu:OpenBindMenu()

Eventos de client

Espelham os exports, para quem prefere disparar por evento a partir do servidor.

TriggerClientEvent('scully_emotemenu:toggleMenu', src)
TriggerClientEvent('scully_emotemenu:closeMenu', src)
TriggerClientEvent('scully_emotemenu:cancelEmote', src)
TriggerClientEvent('scully_emotemenu:play', src, emoteTable, variant)
TriggerClientEvent('scully_emotemenu:playByCommand', src, 'adjusttie', variant)
TriggerClientEvent('scully_emotemenu:registerEmote', src, emoteTable)
TriggerClientEvent('scully_emotemenu:playRegisteredEmote', src, 'meuemote')
TriggerClientEvent('scully_emotemenu:setWalk', src, 'move_m@hipster@a')
TriggerClientEvent('scully_emotemenu:resetWalk', src)
TriggerClientEvent('scully_emotemenu:setExpression', src, 'mood_angry_1')
TriggerClientEvent('scully_emotemenu:resetExpression', src)
TriggerClientEvent('scully_emotemenu:toggleLimitation', src, true)
TriggerClientEvent('scully_emotemenu:listEmotes', src, 'Emotes')

Statebags

StatebagEscopoDescrição
allowNSFWEmotesPlayerQuando EnableNSFWEmotes = 'limited', só libera os emotes NSFW se este statebag for verdadeiro. Defina por zona, propriedade ou job
stancePlayerPostura atual: 0 em pé, 1 agachado, 2 deitado
ptfxPlayertrue enquanto o efeito de partícula do emote está sendo emitido. Sincronizado para os outros clientes

Localização

O idioma do menu é resolvido nesta ordem:

  1. a convar ox_locale do servidor, se existir um locales/<codigo>.lua correspondente;
  2. o Config.Language;
  3. en como último recurso.
setr ox_locale "pt-br"

Note que a convar é ox_locale (com underline), não ox:locale.

Idiomas disponíveis em locales/: cs, da, de, en, es, et, fa, fi, fr, hu, id, it, nl, no, pl, pt, pt-br, ro, ru, sv, tl, tr, vi, zhcn, zhtw.

Comandos traduzidos

Além das strings da interface, os arquivos data/animations/*_pt-br.lua traduzem os comandos e rótulos das próprias animações. Eles são carregados como aliases: a animação em inglês continua funcionando, e a versão traduzida vira um comando adicional apontando para a mesma animação. No menu, aparece só a variante do idioma escolhido — e a entrada em inglês só reaparece quando não existe tradução para ela.

Para adicionar um idioma novo, crie locales/<codigo>.lua seguindo a estrutura dos existentes. Traduzir os comandos das animações exige criar também os arquivos data/animations/<categoria>_<codigo>.lua e registrar o sufixo no translationMapping do client/main.lua.


Estrutura de arquivos

scully_emotemenu/
├── client/
│   ├── main.lua              — menu, radial, comandos, teclas, props, ptfx, emotes sincronizados
│   └── keybinds.lua          — 10 slots de bind de emote, persistidos em KVP
├── server/
│   └── main.lua              — spawn e limpeza de props, roteamento dos emotes sincronizados, prop dump
├── compat/
│   └── qbcore.lua            — eventos legacy animations:* (só ativa se o qb-core existir)
├── data/
│   ├── animations/
│   │   ├── emotes.lua                  — emotes gerais
│   │   ├── dance_emotes.lua            — danças
│   │   ├── prop_emotes.lua             — emotes com props
│   │   ├── consumable_emotes.lua       — comer, beber, fumar
│   │   ├── synchronized_emotes.lua     — emotes em par
│   │   ├── animal_emotes.lua           — emotes de peds animais
│   │   ├── walks.lua                   — estilos de caminhada
│   │   ├── scenarios.lua               — cenários nativos
│   │   ├── expressions.lua             — expressões faciais
│   │   └── *_pt-br.lua                 — comandos e rótulos traduzidos, carregados como aliases
│   └── ped_types.lua         — grupos de modelos de ped (dogs, cats, birds…) usados pela flag PedTypes
├── locales/                  — 25 idiomas da interface (.lua)
├── docs/                     — documentação por export, evento e statebag (markdown)
├── html/                     — resíduo de uma NUI antiga: não é declarado no fxmanifest nem usado pelo código
├── stream/
│   ├── [Animations]/         — dicionários de animação customizados
│   └── [Props]/              — modelos e .ytyp dos props
├── config.lua                — toda a configuração
├── custom_emotes.lua         — suas animações, preservadas entre atualizações
├── prop_dump.lua             — lista de props gerada automaticamente (whitelist de anti-cheat)
├── version.txt               — versão usada na checagem de update
└── fxmanifest.lua