210 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local DATA_ANIMATIONS <const> = lib.load("data.animations")
 | |
| local USING_INVENTORY <const> = GetResourceState("ox_inventory"):find("start") and GetConvarInt("inventory:weaponanims", 1) ~= 1
 | |
| local complete = true
 | |
| 
 | |
| local function isVehicleBlocked(vehicle)
 | |
|     if not vehicle then return end
 | |
| 
 | |
|     local class = GetVehicleClass(vehicle)
 | |
|     return class == 8 or class == 13
 | |
| end
 | |
| 
 | |
| local function isBlocked(ped)
 | |
|     return isVehicleBlocked(cache.vehicle) or GetPedParachuteState(ped) > 0
 | |
| end
 | |
| 
 | |
| local function getGender(ped)
 | |
|     local model = GetEntityModel(ped)
 | |
|     if model == `mp_m_freemode_01` then
 | |
|         return "male"
 | |
|     elseif model == `mp_f_freemode_01` then
 | |
|         return "female"
 | |
|     end
 | |
| end
 | |
| 
 | |
| local function getWeaponAnim(ped, weapon, variant)
 | |
|     local animations = DATA_ANIMATIONS.animations
 | |
|     local weaponGroups = DATA_ANIMATIONS?.weaponGroups
 | |
|     local weaponAnims = DATA_ANIMATIONS?.weapons
 | |
|     local clothingInfo = DATA_ANIMATIONS?.clothing?[variant]
 | |
|     local anim = nil
 | |
|     local currentWeaponGroup = GetWeapontypeGroup(weapon)
 | |
|     local gender = getGender(ped)
 | |
| 
 | |
|     local animByGroup = weaponGroups?[currentWeaponGroup]
 | |
|     if animByGroup or animByGroup == false then
 | |
|         anim = animByGroup
 | |
|     end
 | |
| 
 | |
|     local animByWeapon = weaponAnims?[weapon]
 | |
|     if animByWeapon or animByWeapon == false then
 | |
|         anim = animByWeapon
 | |
|     end
 | |
| 
 | |
|     if not clothingInfo then goto skip end
 | |
| 
 | |
|     for i=1, #clothingInfo do
 | |
|         local info = clothingInfo[i]
 | |
|         if not lib.table.contains(info.weapons, weapon) then goto next end
 | |
| 
 | |
|         
 | |
|         local components = info[gender]
 | |
|         if not components then goto next end
 | |
| 
 | |
|         local holster = GetPedDrawableVariation(ped, info.variation)
 | |
|         if lib.table.contains(components, holster) then
 | |
|             anim = info.anim
 | |
|         end
 | |
| 
 | |
|         ::next::
 | |
|     end
 | |
| 
 | |
|     ::skip::
 | |
| 
 | |
|     if anim == nil then
 | |
|         anim = DATA_ANIMATIONS.default
 | |
|     end
 | |
| 
 | |
|     return animations[anim]
 | |
| end
 | |
| 
 | |
| local function startWaponAnim(ped, info, weapon, hideWeapon)
 | |
|     local coords = GetEntityCoords(ped)
 | |
|     lib.requestAnimDict(info.dict)
 | |
|     TaskPlayAnimAdvanced(ped, info.dict, info.clip, coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(ped), 8.0, 3.0, info.duration*2, 50, 0.1)
 | |
|     RemoveAnimDict(info.dict)
 | |
| 
 | |
|     SetTimeout(info.clothing or info.duration/2, function()
 | |
|         TriggerEvent("ND_GunAnims:updateHolster", weapon, hideWeapon)
 | |
|     end)
 | |
| 
 | |
|     Wait(info.duration)
 | |
|     
 | |
|     if info.cancel then
 | |
|         StopAnimTask(ped, info.dict, info.clip, 2.0)
 | |
|     end
 | |
| end
 | |
| 
 | |
| local function playWeaponAnim(weapon, variant)
 | |
|     local ped = cache.ped
 | |
|     local info = getWeaponAnim(ped, weapon, variant)
 | |
| 
 | |
|     if not info or isBlocked(ped) then
 | |
|         return
 | |
|     end
 | |
| 
 | |
|     info = info[variant]
 | |
|     if not info then return end
 | |
| 
 | |
|     if info.dict then
 | |
|         startWaponAnim(ped, info, weapon, variant == "unholster")
 | |
|     else
 | |
|         local anims = info
 | |
|         for i=1, #anims do
 | |
|             local info = anims[i]
 | |
|             startWaponAnim(ped, info, weapon, variant == "unholster")
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| function thread(variant, ped, hash)
 | |
|     LocalPlayer.state.invBusy = true
 | |
| 
 | |
|     if variant == "holster" then
 | |
|         CreateThread(function()
 | |
|             SetPedCurrentWeaponVisible(ped, false, false)
 | |
|             DisablePlayerFiring(cache.playerId, true)
 | |
| 
 | |
|             while not complete do
 | |
|                 DisableControlAction(1, 25, true)
 | |
|                 DisableControlAction(1, 68, true)
 | |
|                 DisableControlAction(1, 70, true)
 | |
|                 DisableControlAction(1, 91, true)
 | |
|                 Wait(0)
 | |
|             end
 | |
| 
 | |
|             DisablePlayerFiring(cache.playerId, false)
 | |
|             SetPedCurrentWeaponVisible(ped, true, false)
 | |
|         end)
 | |
|     else
 | |
|         CreateThread(function()
 | |
|             DisablePlayerFiring(cache.playerId, true)
 | |
|             while not complete do
 | |
|                 if USING_INVENTORY then                 
 | |
|                     GiveWeaponToPed(ped, hash, 0, false, true)
 | |
|                     SetCurrentPedWeapon(ped, hash, true)
 | |
|                 end
 | |
|                 DisableControlAction(1, 25, true)
 | |
|                 DisableControlAction(1, 68, true)
 | |
|                 DisableControlAction(1, 70, true)
 | |
|                 DisableControlAction(1, 91, true)
 | |
|                 Wait(0)
 | |
|             end
 | |
|             DisablePlayerFiring(cache.playerId, false)
 | |
|         end)
 | |
|     end
 | |
| 
 | |
|     LocalPlayer.state.invBusy = false
 | |
| end
 | |
| 
 | |
| if USING_INVENTORY then
 | |
|     local items = exports.ox_inventory:Items()
 | |
| 
 | |
|     AddEventHandler("ox_inventory:usedItem", function(name, slotId, metadata)
 | |
|         local data = items[name]
 | |
|         if not data or not data.weapon or data.ammo then return end
 | |
| 
 | |
|         complete = false
 | |
|         local ped = cache.ped
 | |
|         
 | |
|         thread("holster", ped, data.hash)
 | |
|         playWeaponAnim(data.hash, "unholster")
 | |
|         complete = true
 | |
|     end)
 | |
| 
 | |
|     AddEventHandler("ox_inventory:currentWeapon", function(weapon)
 | |
|         local hash = cache.weapon
 | |
|         local ped = cache.ped
 | |
|         if not hash or weapon then return end
 | |
| 
 | |
|         complete = false
 | |
| 
 | |
|         thread("unholster", ped, hash)
 | |
|         playWeaponAnim(hash, "holster")
 | |
|         complete = true
 | |
|     end)
 | |
| end
 | |
| 
 | |
| if not USING_INVENTORY then
 | |
|     local _, weapon = GetCurrentPedWeapon(cache.ped, true)
 | |
|     local weaponInHand = nil
 | |
| 
 | |
|     local function weaponChanged(value)
 | |
|         local ped = cache.ped
 | |
|         local hash = value or weapon
 | |
|         complete = false
 | |
| 
 | |
|         if value then
 | |
|             thread("holster", ped, hash)
 | |
|             playWeaponAnim(hash, "unholster")
 | |
|         else
 | |
|             thread("unholster", ped, hash)
 | |
|             playWeaponAnim(hash, "holster")
 | |
|         end
 | |
|         
 | |
|         complete = true
 | |
|     end
 | |
| 
 | |
|     CreateThread(function()
 | |
|         while true do
 | |
|             local _, currentWeapon = GetCurrentPedWeapon(cache.ped, true)
 | |
|             if currentWeapon ~= weapon then
 | |
|                 local new = currentWeapon ~= `WEAPON_UNARMED` and currentWeapon
 | |
|                 weaponChanged(new)
 | |
|                 weaponInHand = new
 | |
|                 weapon = currentWeapon
 | |
|             end
 | |
|             Wait(0)
 | |
|         end
 | |
|     end)
 | |
| end
 | 
