I would really appreciate if you do that because I was trying different things but can’t make it work like I said before
Can you share these lines please, this is exactly was i was looking for!
Here’s my script, I haven’t done a huge amount of testing so I’m sure there’s things that could be done better.
It’s a modified version of https://github.com/FiveM-Dev-Sverige/weapon_switch_anim
(0 idea if this was taken from elsewhere, but that’s the repo I started from)
If you have a weapon that you’re wanting the anim to play already equipped, and switch to another one it’ll play both animations. If you go from one that is set to play to one that isn’t it should play the outro and then equip the new weapon.
Again, I’ve done all of 0 testing on this outside of when I was making it so if something is broke I have no idea. You’ve been warned.
local weapons = {
'WEAPON_KNIFE',
'WEAPON_NIGHTSTICK',
'WEAPON_HAMMER',
'WEAPON_BAT',
'WEAPON_GOLFCLUB',
'WEAPON_CROWBAR',
'WEAPON_BOTTLE',
'WEAPON_DAGGER',
'WEAPON_HATCHET',
'WEAPON_MACHETE',
'WEAPON_SWITCHBLADE',
'WEAPON_BATTLEAXE',
'WEAPON_POOLCUE',
'WEAPON_WRENCH',
'WEAPON_PISTOL',
'WEAPON_COMBATPISTOL',
'WEAPON_APPISTOL',
'WEAPON_PISTOL50',
'WEAPON_REVOLVER',
'WEAPON_SNSPISTOL',
'WEAPON_HEAVYPISTOL',
'WEAPON_VINTAGEPISTOL',
'WEAPON_MICROSMG',
'WEAPON_SMG',
'WEAPON_ASSAULTSMG',
'WEAPON_MINISMG',
'WEAPON_MACHINEPISTOL',
'WEAPON_COMBATPDW',
'WEAPON_PUMPSHOTGUN',
'WEAPON_SAWNOFFSHOTGUN',
'WEAPON_ASSAULTSHOTGUN',
'WEAPON_BULLPUPSHOTGUN',
'WEAPON_HEAVYSHOTGUN',
'WEAPON_ASSAULTRIFLE',
'WEAPON_CARBINERIFLE',
'WEAPON_ADVANCEDRIFLE',
'WEAPON_SPECIALCARBINE',
'WEAPON_BULLPUPRIFLE',
'WEAPON_COMPACTRIFLE',
'WEAPON_MG',
'WEAPON_COMBATMG',
'WEAPON_GUSENBERG',
'WEAPON_SNIPERRIFLE',
'WEAPON_HEAVYSNIPER',
'WEAPON_MARKSMANRIFLE',
'WEAPON_GRENADELAUNCHER',
'WEAPON_RPG',
'WEAPON_STINGER',
'WEAPON_MINIGUN',
'WEAPON_GRENADE',
'WEAPON_STICKYBOMB',
'WEAPON_SMOKEGRENADE',
'WEAPON_BZGAS',
'WEAPON_MOLOTOV',
'WEAPON_DIGISCANNER',
'WEAPON_FIREWORK',
'WEAPON_MUSKET',
'WEAPON_STUNGUN',
'WEAPON_HOMINGLAUNCHER',
'WEAPON_PROXMINE',
'WEAPON_FLAREGUN',
'WEAPON_MARKSMANPISTOL',
'WEAPON_RAILGUN',
'WEAPON_DBSHOTGUN',
'WEAPON_AUTOSHOTGUN',
'WEAPON_COMPACTLAUNCHER',
'WEAPON_PIPEBOMB',
'WEAPON_DOUBLEACTION',
}
local holstered = true
local canfire = true
local currWeapon = nil
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if DoesEntityExist( GetPlayerPed(-1) ) and not IsEntityDead( GetPlayerPed(-1) ) and not IsPedInAnyVehicle(PlayerPedId(-1), true) then
if currWeapon ~= GetSelectedPedWeapon(GetPlayerPed(-1)) then
pos = GetEntityCoords(GetPlayerPed(-1), true)
rot = GetEntityHeading(GetPlayerPed(-1))
local newWeap = GetSelectedPedWeapon(GetPlayerPed(-1))
SetCurrentPedWeapon(GetPlayerPed(-1), currWeapon, true)
loadAnimDict( "reaction@intimidation@1h" )
if CheckWeapon(newWeap) then
if holstered then
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "intro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.325, 0, 0)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
Citizen.Wait(600)
ClearPedTasks(GetPlayerPed(-1))
holstered = false
canFire = true
currWeapon = newWeap
elseif newWeap ~= currWeapon then
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "outro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.125, 0, 0)
Citizen.Wait(500)
ClearPedTasks(GetPlayerPed(-1))
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "intro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.325, 0, 0)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
Citizen.Wait(600)
ClearPedTasks(GetPlayerPed(-1))
holstered = false
canFire = true
currWeapon = newWeap
end
else
if not holstered then
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "outro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.125, 0, 0)
Citizen.Wait(500)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
ClearPedTasks(GetPlayerPed(-1))
holstered = true
canFire = true
currWeapon = newWeap
else
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "intro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.325, 0, 0)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
Citizen.Wait(600)
ClearPedTasks(GetPlayerPed(-1))
holstered = false
canFire = true
currWeapon = newWeap
end
end
end
end
end
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if not canFire then
DisableControlAction(0, 25, true)
DisablePlayerFiring(GetPlayerPed(-1), true)
end
end
end)
function CheckWeapon(newWeap)
for i = 1, #weapons do
if GetHashKey(weapons[i]) == newWeap then
return true
end
end
return false
end
function loadAnimDict(dict)
while (not HasAnimDictLoaded(dict)) do
RequestAnimDict(dict)
Citizen.Wait(5)
end
end
Nice dude!, thanks for this
There is one issue, if i remove weapon’s for the list, they still play the animation, do you know how to fix that?
works just like the others you stand still while playing the animation
works fine on my end, i can walk while doing the animation, the only thing with me is that if i take a weapon out of the list, it won’t make a difference cuz it’l still play the animation on that weapon
Splendid job my man. I was trying to do it on my own but didn’t success.
That’s something on your end, works while moving for me. Check that you’re setting the animation flags.
Honestly not sure, that’s strange but don’t have time right now to look into it. Will try to check it this weekend.
alright, i’ll hear for you then!
K yeah already found out what was wrong, honestly don’t even know what i was attempting to accomplish but yeah fixed it quickly.
local weapons = {
'WEAPON_KNIFE',
'WEAPON_NIGHTSTICK',
'WEAPON_HAMMER',
'WEAPON_BAT',
'WEAPON_GOLFCLUB',
'WEAPON_CROWBAR',
'WEAPON_BOTTLE',
'WEAPON_DAGGER',
'WEAPON_HATCHET',
'WEAPON_MACHETE',
'WEAPON_SWITCHBLADE',
'WEAPON_BATTLEAXE',
'WEAPON_POOLCUE',
'WEAPON_WRENCH',
'WEAPON_PISTOL',
'WEAPON_COMBATPISTOL',
'WEAPON_APPISTOL',
'WEAPON_PISTOL50',
'WEAPON_REVOLVER',
'WEAPON_SNSPISTOL',
'WEAPON_HEAVYPISTOL',
'WEAPON_VINTAGEPISTOL',
'WEAPON_MICROSMG',
'WEAPON_SMG',
'WEAPON_ASSAULTSMG',
'WEAPON_MINISMG',
'WEAPON_MACHINEPISTOL',
'WEAPON_COMBATPDW',
'WEAPON_PUMPSHOTGUN',
'WEAPON_SAWNOFFSHOTGUN',
'WEAPON_ASSAULTSHOTGUN',
'WEAPON_BULLPUPSHOTGUN',
'WEAPON_HEAVYSHOTGUN',
'WEAPON_ASSAULTRIFLE',
'WEAPON_CARBINERIFLE',
'WEAPON_ADVANCEDRIFLE',
'WEAPON_SPECIALCARBINE',
'WEAPON_BULLPUPRIFLE',
'WEAPON_COMPACTRIFLE',
'WEAPON_MG',
'WEAPON_COMBATMG',
'WEAPON_GUSENBERG',
'WEAPON_SNIPERRIFLE',
'WEAPON_HEAVYSNIPER',
'WEAPON_MARKSMANRIFLE',
'WEAPON_GRENADELAUNCHER',
'WEAPON_RPG',
'WEAPON_STINGER',
'WEAPON_MINIGUN',
'WEAPON_GRENADE',
'WEAPON_STICKYBOMB',
'WEAPON_SMOKEGRENADE',
'WEAPON_BZGAS',
'WEAPON_MOLOTOV',
'WEAPON_DIGISCANNER',
'WEAPON_FIREWORK',
'WEAPON_MUSKET',
'WEAPON_STUNGUN',
'WEAPON_HOMINGLAUNCHER',
'WEAPON_PROXMINE',
'WEAPON_FLAREGUN',
'WEAPON_MARKSMANPISTOL',
'WEAPON_RAILGUN',
'WEAPON_DBSHOTGUN',
'WEAPON_AUTOSHOTGUN',
'WEAPON_COMPACTLAUNCHER',
'WEAPON_PIPEBOMB',
'WEAPON_DOUBLEACTION',
}
local holstered = true
local canfire = true
local currWeapon = nil
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if DoesEntityExist( GetPlayerPed(-1) ) and not IsEntityDead( GetPlayerPed(-1) ) and not IsPedInAnyVehicle(PlayerPedId(-1), true) then
if currWeapon ~= GetSelectedPedWeapon(GetPlayerPed(-1)) then
pos = GetEntityCoords(GetPlayerPed(-1), true)
rot = GetEntityHeading(GetPlayerPed(-1))
local newWeap = GetSelectedPedWeapon(GetPlayerPed(-1))
SetCurrentPedWeapon(GetPlayerPed(-1), currWeapon, true)
loadAnimDict( "reaction@intimidation@1h" )
if CheckWeapon(newWeap) then
if holstered then
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "intro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.325, 0, 0)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
Citizen.Wait(600)
ClearPedTasks(GetPlayerPed(-1))
holstered = false
canFire = true
currWeapon = newWeap
elseif newWeap ~= currWeapon then
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "outro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.125, 0, 0)
Citizen.Wait(500)
ClearPedTasks(GetPlayerPed(-1))
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "intro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.325, 0, 0)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
Citizen.Wait(600)
ClearPedTasks(GetPlayerPed(-1))
holstered = false
canFire = true
currWeapon = newWeap
end
else
if not holstered and CheckWeapon(currWeapon) then
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "outro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0.125, 0, 0)
Citizen.Wait(500)
SetCurrentPedWeapon(GetPlayerPed(-1), GetHashKey('WEAPON_UNARMED'), true)
Citizen.Wait(1500)
ClearPedTasks(GetPlayerPed(-1))
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
holstered = true
canFire = true
currWeapon = newWeap
else
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
holstered = false
canFire = true
currWeapon = newWeap
end
end
end
end
end
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if not canFire then
DisableControlAction(0, 25, true)
DisablePlayerFiring(GetPlayerPed(-1), true)
end
end
end)
function CheckWeapon(newWeap)
for i = 1, #weapons do
if GetHashKey(weapons[i]) == newWeap then
return true
end
end
return false
end
function loadAnimDict(dict)
while (not HasAnimDictLoaded(dict)) do
RequestAnimDict(dict)
Citizen.Wait(5)
end
end
If you’re swapping from a weapon that’s in the list to one that isn’t it will play the outro animation (putting gun in hoster) and then delays till animation ends and equips new one. The new weapon in that case just kinda appears … but meh far too lazy to try to find the animation that plays when you swap weapons normally.
But for sake of it functioning, it does work at least and is relatively lightweight compared to some other scripts I’ve seen.
you’re a hero, thanks man!
From another persons perspective it looks a bit clunky. When i see someone pull a pistol out it looks like they already have one in their hand while doing the animation and animation doesn’t play in full. It only doesnt play in full when taking out the gun, but when they put it away it looks perfect. But when I do it, the animation looks perfect when taking out the gun. If there is a way to fix that, that would be amazing.
Honestly not sure, haven’t gotten to the point where I was aiming to test it for networked players. Likely have to toy around timings and such.
Hmmm, I will try, but not to experienced with this sort of stuff. If you somehow manage to test/fix it please let me know. Thanks for the help so far <3.
Still no luck with this @guy293 @Alzar if you somehow manage to re-work this animation and its working well, do let us know <3
Yeah so apparently changing animation start times just doesn’t work for networking (Or at least idk how to get it to) so that’s what was breaking it.
local weapons = {
'WEAPON_KNIFE',
'WEAPON_NIGHTSTICK',
'WEAPON_HAMMER',
'WEAPON_BAT',
'WEAPON_GOLFCLUB',
'WEAPON_CROWBAR',
'WEAPON_BOTTLE',
'WEAPON_DAGGER',
'WEAPON_HATCHET',
'WEAPON_MACHETE',
'WEAPON_SWITCHBLADE',
'WEAPON_BATTLEAXE',
'WEAPON_POOLCUE',
'WEAPON_WRENCH',
'WEAPON_PISTOL',
'WEAPON_COMBATPISTOL',
'WEAPON_APPISTOL',
'WEAPON_PISTOL50',
'WEAPON_REVOLVER',
'WEAPON_SNSPISTOL',
'WEAPON_HEAVYPISTOL',
'WEAPON_VINTAGEPISTOL',
'WEAPON_MICROSMG',
'WEAPON_SMG',
'WEAPON_ASSAULTSMG',
'WEAPON_MINISMG',
'WEAPON_MACHINEPISTOL',
'WEAPON_COMBATPDW',
'WEAPON_PUMPSHOTGUN',
'WEAPON_SAWNOFFSHOTGUN',
'WEAPON_ASSAULTSHOTGUN',
'WEAPON_BULLPUPSHOTGUN',
'WEAPON_HEAVYSHOTGUN',
'WEAPON_ASSAULTRIFLE',
'WEAPON_CARBINERIFLE',
'WEAPON_ADVANCEDRIFLE',
'WEAPON_SPECIALCARBINE',
'WEAPON_BULLPUPRIFLE',
'WEAPON_COMPACTRIFLE',
'WEAPON_MG',
'WEAPON_COMBATMG',
'WEAPON_GUSENBERG',
'WEAPON_SNIPERRIFLE',
'WEAPON_HEAVYSNIPER',
'WEAPON_MARKSMANRIFLE',
'WEAPON_GRENADELAUNCHER',
'WEAPON_RPG',
'WEAPON_STINGER',
'WEAPON_MINIGUN',
'WEAPON_GRENADE',
'WEAPON_STICKYBOMB',
'WEAPON_SMOKEGRENADE',
'WEAPON_BZGAS',
'WEAPON_MOLOTOV',
'WEAPON_DIGISCANNER',
'WEAPON_FIREWORK',
'WEAPON_MUSKET',
'WEAPON_STUNGUN',
'WEAPON_HOMINGLAUNCHER',
'WEAPON_PROXMINE',
'WEAPON_FLAREGUN',
'WEAPON_MARKSMANPISTOL',
'WEAPON_RAILGUN',
'WEAPON_DBSHOTGUN',
'WEAPON_AUTOSHOTGUN',
'WEAPON_COMPACTLAUNCHER',
'WEAPON_PIPEBOMB',
'WEAPON_DOUBLEACTION',
}
local holstered = true
local canfire = true
local currWeapon = nil
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if DoesEntityExist( GetPlayerPed(-1) ) and not IsEntityDead( GetPlayerPed(-1) ) and not IsPedInAnyVehicle(PlayerPedId(-1), true) then
if currWeapon ~= GetSelectedPedWeapon(GetPlayerPed(-1)) then
pos = GetEntityCoords(GetPlayerPed(-1), true)
rot = GetEntityHeading(GetPlayerPed(-1))
local newWeap = GetSelectedPedWeapon(GetPlayerPed(-1))
SetCurrentPedWeapon(GetPlayerPed(-1), currWeapon, true)
loadAnimDict( "reaction@intimidation@1h" )
if CheckWeapon(newWeap) then
if holstered then
print(1)
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "intro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
Citizen.Wait(1000)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
currWeapon = newWeap
Citizen.Wait(2000)
ClearPedTasks(GetPlayerPed(-1))
holstered = false
canFire = true
elseif newWeap ~= currWeapon then
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "outro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
Citizen.Wait(1600)
SetCurrentPedWeapon(GetPlayerPed(-1), GetHashKey('WEAPON_UNARMED'), true)
--ClearPedTasks(GetPlayerPed(-1))
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "intro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
Citizen.Wait(1000)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
currWeapon = newWeap
Citizen.Wait(2000)
ClearPedTasks(GetPlayerPed(-1))
holstered = false
canFire = true
end
else
if not holstered and CheckWeapon(currWeapon) then
print(3)
canFire = false
TaskPlayAnimAdvanced(GetPlayerPed(-1), "reaction@intimidation@1h", "outro", GetEntityCoords(GetPlayerPed(-1), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
Citizen.Wait(1600)
SetCurrentPedWeapon(GetPlayerPed(-1), GetHashKey('WEAPON_UNARMED'), true)
ClearPedTasks(GetPlayerPed(-1))
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
holstered = true
canFire = true
currWeapon = newWeap
else
print(4)
SetCurrentPedWeapon(GetPlayerPed(-1), newWeap, true)
holstered = false
canFire = true
currWeapon = newWeap
end
end
end
end
end
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if not canFire then
DisableControlAction(0, 25, true)
DisablePlayerFiring(GetPlayerPed(-1), true)
end
end
end)
function CheckWeapon(newWeap)
for i = 1, #weapons do
if GetHashKey(weapons[i]) == newWeap then
return true
end
end
return false
end
function loadAnimDict(dict)
while (not HasAnimDictLoaded(dict)) do
RequestAnimDict(dict)
Citizen.Wait(5)
end
end
It’s not perfect, there’s a very visible reset if you’re swapping between 2 weapons but pretty much the best I could accomplish with the time I have available. Did a bit of testing logged in on 2 different systems so differences in connection qualities may screw it no idea.
Sorry to bother again lol, only tiny issue with this now is that when you first load into the server. The animation for pulling out a weapon happens twice, after that it plays like normal