1
0
Fork 0
forked from Simnation/Main
Main/resources/[Developer]/[Anna]/ngd-Bridge/zone/polyzone/client.lua
2025-06-07 08:51:21 +02:00

185 lines
No EOL
5.1 KiB
Lua

module 'shared/debug'
module 'shared/resource'
include(Bridge.ZoneName, 'client')
include(Bridge.ZoneName, 'BoxZone')
include(Bridge.ZoneName, 'CircleZone')
Version = resource.version(Bridge.ZoneName)
Bridge.Debug('Zone', Bridge.ZoneName, Version)
local Zones = 0
Zone.PolyZone = function(data)
local id = Zones + 1
data.id = id
local points = {}
local z = 0
for pos, coords in ipairs(data.points) do
points[pos] = vec2(coords.x, coords.y)
z = z + coords.z
end
if not data.height then data.height = 4 end
local zone = PolyZone:Create(points, {
name = Bridge.Resource .. id,
minZ = (z / #points) - (data.height / 2),
maxZ = (z / #points) + (data.height / 2),
debugPoly = data.debug,
})
data.coords = function()
local center = zone:getBoundingBoxCenter()
return vec3(center.x, center.y, (z / #points))
end
data.distance = function()
return #(data.coords() - GetEntityCoords(PlayerPedId()))
end
data.remove = function()
zone:destroy()
end
data.contains = function(coord)
return zone:isPointInside(coord)
end
if data.onEnter or data.onExit or data.inside then
local inside = false
zone:onPlayerInOut(function(isPointInside, point)
if isPointInside and data.onEnter then
data.onEnter(data)
end
if not isPointInside and data.onExit then
data.onExit(data)
end
if data.inside and not inside and isPointInside then
inside = true
CreateThread(function()
while inside do
data.inside(data)
Wait(100)
end
end)
elseif data.inside and inside and not isPointInside then
inside = false
end
end)
end
return data
end
Zone.BoxZone = function(data)
local id = Zones + 1
data.id = id
if not data.size then data.size = vector3(4, 4, 4) end
if not data.rotation then data.rotation = 0 end
local zone = BoxZone:Create(data.coords, data.size.y, data.size.x, {
name = Bridge.Resource .. id,
minZ = (data.coords.z - (data.size.z / 2)),
maxZ = (data.coords.z + (data.size.z / 2)),
heading = data.rotation,
debugPoly = data.debug,
})
data.coords = function()
return zone:getBoundingBoxCenter()
end
data.distance = function()
return #(data.coords() - GetEntityCoords(PlayerPedId()))
end
data.remove = function()
zone:destroy()
end
data.contains = function(coord)
return zone:isPointInside(coord)
end
if data.onEnter or data.onExit or data.inside then
local inside = false
zone:onPlayerInOut(function(isPointInside, point)
if isPointInside and data.onEnter then
data.onEnter(data)
end
if not isPointInside and data.onExit then
data.onExit(data)
end
if data.inside and not inside and isPointInside then
inside = true
CreateThread(function()
while inside do
data.inside(data)
Wait(100)
end
end)
elseif data.inside and inside and not isPointInside then
inside = false
end
end)
end
return data
end
Zone.SphereZone = function(data)
local id = Zones + 1
data.id = id
if not data.radius then data.radius = 2 end
local zone = CircleZone:Create(data.coords, data.radius, {
name = Bridge.Resource .. id,
useZ = true,
debugPoly = data.debug,
})
data.coords = function()
return zone:getBoundingBoxCenter()
end
data.distance = function()
return #(data.coords() - GetEntityCoords(PlayerPedId()))
end
data.remove = function()
zone:destroy()
end
data.contains = function(coord)
return zone:isPointInside(coord)
end
if data.onEnter or data.onExit or data.inside then
local inside = false
zone:onPlayerInOut(function(isPointInside, point)
if isPointInside and data.onEnter then
data.onEnter(data)
end
if not isPointInside and data.onExit then
data.onExit(data)
end
if data.inside and not inside and isPointInside then
inside = true
CreateThread(function()
while inside do
data.inside(data)
Wait(100)
end
end)
elseif data.inside and inside and not isPointInside then
inside = false
end
end)
end
return data
end