if not lib then return end local Weapon = {} local Items = require 'modules.items.client' local Utils = require 'modules.utils.client' local Weapons = data 'weapons' local BagsMan = data 'bagsman' local BagsVrouw = data 'bagsvrouw' local HolstersMan = data 'holstersman' local HolstersVrouw = data 'holstersvrouw' exports('hasWhitelistedBag', function() if BagsMan[GetPedDrawableVariation(PlayerPedId(), 5)] then return true elseif BagsVrouw[GetPedDrawableVariation(PlayerPedId(), 5)] then return true end end) local GROUP_MELEE = GetHashKey('GROUP_MELEE') local GROUP_PISTOL = GetHashKey('GROUP_PISTOL') local GROUP_STUNGUN = GetHashKey('GROUP_STUNGUN') local weaponGroups = { [GROUP_PISTOL] = true, [GROUP_STUNGUN] = true, } local holsterDrawables = { ["empty"] = {178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 199, 200}, ["filled"] = {179, 181, 183, 185, 187, 189, 191, 193, 195, 197} } local holsterComponents = {7, 9, 10} local anims = {} anims[GROUP_MELEE] = { 'melee@holster', 'unholster', 200, 'melee@holster', 'holster', 600 } anims[GROUP_PISTOL] = { 'rcmjosh4', 'josh_leadout_cop2', 200, 'reaction@intimidation@cop@unarmed', 'outro', 350 } anims[GROUP_STUNGUN] = anims[GROUP_PISTOL] local function hasHolster(ped) for _, comp in ipairs(holsterComponents) do local drawable = GetPedDrawableVariation(ped, comp) for i = 1, #holsterDrawables["empty"] do if drawable == holsterDrawables["empty"][i] or drawable == holsterDrawables["filled"][i] then return true, comp end end end return false, nil end local function isHolsterFilled(ped) for _, comp in ipairs(holsterComponents) do local drawable = GetPedDrawableVariation(ped, comp) for i = 1, #holsterDrawables["filled"] do if drawable == holsterDrawables["filled"][i] then return true end end end return false end local function setHolsterState(ped, isEmpty) for _, comp in ipairs(holsterComponents) do local drawable = GetPedDrawableVariation(ped, comp) local texture = GetPedTextureVariation(ped, comp) for i = 1, #holsterDrawables["empty"] do if drawable == holsterDrawables["empty"][i] or drawable == holsterDrawables["filled"][i] then local newDrawable = isEmpty and holsterDrawables["empty"][i] or holsterDrawables["filled"][i] SetPedComponentVariation(ped, comp, newDrawable, texture, 0) return end end end end local function loadAnimDict(dict) if not HasAnimDictLoaded(dict) then RequestAnimDict(dict) while not HasAnimDictLoaded(dict) do Wait(0) end end end local function vehicleIsCycle(vehicle) local class = GetVehicleClass(vehicle) return class == 8 or class == 13 end function Weapon.Equip(item, data) while cache.pickingWeaponCooldown do Wait(0) end local playerPed, sleep = cache.ped, 200 if client.weaponanims then if cache.vehicle and vehicleIsCycle(cache.vehicle) then goto skipAnim end local coords = GetEntityCoords(playerPed, true) local group = GetWeapontypeGroup(data.hash) local anim = data.anim or anims[group] cache.pickingWeaponCooldown = true local hasHolsterItem = hasHolster(playerPed) if anim == anims[GROUP_PISTOL] and hasHolsterItem and weaponGroups[group] then sleep = anim[3] if isHolsterFilled(playerPed) then local unholsterSleep = anim[6] loadAnimDict(anim[4]) TaskPlayAnim(playerPed, anim[4], anim[5], 8.0, -8.0, unholsterSleep, 48, 0, false, false, false) Wait(unholsterSleep) ClearPedTasks(playerPed) setHolsterState(playerPed, true) Wait(100) end loadAnimDict(anim[1]) TaskPlayAnim(playerPed, anim[1], anim[2], 8.0, -8.0, sleep, 48, 0, false, false, false) Wait(sleep) ClearPedTasks(playerPed) setHolsterState(playerPed, false) else if item.hash == `WEAPON_SWITCHBLADE` then sleep = anim and anim[3] or 200 Utils.PlayAnimAdvanced(sleep*2, 'anim@melee@switchblade@holster', 'unholster', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(playerPed), 8.0, 3.0, -1, 48, 0.1) Wait(100) else local whitelisted = false if (IsPedModel(playerPed, "mp_m_freemode_01")) and BagsMan[GetPedDrawableVariation(playerPed, 5)] then whitelisted = true elseif (IsPedModel(playerPed, "mp_f_freemode_01")) and BagsVrouw[GetPedDrawableVariation(playerPed, 5)] then whitelisted = true end sleep = 1200 if Weapons['Weapons'][item.name]['heavy'] then if whitelisted then Utils.PlayAnimAdvanced(sleep*2, 'reaction@intimidation@1h', 'intro', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(playerPed), 8.0, 3.0, -1, 50, 0.1) ClearPedTasks(cache.ped) else Utils.PlayAnimAdvanced(750, 'anim@heists@ornate_bank@grab_cash', 'intro', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(cache.ped), 8.0, 3.0, -1, 50, 0) ClearPedTasks(cache.ped) SetPedCurrentWeaponVisible(PlayerPedId(), 0, 1, 1, 1) Wait(250) end else Utils.PlayAnimAdvanced(sleep*2, 'reaction@intimidation@1h', 'intro', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(playerPed), 8.0, 3.0, -1, 50, 0.1) ClearPedTasks(cache.ped) end end end end ::skipAnim:: SetPedAmmo(playerPed, data.hash, 0) GiveWeaponToPed(playerPed, data.hash, 0, false, true) if item.metadata.tint then SetPedWeaponTintIndex(playerPed, data.hash, item.metadata.tint) end if item.metadata.components then for i = 1, #item.metadata.components do local components = Items[item.metadata.components[i]].client.component for v=1, #components do local component = components[v] if DoesWeaponTakeWeaponComponent(data.hash, component) then if not HasPedGotWeaponComponent(playerPed, data.hash, component) then GiveWeaponComponentToPed(playerPed, data.hash, component) end end end end end item.hash = data.hash item.ammo = data.ammoname item.melee = (not item.throwable and not data.ammoname) and 0 item.timer = 0 if data.throwable then item.throwable = true end SetCurrentPedWeapon(playerPed, data.hash, true) SetPedCurrentWeaponVisible(playerPed, true, false, false, false) AddAmmoToPed(playerPed, data.hash, item.metadata.ammo or 100) Wait(0) RefillAmmoInstantly(playerPed) SetWeaponsNoAutoswap(true) if data.hash == `WEAPON_PETROLCAN` or data.hash == `WEAPON_HAZARDCAN` or data.hash == `WEAPON_FERTILIZERCAN` or data.hash == `WEAPON_FIREEXTINGUISHER` then item.metadata.ammo = item.metadata.durability SetPedInfiniteAmmo(playerPed, true, data.hash) end TriggerEvent('ox_inventory:currentWeapon', item) Utils.ItemNotify({ item, 'ui_equipped' }) Wait(sleep) cache.pickingWeaponCooldown = false return item end function Weapon.Disarm(currentWeapon, noAnim) if cache.pickingWeaponCooldown then return end if source == '' then TriggerServerEvent('ox_inventory:updateWeapon') end if currentWeapon then SetPedAmmo(cache.ped, currentWeapon.hash, 0) if client.weaponanims and not noAnim then if cache.vehicle and vehicleIsCycle(cache.vehicle) then goto skipAnim end ClearPedSecondaryTask(cache.ped) local item = Items[currentWeapon.name] local coords = GetEntityCoords(cache.ped, true) local group = GetWeapontypeGroup(currentWeapon.hash) local anim = item.anim or anims[group] local hasHolsterItem = hasHolster(cache.ped) if anim == anims[GROUP_PISTOL] and hasHolsterItem and weaponGroups[group] then local sleep = anim[6] loadAnimDict(anim[4]) TaskPlayAnim(cache.ped, anim[4], anim[5], 8.0, -8.0, sleep, 48, 0, false, false, false) Wait(sleep) ClearPedTasks(cache.ped) setHolsterState(cache.ped, true) else local sleep = 1400 local whitelisted = false if (IsPedModel(cache.ped, "mp_m_freemode_01")) and BagsMan[GetPedDrawableVariation(cache.ped, 5)] then whitelisted = true elseif (IsPedModel(cache.ped, "mp_f_freemode_01")) and BagsVrouw[GetPedDrawableVariation(cache.ped, 5)] then whitelisted = true end if Weapons['Weapons'][item.name]['heavy'] then if whitelisted then Utils.PlayAnimAdvanced(sleep, 'reaction@intimidation@1h', 'outro', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(cache.ped), 8.0, 3.0, -1, 50, 0) ClearPedTasks(cache.ped) else Utils.PlayAnimAdvanced(750, 'anim@heists@ornate_bank@grab_cash', 'intro', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(cache.ped), 8.0, 3.0, -1, 50, 0) ClearPedTasks(cache.ped) SetPedCurrentWeaponVisible(PlayerPedId(), 0, 1, 1, 1) Wait(250) end else Utils.PlayAnimAdvanced(sleep, 'reaction@intimidation@1h', 'outro', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(cache.ped), 8.0, 3.0, -1, 50, 0) ClearPedTasks(cache.ped) end end end ::skipAnim:: Utils.ItemNotify({ currentWeapon, 'ui_holstered' }) TriggerEvent('ox_inventory:currentWeapon') end Utils.WeaponWheel() RemoveAllPedWeapons(cache.ped, true) end function Weapon.ClearAll(currentWeapon) Weapon.Disarm(currentWeapon) if client.parachute then local chute = `GADGET_PARACHUTE` GiveWeaponToPed(cache.ped, chute, 0, true, false) SetPedGadget(cache.ped, chute, true) end end Utils.Disarm = Weapon.Disarm Utils.ClearWeapons = Weapon.ClearAll return Weapon