ed
This commit is contained in:
		
							parent
							
								
									6d22d5f77c
								
							
						
					
					
						commit
						63fbc60a00
					
				
					 86 changed files with 8352 additions and 3428 deletions
				
			
		|  | @ -0,0 +1,90 @@ | |||
| -- A modified version of "VehicleDeformation" v1.0.1, by Kiminaze. Full credits go to him, so adibe by the license below. | ||||
| -- Check out his other work: https://kiminazes-script-gems.tebex.io/ | ||||
| -- | ||||
| -- VehicleDeformation License: | ||||
| -- | ||||
| --   Copyright (c) 2021 Philipp Decker /// FiveM: Kiminaze / Discord: Kiminaze#9097 | ||||
| --   By acquiring a copy of this code snippet for the "FiveM" modification for "Grand Theft  | ||||
| --   Auto V" you are granted permission to use and modify all of its parts. | ||||
| --   You are allowed to (re-)distribute and sell resources that have been created with the  | ||||
| --   help of this code snippet. You have to include this license when doing so. | ||||
| --   This code snippet is provided "as is" and the copyright holder of this code snippet can  | ||||
| --   not be held accountable for any damages occuring during the usage or modification of  | ||||
| --   this code snippet. | ||||
|  | ||||
| local MAX_DEFORM_ITERATIONS = 50 -- iterations for damage application | ||||
| local DEFORMATION_DAMAGE_THRESHOLD = 0.05 -- the minimum damage value at a deformation point | ||||
|  | ||||
| function getVehicleDeformation(vehicle) | ||||
|   assert(vehicle ~= nil and DoesEntityExist(vehicle), "Parameter \"vehicle\" must be a valid vehicle entity!") | ||||
|  | ||||
|   -- check vehicle size and pre-calc values for offsets | ||||
|   local min, max = GetModelDimensions(GetEntityModel(vehicle)) | ||||
|   local X = (max.x - min.x) * 0.5 | ||||
|   local Y = (max.y - min.y) * 0.5 | ||||
|   local Z = (max.z - min.z) * 0.5 | ||||
|   local halfY = Y * 0.5 | ||||
|  | ||||
|   -- offsets for deformation check | ||||
|   local positions = {vector3(-X, Y, 0.0), vector3(-X, Y, Z), vector3(0.0, Y, 0.0), vector3(0.0, Y, Z), vector3(X, Y, 0.0), vector3(X, Y, Z), vector3(-X, halfY, 0.0), vector3(-X, halfY, Z), vector3(0.0, halfY, 0.0), vector3(0.0, halfY, Z), vector3(X, halfY, 0.0), vector3(X, halfY, Z), | ||||
|                      vector3(-X, 0.0, 0.0), vector3(-X, 0.0, Z), vector3(0.0, 0.0, 0.0), vector3(0.0, 0.0, Z), vector3(X, 0.0, 0.0), vector3(X, 0.0, Z), vector3(-X, -halfY, 0.0), vector3(-X, -halfY, Z), vector3(0.0, -halfY, 0.0), vector3(0.0, -halfY, Z), vector3(X, -halfY, 0.0), | ||||
|                      vector3(X, -halfY, Z), vector3(-X, -Y, 0.0), vector3(-X, -Y, Z), vector3(0.0, -Y, 0.0), vector3(0.0, -Y, Z), vector3(X, -Y, 0.0), vector3(X, -Y, Z)} | ||||
|  | ||||
|   -- get deformation from vehicle | ||||
|   local deformationPoints = {} | ||||
|   for i, pos in ipairs(positions) do | ||||
|     -- translate damage from vector3 to a float | ||||
|     local dmg = #(GetVehicleDeformationAtPos(vehicle, pos.x, pos.y, pos.z)) | ||||
|     if (dmg > DEFORMATION_DAMAGE_THRESHOLD) then | ||||
|       table.insert(deformationPoints, {pos, dmg}) | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   return { | ||||
|     deformation = deformationPoints, | ||||
|     dirt = GetVehicleDirtLevel(vehicle) | ||||
|   } | ||||
| end | ||||
|  | ||||
| function setVehicleDeformation(vehicle, deformation) | ||||
|   assert(vehicle ~= nil and DoesEntityExist(vehicle), "Parameter \"vehicle\" must be a valid vehicle entity!") | ||||
|   assert(deformation ~= nil and type(deformation) == "table", "Parameter \"deformation\" must be a table!") | ||||
|  | ||||
|   local deformationPoints = deformation.deformation | ||||
|   local dirt = deformation.dirt | ||||
|  | ||||
|   CreateThread(function() | ||||
|     local handlingMult, damageMult = GetVehicleHandlingFloat(vehicle, "CHandlingData", "fDeformationDamageMult"), 20.0 | ||||
| 		if handlingMult <= 0.55 then damageMult = 1000.0 | ||||
| 		elseif handlingMult <= 0.65 then damageMult = 400.0 | ||||
| 		elseif handlingMult <= 0.75 then damageMult = 200.0 end | ||||
|  | ||||
|     for _, def in ipairs(deformationPoints) do | ||||
|       def[1] = vector3(def[1].x, def[1].y, def[1].z) | ||||
|     end | ||||
|  | ||||
|     -- iterate over all deformation points and check if more than one application is necessary | ||||
|     -- looping is necessary for most vehicles that have a really bad damage model or take a lot of damage (e.g. neon, phantom3) | ||||
|     local deform = true | ||||
|     local iteration = 0 | ||||
|  | ||||
|     while deform and iteration < MAX_DEFORM_ITERATIONS do | ||||
|       if not DoesEntityExist(vehicle) then return end | ||||
|  | ||||
|       deform = false | ||||
|  | ||||
|       for _, def in ipairs(deformationPoints) do | ||||
|         if #(GetVehicleDeformationAtPos(vehicle, def[1].x, def[1].y, def[1].z)) < def[2] then | ||||
|           local offset = def[1] * 2.0 | ||||
|           SetVehicleDamage(vehicle, offset.x, offset.y, offset.z, def[2] * damageMult, 1000.0, true) | ||||
|           deform = true | ||||
|         end | ||||
|       end | ||||
|  | ||||
|       iteration = iteration + 1 | ||||
|       Wait(100) | ||||
|     end | ||||
|  | ||||
|     SetVehicleDirtLevel(vehicle, dirt) | ||||
|   end) | ||||
| end | ||||
							
								
								
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-garage.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-garage.lua
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-impound.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-impound.lua
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-interior.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-interior.lua
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -0,0 +1,186 @@ | |||
| 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) | ||||
							
								
								
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-main.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-main.lua
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-spawn.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-spawn.lua
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-vehicle.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/[carscripts]/jg-advancedgarages/client/cl-vehicle.lua
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nordi98
						Nordi98