So I recently picked up raycasting and started to experiment with it. Everything works fine without two things, number one I can't see the ray part. Number two, after I did my best to implement a spread system the gun broke down, it doesn't hit anything. So I added a print(hit) which always returns nil when I got the spread system.
Edit: forgot to add the spread part before, it's fixed now though
--Gun
local tool = script.Parent
local player = game:GetService("Players").LocalPlayer
local character = player.Character or player.CharacterAdded:wait()
local human = character:WaitForChild("Humanoid")
local handle = tool.Handle
local mouse = player:GetMouse()
local clip = 30
local ammo = 90
local equipped = nil
local reloading = false
local damage = 10
local IsFiring = nil
local spreadX = 0
local spreadY = 0
local spreadZ = 0
local spreadXMax = 1.1
local spreadYMax = 0.3
local spreadZMax = 1.1
local damageModifier = {
1.5,
1,
0.7,
0.5
}
print(tonumber(damageModifier[1]))
local lastfire = 0
local rps = 0
local shootwindow = 0.5
tool.Equipped:connect(function() -- shooting
equipped = true
mouse.Button1Down:connect(function()
if clip >= 1 and reloading == false then
print("firedonce")
repeat
print("fires")
local clickdelta = tick() -lastfire -- spread
if clickdelta > 1 then
lastfire = tick()
if clickdelta < shootwindow then
rps = rps + 1
if rps >= 4 then
spreadX = spreadX + 0.0423
spreadZ = spreadZ + 0.0423
spreadY = spreadY + 0.0115
if spreadX > spreadXMax then
spreadX = spreadXMax
return
end
if spreadY > spreadYMax then
spreadY = spreadYMax
return
end
if spreadZ > spreadZMax then
spreadZ = spreadZMax
return
end
end
end
end
local ray = Ray.new(
handle.CFrame.p, --origin
(mouse.hit.p - handle.CFrame.p).unit + Vector3.new(math.random(0,spreadX),math.random(0,spreadY),math.random(0,spreadZ))* 500 --direction
)
local hit, position = workspace:FindPartOnRay(ray, character,nil)
local bullet = Instance.new("Part", workspace) --Part
bullet.BrickColor = BrickColor.new("Yellow")
bullet.FormFactor = "Custom"
bullet.Material = "Neon"
bullet.Transparency = 0.25
bullet.Locked = true
bullet.Anchored = true
bullet.CanCollide = false
local distance = (handle.CFrame.p - position).magnitude
bullet.Size = Vector3.new(0.3,0.3,distance)
bullet.CFrame = CFrame.new(handle.CFrame.p,position) * CFrame.new(0,0, -distance / 2)
game:GetService("Debris"):AddItem(bullet,1)
clip = clip - 1
print(clip)
IsFiring = true
print(hit.Name)
if hit and hit ~= nil then
print(hit.Name)
if hit.Parent:FindFirstChild("Humanoid") and hit.Parent.Name == "Zombie" then --Damage
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid and humanoid.Health > 0 then
if hit.Name == "Head" then
humanoid:TakeDamage(damage * tonumber(damageModifier[1]))
elseif hit.Name == "Torso" then
humanoid:TakeDamage(damage * tonumber(damageModifier[2]))
elseif hit.Name == "Right Arm" or hit.Name == "Left Arm" then
humanoid:TakeDamage(damage * tonumber(damageModifier[3]))
elseif hit.Name == "Right Leg" or hit.Name == "Left Leg" then
humanoid:TakeDamage(damage * tonumber(damageModifier[4 ]))
end
end
end
end
wait(0.115)
until clip <= 0 or IsFiring == false
end
end)
mouse.Button1Up:connect(function() --stop shooting
IsFiring = false
end)
mouse.KeyDown:connect(function(key) --reload
key:lower()
if key == "r" and reloading == false and equipped == true and clip <= 29 and ammo >= 1 then
for i = 1,30 do
wait()
if clip <= 29 and ammo >= 1 then
clip = clip + 1
ammo = ammo - 1
print(clip)
print(ammo)
else
break
end
end
end
end)
end)
tool.Unequipped:connect(function()
equipped = false
end)
Thanks in advance, Kryddan!
