Files
Elite-Gaming-FiveM/resources/wp-placeables/client/pushables.lua
T
2025-05-19 16:45:39 -07:00

157 lines
5.7 KiB
Lua

local isAttached = false
local isSittingOnObject = false
local pushableObject = nil
-- Detaches the object from the player, stops the animation, and resets the variables
local function ReleasePushableObject()
DetachEntity(pushableObject, false, true)
SetEntityCollision(pushableObject, true, true)
ClearPedTasksImmediately(PlayerPedId())
-- Reset variables
isAttached = false
isSittingOnObject = false
pushableObject = nil
end
-- Runs a thread while player is attached to the pushable object, disables some keys and listens for E keypress to release the object
-- Also checks that player is still in the animation, if not then puts them back into the animation
local function PushableObjectAttachedThread(animDict, anim)
CreateThread(function()
while isAttached do
-- Disables attacking controls
DisableControlAction(0, 24, true) -- disable attack
DisableControlAction(0, 25, true) -- disable aim
DisableControlAction(0, 47, true) -- disable weapon
DisableControlAction(0, 58, true) -- disable weapon
DisableControlAction(0, 263, true) -- disable melee
DisableControlAction(0, 264, true) -- disable melee
DisableControlAction(0, 257, true) -- disable melee
DisableControlAction(0, 140, true) -- disable melee
DisableControlAction(0, 141, true) -- disable melee
DisableControlAction(0, 142, true) -- disable melee
DisableControlAction(0, 143, true) -- disable melee
-- Check to see if animation is still playing, if not then put the player back in the animation
local playerPed = PlayerPedId()
if not IsEntityPlayingAnim(playerPed, animDict, anim, 3) and not IsPedRagdoll(playerPed) then
local animFlag = isSittingOnObject and 5 or 51
ClearPedTasks(playerPed)
LoadAnimDict(animDict)
TaskPlayAnim(playerPed, animDict, anim, 3.0, 3.0, -1, animFlag, 0, 0, 0, 0)
end
-- Pressed E
if IsControlJustPressed(0, 38) then
ReleasePushableObject()
end
Wait(5) -- Needs to be a small number so that player doesnt need to spam press E to get it to take
end
end)
end
-- Attaches the object to the player and plays a pushing animation
local function PushObject(data)
local PlayerPed = PlayerPedId()
pushableObject = data.entity
if pushableObject then
local netId = NetworkGetNetworkIdFromEntity(pushableObject)
RequestNetworkControlOfObject(netId, pushableObject)
LoadAnimDict(data.animationPushOptions.animationDict)
TaskPlayAnim(PlayerPed, data.animationPushOptions.animationDict, data.animationPushOptions.animationName, 8.0, 8.0, -1, 51, 0, 0, 0, 0)
local offset = data.animationPushOptions.offset
local rotation = data.animationPushOptions.rotation
SetTimeout(150, function()
isAttached = true
SetEntityCollision(pushableObject, false, false)
AttachEntityToEntity(
pushableObject,
PlayerPed,
GetPedBoneIndex(PlayerPed, 28422),
offset.x,
offset.y,
offset.z,
rotation.x,
rotation.y,
rotation.z,
false, -- p9
false, -- usesoftpinner
true, -- collision
false, -- isPed
2, -- rotationorder
true -- fixrot
)
PushableObjectAttachedThread(data.animationPushOptions.animationDict, data.animationPushOptions.animationName)
end)
end
end
-- Attaches player to object and plays the sitting animation
local function SitOnObject(data)
local PlayerPed = PlayerPedId()
pushableObject = data.entity
if pushableObject ~= nil then
LoadAnimDict(data.animationSitOptions.animationDict)
TaskPlayAnim(PlayerPed, data.animationSitOptions.animationDict, data.animationSitOptions.animationName, 8.0, 8.0, -1, 5, 0, 0, 0, 0)
local offset = data.animationSitOptions.offset
local rotation = data.animationSitOptions.rotation
SetTimeout(150, function()
isAttached = true
isSittingOnObject = true
AttachEntityToEntity(
PlayerPed,
pushableObject,
GetPedBoneIndex(PlayerPed, 11816),
offset.x,
offset.y,
offset.z,
rotation.x,
rotation.y,
rotation.z,
false, -- p9
false, -- usesoftpinner
false, -- collision -- if this is true, then the peds body will collide with things as you push it around
true, -- isPed
2, -- rotationorder
true -- fixrot
)
PushableObjectAttachedThread(data.animationSitOptions.animationDict, data.animationSitOptions.animationName)
end)
end
end
AddEventHandler("onResourceStop", function(resource)
if resource == GetCurrentResourceName() then
if pushableObject then
ReleasePushableObject()
DeleteObject(pushableObject)
ClearPedTasksImmediately(PlayerPedId())
end
end
end)
RegisterNetEvent("wp-placeables:client:pushObject", function(data)
PushObject(data)
end)
RegisterNetEvent("wp-placeables:client:sitOnObject", function(data)
SitOnObject(data)
end)
local function IsPlayerSittingOnPlaceableProp()
return isSittingOnObject
end
exports("IsPlayerSittingOnPlaceableProp", IsPlayerSittingOnPlaceableProp)