The Creator#
Everything players interact with is built in game by an admin with /drugcreator. There are three kinds of entity:
Type | What it is |
|---|---|
Collection | A farming zone where players harvest a raw material: weed plants, chemical barrels, coca plants, or your own. |
Laboratory | A property that players buy and process drugs in. An instanced shell or an existing MLO. |
Seller | An NPC dealer, or a door to knock on, that buys drugs from a catalogue. |
The left panel lists everything already created, with a search box and the filters All · Collection · Lab · Seller. Each entry can be teleported to, edited or removed. Create Drug starts a new one: pick the type, fill in the form, place its points in the world and press Save. The entity appears for every player at once, with no restart.
The name is turned into an id: it is lower-cased and spaces and hyphens become underscores. It must be unique across all three types.
Creator controls#
Each Select button closes the panel and gives you a free camera. The keys are shown on screen and can be changed in ActionControls in config/main.lua.
Key | Does |
|---|---|
W A S D · Q / E | Fly the camera, and move it down or up. |
Left click | Add a zone point, place a prop or set a position. |
Right click | Undo the last point or prop. |
Z / X | Rotate the ghost, or change a zone's height. |
← / → | Change the shell while placing a lab. |
Mouse wheel | Raise or lower the shell. |
Enter | Done. |
Backspace / Esc | Cancel. |
Blips#
Every type has a Blip Settings section: name, sprite (searchable, with pictures), colour, scale and a Show on Map switch. A lab the player owns shows (Yours) after its name. Turn the blip off to keep a spot secret.
Farming Zones#

Pick the drug
Create Drug → Collection. Choose a Drug Type card (Weed, Chemicals, Cocaine, or your own from
Config.CollectItems) and the Maximum Collection Count: how many props the zone has. The default is 5.Draw the zone
Zone Points → Select. Click around the field to draw its outline, and use Z / X to set its height. It needs at least 4 points and a perimeter of at least 50 metres (
Config.MinPointLength). The outline turns green when it is valid. Zones cannot overlap.Place the props
Collection Points → Select. Click to drop each plant inside the zone and rotate it with Z / X. Props are placed on the ground and must be at least 0.75 m apart. Enter only finishes when you have placed exactly the Maximum Collection Count.
In game, the props appear when the first player walks into the zone and disappear when it is empty. A player presses E at a prop (or uses the target), kneels to harvest it while a progress bar runs, and receives between quantityMin and quantityMax of the item. Two players cannot harvest the same prop. Harvested props grow back after Config.FarmSpawnTimer (5 minutes).
A drug type with requiredCops = true can only be harvested while at least requiredCopsQuantity police are on duty.
Laboratories#
Create Drug → Laboratory. Give it a name and a Price (default 500), then choose the interior:
An instanced interior: every lab has its own private copy, so many labs can share one shell model. The shells ship in K4MB1-QuasarDrugs.
Entry: place the door outside, where players interact.
Shell: the shell appears under the map. Switch between shells with ← / →, raise or lower it with the mouse wheel, rotate it with Z / X and confirm with Enter.
Exit Coords: place the exit inside the shell. It is also where players appear when they enter.
An interior that already exists in the map.
Entry: where players interact outside.
Zone Points: draw the outline of the building, as for a farm. Inside it counts as inside the lab.
Test Coordinates: where players appear when they enter.
MLO Doors: aim at each door and click. It turns green. Key holders can then lock and unlock those doors with E, and the lock is synced to everyone. Doors closer than 3 m are merged into one prompt, for double doors.

Buying a lab#
At the entry of a lab nobody owns:
Key | Does |
|---|---|
G | Inspect: a visit inside for |
E | View the contract: the price, a bank fee, a broker fee and taxes, the character's name and a signature line. Signing buys the lab. The price is paid in |

Getting in#
E enters a lab you own, hold keys to, that is public, or that is unlocked. Anybody else presses G to ring the doorbell, and someone inside can let them in from the exit. A player who disconnects inside a shell lab is put back inside when they reconnect.
Inside a lab#
Point | What it does |
|---|---|
Stash | E opens it, G sets a vault code: a 4-digit PIN, up to 5 per lab. Size from |
Wardrobe | Opens your clothing script's outfits. |
Exit | Leaves the lab, or opens the door to whoever rang the bell. |
Processing tables | E starts the step that table does. See below. |
The stash and wardrobe are placed by the owner from the lab menu, with Locate Storage and Locate Wardrobe. Inside a shell, the weather is always clear and the clock is fixed at Config.TimeInterior (23:00) so the lighting does not flicker.
Processing Drugs#
Processing happens at furniture bought in decoration mode. Each table model is bound to one step in Config.DynamicFurnitures. When a player presses E, the script checks the lab level, the ingredients and that nobody else is using the table. The player then walks to it and plays the GTA Online business scene, with its props. At the end, the ingredients are taken, the product is given, and the lab earns experience.
Drug | Step | Takes | Gives | Table |
|---|---|---|---|---|
Meth | Cook · 50 s | 5 chemicals | 30 meth |
|
Meth | Package · 38 s | 10 meth | 10 meth_packaged |
|
Cocaine | Cut · 19 s | 1 cocaine | 1 cocaine_cut |
|
Cocaine | Package · 42 s | 1 cocaine_cut | 1 cocaine_packaged |
|
Weed | Sort · 23 s | 5 weed | 5 weed_packaged |
|
Money | Cut · 32 s | 100 black money | 100 sorted_money |
|
Money | Count · 18 s | 100 sorted_money | 100 package_money |
|
Money | Wash · 20 s | 100 package_money | $100 clean cash | Any washer or dryer |
Every amount, time and minimum level is set in Config.Process, and the animations in config/scenes.lua.



Lab levels#
Each finished step gives the lab between Config.ExpMin and Config.ExpMax experience (1–3). At 100 EXP the lab goes up a level and the bar starts again. A step with level = 3 in Config.Process refuses to start until the lab is level 3, which is how advanced drugs are locked behind progression. All steps ship at level 1. Admins can set a level with /set_lab_level.

Decorating a Lab#
Inside a lab you hold keys to, press F9 or type /labDeco. Only one person can decorate a lab at a time. The furniture shop opens with its tabs (Kitchen, Bathroom, Bedroom, Living, Garden), its categories and a search box. Items marked Drug Item are processing tables, and items marked Interactive are stashes, wardrobes, cameras or lights.

Key | Does |
|---|---|
Mouse | Drag the gizmo arrows and rings to move and rotate the piece. |
K | Switch between moving and rotating. |
M | Switch between the mouse gizmo and keyboard controls. |
G | Put the piece on the floor. |
F5 | Show or hide the cursor. |
F3 · F | Free camera, and focus the camera on the piece. |
F6 | Free mode. |
Enter | Buy and place it. |
Esc | Leave without saving. |
Furniture is paid in Config.MoneyType. The Stash page lists what is already placed: move a piece, put it away in storage, or sell it back for 30% of its price (Config.SellObjectCommision). Each shell limits how many tables of each drug a lab can hold through Config.Shells[n].limits (10 per drug by default).
The Furniture Creator#
Admins add their own furniture without touching a file with /drugfurniture: object name, label, description, price, colour variants, an image, and optionally make it a stash (slots and weight) or a wardrobe. A live preview shows the prop, and a category manager creates new categories. These pieces are saved in the database and appear in every lab's shop. The pieces from config/furniture.lua cannot be deleted here.
The creator can take the picture for you with screenshot-basic and upload it to FiveManage. To use it, add your token to config/main.lua:
Config.FiveManageToken = 'your-fivemanage-api-token'The Lab Menu#
The owner and key holders open it with /labMenu, inside the lab or next to its entry.
Section | What it does |
|---|---|
Quick Access | Locate the wardrobe, the storage or a phone charger: stand where you want it and press G. Charging needs qs-smartphone-pro. |
Music | Play a track from |
Decorate | Opens decoration mode. |
Door and access | Lock or unlock the door, and make the lab public, so anyone can enter and work in it. |
Keys | Give keys to a player within 10 m, or take them away. |
Lab level | The current level and its experience out of 100. |
Lights and cameras | Switch spotlights on or off, change their colour and brightness, and watch any CCTV camera placed in the lab (Backspace to leave it). |
Sell to the bank | Sells the lab back for 50% of its price, paid to the bank. The lab goes back on the market. |
Each button can be hidden through Config.ManagementButtons.

Dealers#
Create Drug → Seller. Pick the ped model (or turn on Knock Door to use a door and a knock animation with no ped), the Item List it buys from, its working hours, and place it.
Players press E at the dealer and pick a drug from the menu. The dealer buys all of that drug the player carries, at the catalogue price, in the catalogue's currency. Outside its working hours the dealer refuses and says when its shift starts. The working hours follow the in-game clock, and the end hour must be later than the start hour.
The catalogues live in Config.SellerItems. Four ship ready: weeds ($100 a bag), meths ($200), cocaines ($300) and all, all paid in black money.
Config.SellerItems = {
{
id = 'weeds', -- unique; what the creator's Item List selects
label = 'Weed Items',
description = 'All of the Weed items',
items = {
{ label = 'Packaged Weed', description = '...', item = 'weed_packaged', price = 100, moneyType = 'black_money' },
},
},
}
-- moneyType: 'black_money' | 'money' | 'bank' (on QBCore 'black_money' means markedbills)Street Corner Selling#
Any player carrying a drug listed in Config.DrugsPrice types /selldrug on foot to start selling. Locals walk up and make an offer for up to 15 bags.
What happens | Controlled by |
|---|---|
E accepts the deal and pays black money; G turns it down. |
|
Some locals walk past without buying. |
|
A lowball offer of $1–5 a bag. |
|
The buyer snatches the drugs and runs. Take them down and press E to get them back. |
|
A witness calls the police after a deal. |
|
Selling is refused. |
|
Walking more than 10 m from where you started stops selling, and typing /selldrug again turns it off.

Drug Effects#
Items in Config.UseableDrugItems can be used from the inventory. One is taken, the player plays the animation of its effectType, and its effects last effectDuration seconds.
Config.UseableDrugItems = {
{ name = 'weed', effectType = 'smoke', effectDuration = 120, effects = { 'pink_visual' } },
{ name = 'meth', effectType = 'pill', effectDuration = 120, effects = { 'visual_shaking', 'sprint_faster' } },
}Field | Values |
|---|---|
|
|
|
|
| Seconds. |

Lockpicks and Police Raids#
Item | Who | What happens |
|---|---|---|
| Anyone | Used next to a locked lab, it starts a skill check. Success lets the player in. Failure breaks the lockpick. |
| Jobs in | The same skill check. Success unlocks the lab's door for the raid. Turn raids off with |
Adding a New Drug#
The config ships with a commented heroine example. Search for heroine in config/main.lua and config/furniture.lua to see every place a drug is wired.
Add the harvest
lua Config.CollectItems['heroine'] = { order = 4, prop = 'prop_barrel_exp_01a', name = 'Heroine', description = 'Heroin collection point', item = 'opium', -- the item players harvest time = 4000, -- ms to harvest quantityMin = 1, quantityMax = 5, requiredCops = false, requiredCopsQuantity = 0, collect_label = 'Collecting opium...', }Add the processing step
Weed, meth, cocaine and money use the cinematic scenes. Any other drug uses a simple animation from
Config.DrugAnimations:lua Config.DrugAnimations['heroine'] = { process = { dict = 'mp_player_intdrink', anim = 'loop_bottle', progressBarLabel = 'Processing Heroine...', progressBarTime = 5000, requireItems = { { item = 'opium', amount = 1 } }, rewardItem = 'heroin', rewardRate = 1, level = 1, -- minimum lab level prop = { model = `prop_ld_flow_bottle`, pos = vec3(0.03, 0.03, 0.02), rot = vec3(0.0, 0.0, -1.5) }, }, }Bind a table and sell it
In
config/furniture.lua, add the table toConfig.DynamicFurnituresand to a furniture category withtype = 'drug'anddrugType = 'heroine'. Then addheroine = 10to each shell'slimits, the product toConfig.DrugsPriceandConfig.SellerItems, and the new items to your inventory.lua ['prop_sink_06'] = { drugType = 'heroine', fn = processDrug('heroine', 'process'), offset = { x = 0.0, y = 0.0, z = 0.0 }, -- where the [E] prompt floats },
The Configuration#
Every option in config/main.lua, grouped. The file tags each one: [EDIT] is safe to change, [ADV] is advanced, [AUTO] is detected for you, and [CORE] should not be touched.
General, money and labs
Config.Locale = 'en' -- file in locales/
Config.MoneyType = 'bank' -- buys labs and furniture: 'money' | 'bank' | 'black_money'
Config.LabMenu = 'labMenu' -- lab menu command
Config.LabDecoration = 'labDeco' -- decoration command
Config.DecorationMappingKey = 'F9' -- decoration key (players can rebind it in GTA settings)
Config.TimeInterior = 23 -- clock inside shells
Config.TestRemTime = 1 -- minutes of an inspection visit
Config.CreatorAlpha = 200 -- ghost transparency in the creator
Config.MinZOffset = 30 -- how far under the map the shell is placed
Config.DefaultLightIntensity = 20.0 -- spotlight brightness
Config.DefaultStashData = { maxweight = 1000000, slots = 30 } -- lab stash
Config.ExpMin, Config.ExpMax = 1, 3 -- EXP per finished step; 100 EXP = 1 level
Config.SellObjectCommision = 0.3 -- share of the price refunded when selling furniture
Config.Intl = { locales = 'en-US', options = { style = 'currency', currency = 'USD', minimumFractionDigits = 0 } } -- price format in the UIConfig.BankFee, Config.BrokerFee and Config.Taxes are functions of the price (10 %, 5 % and 5 %) shown on the purchase contract. The buyer is charged the lab's price.
Shells
Config.Shells = {
[1] = { model = 'shell_coke1', limits = { weed = 10, meth = 10, cocaine = 10, money = 10 } },
[2] = { model = 'shell_weed', limits = { weed = 10, meth = 10, cocaine = 10, money = 10 } },
}model is a streamed shell; limits is how many processing tables of each drug a lab with that shell can hold. Any shell you stream yourself can be added to the list.
Farming
Config.FarmSpawnTimer = 1000 * 60 * 5 -- ms before a harvested prop grows back
Config.MinPointLength = 50.0 -- minimum zone perimeter
Config.CollectPropMinDistance = 0.75 -- minimum metres between two props; 0 = no limit
Config.CollectPropGroundSnap = true -- drop props onto the ground while placing
Config.CollectPropSpawnSnap = true -- also drop saved props onto the ground when they spawnConfig.CollectItems defines the drug types: weed (prop_weed_01, gives weed), meth (prop_barrel_exp_01a, gives chemicals) and cocaine (prop_plant_cane_02b, gives cocaine). Each takes 4 seconds and gives 1–5. Weed ships with requiredCops = true and a quantity of 0.
Processing
Config.Process[drug][step], where step is process, package or wash:
meth = {
process = {
progText = 'Processing methamphetamine...',
level = 1, -- minimum lab level
requireItems = { { item = 'chemicals', amount = 5 } }, -- or requireMoney = 100 (black money)
notifyname = 'Chemicals',
rewardItem = 'meth',
rewardRate = 30, -- amount given
time = 50000, -- ms
act = 'Meth', -- scene in config/scenes.lua
process = 'process',
headingOffset = -180, -- where the player stands; advanced
coordsOffset = vector3(-1.0, -0.1, 1.0),
},
},Selling and police
Config.SuccessChance = 50 -- % of locals who walk past without buying
Config.ScamChance = 25 -- % of lowball offers ($1–5 a bag)
Config.RobberyChance = 15 -- % of buyers who rob the seller
Config.RequiredCops = 0 -- police needed for corner selling
Config.PoliceCallChance = 15 -- % of deals that alert the police
Config.DrugsPrice = { -- price per bag on corners; also which items can be sold there
['weed_packaged'] = { min = 15, max = 24 },
['meth_packaged'] = { min = 15, max = 28 },
['cocaine_packaged'] = { min = 15, max = 31 },
}
Config.SellerNPC = { model = 'a_m_m_farmer_01' } -- default dealer ped
Config.LockpickingItem = 'lockpick'
Config.StormArmItem = 'police_stormram'
Config.EnableRaid = true
Config.PoliceJobs = { 'police' }Decoration, doors and music
Config.SpawnDistance = 100.0 -- distance at which placed furniture appears
Config.DynamicDoors = true -- MLO doors; needs setr game_enableDynamicDoorCreation "true"
Config.DoorDistance = 1.5 -- distance to use an MLO door
Config.DoorDuplicateDistance = 3.0 -- doors closer than this share one prompt
Config.Music = 'decorate' -- music in the decoration shop; false to turn it off
Config.MusicVolume = 0.05
Config.MusicTracks = { -- lab music; files go in music/
{ label = 'Ghost in the Broadcast', file = 'ghost_in_the_broadcast.mp3' },
{ label = 'Night Voltage', file = 'night_voltage.mp3' },
{ label = 'Horror Show', file = 'horror_show.mp3' },
}
Config.FurniCreatorCommand = 'drugfurniture'
Config.FurniCreator = { interval = 300 } -- ms between thumbnail captures; raise on slow PCs
Config.FiveGuard = false -- your FiveGuard resource name, so decorating is not flaggedLab music only plays local files from music/. Internet links are not supported.
Target, detection and debug
Config.UseTarget = false -- ox_target or qb-target
Config.TargetDistance = 5.0
Config.TargetWidth = 5.0
Config.TargetLength = 5.0
Config.Framework -- [AUTO] esx | qb
Config.Inventory -- [AUTO]
Config.Dispatch -- [AUTO]
Config.Wardrobe -- [AUTO]
Config.Debug = true -- console logs; false on a live server
Config.ZoneDebug = true -- draws zones; false on a live serverOptional keys you can add
These are read by the script but are not in the file. Add them to config/main.lua if you need them:
Config.MaxVaultCodes = 5 -- vault codes per lab
Config.DisableSounds = true -- mute interface sounds
Config.MaximumDistanceForDecorate = 30.0 -- close decoration if the camera goes this far
Config.FiveManageToken = '' -- furniture creator image uploadsconfig/furniture.lua holds the shop: Config.FurnitureNavigation (the tabs), Config.Furniture (categories and items, with price, colors, and type = 'drug' | 'stash' | 'gardrobe') and Config.DynamicFurnitures (which model does which step). A model used as a stash or wardrobe cannot also be a processing table.



