forked from Simnation/Main
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
|