-- Script que Lança o Projétil (Exemplo de um Script de Servidor)
local RemoteEvent = game.ReplicatedStorage:WaitForChild("LancarProjetil") -- Supondo que você tem um RemoteEvent
local ProjetilModelo = game.ServerStorage:WaitForChild("SeuProjetil") -- O projétil com o script de dano dentro
RemoteEvent.OnServerEvent:Connect(function(jogador, posicaoAlvo)
local personagem = jogador.Character
if not personagem then return end
local novoProjetil = ProjetilModelo:Clone()
novoProjetil.Parent = workspace
-- Define a posição inicial e move o projétil (exemplo simplificado)
local posicaoInicial = personagem.HumanoidRootPart.Position + Vector3.new(0, 3, 0)
novoProjetil.Position = posicaoInicial
-- === IMPORTANTE: CONFIGURA O CRIADOR NO SCRIPT DO PROJÉTIL ===
local scriptDano = novoProjetil:FindFirstChildOfClass("Script")
if scriptDano and scriptDano.JOGADOR_CRIADOR then
scriptDano.JOGADOR_CRIADOR = jogador
end
-- Use BodyVelocity/LinearVelocity, ou TweenService para mover o projétil até o alvo
-- Exemplo de movimento simples:
local velocidade = Instance.new("BodyVelocity")
velocidade.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
velocidade.Velocity = (posicaoAlvo - posicaoInicial).Unit * 50 -- 50 é a velocidade
velocidade.Parent = novoProjetil
-- Adiciona um atraso para remover o BodyVelocity e deixar o projétil voar um pouco antes de cair.
game:GetService("Debris"):AddItem(velocidade, 0.2)
end)
Features & Information
--[[
Script de Servidor (Server Script) para o Projétil
Deve ser colocado DENTRO da Part ou MeshPart que é o projétil.
]]
local Projetil = script.Parent
-- === CONFIGURAÇÕES ===
local RAIO_MAXIMO_DANO = 10 -- O raio (em studs) a partir do centro do projétil para causar dano.
local DANO_MAXIMO = 30 -- O dano máximo que pode ser causado (no centro).
local TEMPO_VIDA = 3 -- Tempo em segundos até o projétil ser destruído se não atingir nada.
local JOGADOR_CRIADOR = nil -- Será preenchido quando o projétil for criado.
-- Função para aplicar dano aos jogadores próximos
local function aplicarDanoEmArea(posicaoExplosao)
local jogadores = game:GetService("Players"):GetPlayers()
for _, jogador in ipairs(jogadores) do
-- Ignora o jogador que criou o projétil
if JOGADOR_CRIADOR and jogador == JOGADOR_CRIADOR then
continue
end
local personagem = jogador.Character
-- Verifica se o personagem existe e tem um HumanoidRootPart
if personagem and personagem:FindFirstChild("HumanoidRootPart") then
local humanoide = personagem:FindFirstChildOfClass("Humanoid")
local raizPersonagem = personagem.HumanoidRootPart
-- 1. Calcula a distância entre o projétil e o centro do jogador.
local distancia = (raizPersonagem.Position - posicaoExplosao).Magnitude
-- 2. Verifica se a distância está dentro do raio máximo de dano.
if distancia <= RAIO_MAXIMO_DANO and humanoide and humanoide.Health > 0 then
-- 3. Calcula o dano com base na distância (Dano decresce com a distância).
-- (1 - (distancia / RAIO_MAXIMO_DANO)) => Isso retorna 1 no centro e 0 no limite.
local fatorDistancia = 1 - (distancia / RAIO_MAXIMO_DANO)
local danoFinal = DANO_MAXIMO * fatorDistancia
-- O dano mínimo é 1, para garantir que cause algum dano.
if danoFinal < 1 then
danoFinal = 1
end
-- Aplica o dano ao Humanoid
humanoide:TakeDamage(danoFinal)
print(jogador.Name .. " levou " .. math.floor(danoFinal) .. " de dano.")
end
end
end
end
-- Função que ocorre quando o projétil é destruído ou atinge algo
local function onProjetilFim(posicao)
-- Evita que o dano seja aplicado múltiplas vezes
if Projetil:GetAttribute("DanoAplicado") then return end
Projetil:SetAttribute("DanoAplicado", true)
-- Aplica o dano na área antes de destruir
aplicarDanoEmArea(posicao)
-- Efeitos visuais/sonoros de explosão (Opcional: adicione um Explosion, partículas, etc.)
-- Destrói o projétil
Projetil:Destroy()
end
-- 1. Detecta colisão (se o projétil tocar em algo, aplica o dano e destrói)
Projetil.Touched:Connect(function(parteTocou)
-- Impede a colisão com o criador (opcional)
if JOGADOR_CRIADOR and parteTocou.Parent == JOGADOR_CRIADOR.Character then
return
end
onProjetilFim(Projetil.Position)
end)
-- 2. Limite de tempo (se o projétil durar demais sem atingir nada, destrói e aplica dano)
game:GetService("Debris"):AddItem(Projetil, TEMPO_VIDA)
Projetil.Destroying:Connect(function()
onProjetilFim(Projetil.Position)
end)
-- *** ATENÇÃO: Você precisa definir a variável JOGADOR