Making a "Capture the Flag" game! | Tutorial

Hi, today I’m gonna be teaching you, how to make a “Capture the Flag (CTF)” game, make sure to follow my steps exactly, to get a good result.

Your game could look like this: Capture The Flag - Roblox!

Screenshots



If you don’t know how to create places in roblox or if you don’t really know the interface of roblox, this article should help real quick: Roblox Quick Start

Step 1. (Import teams and other settings)
To start, we first need to import the teams service, so that we can handle both team sides easily.
To do this, navigate to the “Model” tab and click the “Service” button.
image
After you the service window popped up, you need to import the “Teams” service.
Click on team and press “insert”.
image
If the window closes and a “Teams” Instance appears in the Explorer, you did everything right and it’s time for the next setting.
I recommend turning your Lighting to Future Lighting (it looks very very good), to do this, head over to the Lighting Instance in the Explorer and select it.
image
Go to the Properties window, and search for the property “Technology” and set it to “Future”.
image
The rest of the Lighting settings are your own decision.
Let’s head to a setting, that is needed later in the game, the “CharacterAutoLoad”. To find this, you should head over to the “Players” Instance in the Explorer and go to the Properties window. Easily find the “CharacterAutoLoads” property (it should be the last one in the list, if not just search it) and set it to false (so basically untick the option). Lets continue to the next step.

Step 2. (Team balancing)
To let the teams balance right, we need to create an own service for it.
To start, create a script in “ServerScriptService” and name it however you want, I’m just gonna call it “TeamBalance”. So let’s start scripting

We need to create some variables first:

local BlueMembers = 0
local RedMembers = 0

The next part mainly counts the members and prints new ones out:

game.Teams.Blue.PlayerAdded:Connect(function(player) -- Detect when a player joins the team
	BlueMembers = BlueMembers + 1 -- Count the player to the variable
	print(player.Name.." joined blue team! Member count is now at "..BlueMembers.."!") -- Printing out the player's team
end)

We have to do that for every event:

-- I'll just leave the first block commented, it should be easy to understand
game.Teams.Blue.PlayerRemoved:Connect(function(player)
	BlueMembers = BlueMembers - 1
	print(player.Name.." left blue team! Member count is now at "..BlueMembers.."!")
end)

game.Teams.Red.PlayerAdded:Connect(function(player)
	RedMembers = RedMembers + 1
	print(player.Name.." joined red team! Member count is now at "..RedMembers.."!")
end)
game.Teams.Red.PlayerRemoved:Connect(function(player)
	RedMembers = RedMembers - 1
	print(player.Name.." left red team! Member count is now at "..RedMembers.."!")
end)

Let’s continue to add new players to a team:

game.Players.PlayerAdded:Connect(function(player)
	wait(1) -- Wait for the block above to finish running
	if BlueMembers > RedMembers then -- Detect which team got more players
		player.Team = game.Teams.Red -- Setting the player's team
	elseif BlueMembers < RedMembers then -- Detect which team got more players
		player.Team = game.Teams.Blue -- Setting the player's team
	else
		if math.random(1,2) == 1 then -- If the teams are the same size, the script will set the player to a random team
			player.Team = game.Teams.Red -- Setting the player's team
		else -- If the random number was 2
			player.Team = game.Teams.Blue -- Setting the player's team
		end
	end
	player:LoadCharacter() -- Load the players character
	print(player.Name.." joined!") -- Print out, that the join process is done
end)

But when a player is (unfortunately) leaving, we have to refresh the teams, to let the game stay fair:

game.Players.PlayerRemoving:Connect(function(player)
	wait(1) -- Wait for the block above above to finish
	if BlueMembers <= 0 or RedMembers <= 0 then -- Detect if there are no players in one team
		for i,v in pairs(game.Players:GetPlayers()) do -- If there are no players in one team it starts to loop trough everyone
			if BlueMembers > RedMembers then -- Doing the regular team assigning (explained in the block above)
				v.Team = game.Teams.Red -- =
			elseif BlueMembers < RedMembers then -- =
				v.Team = game.Teams.Blue -- =
			else
				if math.random(1,2) == 1 then -- =
					v.Team = game.Teams.Red -- =
				else
					v.Team = game.Teams.Blue -- =
				end
			end
		end
	end
	print(player.Name.." left!") -- Print out, that the leave process is done
end)

Since we disabled AutoCharacterLoad, the Character doesnt load after death, we have to manually do that:

game.Players.PlayerAdded:Connect(function(player)
	player.CharacterAdded:Connect(function(character)
		character.Humanoid.Died:Connect(function()
			print(player.Name.." died!") -- Print out, that a player died
			wait(0.2) -- Respawn time, so it doesnt look like, the player teleported away (your decision)
			player:LoadCharacter() -- Load the character in
		end)
	end)
end)

So, that’s it for this script, take a break and head to the next step!

Step 3. (Map designing)
So the main map design is yours, but I still have to say these things (Don’t even think about skipping these):
:-: You should use the exact same model for both bases.
:-: You HAVE TO separate the two bases in models, that are called like: “BlueBase”/“RedBase”
:-: In the base models, there has to be a Part called “CapturePart”, for me, it is the tower where the flag is standing on (on the picture below). It will be the part, that you have to touch with the enemy flag on you.
:-: Your flag model should look like this: (Ignore the “FlagScript” Instance, we are gonna create this later)
image
:-: The “Pole” has to be anchored, the “Flag” not.

My map looks like that:

TO BE CONTINUED!

23 Likes

Pretty well tutorial for beginners, You would explain the math side of the code next time. Since there is no math in this…

Great, I liked it.

This is a really useful tutorial for people who want to make a ctf game! Maybe I might use this in the future.

Not bad i love the tut however the thing is that roblox already has a official tutorial on making games so roblox may take this down.

Thanks so much for this tutorial! This has really helped me out and has also taught me a lot of scripting.

You’re welcome! Feels good to help beginners! :blush:

Ok! I will include this in my next edit.

Ye, but there is always a better way, and scripting is more fun than just clicking on a template (imo). And I also wish (when I started scripting), to have someone that I can talk with (about modifications and code, etc.)…

Yeah I just hope Roblox changes their tut
I hope you the best for your part 2 :v:!

thanks but i need something LIKE

Sound management system
when getting a flag, announces, Alerting sound when flag stolen, etc.

since I’m not expert in programming

Ok! I will try inserting it… (maybe)