
Key RequiredUniversal

local Players = game:GetService("Players")
local VirtualInputManager = game:GetService("VirtualInputManager")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Player = Players.LocalPlayer
local AutoReloadSystem = {
ReloadCooldown = 0.08,
LastReloadTimestamp = 0,
LastManualReload = 0,
ManualReloadWindow = 0.5,
CurrentWeapon = nil,
ActiveConnections = {},
MonitoredValues = {},
IsRunning = true,
PreviousAmmoStates = {},
IgnoreNextReload = false
}
local function ExecuteReload()
local currentTime = tick()
if currentTime - AutoReloadSystem.LastManualReload < AutoReloadSystem.ManualReloadWindow then
return false
end
if AutoReloadSystem.IgnoreNextReload then
AutoReloadSystem.IgnoreNextReload = false
return false
end
if currentTime - AutoReloadSystem.LastReloadTimestamp < AutoReloadSystem.ReloadCooldown then
return false
end
AutoReloadSystem.LastReloadTimestamp = currentTime
task.spawn(function()
local success = pcall(function()
VirtualInputManager:SendKeyEvent(true, Enum.KeyCode.R, false, game)
task.wait(0.01)
VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.R, false, game)
end)
if not success then
warn("[AutoReload] Reload execution failed")
end
end)
return true
end
local function SetupManualReloadDetection()
local inputConnection = UserInputService.InputBegan:Connect(function(input, gameProcessed)
if input.KeyCode == Enum.KeyCode.R then
AutoReloadSystem.LastManualReload = tick()
AutoReloadSystem.IgnoreNextReload = true
task.spawn(function()
task.wait(0.3)
AutoReloadSystem.IgnoreNextReload = false
end)
end
end)
table.insert(AutoReloadSystem.ActiveConnections, inputConnection)
end
local function DisconnectAll()
for _, connection in ipairs(AutoReloadSystem.ActiveConnections) do
if connection and typeof(connection) == "RBXScriptConnection" and connection.Connected then
pcall(function()
connection:Disconnect()
end)
end
end
AutoReloadSystem.ActiveConnections = {}
AutoReloadSystem.MonitoredValues = {}
AutoReloadSystem.PreviousAmmoStates = {}
end
local function MonitorAmmoValue(ammoObject, weaponName)
if not ammoObject then return end
if AutoReloadSystem.MonitoredValues[ammoObject] then return end
AutoReloadSystem.MonitoredValues[ammoObject] = true
AutoReloadSystem.PreviousAmmoStates[ammoObject] = ammoObject.Value
local valueConnection = ammoObject:GetPropertyChangedSignal("Value"):Connect(function()
task.spawn(function()
local currentValue = ammoObject.Value
local previousValue = AutoReloadSystem.PreviousAmmoStates[ammoObject]
if currentValue == 0 and previousValue ~= nil and previousValue > 0 then
task.wait(0.05)
ExecuteReload()
end
AutoReloadSystem.PreviousAmmoStates[ammoObject] = currentValue
end)
end)
table.insert(AutoReloadSystem.ActiveConnections, valueConnection)
if ammoObject.Value == 0 then
task.spawn(function()
task.wait(0.02)
ExecuteReload()
end)
end
end
local function InitializeWeaponMonitoring(weapon)
if not weapon or not weapon:IsA("Tool") then return false end
DisconnectAll()
AutoReloadSystem.CurrentWeapon = weapon
SetupManualReloadDetection()
local ammoObjects = {}
for _, descendant in ipairs(weapon:GetDescendants()) do
if descendant:IsA("IntValue") or descendant:IsA("NumberValue") then
table.insert(ammoObjects, descendant)
end
end
for _, ammoObject in ipairs(ammoObjects) do
MonitorAmmoValue(ammoObject, weapon.Name)
end
local unequipConnection = weapon.Unequipped:Connect(function()
task.spawn(function()
DisconnectAll()
AutoReloadSystem.CurrentWeapon = nil
end)
end)
table.insert(AutoReloadSystem.ActiveConnections, unequipConnection)
return true
end
local function ContinuousAmmoCheck()
task.spawn(function()
while AutoReloadSystem.IsRunning do
task.wait(0.05)
task.spawn(function()
local character = Player.Character
if not character then return end
local equippedWeapon = character:FindFirstChildOfClass("Tool")
if equippedWeapon then
if equippedWeapon ~= AutoReloadSystem.CurrentWeapon then
InitializeWeaponMonitoring(equippedWeapon)
end
for _, descendant in ipairs(equippedWeapon:GetDescendants()) do
if descendant:IsA("IntValue") or descendant:IsA("NumberValue") then
local previousValue = AutoReloadSystem.PreviousAmmoStates[descendant]
local currentValue = descendant.Value
if currentValue == 0 and (previousValue == nil or previousValue > 0) then
ExecuteReload()
AutoReloadSystem.PreviousAmmoStates[descendant] = 0
break
elseif currentValue ~= previousValue then
AutoReloadSystem.PreviousAmmoStates[descendant] = currentValue
end
end
end
end
end)
end
end)
end
local function EstablishCharacterMonitoring(character)
if not character then return end
task.spawn(function()
character:WaitForChild("Humanoid", 10)
DisconnectAll()
AutoReloadSystem.CurrentWeapon = nil
SetupManualReloadDetection()
local childAddedConnection = character.ChildAdded:Connect(function(child)
if child:IsA("Tool") then
task.spawn(function()
task.wait(0.08)
InitializeWeaponMonitoring(child)
end)
end
end)
table.insert(AutoReloadSystem.ActiveConnections, childAddedConnection)
local existingWeapon = character:FindFirstChildOfClass("Tool")
if existingWeapon then
task.spawn(function()
task.wait(0.1)
InitializeWeaponMonitoring(existingWeapon)
end)
end
end)
end
local function StartContinuousMonitoring()
local lastCheckTime = 0
local checkInterval = 0.08
local heartbeatConnection = RunService.Heartbeat:Connect(function()
local currentTime = tick()
if currentTime - lastCheckTime < checkInterval then return end
lastCheckTime = currentTime
task.spawn(function()
local character = Player.Character
if not character then return end
local equippedWeapon = character:FindFirstChildOfClass("Tool")
if equippedWeapon and equippedWeapon ~= AutoReloadSystem.CurrentWeapon then
InitializeWeaponMonitoring(equippedWeapon)
end
end)
end)
table.insert(AutoReloadSystem.ActiveConnections, heartbeatConnection)
end
local function RestartSystem()
task.spawn(function()
pcall(function()
DisconnectAll()
end)
AutoReloadSystem.IsRunning = true
if Player.Character then
EstablishCharacterMonitoring(Player.Character)
end
StartContinuousMonitoring()
ContinuousAmmoCheck()
end)
end
local function Initialize()
task.spawn(function()
while true do
task.wait(1)
pcall(function()
if not AutoReloadSystem.IsRunning then
RestartSystem()
end
local character = Player.Character
if character then
local hasActiveConnections = false
for _, connection in ipairs(AutoReloadSystem.ActiveConnections) do
if connection and typeof(connection) == "RBXScriptConnection" and connection.Connected then
hasActiveConnections = true
break
end
end
if not hasActiveConnections then
RestartSystem()
end
end
end)
end
end)
local characterAddedConnection = Player.CharacterAdded:Connect(function(character)
task.wait(0.5)
EstablishCharacterMonitoring(character)
end)
table.insert(AutoReloadSystem.ActiveConnections, characterAddedConnection)
SetupManualReloadDetection()
if Player.Character then
EstablishCharacterMonitoring(Player.Character)
end
StartContinuousMonitoring()
ContinuousAmmoCheck()
end
Initialize()
return AutoReloadSystem



Script Fixed.