This tutorial assumes you are somewhat familiar with how to use Roblox Studio. You only need to know how to add parts and manipulate them, as well as how to use the Explorer tab to manipulate parts' names and properties. All Roblox bhop/surf maps are made in Studio, so you should familiarize yourself with the program before starting.
You do not need to script anything to make a bhop or surf map. The basic map functions (Spawns, Triggers, etc.) and the physics engine are provided by the bhop and surf games. The tutorial will explain how to add map functions. You will have to test the maps using bhop maptest or surf maptest.
To start, you will need:
bhop_mapname
or surf_mapname
MapStart
and a MapFinish
MapStart
is the start of your map. When the player leaves this box their timer will start. MapFinish
is the opposite, their timer will end when they reach this. These should be CanCollide false (configurable in the part properties) and preferably should have an outline or otherwise have their locations obvious to the player.Creator
and a DisplayName
StringValueThis model contains the items listed above. You can take it and add it into Studio using the Toolbox window.
Now that you have the absolute basics, you can start making your map. To add a spawn, create a part and name it Spawn1
. Subsequent spawns will be named Spawn2
, Spawn3
, and so forth.
To add a trigger, or a part that resets you when you touch it, name a part Trigger#
. The #
should correspond to the Spawn it is associated with (Trigger2
sends you to Spawn2
, etc.)
Spawns should always face upright, the game will always spawn you in the middle on the top face, so if the part is rotated 180 degrees, you will spawn on the bottom.
Your Spawn can be updated in 3 ways:
Spawn#
partTrigger#
partSpawnAt#
part
You will always Spawn at your most recent Spawn when you touch a Trigger, unless that Trigger corresponds to a Spawn further than your most recent Spawn. For example, if the last Spawn you touched was Spawn9
and you get reset by Trigger11
, your newest Spawn will be Spawn11
.
Finally, Triggers will not send you backwards. If your current spawn is Spawn5
and you touch Trigger2
you will get sent to Spawn5
.
Next for a Bhop map, you can start by adding Platform
s. By naming a part Platform
, players will be forced to jump on it or they will be reset.
Surf maps will have Surf
s instead. Name a part Surf
and you will surf on it even if you would normally be able to jump on it.
It is recommended that you label parts that are intended to be platforms Platform
and parts that are intended to be surfs Surf
.
If you want to create a teleport between two sections, you can do so using the Teleport#
part. The # corresponds to the Spawn you will be sent to. Like Triggers, Teleports will not send you backwards.
First, upload your map model to Roblox. Do this by right clicking the model and selecting “Save to Roblox”. Make sure it is uncopylocked.
Next, you will have to join the Roblox Bhop/Surf discord. Once you have joined, go to either the #maptest-bhop channel or the #maptest-surf channel. Then type !take link/ID where link/ID is a link to the model or the asset ID for the model.
The bot will tell you when it has taken the map. If it could not take it read the error it tells you and fix what you did wrong. Once accepted, go to either bhop maptest or surf maptest.
Once in-game, in chat, type /map id
where the ID is the asset ID for your map. For example, the asset ID of https://www.roblox.com/library/5366980124
is 5366980124
.
Finally, you can /nominate
your map and /rtv
.
Note: The model cannot update while you are inside maptest. If you want to test a new version you will have to make a new model and give it to the bot or create a new server using the /startserver
command.
Read the lighting guide.
Boosters do not have special names. To make a booster you simply change the Velocity property of a normal part or a Platform
. When the player jumps on it they will immediately be given the velocity specified by the parts Velocity property.
For example, if a player with a velocity of 40 u/s in the positive x-direction jumps on a part with velocity (30, 0, 0), their velocity will now be 70 u/s in the x-direction. To help discern direction in Studio there is a cube at the top right with axes.
It is recommended to use a script when changing the Velocity property, because this property is reset whenever the part is moved, including if the map model itself is moved. By using a script it is easy to store and come back to the value without having to worry if you reset it accidentally.
-- Example script (put the script inside the part you want to turn into a booster): script.Parent.Velocity = Vector3.new(0,0,0)
Finally, if you want to make a vertical booster with a specific height, you can do so with a simple physics equation. The height variable is in studs (so the example will boost the player 30 studs high). The gravity variable should be set to 100 for bhop and 50 for surf, because the gravity is different between the two games.
local height = 30 local gravity = 100 script.Parent.Velocity = Vector3.new(0, math.sqrt(2 * height * gravity), 0)
Unions and meshes do not have normal collision. In bhop/surf they will simply have a box for collision. It is the same box you see in Studio when you select a union/mesh and highlight it. To work around this you can create your own collision manually by making individual parts and making them invisible, and making the original union/mesh CanCollide false.
Avoid having surfaces on the same level as another and directly adjacent to eachother. This greatly increased the chances of a player accidentally edge boosting on the part and losing lots of their speed. If you need to have this, it is recommended to make the parts CanCollide false, and creating a single invisible part that outlines the parts inside. This is common practice for certain platform designs.
MapStart
MapFinish
Platform
Surf
Spawn#
SpawnAt#
SpawnAt#
will update your Spawn to the corresponding Spawn#
. This can be more useful than traditional triggers in certain situations in order to prevent trigger skips.Trigger#
ForceTrigger#
Teleport#
ForceTeleport#
MapAnticheat
Ladder
Jump#
WormholeIn#
and WormholeOut#
Accelerator
Water
Archimedes Two/Arc Very useful plugin for creating smooth surf ramps and smooth surfaces
Celestial Body Dragger Makes it easy to drag and reposition the sun
Model Resizer Allows you to resize models/selections by a given scale
Material Flip Allows you to rotate textures (with some limitation)
Reflect Flip parts
Gap Fill Automatically creates parts to fill gaps between two parts
Resize Align Resize a part to meet another part by clicking on two faces