Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

[Solved] Why does the GUI not appear after the player dies?

Asked by 1 year ago
Edited 1 year ago

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.

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 imKirda 4491 — 1y
0
I recommend trying to use background transparency, btw can u show me ur explorer the script itself looks fine. mono67890 -2 — 1y
0
Worked perfectly! Thanks! Bloxyses 57 — 1y

Answer this question