NPC Inteligente com Patrulha, Perseguição e Pathfinding
Este prompt cria um sistema avançado de IA para NPCs hostis no Roblox, estruturado em máquina de estados para alternar com confiabilidade entre patrulha, perseguição, ataque e retorno à rota. O resultado usa PathfindingService no servidor, recalcula rotas quando necessário e trata obstáculos, alvos inválidos e falhas de caminho.
É indicado para jogos de aventura, survival, RPG, tycoon com inimigos e experiências de combate multiplayer. O prompt solicita que o modelo adapte o código à hierarquia real do seu projeto, incluindo nomes de NPCs, waypoints, atributos, animações, eventos remotos existentes e regras de dano.
A implementação prioriza segurança multiplayer: decisões de IA, validação de alvo e aplicação de dano são exclusivamente do servidor. Ao final, você recebe código Luau comentado, pronto para colar, além de instruções objetivas de instalação e testes no Roblox Studio.
Atue como um desenvolvedor Roblox sênior, especialista em Luau, IA de NPCs e arquitetura multiplayer segura. Gere um Script de servidor completo para um NPC com patrulha, perseguição e ataque usando PathfindingService, adaptado ao contexto do meu projeto fornecido abaixo. Antes de escrever o código, analise o contexto e assuma apenas o que estiver explicitamente definido. Se algum detalhe essencial estiver ausente, não pare para fazer perguntas: implemente uma configuração clara no início do script, com valores padrão seguros e comentários indicando o que devo ajustar. Não invente RemoteEvents, pastas ou objetos obrigatórios sem declarar onde deverão existir. O resultado deve ser utilizável em multiplayer e deve funcionar com vários jogadores simultâneos. ## Contexto do meu jogo (preencherei antes de enviar) - Nome e caminho do Model do NPC no Explorer: [EX.: Workspace.Enemies.Guard] - Partes do NPC: Humanoid = [nome], HumanoidRootPart = [nome], Animator/animações = [detalhes ou "não existem դեռ"] - Pasta/modelo de waypoints de patrulha e nomes das Parts: [EX.: Workspace.Waypoints.GuardRoute] - O NPC deve patrulhar em ordem, aleatoriamente ou ida e volta: [modo] - Distância de detecção, distância de perda, campo de visão e distância de ataque: [valores] - Dano, cooldown de ataque e comportamento desejado: [valores; contato, hitbox ou raio] - Deve usar Attributes no NPC? Informe nomes/valores existentes: [detalhes] - RemoteEvents/RemoteFunctions já existentes e seus caminhos: [detalhes; ou "nenhum անհրաժեշտ"] - Regras extras: facções, jogadores ignorados, safe zones, equipes, alvos NPCs, animações, sons, loot etc.: [detalhes] ## Entrega obrigatória Crie exatamente **um Script** (não LocalScript e não ModuleScript), para ser colocado como filho direto do **Model do NPC no Workspace**. Ele deve executar integralmente no servidor. Se precisar de configuração por Attributes, o próprio Script deve ler Attributes opcionais do Model e usar valores padrão documentados quando eles não existirem. Não dependa de código no cliente para movimentação, decisão, dano, validação ou controle de estados. Implemente uma máquina de estados explícita, com ao menos os estados `Patrol`, `Chase`, `Attack` e `ReturnToPatrol` (ou equivalentes bem documentados). O NPC deve: 1. Encontrar o jogador elegível mais próximo, validando `Player`, `Character`, `Humanoid`, `HumanoidRootPart`, vida e distância. 2. Detectar alvos por raio de percepção e, quando configurado, por campo de visão. Use `workspace:Raycast` com `RaycastParams` para linha de visão, ignorando corretamente o próprio NPC. Não considere paredes como visão livre. 3. Patrulhar os waypoints de maneira robusta. Valide se a pasta existe, filtre apenas `BasePart`, ordene por nome quando apropriado e trate rotas sem waypoints sem travar o script. 4. Perseguir usando `PathfindingService:CreatePath()` e `ComputeAsync()`, com parâmetros de agente configuráveis (raio, altura, salto e inclinação). Percorra waypoints usando `Humanoid:MoveTo()` e `MoveToFinished` sem bloquear indefinidamente. 5. Recalcular o caminho com intervalo controlado, somente quando o alvo se moveu significativamente, o caminho foi bloqueado, o NPC ficou preso, ou a rota falhou. Conecte e desconecte corretamente `Path.Blocked` para evitar vazamentos de conexão. 6. Atacar apenas quando o alvo estiver vivo, dentro do alcance e respeitando cooldown. Aplique dano exclusivamente no servidor com `Humanoid:TakeDamage()` ou mecanismo equivalente seguro. Nunca use RemoteEvent para o cliente informar dano, moedas, alcance ou alvo válido. 7. Parar ou atualizar a movimentação ao entrar em alcance de ataque; retomar perseguição ao sair do alcance; perder o alvo após distância/tempo configurável; e retornar ao waypoint adequado após perder a perseguição. 8. Tratar morte/destruição do NPC, remoção do personagem alvo, respawn e erros de pathfinding sem loops infinitos, `task.wait()` excessivo ou conexões órfãs. Use práticas Luau atuais: `game:GetService`, variáveis locais, `task.wait`, `os.clock` quando útil, validações defensivas, `pcall` apenas onde fizer sentido e comentários técnicos em português. Não use APIs obsoletas. Evite lógica por frame em `RunService` se um loop com frequência configurável for suficiente. O código deve ser autocontido, legível e eficiente para múltiplos NPCs. Entregue a resposta nesta ordem: primeiro uma breve lista de pré-requisitos no Explorer; depois o código Luau integral em um único bloco markdown iniciado exatamente com ```lua; depois instruções numeradas para instalar, configurar os Attributes/waypoints e testar no Roblox Studio com pelo menos dois jogadores usando Test > Start Server. Não omita nenhuma parte do código, não use pseudocódigo e não deixe funções marcadas como "implementar depois".