186 lines
		
	
	
		
			No EOL
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			No EOL
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local GARAGE_ZONE_Z_DIST = 4.0
 | 
						|
local inVehicle, blips, zones, peds = nil, {}, {}, {}
 | 
						|
local cachedGarageLocations
 | 
						|
 | 
						|
function getAvailableGarageLocations()
 | 
						|
  if not cachedGarageLocations then
 | 
						|
    cachedGarageLocations = lib.callback.await("jg-advancedgarages:server:get-available-garage-locations", false)
 | 
						|
  end
 | 
						|
 | 
						|
  return cachedGarageLocations or {}
 | 
						|
end
 | 
						|
 | 
						|
---@param coords vector3
 | 
						|
---@param marker table
 | 
						|
function drawMarkerOnFrame(coords, marker)
 | 
						|
  ---@diagnostic disable-next-line: missing-parameter
 | 
						|
  DrawMarker(marker.id, coords.x, coords.y, coords.z, 0, 0, 0, 0, 0, 0, marker.size.x,  marker.size.y, marker.size.z, marker.color.r, marker.color.g, marker.color.b, marker.color.a, marker.bobUpAndDown, marker.faceCamera, 0, marker.rotate, marker.drawOnEnts)
 | 
						|
end
 | 
						|
 | 
						|
---@param name string
 | 
						|
---@param coords vector3
 | 
						|
---@param blipId integer
 | 
						|
---@param blipColour integer
 | 
						|
---@param blipScale number
 | 
						|
local function createBlip(name, coords, blipId, blipColour, blipScale)
 | 
						|
  local blip = AddBlipForCoord(coords.x, coords.y, coords.z)
 | 
						|
  SetBlipSprite(blip, blipId)
 | 
						|
  SetBlipColour(blip, blipColour)
 | 
						|
  SetBlipScale(blip, blipScale)
 | 
						|
  SetBlipAsShortRange(blip, true)
 | 
						|
  BeginTextCommandSetBlipName("STRING")
 | 
						|
  AddTextComponentString(name)
 | 
						|
  EndTextCommandSetBlipName(blip)
 | 
						|
  return blip
 | 
						|
end
 | 
						|
 | 
						|
---@param garageId string
 | 
						|
---@param coords vector3|vector4
 | 
						|
---@param dist number
 | 
						|
---@param marker? table | false | nil
 | 
						|
---@param onEnter? function
 | 
						|
---@param onExit? function
 | 
						|
---@param inside? function
 | 
						|
local function createLocation(garageId, coords, dist, marker, onEnter, onExit, inside)
 | 
						|
  local point = lib.zones.box({
 | 
						|
    coords = coords,
 | 
						|
    size = vector3(dist, dist, GARAGE_ZONE_Z_DIST),
 | 
						|
    rotation = coords.w or 0,
 | 
						|
    garageId = garageId,
 | 
						|
    onEnter = onEnter,
 | 
						|
    onExit = onExit,
 | 
						|
    inside = inside
 | 
						|
  })
 | 
						|
  
 | 
						|
  zones[#zones+1] = point
 | 
						|
 | 
						|
  local markerPoint = lib.points.new({
 | 
						|
    coords = coords,
 | 
						|
    distance = dist * 4,
 | 
						|
    garageId = garageId
 | 
						|
  })
 | 
						|
 | 
						|
  if not marker then return end
 | 
						|
 | 
						|
  function markerPoint:nearby()
 | 
						|
    drawMarkerOnFrame(coords, marker)
 | 
						|
  end
 | 
						|
  
 | 
						|
  zones[#zones+1] = markerPoint
 | 
						|
end
 | 
						|
 | 
						|
---Runs on tick while ped is in a garage zone
 | 
						|
---@param garageId string
 | 
						|
---@param garageType "car"|"sea"|"air"
 | 
						|
---@param isImpound boolean
 | 
						|
local function pedIsInGarageZone(garageId, garageType, isImpound)
 | 
						|
  local pedIsInVehicle = cache.vehicle and GetPedInVehicleSeat(cache.vehicle, -1) == cache.ped
 | 
						|
  local prompt = isImpound and Config.OpenImpoundPrompt or (pedIsInVehicle and Config.InsertVehiclePrompt or Config.OpenGaragePrompt)
 | 
						|
  local action = function()
 | 
						|
    if pedIsInVehicle then
 | 
						|
      TriggerEvent("jg-advancedgarages:client:store-vehicle", garageId, garageType, false)
 | 
						|
    else
 | 
						|
      TriggerEvent("jg-advancedgarages:client:open-garage", garageId, garageType, false)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  if inVehicle ~= pedIsInVehicle then
 | 
						|
    if Config.UseRadialMenu then
 | 
						|
      Framework.Client.RadialMenuAdd(garageId, prompt, action)
 | 
						|
    else
 | 
						|
      Framework.Client.ShowTextUI(prompt)
 | 
						|
    end
 | 
						|
 | 
						|
    inVehicle = pedIsInVehicle
 | 
						|
  end
 | 
						|
  
 | 
						|
  if Config.UseRadialMenu then return end
 | 
						|
  if IsControlJustPressed(0, isImpound and Config.OpenImpoundKeyBind or (pedIsInVehicle and Config.InsertVehicleKeyBind or Config.OpenGarageKeyBind)) then
 | 
						|
    action()
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
---@param garages table
 | 
						|
local function createTargetZones(garages)
 | 
						|
  for _, ped in ipairs(peds) do
 | 
						|
    Framework.Client.RemoveTarget(ped)
 | 
						|
  end
 | 
						|
 | 
						|
  for garageId, garage in pairs(garages) do
 | 
						|
    for _, zone in ipairs(zones) do zone:remove() end  -- Remove existing zones
 | 
						|
 | 
						|
    entity = Framework.Client.RegisterTarget(false, garage.coords, garageId, garage.type, garage.garageType)
 | 
						|
 | 
						|
    peds[#peds+1] = entity
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
---@param garages table
 | 
						|
local function createZones(garages)
 | 
						|
  for _, zone in ipairs(zones) do zone:remove() end  -- Remove existing zones
 | 
						|
 | 
						|
  for garageId, garage in pairs(garages) do
 | 
						|
    if garage then
 | 
						|
      -- Zone
 | 
						|
      createLocation(
 | 
						|
        garageId,
 | 
						|
        garage.coords,
 | 
						|
        garage.distance,
 | 
						|
        not garage.hideMarkers and garage.markers or false,
 | 
						|
        nil,
 | 
						|
        function()
 | 
						|
          if Config.UseRadialMenu then
 | 
						|
            Framework.Client.RadialMenuRemove(garageId)
 | 
						|
          else
 | 
						|
            Framework.Client.HideTextUI()
 | 
						|
          end
 | 
						|
          inVehicle = nil
 | 
						|
        end,
 | 
						|
        function()
 | 
						|
          pedIsInGarageZone(garageId, garage.type, garage.garageType == "impound")
 | 
						|
        end
 | 
						|
      )
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
local function createGarageZonesAndBlips()
 | 
						|
  for _, blip in ipairs(blips) do RemoveBlip(blip) end -- Remove existing blips 
 | 
						|
  
 | 
						|
  local garages = getAvailableGarageLocations()
 | 
						|
 | 
						|
  if Config.UseTarget then
 | 
						|
    createTargetZones(garages)
 | 
						|
  else
 | 
						|
    createZones(garages)
 | 
						|
  end
 | 
						|
 | 
						|
  for garageId, garage in pairs(garages) do
 | 
						|
    if garage then
 | 
						|
      -- Blip
 | 
						|
      if not garage.hideBlip then
 | 
						|
        local blipName = garage.garageType == "impound" and Locale.impound or garage.garageType == "job" and Locale.jobGarage or garage.garageType == "gang" and Locale.gangGarage or Locale.garage
 | 
						|
        if garage.uniqueBlips then blipName = blipName .. ": " .. garageId end
 | 
						|
        local blip = createBlip(blipName, garage.coords, garage.blip.id, garage.blip.color, garage.blip.scale)
 | 
						|
        blips[#blips + 1] = blip
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent("jg-advancedgarages:client:update-blips-text-uis", function()
 | 
						|
  cachedGarageLocations = lib.callback.await("jg-advancedgarages:server:get-available-garage-locations", false)
 | 
						|
  createGarageZonesAndBlips()
 | 
						|
end)
 | 
						|
 | 
						|
CreateThread(function()
 | 
						|
  Wait(2500)
 | 
						|
  createGarageZonesAndBlips()
 | 
						|
end)
 | 
						|
 | 
						|
-- Delete peds in case the script restarts
 | 
						|
AddEventHandler("onResourceStop", function(resourceName)
 | 
						|
  if (GetCurrentResourceName() == resourceName) then
 | 
						|
    for _, ped in ipairs(peds) do DeleteEntity(ped) end
 | 
						|
  end
 | 
						|
end) |