local points = {} local insidePoints = {} local insideCount = 0 local closestPoint local DrawLine = DrawLine local thread = false local function DebugPoint(coords, radius, color) local startPoint = coords + vec3(0.0, 0.0, 4.0) local endPoint = coords - vec3(0.0, 0.0, -0.01) DrawLine(startPoint.x, startPoint.y, startPoint.z, endPoint.x, endPoint.y, endPoint.z, 255, 42, 24, 255) DrawMarker(28, endPoint.x, endPoint.y, endPoint.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, radius, radius, radius, color.x, color.y, color.z, 48, false, false, 2, nil, nil, false) DrawMarker(25, endPoint.x, endPoint.y, endPoint.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 255, 42, 24, 48, false, false, 2, nil, nil, false) end CreateThread(function() while true do local sleep = 300 if insideCount ~= 0 then table.wipe(insidePoints) insideCount = 0 end local coords = GetEntityCoords(Cache.Ped) if closestPoint and #(coords - closestPoint.coords) > closestPoint.distance then closestPoint = nil end for _, point in pairs(points) do local distance = #(coords - point.coords) if point.debug then DebugPoint(point.coords, point.distance, point.isinside and vec3(114, 204, 114) or vec3(255, 42, 24)) sleep = 0 end if distance <= point.distance then point.currentDistance = distance if closestPoint then if distance < closestPoint.currentDistance then closestPoint.isClosest = nil point.isClosest = true closestPoint = point end elseif distance < point.distance then point.isClosest = true closestPoint = point end if point.inside then insideCount += 1 insidePoints[insideCount] = point end if point.onEnter and not point.isinside then point.isinside = true point:onEnter() end elseif point.currentDistance then if point.onExit then point:onExit() end point.isinside = nil point.currentDistance = nil end end if not thread then if insideCount ~= 0 then thread = true CreateThread(function() while insideCount ~= 0 do for i = 1, insideCount do local point = insidePoints[i] if point then point:inside() end end Wait(100) end end) end elseif insideCount == 0 then thread = false end Wait(sleep) end end) Points = { New = function(data) local point = { id = #points + 1 } points[point.id] = point for key, value in pairs(data) do point[key] = value end point.remove = function() Points.Remove(point.id) end if data.onEnter then point.onEnter = function() data.onEnter(point) end end if data.onExit then point.onExit = function() data.onExit(point) end end if data.inside then point.inside = function() data.inside(point) end end return point end, Remove = function(id) if not points[id] then return end if closestPoint?.id == id then closestPoint = nil end points[id].onExit() points[id] = nil end }