Luau plugins and Throwdown modes
ReSkate 2.1.2 prerelease introduces sandboxed Luau plugins. A plugin is an enabled mod folder with
reskate-plugin.json beside manifest.json, scripts and optional assets. Each plugin has its own VM, globals
and session-long lifetime, rather than a VM per level. Sourced · ReSkate
Manifest and discovery
Section titled “Manifest and discovery”| Field | Meaning | Confidence |
|---|---|---|
api |
API version, currently 1; newer versions are refused | Sourced · ReSkate |
entry |
Relative printable-ASCII .lua/.luau path; module lookup starts in its folder |
Sourced · ReSkate |
side |
client by default, server or both |
Sourced · ReSkate |
permissions |
Named capabilities; unknown names are refused | Sourced · ReSkate |
domains |
Allowed HTTP hosts | Sourced · ReSkate |
content |
Other mod content made readable through declared access | Sourced · ReSkate |
variants |
Folder/order/displacement metadata | Sourced · ReSkate |
resident |
Bundle roots/shaders retained across replacement by map mods | Sourced · ReSkate |
The manifest is at most 64 KB and eight levels deep; unknown fields are ignored. Discovery runs every two seconds. Changed files cause unload/reload once the game window has focus; disabling the mod unloads it. An unreadable mods.json loads no plugins. Sourced · ReSkate
The scan refuses more than 20,000 files, executable/script-launcher extensions such as DLL, EXE, JS and PS1,
and files beginning MZ. The sandbox has no unrestricted io, os.execute, dynamic loader or bytecode loading;
module/package reads remain inside the package. Sourced · ReSkate
level_loaded/level_unloading events describe transitions. A plugin loaded after a level is active does not
receive a retroactive level_loaded event; level.current() supplies the current name. Plugin-created entities
are removed at level change even though the VM survives. Sourced · ReSkate
Capabilities and budgets
Section titled “Capabilities and budgets”The API exposes skater telemetry and controls, physics tuning, animation, camera, drawing, menus, package data,
storage, audio, session messaging and native Throwdown UI. entities.set places only already-loaded blueprints;
it is local to the client. Raycasts see streamed collision near the player. Sourced · ReSkate
No API in the inspected 2.1.2 registration tables loads arbitrary meshes, textures, shaders or material parameters,
reads raw game memory, enumerates level objects, creates trigger volumes, reads ToD or directly sets lights.
world.set_time changes a supported preset; it does not expose a general environment-editing interface.
Sourced · ReSkate
| Budget | Limit | Confidence |
|---|---|---|
| Heap | 64 MB per VM | Sourced · ReSkate |
| Single call | 50 ms | Sourced · ReSkate |
| Average work | 2 ms/tick, assessed over three one-second windows | Sourced · ReSkate |
| Error stop | More than five uncaught errors in ten seconds | Sourced · ReSkate |
| Logs | 50 lines/s | Sourced · ReSkate |
| Timers | 1,024 | Sourced · ReSkate |
| Package read | 16 MB/file | Sourced · ReSkate |
| Writable files | 1 MB/file, 1,000 files | Sourced · ReSkate |
| Storage | 1 MB | Sourced · ReSkate |
| Session message | 4,082 bytes, 16 KB/s per plugin | Sourced · ReSkate |
A stopped plugin loses its entities, modes, documents, flag and held controls. File change or plugin on can
restart it. Plugin-to-plugin exports/events copy JSON rather than sharing VM memory. Sourced · ReSkate
Throwdown lifecycle
Section titled “Throwdown lifecycle”All plugins share a maximum of 32 registered modes, ordered by the mode’s order. Only one plugin HUD displays
at a time. UI events precede tick handlers in each tick. Sourced · ReSkate
| Phase | Input and state | Confidence |
|---|---|---|
| Setup | Mode card emits open; plugin publishes setup rows |
Sourced · ReSkate |
| Placing | setup_confirm enters native flag placement |
Sourced · ReSkate |
| Waiting | flag_placed; waiting card or active HUD required within 15 s |
Sourced · ReSkate |
| Playing | start; plugin publishes match/HUD state |
Sourced · ReSkate |
| Results | Results document replaces the remaining HUD | Sourced · ReSkate |
| Leave | Plugin stops publishing and calls flag.leave(); that call does not emit flag_left back to itself |
Sourced · ReSkate |
Countdown, clock, card, callout, banner and world markers use stock native widgets. Other themed slots resolve
native bundled assets named UI/ReSkate/Throwdowns/HUD_<theme>_<part>_Widget; missing widgets leave their slots
empty. An overlay draw handler can instead draw package images and world labels without those bundles.
Sourced · ReSkate
A both plugin has separate client and authority VMs on a lobby host. Dedicated-server plugins live in
Plugins beside ReSkateServer.exe and have no local skater/draw API. Session messages identify senders; only
from.server identifies authority. The server receives reported trick scores through client messages rather
than independently observing skater tricks. Sourced · ReSkate
During a Throwdown, wipeout, animation.play and tricks.record_as are refused; velocity/cruise controls require stock competition physics. Native UI presence does not remove these control restrictions. Sourced · ReSkate