Trace documentationRoblox moderation & administration

Movement Zones - Authorize Areas in Your Game World

Register Workspace parts or models as movement zones. Players inside the zone are automatically exempt from selected anticheat checks.

Movement zones let you define persistent areas in your Workspace where players automatically receive movement exceptions while they are inside. You register a BasePart or Model once - at startup or whenever the feature initializes - and Trace handles the per-player exemption logic for you. As soon as a player enters the zone, the configured checks are suspended; as soon as they leave, the exceptions are removed. You do not need to track players yourself.

Common use cases include launch pads, speed booster pads, vehicle tracks, conveyor belts, and any scripted area where the anticheat would otherwise detect elevated speed or unexpected position changes.


RegisterMovementZone

Register a Workspace part or model as a movement zone.

Signature

Trace.RegisterMovementZone(partOrModel, options) -> zoneId?, error?

Parameters

partOrModelBasePart | Modelrequired

The part or model in Workspace that defines the zone boundary. Zone detection uses the oriented bounding box of the instance, so rotated parts and models work correctly without any extra configuration. For Model instances, Trace uses the complete model bounding box.

optionstablerequired

Configuration for the zone. All fields within the table are optional.

options.Idstring?

A stable identifier for the zone. Use this to reference the zone later with SetMovementZoneEnabled, UnregisterMovementZone, or other management calls. If omitted, Trace generates a unique ID automatically and returns it.

options.Reasonstring?

A human-readable description of the zone. Written to Trace's moderation logs.

options.Checks{string}?

The anticheat checks to suspend for players inside the zone. Valid values are "Teleport", "Velocity", "Fling", "Fly", and "Noclip". Omit to suspend all five checks.

options.GraceAfterExitnumber?

Seconds to keep exceptions active after a player leaves the zone boundary. Use this for launch pads or any zone where the movement effect (an upward velocity, for example) continues after the player is physically outside the area.

options.Paddingnumber?

Studs to expand every side of the zone bounding box. Useful when the visible part is slightly smaller than the area you want to protect, or to give players a small buffer near the edges.

Returns

string?

The identifier for the registered zone - either the Id you provided or a generated one. Store this value if you need to manage the zone later. Returns nil on failure.

string?

A description of what went wrong. Only present when zoneId is nil.

Example

local zoneId = Trace.RegisterMovementZone(workspace.LaunchPad, {
    Id = "launch-pad",
    Reason = "Launch pad area",
    Checks = {"Velocity", "Fling", "Fly"},
    GraceAfterExit = 2,
    Padding = 3,
})

Zone management functions

SetMovementZoneEnabled

Temporarily disable or re-enable a zone without unregistering it. Disabled zones do not grant exceptions to players inside them.

Signature

Trace.SetMovementZoneEnabled(zoneIdOrInstance, enabled) -> boolean

Parameters

zoneIdOrInstancestring | BasePart | Modelrequired

The zone to target. Pass the zoneId string returned by RegisterMovementZone, or the original BasePart or Model instance used when the zone was registered.

enabledbooleanrequired

true to enable the zone; false to disable it.

Returns

boolean

true if the zone was found and its state updated successfully.

Example

Trace.SetMovementZoneEnabled(zoneId, false)  -- disable during downtime
Trace.SetMovementZoneEnabled(zoneId, true)   -- re-enable when ready

UnregisterMovementZone

Permanently remove a zone. Players currently inside the zone immediately lose their zone-based exceptions.

Signature

Trace.UnregisterMovementZone(zoneIdOrInstance) -> boolean

Parameters

zoneIdOrInstancestring | BasePart | Modelrequired

The zone to remove. Pass the zoneId string returned by RegisterMovementZone, or the original BasePart or Model instance used when the zone was registered.

Returns

boolean

true if the zone was found and successfully removed.

Example

Trace.UnregisterMovementZone(zoneId)

GetMovementZones

Return a list of summaries for all currently registered zones. Useful for debugging or building admin tooling.

Signature

Trace.GetMovementZones() -> zone summaries

Returns

{table}

An array of zone summary tables, one entry per registered zone. Each summary includes at minimum the zone's Id and Enabled state.

Example

local zones = Trace.GetMovementZones()
for _, zone in zones do
    print(zone.Id, zone.Enabled)
end