The script is suppose to allow the player to simulate "shooting" and when there cursor goes over a player, they will take damage. the issue is, after a while of "shooting" i get this error attempt to index local 'raw' (a nil value)
Any solutions?
player = game.Players.LocalPlayer character = player.Character gun = character:FindFirstChild("Rifle") mouse = player:GetMouse() auto = false function getModel(raw) for _, child in pairs(workspace:GetChildren()) do --calling pairs is barely any slower than using next directly, plus it's easier to read. if raw:IsDescendantOf(child) then return child; end; end; return nil; --this allows us to not use pcall end; mouse.Button1Down:connect(function() wait() auto = true while auto do wait() if mouse.Target then wait() local model = getModel(mouse.Target) if model and model:FindFirstChild("Humanoid") then wait() model.Humanoid.Health = model.Humanoid.Health - 15 wait(0.2) game.ReplicatedStorage.gun.Value = game.ReplicatedStorage.gun.Value - 1 end mouse.Button1Up:connect(function() auto = false end) end end end)
Your problem is that when mouse.Target
is the skybox, it returns nil
. The simple fix is checking to make sure it isn't nil before carrying out with the code
Check line 9 to see what I've changed
player = game.Players.LocalPlayer character = player.Character gun = character:FindFirstChild("Rifle") mouse = player:GetMouse() auto = false function getModel(raw) for _, child in pairs(workspace:GetChildren()) do --calling pairs is barely any slower than using next directly, plus it's easier to read. if raw ~= nil and raw:IsDescendantOf(child) then return child; end; end; return nil; --this allows us to not use pcall end; mouse.Button1Down:connect(function() wait() auto = true while auto do wait() if mouse.Target then wait() local model = getModel(mouse.Target) if model and model:FindFirstChild("Humanoid") then wait() model.Humanoid.Health = model.Humanoid.Health - 15 wait(0.2) game.ReplicatedStorage.gun.Value = game.ReplicatedStorage.gun.Value - 1 end mouse.Button1Up:connect(function() auto = false end) end end end)
Well, as seen in your question, you're indexing a nil value. The only thing I can think of making game.Players.LocalPlayer:GetMouse().Target
return nil is this script's implementation.
This script should be ran from a LocalScript, since LocalScripts are the only class that can invoke game.Players.LocalPlayer
and have it work correctly throughout servers.
Hope this helps! Comment if you need more assistance or a further explanation!