[PAID] [ESX/QB] Realistic Weapon Reload | Magazine System

Welcome to our Realistic Weapon Reload Script!

Realistic Reload transforms weapon handling by introducing a true magazine system instead of GTA’s default reload behavior. Players must physically manage magazines, making gunfights more tactical, immersive, and realistic.

:bulb:Features

  • Full magazine-based reload system
  • Different magazine types for different weapons
  • Automatically replaces the default ox_inventory reload system
  • Ability to refill magazines using regular bullets
  • Uses reload animations
  • Fully compatible with ox_inventory
  • Option to exclude specific weapons from the system
  • Fully configurable
  • Adds tension and realism to gunfights

Option to integrate your own Inventory Script and Framework via the Bridge Folder

:computer:Requirements

  • ESX or QBCore
  • Ox Inventory
  • Ox lib

:film_projector:Preview

Click here for the YouTube Preview

Click here for some pictures
Click here for the Config
Config = {}

Config.Framework = 'auto' -- auto | esx | qb | custom
Config.Inventory = 'auto' -- auto | ox | custom
Config.Debug = false

Config.ReloadControl = 45 -- INPUT_RELOAD (R)
Config.ReloadDuration = 1700
Config.RefillDuration = 2600
Config.SyncInterval = 150
Config.RemoveMagazineCommand = 'magout'


Config.DisableControlsDuringProgress = {
    move = true,
    car = true,
    combat = true
}

Config.RefillAnimation = {
    dict = 'anim@amb@clubhouse@tutorial@bkr_tut_ig3@',
    clip = 'machinic_loop_mechandplayer',
    flag = 49
}

Config.Magazines = {
    ['ammo-9'] = { item = 'magazine_9mm', capacity = 17, label = '9mm Magazine' },
    ['ammo-22'] = { item = 'magazine_22lr', capacity = 12, label = '.22LR Magazine' },
    ['ammo-38'] = { item = 'magazine_38', capacity = 6, label = '.38 Magazine' },
    ['ammo-45'] = { item = 'magazine_45acp', capacity = 12, label = '.45 ACP Magazine' },
    ['ammo-50'] = { item = 'magazine_50ae', capacity = 7, label = '.50 AE Magazine' },
    ['ammo-rifle'] = { item = 'magazine_556', capacity = 30, label = '5.56 Magazine' },
    ['ammo-rifle2'] = { item = 'magazine_762', capacity = 30, label = '7.62 Magazine' },
    ['ammo-sniper'] = { item = 'magazine_sniper', capacity = 10, label = 'Sniper Magazine' },
    ['ammo-heavysniper'] = { item = 'magazine_heavysniper', capacity = 5, label = 'Heavy Sniper Magazine' }
}

Config.Notifications = {
    noMagazine = 'No matching magazine found.',
    noAmmoForRefill = 'No matching ammo (%s) found in inventory.',
    noAmmoGeneric = 'No matching ammo found in inventory.',
    magazineFull = 'This magazine is already full.',
    noInsertedMagazine = 'No magazine is inserted in the weapon.',
    magazineRemoved = 'Magazine removed from weapon.',
    reloadCanceled = 'Reload canceled.',
    magazineRefilled = '+%d rounds loaded into %s.',
    outOfSync = 'Magazine state is out of sync. Please re-equip the weapon.',
    unsupportedWeapon = 'This weapon does not use a configured magazine.',
    inventoryNotReady = 'Inventory bridge is not ready or not configured.',
    inventoryFull = 'Inventory full - magazine cannot be stored.',
    operationFailed = 'Operation failed.'
}

Config.AmmoTypeFallback = {
    [joaat('AMMO_PISTOL')] = 'ammo-9',
    [joaat('AMMO_SMG')] = 'ammo-9',
    [joaat('AMMO_RIFLE')] = 'ammo-rifle',
    [joaat('AMMO_MG')] = 'ammo-rifle',
    [joaat('AMMO_SNIPER')] = 'ammo-sniper',
    [joaat('AMMO_HEAVYSNIPER')] = 'ammo-heavysniper',
    [joaat('AMMO_PISTOL50')] = 'ammo-50'
}

Config.ExcludedAmmoTypes = {
    [joaat('AMMO_SHOTGUN')] = true,
    [joaat('AMMO_REVOLVER')] = true,
    [joaat('AMMO_BEANBAG')] = true
}

Config.ExcludedWeapons = {
    [joaat('WEAPON_REVOLVER')] = true,
    [joaat('WEAPON_REVOLVER_MK2')] = true,
    [joaat('WEAPON_DOUBLEACTION')] = true,
    [joaat('WEAPON_NAVYREVOLVER')] = true,
    [joaat('WEAPON_BEANBAG')] = true,
    [joaat('WEAPON_BEANBAGSHOTGUN')] = true
}

Config.ExcludedWeaponNameKeywords = {
    'shotgun',
    'revolver',
    'beanbag',
    'doubleaction',
    'navy',
    'musket'
}

Config.ExcludedWeaponGroups = {
    [joaat('GROUP_SHOTGUN')] = true
}

Config.MagazineByItem = {}

for ammoItem, data in pairs(Config.Magazines) do
    Config.MagazineByItem[data.item] = {
        ammoItem = ammoItem,
        capacity = data.capacity,
        label = data.label
    }
end

:link:Links

Get the Script here
You can find our Discord here

For any help or questions about our script please contact us!

:eye:Check our other Releases out

Code is accessible No/Bridge Folder is open
Subscription-based No
Lines (approximately) 2400
Requirements ESX/QB, ox_lib, ox_inventory
Support Yes
3 Likes

How would this function with extended magazines and different gun clip capacities?? If I made a clip for 60 rounds for a rifle with extended mag, is there anything that would prevent it being used on a rifle which should only have a 30 round clip??

You can configure the magazine size for every magazine but right now there is now extended mag compability.
We are working right now on this problem and hope to release an update for this issue soon.