Scripts/resources/[ps]/ps-housing/client/shell.lua
2024-12-29 21:28:24 +01:00

130 lines
3.3 KiB
Lua

Shells = {}
Shell = {
entity = nil,
hash = nil,
position = nil,
rotation = nil,
shellData = nil,
oldCoord = nil,
exitTarget = nil,
}
Shell.__index = Shell
function Shell:SpawnShell(shellHash, position, rotation)
lib.requestModel(shellHash)
local entity = CreateObjectNoOffset(shellHash, position.x, position.y, position.z, false, false, false)
FreezeEntityPosition(entity, true)
SetEntityRotation(entity, rotation, 2, true)
SetModelAsNoLongerNeeded(shellHash)
return entity
end
function Shell:DespawnShell()
if DoesEntityExist(self.entity) then
DeleteEntity(self.entity)
end
if self.exitTarget then
Framework[Config.Target].RemoveTargetZone(self.exitTarget)
end
self = nil
end
function Shell:CreatePropertyShell(shellName, position, rotation)
local self = setmetatable({}, Shell)
self.shellData = Config.Shells[shellName]
self.hash = self.shellData.hash
self.position = position
self.rotation = rotation or vector3(0.0, 0.0, 0.0)
self.entity = self:SpawnShell(self.hash, self.position, self.rotation)
return self
end
-- example of how to use
-- exports["ps-housing"]:CreateTempShell("Modern Hotel", GetEntityCoords(PlayerPedId()), GetEntityRotation(PlayerPedId()), function()
-- Framework[Config.Notify].Notify("You left the shell", "error")
-- local coords = GetEntityCoords(PlayerPedId())
-- SetEntityCoordsNoOffset(PlayerPedId(), coords.x, coords.y, coords.z + 50.0, false, false, true)
-- end)
-- this is used as a constructor for third party scripts
function Shell:CreateTempShell(shellName, position, rotation, leaveCb)
local self = setmetatable({}, Shell)
self.shellData = Config.Shells[shellName]
self.hash = self.shellData.hash
self.position = position
self.rotation = rotation
DoScreenFadeOut(250)
Wait(250)
self.oldCoord = GetEntityCoords(PlayerPedId())
self.entity = self:SpawnShell(self.hash, self.position, self.rotation)
local doorOffset = self.shellData.doorOffset
local offset = GetOffsetFromEntityInWorldCoords(self.entity, doorOffset.x, doorOffset.y, doorOffset.z)
SetEntityCoordsNoOffset(cache.ped, offset.x, offset.y, offset.z, false, false, true)
SetEntityHeading(cache.ped, self.shellData.doorOffset.h)
local coords = offset
local size = vector3(1.0, self.shellData.doorOffset.width, 3.0)
local heading = self.shellData.doorOffset.h
local function leave()
DoScreenFadeOut(250)
Wait(250)
SetEntityCoordsNoOffset(PlayerPedId(), self.oldCoord.x, self.oldCoord.y, self.oldCoord.z, false, false, true)
if leaveCb then
leaveCb()
end
self:DespawnShell()
Wait(250)
DoScreenFadeIn(250)
end
self.exitTarget = Framework[Config.Target].AddDoorZoneInsideTempShell(coords, size, heading, leave)
Wait(250)
DoScreenFadeIn(250)
Shells[self.entity] = self
return self.entity
end
exports('CreateTempShell', function(shellName, position, rotation, leaveCb)
return Shell:CreateTempShell(shellName, position, rotation, leaveCb)
end)
exports("GetShellData", function (shellName)
return Config.Shells[shellName]
end)
exports("DespawnTempShell", function (shellEntity)
if Shells[shellEntity] then
Shells[shellEntity]:DespawnShell()
end
end)