Files
2026-07-07 21:08:52 +02:00

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)