234 lines
9.0 KiB
Lua
234 lines
9.0 KiB
Lua
local plyCoords = GetEntityCoords(PlayerPedId())
|
|
local isWithinObject = false
|
|
local oElement = {}
|
|
|
|
-- // BASIC
|
|
local InUse = false
|
|
local IsTextInUse = false
|
|
local PlyLastPos = 0
|
|
|
|
-- // ANIMATION
|
|
local Anim = 'sit'
|
|
local AnimScroll = 0
|
|
|
|
-- Fast Thread
|
|
CreateThread(function()
|
|
while true do
|
|
if isWithinObject and oElement.fObject ~= 0 then
|
|
local ply = PlayerPedId()
|
|
local objectCoords = oElement.fObjectCoords
|
|
local distanceDiff = #(objectCoords - plyCoords)
|
|
if (distanceDiff < 2.0 and not InUse) then
|
|
if (oElement.fObjectIsBed == true) then
|
|
|
|
-- // ARROW RIGHT
|
|
if IsControlJustPressed(0, 175) then -- right
|
|
if (AnimScroll ~= 2) then
|
|
AnimScroll = AnimScroll + 1
|
|
end
|
|
if AnimScroll == 1 then
|
|
Anim = "back"
|
|
elseif AnimScroll == 2 then
|
|
Anim = "stomach"
|
|
end
|
|
end
|
|
|
|
-- // ARROW LEFT
|
|
if IsControlJustPressed(0, 174) then -- left
|
|
if (AnimScroll ~= 0) then
|
|
AnimScroll = AnimScroll - 1
|
|
end
|
|
if AnimScroll == 1 then
|
|
Anim = "back"
|
|
elseif AnimScroll == 0 then
|
|
Anim = "sit"
|
|
end
|
|
end
|
|
|
|
if (Anim == 'sit') then
|
|
DrawText3Ds(objectCoords.x, objectCoords.y, objectCoords.z, Config.Text.SitOnBed .. ' | ' .. Config.Text.SwitchBetween)
|
|
else
|
|
DrawText3Ds(objectCoords.x, objectCoords.y, objectCoords.z, Config.Text.LieOnBed .. ' ~g~' .. Anim .. '~w~ | ' .. Config.Text.SwitchBetween)
|
|
end
|
|
|
|
if IsControlJustPressed(0, Config.objects.ButtonToLayOnBed) then
|
|
TriggerServerEvent('ChairBedSystem:Server:Enter', oElement, oElement.fObjectCoords)
|
|
end
|
|
else
|
|
DrawText3Ds(objectCoords.x, objectCoords.y, objectCoords.z, Config.Text.SitOnChair)
|
|
if IsControlJustPressed(0, Config.objects.ButtonToSitOnChair) then
|
|
TriggerServerEvent('ChairBedSystem:Server:Enter', oElement, oElement.fObjectCoords)
|
|
end
|
|
end
|
|
end
|
|
|
|
if (InUse) then
|
|
DrawText3Ds(objectCoords.x, objectCoords.y, objectCoords.z, Config.Text.Standup)
|
|
if IsControlJustPressed(0, Config.objects.ButtonToStandUp) then
|
|
InUse = false
|
|
TriggerServerEvent('ChairBedSystem:Server:Leave', oElement.fObjectCoords)
|
|
ClearPedTasksImmediately(ply)
|
|
FreezeEntityPosition(ply, false)
|
|
|
|
local x, y, z = table.unpack(PlyLastPos)
|
|
if GetDistanceBetweenCoords(x, y, z, plyCoords) < 10 then
|
|
SetEntityCoords(ply, PlyLastPos)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Wait(0)
|
|
end
|
|
end)
|
|
|
|
-- Medium Thread
|
|
CreateThread(function()
|
|
while true do
|
|
plyCoords = GetEntityCoords(PlayerPedId())
|
|
Wait(1000)
|
|
end
|
|
end)
|
|
|
|
|
|
-- Slow Thread
|
|
CreateThread(function()
|
|
Wait(1500)
|
|
while true do
|
|
for _, element in pairs(Config.objects.locations) do
|
|
local closestObject = GetClosestObjectOfType(plyCoords.x, plyCoords.y, plyCoords.z, 3.0, GetHashKey(element.object), 0, 0, 0)
|
|
local coordsObject = GetEntityCoords(closestObject)
|
|
local distanceDiff = #(coordsObject - plyCoords)
|
|
--if (distanceDiff < 3.00 and closestObject ~= 0) then
|
|
--if (distanceDiff < 2.00) then
|
|
if (distanceDiff < 2.25 and closestObject ~= 0) then
|
|
if (distanceDiff < 2.00) then
|
|
oElement = {
|
|
fObject = closestObject,
|
|
fObjectCoords = coordsObject,
|
|
fObjectcX = element.verticalOffsetX,
|
|
fObjectcY = element.verticalOffsetY,
|
|
fObjectcZ = element.verticalOffsetZ,
|
|
fObjectDir = element.direction,
|
|
fObjectIsBed = element.bed
|
|
}
|
|
isWithinObject = true
|
|
end
|
|
break
|
|
else
|
|
isWithinObject = false
|
|
end
|
|
end
|
|
Wait(2000)
|
|
end
|
|
end)
|
|
|
|
|
|
-- Healing Thread
|
|
CreateThread(function()
|
|
while Config.Healing ~= 0 do
|
|
Wait(Config.Healing * 1000)
|
|
if InUse == true then
|
|
if oElement.fObjectIsBed == true then
|
|
local ply = PlayerPedId()
|
|
local health = GetEntityHealth(ply)
|
|
if health <= 199 then
|
|
SetEntityHealth(ply, health + 1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('ChairBedSystem:Client:Animation')
|
|
AddEventHandler('ChairBedSystem:Client:Animation', function(v, coords)
|
|
local object = v.fObject
|
|
local vertx = v.fObjectcX
|
|
local verty = v.fObjectcY
|
|
local vertz = v.fObjectcZ
|
|
local dir = v.fObjectDir
|
|
local isBed = v.fObjectIsBed
|
|
local objectcoords = coords
|
|
|
|
local ped = PlayerPedId()
|
|
PlyLastPos = GetEntityCoords(ped)
|
|
FreezeEntityPosition(object, true)
|
|
FreezeEntityPosition(ped, true)
|
|
InUse = true
|
|
if isBed == false then
|
|
if Config.objects.SitAnimation.dict ~= nil then
|
|
SetEntityCoords(ped, objectcoords.x, objectcoords.y, objectcoords.z + 0.5)
|
|
SetEntityHeading(ped, GetEntityHeading(object) - 180.0)
|
|
local dict = Config.objects.SitAnimation.dict
|
|
local anim = Config.objects.SitAnimation.anim
|
|
|
|
AnimLoadDict(dict, anim, ped)
|
|
else
|
|
TaskStartScenarioAtPosition(ped, Config.objects.SitAnimation.anim, objectcoords.x + vertx, objectcoords.y + verty, objectcoords.z - vertz, GetEntityHeading(object) + dir, 0, true, true)
|
|
end
|
|
else
|
|
if Anim == 'back' then
|
|
if Config.objects.BedBackAnimation.dict ~= nil then
|
|
SetEntityCoords(ped, objectcoords.x, objectcoords.y, objectcoords.z + 0.5)
|
|
SetEntityHeading(ped, GetEntityHeading(object) - 180.0)
|
|
local dict = Config.objects.BedBackAnimation.dict
|
|
local anim = Config.objects.BedBackAnimation.anim
|
|
|
|
Animation(dict, anim, ped)
|
|
else
|
|
TaskStartScenarioAtPosition(ped, Config.objects.BedBackAnimation.anim, objectcoords.x + vertx, objectcoords.y + verty, objectcoords.z - vertz, GetEntityHeading(object) + dir, 0, true, true
|
|
)
|
|
end
|
|
elseif Anim == 'stomach' then
|
|
if Config.objects.BedStomachAnimation.dict ~= nil then
|
|
SetEntityCoords(ped, objectcoords.x, objectcoords.y, objectcoords.z + 0.5)
|
|
SetEntityHeading(ped, GetEntityHeading(object) - 180.0)
|
|
local dict = Config.objects.BedStomachAnimation.dict
|
|
local anim = Config.objects.BedStomachAnimation.anim
|
|
|
|
Animation(dict, anim, ped)
|
|
else
|
|
TaskStartScenarioAtPosition(ped, Config.objects.BedStomachAnimation.anim, objectcoords.x + vertx, objectcoords.y + verty, objectcoords.z - vertz, GetEntityHeading(object) + dir, 0, true, true)
|
|
end
|
|
elseif Anim == 'sit' then
|
|
if Config.objects.BedSitAnimation.dict ~= nil then
|
|
SetEntityCoords(ped, objectcoords.x, objectcoords.y, objectcoords.z + 0.5)
|
|
SetEntityHeading(ped, GetEntityHeading(object) - 180.0)
|
|
local dict = Config.objects.BedSitAnimation.dict
|
|
local anim = Config.objects.BedSitAnimation.anim
|
|
|
|
Animation(dict, anim, ped)
|
|
else
|
|
TaskStartScenarioAtPosition(ped, Config.objects.BedSitAnimation.anim, objectcoords.x + vertx, objectcoords.y + verty, objectcoords.z - vertz, GetEntityHeading(object) + 180.0, 0, true, true)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
|
|
|
|
function DrawText3Ds(x, y, z, text)
|
|
local onScreen, _x, _y = World3dToScreen2d(x, y, z)
|
|
|
|
if onScreen then
|
|
SetTextScale(0.35, 0.35)
|
|
SetTextFont(4)
|
|
SetTextProportional(1)
|
|
SetTextColour(255, 255, 255, 215)
|
|
SetTextEntry("STRING")
|
|
SetTextCentre(1)
|
|
AddTextComponentString(text)
|
|
DrawText(_x, _y)
|
|
local factor = (string.len(text)) / 350
|
|
DrawRect(_x, _y + 0.0125, 0.015 + factor, 0.03, 41, 11, 41, 68)
|
|
end
|
|
end
|
|
|
|
function Animation(dict, anim, ped)
|
|
RequestAnimDict(dict)
|
|
while not HasAnimDictLoaded(dict) do
|
|
Citizen.Wait(0)
|
|
end
|
|
|
|
TaskPlayAnim(ped, dict, anim, 8.0, 1.0, -1, 1, 0, 0, 0, 0)
|
|
end
|