mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-30 09:48:52 +00:00
6f232d9250
- updated to fix bug where you can't exit garages on foot - updated to allow you to re-use the same garage in multiple locations without randomly spawning at another location (see config for additional garage locations)
443 lines
12 KiB
Lua
443 lines
12 KiB
Lua
ESX = nil
|
|
local LastGarage = nil
|
|
local LastPart = nil
|
|
local LastParking = nil
|
|
local thisGarage = nil
|
|
|
|
Citizen.CreateThread(function()
|
|
while ESX == nil do
|
|
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
|
|
Citizen.Wait(0)
|
|
end
|
|
end)
|
|
|
|
TriggerEvent('instance:registerType', 'garage')
|
|
|
|
RegisterNetEvent('instance:onCreate')
|
|
AddEventHandler('instance:onCreate', function(instance)
|
|
if instance.type == 'garage' then
|
|
TriggerEvent('instance:enter', instance)
|
|
end
|
|
end)
|
|
|
|
AddEventHandler('esx_garage:hasEnteredMarker', function(name, part, parking)
|
|
|
|
if part == 'ExteriorEntryPoint' then
|
|
|
|
local playerPed = PlayerPedId()
|
|
local coords = GetEntityCoords(playerPed)
|
|
local garage = Config.Garages[name]
|
|
thisGarage = garage
|
|
|
|
for i=1, #Config.Garages, 1 do
|
|
if Config.Garages[i].name ~= name then
|
|
Config.Garages[i].disabled = true
|
|
end
|
|
end
|
|
|
|
if IsPedInAnyVehicle(playerPed, false) then
|
|
|
|
local vehicle = GetVehiclePedIsIn(playerPed, false)
|
|
local maxHealth = GetEntityMaxHealth(vehicle)
|
|
local health = GetEntityHealth(vehicle)
|
|
local healthPercent = (health / maxHealth) * 100
|
|
|
|
if healthPercent < Config.MinimumHealthPercent then
|
|
ESX.ShowNotification(_U('veh_health'))
|
|
else
|
|
|
|
if GetPedInVehicleSeat(vehicle, -1) == playerPed then
|
|
|
|
local vehicleProps = ESX.Game.GetVehicleProperties(vehicle)
|
|
|
|
local spawnCoords = {
|
|
x = garage.InteriorSpawnPoint.Pos.x,
|
|
y = garage.InteriorSpawnPoint.Pos.y,
|
|
z = garage.InteriorSpawnPoint.Pos.z + Config.ZDiff
|
|
}
|
|
|
|
ESX.Game.DeleteVehicle(vehicle)
|
|
|
|
ESX.Game.Teleport(playerPed, spawnCoords, function()
|
|
|
|
TriggerEvent('instance:create', 'garage')
|
|
|
|
ESX.Game.SpawnLocalVehicle(vehicleProps.model, spawnCoords, garage.InteriorSpawnPoint.Heading, function(vehicle)
|
|
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
|
ESX.Game.SetVehicleProperties(vehicle, vehicleProps)
|
|
end)
|
|
|
|
ESX.TriggerServerCallback('esx_vehicleshop:getVehiclesInGarage', function(vehicles)
|
|
|
|
for i=1, #garage.Parkings, 1 do
|
|
for j=1, #vehicles, 1 do
|
|
|
|
if i == vehicles[j].zone then
|
|
|
|
local spawn = function(j)
|
|
|
|
local vehicle = GetClosestVehicle(garage.Parkings[i].Pos.x, garage.Parkings[i].Pos.y, garage.Parkings[i].Pos.z, 2.0, 0, 71)
|
|
|
|
if DoesEntityExist(vehicle) then
|
|
ESX.Game.DeleteVehicle(vehicle)
|
|
end
|
|
|
|
ESX.Game.SpawnLocalVehicle(vehicles[j].vehicle.model, {
|
|
x = garage.Parkings[i].Pos.x,
|
|
y = garage.Parkings[i].Pos.y,
|
|
z = garage.Parkings[i].Pos.z + Config.ZDiff
|
|
}, garage.Parkings[i].Heading, function(vehicle)
|
|
ESX.Game.SetVehicleProperties(vehicle, vehicles[j].vehicle)
|
|
end)
|
|
|
|
end
|
|
|
|
spawn(j)
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
end, name)
|
|
|
|
end)
|
|
|
|
else
|
|
|
|
ESX.Game.Teleport(playerPed, {
|
|
x = garage.InteriorSpawnPoint.Pos.x,
|
|
y = garage.InteriorSpawnPoint.Pos.y,
|
|
z = garage.InteriorSpawnPoint.Pos.z + Config.ZDiff
|
|
}, function()
|
|
|
|
TriggerEvent('instance:create', 'garage')
|
|
|
|
ESX.TriggerServerCallback('esx_vehicleshop:getVehiclesInGarage', function(vehicles)
|
|
|
|
for i=1, #garage.Parkings, 1 do
|
|
for j=1, #vehicles, 1 do
|
|
|
|
if i == vehicles[j].zone then
|
|
|
|
local spawn = function(j)
|
|
|
|
local vehicle = GetClosestVehicle(garage.Parkings[i].Pos.x, garage.Parkings[i].Pos.garage.Parkings[i].Pos.y, garage.Parkings[i].Pos.z, 2.0, 0, 71)
|
|
|
|
if DoesEntityExist(vehicle) then
|
|
ESX.Game.DeleteVehicle(vehicle)
|
|
end
|
|
|
|
ESX.Game.SpawnLocalVehicle(vehicles[j].vehicle.model, {
|
|
x = garage.Parkings[i].Pos.x,
|
|
y = garage.Parkings[i].Pos.y,
|
|
z = garage.Parkings[i].Pos.z + Config.ZDiff
|
|
}, garage.Parkings[i].Heading, function(vehicle)
|
|
ESX.Game.SetVehicleProperties(vehicle, vehicles[j].vehicle)
|
|
end)
|
|
|
|
end
|
|
|
|
spawn(j)
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
end, name)
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
ESX.Game.Teleport(playerPed, {
|
|
x = garage.InteriorSpawnPoint.Pos.x,
|
|
y = garage.InteriorSpawnPoint.Pos.y,
|
|
z = garage.InteriorSpawnPoint.Pos.z + Config.ZDiff
|
|
}, function()
|
|
|
|
TriggerEvent('instance:create', 'garage')
|
|
|
|
ESX.TriggerServerCallback('esx_vehicleshop:getVehiclesInGarage', function(vehicles)
|
|
|
|
for i=1, #garage.Parkings, 1 do
|
|
for j=1, #vehicles, 1 do
|
|
|
|
if i == vehicles[j].zone then
|
|
|
|
local spawn = function(j)
|
|
|
|
local vehicle = GetClosestVehicle(garage.Parkings[i].Pos.x, garage.Parkings[i].Pos.y, garage.Parkings[i].Pos.z, 2.0, 0, 71)
|
|
|
|
if DoesEntityExist(vehicle) then
|
|
ESX.Game.DeleteVehicle(vehicle)
|
|
end
|
|
|
|
ESX.Game.SpawnLocalVehicle(vehicles[j].vehicle.model, {
|
|
x = garage.Parkings[i].Pos.x,
|
|
y = garage.Parkings[i].Pos.y,
|
|
z = garage.Parkings[i].Pos.z + Config.ZDiff
|
|
}, garage.Parkings[i].Heading, function(vehicle)
|
|
ESX.Game.SetVehicleProperties(vehicle, vehicles[j].vehicle)
|
|
end)
|
|
|
|
end
|
|
|
|
spawn(j)
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
end, name)
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if part == 'InteriorExitPoint' then
|
|
|
|
local playerPed = PlayerPedId()
|
|
local coords = GetEntityCoords(playerPed)
|
|
local garage = thisGarage
|
|
|
|
if IsPedInAnyVehicle(playerPed, false) then
|
|
|
|
local vehicle = GetVehiclePedIsIn(playerPed, false)
|
|
local vehicleProps = ESX.Game.GetVehicleProperties(vehicle)
|
|
|
|
local spawnCoords = {
|
|
x = garage.ExteriorSpawnPoint.Pos.x,
|
|
y = garage.ExteriorSpawnPoint.Pos.y,
|
|
z = garage.ExteriorSpawnPoint.Pos.z
|
|
}
|
|
|
|
ESX.Game.DeleteVehicle(vehicle)
|
|
|
|
ESX.Game.Teleport(playerPed, spawnCoords, function()
|
|
|
|
TriggerEvent('instance:close')
|
|
|
|
ESX.Game.SpawnVehicle(vehicleProps.model, spawnCoords, garage.ExteriorSpawnPoint.Heading, function(vehicle)
|
|
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
|
ESX.Game.SetVehicleProperties(vehicle, vehicleProps)
|
|
ESX.Game.SetVehicleEngineOn(vehicle, (not GetIsVehicleEngineRunning(vehicle)), false, true)
|
|
end)
|
|
|
|
end)
|
|
|
|
|
|
else
|
|
|
|
ESX.Game.Teleport(playerPed,{
|
|
x = garage.ExteriorSpawnPoint.Pos.x,
|
|
y = garage.ExteriorSpawnPoint.Pos.y,
|
|
z = garage.ExteriorSpawnPoint.Pos.z
|
|
}, function()
|
|
TriggerEvent('instance:close')
|
|
end)
|
|
|
|
end
|
|
|
|
for i=1, #garage.Parkings, 1 do
|
|
|
|
local vehicle = GetClosestVehicle(garage.Parkings[i].Pos.x, garage.Parkings[i].Pos.y, garage.Parkings[i].Pos.z, 2.0, 0, 71)
|
|
|
|
if DoesEntityExist(vehicle) then
|
|
ESX.Game.DeleteVehicle(vehicle)
|
|
end
|
|
|
|
end
|
|
|
|
for i=1, #Config.Garages, 1 do
|
|
if Config.Garages[i].name ~= name then
|
|
Config.Garages[i].disabled = false
|
|
end
|
|
end
|
|
|
|
thisGarage = nil
|
|
|
|
end
|
|
|
|
if part == 'Parking' then
|
|
|
|
local playerPed = PlayerPedId()
|
|
local garage = thisGarage
|
|
local parkingPos = garage.Parkings[parking].Pos
|
|
|
|
if IsPedInAnyVehicle(playerPed, false) and not IsAnyVehicleNearPoint(parkingPos.x, parkingPos.y, parkingPos.z, 1.0) then
|
|
|
|
local vehicle = GetVehiclePedIsIn(playerPed, false)
|
|
local vehicleProps = ESX.Game.GetVehicleProperties(vehicle)
|
|
|
|
TriggerServerEvent('esx_garage:setParking', name, parking, vehicleProps)
|
|
|
|
if Config.EnableOwnedVehicles then
|
|
TriggerServerEvent('esx_garage:updateOwnedVehicle', vehicleProps)
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
AddEventHandler('esx_property:hasExitedMarker', function(name, part, parking)
|
|
|
|
if part == 'Parking' then
|
|
|
|
local playerPed = PlayerPedId()
|
|
local garage = thisGarage
|
|
local parkingPos = garage.Parkings[parking].Pos
|
|
|
|
if IsPedInAnyVehicle(playerPed, false) and not IsAnyVehicleNearPoint(parkingPos.x, parkingPos.y, parkingPos.z, 1.0) then
|
|
TriggerServerEvent('esx_garage:setParking', name, parking, false)
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
-- Create Blips
|
|
Citizen.CreateThread(function()
|
|
|
|
for k,v in pairs(Config.Garages) do
|
|
|
|
if v.IsClosed then
|
|
|
|
local blip = AddBlipForCoord(v.ExteriorEntryPoint.Pos.x, v.ExteriorEntryPoint.Pos.y, v.ExteriorEntryPoint.Pos.z)
|
|
|
|
SetBlipSprite (blip, 357)
|
|
SetBlipDisplay(blip, 4)
|
|
SetBlipScale (blip, 1.2)
|
|
SetBlipColour (blip, 3)
|
|
SetBlipAsShortRange(blip, true)
|
|
|
|
BeginTextCommandSetBlipName("STRING")
|
|
AddTextComponentString("Garage")
|
|
EndTextCommandSetBlipName(blip)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
-- Display markers
|
|
Citizen.CreateThread(function()
|
|
while true do
|
|
|
|
Citizen.Wait(0)
|
|
|
|
local playerPed = PlayerPedId()
|
|
local coords = GetEntityCoords(playerPed)
|
|
|
|
for k,v in pairs(Config.Garages) do
|
|
|
|
if v.IsClosed then
|
|
|
|
if(not v.disabled and GetDistanceBetweenCoords(coords, v.ExteriorEntryPoint.Pos.x, v.ExteriorEntryPoint.Pos.y, v.ExteriorEntryPoint.Pos.z, true) < Config.DrawDistance) then
|
|
DrawMarker(Config.MarkerType, v.ExteriorEntryPoint.Pos.x, v.ExteriorEntryPoint.Pos.y, v.ExteriorEntryPoint.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, Config.MarkerSize.x, Config.MarkerSize.y, Config.MarkerSize.z, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, false, false, false, false)
|
|
end
|
|
|
|
if(not v.disabled and GetDistanceBetweenCoords(coords, v.InteriorExitPoint.Pos.x, v.InteriorExitPoint.Pos.y, v.InteriorExitPoint.Pos.z, true) < Config.DrawDistance) then
|
|
DrawMarker(Config.MarkerType, v.InteriorExitPoint.Pos.x, v.InteriorExitPoint.Pos.y, v.InteriorExitPoint.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, Config.MarkerSize.x, Config.MarkerSize.y, Config.MarkerSize.z, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, false, false, false, false)
|
|
end
|
|
|
|
end
|
|
|
|
if IsPedInAnyVehicle(playerPed, false) then
|
|
|
|
for i=1, #v.Parkings, 1 do
|
|
|
|
local parking = v.Parkings[i]
|
|
|
|
if(not v.disabled and GetDistanceBetweenCoords(coords, parking.Pos.x, parking.Pos.y, parking.Pos.z, true) < Config.DrawDistance) then
|
|
DrawMarker(Config.MarkerType, parking.Pos.x, parking.Pos.y, parking.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, Config.ParkingMarkerSize.x, Config.ParkingMarkerSize.y, Config.ParkingMarkerSize.z, Config.ParkingMarkerColor.r, Config.ParkingMarkerColor.g, Config.ParkingMarkerColor.b, 100, false, true, 2, false, false, false, false)
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end)
|
|
|
|
-- Enter / Exit marker events
|
|
Citizen.CreateThread(function()
|
|
|
|
while true do
|
|
|
|
Citizen.Wait(1)
|
|
|
|
local playerPed = PlayerPedId()
|
|
local coords = GetEntityCoords(playerPed)
|
|
local isInMarker = false
|
|
local currentGarage = nil
|
|
local currentPart = nil
|
|
local currentParking = nil
|
|
|
|
for k,v in pairs(Config.Garages) do
|
|
if v.IsClosed then
|
|
|
|
if (not v.disabled and GetDistanceBetweenCoords(coords, v.ExteriorEntryPoint.Pos.x, v.ExteriorEntryPoint.Pos.y, v.ExteriorEntryPoint.Pos.z, true) < Config.MarkerSize.x) then
|
|
isInMarker = true
|
|
currentGarage = k
|
|
currentPart = 'ExteriorEntryPoint'
|
|
end
|
|
|
|
if (not v.disabled and GetDistanceBetweenCoords(coords, v.InteriorExitPoint.Pos.x, v.InteriorExitPoint.Pos.y, v.InteriorExitPoint.Pos.z, true) < Config.MarkerSize.x) then
|
|
isInMarker = true
|
|
currentGarage = k
|
|
currentPart = 'InteriorExitPoint'
|
|
end
|
|
|
|
for i=1, #v.Parkings, 1 do
|
|
|
|
local parking = v.Parkings[i]
|
|
|
|
if (not v.disabled and GetDistanceBetweenCoords(coords, parking.Pos.x, parking.Pos.y, parking.Pos.z, true) < Config.ParkingMarkerSize.x) then
|
|
isInMarker = true
|
|
currentGarage = k
|
|
currentPart = 'Parking'
|
|
currentParking = i
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
if isInMarker and not HasAlreadyEnteredMarker or (isInMarker and (LastGarage ~= currentGarage or LastPart ~= currentPart or LastParking ~= currentParking) ) then
|
|
|
|
if LastGarage ~= currentGarage or LastPart ~= currentPart or LastParking ~= currentParking then
|
|
TriggerEvent('esx_property:hasExitedMarker', LastGarage, LastPart, LastParking)
|
|
end
|
|
|
|
HasAlreadyEnteredMarker = true
|
|
LastGarage = currentGarage
|
|
LastPart = currentPart
|
|
LastParking = currentParking
|
|
|
|
TriggerEvent('esx_garage:hasEnteredMarker', currentGarage, currentPart, currentParking)
|
|
end
|
|
|
|
if not isInMarker and HasAlreadyEnteredMarker then
|
|
|
|
HasAlreadyEnteredMarker = false
|
|
|
|
TriggerEvent('esx_property:hasExitedMarker', LastGarage, LastPart, LastParking)
|
|
end
|
|
|
|
end
|
|
end) |