There are a couple of things wrong with my gun. First, it does not reload when it reaches 0 ammunition. Second, it doesn't damage anything with a humanoid. Here are the scripts:
Client-Side:
--Global Variables
local shotgun = script.Parent.Parent
local player = game.Players.LocalPlayer
local mouse = player:GetMouse()
local flare = shotgun:WaitForChild("Flare")
local handle = shotgun:WaitForChild("Handle")
local ContextActionService = game:GetService("ContextActionService")
local mouseDown = false
local equipped = false
--Folders
local animations = shotgun:WaitForChild("Animations")
local configurations = shotgun:WaitForChild("Configurations")
local remoteEvents = shotgun:WaitForChild("RemoteEvents")
--Animations
local reload = animations:WaitForChild("ReloadGun")
local fire = animations:WaitForChild("FireGun")
local hold = animations:WaitForChild("HoldGun")
--Animation Tracks
local reloadTrack
local fireTrack
local holdTrack
--Configurations
local range = configurations:WaitForChild("FireRange")
local allowTracing = configurations:WaitForChild("AllowTracing")
local ammo = configurations:WaitForChild("Ammo")
--Remote Events
local OnFire = remoteEvents:WaitForChild("OnFire")
local OnHit = remoteEvents:WaitForChild("OnHit")
local OnReload = remoteEvents:WaitForChild("OnReload")
--Remote functions
local AbleToReload = remoteEvents:WaitForChild("AbleToReload")
local AbleToShoot = remoteEvents:WaitForChild("AbleToShoot")
--Other Stuff
local sparkGui = shotgun.Flare:WaitForChild("SparkGui")
--Now we get to the other part of this. The functions.
local function equipGun()
equipped = true
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
if humanoid then
pcall(function()
holdTrack = humanoid:LoadAnimation(hold)
holdTrack:Play()
end)
pcall(function()
reloadTrack = humanoid:LoadAnimation(reload)
end)
pcall(function()
fireTrack = humanoid:LoadAnimation(fire)
end)
end
end
local function unequipGun()
equipped = false
if holdTrack then
holdTrack:Stop()
elseif reloadTrack then
reloadTrack:Stop()
elseif fireTrack then
fireTrack:Stop()
end
end
local function reloadGun()
if AbleToReload:InvokeServer() then
OnReload:FireServer()
if reloadTrack then
reloadTrack:Play()
end
end
end
local function fireGun()
if AbleToShoot:InvokeServer() then
if fireTrack then
fireTrack:Play()
end
end
if ammo.Value > 0 then
sparkGui.Enabled = true
local ray = Ray.new(flare.CFrame.p, (mouse.hit.p - flare.CFrame.p).unit * range.Value)
local touch, position = workspace:FindPartOnRay(ray, player.Character)
if touch then
OnHit:FireServer(touch)
end
OnFire:FireServer()
if allowTracing.Value then
local bullet = Instance.new("Part")
bullet.Anchored = bullet
bullet.CanCollide = false
bullet.Transparency = 0.8
bullet.BrickColor = BrickColor.White()
bullet.Material = Enum.Material.SmoothPlastic
local distance = (flare.CFrame.p - position).magnitude
bullet.Size = Vector3.new(0, 0, distance)
bullet.CFrame = CFrame.new(flare.CFrame.p, position) * CFrame.new(0, 0, -distance/2)
bullet.Parent = workspace
game:GetService("Debris"):AddItem(bullet, 0.1)
wait(0.1)
sparkGui.Enabled = false
end
end
end
shotgun.Equipped:Connect(function()
equipGun()
mouse.Button1Up:Connect(function()
mouseDown = false
end)
shotgun.Activated:Connect(function()
mouseDown = true
fireGun()
end)
ContextActionService:BindAction("Reload", reloadGun, false, Enum.KeyCode.R)
end)
shotgun.Unequipped:Connect(unequipGun)
Server-Side:
--Global Variables
local player
local shotgun = script.Parent.Parent
local handle = shotgun:WaitForChild("Handle")
local equipped = false
local reloading = false
local couldShoot = true
--Folders
local configurations = shotgun:WaitForChild("Configurations")
local remoteEvents = shotgun:WaitForChild("RemoteEvents")
--Configurations
local ammo = configurations:WaitForChild("Ammo")
local magSize = configurations:WaitForChild("MagSize")
local fireRate = configurations:WaitForChild("FireRate")
local damage = configurations:WaitForChild("Damage")
local headShotMultiplier = configurations:WaitForChild("HeadShotMultiplier")
local range = configurations:WaitForChild("FireRange")
local reloadTime = configurations:WaitForChild("ReloadTime")
--Remote Events
local onFire = remoteEvents:WaitForChild("OnFire")
local onHit = remoteEvents:WaitForChild("OnHit")
local onReload = remoteEvents:WaitForChild("OnReload")
local canFire = remoteEvents:WaitForChild("AbleToReload")
local canReload = remoteEvents:WaitForChild("AbleToShoot")
--Sounds
local emptySound = handle:WaitForChild("Empty")
local reloadSound = handle:WaitForChild("Reloading")
local fireSound = handle:WaitForChild("FireShots")
local function ableToReload(plr)
if ammo.Value < magSize.Value then
if not reloading then
if equipped then
return true
end
end
end
return false
end
local function reload(plr)
if not ableToReload() then return end
couldShoot = false
reloading = true
reloadSound:Play()
wait(2)
ammo.Value = magSize.Value
reloading = false
couldShoot = true
end
local function canShoot(plr, sound)
if not reloading then
if equipped then
if ammo.Value > 0 then
return true
else
if sound then
sound:Play()
end
return false
end
end
end
end
local function shoot()
if not canShoot() then return end
if couldShoot then
fireSound:Play()
ammo.Value = ammo.Value - 1
end
end
local function hit(plr, part)
if not canShoot() then return end
if not part then return end
local character = plr.Character or plr.CharacterAdded:Wait()
local rootPart = character:WaitForChild("HumanoidRootPart")
if (rootPart.CFrame.p - part.CFrame.p).magnitude <= range.Value then
local humanoid
local newDamage
humanoid = part.Parent:FindFirstChild("Humanoid")
if humanoid then
newDamage = damage.Value
if part.Name == "Head" then
newDamage = damage.Value * headShotMultiplier.Value
end
humanoid:TakeDamage(newDamage)
end
end
end
local function equip()
equipped = true
player = game:GetService("Players"):GetPlayerFromCharacter(shotgun.Parent.Parent)
end
local function unequip()
equipped = false
end
shotgun.Equipped:Connect(equip)
shotgun.Unequipped:Connect(unequip)
onHit.OnServerEvent:Connect(hit)
onFire.OnServerEvent:Connect(shoot)
onReload.OnServerEvent:Connect(reload)
canFire.OnServerInvoke = canShoot
canReload.OnServerInvoke = ableToReload
So basically, my gun is not reloading when it's at no ammunition, and it's not dealing damage to anything with a humanoid. Why is it doing that?

2 comments
do you have a keybind set to R? for reload or smth idk?
I used BindAction for this, reloading works fine, its just I can't reload when im at 0 ammunition