M
MERABY LABS Multi-product AI studio
IN-BROWSER TEMPLATES • STRICT LUAU PRESETS

Strict-mode Luau templates

Fill mechanic templates that include --!strict, tune numbers with sliders, and read static notes about each preset. Copy the script into Roblox Studio. This page does not call a model and does not certify exploit resistance.

7
Strict-Mode Mechanic Presets
--!strict
Present in each preset
Notes
Static checklist, not a score
Local
Sliders rewrite the template
LOCAL LUAU TEMPLATES • 7 PRESETS

Luau mechanic template studio

Choose a preset, tune constants with sliders, and read the static notes. This is not a live model and not a security audit.

Movement MECHANIC--!strict in template

Wall Climb & Parkour Controller

Dynamic Raycast-based wall detection with surface normal alignment, stamina decay, and wall-jump velocity impulse.

Roblox Studio Destination
StarterPlayer > StarterPlayerScripts
Filename: WallClimbController.client.luau
LIVE TUNING PARAMETERS
16 studs/s

Vertical velocity while scaling surfaces

20 %/s

Stamina consumed per second while climbing

45 impulse

Horizontal and vertical impulse when kicking off a wall

2.8 studs

Forward raycast distance to register wall contact

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
--!strict
-- Built with Meraby Labs (https://merabylabs.com?ref=roblox-ai)
-- WallClimbController.client.luau
-- Target: StarterPlayer > StarterPlayerScripts
300">"text-neon-magenta font-semibold">local Players = 300">"text-neon-cyan">game:GetService(300">"Players")
300">"text-neon-magenta font-semibold">local RunService = 300">"text-neon-cyan">game:GetService(300">"RunService")
300">"text-neon-magenta font-semibold">local UserInputService = 300">"text-neon-cyan">game:GetService(300">"UserInputService")
300">"text-neon-magenta font-semibold">local Workspace = 300">"text-neon-cyan">game:GetService(300">"Workspace")
300">"text-neon-magenta font-semibold">local LocalPlayer = Players.LocalPlayer
300">"text-neon-magenta font-semibold">local Character = LocalPlayer.Character 300">"text-neon-magenta font-semibold">or LocalPlayer.CharacterAdded:Wait()
300">"text-neon-magenta font-semibold">local 300">"text-solar-gold">Humanoid = Character:WaitForChild(300">"300">">Humanoid") :: 300">"text-solar-gold">Humanoid
300">"text-neon-magenta font-semibold">local RootPart = Character:WaitForChild(300">"HumanoidRootPart") :: 300">"text-solar-gold">BasePart
-- Configuration Parameters (Configured via Meraby Studio)
300">"text-neon-magenta font-semibold">local CLIMB_SPEED: 300">"text-solar-gold">number = 16.0
300">"text-neon-magenta font-semibold">local STAMINA_DRAIN_RATE: 300">"text-solar-gold">number = 20.0
300">"text-neon-magenta font-semibold">local WALL_JUMP_FORCE: 300">"text-solar-gold">number = 45.0
300">"text-neon-magenta font-semibold">local RAYCAST_DISTANCE: 300">"text-solar-gold">number = 2.8
300">"text-neon-magenta font-semibold">local MAX_STAMINA: 300">"text-solar-gold">number = 100.0
-- Internal State
300">"text-neon-magenta font-semibold">local currentStamina: 300">"text-solar-gold">number = MAX_STAMINA
300">"text-neon-magenta font-semibold">local isClimbing: 300">"text-solar-gold">boolean = false
300">"text-neon-magenta font-semibold">local wallNormal: 300">"text-neon-cyan">Vector3 = 300">"text-neon-cyan">Vector3.zero
300">"text-neon-magenta font-semibold">local heartbeatConnection: 300">"text-solar-gold">RBXScriptConnection? = nil
300">"text-neon-magenta font-semibold">local jumpConnection: 300">"text-solar-gold">RBXScriptConnection? = nil
-- Dedicated LinearVelocity constraint for glitch-free physics
300">"text-neon-magenta font-semibold">local attachment = 300">"text-neon-cyan">Instance.new(300">"300">">Attachment")
attachment.Name = 300">"WallClimbAttachment"
attachment.Parent = RootPart
300">"text-neon-magenta font-semibold">local linearVelocity = 300">"text-neon-cyan">Instance.new(300">"300">">LinearVelocity")
linearVelocity.Name = 300">"WallClimbVelocity"
linearVelocity.Attachment0 = attachment
linearVelocity.MaxForce = 50000
linearVelocity.VectorVelocity = 300">"text-neon-cyan">Vector3.zero
linearVelocity.Enabled = false
linearVelocity.Parent = RootPart
300">"text-neon-magenta font-semibold">local rayParams = 300">"text-neon-cyan">RaycastParams.new()
rayParams.FilterType = 300">"text-neon-cyan">RaycastFilterType.Exclude
rayParams.FilterDescendantsInstances = {Character}
rayParams.IgnoreWater = true
300">"text-neon-magenta font-semibold">local 300">"text-neon-magenta font-semibold">function CastForwardRay(): 300">"text-solar-gold">RaycastResult?
300">"text-neon-magenta font-semibold">local forwardVector = RootPart.300">"text-neon-cyan">CFrame.LookVector
300">"text-neon-magenta font-semibold">local origin = RootPart.Position
300">"text-neon-magenta font-semibold">return Workspace:Raycast(origin, forwardVector * RAYCAST_DISTANCE, rayParams)
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">local 300">"text-neon-magenta font-semibold">function StartClimbing(hitNormal: 300">"text-neon-cyan">Vector3)
300">"text-neon-magenta font-semibold">if isClimbing 300">"text-neon-magenta font-semibold">or currentStamina <= 5 300">"text-neon-magenta font-semibold">then 300">"text-neon-magenta font-semibold">return 300">"text-neon-magenta font-semibold">end
isClimbing = true
wallNormal = hitNormal
300">"text-solar-gold">Humanoid.AutoRotate = false
300">"text-solar-gold">Humanoid:ChangeState(300">"text-neon-cyan">Enum.300">"text-neon-cyan">HumanoidStateType.Physics)
linearVelocity.Enabled = true
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">local 300">"text-neon-magenta font-semibold">function StopClimbing()
300">"text-neon-magenta font-semibold">if 300">"text-neon-magenta font-semibold">not isClimbing 300">"text-neon-magenta font-semibold">then 300">"text-neon-magenta font-semibold">return 300">"text-neon-magenta font-semibold">end
isClimbing = false
300">"text-solar-gold">Humanoid.AutoRotate = true
300">"text-solar-gold">Humanoid:ChangeState(300">"text-neon-cyan">Enum.300">"text-neon-cyan">HumanoidStateType.Freefall)
linearVelocity.Enabled = false
linearVelocity.VectorVelocity = 300">"text-neon-cyan">Vector3.zero
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">local 300">"text-neon-magenta font-semibold">function OnHeartbeat(dt: 300">"text-solar-gold">number)
300">"text-neon-magenta font-semibold">if 300">"text-neon-magenta font-semibold">not Character 300">"text-neon-magenta font-semibold">or 300">"text-neon-magenta font-semibold">not RootPart 300">"text-neon-magenta font-semibold">or 300">"text-solar-gold">Humanoid.Health <= 0 300">"text-neon-magenta font-semibold">then
StopClimbing()
300">"text-neon-magenta font-semibold">return
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">local hitResult = CastForwardRay()
300">"text-neon-magenta font-semibold">if hitResult 300">"text-neon-magenta font-semibold">and hitResult.300">"text-neon-cyan">Instance 300">"text-neon-magenta font-semibold">and hitResult.300">"text-neon-cyan">Instance.CanCollide 300">"text-neon-magenta font-semibold">then
300">"text-neon-magenta font-semibold">local hitAngle = hitResult.Normal:Dot(300">"text-neon-cyan">Vector3.yAxis)
-- Only scale near-vertical surfaces
300">"text-neon-magenta font-semibold">if 300">"text-neon-cyan">math.abs(hitAngle) < 0.25 300">"text-neon-magenta font-semibold">then
300">"text-neon-magenta font-semibold">if 300">"text-neon-magenta font-semibold">not isClimbing 300">"text-neon-magenta font-semibold">and currentStamina > 10 300">"text-neon-magenta font-semibold">then
StartClimbing(hitResult.Normal)
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">else
StopClimbing()
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">else
StopClimbing()
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">if isClimbing 300">"text-neon-magenta font-semibold">then
currentStamina = 300">"text-neon-cyan">math.clamp(currentStamina - (STAMINA_DRAIN_RATE * dt), 0, MAX_STAMINA)
300">"text-neon-magenta font-semibold">if currentStamina <= 0 300">"text-neon-magenta font-semibold">then
StopClimbing()
300">"text-neon-magenta font-semibold">return
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">local verticalInput = 0
300">"text-neon-magenta font-semibold">if UserInputService:IsKeyDown(300">"text-neon-cyan">Enum.KeyCode.W) 300">"text-neon-magenta font-semibold">or UserInputService:IsKeyDown(300">"text-neon-cyan">Enum.KeyCode.Up) 300">"text-neon-magenta font-semibold">then
verticalInput = 1
300">"text-neon-magenta font-semibold">elseif UserInputService:IsKeyDown(300">"text-neon-cyan">Enum.KeyCode.S) 300">"text-neon-magenta font-semibold">or UserInputService:IsKeyDown(300">"text-neon-cyan">Enum.KeyCode.Down) 300">"text-neon-magenta font-semibold">then
verticalInput = -0.6
300">"text-neon-magenta font-semibold">end
linearVelocity.VectorVelocity = 300">"text-neon-cyan">Vector3.new(0, verticalInput * CLIMB_SPEED, 0)
300">"text-neon-magenta font-semibold">else
-- Stamina regeneration when grounded
300">"text-neon-magenta font-semibold">if 300">"text-solar-gold">Humanoid.FloorMaterial ~= 300">"text-neon-cyan">Enum.Material.Air 300">"text-neon-magenta font-semibold">then
currentStamina = 300">"text-neon-cyan">math.clamp(currentStamina + (25 * dt), 0, MAX_STAMINA)
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">local 300">"text-neon-magenta font-semibold">function OnJumpRequest()
300">"text-neon-magenta font-semibold">if isClimbing 300">"text-neon-magenta font-semibold">then
StopClimbing()
-- Apply kick-off impulse away from wall normal and upward
300">"text-neon-magenta font-semibold">local impulseVector = (wallNormal * 0.7 + 300">"text-neon-cyan">Vector3.new(0, 0.8, 0)).Unit * WALL_JUMP_FORCE * RootPart.AssemblyMass
RootPart:ApplyImpulse(impulseVector)
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">local 300">"text-neon-magenta font-semibold">function Initialize()
heartbeatConnection = RunService.Heartbeat:Connect(OnHeartbeat)
jumpConnection = UserInputService.JumpRequest:Connect(OnJumpRequest)
300">"text-neon-magenta font-semibold">end
LocalPlayer.CharacterRemoving:Connect(300">"text-neon-magenta font-semibold">function()
300">"text-neon-magenta font-semibold">if heartbeatConnection 300">"text-neon-magenta font-semibold">then heartbeatConnection:Disconnect() 300">"text-neon-magenta font-semibold">end
300">"text-neon-magenta font-semibold">if jumpConnection 300">"text-neon-magenta font-semibold">then jumpConnection:Disconnect() 300">"text-neon-magenta font-semibold">end
StopClimbing()
300">"text-neon-magenta font-semibold">end)
Initialize()

What this page actually does

Seven hand-written Luau templates with sliders. There is no model narration, no inference call, and no extra studio tool catalog on this page.

👁️

Preset, then script

Selecting a preset loads its template. Sliders replace numeric constants in that template. You can read the script, copy it, or download the .luau file.

🛡️

Stays in the browser

Templates render on this page. Nothing is sent to a model provider. Copy or download is the handoff into Roblox Studio.

⚡

Seven mechanic presets

Wall climb, DataStore, grappling hook, pathfinding, inventory, combat hitbox, and hovercraft. Each one is a template with a short static note list.

DESIGN NOTE • ROADMAP ONLY • NOT A LIVE PRODUCT

Sketch: 6 specialist roles

MerabyCore is a design note for how specialist roles could coordinate later. None of these roles run on this page, the Luau templates do not call them, and there is no orchestrator to join.

PLANNED
Scene Builder
Roadmap idea: 3D spatial layout, terrain, and object placement.
PLANNED
Script Generator
Roadmap idea: strict-mode Luau beyond the hand-written presets on this page.
PLANNED
Systems Architect
Roadmap idea: replication, networking, and datastore schema sketches.
PLANNED
Asset Manager
Roadmap idea: catalog links, texture maps, and audio binding.
PLANNED
Analysis
Roadmap idea: profiling and lint notes. Not the static checklist above.
PLANNED
Documentation
Roadmap idea: API specs, Moonwave annotations, and changelogs.

Join the Closed Beta Waitlist

We are preparing early access for active Roblox developers. Sign up with your developer handle to receive invitation keys when rollout begins.

Request Waitlist Access