I'm making a gun. But a big gameplay issue is the ability to put the gun through a part, and be able to shoot out the other side. I'm using raycast here is my script. It's a local script btw.
local tool = script.Parent
local user
local cooldown = false
local ammo = 18
local debounce = false
local canfire = true
tool.Equipped:connect(function(mouse)
user = tool.Parent
mouse.Button1Down:connect(function()
if cooldown == false and ammo > 0 and canfire == true then
ammo = ammo - 1
tool.Handle.Fire:Play()
tool.Name = "|Pistol| ["..ammo.."]"
cooldown = true
local ray = Ray.new(tool.Handle.CFrame.p, (mouse.Hit.p - tool.Handle.CFrame.p).unit*300)
local hit, position = game.Workspace:FindPartOnRay(ray, user)
local humanoid = hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid")
if humanoid then
if hit.Name == "Head" then
humanoid:TakeDamage(55)
end
if hit.Name == "LeftLeg" or hit.Name == "RightLeg" then
humanoid:TakeDamage(10)
end
if hit.Name == "LeftArm" or hit.Name == "RightArm" then
humanoid:TakeDamage(10)
end
humanoid:TakeDamage(30)
end
local distance = (position - tool.Handle.CFrame.p).magnitude
local rayPart = Instance.new("Part", user)
rayPart.Name = "RayPart"
rayPart.BrickColor = BrickColor.new("Bright red")
rayPart.Transparency = 0.5
rayPart.Anchored = true
rayPart.CanCollide = false
rayPart.TopSurface = Enum.SurfaceType.Smooth
rayPart.BottomSurface = Enum.SurfaceType.Smooth
rayPart.formFactor = Enum.FormFactor.Custom
rayPart.Size = Vector3.new(0.2, 0.2, distance)
rayPart.CFrame = CFrame.new(position, tool.Handle.CFrame.p) * CFrame.new(0, 0, -distance/2)
game.Debris:AddItem(rayPart, 0.1)
end
if ammo == 0 then
if debounce == false then
debounce = true
tool.Name = "Reloading"
tool.Handle.Reload:Play()
wait(2.5)
ammo = 18
tool.Name = "|Pistol| ["..ammo.."]"
debounce = false
end
end
mouse.KeyDown:connect(function(key)
if key == "r" and debounce == false then
debounce = true
tool.Name = "Reloading"
tool.Handle.Reload:Play()
wait(2.5)
ammo = 18
tool.Name = "["..ammo.."]"
debounce = false
end
end)
end)
end)
while true do
if cooldown == true then
wait(0.25)
cooldown = false
end
wait()
end
