This is an old revision of the document!


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 or surf_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 a MapFinish
    • 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 a DisplayName 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:

  1. You jump on a Spawn# part
  2. You touch/get reset by a Trigger# part
  3. 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 Platforms. By naming a part Platform, players will be forced to jump on it or they will be reset.

Surf maps will have Surfs 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.


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.
  • Trigger#
    • Parts that reset you. The # corresponds to the Spawn they are meant to send you to.
  • ForceTrigger#
    • Same as above but will send you backwards.
  • Teleport#
    • Parts that teleport you forwards to a new Spawn. The # corresponds to the given Spawn.
  • 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# and WormholeOut#
    • WormholeIn# will send you to the corresponding WormHoleOut#. The transition is seamless. The parts must have the same dimensions (size). 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.
Navigation