forked from Simnation/Main
248 lines
7.7 KiB
Lua
248 lines
7.7 KiB
Lua
-----------------For support, scripts, and more----------------
|
|
--------------- https://discord.gg/AeCVP2F8h7 -------------
|
|
---------------------------------------------------------------
|
|
|
|
local ped = nil
|
|
local sitting = false
|
|
local oldCamView = nil
|
|
|
|
local txt = {
|
|
'-- Sit -- \n',
|
|
'[E] Sit \n',
|
|
'[X / Right Click] Cancel \n',
|
|
'[G] Next Animation \n',
|
|
'[H] Previous Animation \n',
|
|
'[Up/Down Arrows] Height \n',
|
|
'[SCROLL] Rotate \n',
|
|
}
|
|
|
|
local currentAnimIndex = 1
|
|
|
|
local function CycleAnimations(direction)
|
|
if direction == "next" then
|
|
currentAnimIndex = currentAnimIndex + 1
|
|
if currentAnimIndex > #Config.Anims then
|
|
currentAnimIndex = 1
|
|
end
|
|
elseif direction == "previous" then
|
|
currentAnimIndex = currentAnimIndex - 1
|
|
if currentAnimIndex < 1 then
|
|
currentAnimIndex = #Config.Anims
|
|
end
|
|
end
|
|
end
|
|
|
|
local function StartSittingThread()
|
|
sitting = true
|
|
lib.showTextUI("Press [Q] to cancel")
|
|
CreateThread(function ()
|
|
while sitting do
|
|
Wait(1)
|
|
if IsControlJustPressed(0, 44) then
|
|
sitting = false
|
|
lib.hideTextUI()
|
|
ClearPedTasksImmediately(PlayerPedId())
|
|
return
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function MakePedSitDown(coords, heading, animData)
|
|
stopPlacing()
|
|
TaskGoToCoordAnyMeans(PlayerPedId(), coords.x, coords.y, coords.z, 1.0, 0, 0, 786603, 0xbf800000)
|
|
local PlayerCoords = GetEntityCoords(PlayerPedId())
|
|
lib.showTextUI("Press [Right Click] to cancel")
|
|
while #(PlayerCoords - coords) > 1.5 do
|
|
Wait(1)
|
|
PlayerCoords = GetEntityCoords(PlayerPedId())
|
|
if IsControlJustPressed(0, 177) then
|
|
lib.hideTextUI()
|
|
ClearPedTasksImmediately(PlayerPedId())
|
|
return
|
|
end
|
|
end
|
|
lib.hideTextUI()
|
|
SetEntityCoords(PlayerPedId(), coords.x, coords.y, coords.z, 0.0, 0.0, 0.0, false)
|
|
TaskPlayAnimAdvanced(PlayerPedId(), animData.dict, animData.anim, coords.x, coords.y, coords.z, 0, 0, heading, 3.0, 3.0, -1, 2, 1.0, false, false)
|
|
StartSittingThread()
|
|
end
|
|
|
|
local function PlacingThread(animData)
|
|
if ped == nil then
|
|
local playerPed = PlayerPedId()
|
|
ped = ClonePed(playerPed, false, false, false)
|
|
FreezeEntityPosition(ped, true)
|
|
SetEntityAlpha(ped, 0)
|
|
|
|
local animToUse = Config.Anims[currentAnimIndex]
|
|
|
|
if not animToUse then
|
|
lib.notify({ type = "error", description = "No animation found." })
|
|
return
|
|
end
|
|
|
|
lib.requestAnimDict(animData.dict)
|
|
TaskPlayAnim(ped, animData.dict, animData.anim, 8.0, 8.0, -1, 1, 0, false, false, false)
|
|
SetEntityCollision(ped, false, false)
|
|
SetEntityAlpha(ped, 100)
|
|
if Config.SetToFirstPerson then
|
|
oldCamView = GetFollowPedCamViewMode()
|
|
SetFollowPedCamViewMode(3)
|
|
SetCamViewModeForContext(0, 4)
|
|
end
|
|
SetBlockingOfNonTemporaryEvents(ped, true)
|
|
heading = GetEntityHeading(playerPed) + 90.0
|
|
lib.showTextUI(table.concat(txt))
|
|
CreateThread(function ()
|
|
local currentCoordsZ = 0
|
|
while ped ~= nil do
|
|
Wait(1)
|
|
DisableControlAction(0, 22, true)
|
|
startPlacing()
|
|
if currentCoords then
|
|
SetEntityCoords(ped, currentCoords.x, currentCoords.y, currentCoords.z + currentCoordsZ)
|
|
SetEntityHeading(ped, heading)
|
|
end
|
|
if IsDisabledControlJustPressed(0, 14) then
|
|
heading = heading + 5
|
|
if heading > 360 then heading = 0.0 end
|
|
end
|
|
if IsDisabledControlPressed(0, 27) then
|
|
currentCoordsZ = currentCoordsZ + 0.01
|
|
end
|
|
if IsDisabledControlPressed(0, 173) then
|
|
currentCoordsZ = currentCoordsZ - 0.01
|
|
end
|
|
if IsDisabledControlJustPressed(0, 15) then
|
|
heading = heading - 5
|
|
if heading < 0 then heading = 360.0 end
|
|
end
|
|
if IsControlJustPressed(0, 38) then
|
|
if #(GetEntityCoords(PlayerPedId()) - currentCoords) < 5.0 then
|
|
MakePedSitDown(GetEntityCoords(ped), GetEntityHeading(ped), animToUse)
|
|
else
|
|
lib.notify({type = "error", description = "You are too far"})
|
|
end
|
|
end
|
|
|
|
if IsControlJustPressed(0, 47) then -- G
|
|
CycleAnimations("next")
|
|
animToUse = Config.Anims[currentAnimIndex]
|
|
|
|
if not animToUse then
|
|
lib.notify({ type = "error", description = "No animation found." })
|
|
return
|
|
end
|
|
|
|
lib.requestAnimDict(animToUse.dict)
|
|
TaskPlayAnim(ped, animToUse.dict, animToUse.anim, 8.0, 8.0, -1, 1, 0, false, false, false)
|
|
end
|
|
|
|
if IsControlJustPressed(0, 74) then -- H
|
|
CycleAnimations("previous")
|
|
animToUse = Config.Anims[currentAnimIndex]
|
|
|
|
if not animToUse then
|
|
lib.notify({ type = "error", description = "No animation found." })
|
|
return
|
|
end
|
|
|
|
lib.requestAnimDict(animToUse.dict)
|
|
TaskPlayAnim(ped, animToUse.dict, animToUse.anim, 8.0, 8.0, -1, 1, 0, false, false, false)
|
|
end
|
|
|
|
if IsControlJustPressed(0, 177) then
|
|
stopPlacing()
|
|
end
|
|
end
|
|
end)
|
|
else
|
|
DeleteObject(ped)
|
|
ped = nil
|
|
stopPlacing()
|
|
return
|
|
end
|
|
end
|
|
|
|
function GetForwardVector(rotation)
|
|
local rot = (math.pi / 180.0) * rotation
|
|
return vector3(-math.sin(rot.z) * math.abs(math.cos(rot.x)), math.cos(rot.z) * math.abs(math.cos(rot.x)),
|
|
math.sin(rot.x))
|
|
end
|
|
|
|
|
|
local function RotationToDirection(rotation)
|
|
local adjustedRotation =
|
|
{
|
|
x = (math.pi / 180) * rotation.x,
|
|
y = (math.pi / 180) * rotation.y,
|
|
z = (math.pi / 180) * rotation.z
|
|
}
|
|
local direction =
|
|
{
|
|
x = -math.sin(adjustedRotation.z) * math.abs(math.cos(adjustedRotation.x)),
|
|
y = math.cos(adjustedRotation.z) * math.abs(math.cos(adjustedRotation.x)),
|
|
z = math.sin(adjustedRotation.x)
|
|
}
|
|
return direction
|
|
end
|
|
|
|
function Camera(ped)
|
|
local cameraRotation = GetGameplayCamRot()
|
|
local cameraCoord = GetGameplayCamCoord()
|
|
local direction = RotationToDirection(cameraRotation)
|
|
local destination =
|
|
{
|
|
x = cameraCoord.x + direction.x * 10.0,
|
|
y = cameraCoord.y + direction.y * 10.0,
|
|
z = cameraCoord.z + direction.z * 10.0
|
|
}
|
|
|
|
local sphereCast = StartShapeTestSweptSphere(
|
|
cameraCoord.x,
|
|
cameraCoord.y,
|
|
cameraCoord.z,
|
|
destination.x,
|
|
destination.y,
|
|
destination.z,
|
|
0.2,
|
|
339,
|
|
ped,
|
|
4
|
|
);
|
|
return GetShapeTestResultIncludingMaterial(sphereCast);
|
|
end
|
|
|
|
function startPlacing()
|
|
local _, hit, endCoords, _, _, _ = Camera(ped)
|
|
if hit then
|
|
currentCoords = endCoords
|
|
end
|
|
end
|
|
|
|
function stopPlacing()
|
|
if ped then
|
|
DeleteEntity(ped)
|
|
end
|
|
ped = nil
|
|
heading = 0.0
|
|
currentCoords = nil
|
|
lib.hideTextUI()
|
|
if Config.SetToFirstPerson then
|
|
SetFollowPedCamViewMode(oldCamView)
|
|
oldCamView = nil
|
|
end
|
|
end
|
|
|
|
RegisterCommand("sit", function(source, args)
|
|
local animToUse = Config.Anims[currentAnimIndex]
|
|
|
|
if not animToUse then
|
|
lib.notify({ type = "error", description = "No animation found." })
|
|
return
|
|
end
|
|
|
|
PlacingThread(animToUse)
|
|
end)
|
|
|