Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

"attempt to index local 'mouse' (a nil value)". What is wrong?

So I tried to make a gun, and I I want to make it so that the bullet shoots in the direction of your mouse, but it doesn't want to detect the mouse. This is a script located in the StarterPack.

local p = script.Parent.Parent
print(p.Name)
local Uzi = script.Parent["Dual Uzis"]
Uzi.Activated:Connect(function()
local mouse = p:GetMouse()
local bullet1 = Instance.new("Part",workspace)
bullet1.Size = Vector3.new(0.08, 0.05, 1)
bullet1.Material = Enum.Material.Neon
bullet1.Color = Color3.fromRGB(255, 217, 0)
bullet1.Transparency = 0
bullet1.CanCollide = false
bullet1.Name = "Bullet"
Instance.new("BodyVelocity",bullet1)
bullet1.Position = Uzi.Barrel1.Position
bullet1.Orientation =p.Character.HumanoidRootPart.Orientation
bullet1.BodyVelocity.Velocity = mouse.Hit.p.LookVector*300
end)
end

5 comments

0

Is this a local script?

0

no

0

Player:GetMouse returns nil on the server, since the mouse instance is created locally. You can send certain properties of the mouse to the server, preferably via RemoteEvents.

0

How am I supposed to send properties of the mouse to the script if the script sees the mouse as nil

0

You can use a remote event and pass Mouse.Hit or any other such required value directly e.g.: game.ReplicatedStorage.RemoteEvent:FireServer(mouse.Hit)

2 answers

✓ Accepted answer

As @incapaxx said:

Player:GetMouse returns nil on the server, since the mouse instance is created locally. You can send certain properties of the mouse to the server, preferably via RemoteEvents.

The Mouse object is absent on the server, so it cannot index the instance. To access the values from the mouse, you must use RemoteEvents and/or RemoteFunctions and pass the required values while using the remote as such:

Server script in ServerScriptService

local remote = game:GetService("ReplicatedStorage"):WaitForChild("Remote", 10)

remote.OnServerEvent:Connect(function(plr, hit) -- hit is the Mouse.Hit CFrame
	local bullet1 = Instance.new("Part")
	bullet1.Size = Vector3.new(0.08, 0.05, 1)
	bullet1.Material = Enum.Material.Neon
	bullet1.Color = Color3.fromRGB(255, 217, 0)
	bullet1.Transparency = 0
	bullet1.CanCollide = false
	bullet1.Name = "Bullet"
	bullet1.Position = Uzi.Barrel1.Position
	bullet1.Orientation = plr.Character.HumanoidRootPart.Orientation
	bullet.Parent = workspace
	local velocity = Instance.new("BodyVelocity")
	on
	velocity.Velocity = hit.LookVector*300	
end)

Local script in StarterPack:

local plr = game.Players.LocalPlayer
local mouse = plr:GetMouse()
local remote = game:GetService("ReplicatedStorage"):FindFirstChild("Remote")
local Uzi = plr.Backpack:FindFirstChild("Dual Uzis")

Uzi.Activated:Connect(function()
	remote:FireServer(mouse.Hit)
end)
Alternate approach

Another option, one that can be used if multiple tools use the same remote is to change the server script to this:

local remote = game:GetService("ReplicatedStorage"):WaitForChild("Remote", 10)

remote.OnServerEvent:Connect(function(plr, info) -- info can vary for each tool
	if plr.Character:FindFirstChild("Dual Uzis") then
		-- Dual Uzis is equipped
		local bullet1 = Instance.new("Part")
		bullet1.Size = Vector3.new(0.08, 0.05, 1)
		bullet1.Material = Enum.Material.Neon
		bullet1.Color = Color3.fromRGB(255, 217, 0)
		bullet1.Transparency = 0
		bullet1.CanCollide = false
		bullet1.Name = "Bullet"
		bullet1.Position = Uzi.Barrel1.Position
		bullet1.Orientation = plr.Character.HumanoidRootPart.Orientation
		bullet.Parent = workspace
		local velocity = Instance.new("BodyVelocity")
		velocity.Velocity = hit.LookVector*300	
	end
end)

General comments:

  • The syntax of the snippet of code you provide is incorrect since there is an extra end at the last line
  • You shouldn't use Instance.new()s second parameter. An in-depth explanation of the same is on the DevForum.

I posted this answer since it can prove to be useful for anyone who stumbles upon this question in the future. Feel free to ask any questions or point out any mistakes!

You need to divide it into two scripts, one needs to be local and one regular. Put the local script in the place of your current one and put a regular one inside an event which can be let's say in the workspace. You can name the event "UziEvent"

Have this in the local script:

local p = script.Parent.Parent
local event = workspace.UziEvent
print(p.Name)
local Uzi = script.Parent["Dual Uzis"]
Uzi.Activated:Connect(function()
local mouse = p:GetMouse()
event:FireServer(mouse.Hit,Uzi)
end)

And have this in the regular script:

wait()
local event = workspace.UziEvent
event.OnServerEvent:Connect(function(p,mouse.Hit,Uzi)
local bullet1 = Instance.new("Part",workspace)
bullet1.Size = Vector3.new(0.08, 0.05, 1)
bullet1.Material = Enum.Material.Neon
bullet1.Color = Color3.fromRGB(255, 217, 0)
bullet1.Transparency = 0
bullet1.CanCollide = false
bullet1.Name = "Bullet"
Instance.new("BodyVelocity",bullet1)
bullet1.Position = Uzi.Barrel1.Position
bullet1.Orientation =p.Character.HumanoidRootPart.Orientation
bullet1.BodyVelocity.Velocity = mouse.Hit.p.LookVector*300
end)

This should technically work. Let me know if it outputs an error anywhere. Hope this helps.

This discussion is preserved as it was. New answers, comments, and votes are closed.