How To Make a Gun on Roblox 

Gun Tutorial code download

Download the full script for this gun tutorial below.

Here’s what your game should look like:

ROBLOX Studio - how to make a gun


Side notes

–Make sure that your game is set up like mine, with all objects added in – Make sure FilteringEnabled is turned on – Make sure that you make your own animations and set your animation IDs to your IDs as you cannot currently take someone else’s animations!

–Main Script which goes in Server Storage.

local serverStorage = game:GetService(“ServerStorage”)
local replicatedStorage = game:GetService(“ReplicatedStorage”)
local KOValue = “Kills”
local WOValue = “Wipeouts”
local damage = 30
replicatedStorage.ShootEvent.OnServerEvent:Connect(function(player,tool,position,part)
if game.Workspace[player.Name].Humanoid.Health <= 0 then
— The player is dead, do not do anything
else
local distance = (tool.Handle.CFrame.p – position).magnitude
if game.Workspace:FindFirstChild(player.Name..“‘s Trajectory”) then
game.Workspace:FindFirstChild(player.Name..“‘s Trajectory”):Destroy()
end
local trajectory = Instance.new(“Part”,game.Workspace)
local smoke = serverStorage.SmokeParticle:Clone()
smoke.Parent = tool.Handle
trajectory.BrickColor = BrickColor.new(“Institutional white”)
trajectory.Material = “SmoothPlastic”
trajectory.Name = player.Name..“‘s Trajectory”
trajectory.Transparency = 0.5
trajectory.Anchored = true
trajectory.Locked = true
trajectory.CanCollide = false
trajectory.Size = Vector3.new(0.3,0.3,distance)
for i = 0,distance,6 do
trajectory.CFrame = CFrame.new(tool.Handle.CFrame.p,position) * CFrame.new(0,0,-distance / 2)
wait(0.0001)
end
smoke:Destroy()
if part then
if part.Name == “Head” or part:IsA(“Hat”) and part.Parent:FindFirstChild(“Humanoid”).Health > 0 then
— Boom headshot
replicatedStorage.Headshot:FireClient(player)
damage = 50
end
local humanoid = part.Parent:FindFirstChild(“Humanoid”)
if not humanoid then
humanoid = part.Parent.Parent:FindFirstChild(“Humanoid”)
else
humanoid:TakeDamage(damage)
if humanoid.Health <= 0 then
player.leaderstats[KOValue].Value = player.leaderstats[KOValue].Value + 1
game.Players[humanoid.Parent.Name].leaderstats[WOValue].Value = game.Players[humanoid.Parent.Name].leaderstats[WOValue].Value + 1
end
end
wait(0.25)
if trajectory then
trajectory:Destroy()
end
end
end
end)

replicatedStorage.EquipAnimation.OnServerEvent:Connect(function(player,animation)
local newAnim = game.Workspace[player.Name].Humanoid:LoadAnimation(animation)
newAnim:Play()
replicatedStorage.UnequipAnimation.OnServerEvent:Connect(function(player,animation)
newAnim:Stop()
for i,v in pairs(game.Workspace:GetChildren()) do
if v.Name == player.Name..“‘s Trajectory” then
v:Destroy()
end
end
end)
replicatedStorage.Reload.OnServerEvent:Connect(function(player,animation)
newAnim:Stop()
local reloadAnim = game.Workspace[player.Name].Humanoid:LoadAnimation(animation)
reloadAnim:Play()
end)
end)

function checkBodyType(player,tool)
if game.Workspace[player.Name]:FindFirstChild(“LowerTorso”) then — R15
tool.shoot.AnimationId = “rbxassetid://936531673”
tool.reload.AnimationId = “rbxassetid://937806099”
return “R15”
end
if game.Workspace[player.Name]:FindFirstChild(“Torso”) then — R6
tool.shoot.AnimationId = “rbxassetid://1000874313”
tool.reload.AnimationId = “rbxassetid://937933712”
return “R6”
end
end
replicatedStorage.CheckBodyType.OnServerInvoke = checkBodyType

— Local Script, which goes inside the tool

local tool = script.Parent — Getting the tool
local player = game:GetService(“Players”).LocalPlayer — Getting the player
local mouse = player:GetMouse() — Getting the mouse
local sound = tool:WaitForChild(“Gunfire”)
local torso = “” — Nothing for now.
local reloading = false — Variable to check if we are currently reloading
local contextActionService = game:GetService(“ContextActionService”) — Allow us to cater for Mobile players
local bodytype = nil — Nil for now but will check whether player is R6 or R15
local difference = 0 — Difference between position of head and mouse
local replicatedstorage = game:GetService(“ReplicatedStorage”)
local gungui = tool:WaitForChild(“GunGUI”)
local bullets = tool:WaitForChild(“Bullets”)
local reloadtime = 3
— Remote Events
local equipAnimation = replicatedstorage:WaitForChild(“EquipAnimation”)
local headshot = replicatedstorage:WaitForChild(“Headshot”)
local reload2 = replicatedstorage:WaitForChild(“Reload”)
local shootevent = replicatedstorage:WaitForChild(“ShootEvent”)
local unequipanimation = replicatedstorage:WaitForChild(“UnequipAnimation”)
— Remote Functions
local checkBodyType = replicatedstorage:WaitForChild(“CheckBodyType”)
local fetchBulletsLeft = replicatedstorage:WaitForChild(“FetchBulletsLeft”)
— Find Body Type
function findBodyType() — Used to determine whether a player is R6 or R15
bodytype = checkBodyType:InvokeServer(tool) — Invoking the Remotefunction to do a check on the server
print(bodytype)
end
— Reloading function
function reload()
reloading = true
reload2:FireServer(tool.reload)
mouse.Icon = “http://www.roblox.com/asset?id=936489163”
player.PlayerGui:WaitForChild(“GunGUI”).Bullets.Text = “Reloading!”
wait(reloadtime)
bullets.Value = 6
player.PlayerGui:WaitForChild(“GunGUI”).Bullets.Text = “Bullets: “..bullets.Value
mouse.Icon = “http://www.roblox.com/asset?id=936803874”
equipAnimation:FireServer(tool.shoot)
reloading = false
end
— When the tool is equipped, the following event will run
tool.Equipped:Connect(function(mouse)
gungui:Clone().Parent = player.PlayerGui — We are cloning the Gun GUI into the player’s PlayerGUI
findBodyType() — Calling the function above to check the body type.
equipAnimation:FireServer(tool.shoot) — Calling the equip animation remoteevent so that the server can play the animation
mouse.Icon = “http://www.roblox.com/asset?id=936803874”
mouse.Button1Down:Connect(function()
if bullets.Value <=0 or reloading == true then
— Don’t do anything
else
local head = game.Workspace[player.Name].Head.CFrame.lookVector
local mouse = CFrame.new(game.Workspace[player.Name].Head.Position,mouse.Hit.p).lookVector
difference = (headmouse)
local ray = Ray.new(tool.Handle.CFrame.p,(player:GetMouse().Hit.p tool.Handle.CFrame.p).unit*300)
local part,position = game.Workspace:FindPartOnRay(ray,player.Character,false,true)
sound:Play()
if difference.magnitude < 1.33 then
shootevent:FireServer(tool,position,part)
bullets.Value = bullets.Value 1
end
end
end)
local reloadMobileButton = contextActionService:BindAction(“ReloadBtn”,reload,true,“r”)
contextActionService:SetPosition(“ReloadBtn”,UDim2.new(0.72,25,0.20,25))
contextActionService:SetImage(“ReloadBtn”,“http://www.roblox.com/asset/?id=10952419”)
end)
tool.Unequipped:Connect(function()
mouse.Icon = “”
unequipanimation:FireServer(tool.shoot)
player.PlayerGui.GunGUI:Destroy()
contextActionService:UnbindAction(“ReloadBtn”)
end)
headshot.OnClientEvent:Connect(function()
player.PlayerGui.GunGUI.Headshot:TweenPosition(UDim2.new(0.5,100,0.5,25), “Out”,“Quint”,0.3)
wait(1.5)
player.PlayerGui.GunGUI.Headshot:TweenPosition(UDim2.new(1,0,0.5,25), “In”,“Quint”,0.4)
wait(0.5)
player.PlayerGui.GunGUI.Headshot.Position = UDim2.new(1.5,0,0.5,25)
end)

 

— Leaderboard code which goes inside ServerScriptService, optional to include, you can add your own if you want but bear in mind the gun won’t work unless you have some sort of leaderboard with a Kills and Wipeouts stat

game.Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new(“IntValue”,player)
leaderstats.Name = “leaderstats”

local kills = Instance.new(“IntValue”,leaderstats)
kills.Name = “Kills”
kills.Value = 0

local wipeouts = Instance.new(“IntValue”,leaderstats)
wipeouts.Name = “Wipeouts”
wipeouts.Value = 0

— Data saving code goes here if you need it
end)

This was a lengthy tutorial from me, my longest yet! If you want to watch more tutorials on how to script on Roblox, remember to subscribe to my channel.

 

Become a Channel Member and benefit from a range of perks!