> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dkscripts.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Funções em server-side

# Funções e Lógica do Servidor

Este arquivo é o núcleo da lógica do lado do servidor para o script. Ele é responsável por validar permissões, verificar as condições dos jogadores e gerenciar as regras necessárias para que uma animação em dupla possa ser executada com segurança e de forma interativa.

<Note>
    📁 dk\_animations\_ext > config > server > functions.lua
</Note>

***

## Estrutura e Lógica

O script organiza a lógica em funções modulares que lidam com tarefas específicas, desde a checagem de permissões de administrador até a validação das condições em tempo real para executar uma animação.

### Funções de Validação e Permissão

* `isAdmin(source)`: Uma função interna que verifica se um jogador tem status de administrador. Ela se integra ao framework do servidor (via export `dk_snippets`) para obter essa informação.
* `GetPeds(source, target)`: Garante que as entidades dos jogadores (peds) de origem e alvo existam no mundo do jogo antes de prosseguir, prevenindo erros.
* `Config.serverFuncs.managePedsPermission(source)`: Define a regra de permissão para comandos administrativos, reutilizando a função `isAdmin` para conceder ou negar acesso.

### Lógica Principal da Animação

A função `Config.serverFuncs.canPlayAnim` é o principal ponto de verificação e contém várias regras:

1. **Validade dos Peds**: Confere se ambos os jogadores são válidos.
2. **Vida do Jogador**: Impede a execução se o jogador estiver incapacitado (com vida baixa).
3. **Sistema de Convite**: Se a animação for configurada com `request = true`, ela envia um convite ao jogador alvo. A animação só prossegue se o convite for aceito.
4. **Verificação de Distância**: Garante que os jogadores estejam próximos o suficiente para que a animação sincronizada funcione corretamente.
5. **Feedback ao Jogador**: Envia notificações para informar o status da solicitação (enviada, recusada, aceita, muito longe).

<Tip>
  O sistema de convite, implementado com a função `Request`, é crucial para a interatividade. Ele dá ao jogador alvo o poder de aceitar ou recusar uma animação, promovendo interações consensuais e prevenindo spam ou abuso da mecânica.
</Tip>

***

## Código Fonte Completo

```lua dk_animations_ext/config/server/functions.lua theme={null}
Config.serverFuncs = {}

CreateThread(function()
    _, FW = exports["dk_snippets"]:framework()
end)

---Retorna true se o player for admin.
---@param source integer
---@return boolean
local function isAdmin(source)
    local player = FW.getPlayer(source)
    return player.isAdmin()
end

---Pegar os peds baseado nas sources
---@param source integer
---@param target integer
---@return integer|nil
---@return integer|nil
function GetPeds(source, target)
    local myPed = GetPlayerPed(source)
    local targetPed = GetPlayerPed(target)

    if not DoesEntityExist(myPed) or not DoesEntityExist(targetPed) then
        print("erro ao executar anim: ped inexistente ", myPed, targetPed)
        return nil, nil
    end

    return myPed, targetPed
end

---Verifica se o player pode executar determinada animação
---@param source integer
---@param target integer
---@param animConfig table
---@return boolean
function Config.serverFuncs.canPlayAnim(source, target, animConfig)
    local myPed, targetPed = GetPeds(source, target)

    if not myPed or not targetPed then
        return false
    end

    if GetEntityHealth(myPed) <= 101 then
        return false
    end

    Notification(source, "green", Locale("sent_anim"), 3000)

    if animConfig.request and not Request(target, Locale("request_anim", {animConfig.command}), 20) then
        Notification(source, "red", Locale("refused_anim"), 3000)
        return false
    end

    local myCoords = GetEntityCoords(myPed)
    local targetCoords = GetEntityCoords(targetPed)
    if #(myCoords - targetCoords) > 3 then
        Notification(source, "red", Locale("too_far"), 3000)
        return false
    end

    Notification(source, "green", Locale("accepted_by_user"), 3000)

    return true
end

---Permissão para gerenciar as idades dos peds.
---@param source integer
---@return boolean
function Config.serverFuncs.managePedsPermission(source)
    return isAdmin(source)
end
```

***

🔔 **Resumo:**

* Este arquivo centraliza a lógica de validação do lado do servidor.
* A função `canPlayAnim` é a principal e executa múltiplas verificações: vida, consentimento do alvo e distância.
* A verificação de permissão (`managePedsPermission`) é modular e restringe o acesso a comandos administrativos.
* O script utiliza um sistema de convites para tornar as interações entre jogadores mais dinâmicas e consensuais.
