Issue: I have a gun system I made. When I equip a gun, it works perfectly, and I can see the GUIs. When I unequip a gun, I can't see the GUIs, which is functioning as intended. However, when I die and equip the gun again, the GUIs no longer appear. I want the GUIs the appear again when the player equips a gun, even when the player dies.

Script:

WeaponScript (ModuleScript):

local gunScripts = {}

gunScripts.PistolScript = function(GunName)
	local replicatedStorage = game:GetService("ReplicatedStorage")
	local runService = game:GetService("RunService")
	local player = game.Players.LocalPlayer
	local playerGui = player:WaitForChild("PlayerGui")
	local gun = player:WaitForChild("Backpack"):WaitForChild(GunName) or player.Character:WaitForChild(GunName) or workspace:WaitForChild("Baseplate"):WaitForChild(GunName) or replicatedStorage:FindFirstChild(GunName, true)
	local mouse = player:GetMouse()
	local rs = game:GetService("ReplicatedStorage")
	local weaponInfo = require(rs.Modules.WeaponInfo)
	local gunIndex = weaponInfo:GetWeaponByName(GunName)
	local ammoAmount = gunIndex.Ammo
	local firing = false
	local reloading = false
	local isUnequipped = false
	local isReloadingStopped = false
	local UIS = game:GetService("UserInputService")
	local firerate = gunIndex.Firerate
	local ammoGui = playerGui:WaitForChild("AmmoGUI")
	local ammoText = ammoGui.Background.AmmoText
	local gunLabel = ammoGui.GunLabel
	local ReloadGui = playerGui:WaitForChild("ReloadGui")
	local debounce = false
	local mobileReloadGui = playerGui:WaitForChild("MobileReloadGui")
	local mobileReloadButton = mobileReloadGui:WaitForChild("ReloadButton")
	local GunAnimations = rs.GunAnimations
	local reloadText = ReloadGui.ReloadText
	local globalChar = player.Character or player.CharacterAdded:Wait()
	local globalHum = globalChar:FindFirstChild("Humanoid")
	local globalAnimator = globalHum:FindFirstChild("Animator")
	
	function gunScripts.loadAnimation(animator, humanoid, animation)
		if not animator then
			animator = Instance.new("Animator")
			animator.Parent = humanoid
		end

		local animTrack = animator:LoadAnimation(animation)
		return animTrack
	end

	--When the gun is equipped then,
	gun.Equipped:Connect(function()
		--Variables
		local re = rs:WaitForChild("Events"):WaitForChild("ShootEvent")
		local char = player.Character or player.CharacterAdded:Wait()
		local hum = char:FindFirstChild("Humanoid")
		local animator = hum:FindFirstChild("Animator")
		
		globalChar = char
		globalHum = hum
		globalAnimator = animator
		
		--The display text for the gunGUI displays the gun's name.
		gunLabel.Text = gun.Name
		--Allows the player to see the ammoGUI
		ammoGui.Enabled = true
		
		isUnequipped = false
		--The equip animation.
		local equipAnim = GunAnimations:WaitForChild("PistolEquip")

		local equipAnimTrack = gunScripts.loadAnimation(animator, hum, equipAnim)
		equipAnimTrack.Looped = false
		equipAnimTrack:Play()
		gun:SetAttribute("PlayedEquipAnimation", false)

		equipAnimTrack.Ended:Connect(function()
			gun:SetAttribute("PlayedEquipAnimation", true)
		end)

		local holdAnim = GunAnimations:WaitForChild("PistolHold")

		local holdAnimTrack = gunScripts.loadAnimation(animator, hum, holdAnim)
		holdAnimTrack.Priority = Enum.AnimationPriority.Action
		holdAnimTrack.Looped = true
		holdAnimTrack:Play()
		--When the gun is unequipped,
		gun.Unequipped:Connect(function()
			firing = false
			gun:SetAttribute("PlayedEquipAnimation", false)
			--disable the ammoGUI
			ammoGui.Enabled = false
			--disable the reloadGUI
			ReloadGui.Enabled = false
			--If the animation is still playing after the gun is unequipped,
			if equipAnimTrack.IsPlaying then
				--Stop the track
				equipAnimTrack:Stop()
				--Restart the time position.
				equipAnimTrack.TimePosition = 0
			end

			holdAnimTrack:Stop()
			holdAnimTrack.TimePosition = 0
			--Set playedequipanimation to false
			gun:SetAttribute("PlayedEquipAnimation",false)
		end)

		--When activated, it will fire remote event.
		function gunScripts.onActivated()
			--If the equip animation is done and if the player has more than 0 ammo then...
			if gun:GetAttribute("PlayedEquipAnimation") and ammoAmount > 0 and not reloading then
				--The shooting animation for the gun.
				local shootAnim = GunAnimations.PistolShoot
				--If the character's humanoid does not have a humanoid to load animations in then: 
				local shootTrack = gunScripts.loadAnimation(animator, hum, shootAnim)
				shootTrack:Play()

				--Sets the target of the player's gun to the mouse's target.
				local params = RaycastParams.new()

				params.FilterDescendantsInstances = {
					gun,
					player.Character
				}
				params.FilterType = Enum.RaycastFilterType.Exclude
				params.IgnoreWater = true

				local mouseRay = game.Workspace.Camera:ScreenPointToRay(mouse.X, mouse.Y)
				local origin = mouseRay.Origin
				local direction = mouseRay.Direction * 500

				local result = workspace:Raycast(origin, direction, params)
				local target = nil

				if result and result.Instance then
					target = result.Instance
				end
				--Fires a remote event to damage the enemy.
				re:FireServer(target, result)
				ammoAmount -= 1
				--If the ammo amount is 0, however, then the reloadGUI displays.
			end
		end
	end)
	
	--If the gun is activated, connect to a function
	mouse.Button1Down:Connect(function()
		if not firing and gun:GetAttribute("PlayedEquipAnimation") and UIS.KeyboardEnabled and not reloading and ammoAmount > 0 then
			firing = true
			while firing == true do
				gunScripts.onActivated()
				wait(firerate)
			end
		end
	end)

	gun.Deactivated:Connect(function()
		if UIS.KeyboardEnabled then
			firing = false
		end
	end)

	UIS.InputBegan:Connect(function(input, GPE)
		if not GPE then
			if input.UserInputType == Enum.UserInputType.Touch and not UIS.KeyboardEnabled then
				if not firing and gun:GetAttribute("PlayedEquipAnimation") and not reloading then
					firing = true
					while firing == true do
						gunScripts.onActivated()
						wait(firerate)
					end
				end
			end
		end
	end)

	UIS.InputEnded:Connect(function(input, GPE)
		if not GPE then
			if input.UserInputType == Enum.UserInputType.Touch and not UIS.KeyboardEnabled then
				firing = false
			end
		end
	end)
	

	local reloadDebounce = false
	UIS.InputBegan:Connect(function(input, GPE)
		if not GPE then
			if input.KeyCode == Enum.KeyCode.R and ammoAmount < gunIndex.Ammo and gun:GetAttribute("PlayedEquipAnimation") and UIS.KeyboardEnabled and reloadDebounce == false and reloading == false then
				reloadDebounce = true
				reloading = true

				local reloadAnim = GunAnimations:WaitForChild("PistolReload")

				local reloadTrack = gunScripts.loadAnimation(globalAnimator, globalHum, reloadAnim)
				reloadTrack:Play()
				local reloadSound = gun:WaitForChild("ReloadSound")
				reloadSound:Play()

				gun.Unequipped:Connect(function()
					isUnequipped = true
					reloading = false
					ReloadGui.Enabled = false
					if reloadTrack.IsPlaying then
						for i,v in pairs (globalAnimator:GetPlayingAnimationTracks()) do
							if v.Name == "PistolReload" or v.Name == "PistolHold" or v.Name == "PistolEquip" or v.Name == "Shoot" then
								v:Stop()
								isReloadingStopped = true
							end
						end
						reloadSound:Stop()
						reloadDebounce = false
					end
				end)

				if isUnequipped then return end
				reloadTrack.Ended:Connect(function()
					if not isUnequipped then
						reloading = false
						reloadDebounce = false
						ammoAmount = gunIndex.Ammo
						ReloadGui.Enabled = false
					end
				end)
			end
		end
	end)
	
	if not UIS.KeyboardEnabled then
		gun.Equipped:Connect(function()
			if ammoAmount < gunIndex.Ammo then
				mobileReloadGui.Enabled = true
			end
		end)

		gun.Unequipped:Connect(function()
			mobileReloadGui.Enabled = false
		end)

		mobileReloadButton.MouseButton1Down:Connect(function()
			if reloadDebounce == false then
				reloadDebounce = true
				local reloadAnim = GunAnimations:WaitForChild("PistolReload")

				local reloadTrack = gunScripts.loadAnimation(globalAnimator,globalHum, reloadAnim)
				reloadTrack:Play()
				local reloadSound = gun:WaitForChild("ReloadSound")
				reloadSound:Play()

				reloading = true

				gun.Unequipped:Connect(function()
					isUnequipped = true
					if reloadTrack.IsPlaying then
						for i,v in pairs (globalAnimator:GetPlayingAnimationTracks()) do
							if v.Name == "PistolReload" then
								v:Stop()
							end
						end
						reloadSound:Stop()
						reloading = false
						reloadDebounce = false
					end
				end)

				if isUnequipped then return end

				reloadTrack.Ended:Connect(function()
					if not isUnequipped then
						reloading = false
						ammoAmount = gunIndex.Ammo
						ReloadGui.Enabled = false
						reloadDebounce = false
						ammoText.Text = "Ammo: "..ammoAmount.."/"..gunIndex.Ammo
					end
				end)
			end
		end)	
	end
	runService.Heartbeat:Connect(function()
		if ammoAmount == 0 and not isUnequipped then
			ReloadGui.Enabled = true
		end
		
		if not UIS.KeyboardEnabled then
			if not isUnequipped and ammoAmount < gunIndex.Ammo then
				mobileReloadGui.Enabled = true
			elseif isUnequipped and ammoAmount < gunIndex.Ammo then
				mobileReloadGui.Enabled = false
			end
			
			if ammoAmount == gunIndex.Ammo then
				mobileReloadGui.Enabled = false
			end
		end

		ammoText.Text = "Ammo: "..ammoAmount.."/"..gunIndex.Ammo
	end)
end

return gunScripts

Conclusion: Sorry if my code is a bit messy, hope people can see it. I removed the other scripts for the sake of relevance and length. I also had to remove a "Context" part of the post, apparently because it exceeded 10,000 characters, even if the character amount was clearly below that amount. As always, thank you for taking the time to read this.

3 comments

0

no way i will read the code but try setting ResetOnSpawn of the ReloadGui to false (in studio), that will fix the issue probably but may create some new issues i haven't read the code can't tell UwU

0

I recommend trying to use background transparency, btw can u show me ur explorer the script itself looks fine.

0

Worked perfectly! Thanks!