Tips & Tutorials

Learn from the most experienced mappers
Don't be afraid to try new things. Think outside the box and don't follow the trend, create the trend. Give decorations as much time you give to track.
KnOwN
General
Test your map thoroughly and also invite friends to test it for you.
BriaN
General
Open object browser and take a bunch of random objects, then try to make a map out of that. As long as you practice you'll see very solid results.
RuSo
General
From inspiration comes creation in the next steps and that's what really matters.
Kiwi
General
Drive your map like a retard, If the retard version passes the map, it's a solid map.
ZenoS
General
Find some new objects to use as a track & make smooth landings.
Vortex
Track
Get out of your comfort zone and try different topics.
Chipy
General
When it comes to decorating a map, try to imagine a cool shape and just make a base of it, then add colorful details without worries about overdoing it.
Rampage
Decoration
Creating night-time maps is all about a symetrical pattern built with angled buildings, color and most importantly contrast.
Skaarj
Night Style
If you like what you're doing, stick to it. As many maps as it takes.
DeLeTe
General
Map for fun. Map if you have the desire. Don't touch your map if you gotta force yourself to progress, even if it takes ages to finish it.
Micra
General
Smooth track is key to success. Don't underestimate small details, they matter too.
Sk2
General
When it comes to decorations, try to map on different angles and make an atmosphere full of illusions and fancy details.
Zebra
Decoration
General Tips

Track

Keep in mind your track is what matters the most in your map. Try to make it the most enjoyable with the least bugs possible. Do not be afraid of trying new ideas, people enjoy experiencing new stuff! One important tip is to stop the test instantly after encountering a bug and fix it right away. Use the double-side trick to save some time instead of manually making both sides, this applies to symmetric decorations as well.

Decorations

Decorations are what makes the difference between your maps and others. In other words, no matter how good your track is, if the decorations are bad, your maps loses the charm! One important tip is to spend a considerable time decorating your map and trying new stuff that haven’t been made yet. Don’t use the same few objects in your whole map. Be creative and think outside the box. Try rotating interior objects for example and tick the double side option, there are a lot of surprises to discover.

Small Details

Be careful when placing details around the map. It is very important to place details or else your map will feel empty or incomplete. If you are making a city map for example, use relevant objects like “bin” or “lamp” but make sure you place them in a manner where they won’t bother the player while driving through your map. In worst scenarios, remove the collision from the objects if you scale them. It’s recommended to go through every single part and make small little modifications. (Like changing a corona’s color, fixing a cover..etc)

Markers

As a map creator, you should guide players to complete the map and it is necessary to place markers in the parts where you think they will be confused and direct them to the following parts. You can also give them tips on which keys to use for the following part, but that’s an option, a recommended one! Keep in mind that one marker doesn’t make a direction, but two at least.

Weather/Sky

This may seem trivial but a good weather has a big impact on your map. Wisely choose the weather that corresponds to your decorations/track. A tip is to go through every single weather starting from 1 to 40 and decide on which one fits your theme the most or apply a beautiful custom weather/sky if you wish.

Find your own style

It is not a mistake to get inspiration from famous mappers,  once a Kiwi said, “From Inspiration comes creation”. But sooner you get familiar with the editor and it becomes your field of expertise, you will need to stop following other mappers’ path and create your own, and there lays the ultimate success!
Close Menu
function ClientStarted()
    setSkyGradient(85, 85, 85, 85, 85, 85)
    setSunSize (0)
    setFogDistance(-50)
    setFarClipDistance(215)
end
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), ClientStarted)
marker = createMarker(x, y, z, "corona", size, r, g, b, a)

function boom(player)
    if player == localPlayer then
        local vehicle = getPedOccupiedVehicle(player)
        if vehicle then
            blowVehicle(vehicle)
        end
    end
end
addEventHandler("onClientMarkerHit", marker, boom)
-- Example usage:
addEventHandler("onClientResourceStart", root, function()
	create3DText("Test", 705.83, -159.25, 32.01, "arial", 1.0, 255, 255, 255, 255, 200, true)
	create3DText("Test String but below the other one", 705.83, -159.25, 25.01, "bankgothic", 2.0, 255, 255, 255, 255, 200, true)
	-- Arguments:		text,		  		X,	 Y,	Z,	font,	 size,  r,   g,   b,   a,   d,  testlos
end)



local texts = {}
function create3DText(string, x, y, z, font, fontsize, r, g, b, a, distance, testlos)
	local text 		= 	{}
	text.string 	= 	string
	text.x 			= 	x
	text.y 			= 	y
	text.z 			= 	z
	text.font 		= 	font or "arial"
	text.fontsize 	= 	fontsize or 1.0
	text.r 			= 	r or 255
	text.g 			= 	g or 255
	text.b 			= 	b or 255
	text.a 			= 	a or 255
	text.distance 	= 	distance or 150
	text.testlos	= 	(type(testlos) == "nil" and false or testlos)
	table.insert(texts, text)
end

addEventHandler("onClientRender", root, function()
	for i, value in ipairs(texts) do
		local self = texts[i]
    	local x, y, z = getElementPosition(getLocalPlayer())
    	local distance = getDistanceBetweenPoints3D(self.x, self.y, self.z, x, y, z)
    	if distance <= self.distance then
    		local cx, cy, cz, clx, cly, clz = getCameraMatrix()
    		if not self.testlos or (self.testlos and isLineOfSightClear(cx, cy, cz, self.x, self.y, self.z, true, false, true, true, false, false, true)) then
	    		local scale = self.fontsize - ((distance / self.distance) * self.fontsize)
	    		local sx, sy = getScreenFromWorldPosition(self.x, self.y, self.z, dxGetTextWidth(self.string, scale, self.font, true), false)
	    		if sx and sy then
	    			dxDrawText(self.string, sx, sy, _, _, tocolor(self.r, self.g, self.b, self.a), scale, self.font, "center", "center", false, false, false, true)
	    		end
	    	end
    	end
	end 
end)
local marker = createMarker(X, Y, Z, "type", SIZE, RED, GREEN, BLUE, ALPHA)

function explosion(player)
    if player == LocalPlayer then
        createExplosion(X, Y, Z, TYPE)
    end
end
addEventHandler("onClientMarkerHit", marker, explosion)


Explosion types: (Replace TYPE with the number that associates with your explosion type)
-- 0: Grenade
-- 1: Molotov 
-- 2: Rocket
-- 3: Rocket Weak
-- 4: Car
-- 5: Car Quick
-- 6: Boat
-- 7: Heli
-- 8: Mine
-- 9: Object
-- 10: Tank Grenade
-- 11: Small
-- 12: Tiny
local marker = createMarker(X, Y, Z, "type", SIZE, RED, GREEN, BLUE, ALPHA)

function velocity(player)
    if player == localPlayer then
        local vehicle = getPedOccupiedVehicle(player)
        if vehicle then
            setElementVelocity(vehicle, X, Y, Z)
            setElementAngularVelocity(vehicle, X, Y, Z)
        end
    end
end
addEventHandler("onClientMarkerHit", marker, velocity)
local marker = createMarker(X, Y, Z, "type", SIZE, RED, GREEN, BLUE, ALPHA)

function velocity(player)
    if player == localPlayer then
        local vehicle = getPedOccupiedVehicle(player)
        if vehicle then
            setGameSpeed(SPEED) --SPEED 1 is normal speed, SPEED 0.5 is half speed
            setTimer(setGameSpeed, DURATION, 1, 1) --replace DURATION with the duration in milli seconds
        end
    end
end
addEventHandler("onClientMarkerHit", marker, velocity)

--If you want to get fancy consider using: dnlk's easing slowmotion
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), function()
    for i, object in pairs(getElementsByType("object")) do
        if isElement(object) then
            local elementID = getElementModel(object)
            engineSetModelLODDistance(elementID, 170)
        end
    end
end)
local Music = false

addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), function()
    Music = playSound("PATH/TO/MUSICFILE.MP3", true)
    setRadioChannel(0)
end)

addEventHandler("onClientPlayerRadioSwitch", getRootElement(), function()
    if getRadioChannel() > 0 then
        setRadioChannel(0)
    end
    cancelEvent()
end)

addEventHandler("onClientPlayerVehicleEnter", getRootElement(), function()
    setRadioChannel(0)
    cancelEvent()
end)

addCommandHandler("music", function()
    if Music then
        if getSoundVolume(Music) == 0 then
            setSoundVolume(Music, 1)
        elseif getSoundVolume(Music) == 1 then
            setSoundVolume(Music, 0)
        end
    end
end)
bindKey("m", "down", "music")
function startclient()
    outputChatBox("Text", 255, 0, 0, true)
end
addEventHandler("onClientResourceStart", resourceRoot, startclient)
local marker = createMarker(X, Y, Z, "type", SIZE, RED, GREEN, BLUE, ALPHA)

function teleport(player)
    if player == localPlayer then
        local vehicle = getPedOccupiedVehicle(player)
        if vehicle then
            setElementPosition(vehicle, X, Y, Z)
            setElementRotation(vehicle, X, Y, Z)

            setElementVelocity(vehicle, 0, 0, 0)
            setElementAngularVelocity(vehicle, 0, 0, 0)
        end
    end
end
addEventHandler("onClientMarkerHit", marker, teleport)
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), function()
    setWaterColor(RED, GREEN, BLUE)
end)
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), function()
    setSkyGradient(topRED, topGREEN, topBLUE, bottomRED, bottomGREEN, bottomBLUE)
end)