local Zones = {}
local insideZones = {}

Citizen.CreateThread(function()
    while true do
        local plyPed = PlayerPedId()
        local coord = GetEntityCoords(plyPed)

        Citizen.Wait(500)

        for _, zone in pairs(Zones) do
            if Zones[_]:isPointInside(coord) then
                if (not insideZones[_]) then
                    insideZones[_] = true
                    local insideZone = true
                    Citizen.CreateThread(function()
                        TriggerEvent("bt-polyzone:enter", _)
                        while insideZone do
                            local plyPed = PlayerPedId()
                            local InZoneCoordS = GetEntityCoords(plyPed)
        
                            if not Zones[_]:isPointInside(InZoneCoordS) then 
                                insideZone = false
                                insideZones[_] = false
                                TriggerEvent("bt-polyzone:exit", _)
                            end
                            Citizen.Wait(250)
                        end
                    end)
                end
            end
        end
    end
end)

function AddCircleZone(name, center, radius, options)
    center = vector3(center.x, center.y, center.z)
    Zones[name] = CircleZone:Create(center, radius, options)
end

function AddBoxZone(name, center, length, width, options)
    center = vector3(center.x, center.y, center.z)
    Zones[name] = BoxZone:Create(center, length, width, options)
end

function AddPolyZone(name, points, options)
    Zones[name] = PolyZone:Create(points, options)
end