Open Menu
Close Menu
Login
Sign up
AI Tools
Schedule
Answers
Login
Sign up
Ad
AI Code Improver
O script :
Asked on 9/8/2026, 1 pageview
Ad
Responses
local npc = script.Parent local humanoid = npc:WaitForChild("Humanoid") local rootPart = npc:WaitForChild("HumanoidRootPart") -- Carregando as Animações local andarAnim = npc:WaitForChild("Andar") local paradoAnim = npc:WaitForChild("Parado") local finalizacaoAnim = npc:WaitForChild("Finalizacao") local animator = humanoid:WaitForChild("Animator") local andarTrack = animator:LoadAnimation(andarAnim) local paradoTrack = animator:LoadAnimation(paradoAnim) local finalizacaoTrack = animator:LoadAnimation(finalizacaoAnim) -- Configurações de Atributos/Status local DANO_NORMAL = 8 local PORCENTAGEM_FINALIZACAO = 0.05 -- 5% de vida local ALCANCE_ATAQUE = 5 local ALCANCE_VISAO = 45 local COOLDOWN_ATAQUE = 1.2 -- Estados do NPC local estadoAtual = "Patrulha" -- "Patrulha", "Perseguindo", "Finalizando" local tempoPatrulha = 0 -- Sistema de controle de animação simples local trackAtiva = nil local function tocarAnimacao(track) if trackAtiva == track then return end if trackAtiva then trackAtiva:Stop() end trackAtiva = track trackAtiva:Play() end -- Função para encontrar o jogador mais próximo local function encontrarAlvo() local maxDist = ALCANCE_VISAO local alvo = nil for _, player in pairs(game.Players:GetPlayers()) do local char = player.Character if char and char:FindFirstChild("Humanoid") and char:FindFirstChild("HumanoidRootPart") then local alvoHumanoid = char.Humanoid -- Só persegue se o jogador estiver vivo if alvoHumanoid.Health > 0 then -- REGRA 2: Verifica se o jogador JÁ está sendo finalizado por outro NPC local jaSendoFinalizado = char:GetAttribute("SendoFinalizado") if not jaSendoFinalizado then local dist = (char.HumanoidRootPart.Position - rootPart.Position).Magnitude if dist < maxDist then maxDist = dist alvo = char end end end end end return alvo end -- Função para gerar um ponto aleatório de caminhada ao redor do NPC local function obterPontoAleatorio() local raio = 30 local angulo = math.random() * math.pi * 2 local x = math.cos(angulo) * raio local z = math.sin(angulo) * raio return rootPart.Position + Vector3.new(x, 0, z) end -- Loop de comportamento e movimento task.spawn(function() local pontoDestino = nil while true do task.wait(0.1) -- Evita ações de IA durante a finalização if estadoAtual ~= "Finalizando" then local alvo = encontrarAlvo() if alvo then -- Mudança de estado para Perseguição estadoAtual = "Perseguindo" pontoDestino = nil -- Move em direção ao jogador humanoid:MoveTo(alvo.HumanoidRootPart.Position) tocarAnimacao(andarTrack) -- Verifica distância para atacar local dist = (alvo.HumanoidRootPart.Position - rootPart.Position).Magnitude if dist <= ALCANCE_ATAQUE then local alvoHumanoid = alvo.Humanoid local vidaMaxima = alvoHumanoid.MaxHealth local limiteVida = vidaMaxima * PORCENTAGEM_FINALIZACAO -- Checa se o jogador atingiu os 5% de vida ou menos if alvoHumanoid.Health <= limiteVida and alvoHumanoid.Health > 0 then -- Segurança dupla: Verifica se outro NPC não pegou ele no exato milissegundo anterior if not alvo:GetAttribute("SendoFinalizado") then estadoAtual = "Finalizando" humanoid:MoveTo(rootPart.Position) -- Para o NPC imediatamente -- Ativa a tag no jogador para que outros NPCs o ignorem alvo:SetAttribute("SendoFinalizado", true) -- Inicia a cena de finalização tocarAnimacao(finalizacaoTrack) alvo.HumanoidRootPart.Anchored = true -- Prende o jogador -- Espera o tempo do impacto da sua animação (ex: 1.5 segundos) task.wait(1.5) -- Mata o jogador alvoHumanoid.Health = 0 -- Reseta as configurações e libera o NPC task.wait(0.5) alvo.HumanoidRootPart.Anchored = false alvo:SetAttribute("SendoFinalizado", nil) estadoAtual = "Patrulha" end else -- Ataque Comum alvoHumanoid:TakeDamage(DANO_NORMAL) tocarAnimacao(paradoTrack) -- Curta pausa para o golpe task.wait(COOLDOWN_ATAQUE) end end else -- REGRA 1: Comportamento de Patrulha (Wander) estadoAtual = "Patrulha" if not pontoDestino or (rootPart.Position - pontoDestino).Magnitude < 4 then -- Se chegou ao destino ou não tem um, decide se anda ou fica parado humanoid:MoveTo(rootPart.Position) -- Para tocarAnimacao(paradoTrack) -- Espera um tempo aleatório parado (Inativo) entre 2 a 5 segundos task.wait(math.random(2, 5)) -- Escolhe um novo ponto para andar pontoDestino = obterPontoAleatorio() humanoid:MoveTo(pontoDestino) tocarAnimacao(andarTrack) else -- Caso tenha ficado preso ou demore muito no caminho, força um reset após 8 segundos tempoPatrulha = tempoPatrulha + 0.1 if tempoPatrulha > 8 then pontoDestino = nil tempoPatrulha = 0 end end end end end end) -- Detecta quando o NPC para de andar fisicamente para ajustar animações visuais de patrulha humanoid.Running:Connect(function(speed) if estadoAtual == "Patrulha" or estadoAtual == "Perseguindo" then if speed > 0.1 then tocarAnimacao(andarTrack) else tocarAnimacao(paradoTrack) end end end)
by GPT-5 Nano
Write a better answer
Improve More Code
Loading...
Ad
Ad