๐Ÿ”ด SIM LOCKDOWN ยท Episode 3 of 3 ยท See All Episodes
๐Ÿ”ด Episode 3 ยท Advanced ยท The finale

SIM LOCKDOWN
Shove, Cull & the Final

Now it becomes a real party game. Give everyone a knockback gauntlet, cut players who fall behind, then drop the survivors into a shrinking arena for a last-one-standing final. Push people off the map, that is the whole point.

๐Ÿง’ Ages 9+ โฑ๏ธ ~1.5 Hours ๐ŸŸฆ Roblox Studio โœ“ Free
๐ŸฅŠ Tools ๐ŸŽฏ Knockback ๐Ÿ“Š Ranking ๐ŸŸ๏ธ Shrinking arena ๐Ÿ† Win conditions
โญ
0 XP
Level 1
๐Ÿ”ฅ0
Your Progress 0 / 6 steps
๐ŸฆŠ
Lumo says: this is the most advanced episode. Take it slowly. Everything here runs on the server, because the server is the referee and players cannot be trusted to be fair to each other.
1
๐ŸฅŠ
Hand Out the Gauntlet
A Tool every player holds, with a glowing Handle
Active
๐ŸŽฏ
Goal for this step

A tool called the Glitch Gauntlet, given to every player when a round begins.

  • 1A Tool is a held item in Roblox. It needs a child part called exactly Handle.
  • 2When the player clicks or taps the tool, the Activated event fires. That is our shove.
  • 3We build the tool in code on the server and put it in the player's Backpack.
ObbyServer (Script)
local function giveGauntlet(player) local backpack = player:FindFirstChildOfClass("Backpack") if not backpack then return end local tool = Instance.new("Tool") tool.Name = "Glitch Gauntlet" local handle = Instance.new("Part") handle.Name = "Handle" handle.Size = Vector3.new(1.2, 1.2, 1.6) handle.Color = Color3.fromRGB(255, 60, 90) handle.Material = Enum.Material.Neon handle.Parent = tool tool.Parent = backpack tool.Activated:Connect(function() shove(player) -- step 2 fills this in end) end
๐Ÿ’ก
Run giveGauntlet(player) for every player at the start of a round. On a phone the player taps the tool icon in their hotbar, on a computer they click, and on a controller they press the button. One tool, every device.
๐Ÿ“
Fill in the Concept
+15 XP
A held item in Roblox is called a , and it must contain a part named .
๐Ÿง 
Knowledge Check
+15 XP
Which event fires when a player clicks or taps their tool?
ATouched
BDied
CActivated
2
๐Ÿ’ฅ
The Shove
Push everyone in front of you away, hard enough to send them off the edge
Locked
๐ŸŽฏ
Goal for this step

Find nearby players in a cone in front of you and launch them away.

  • 1Loop over every other player and measure the distance to them.
  • 2Check they are in front of you using the dot product of your facing direction.
  • 3Add a burst of speed to their character, away from you and slightly upward.
ObbyServer (Script)
local Players = game:GetService("Players") local RANGE, POWER, UP = 14, 65, 16 local function shove(player) local root = player.Character.HumanoidRootPart local origin = root.Position local look = root.CFrame.LookVector for _, other in ipairs(Players:GetPlayers()) do if other ~= player then local otherRoot = other.Character and other.Character:FindFirstChild("HumanoidRootPart") if otherRoot then local away = otherRoot.Position - origin if away.Magnitude <= RANGE and look:Dot(away.Unit) >= 0.35 then otherRoot.AssemblyLinearVelocity = away.Unit * POWER + Vector3.new(0, UP, 0) end end end end end
๐Ÿ’ก
The dot product is a maths trick that tells you the angle between two directions. A value near 1 means "right in front of me", near 0 means "to the side", negative means "behind me". We accept anything above 0.35, so a wide cone in front.
โŒจ๏ธ
Code Challenge
+20 XP

Check the other player is close and in front, then push them away:

if away.Magnitude <= RANGE and look:(away.Unit) >= 0.35 then otherRoot.AssemblyLinearVelocity = away.Unit * POWER + .new(0, UP, 0) end
Hint: the method that compares two directions, and the type for an X Y Z value.
๐Ÿง 
Knowledge Check
+15 XP
What does away.Unit give us?
AA direction with a length of 1, pointing from you to them
BThe distance in studs
CThe other player's health
3
๐Ÿ“Š
Rank and Eliminate
Keep the fastest players, remove the rest, send them to spectate
Locked
๐ŸŽฏ
Goal for this step

At the end of a round, put the players in order and cut the bottom of the list.

  • 1Collect every player with how far along the course they got.
  • 2Sort them, best first, with table.sort.
  • 3Keep the top slice and mark everyone else as eliminated.
ObbyServer (Script)
local function rankAndCut(field, keep) table.sort(field, function(a, b) return a.progress > b.progress -- further along = better end) local survivors = {} for i, entry in ipairs(field) do if i <= keep then survivors[#survivors + 1] = entry.player else eliminate(entry.player) -- out of the match end end return survivors end
๐Ÿ’ก
How big is keep? Make it a percentage that scales with the crowd. With 8 players keep about 5, with 40 keep about 20. Never let it drop below the number you need for the final. Our Config says FINAL_SIZE = 5.
๐Ÿ”ข
Put a round in order
+15 XP

Click the stages of a round the way the server runs them:

Build a fresh map
Start the race and give out gauntlets
Rank everyone by progress
Keep the top slice, eliminate the rest
๐Ÿง 
Knowledge Check
+15 XP
What does table.sort(field, compare) do?
ADeletes the table
BReorders the list using your rule
CCounts how many items are in the list
4
๐ŸŸ๏ธ
Build the Final Arena
A grid of tiles with a ring number, ready to be eaten away
Locked
๐ŸŽฏ
Goal for this step

A circular-looking platform built from square tiles, each tagged with a ring number.

  • 1Make a grid from -6 to 6 in both directions. That is a 13 by 13 floor.
  • 2For each tile work out its ring, how far it is from the centre.
  • 3Store the ring on the tile with SetAttribute, so we can find and remove the outer ring later.
MapGen (ModuleScript)
function mapgen.buildArena(parent) local rings = 6 for gx = -rings, rings do for gz = -rings, rings do local ring = math.max(math.abs(gx), math.abs(gz)) local tile = newPart(parent, Vector3.new(12, 2, 12), Vector3.new(gx * 12, 0, gz * 12), palette[ring + 1]) tile:SetAttribute("Ring", ring) end end end
๐Ÿ’ก
The centre tile is ring 0. Everything around it is ring 1, then ring 2, and so on out to ring 6 at the edge. Deleting a whole ring at once gives you that shrinking battle-royale feel.
๐Ÿง 
Knowledge Check
+15 XP
What number does the very centre tile get?
A6
B1
C0
5
โณ
The Arena Shrinks
Every few seconds the outer ring falls away, until one player is left
Locked
๐ŸŽฏ
Goal for this step

Delete the outermost ring on a timer and crown the last player standing.

  • 1Count down, and when the timer hits zero remove the highest ring left.
  • 2Anyone standing on the fallen ring drops into the void and is out.
  • 3Stop when one player remains. They are the champion.
ObbyServer (Script)
local ring = 6 while #alive > 1 do task.wait(11) -- SHRINK_EVERY seconds shrinkRing(ring) ring = ring - 1 end local function shrinkRing(n) for _, tile in ipairs(arenaFolder:GetChildren()) do if tile:GetAttribute("Ring") == n then tile:Destroy() -- the edge falls away end end end
๐Ÿ”ง
Players who fall below the arena should be knocked out. Check root.Position.Y each frame; if it drops below the arena, that player is out. Do not respawn them, this is the final.
๐Ÿ‘จโ€๐Ÿ‘ง
Tip for a fair final: give the gauntlet a small damage value in the final too, so a well-timed shove can knock someone out. Around 34 damage, so three hits finishes them. That keeps it a real deathmatch, not just a pushing contest.
โŒจ๏ธ
Code Challenge
+20 XP

Keep shrinking while more than one player is alive:

while #alive 1 do task.wait(11) shrinkRing(ring) ring = ring - 1 end
Hint: one character. "more than one player alive" means the count is greater than 1.
๐Ÿง 
Knowledge Check
+15 XP
When does the final end?
AWhen only one player is left standing
BAfter a fixed five minutes
CWhen the arena is empty of tiles
6
๐Ÿ†
Champion and Publish
Show the winner, then publish your game for friends to play
Locked
๐ŸŽฏ
Goal for this step

Celebrate the winner and put your game online.

  • 1Set a Won attribute on the champion and fire a RemoteEvent so their screen shows a big banner.
  • 2Click File then Publish to Roblox, give the game a name and a description.
  • 3Set it to Public in Game Settings so anyone can join, then test it from the Roblox website.
ObbyServer (Script)
local function crown(champion) champion:SetAttribute("Won", true) event:FireAllClients("Champion", champion.Name) end
๐Ÿ’ก
You now have a complete party game: a lobby, a match loop, three procedural map themes that never repeat, a shove gauntlet to push people off, elimination, and a shrinking last-one-standing final. Push people off the map is the whole point, and now you can.
๐Ÿ‘จโ€๐Ÿ‘ง
Where next: try adding a sound when the ring drops, or a speed boost pad, or a second gauntlet that pulls players instead of pushes. The Config file is yours to play with.
๐Ÿง 
Knowledge Check
+15 XP
Why does the server decide who is eliminated and who wins?
ABecause the client cannot draw platforms
BSo players cannot cheat; the server is the referee
CBecause the server has better graphics
๐ŸŽ‰โœจ๐ŸŽŠโญ๐ŸŽ‰
You Built a Party Game!

Three episodes, one complete game: a lobby, an endless match loop, three procedural maps that are different every time, a shove gauntlet, elimination and a shrinking final. Publish it and push your friends off the map.

0
Total XP
1
Level
0
Best Streak
0%
Accuracy