How to make Reload Button "Gun"

I’ve tried to make a reload button but it always fails. I see a tutorial from YouTube but it doesn’t work. can anyone help me to make Button reload

Plss Help

Code Script here

local localPlayer = game.Players.LocalPlayer
local sp=script.Parent

--// Wait For Children

sp:WaitForChild("Handle")
sp:WaitForChild("Ammo")

sp.Handle:WaitForChild("Equip")
sp.Handle:WaitForChild("Fire")
sp.Handle:WaitForChild("Reload")
sp.Handle:WaitForChild("Trigger")
sp.Handle:WaitForChild("PointLight")

--// Gun Configuration

local CanTeamkill = false
local FirstPersonArms = true
local HeadshotDamage = true
local IgnoreHats = true

local ClipSize=30
local ReloadTime=2.3
local Firerate=.14
local MinSpread=0.15
local MaxSpread=0.15
local SpreadRate=0.3
local BaseDamage= 31
local Spread=0.15
local automatic=true
local burst=false
local shot=false			--Shotgun
local BarrlePos=Vector3.new(-2.5,.60,0)
local Cursors={"rbxasset://textures\\GunCursor.png"}
local ReloadCursor="rbxasset://textures\\GunWaitCursor.png"
-------------------------------------
local equiped=false


local enabled=true
local reloading=false
local down=false
local r=game:service("RunService")

local Bullet=Instance.new("Part")
Bullet.Name="Bullet"
Bullet.BrickColor=BrickColor.new("Bright yellow")
Bullet.Anchored=true
Bullet.CanCollide=false
Bullet.Locked=true
Bullet.Size=Vector3.new(1,1,1)
Bullet.formFactor=0
Bullet.TopSurface=0
Bullet.BottomSurface=0
Bullet.Material = Enum.Material.Neon
local Mesh=Instance.new("SpecialMesh")
Mesh.Parent=Bullet
Mesh.MeshType="Brick"
Mesh.Name="Mesh"
Mesh.Scale=Vector3.new(.15,.15,1)

local pointLight = sp.Handle.PointLight

local Debris = game:GetService("Debris")

local gunServer = game:GetService("ReplicatedStorage"):WaitForChild("GunRemotes")

local remote = {
	TagHumanoid = gunServer:WaitForChild("TagHumanoid"),
	FireServer = gunServer:WaitForChild("FireServer"),
	TakeDamage = gunServer:WaitForChild("TakeDamage"),
	PlaySound = gunServer:WaitForChild("PlaySound"),
}

game.Workspace.ChildAdded:Connect(function(child)
	if child.Name == localPlayer.Name.."Bullet" then
		child.Transparency = 1
	end
end)

local function reload(mouse)
	remote.PlaySound:FireServer(sp.Handle.Reload)
	reloading=true
	mouse.Icon=ReloadCursor
	while sp.Ammo.Value<ClipSize and reloading and enabled do
		wait(ReloadTime/ClipSize)
		if reloading then
			sp.Ammo.Value=sp.Ammo.Value+1
		else
			break
		end
	end
	mouse.Icon=Cursors[1]
	reloading=false
end

local function reload_Mob()
	remote.PlaySound:FireServer(sp.Handle.Reload)
	reloading=true
	while sp.Ammo.Value<ClipSize and reloading and enabled do
		wait(ReloadTime/ClipSize)
		if reloading then
			sp.Ammo.Value=sp.Ammo.Value+1
		else
			break
		end
	end
	reloading=false
end

local function onKeyDown(key,mouse)
	key=key:lower()
	if key=="r" and not reloading then
		reload(mouse)
	end
end

function onButtonPress()
	--wait(0.1)	
	--if onButtonPress() and not reloading then
	if script.Parent.Ammo.Value < 30 then
		wait(0.1)
		reload_Mob()
	end
		--script.Parent:reload(button)
	--end
end	

local function rs()
	print("jadi")
	function onButtonPress()
		--wait(0.1)	
		--if onButtonPress() and not reloading then
		if script.Parent.Ammo.Value < 30 then
			wait(0.1)
			reload_Mob()
		end
		--script.Parent:reload(button)
		--end
	end	
end

-- function to handle when the player presses the left mouse button
local function OnInput(actionName, inputState, inputObject)
	if inputState == Enum.UserInputState.Begin then
		rs()
	end
end

local function getIgnoreList()
	local list = {localPlayer.Character}
	for _,child in pairs(game.Workspace:GetDescendants()) do
		if child:IsA("BasePart") then
			if not child.CanCollide then
				if child.Name == "Handle" and IgnoreHats then
					table.insert(list,child)
				elseif child.Name ~= "Handle" and not child.Parent:FindFirstChild("Humanoid") then
					table.insert(list,child)
				end
			end
		end
	end
	return list
end

local function bulletEffect(bullet,distance)
	if distance > 40 then
		local bulletLength = distance/2
		bullet.Mesh.Scale=Vector3.new(.15,.15,bulletLength)
		bullet.Mesh.Offset=Vector3.new(0,0,bulletLength/2)
		while bullet.Mesh.Offset.Z > (bulletLength/2)*-1 do
			wait()
			bullet.Mesh.Offset=Vector3.new(0,0,bullet.Mesh.Offset.Z-20) 
		end
	else
		bullet.Mesh.Scale=Vector3.new(.15,.15,distance)
		bullet.Mesh.Offset=Vector3.new(0,0,distance/2)
		wait(0.03)
	end
	bullet:Destroy()
end

local function fire(aim)
	if sp.Parent.Humanoid.Health < 1 then
		return
	end
	remote.PlaySound:FireServer(sp.Handle.Fire)
	
	t=r.Stepped:wait()
	last6=last5
	last5=last4
	last4=last3
	last3=last2
	last2=last
	last=t
	local bullet=Bullet:clone()
	local startpoint=sp.Handle.CFrame*BarrlePos
	local ray = Ray.new(startpoint, (aim - startpoint).unit * 300)
	local hit, position = workspace:FindPartOnRayWithIgnoreList(ray, getIgnoreList(), false, true)
	local distance = (startpoint - position).magnitude
	bullet.Parent=game.Workspace.CurrentCamera
	
	remote.FireServer:FireServer(startpoint,position,pointLight)
	
	if hit~=nil then
		local humanoid=hit.Parent:FindFirstChild("Humanoid")
		if not humanoid then
			humanoid = hit.Parent.Parent:FindFirstChild("Humanoid")
		end
		if humanoid~=nil then
			local damage=math.random(BaseDamage-(BaseDamage*.25),BaseDamage+(BaseDamage*.25))
			local headshot = false
			if hit.Name=="Head" and HeadshotDamage then
				damage=damage*1.3
				--headshot = true
			else
				damage=damage*.75
			end
			if humanoid.Health>0 then
				local eplr=game.Players:playerFromCharacter(humanoid.Parent)
				local plr=game.Players:playerFromCharacter(sp.Parent)
				if eplr~=nil and plr~=nil then
					if CanTeamkill then
						remote.TagHumanoid:FireServer(humanoid)
						remote.TakeDamage:FireServer(humanoid,damage,headshot)
					else
						if eplr.TeamColor~=plr.TeamColor or eplr.Neutral or plr.Neutral then
							remote.TagHumanoid:FireServer(humanoid)
							remote.TakeDamage:FireServer(humanoid,damage,headshot)
						end	
					end
				else
					remote.TagHumanoid:FireServer(humanoid)
					remote.TakeDamage:FireServer(humanoid,damage,headshot)
				end
			end
		end
	end
	if distance > 40 then
		bullet.CFrame=CFrame.new(startpoint, position) * CFrame.new(0, 0, -distance / 2)
	else
		bullet.CFrame=CFrame.new(startpoint, position) * CFrame.new(0, 0, -distance)
	end
	spawn(function()
		bulletEffect(bullet,distance)
	end)
end


local ObjectLocalTransparencyModifier
local RunService = game:GetService("RunService")
local LocalObjects = {}
local function setArmsTransparency(Limb)
	if FirstPersonArms then
		local value = {Object = Limb, Transparency = 0, AutoUpdate = true}	
		pcall(function()
			local ObjectFound = false
			for i, v in pairs(LocalObjects) do
				if v == value then
					ObjectFound = true
				end
			end
			if not ObjectFound then
				table.insert(LocalObjects, value)
				if ObjectLocalTransparencyModifier then
					ObjectLocalTransparencyModifier:disconnect()
				end
				ObjectLocalTransparencyModifier = RunService.RenderStepped:connect(function()
					local Camera = game:GetService("Workspace").CurrentCamera
					for i, v in pairs(LocalObjects) do
						if v.Object and v.Object.Parent then
							local CurrentTransparency = v.Object.LocalTransparencyModifier
							local ViewDistance = (Camera.CoordinateFrame.p - sp.Parent.Head.Position).Magnitude
							if ((not v.AutoUpdate and (CurrentTransparency == 1 or CurrentTransparency == 0)) or v.AutoUpdate) then
								if ((v.Distance and ViewDistance <= v.Distance) or not v.Distance) then
									v.Object.LocalTransparencyModifier = v.Transparency
								else
									v.Object.LocalTransparencyModifier = 0
								end
							end
						else
							table.remove(LocalObjects, i)
						end
					end
				end)
			end
		end)
	end
end

local function onButton1Up(mouse)
	down=false
end

local  function onButton1Down(mouse)
	local h=sp.Parent:FindFirstChild("Humanoid")
	if not enabled or reloading or down or h==nil then
		return
	end
	if sp.Ammo.Value>0 and h.Health>0 then
		down=true
		enabled=false
		while down do
			if sp.Ammo.Value<=0 then
				break
			end
			if burst then
				local startpoint=sp.Handle.CFrame*BarrlePos
				local mag=(mouse.Hit.p-startpoint).magnitude
				local rndm=Vector3.new(math.random(-(Spread/10)*mag,(Spread/10)*mag),math.random(-(Spread/10)*mag,(Spread/10)*mag),math.random(-(Spread/10)*mag,(Spread/10)*mag))
				fire(mouse.Hit.p+rndm)
				sp.Ammo.Value=sp.Ammo.Value-1
				if sp.Ammo.Value<=0 then
					break
				end
				wait(.05)
				local startpoint=sp.Handle.CFrame*BarrlePos
				local mag2=((mouse.Hit.p+rndm)-startpoint).magnitude
				local rndm2=Vector3.new(math.random(-(.1/10)*mag2,(.1/10)*mag2),math.random(-(.1/10)*mag2,(.1/10)*mag2),math.random(-(.1/10)*mag2,(.1/10)*mag2))
				fire(mouse.Hit.p+rndm+rndm2)
				sp.Ammo.Value=sp.Ammo.Value-1
				if sp.Ammo.Value<=0 then
					break
				end
				wait(.05)
				fire(mouse.Hit.p+rndm+rndm2+rndm2)
				sp.Ammo.Value=sp.Ammo.Value-1
			elseif shot then
				sp.Ammo.Value=sp.Ammo.Value-1
				local startpoint=sp.Handle.CFrame*BarrlePos
				local mag=(mouse.Hit.p-startpoint).magnitude
				local rndm=Vector3.new(math.random(-(Spread/10)*mag,(Spread/10)*mag),math.random(-(Spread/10)*mag,(Spread/10)*mag),math.random(-(Spread/10)*mag,(Spread/10)*mag))
				fire(mouse.Hit.p+rndm)
				local mag2=((mouse.Hit.p+rndm)-startpoint).magnitude
				local rndm2=Vector3.new(math.random(-(.2/10)*mag2,(.2/10)*mag2),math.random(-(.2/10)*mag2,(.2/10)*mag2),math.random(-(.2/10)*mag2,(.2/10)*mag2))
				fire(mouse.Hit.p+rndm+rndm2)
				local rndm3=Vector3.new(math.random(-(.2/10)*mag2,(.2/10)*mag2),math.random(-(.2/10)*mag2,(.2/10)*mag2),math.random(-(.2/10)*mag2,(.2/10)*mag2))
				fire(mouse.Hit.p+rndm+rndm3)
				local rndm4=Vector3.new(math.random(-(.2/10)*mag2,(.2/10)*mag2),math.random(-(.2/10)*mag2,(.2/10)*mag2),math.random(-(.2/10)*mag2,(.2/10)*mag2))
				fire(mouse.Hit.p+rndm+rndm4)
			else
				sp.Ammo.Value=sp.Ammo.Value-1
				local startpoint=sp.Handle.CFrame*BarrlePos
				local mag=(mouse.Hit.p-startpoint).magnitude
				local rndm=Vector3.new(math.random(-(Spread/10)*mag,(Spread/10)*mag),math.random(-(Spread/10)*mag,(Spread/10)*mag),math.random(-(Spread/10)*mag,(Spread/10)*mag))
				fire(mouse.Hit.p+rndm)
			end
			wait(Firerate)
			if not automatic then
				break
			end
		end	
		enabled=true
	else
		remote.PlaySound:FireServer(sp.Handle.Trigger)
	end
end

local function onEquippedLocal(mouse)
	remote.PlaySound:FireServer(sp.Handle.Equip)
	if mouse==nil then
		print("Mouse not found")
		return 
	end
	local Limbs = {"Right Arm", "RightHand", "RightUpperArm", "RightLowerArm",
		"Left Arm", "LeftHand", "LeftUpperArm", "LeftLowerArm"}
	for i, v in pairs(Limbs) do
		local Limb = sp.Parent:FindFirstChild(v)
		setArmsTransparency(Limb)
	end
	mouse.Icon=Cursors[1]
	mouse.KeyDown:connect(function(key) onKeyDown(key,mouse) end)
	mouse.Button1Down:connect(function() onButton1Down(mouse) end)
	mouse.Button1Up:connect(function() onButton1Up(mouse) end)
	
	equiped=true
	if #Cursors>1 then
		while equiped do
			t=r.Stepped:wait()
			local action=sp.Parent:FindFirstChild("Pose")
			if action~=nil then
				if sp.Parent.Pose.Value=="Standing" then
					Spread=MinSpread
				else
					Spread=MinSpread+((4/10)*(MaxSpread-MinSpread))
				end
			else
				Spread=MinSpread
			end
			if t-last<SpreadRate then
				Spread=Spread+.1*(MaxSpread-MinSpread)
			end
			if t-last2<SpreadRate then
				Spread=Spread+.1*(MaxSpread-MinSpread)
			end
			if t-last3<SpreadRate then
				Spread=Spread+.1*(MaxSpread-MinSpread)
			end
			if t-last4<SpreadRate then
				Spread=Spread+.1*(MaxSpread-MinSpread)
			end
			if t-last5<SpreadRate then
				Spread=Spread+.1*(MaxSpread-MinSpread)
			end
			if t-last6<SpreadRate then
				Spread=Spread+.1*(MaxSpread-MinSpread)
			end
			if not reloading then
				local percent=(Spread-MinSpread)/(MaxSpread-MinSpread)
				for i=0,#Cursors-1 do
					if percent>(i/(#Cursors-1))-((1/(#Cursors-1))/2) and percent<(i/(#Cursors-1))+((1/(#Cursors-1))/2) then
						mouse.Icon=Cursors[i+1]
					end
				end
			end
			wait(Firerate*.9)
		end
	end
end
local function onUnequippedLocal(mouse)
	if ObjectLocalTransparencyModifier then
		ObjectLocalTransparencyModifier:disconnect()
	end
	local camera = game.Workspace.CurrentCamera
	if (camera.focus.p - camera.CoordinateFrame.p).magnitude <= 1 then
		for i, v in pairs(LocalObjects) do
			if v.Object then
				v.Object.LocalTransparencyModifier = 1
			end
		end
	end
	LocalObjects = {}
	
	equiped=false
	reloading=false
end
sp.Equipped:connect(onEquippedLocal)
sp.Unequipped:connect(onUnequippedLocal)

sample photos
image

image

2 Likes

no one else but you i can only ask for your help @DeriNurmawan1 plz

idk whether this works or not

local ContextActionService = game:GetService("ContextActionService")
local Active = false
local Gui = nil

local function onEquippedLocal(mouse) --- Kode Nomor 619
Gui = script.ScreenGui:Clone()
	Gui.Parent = game.Players.LocalPlayer.PlayerGui
	Gui.TextButton.MouseButton1Click:Connect(function()
		Tekts()
		ContextActionService:BindAction("Rs", onButtonPress, true,"R")
	end)
end)

local function onUnequippedLocal(mouse) --- kode nomor 681
	Active = false
	if game.Players.LocalPlayer.PlayerGui:FindFirstChild("ScreenGui") then
		game.Players.LocalPlayer.PlayerGui.ScreenGui:remove()
	end
end)
1 Like

Thank you this is working, can I ask you to befriend me any time I need your help so I can contact you

yeahh can I will always help you if you are in trouble, you can ask me anything

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.