Scripting changelog

What changed in the scripting API, newest first.

2026-10-04: animations, and Studz spellings for Roblox's

  • Animator. character.Animator (also on a rig and its Humanoid) plays the clips the character model ships, Run and Jump: animator:Play(clip, { Speed, Weight, Loop, Limbs, Fade, Start }) returns a track with Speed, Weight, Loop, Time, Pause, Resume, Stop(fade), Finished and Await. Tracks play on the limbs you pick and blend over each other and over the built-in animation. animator.Locomotion = false turns the automatic run and jump animation off, and animator.LocomotionSpeed changes how fast it plays. At most four tracks play at once. A respawn interrupts them. Everyone sees them: the server sends what is playing, and each client keeps its own clock. See Animations and the examples.
  • :ResetLimbs() removes poses only and leaves playing clips alone. :ResetAppearance() clears poses and clips.
  • Roblox spellings are deprecated in favour of Studz ones. Every old spelling still works, gives the same result and prints one warning that names the replacement. Lowercase and snake_case forms of them (getChildren, walkSpeed) point at the new name too. The full list is in Roblox compatibility. In short:
    • Finding things: FindFirstChild is now FindChild, FindFirstChildOfClass and FindFirstChildWhichIsA are FindChildOfClass, FindFirstAncestor(OfClass/WhichIsA) are FindAncestor and FindAncestorOfClass, GetChildren is Children, GetDescendants is Descendants, GetFullName is FullName, WaitForChild is AwaitChild.
    • Players: GetPlayers is List, GetPlayerByName is FindByName, GetPlayerByUserId is FindById, GetPlayerFromCharacter is FromCharacter, LoadCharacter is Respawn, TakeDamage is Damage, WalkSpeed is Speed, JumpPower is JumpForce.
    • Events: signal:Connect is signal:On, connection:Disconnect is :Off, connection.Connected is .Active, RunService.Heartbeat is Frame, RenderStepped is Draw, a button's MouseButton1Click and Activated are Clicked.
    • Remotes: FireServer is ToServer, FireClient is ToPlayer, FireAllClients is ToAll, OnServerEvent is FromClient, OnClientEvent is FromServer, InvokeServer is CallServer, OnServerInvoke is OnServerCall.
    • Properties: sounds use Speed, Loop and MaxDistance (not PlaybackSpeed, Looped, RollOffMaxDistance), parts use LinearVelocity, AngularVelocity and SurfaceVelocity (not AssemblyLinearVelocity, AssemblyAngularVelocity and Velocity, which was never a physical velocity here), interface elements use TextColor, BackgroundColor, BorderColor, BorderWidth, ShadowColor and ShadowTransparency (not the ...3 and Stroke forms), and anything with a colour uses Color rather than Color3.
    • Other: game:GetService is game:Service, task.delay is task.after, and Debris:AddItem(inst, seconds) is inst:DestroyAfter(seconds).
  • New: inst:DestroyAfter(seconds).
  • Error messages and "did you mean" hints use the Studz spellings.
  • Protocol 13: player states in snapshots carry what is playing. Clients and servers must update together.
  • Polycarbonate: autocomplete and the API reference list the Studz names and the animation members.

2026-10-03: welds and posable limbs

  • Welds. New classes WeldConstraint and Weld with Part0, Part1, C0, C1 and Enabled: Part1 is held at Part0 * C0 * C1:Inverse() and follows Part0 wherever it goes (a script moving it, physics rolling it, another weld carrying it). A WeldConstraint records the offset the parts have when both are set. Also part:WeldTo(other) and part:BreakWelds(). Welds work in chains, hold unanchored parts (they are anchored while held) and move the part's collision with it. See Welds.
  • Parts welded in Polycarbonate follow now. The Weld tool and the Weld to property only took effect when the place was built, so a script that moved a part left its welded children behind. They follow like any other weld.
  • Posable limbs. character.Head, .Torso, .LeftArm, .RightArm, .LeftLeg and .RightLeg (before only Head, Torso and HumanoidRootPart existed, and all three just meant "the player") accept Transform (a CFrame turn and shift about the joint, drawn on top of the built-in animation), Scale, Size, Visible, Transparency, Color and Color3. Everyone sees the poses. limb.CFrame / Position / Orientation now give the limb's real place in the world, and assigning them poses the limb there. :ResetLimbs() clears them (also on ResetAppearance, and when the character dies). See Limbs.
  • Rigs have the same limbs: rig.Head, rig.RightArm and so on, stored with the rig and replicated with it. rig.Humanoid:ResetLimbs() clears them.
  • A weld can follow a limb: part:WeldTo(character.Head) or weld.Part0 = character.RightArm. The part follows the character and any pose given to that limb.
  • character:GetChildren() lists all six limbs, and the Roblox spellings (character["Left Arm"]) find them.
  • Protocol 12: player states in snapshots carry limb poses (one byte when nothing is posed). Clients and servers must update together.
  • Polycarbonate: the new members and methods in autocomplete and the API reference, the weld and wave snippets, and the Wave Pad and Hat Pad templates.

2026-10-03: humanoid rigs (NPCs)

  • Rigs are drawn in the real client and in playtests (they only had collision before), with a nametag, and animate when they walk.
  • A rig is its own character: rig.Humanoid, rig:FindFirstChildOfClass("Humanoid"), rig.HumanoidRootPart and humanoid.Parent. A rig part can be moved, recoloured and so on like any part.
  • Own stats: Health, MaxHealth, WalkSpeed, JumpPower and DisplayName per rig (before they read the player's). Also :TakeDamage, :Heal([amount]), :Kill() and :LoadCharacter() (revives in place).
  • New on rig Humanoids: :MoveTo(position), :Stop(), :LookAt(position or part), .IsMoving, .RootPart, and the signals MoveToFinished(reached), HealthChanged(health) and a per-rig Died.
  • A dead rig disappears and stops blocking the way. A moving rig takes its collision with it.
  • Polycarbonate: rig stats in the Properties panel, the new members in autocomplete and the API reference, and a rigpatrol snippet.

2026-10-02: data stores

  • DataStoreService (numbers only): GetDataStore(name), GetAsync, SetAsync, IncrementAsync, RemoveAsync. Keys are strings, numbers or players. Saved by the website, and kept in memory in Polycarbonate.
  • leaderstats numbers are loaded and saved automatically (autosave every 30 s, on leave and on shutdown). A failed load never overwrites saved data. Players:SetStatsSaving(false) opts out.
  • A leaving player's leaderstats and other objects parented to them are removed instead of piling up on the server.
  • Fixed: cylinders were drawn with their walls facing inwards.

2026-10-02: API cleanup

  • One official spelling per member. About 150 duplicate method registrations (lowercase, camelCase, snake_case, find, the old "native" shorthand) were removed. They now resolve through a deprecation layer that warns once and forwards to the official spelling. Property aliases (pos, solid, Speed, ...) are resolved the same way.
  • Members are checked per kind of object. A member of another kind (part.Health), a typo, a value of the wrong type and non-finite numbers are errors with suggestions. Plain tables are still accepted where a Vector3, UDim2 or Color3 is expected, with a warning.
  • New: part.PlayerTouched, part.PlayerTouchEnded, part.Clicked, Instance.Create, inst:GetChild, inst:TweenTo, tween:Await, Players:ForEachPlayer, player:ForEachCharacter, remote:Listen, signal:Once, task.after, task.every, task.debounce, player:Tell, the instance events Changed, GetPropertyChangedSignal, ChildAdded, ChildRemoved, DescendantAdded and Destroying, plus math.lerp, table.clone and table.clear.
  • Destroying is thorough. Destroy and ClearAllChildren remove descendants (before, grandchildren of a destroyed part stayed in the world as orphans) and forget tags, attributes and listeners. Clone copies the subtree and keeps the name. Parent = nil destroys.
  • Buttons. A TextButton's click is a real signal: Connect returns a connection, and on_click no longer registers its handler twice. Changed on value objects passes the new value.
  • Resource limits. Lua memory is 64 MB on the server and 48 MB on a client (was 256 MB and 128 MB; the server's limit was never applied below 256). Also 20,000 objects, 500 GUI elements, 500 handlers per signal, and output capped at 2,000 lines. Tween records are freed when unused (they leaked before).
  • Templates and Polycarbonate autocomplete use the official API.

2026-10-02: reliability pass

  • The per-event time limit now covers every coroutine. Before, only code on the main Lua thread was cut off. Script main chunks and event handlers run in coroutines, so while true do end in a Script was not stopped.
  • task.wait works in Heartbeat, RenderStepped and GUI click handlers.
  • signal:Wait() and InvokeServer park the thread instead of resuming it on the next step with a bogus value.
  • Handlers of a signal run in connect order.
  • Tweens honour RepeatCount, Reverses and DelayTime. Added the Quart, Quint, Exponential, Circular, Back and Elastic styles. Fixed Cubic. Cancel fires Completed("Cancelled"). :Play() restarts a finished tween. Added the PlaybackState property.
  • Script errors are reported under the script's name and line.
  • GUI element ids are never reused after a destroy.