# snt-animations

***

## Executando animações

```lua
TriggerClientEvent('snt/animations/play',source,animationData)
```

> O parâmetro **animationData** deve ser uma tabela, com os dados da animação a ser executada,\
> no formato abaixo:

```lua
animationData = {
    dict = "mp_player_intdrink", 
    anim = "loop_bottle",
    walk = true,
    loop = true,
    -- opcionais \/
    clearBefore = true, -- (limpar a animação atual antes)
    prop = "prop_ld_flow_bottle",
    bone = 60309,
    prop_placement = {0.0,0.0,0.02,0.0,0.0,130.0},
    extraProps = { -- props adicionais
        { 
            prop = 'extra_prop',
            bone = 60309, 
            prop_placement = {0.0,0.0,0.0,0.0,0.0,0.0}
        }
    },
}
```

***

## Cancelando/parando animações

```lua
TriggerClientEvent('snt/animations/stop',source)
```

***

## Bloqueando o uso de animações

```lua
TriggerClientEvent('snt/animations/setBlocked',source,isBlocked)
-- isBlocked : boolean : true (bloqueado/travado), false (desbloqueado/destravado)
```

> Quando um jogador está com as animações bloqueadas, ele não poderá:
>
> * realizar novas animações
> * acessar o menu de animações
> * cancelar animações em andamento

Também é possível bloquear o uso do snt-animations através do uso dos **StateBags `animBlocked` e** `animationsDisabled`.

```lua
-- #### server
Player(source).state:set('animBlocked',true,true)
-- ou
Player(source).state:set('animationsDisabled',true,true)

-- #### client
LocalPlayer.state:set('animBlocked',true)
-- ou
LocalPlayer.state:set('animationsDisabled',true)
```

```lua
-- server
Player(source).state:set('animBlocked',true,true)

-- client
LocalPlayer.state:set('animBlocked',true)
```

***

## Inserindo novas animações no menu

{% hint style="info" %}
o export **insertAnimation** deve ser utilizado **exclusivamente** no **client** (ex snt-animations/src/custom.lua).
{% endhint %}

```lua
exports['snt-animations']:insertAnimation(category, name, animationData)
```

> **category**
>
> ID da categoria onde a animação inserida será exibida.
>
> <sub>Categorias pré-existentes:</sub> <sub></sub><sub><kbd>others<kbd></sub><sub>,</sub> <sub></sub><sub><kbd>physical<kbd></sub><sub>,</sub> <sub></sub><sub><kbd>dances<kbd></sub><sub>,</sub> <sub></sub><sub><kbd>trend<kbd></sub><sub>,</sub> <sub></sub><sub><kbd>poses<kbd></sub><sub>,</sub> <sub></sub><sub><kbd>objects<kbd></sub><sub>,</sub> <sub></sub><sub><kbd>services<kbd></sub><sub>.</sub>

{% hint style="info" %}
Também é possível utilizar *categorias custom*, assim como personalizar a exibição destas categorias no menu, utilizando o export <kbd>registerCategory</kbd>, vide código abaixo!
{% endhint %}

```lua
exports['snt-animations']:registerCategory(category, name, icon)
-- category : string : id da categoria conforme utilizado em insertAnimation.
-- name : string : nome da categoria para exibição no menu
-- icon : string : nome da imagem que deve ser um SVG dentro da pasta web/img
-- ex: 'iconName', logo dentro de web/img você deve adicionar iconName.svg
```

> **name**\
> nome da animação, será exibido no menu e também será utilizado no comando /e \<nome>.

> animationData\
> dados da animação, no formato abaixo:

```lua
animationData = {
    dict = "mp_player_intdrink", 
    anim = "loop_bottle",
    walk = true,
    loop = true,
    -- opcionais \/
    clearBefore = true, -- (limpar a animação atual antes)
    prop = "prop_ld_flow_bottle",
    bone = 60309,
    prop_placement = {0.0,0.0,0.02,0.0,0.0,130.0},
    vehicle_allowed = false, -- Se pode ser feita em veículos (true) ou não (false/padrão).
    extraProps = { -- props adicionais
        { 
            prop = 'extra_prop',
            bone = 60309, 
            prop_placement = {0.0,0.0,0.0,0.0,0.0,0.0}
        }
    },
    vehicle_allowed = false, -- se pode ser executada em veículos ou não (true | false)
}
```

> **exemplo de utilização:**

{% code title="client.lua" %}

```lua
CreateThread(function()

    while type(insertAnimation) ~= 'function' do
        Wait(500)
    end
    
    Wait(1000)
    
    insertAnimation(
        'poses',
        'curioso',
        { 
            dict = 'anim@amb@board_room@whiteboard@', 
            anim = 'curious_01_amy_skater_01', 
            walk = false, 
            loop = true 
        }
    )
    
end)
```

{% endcode %}

## Inserindo animações em duplas

É possível também adicionar animações em dupla no menu, onde é necessário inserir a animação (com mesmo nome) nas categorias `couple` e `couple:sync`, vide exemplo abaixo.

<pre class="language-lua" data-title="client.lua"><code class="lang-lua">CreateThread(function()

    while type(insertAnimation) ~= 'function' do
        Wait(500)
    end
    
    Wait(1000)

    local animationDataP1 = {
        dict = 'mp_ped_interaction',
        anim = 'kisses_guy_a',
        walk = false,
        duration = 5000, -- se não houver duração, adicionar loop = true no lugar.
        syncOptions = {
            syncOffset = { front =  1.05 }
        }
    }
    
    local animationDataP2 = {
<strong>        dict = 'mp_ped_interaction',
</strong>        anim = 'kisses_guy_b',
        walk = false,
        duration = 5000, -- se não houver duração, adicionar loop = true no lugar.
        syncOptions = {
            syncOffset = { front =  1.18 }
        },
        carryTask = false -- se é uma animação de carregar ou não, pra caso um dos dois pare de fazer ela ser forçada de volta (ex ao passar em portas).
    }
    
    insertAnimation('couple','abracar',animationDataP1)
    insertAnimation('couple:sync','abracar',animationDataP2)
    
end)


######################################################
## Demais opções da configuração syncOptions, no animation data de animações em duplas:

-- Ajustar a coordenada do ped (front = ajuste frontal, side = ajuste lateral):
syncOffset = { front = 1.0, side = 0.0 }, 

-- Travar a posição do ped:
freezePos = true,

<strong>-- Dar attach no ped 2 no ped 1 (grudar peds/carregar)
</strong>attachTo = { bone = 0, xPos = 0.1400, yPos = 0.2500, zPos = 0.0000, xRot = 0.0000, yRot = 0.0000, zRot = 0.0000 },

</code></pre>

***
