Table of Contents
Map Making Tutorial/Basics for Roblox bhop/surf map making
Introduction
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.
The basics
To start, you will need:
- A model named
bhop_mapname
orsurf_mapname
- “mapname” should be the name of your map. “bhop_” or “surf_” is required at the start and is case-sensitive. Use “bhop_” if you are making a bhop map, and vice versa.
- Two parts: A
MapStart
and aMapFinish
- The
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.
- A
Creator
and aDisplayName
StringValue- The value for Creator should be your username, and the value for DisplayName should be the name of your map. The values can be changed by clicking on the StringValue objects and changing the Value section in properties.
This 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.)
Note about Spawns and Triggers
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:
- You jump on a
Spawn#
part - You touch/get reset by a
Trigger#
part - You touch a
SpawnAt#
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
.
Platforms and Surfs
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.
How to test and submit your map
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.
Lighting / Why does my map look different in maptest?
Read the lighting guide.
Making a booster
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)
Caveats and things to keep in mind
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.
Full map part list
MapStart
- The start of your map. Your timer will start when you exit this. Should always be CanCollide false.
MapFinish
- The end of your map. Your timer will end when you enter this. Should always be CanCollide false.
Platform
- Parts that you must jump on. You will be reset if you don't jump on these.
Surf
- Parts that you must surf on. You will surf on these even if you could jump normally.
Spawn#
- Parts you Spawn on. You will spawn in the center of the top face.
SpawnAt#
- Touching a
SpawnAt#
will update your Spawn to the correspondingSpawn#
. This can be more useful than traditional triggers in certain situations in order to prevent trigger skips.
Trigger#
- Parts that reset you. The # corresponds to the Spawn they are meant to send you to.
ForceTrigger#
- Same as above but can send you backwards.
Teleport#
- Parts that teleport you forwards to a new Spawn. The # corresponds to the given Spawn. Unlike Triggers these will not reset you to the start with autorestart enabled.
ForceTeleport#
- Same as above but can send you backwards.
MapAnticheat
- Touching this will invalidate your time until you restart. Useful for blocking map exploits. Should always be CanCollide false.
Ladder
- Gives a part ladder properties and allows you to climb it.
Jump#
- The # is the amount of times you are allowed to jump on the part. Jumping on it consecutively more times than the # will reset you.
WormholeIn#
andWormholeOut#
- WormholeIn# will send you to the corresponding WormHoleOut#. The transition is seamless, it's very useful for making impossible geometries. In the most common use case the parts have the exact same size, but coordinates are mapped linearly from the surface of one to the other if they are different sizes. Use teleports for non-seamless transitions.
Accelerator
- Accelerates players in a given direction/acceleration at a constant rate. Adjust the Velocity property of this part to adjust where/how much the accelerator should accelerate the player inside of it. Should always be CanCollide false.
Water
- When inside you can swim and has custom swimming physics. Adjust the Velocity property to give it a current. Adjust the CustomPhysicalProperties Density and Friction to adjust the fluid density and drag coefficient respectively (these are 1.0 and 0.1 by default). Should always be CanCollide false.
Resources
Map Kits
Plugins
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