445 lines
20 KiB
Lua
445 lines
20 KiB
Lua
local LastMarker, LastPart, thisGarage, thisPound = nil, nil, nil, nil
|
|
local next = next
|
|
local nearMarker, menuIsShowed = false, false
|
|
local vehiclesList, vehiclesImpoundedList = {}, {}
|
|
|
|
RegisterNetEvent('esx_garage:closemenu')
|
|
AddEventHandler('esx_garage:closemenu', function()
|
|
menuIsShowed = false
|
|
vehiclesList, vehiclesImpoundedList = {}, {}
|
|
|
|
SetNuiFocus(false)
|
|
SendNUIMessage({
|
|
hideAll = true
|
|
})
|
|
|
|
if not menuIsShowed and thisGarage then
|
|
ESX.TextUI(TranslateCap('access_parking'))
|
|
end
|
|
if not menuIsShowed and thisPound then
|
|
ESX.TextUI(TranslateCap('access_Impound'))
|
|
end
|
|
end)
|
|
|
|
RegisterNUICallback('escape', function(data, cb)
|
|
TriggerEvent('esx_garage:closemenu')
|
|
cb('ok')
|
|
end)
|
|
|
|
RegisterNUICallback('spawnVehicle', function(data, cb)
|
|
local spawnCoords = vector3(data.spawnPoint.x, data.spawnPoint.y, data.spawnPoint.z)
|
|
if thisGarage then
|
|
|
|
if ESX.Game.IsSpawnPointClear(spawnCoords, 2.5) then
|
|
thisGarage = nil
|
|
TriggerServerEvent('esx_garage:updateOwnedVehicle', false, nil, nil, data, spawnCoords)
|
|
TriggerEvent('esx_garage:closemenu')
|
|
|
|
ESX.ShowNotification(TranslateCap('veh_released'))
|
|
|
|
else
|
|
ESX.ShowNotification(TranslateCap('veh_block'), 'error')
|
|
end
|
|
|
|
elseif thisPound then
|
|
|
|
ESX.TriggerServerCallback('esx_garage:checkMoney', function(hasMoney)
|
|
if hasMoney then
|
|
if ESX.Game.IsSpawnPointClear(spawnCoords, 2.5) then
|
|
TriggerServerEvent('esx_garage:payPound', data.exitVehicleCost)
|
|
thisPound = nil
|
|
|
|
TriggerServerEvent('esx_garage:updateOwnedVehicle', false, nil, nil, data, spawnCoords)
|
|
TriggerEvent('esx_garage:closemenu')
|
|
|
|
else
|
|
ESX.ShowNotification(TranslateCap('veh_block'), 'error')
|
|
end
|
|
else
|
|
ESX.ShowNotification(TranslateCap('missing_money'))
|
|
end
|
|
end, data.exitVehicleCost)
|
|
|
|
end
|
|
|
|
cb('ok')
|
|
end)
|
|
|
|
RegisterNUICallback('impound', function(data, cb)
|
|
local poundCoords = {
|
|
x = data.poundSpawnPoint.x,
|
|
y = data.poundSpawnPoint.y
|
|
}
|
|
|
|
TriggerServerEvent('esx_garage:setImpound', data.poundName, data.vehicleProps)
|
|
TriggerEvent('esx_garage:closemenu')
|
|
|
|
SetNewWaypoint(poundCoords.x, poundCoords.y)
|
|
|
|
cb('ok')
|
|
end)
|
|
|
|
-- Create Blips
|
|
CreateThread(function()
|
|
for k, v in pairs(Config.Garages) do
|
|
local blip = AddBlipForCoord(v.EntryPoint.x, v.EntryPoint.y, v.EntryPoint.z)
|
|
|
|
SetBlipSprite(blip, v.Sprite)
|
|
SetBlipDisplay(blip, 4)
|
|
SetBlipScale(blip, v.Scale)
|
|
SetBlipColour(blip, v.Colour)
|
|
SetBlipAsShortRange(blip, true)
|
|
|
|
BeginTextCommandSetBlipName("STRING")
|
|
AddTextComponentSubstringPlayerName(TranslateCap('parking_blip_name'))
|
|
EndTextCommandSetBlipName(blip)
|
|
end
|
|
|
|
for k, v in pairs(Config.Impounds) do
|
|
local blip = AddBlipForCoord(v.GetOutPoint.x, v.GetOutPoint.y, v.GetOutPoint.z)
|
|
|
|
SetBlipSprite(blip, v.Sprite)
|
|
SetBlipDisplay(blip, 4)
|
|
SetBlipScale(blip, v.Scale)
|
|
SetBlipColour(blip, v.Colour)
|
|
SetBlipAsShortRange(blip, true)
|
|
|
|
BeginTextCommandSetBlipName("STRING")
|
|
AddTextComponentSubstringPlayerName(TranslateCap('Impound_blip_name'))
|
|
EndTextCommandSetBlipName(blip)
|
|
end
|
|
end)
|
|
|
|
AddEventHandler('esx_garage:hasEnteredMarker', function(name, part)
|
|
if part == 'EntryPoint' then
|
|
local isInVehicle = IsPedInAnyVehicle(ESX.PlayerData.ped, false)
|
|
local garage = Config.Garages[name]
|
|
thisGarage = garage
|
|
|
|
if isInVehicle then
|
|
ESX.TextUI(TranslateCap('park_veh'))
|
|
else
|
|
ESX.TextUI(TranslateCap('access_parking'))
|
|
end
|
|
end
|
|
|
|
if part == 'GetOutPoint' then
|
|
local pound = Config.Impounds[name]
|
|
thisPound = pound
|
|
|
|
ESX.TextUI(TranslateCap('access_Impound'))
|
|
end
|
|
end)
|
|
|
|
AddEventHandler('esx_garage:hasExitedMarker', function()
|
|
thisGarage = nil
|
|
thisPound = nil
|
|
ESX.HideUI()
|
|
TriggerEvent('esx_garage:closemenu')
|
|
end)
|
|
|
|
-- Display markers
|
|
CreateThread(function()
|
|
while true do
|
|
local sleep = 500
|
|
|
|
local playerPed = ESX.PlayerData.ped
|
|
local coords = GetEntityCoords(playerPed)
|
|
local inVehicle = IsPedInAnyVehicle(playerPed, false)
|
|
|
|
-- parking
|
|
for k, v in pairs(Config.Garages) do
|
|
if (#(coords - vector3(v.EntryPoint.x, v.EntryPoint.y, v.EntryPoint.z)) < Config.DrawDistance) then
|
|
DrawMarker(Config.Markers.EntryPoint.Type, v.EntryPoint.x, v.EntryPoint.y, v.EntryPoint.z, 0.0, 0.0,
|
|
0.0, 0, 0.0, 0.0, Config.Markers.EntryPoint.Size.x, Config.Markers.EntryPoint.Size.y,
|
|
Config.Markers.EntryPoint.Size.z, Config.Markers.EntryPoint.Color.r,
|
|
Config.Markers.EntryPoint.Color.g, Config.Markers.EntryPoint.Color.b, 100, false, true, 2, false,
|
|
false, false, false)
|
|
sleep = 0
|
|
break
|
|
end
|
|
end
|
|
|
|
-- Impound
|
|
for k, v in pairs(Config.Impounds) do
|
|
if (#(coords - vector3(v.GetOutPoint.x, v.GetOutPoint.y, v.GetOutPoint.z)) < Config.DrawDistance) then
|
|
DrawMarker(Config.Markers.GetOutPoint.Type, v.GetOutPoint.x, v.GetOutPoint.y, v.GetOutPoint.z, 0.0, 0.0,
|
|
0.0, 0, 0.0, 0.0, Config.Markers.GetOutPoint.Size.x, Config.Markers.GetOutPoint.Size.y,
|
|
Config.Markers.GetOutPoint.Size.z, Config.Markers.GetOutPoint.Color.r,
|
|
Config.Markers.GetOutPoint.Color.g, Config.Markers.GetOutPoint.Color.b, 100, false, true, 2, false,
|
|
false, false, false)
|
|
sleep = 0
|
|
break
|
|
end
|
|
end
|
|
|
|
if sleep == 0 then
|
|
nearMarker = true
|
|
else
|
|
nearMarker = false
|
|
end
|
|
|
|
Wait(sleep)
|
|
end
|
|
end)
|
|
|
|
-- Enter / Exit marker events (parking)
|
|
CreateThread(function()
|
|
while true do
|
|
if nearMarker then
|
|
local playerPed = ESX.PlayerData.ped
|
|
local coords = GetEntityCoords(playerPed)
|
|
local isInMarker = false
|
|
local currentMarker = nil
|
|
local currentPart = nil
|
|
|
|
for k, v in pairs(Config.Garages) do
|
|
if (#(coords - vector3(v.EntryPoint.x, v.EntryPoint.y, v.EntryPoint.z)) <
|
|
Config.Markers.EntryPoint.Size.x) then
|
|
isInMarker = true
|
|
currentMarker = k
|
|
currentPart = 'EntryPoint'
|
|
local isInVehicle = IsPedInAnyVehicle(playerPed, false)
|
|
|
|
if not isInVehicle then
|
|
if IsControlJustReleased(0, 38) and not menuIsShowed then
|
|
ESX.TriggerServerCallback('esx_garage:getVehiclesInParking', function(vehicles)
|
|
if next(vehicles) then
|
|
menuIsShowed = true
|
|
|
|
for i = 1, #vehicles, 1 do
|
|
table.insert(vehiclesList, {
|
|
model = GetDisplayNameFromVehicleModel(vehicles[i].vehicle.model),
|
|
plate = vehicles[i].plate,
|
|
props = vehicles[i].vehicle
|
|
})
|
|
|
|
end
|
|
|
|
local spawnPoint = {
|
|
x = v.SpawnPoint.x,
|
|
y = v.SpawnPoint.y,
|
|
z = v.SpawnPoint.z,
|
|
heading = v.SpawnPoint.heading
|
|
}
|
|
|
|
ESX.TriggerServerCallback('esx_garage:getVehiclesImpounded', function(vehicles)
|
|
if next(vehicles) then
|
|
|
|
for i = 1, #vehicles, 1 do
|
|
table.insert(vehiclesImpoundedList, {
|
|
model = GetDisplayNameFromVehicleModel(vehicles[i].vehicle.model),
|
|
plate = vehicles[i].plate,
|
|
props = vehicles[i].vehicle
|
|
})
|
|
end
|
|
|
|
local poundSpawnPoint = {
|
|
x = Config.Impounds[v.ImpoundedName].GetOutPoint.x,
|
|
y = Config.Impounds[v.ImpoundedName].GetOutPoint.y
|
|
}
|
|
|
|
SendNUIMessage({
|
|
showMenu = true,
|
|
type = 'garage',
|
|
vehiclesList = {json.encode(vehiclesList)},
|
|
vehiclesImpoundedList = {json.encode(vehiclesImpoundedList)},
|
|
poundName = v.ImpoundedName,
|
|
poundSpawnPoint = poundSpawnPoint,
|
|
spawnPoint = spawnPoint,
|
|
locales = {
|
|
action = TranslateCap('veh_exit'),
|
|
veh_model = TranslateCap('veh_model'),
|
|
veh_plate = TranslateCap('veh_plate'),
|
|
veh_condition = TranslateCap('veh_condition'),
|
|
veh_action = TranslateCap('veh_action'),
|
|
impound_action = TranslateCap('impound_action')
|
|
}
|
|
})
|
|
else
|
|
SendNUIMessage({
|
|
showMenu = true,
|
|
type = 'garage',
|
|
vehiclesList = {json.encode(vehiclesList)},
|
|
spawnPoint = spawnPoint,
|
|
locales = {
|
|
action = TranslateCap('veh_exit'),
|
|
veh_model = TranslateCap('veh_model'),
|
|
veh_plate = TranslateCap('veh_plate'),
|
|
veh_condition = TranslateCap('veh_condition'),
|
|
veh_action = TranslateCap('veh_action'),
|
|
no_veh_impounded = TranslateCap('no_veh_impounded')
|
|
}
|
|
})
|
|
end
|
|
end)
|
|
|
|
SetNuiFocus(true, true)
|
|
|
|
if menuIsShowed then
|
|
ESX.HideUI()
|
|
end
|
|
else
|
|
menuIsShowed = true
|
|
|
|
ESX.TriggerServerCallback('esx_garage:getVehiclesImpounded', function(vehicles)
|
|
if next(vehicles) then
|
|
|
|
for i = 1, #vehicles, 1 do
|
|
table.insert(vehiclesImpoundedList, {
|
|
model = GetDisplayNameFromVehicleModel(vehicles[i].vehicle.model),
|
|
plate = vehicles[i].plate,
|
|
props = vehicles[i].vehicle
|
|
})
|
|
end
|
|
|
|
local poundSpawnPoint = {
|
|
x = Config.Impounds[v.ImpoundedName].GetOutPoint.x,
|
|
y = Config.Impounds[v.ImpoundedName].GetOutPoint.y
|
|
}
|
|
|
|
SendNUIMessage({
|
|
showMenu = true,
|
|
type = 'garage',
|
|
vehiclesImpoundedList = {json.encode(vehiclesImpoundedList)},
|
|
poundName = v.ImpoundedName,
|
|
poundSpawnPoint = poundSpawnPoint,
|
|
locales = {
|
|
action = TranslateCap('veh_exit'),
|
|
veh_model = TranslateCap('veh_model'),
|
|
veh_plate = TranslateCap('veh_plate'),
|
|
veh_condition = TranslateCap('veh_condition'),
|
|
veh_action = TranslateCap('veh_action'),
|
|
no_veh_parking = TranslateCap('no_veh_parking'),
|
|
no_veh_impounded = TranslateCap('no_veh_impounded'),
|
|
impound_action = TranslateCap('impound_action')
|
|
}
|
|
})
|
|
else
|
|
SendNUIMessage({
|
|
showMenu = true,
|
|
type = 'garage',
|
|
locales = {
|
|
action = TranslateCap('veh_exit'),
|
|
veh_model = TranslateCap('veh_model'),
|
|
veh_plate = TranslateCap('veh_plate'),
|
|
veh_condition = TranslateCap('veh_condition'),
|
|
veh_action = TranslateCap('veh_action'),
|
|
no_veh_parking = TranslateCap('no_veh_parking')
|
|
}
|
|
})
|
|
end
|
|
end)
|
|
|
|
SetNuiFocus(true, true)
|
|
|
|
if menuIsShowed then
|
|
ESX.HideUI()
|
|
end
|
|
end
|
|
end, currentMarker)
|
|
end
|
|
end
|
|
|
|
if isInVehicle then
|
|
if IsControlJustReleased(0, 38) then
|
|
local vehicle = GetVehiclePedIsIn(playerPed, false)
|
|
local vehicleProps = ESX.Game.GetVehicleProperties(vehicle)
|
|
ESX.TriggerServerCallback('esx_garage:checkVehicleOwner', function(owner)
|
|
if owner then
|
|
ESX.Game.DeleteVehicle(vehicle)
|
|
TriggerServerEvent('esx_garage:updateOwnedVehicle', true, currentMarker, nil,
|
|
{vehicleProps = vehicleProps})
|
|
else
|
|
ESX.ShowNotification(TranslateCap('not_owning_veh'), 'error')
|
|
end
|
|
end, vehicleProps.plate)
|
|
end
|
|
end
|
|
break
|
|
end
|
|
end
|
|
|
|
for k, v in pairs(Config.Impounds) do
|
|
|
|
if (#(coords - vector3(v.GetOutPoint.x, v.GetOutPoint.y, v.GetOutPoint.z)) < 2.0) then
|
|
isInMarker = true
|
|
currentMarker = k
|
|
currentPart = 'GetOutPoint'
|
|
|
|
if IsControlJustReleased(0, 38) and not menuIsShowed then
|
|
ESX.TriggerServerCallback('esx_garage:getVehiclesInPound', function(vehicles)
|
|
if next(vehicles) then
|
|
menuIsShowed = true
|
|
|
|
for i = 1, #vehicles, 1 do
|
|
table.insert(vehiclesList, {
|
|
model = GetDisplayNameFromVehicleModel(vehicles[i].vehicle.model),
|
|
plate = vehicles[i].plate,
|
|
props = vehicles[i].vehicle
|
|
})
|
|
end
|
|
|
|
local spawnPoint = {
|
|
x = v.SpawnPoint.x,
|
|
y = v.SpawnPoint.y,
|
|
z = v.SpawnPoint.z,
|
|
heading = v.SpawnPoint.heading
|
|
}
|
|
|
|
SendNUIMessage({
|
|
showMenu = true,
|
|
type = 'impound',
|
|
vehiclesList = {json.encode(vehiclesList)},
|
|
spawnPoint = spawnPoint,
|
|
poundCost = v.Cost,
|
|
locales = {
|
|
action = TranslateCap('pay_impound'),
|
|
veh_model = TranslateCap('veh_model'),
|
|
veh_plate = TranslateCap('veh_plate'),
|
|
veh_condition = TranslateCap('veh_condition'),
|
|
veh_action = TranslateCap('veh_action')
|
|
}
|
|
})
|
|
|
|
SetNuiFocus(true, true)
|
|
|
|
if menuIsShowed then
|
|
ESX.HideUI()
|
|
end
|
|
else
|
|
ESX.ShowNotification(TranslateCap('no_veh_Impound'))
|
|
end
|
|
end, currentMarker)
|
|
end
|
|
break
|
|
end
|
|
end
|
|
|
|
if isInMarker and not HasAlreadyEnteredMarker or
|
|
(isInMarker and (LastMarker ~= currentMarker or LastPart ~= currentPart)) then
|
|
|
|
if LastMarker ~= currentMarker or LastPart ~= currentPart then
|
|
TriggerEvent('esx_garage:hasExitedMarker')
|
|
end
|
|
|
|
HasAlreadyEnteredMarker = true
|
|
LastMarker = currentMarker
|
|
LastPart = currentPart
|
|
|
|
TriggerEvent('esx_garage:hasEnteredMarker', currentMarker, currentPart)
|
|
end
|
|
|
|
if not isInMarker and HasAlreadyEnteredMarker then
|
|
HasAlreadyEnteredMarker = false
|
|
|
|
TriggerEvent('esx_garage:hasExitedMarker')
|
|
end
|
|
|
|
Wait(0)
|
|
else
|
|
Wait(500)
|
|
end
|
|
end
|
|
end)
|