Server Sided Position & CFrame
Script:
local tool = script.Parent
local config = tool:WaitForChild("Configuration")
function AngleOfReach(distance, altitude, velocity)
local theta = math.atan((velocity^2 + math.sqrt(velocity^4 -196.2*(196.2*distance^2 + 2*altitude*velocity^2)))/(196.2*distance))
if theta ~= theta then
theta = math.pi/4
end
return(theta)
end
function Explode(part)
local explosion = Instance.new("Explosion", workspace)
explosion.Position = part.Position
explosion.BlastRadius = config.ExplosionRadius.Value
part:Destroy()
end
script.Parent.Throw.OnServerEvent:Connect(function(Player, mousePosition, Spawn, SpawnCF)
Spawn = tool.Handle.Position
SpawnCF = tool.Handle.CFrame
local handlePos = Vector3.new(Spawn.X, 0, Spawn.Z)
local mousePos = Vector3.new(mousePosition.X, 0, mousePosition.Z)
local distance = (handlePos - mousePos).magnitude
local altitude = mousePosition.Y - tool.Handle.Position.Y
local angle = AngleOfReach(distance, altitude, config.GrenadeVelocity.Value)
tool.Handle.Transparency = 1
local grenade = tool.Handle:Clone()
grenade.Parent = workspace
grenade.Transparency = 0
grenade.CanCollide = true
grenade.CFrame = SpawnCF
grenade.Velocity = (CFrame.new(Spawn, Vector3.new(mousePosition.X, Spawn.Y, mousePosition.Z)) * CFrame.Angles(angle, 0, 0)).lookVector * config.GrenadeVelocity.Value
spawn(function()
if config.ExplodeOnTouch.Value then
grenade.Touched:Connect(function(hit)
if hit.Parent ~= tool.Parent and hit.CanCollide then
Explode(grenade)
end
end)
else
wait(config.FuseTime.Value)
Explode(grenade)
end
end)
wait(config.Cooldown.Value)
tool.Handle.Transparency = 0
end)
Localscript:
local Player = game.Players.LocalPlayer
local Mouse = Player:GetMouse()
local Tool = script.Parent
local Handle = Tool:WaitForChild("Handle")
local Configuration = Tool:WaitForChild("Configuration")
local canThrow = true
Tool.Equipped:Connect(function()
Mouse.Icon = "rbxasset://textures/GunCursor.png"
end)
Tool.Unequipped:Connect(function()
Mouse.Icon = ""
end)
Tool.Activated:Connect(function()
if canThrow then
canThrow = false
local throwAnimation = Player.Character:WaitForChild("Humanoid"):LoadAnimation(Tool:WaitForChild("ThrowAnimation"))
throwAnimation:Play()
throwAnimation.KeyframeReached:Connect(function(keyframe)
if keyframe == "tick" then
Handle:WaitForChild("Pin"):Play()
elseif keyframe == "throw" then
Tool:WaitForChild("Throw"):FireServer(Mouse.Hit.p, Handle.Position, Handle.CFrame)
throwAnimation:Stop()
Mouse.Icon = "rbxasset://textures/GunWaitCursor.png"
end
end)
wait(Configuration:WaitForChild("Cooldown").Value)
Mouse.Icon = "rbxasset://textures/GunCursor.png"
canThrow = true
end
end)
Client Sided Position & CFrame
Script:
local tool = script.Parent
local config = tool:WaitForChild("Configuration")
function AngleOfReach(distance, altitude, velocity)
local theta = math.atan((velocity^2 + math.sqrt(velocity^4 -196.2*(196.2*distance^2 + 2*altitude*velocity^2)))/(196.2*distance))
if theta ~= theta then
theta = math.pi/4
end
return(theta)
end
function Explode(part)
local explosion = Instance.new("Explosion", workspace)
explosion.Position = part.Position
explosion.BlastRadius = config.ExplosionRadius.Value
part:Destroy()
end
script.Parent.Throw.OnServerEvent:Connect(function(Player, mousePosition, Spawn, SpawnCF)
local handlePos = Vector3.new(Spawn.X, 0, Spawn.Z)
local mousePos = Vector3.new(mousePosition.X, 0, mousePosition.Z)
local distance = (handlePos - mousePos).magnitude
local altitude = mousePosition.Y - tool.Handle.Position.Y
local angle = AngleOfReach(distance, altitude, config.GrenadeVelocity.Value)
tool.Handle.Transparency = 1
local grenade = tool.Handle:Clone()
grenade.Parent = workspace
grenade.Transparency = 0
grenade.CanCollide = true
grenade.CFrame = SpawnCF
grenade.Velocity = (CFrame.new(Spawn, Vector3.new(mousePosition.X, Spawn.Y, mousePosition.Z)) * CFrame.Angles(angle, 0, 0)).lookVector * config.GrenadeVelocity.Value
spawn(function()
if config.ExplodeOnTouch.Value then
grenade.Touched:Connect(function(hit)
if hit.Parent ~= tool.Parent and hit.CanCollide then
Explode(grenade)
end
end)
else
wait(config.FuseTime.Value)
Explode(grenade)
end
end)
wait(config.Cooldown.Value)
tool.Handle.Transparency = 0
end)
Localscript:
local Player = game.Players.LocalPlayer
local Mouse = Player:GetMouse()
local Tool = script.Parent
local Handle = Tool:WaitForChild("Handle")
local Configuration = Tool:WaitForChild("Configuration")
local canThrow = true
Tool.Equipped:Connect(function()
Mouse.Icon = "rbxasset://textures/GunCursor.png"
end)
Tool.Unequipped:Connect(function()
Mouse.Icon = ""
end)
Tool.Activated:Connect(function()
if canThrow then
canThrow = false
local throwAnimation = Player.Character:WaitForChild("Humanoid"):LoadAnimation(Tool:WaitForChild("ThrowAnimation"))
throwAnimation:Play()
throwAnimation.KeyframeReached:Connect(function(keyframe)
if keyframe == "tick" then
Handle:WaitForChild("Pin"):Play()
elseif keyframe == "throw" then
Tool:WaitForChild("Throw"):FireServer(Mouse.Hit.p, Handle.Position, Handle.CFrame)
throwAnimation:Stop()
Mouse.Icon = "rbxasset://textures/GunWaitCursor.png"
end
end)
wait(Configuration:WaitForChild("Cooldown").Value)
Mouse.Icon = "rbxasset://textures/GunCursor.png"
canThrow = true
end
end)