Advanced Black Market (QB/ESX)

package



Summary

this script provides a realistic black market system for ordering items/vehicles/weapons

after player finished his order the delivery box or vehicle will be arrived from sky with an attached parachute



Video



How It Works ?

  • player goes to one of the black markets (weapons/items/vehicles)

  • selects the goods

  • pays the money at cart (can be by bank account or dirty money)

  • a delivery location will be chosen for player

  • a timer shows up until the delivery arrives (like 2 minutes)

  • player goes to the location and waits

  • when the timer is done the delivery will appear on sky

  • the package or vehicle will be dropped to the ground

  • the second timer shows up for taking the delivery

  • takes the delivery and its done



Market Types

  • there are 3 type of black markets : vehicles/items/weapons

  • each shop has its own categories (the tabs on list)

  • you can also adds the vehicle packs into the shop (the vehicles you added for your server)

  • players can only order one vehicle at vehicles market

  • players can only order one of each weapon (for example he cannot order 2 pistol50)

  • players can order different quantities of each item at items market

  • payment can be done by dirty money or bank account (you choose at config file)

  • dirty money can be an item or account (depends on your server)


weapons



Categories (tabs on menu)

  • at config file you can define or change the categories by your desire
  • you can put any item of your server
  • you can put any vehicle of your server (including vehicle packs and vip cars)
  • and also for weapons



Days System

you can set some products can be sold only at certain days like Thursday and Sundays, so the script will be challenging and more realistic for players to buy some rare products

for example you want the keycard only be sold at monday, tuesday and wednesday
so the structure would be like this at config file :
days = {‘monday’, ‘tuesday’, ‘wednesday’}



Quantity System

for each items or weapons you can set the quantity system, for example you set the “Bullpup Rifle” quantity to 3, so after 3 of that is sold the status will be changed to “out of stock

this also will increase the challenging and realistic


an example :

quantity

you can see Assault SMG is limited by days and Bullpop Rifle is out of stock



Police/Sheruff Notification

there is a chance that security employees like police or sheriff get notification of the delivery

you can set your own security jobs for each location, for example sheriff job

for each type of delivery there is a chance amount at config file that you can change them for each type of delivery

example at config file :

Config.ItemsNotifyPoliceChance = 20
Config.WeaponsNotifyPoliceChance = 50
Config.VehiclesNotifyPoliceChance = 10

if the chance happens then police or sheriff will get an alarm and a located sign on the map



Possible Cases

1. player gets dc

at this case the order will be canceled, money will return into player bank account or dirty money into his pocket

2. canceling the order before arrival

player can cancel the order before delivery arrives but some of the money will be deducted as a penalty and the rest of the money will return (for example 20% penalty)

3. not taking the order

if the delivery box or vehicle has been arrived and player does not take it after a certain time then again there will be a penalty when the money is returned (for example 40% penalty)

at all these cases the quantity of each product that he ordered will be added to the shop again



Delivery Features

  • players cannot take someone’s delivery
  • players cannot kill shop peds or do anything to them
  • players cannot damage delivery boxes or parachutes
  • players cannot damage vehicles while dropping from sky
  • no bug at all while delivery



Easy to Setup

not only we have a lot features and editable settings at config file but also its very easy to do the changes or adding stuffs, there are guide comments for each part



Features

  • supporting all types of dirty money (item or account)
  • good resmon 0.00 ms (passive) and 0.01 (while ordering)
  • easy to config
  • not bug at all (we tested every case)
  • considered all possible cases and for each there is a feedback
  • police/sheriff notification (you will set the job names)
  • very cool and realistic UI
  • supporting all garage systems of esx and qbcore
  • supporting all versions of esx and qbcore



Config Files

Base

Config = {}

-- ESX OPTIONS
Config.UseESX = true -- if you are using esx
Config.ESXTrigger = "esx:getSharedObject" -- Put your ESX Object Trigger Right Here
Config.ESXLegacyLatestVersion = false -- if you are using the last version of esx legacy then set it true
-- also you need to add this code on fxmanifest.lua and set Config.ESXTrigger empty
-- shared_script '@es_extended/imports.lua'

-- QB OPTIONS
Config.UseQB = false -- if you are using qb
Config.QBExport = "qb-core" -- Put your QB Object Export


Config.CancelCommand = 'cancelorder'
Config.UsingTNotify = false --if false then it will use the default esx or qb notification

Delivery

-- police notify when delivery is on process, if the chance happens then police get the alarm and location blip
Config.ItemsNotifyPoliceChance = 20
Config.WeaponsNotifyPoliceChance = 50 -- weapons are not joke so we set to 50 or more
Config.VehiclesNotifyPoliceChance = 10
Config.UseTimerForBlip = false -- if its false then blip will not disappear until the delivery is finished
Config.TimerForBlip = 50000 -- if Config.UseTimerForBlip is true then set the timer in milliseconds, after the timer is finished the blip will disappear from police players
Config.AlarmBlipType = 'normal' -- pulse or normal
Config.PulseAlarmSettings = { -- if you are using pulse alarm
	iconId = 161, -- https://docs.fivem.net/docs/game-references/blips/
	scale = 1.5,
	color = 3,
}
Config.NormalAlarmSettings = {
	iconId = 364, -- https://docs.fivem.net/docs/game-references/blips/
	scale = 0.8,
	color = 1,
	alpha = 250
}

Config.MessageIcon = 'CHAR_BLANK_ENTRY'
Config.DeliveryName = 'Black Market'
Config.DeliveryEmployeeName = 'mr X'
Config.GetDeliveryKey = 38 -- by default [E]
Config.FreezeBoxAfterDrop = true -- when the box reaches out the ground it gets freezed so it wont move
Config.UsingFlareForBox = true -- when the delivery box is dropped then use a flare to player, this feature uses ShootSingleBulletBetweenCoords function so if your anti cheat has problem with that set it false
Config.UsingSoundOnBox = false -- a sound will play when player gets close to the box
Config.TextColorAboveBox = {r = 255, g = 255, b = 255} -- text color that shows up above the box, in locale file its about ['take_your_order']
Config.PenaltyPercentage = 20 -- if player cancels the order 30 percentage of the total money will decrease and the reset will return to his bank account
Config.PenaltyPercentageForNotTaking = 40 -- if delivery box is arrived but player does not take it then after a certain time delivery will be canceled but with more penalty
Config.TimerAfterDelivery = 30 -- after the box landed on the ground player has 30 sec to take it otherwise the order will be canceled
Config.PlateLetters  = 3 -- for vehicles
Config.PlateNumbers  = 3 -- for vehicles
Config.PlateUseSpace = true -- for vehicles
Config.DefaultGarage = 'pillboxgarage' -- for qb
Config.UseDirtyMoneyForBuy = false -- if you set it true it will get player dirty money instead of bank account

-- for qb users if usign dirty moneysystem
-- in qb usually there are 2 type of dirty money, some server uses dirty money as an item some other uses as an account
Config.QBDirtyMoneyType = 'item' -- if its not account then its is item, if its not an item then set account
Config.QBDirtyMoneyName = 'black_money' -- Whether its an item or account set the name


-- remember to add many points because if a point is busy by a buyer then that point cannot be used by another player and has to wait until the buyer gets done with it
-- and if all the points are busy then a message will tells the player to wait
Config.VehicleDeliveryPoints = {
	[1] = {
		Coords = vector3(1361.49, 3092.61, 39.53),
		Timer = 120, -- in seconds, after 2 minutes the order will be dropped from sky
		BoxBlipID = 94,
		BoxBlipColor = 3,
		BoxBlipSize = 1.0,
		BoxBlipName = 'Delivery',
		SecurityJob = 'sheriff'
	},
	[2] = {
		Coords = vector3(1361.49, 3092.61, 39.53),
		Timer = 120,
		BoxBlipID = 94,
		BoxBlipColor = 3,
		BoxBlipSize = 1.0,
		BoxBlipName = 'Delivery',
		SecurityJob = 'sheriff'
	},
}

Config.ItemDeliveryPoints = {
	[1] = {
		Coords = vector3(-1522.49, -2596.61, 14.0),
		Timer = 120,
		BoxBlipID = 94,
		BoxBlipColor = 3,
		BoxBlipSize = 1.0,
		BoxBlipName = 'Delivery Box',
		SecurityJob = 'police'
	},
}

Config.WeaponDeliveryPoints = {
	[1] = {
		Coords = vector3(-1522.49, -2596.61, 14.0),
		Timer = 120,
		BoxBlipID = 94,
		BoxBlipColor = 3,
		BoxBlipSize = 1.0,
		BoxBlipName = 'Delivery Box',
		SecurityJob = 'police'
	},
}

Markets

Config.MarkerPoints = {
	[1] = {
		ShopCategory = 'vehicles', -- we have 3 categories : vehicles, items, weapons
		Coords = vector3(288.73, -1723.69, 28.31),
		NPCModel = GetHashKey('csb_car3guy1'), -- https://docs.fivem.net/docs/game-references/ped-models/
		NPCHeading = 226.18,
		Blip = {
			Show = true,
			BlipSize = 1.2,
			BlipID = 439,
			BlipColor = 3,
			BlipText = 'Vehicle Market'
		}
	},
	[2] = {
		ShopCategory = 'items',
		Coords = vector3(-1574.6, -2553.98, 13.5),
		NPCModel = GetHashKey('a_m_m_polynesian_01'),
		NPCHeading = 226.18,
		Blip = {
			Show = true,
			BlipSize = 1.2,
			BlipID = 439,
			BlipColor = 2,
			BlipText = 'Items Market'
		}
	},
	[3] = {
		ShopCategory = 'weapons',
		Coords = vector3(299.92, -1700.98, 28.31),
		NPCModel = GetHashKey('a_m_m_rurmeth_01'),
		NPCHeading = 317.0,
		Blip = {
			Show = true,
			BlipSize = 1.2,
			BlipID = 439,
			BlipColor = 1,
			BlipText = 'Weapons Market'
		}
	},
}

Items

Config.ItemCategories = {
	[1] = { -- must be a unique index number
		id = 'hacking', -- must be unique and lower case
		label = 'Hacking', -- can be upper case
		items = {
			keycard = {
				label = 'Keycard',
				price = 20000,
				image = 'keycard.png',
				count = 20, -- how many at stock, if u set the count to -1 then it will become unlimited
				maximum = 2, -- maximum per order, for example player can only 2 of this item
				days  = {'monday'},
				info  = 'only available on monday'
			},
			lockpick = {
				label = 'Lockpick',
				price = 15000,
				image = 'lockpick.png',
				count = -1, -- unlimited
				maximum = 5,
				days  = {}, -- if u want to sell it everyday
				info  = ''
			},
			laptop = {
				label = 'Hack Laptop',
				price = 25000,
				image = 'laptop.png',
				count = -1,
				maximum = 1,
				days  = {},
				info  = ''
			},
		}
	},
	[2] = {
		id = 'bombs',
		label = 'Bombs',
		items = {
			normal_c4 = {
				label = 'C4',
				price = 5000,
				image = 'normal_c4.png',
				count = 10,
				maximum = 2,
				days  = {},
				info  = ''
			},
			remotebomb = {
				label = 'Remote Bomb',
				price = 5000,
				image = 'remotebomb.png',
				count = 10,
				maximum = 1,
				days  = {'wednesday'},
				info  = 'only available on wednesday'
			},
			timerbomb = {
				label = 'Timer Bomb',
				price = 5000,
				image = 'timerbomb.png',
				count = 10,
				maximum = 3,
				days  = {},
				info  = ''
			},
			instantbomb = {
				label = 'Instant Bomb',
				price = 5000,
				image = 'instantbomb.png',
				count = 10,
				maximum = 1,
				days  = {},
				info  = ''
			},
		}
	},
}

Vehicles

Config.VehicleCategories = {
	[1] = { -- must be a unique index number
		id = 'sport', -- must be unique and lower case
		label = 'Sport', -- can be upper case
		items = {
			alpha = { -- must be the exact name that exist on database
				label = 'Alpha',
				price = 20000,
				image = 'alpha.jpg', -- image name at img folder
				count = 3, -- how many at stock, if u set the count to -1 then it will become unlimited
				days  = {'monday'}, -- which days this weapon can be available to be bought
				info  = 'only available on monday' -- if you want to add info about which days this weapon is available
				-- when player move mouse over the item the info will show up
			},
			banshe = {
				label = 'Banshe',
				price = 30000,
				image = 'banshe.jpg',
				count = 3,
				days  = {'tuesday', 'wednesday'},
				info  = 'only available on tuesday, wednesday'
			},
			buffalo2 = {
				label = 'Buffalo',
				price = 30000,
				image = 'buffalo2.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			neon = {
				label = 'Neon',
				price = 40000,
				image = 'neon.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			pariah = {
				label = 'Pariah',
				price = 20000,
				image = 'pariah.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			schafter3 = {
				label = 'Schafter3',
				price = 50000,
				image = 'schafter3.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			
		}
	},
	[2] = {
		id = 'supersport',
		label = 'Super Sport',
		items = {
			cheetah = {
				label = 'Cheetah',
				price = 100000,
				image = 'cheetah.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			adder = {
				label = 'Adder',
				price = 100000,
				image = 'adder.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			reaper = {
				label = 'Reaper',
				price = 200000,
				image = 'reaper.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
		}
	},
	[3] = {
		id = 'muscle',
		label = 'Muscle',
		items = {
			buccaneer = {
				label = 'buccaneer',
				price = 60000,
				image = 'Buccaneer.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			sabregt = {
				label = 'Sabregt',
				price = 50000,
				image = 'sabregt.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			blade = {
				label = 'Blade',
				price = 60000,
				image = 'blade.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			vamos = {
				label = 'Vamos',
				price = 65000,
				image = 'vamos.jpg',
				count = 3,
				days  = {},
				info  = ''
			},
			virgo = {
				label = 'Virgo',
				price = 70000,
				image = 'virgo.jpg',
				count = 3,
				days  = {},
				info  = ''
			},			
		}
	},
	
}

Weapons

Config.WeaponCategories = {
	[1] = { -- must be a unique index number
		id = 'rifle', -- must be unique and lower case
		label = 'Rifls', -- can be upper case
		items = {
			weapon_advancedrifle = { -- must be the exact name that exist on database
				label = 'Advanced Rifle',
				price = 20000,
				image = 'weapon_advancedrifle.png', -- image name at img folder
				count = 20, -- how many at stock, if u set the count to -1 then it will become unlimited
				days  = {'monday', 'tuesday', 'wednesday'}, -- which days this weapon can be available to be bought
				info  = 'only available on monday, tuesday, wednesday' -- if you want to add info about which days this weapon is available
				-- when player move mouse over the item the info will show up
			},
			weapon_assaultrifle = {
				label = 'Assault Rifle',
				price = 15000,
				image = 'weapon_assaultrifle.png',
				count = -1,
				days  = {}, -- if u want this weapon be available everyday
				info  = ''
			},
			weapon_assaultsmg = {
				label = 'Assault SMG',
				price = 10000,
				image = 'weapon_assaultsmg.png',
				count = 20,
				days  = {'thursday', 'tuesday'},
				info  = 'only available on thursday and tuesday'
			},
			weapon_bullpuprifle = {
				label = 'Bullpop Rifle',
				price = 12000,
				image = 'weapon_bullpuprifle.png',
				count = 1,
				days  = {},
				info  = ''
			},
		}
	},
	[2] = {
		id = 'smg',
		label = 'Smg',
		items = {
			weapon_smg = {
				label = 'SMG',
				price = 5000,
				image = 'weapon_smg.png',
				count = 20,
				days  = {},
				info  = 'Some Info'
			},
			weapon_minismg = {
				label = 'Mini SMG',
				price = 5000,
				image = 'weapon_minismg.png',
				count = 20,
				days  = {},
				info  = 'Some Info'
			},
			weapon_microsmg = {
				label = 'Micro SMG',
				price = 5000,
				image = 'weapon_microsmg.png',
				count = 20,
				days  = {},
				info  = 'Some Info'
			},
			weapon_machinepistol = {
				label = 'Machine Pistol',
				price = 5000,
				image = 'weapon_machinepistol.png',
				count = 20,
				days  = {},
				info  = 'Some Info'
			},
		}
	},
	[3] = {
		id = 'pistol',
		label = 'Pistol',
		items = {
			weapon_combatpistol = {
				label = 'Combat Pistol',
				price = 2000,
				image = 'weapon_combatpistol.png',
				count = 20,
				days  = {},
				info  = 'Some Info'
			},
			weapon_snspistol = {
				label = 'SNS Pistol',
				price = 500,
				image = 'weapon_snspistol.png',
				count = 20,
				days  = {},
				info  = 'Some Info'
			},
		}
	}
}



Requirements

  • ESX or QB
  • t-notify (optional)



Tebex Link

You can buy the script from here



my Biggest projects

HUNK-AC (the most complate 2022 fivem anti cheat)

ESX Society Remastered + More Options



my Other Scripts

Advanced Lock System (QB, ESX)
Uber Eats (ESX, QB)
ESX Society Remastered
Realistic Fast Food
ESX Car Bomb
ESX Books + Reading
ESX Crafting System
QB Crafting System
ESX Jobs List
ESX Document Robbery
Realistic Coffee Job (ESX)



Code is accessible No
Subscription-based No
Lines (approximately) 3000
Requirements esx/qb
Support Yes always
8 Likes

what a fantastic script
its new and looks cool
i will buy it for my server
good job :+1:

1 Like

Using it already amazing config options and easy to use. Plus the option to use black money item as currency.

1 Like

woah this scripts offers so much,

  1. Immersion, it is not boring classic BlackMarket you see everywhere, this is unique aproach
  2. Huge config file
  3. And well secured
1 Like