mirror of
https://github.com/jimathy/jim_bridge.git
synced 2026-08-17 14:06:02 +01:00
116 lines
4.0 KiB
Lua
116 lines
4.0 KiB
Lua
local Props = {}
|
|
local distProps = {}
|
|
|
|
--- Creates a prop (object) in the game world at specified coordinates.
|
|
---
|
|
--- This function loads the model, creates the object, sets its heading, and freezes it if specified.
|
|
---
|
|
---@param data table A table containing prop data.
|
|
--- - **prop** `string`: The model name or hash of the prop to create.
|
|
--- - **coords** `vector4`: The coordinates where the prop will be placed. Should include x, y, z, and w (heading).
|
|
---@param freeze boolean (optional) Whether to freeze the prop in place. Defaults to `false`.
|
|
---@param synced boolean (optional) Whether the prop should be synced across clients. Defaults to `false`.
|
|
---
|
|
---@return number entityID The handle of the created prop object.
|
|
---
|
|
---@usage
|
|
--- ```lua
|
|
--- local propData = {
|
|
--- prop = 'prop_chair_01a',
|
|
--- coords = vector4(123.4, 567.8, 90.1, 180.0)
|
|
--- }
|
|
--- local prop = makeProp(propData, true, false)
|
|
--- ```
|
|
function makeProp(data, freeze, synced, fade)
|
|
loadModel(data.prop)
|
|
local prop = CreateObject(data.prop, data.coords.x, data.coords.y, data.coords.z-1.03, synced and synced or false, synced and synced or false, false)
|
|
SetEntityAlpha(veh, 0, false)
|
|
SetEntityHeading(prop, (data.coords.w or 0) + 180.0)
|
|
FreezeEntityPosition(prop, freeze or false)
|
|
|
|
debugPrint("^6Bridge^7: ^1Prop ^2Created^7: '^6"..prop.."^7' | ^2Hash^7: ^7'^6"..data.prop.."^7' | ^2Coord^7: "..formatCoord(data.coords))
|
|
SetModelAsNoLongerNeeded(data.prop)
|
|
Props[keyGen()..keyGen()] = prop
|
|
if fade ~= false then
|
|
CreateThread(function()
|
|
fadeInEnt(prop)
|
|
end)
|
|
end
|
|
return prop
|
|
end
|
|
|
|
--- Creates a prop that appears when the player is within a certain distance.
|
|
---
|
|
--- This function sets up a proximity area, and when the player enters it, the prop is created.
|
|
--- When the player exits the area, the prop is destroyed.
|
|
---
|
|
---@param data table A table containing prop data.
|
|
--- - **prop** `string`: The model name or hash of the prop to create.
|
|
--- - **coords** `vector4`: The coordinates where the prop will be placed. Should include x, y, z, and w (heading).
|
|
---@param freeze boolean (optional) Whether to freeze the prop in place. Defaults to `false`.
|
|
---@param synced boolean (optional) Whether the prop should be synced across clients. Defaults to `false`.
|
|
---
|
|
---@usage
|
|
--- ```lua
|
|
--- local propData = {
|
|
--- prop = 'prop_chair_01a',
|
|
--- coords = vector4(123.4, 567.8, 90.1, 180.0)
|
|
--- }
|
|
--- makeDistProp(propData, true, false)
|
|
--- ```
|
|
function makeDistProp(data, freeze, synced, range, func)
|
|
local name = keyGen()..keyGen()
|
|
distProps[#distProps + 1] = createCirclePoly({
|
|
name = name,
|
|
coords = vec3(data.coords.x, data.coords.y, data.coords.z - 1.03),
|
|
radius = range or 50.0,
|
|
onEnter = function()
|
|
Props[name] = makeProp(data, freeze, synced)
|
|
if func then
|
|
func(Props[name])
|
|
end
|
|
end,
|
|
onExit = function()
|
|
destroyProp(Props[name])
|
|
Props[name] = nil
|
|
end,
|
|
debug = debugMode,
|
|
})
|
|
end
|
|
|
|
--- Destroys a prop, detaching it if attached to the player beforehand.
|
|
---
|
|
---@param entity number The handle of the prop entity to destroy.
|
|
---
|
|
---@usage
|
|
--- ```lua
|
|
--- destroyProp(prop)
|
|
--- ```
|
|
function destroyProp(entity)
|
|
if entity then
|
|
debugPrint("^6Bridge^7: ^2Destroying Prop^7: '^6"..entity.."^7'")
|
|
if IsEntityAttachedToEntity(entity, PlayerPedId()) then
|
|
SetEntityAsMissionEntity(entity)
|
|
DetachEntity(entity, true, true)
|
|
end
|
|
DeleteObject(entity)
|
|
end
|
|
end
|
|
|
|
onPlayerUnloaded(function()
|
|
for k in pairs(Props) do
|
|
DeleteObject(Props[k])
|
|
end
|
|
for i = 1, #distProps do
|
|
removeZoneTarget(distProps[i])
|
|
end
|
|
distProps = {}
|
|
end)
|
|
|
|
--- Cleans up all created props when the resource stops.
|
|
onResourceStop(function()
|
|
for k in pairs(Props) do
|
|
destroyProp(Props[k])
|
|
end
|
|
end, true)
|