INSTALLATION
1. DOWNLOAD
The first step is to download the product we have just purchased. To do this we will go to our KEYMASTER account and search for "Buty-BoatSchool".
2. DEPENDENCIES AND INSTALLATION
This script does not need any dependencies or progress bar.
Just place the script under your CORE and your core scripts:
ensure Buty-BoatSchool
And when you have everything clean without another Boat School script, you will have to install the Buty-BoatSchool SQL.
3. CONFIG
The following will explain all the settings, one of the most important things that I recommend you spend a few minutes to understand in order to offer your users the best possible experien
The SERVER > OPEN is where you have to configure the correct event/export that your license system uses.
If you use the DEFAULT of ESX/QB you don't have to touch anything, the same if you use the Buty-License you only have to activate it in the CONFIG.
Framework = {
FrameworkName = 'esx', -- esx or qb
FileName = 'es_extended', -- es_extended / qb-core
SQLWrapper = 'oxmysql', -- oxmysql / mysql-async / ghmattimysql
UseButyLicense = false -- true / false -> https://butycall.tebex.io/package/5743295
}
Prices = {
PaymentMethod = 'bank', -- bank / cash
Theoretical = 10000,
Practical = 15000
}
NPC = {
Position = vector4(-786.698914, -1385.380249, 0.578735, 45.354328),
Model = 's_m_m_pilot_01'
}
Blip = {
Sprite = 427,
Color = 38,
Scale = 1.0,
Label = 'Boat School'
}
TheoreticalExam = {
MistakeMax = 2,
ExamTime = 2.5, -- In minutes
Questions = {
{
Question = 'Question #1 Airplane',
Answers = {
{ Text = 'Answer #1', Right = false },
{ Text = 'Answer #2', Right = true },
{ Text = 'Answer #3', Right = false }
}
},
{
Question = 'Question #2 Airplane',
Answers = {
{ Text = 'Answer #1', Right = false },
{ Text = 'Answer #2', Right = false },
{ Text = 'Answer #3', Right = true }
}
},
{
Question = 'Question #3 Airplane',
Answers = {
{ Text = 'Answer #1', Right = true },
{ Text = 'Answer #2', Right = false },
{ Text = 'Answer #3', Right = false }
}
},
{
Question = 'Question #4 Airplane',
Answers = {
{ Text = 'Answer #1', Right = true },
{ Text = 'Answer #2', Right = false },
{ Text = 'Answer #3', Right = false }
}
},
{
Question = 'Question #5 Airplane',
Answers = {
{ Text = 'Answer #1', Right = true },
{ Text = 'Answer #2', Right = false },
{ Text = 'Answer #3', Right = false }
}
},
{
Question = 'Question #6 Airplane',
Answers = {
{ Text = 'Answer #1', Right = true },
{ Text = 'Answer #2', Right = false },
{ Text = 'Answer #3', Right = false }
}
},
{
Question = 'Question #7 Airplane',
Answers = {
{ Text = 'Answer #1', Right = true },
{ Text = 'Answer #2', Right = false },
{ Text = 'Answer #3', Right = false }
}
},
{
Question = 'Question #8 Airplane',
Answers = {
{ Text = 'Answer #1', Right = true },
{ Text = 'Answer #2', Right = false },
{ Text = 'Answer #3', Right = false }
}
}
}
}
PracticalExam = {
MissionTime = 10, -- In minutes
Model = 'speeder',
VehiclePlate = 'Boat School',
SpawnCoords = {
vector4(-767.46, -1379.73, 0.12, 51.7)
},
CheckpointMarker = { Type = 6, Size = 25.0, Color = { 47, 92, 115, 255 } },
Texts = {
-- First mission
[1] = 'Exit the Port Zone',
-- Second mission
[2] = 'Navigate the Circuit, without leaving the course',
-- Third mission
[3] = 'Avoid Obstacles',
-- Fourth mission
[4] = 'Navigate the Circuit through the channels of Los Santos',
-- Fifth mission
[5] = 'Park the boat without crashing'
},
Routes = {
{
-- First mission
{
{ Pos = vector3(-835.23, -1529.29, 0.12) }
},
-- Second mission
{
{ Pos = vector3(-907.18, -1600.54, 0.12) },
{ Pos = vector3(-989.66, -1689.09, 0.03) },
{ Pos = vector3(-1077.44, -1772.11, 0.3) },
{ Pos = vector3(-1195.42, -1876.2, 0.28) },
{ Pos = vector3(-1259.57, -1969.62, 0.22) },
{ Pos = vector3(-1346.27, -1997.89, 0.38) },
{ Pos = vector3(-1433.55, -2047.24, -0.07) },
{ Pos = vector3(-1559.25, -2163.55, 0.34) },
{ Pos = vector3(-1687.87, -2261.56, 0.53) }
},
-- Third mission
{
{ Pos = vector3(-1829.74, -2658.66, 0.92) },
{ Pos = vector3(-1915.89, -2803.36, 1.33) },
{ Pos = vector3(-1969.02, -2779.17, 0.53) },
{ Pos = vector3(-1881.45, -2637.39, 0.92) }
},
-- Fourth mission
{
{ Pos = vector3(-1054.7, -1752.16, 0.4) },
{ Pos = vector3(-884.52, -1582.59, 0.03) },
{ Pos = vector3(-843.25, -1457.1, -0.04) },
{ Pos = vector3(-912.36, -1355.74, -0.08) },
{ Pos = vector3(-988.33, -1356.51, -0.05) },
{ Pos = vector3(-1057.62, -1229.95, -0.51) },
{ Pos = vector3(-1106.41, -1150.69, -0.54) },
{ Pos = vector3(-1113.44, -1120.62, -0.37) },
{ Pos = vector3(-1000.25, -1054.48, -0.45) },
{ Pos = vector3(-947.37, -1024.16, -0.45) },
{ Pos = vector3(-914.38, -1073.83, -0.5) },
{ Pos = vector3(-899.48, -1118.03, -0.58) },
{ Pos = vector3(-948.45, -1147.04, -0.56) },
{ Pos = vector3(-1008.26, -1181.01, -0.41) },
{ Pos = vector3(-1058.91, -1235.53, -0.46) },
{ Pos = vector3(-982.39, -1364.26, -0.03) },
{ Pos = vector3(-926.6, -1358.44, -0.08) },
{ Pos = vector3(-835.98, -1464.27, -0.04) }
},
-- Fifth mission
{
{ Pos = vector3(-859.13, -1486.98, -0.09) }
}
}
}
}
Translation = {
OpenMenu = '~w~PRESS ~ub~[E]~wu~ ~w~to open the boat school',
NotEnoughMoney = 'You don\'t have enough money'
}
This SCRIPT does not need many open functions since everything is already self-configured.
It is recommended that many of the modifications to the OPENFUNCTION files be made by a programmer with LUA and FiveM ideas.
-- Triggered when the practical exam vehicle was spawned
-- vehicle = the vehicle handle
function VehicleSpawned(vehicle)
end
-- Triggered before the script deletes the mission vehicle
-- vehicle = the vehicle handle
function VehicleDeleted(vehicle)
end
-- Triggered when the player died while in mission
-- If you are using the default esx_ambulancejob or qb-ambulancejob then leave it blank
function RevivePlayer()
end
function Text(text,coords)
local dist = Vdist(coords.x,coords.y,coords.z,GetEntityCoords(PlayerPedId(-1)))
if dist < 1.5 then
DrawText3Ds(coords.x,coords.y,coords.z + 1.05,text, 0, 0.1, 0.1,255)
else
DrawText3Ds(coords.x,coords.y,coords.z + 1.05,text, 0, 0.1, 0.1,100)
end
end
function DrawText3Ds(x, y, z, text)
SetTextScale(0.35, 0.35)
SetTextFont(4)
SetTextProportional(1)
SetTextColour(255, 255, 255, 215)
SetTextEntry("STRING")
SetTextCentre(true)
AddTextComponentString(text)
SetDrawOrigin(x,y,z, 0)
DrawText(0.0, 0.0)
ClearDrawOrigin()
end
-- Triggered when player passed the theoretical / practical exam
-- source = player id
-- license = license type (airplane, helicopter)
-- exam = exap type (theoretical, practical)
function AddLicense(source, license, exam)
if ESX then
if exam == "practical" then
TriggerEvent('esx_license:addLicense', source, license, function() end)
end
elseif QBCore then
local qbPlayer = QBCore.Functions.GetPlayer(source)
if exam == "practical" then
if qbPlayer.PlayerData.source ~= nil then
local licenseTable = qbPlayer.PlayerData.metadata['licences']
licenseTable[license] = true
qbPlayer.Functions.SetMetaData('licences', licenseTable)
qbPlayer.Functions.Save()
end
end
end
end
-- Triggered when notification needs to be shown
-- source = player id
-- text = notification text
function Notification(source, text)
end
```
If you want to edit the aesthetics or design. You have the HTML open so you can modify the style and everything as you want.
The script is RESPONSIVE for all resolutions as well.
Last updated