Currently I am scripting a weapons handler script for a game I am working on. The guns shoot out a beam, which travels a set distance and lingers for a very short period of time. When this beam is fired, a ray is also fired too, that follows the beam, to detect if a character is hit to then deal damage. However, it doesn't always deal damage. It used to work every time when the ray was drawn between the targetlocation and the handle, however, the script was modified have spray, and since then the rays have been inconsistent, even with the weapon that has no spray. This is the script:
local GunData = require(game.ReplicatedStorage.GunData)
local rep = 1
game.ReplicatedStorage.ShootGun.OnServerEvent:Connect(function(Player, TargetLocation, Handle)
if Player.Character == nil then
return
end
if Handle then
local Tool = Handle.Parent
if Tool:IsA("Tool")then
if Tool.Parent == Player.Character then
local relevantData = GunData[Tool.Name]
if relevantData ~= nil then
for count = 1,relevantData.REP do
Handle.Sound:Play()
local Beam = Instance.new("Part", workspace)
Beam.Color = relevantData.COLOR
Beam.FormFactor = "Custom"
Beam.Transparency = 0.25
Beam.Material = "Neon"
Beam.Anchored = true
Beam.CanCollide = false
local Distance = (TargetLocation - Handle.Position).magnitude
if Distance >= relevantData.RANGE then
Distance = relevantData.RANGE
end
Distance = Distance + 5
local NewAngle = CFrame.Angles(math.rad(math.random(-relevantData.ANGLE,relevantData.ANGLE)),math.rad(math.random(-relevantData.ANGLE,relevantData.ANGLE)),math.rad(math.random(-relevantData.ANGLE,relevantData.ANGLE)))
Beam.Size = Vector3.new(relevantData.WIDTH, relevantData.WIDTH, Distance)
Beam.CFrame = CFrame.new(Handle.Position, TargetLocation) * CFrame.new(0, 0, -Distance/2)
local offset = Handle.CFrame:Inverse()*Beam.CFrame
local handleStartCFrame = Handle.CFrame
local newCFrame = handleStartCFrame*NewAngle
Beam.CFrame = newCFrame*offset
game.Debris:AddItem(Beam, 0.1)
local NewRay = RaycastParams.new()
local RayDirection = Beam.CFrame.LookVector * Distance
NewRay.FilterDescendantsInstances = {Player.Character}
local Result = workspace:Raycast(Handle.Position, RayDirection, NewRay)
if Result then
if Result.Instance then
local humanoid = Result.Instance.Parent:FindFirstChild("Humanoid") or Result.Instance.Parent.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health -= relevantData.DMG
end
end
end
if relevantData.DELAY ~= 0 then
wait(relevantData.DELAY)
end
end
end
end
end
end
end)
If anyone knows why it isn't always damaging the player, then any pointers in the right direction would be appreciated

1 comment
to help make it clear, the ray cast starts at line 37