130 lines
3.3 KiB
Lua
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)
|