BENNY'S MOTORWORKS

VERSION 2.0 — MAJOR UPDATE

Complete overhaul of Benny's Original Motor Works. Reworked exterior, new interiors, and 5 fully integrated scripts — paint shop, performance tuning, and dual car lifts. The ultimate mechanic shop for FiveM roleplay.

WHAT'S NEW IN V2

🖌️

REWORKED EXTERIOR SHADERS

Completely rebuilt exterior shaders from the ground up — fresh new look and improved lighting

🚪

REAL GARAGE DOOR

Main garage door now opens like a real garage door — no more broken opening animations

🔧

4 MECHANIC WORK STANDS

Four dedicated mechanic work stations on the shop floor for vehicle servicing

📦

STORAGE ROOM

New storage room for parts, supplies and inventory management

🎨

PAINT BOOTH + SCRIPT

Dedicated paint booth with custom paint script — RGB colors, Metallic/Matte finishes, payment system

⚙️

PERFORMANCE BLOCK + SCRIPT

Performance workshop with a tuning script — engine, turbo, transmission, brakes, suspension, armor

🔩

2 CAR LIFTS + SCRIPTS

Dual synchronized car lifts with NUI controllers — network synced for all players

🏢

LOCKED BOSS OFFICE

Secure boss office for management — lockable for authorized personnel only

SCRIPTS INCLUDED

SCRIPT RESOURCE DEPENDENCIES TYPE
Car Lift 1 molo_bennys_carlift ox_target or qb-target INCLUDED
Car Lift 2 molo_bennys_carlift ox_target or qb-target INCLUDED
Paint Shop molo_paintshop ox_target ox_lib INCLUDED
Performance Tuning molo_tuning ox_target ox_lib INCLUDED
✦ ALL JOB-RESTRICTABLE + PAYMENT READY

Every script supports job restriction via config — lock to mechanic, bennys, or any job. Auto-detects ESX and QBCore. Paint shop includes a configurable payment system (player/society/free).

VIDEO SHOWCASE

INSTALLATION

RESOURCES

Place the following folders into your server's resources directory. Do not create subfolders.

FOLDER DESCRIPTION REQUIRED
molo_bennys MLO — The map itself (3D models, textures, collisions) REQUIRED
molo_bennys_carlift Script — Dual car lift system with NUI controller OPTIONAL
molo_paintshop Script — Paint booth with RGB colors, finishes and payment system OPTIONAL
molo_tuning Script — Performance workshop (engine, turbo, brakes, etc.) OPTIONAL

SERVER.CFG

# Benny's Motorworks V2 ensure molo_bennys ensure molo_bennys_carlift ensure molo_paintshop ensure molo_tuning # Always last ensure molo_maps_data
⚠ IMPORTANT

molo_maps_data must always be the last ensure in your server.cfg. This shared resource is required by all Molo maps.

ℹ FTP UPLOAD

If you use WinSCP or FileZilla, verify that the .fxap file is sent successfully. FTP can sometimes break files — if the map doesn't load correctly, try re-uploading.

SCRIPT — CAR LIFT

🔩 MOLO_BENNYS_CARLIFT

v1.1.0

Dual synchronized car lifts with NUI popup controller. Each lift is controlled independently via a wall switch prop. Players interact using ox_target or qb-target (auto-detected at runtime) to open the controller.

Features:

— Smooth eased movement with configurable travel time
— Vehicle and ped auto-attach during movement
— Network synchronized across all players via GlobalState
— NUI controller with status LED, position readout, and up/down buttons
— Sound effects (motor + arrival chime)
— Server-side state management with anti-spam lock
— Dual target system support : ox_target et qb-target (auto-detect)
— Optional job restriction (ESX / QBCore, auto-detect framework)
— Configurable spawn/despawn distance
— Server exports : MoveLift and GetLiftState
— Dev mode for console debug output

✦ OX_TARGET & QB-TARGET SUPPORTED

The car lift works with both ox_target and qb-target — no configuration needed. The resource auto-detects which target system is running on your server at startup. Simply make sure one of them is started and it will work out of the box.

CAR LIFT CONFIGURATION

Edit config.lua inside the molo_bennys_carlift folder:

-- Dev mode: prints debug info to server/client console CarLift.Config.IsDev = false -- Target system: 'ox_target', 'qb-target', or 'auto' (runtime detection) CarLift.Config.TargetSystem = 'auto' -- Framework for job restriction: 'esx', 'qbcore', or 'auto' CarLift.Config.Framework = 'auto' -- Spawn / despawn distance for the platform prop CarLift.Config.SpawnDistance = 150.0 CarLift.Config.DespawnDistance = 200.0 -- Movement speed (seconds for full travel) CarLift.Config.MoveTime = 3.0 CarLift.Config.EaseZone = 0.35 -- easing zone at start/end -- Vehicle detection on the platform CarLift.Config.VehicleDetectRadius = 5.0 CarLift.Config.VehicleDetectZUp = 3.0 CarLift.Config.VehicleDetectZDown = 1.0 -- Ped detection (player riding on the lift) CarLift.Config.PedDetectRadius = 4.0 CarLift.Config.PedDetectZUp = 3.5 CarLift.Config.PedDetectZDown = 1.0 -- Attach settings CarLift.Config.DetachDelayMs = 200 CarLift.Config.NetworkRequestTries = 30 -- Target interaction distance CarLift.Config.TargetDistance = 2.0 -- Sound effects CarLift.Config.UseSounds = true

JOB RESTRICTION

The lift can be restricted to specific jobs. When enabled, only players with a matching job (and minimum grade) can operate the switches.

-- Enable/disable job restriction CarLift.Config.UseJobRestriction = false -- Jobs allowed to use the lift (job = minimum grade) CarLift.Config.AllowedJobs = { ['mechanic'] = 0, ['bennys'] = 0, -- ['police'] = 2, -- grade 2+ only }
ℹ FRAMEWORK SUPPORT

Job restriction auto-detects ESX and QBCore at runtime via CarLift.Config.Framework = 'auto'. Force a specific framework by setting 'esx' or 'qbcore' explicitly.

ELEVATORS CONFIGURATION

Each lift entry in CarLift.Config.Elevators defines the platform position, travel heights, and the wall switch prop:

CarLift.Config.Elevators = { { id = 1, label = "Car Lift 1", x = -221.018112, y = -1342.74878, heading = 179.535, lowZ = 30.5432034, -- floor height highZ = 32.540905, -- raised height switchProp = 'v_ilev_chopshopswitch', switchPos = vector3(-221.249237, -1341.07715, 31.96662), switchHeading = 179.535, }, -- Add more lifts here following the same structure }

SERVER EXPORTS

External resources can interact with the lift system via server-side exports:

EXPORTPARAMSRETURNDESCRIPTION
MoveLift elevatorId, target
("up" or "down")
boolean Triggers a lift movement from another resource. Returns false if the lift is busy or already at target position.
GetLiftState elevatorId table Returns the current state table { state, position, time } for a given lift ID.
-- Example: move lift 1 up from another resource (server-side) local success = exports.molo_bennys_carlift:MoveLift(1, "up") -- Example: check current state of lift 2 local state = exports.molo_bennys_carlift:GetLiftState(2) -- state.state → "idle" | "moving" -- state.position → "up" | "down"

SCRIPT — PAINT SHOP

🎨 MOLO_PAINTSHOP

v2.2.1

Full paint booth system with NUI color picker. Drive a vehicle into the booth, interact with the tablet panel, and apply custom colors in real-time with spray animation.

Features:

— 24 preset RGB colors + custom primary/secondary color selection
— 2 paint finishes: Metallic & Matte
— Payment system: player bank/cash, society account, or free
— Auto-detects ESX & QBCore frameworks
— Spray animation with particle effects (steam jets) and sound
— Color rollback on cancel (restores original color + finish)
— Smooth camera system focused on the vehicle
— Live color & finish preview before applying
— Network synchronized across all players

PAYMENT SYSTEM

The paint shop includes a built-in payment system with 3 modes. Configure it in config.lua:

-- Payment configuration Config.Payment = { enabled = true, source = 'player', -- 'none', 'player', or 'society' society = 'bennys', -- Society account name (if source = 'society') moneyType = 'bank', -- 'bank' or 'cash' } -- Price per paint application (0 = free) Config.PaintPrice = 500

PAYMENT MODES

SOURCEBEHAVIORUSE CASE
'none' Free — no charge applied Mechanic bills the customer manually via in-game invoicing
'player' Player pays from their bank or cash Self-service paint booth, no mechanic needed
'society' Benny's society account is charged Mechanic shop covers cost — employee applies the paint
ℹ FRAMEWORK SUPPORT

Payment auto-detects ESX (es_extended + esx_addonaccount for society) and QBCore (qb-core + qb-management for society). If no framework is found, payment is disabled and painting is free.

✦ ROLLBACK ON CANCEL

If the player closes the paint UI without applying, the vehicle's original color and finish are fully restored. Payment is only processed when the player clicks Apply.

SCRIPT — PERFORMANCE TUNING

⚙️ MOLO_TUNING

v1.0.0

Performance workshop with interactive NUI panel. Drive a vehicle into the zone, interact with the tablet panel, and upgrade individual components with visual and audio feedback.

Available upgrades:

PARTLEVELSDESCRIPTION
🔧 Engine4Improves overall engine performance
💨 TurboOn/OffSignificant power boost
⚙️ Transmission3Improves gear shifting speed
🛑 Brakes3Reduces braking distance
🔩 Suspension4Improves handling and road grip
🛡️ Armor5Reinforces body resistance

Features:

— Visual install flash effect + card pulse animation
— Turbo enable with camera shake feedback
— Live preview before buying
— Rear camera system with vehicle focus
— Network synchronized across all players

JOB RESTRICTION

All three scripts support job-based access control. When enabled, only players with the specified job can interact with the switches/panels. The system auto-detects ESX and QBCore frameworks.

CONFIGURATION

Each script has the same three config options in its config.lua:

-- Enable/disable job restriction Config.UseJobRestriction = true -- Allowed jobs (name = minimum grade required, 0 = any grade) Config.AllowedJobs = { ['mechanic'] = 0, -- All grades ['bennys'] = 0, -- All grades -- ['police'] = 2, -- Grade 2+ only } -- Framework: 'esx', 'qbcore', or 'auto' (auto-detect) Config.Framework = 'auto'
ℹ HOW IT WORKS

The restriction uses canInteract on ox_target — if the player doesn't have the right job, the interaction option simply doesn't appear. For qb-target, the same logic applies via the circle zone action. Job changes are detected in real-time via framework events.

To disable job restriction entirely (anyone can use it), simply set:

Config.UseJobRestriction = false

CONFLICTS

MAP CONFLICT — FLICKERING OR INVISIBLE WALLS

If you see flickering textures or invisible collision, another map is conflicting with Benny's. This is not a problem with the map — it's a conflict with a surrounding map.

To fix:

1. Identify which map is causing the conflict
2. Use the Vertex Hub Compatibility Tool to detect and fix overlaps
3. Code molo = 2 free merges

🔗 vertexhub.gg

COLLISION CONFLICT — CAN'T ENTER THE MLO

If you can't enter the MLO or walk through it, you have a collision conflict with another map resource. Disable other maps one by one to identify the culprit.

DOOR ISSUES

The main garage door in V2 opens like a real garage door. If it doesn't animate properly, make sure you have the latest version of the resource and that no other script is overriding the door behavior.

TROUBLESHOOTING

SCRIPTS DON'T WORK — OX_TARGET NOT SHOWING

Make sure ox_target and ox_lib are started before the Benny's scripts in your server.cfg. Also verify that job restriction is configured correctly — if UseJobRestriction is true, you need the right job to see the interaction.

CAR LIFT DOESN'T MOVE

Check the server console for errors. The lift uses GlobalState for synchronization — make sure no other resource is interfering. If the lift is stuck in "moving" state, restart the resource to reset all states.

If the switch interaction doesn't appear, check that at least one target system is running (ox_target or qb-target). Enable CarLift.Config.IsDev = true to see which system was detected in the console. If CarLift.Config.TargetSystem is set to 'auto' but neither resource is started, no interaction zone will register.

If job restriction is enabled (UseJobRestriction = true), verify the player has a matching job in AllowedJobs with sufficient grade.

PAINT/TUNING CAMERA NOT WORKING

The camera system requires the vehicle to be within the carZone defined in config.lua. Make sure the vehicle is parked inside the designated area before interacting with the panel.

PAYMENT NOT WORKING — "NO FRAMEWORK"

Check the server console for [paintshop] No framework detected. This means es_extended or qb-core is not started before the paint shop resource. Fix your server.cfg load order, or set Config.Payment.source = 'none' to disable payment.

For society payment, make sure esx_addonaccount (ESX) or qb-management (QBCore) is installed and the society account name matches your config.

FRAMEWORK NOT DETECTED

If auto-detection doesn't work, manually set the framework in each script's config:

Config.Framework = 'esx' -- or 'qbcore'

FAQ

CAN I USE THE SCRIPTS WITHOUT THE MAP?

The scripts are designed for Benny's V2 coordinates. You can adapt them by modifying the positions in each script's config.lua, but they are built to work with this specific MLO layout.

CAN I EDIT TEXTURES?

Yes — YTD texture files are freely editable. The 3D models are protected via CFX Escrow. You can replace logos, colors, and branding using OpenIV.

WHAT SERVER BUILD IS REQUIRED?

Server build 4752 or above is required to use this resource (CFX Escrow requirement).

DO I NEED ALL THE SCRIPTS?

No — the scripts are optional. The MLO (molo_bennys) works on its own. You can pick and choose which scripts to use based on your server needs.

TECHNICAL DETAILS

PROPERTYVALUE
Map Size~45 MB
LocationBenny's Original Motor Works, La Mesa
Coordinates-234.903, -1329.633, 31.295
Audio OcclusionYes
Custom PropsYes (extensive)
CollisionRealistic, custom
LODsIncluded
EscrowCFX Asset Escrow (3D protected, YTD editable)
Min. Server Build4752+