Example
Friend Zone / Proximity
Server zone detection loop pushes enter/exit events reliably. Client fetches nearby players on demand.
local zones = { spawn = { center=Vector3.new(0,0,0), radius=30 } }
local playerZone = {}
app:Get("zone/:name/players", function(Player, Payload, req, res)
if not zones[req.params.name] then res:Status(404):Error("Unknown zone"); return end
local inside = {}
for uid, z in pairs(playerZone) do
if z == req.params.name then table.insert(inside, game.Players:GetPlayerByUserId(uid).Name) end
end
res:Send({ players = inside })
end)
task.spawn(function()
while true do
task.wait(2)
for _, player in ipairs(game.Players:GetPlayers()) do
local char = player.Character; if not char then continue end
local pos = char:GetPivot().Position
local prev = playerZone[player.UserId]; local curr = nil
for name, zone in pairs(zones) do
if (pos - zone.center).Magnitude <= zone.radius then curr = name; break end
end
if curr ~= prev then
playerZone[player.UserId] = curr
if curr then app:Push(player, "zone.enter", { zone=curr })
elseif prev then app:Push(player, "zone.exit", { zone=prev }) end
end
end
end
end)
See also
App | push per player · Server Push · Router | named string param · Listener | client-side zone events