157 lines
5.7 KiB
Lua
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)
|