488 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			488 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- logs text to the console
 | |
| function Log(text)
 | |
|     if (Config.isDebug) then
 | |
|         Log(text)
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- Return all vehicle modifications in an array
 | |
| function GetVehicleModifications(vehicle)
 | |
|     local color1, color2               = GetVehicleColours(vehicle)
 | |
|     local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)
 | |
| 
 | |
|     local extras = {}
 | |
|     for i = 0, 20, 1 do
 | |
|         if (DoesExtraExist(vehicle, i)) then
 | |
|             if (IsVehicleExtraTurnedOn(vehicle, i)) then
 | |
|                 table.insert(extras, { i, 0 })
 | |
|             else
 | |
|                 table.insert(extras, { i, 1 })
 | |
|             end
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     local tiresBurst = {}
 | |
|     for i = 0, 5, 1 do
 | |
|         if (IsVehicleTyreBurst(vehicle, i, true)) then
 | |
|             table.insert(tiresBurst, { i, true })
 | |
|         elseif (IsVehicleTyreBurst(vehicle, i, false)) then
 | |
|             table.insert(tiresBurst, { i, false })
 | |
|         end
 | |
|     end
 | |
|     
 | |
|     local doorsMissing = {}
 | |
|     for i = 0, 7, 1 do
 | |
|         if (IsVehicleDoorDamaged(vehicle, i)) then
 | |
|             table.insert(doorsMissing, i)
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     local windowsBroken = {}
 | |
|     --for i = 0, 13, 1 do
 | |
|     --    if (not IsVehicleWindowIntact(vehicle, i)) then
 | |
|     --        table.insert(windowsBroken, i)
 | |
|     --    end
 | |
|     --end
 | |
| 
 | |
|     -- custom colors
 | |
|     local hasCustomPrimaryColor = GetIsVehiclePrimaryColourCustom(vehicle)
 | |
|     local customPrimaryColor = nil
 | |
|     if (hasCustomPrimaryColor) then
 | |
|         local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
 | |
|         customPrimaryColor = { r, g, b }
 | |
|     end
 | |
|     
 | |
|     local hasCustomSecondaryColor = GetIsVehicleSecondaryColourCustom(vehicle)
 | |
|     local customSecondaryColor = nil
 | |
|     if (hasCustomSecondaryColor) then
 | |
|         local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
 | |
|         customSecondaryColor = { r, g, b }
 | |
|     end
 | |
|     
 | |
|     return {
 | |
|         -- 1 model
 | |
|         GetEntityModel(vehicle),
 | |
|         
 | |
|         -- 2 lockStatus
 | |
|         GetVehicleDoorLockStatus(vehicle),
 | |
|         
 | |
|         -- 3 health
 | |
|         math.floor(GetEntityHealth(vehicle) * 10.0) / 10.0,
 | |
|         -- 4 bodyHealth
 | |
|         math.floor(GetVehicleBodyHealth(vehicle) * 10.0) / 10.0,
 | |
|         -- 5 engineHealth
 | |
|         math.floor(GetVehicleEngineHealth(vehicle) * 10.0) / 10.0,
 | |
|         -- 6 petrolTankHealth
 | |
|         math.floor(GetVehiclePetrolTankHealth(vehicle) * 10.0) / 10.0,
 | |
| 
 | |
|         -- 7 dirtLevel
 | |
|         math.floor(GetVehicleDirtLevel(vehicle) * 10.0) / 10.0,
 | |
|         -- 8 fuelLevel
 | |
|         math.floor(exports[Config.exports]:GetFuel(vehicle) * 10.0) / 10.0,
 | |
|         
 | |
|         ---------------------------------------------------------------------- Implementierung Miho
 | |
|         --math.floor(DecorGetFloat(vehicle, Config.FuelDecor)*10) / 10.0,
 | |
|         ---------------------------------------------------------------------- Implementierung Miho ENDE
 | |
| 
 | |
|         -- 9 plateIndex
 | |
|         GetVehicleNumberPlateTextIndex(vehicle),
 | |
|         
 | |
|         -- 10 primaryColor
 | |
|         color1,
 | |
|         -- 11 secondaryColor
 | |
|         color2,
 | |
|         -- 12 pearlescentColor
 | |
|         pearlescentColor,
 | |
|         -- 13 wheelColor
 | |
|         wheelColor,
 | |
|         
 | |
|         -- 14 wheelType
 | |
|         GetVehicleWheelType(vehicle),
 | |
|         -- 15 customWheelsFront
 | |
|         GetVehicleModVariation(vehicle, 23);
 | |
|         -- 16 customWheelsBack
 | |
|         GetVehicleModVariation(vehicle, 24);
 | |
|         -- 17 windowTint
 | |
|         GetVehicleWindowTint(vehicle),
 | |
|         -- 18 enabledNeon
 | |
|         {
 | |
|             IsVehicleNeonLightEnabled(vehicle, 0),
 | |
|             IsVehicleNeonLightEnabled(vehicle, 1),
 | |
|             IsVehicleNeonLightEnabled(vehicle, 2),
 | |
|             IsVehicleNeonLightEnabled(vehicle, 3),
 | |
|         },
 | |
|         -- 19 neonColor
 | |
|         table.pack(GetVehicleNeonLightsColour(vehicle)),
 | |
|         -- 20 tireSmokeColor
 | |
|         table.pack(GetVehicleTyreSmokeColor(vehicle)),
 | |
| 		
 | |
|         -- 21 extras
 | |
|         extras,
 | |
| 
 | |
|         -- 22-32 mods
 | |
|         GetVehicleMod(vehicle, 0),
 | |
|         GetVehicleMod(vehicle, 1),
 | |
|         GetVehicleMod(vehicle, 2),
 | |
|         GetVehicleMod(vehicle, 3),
 | |
|         GetVehicleMod(vehicle, 4),
 | |
|         GetVehicleMod(vehicle, 5),
 | |
|         GetVehicleMod(vehicle, 6),
 | |
|         GetVehicleMod(vehicle, 7),
 | |
|         GetVehicleMod(vehicle, 8),
 | |
|         GetVehicleMod(vehicle, 9),
 | |
|         GetVehicleMod(vehicle, 10),
 | |
|         
 | |
|         -- 33-38 mods
 | |
|         GetVehicleMod(vehicle, 11),
 | |
|         GetVehicleMod(vehicle, 12),
 | |
|         GetVehicleMod(vehicle, 13),
 | |
|         GetVehicleMod(vehicle, 14),
 | |
|         GetVehicleMod(vehicle, 15),
 | |
|         GetVehicleMod(vehicle, 16),
 | |
|         
 | |
|         -- 39-41 mods
 | |
|         IsToggleModOn(vehicle,  18),
 | |
|         IsToggleModOn(vehicle,  20),
 | |
|         IsToggleModOn(vehicle,  22),
 | |
|         
 | |
|         -- 42-43 mods
 | |
|         GetVehicleMod(vehicle, 23),
 | |
|         GetVehicleMod(vehicle, 24),
 | |
|         
 | |
|         -- 44-66 mods
 | |
|         GetVehicleMod(vehicle, 25),
 | |
|         GetVehicleMod(vehicle, 26),
 | |
|         GetVehicleMod(vehicle, 27),
 | |
|         GetVehicleMod(vehicle, 28),
 | |
|         GetVehicleMod(vehicle, 29),
 | |
|         GetVehicleMod(vehicle, 30),
 | |
|         GetVehicleMod(vehicle, 31),
 | |
|         GetVehicleMod(vehicle, 32),
 | |
|         GetVehicleMod(vehicle, 33),
 | |
|         GetVehicleMod(vehicle, 34),
 | |
|         GetVehicleMod(vehicle, 35),
 | |
|         GetVehicleMod(vehicle, 36),
 | |
|         GetVehicleMod(vehicle, 37),
 | |
|         GetVehicleMod(vehicle, 38),
 | |
|         GetVehicleMod(vehicle, 39),
 | |
|         GetVehicleMod(vehicle, 40),
 | |
|         GetVehicleMod(vehicle, 41),
 | |
|         GetVehicleMod(vehicle, 42),
 | |
|         GetVehicleMod(vehicle, 43),
 | |
|         GetVehicleMod(vehicle, 44),
 | |
|         GetVehicleMod(vehicle, 45),
 | |
|         GetVehicleMod(vehicle, 46),
 | |
|         GetVehicleMod(vehicle, 48),
 | |
| 
 | |
|         -- 67 livery
 | |
|         GetVehicleLivery(vehicle),
 | |
| 
 | |
|         -- 68 missingDoors
 | |
|         doorsMissing,
 | |
| 
 | |
|         -- 69 bulletproofTires
 | |
|         not GetVehicleTyresCanBurst(vehicle),
 | |
|         -- 70 tiresBurst
 | |
|         tiresBurst,
 | |
| 
 | |
|         -- 71 brokenWindows
 | |
|         windowsBroken,
 | |
| 
 | |
|         -- 72 xenon lights
 | |
|         GetVehicleXenonLightsColour(vehicle),
 | |
| 
 | |
|         -- 73 custom primary color
 | |
|         customPrimaryColor,
 | |
|         -- 74 custom secondary color
 | |
|         customSecondaryColor,
 | |
| 
 | |
|         -- 75 interior color
 | |
|         GetVehicleInteriorColor(vehicle)
 | |
|     }
 | |
| end
 | |
| 
 | |
| -- Apply all modifications to a vehicle entity
 | |
| function SetVehicleModifications(vehicle, plate, modifications)
 | |
|     SetVehicleModKit(vehicle, 0)
 | |
| 
 | |
|     -- plate
 | |
|     SetVehicleNumberPlateText(vehicle, plate)
 | |
|     SetVehicleNumberPlateTextIndex(vehicle, modifications[9])
 | |
|     
 | |
|     -- lockStatus
 | |
|     SetVehicleDoorsLocked(vehicle, modifications[2])
 | |
|     
 | |
|     -- colours
 | |
|     SetVehicleColours(vehicle, modifications[10], modifications[11])
 | |
|     if (modifications[73]) then
 | |
|         SetVehicleCustomPrimaryColour(vehicle, modifications[73][1], modifications[73][2], modifications[73][3])
 | |
|     end
 | |
|     if (modifications[74]) then
 | |
|         SetVehicleCustomSecondaryColour(vehicle, modifications[74][1], modifications[74][2], modifications[74][3])
 | |
|     end
 | |
|     if (modifications[75]) then
 | |
|         SetVehicleInteriorColor(vehicle, modifications[75])
 | |
|     end
 | |
|     
 | |
|     SetVehicleExtraColours(vehicle, modifications[12], modifications[13])
 | |
|     
 | |
|     SetVehicleTyreSmokeColor(vehicle, modifications[20][1], modifications[20][2], modifications[20][3])
 | |
| 
 | |
|     -- wheels
 | |
|     SetVehicleWheelType(vehicle, modifications[14])
 | |
| 
 | |
|     -- windows
 | |
|     SetVehicleWindowTint(vehicle, modifications[17])
 | |
|     
 | |
|     -- neonlight
 | |
|     SetVehicleNeonLightEnabled(vehicle, 0, modifications[18][1])
 | |
|     SetVehicleNeonLightEnabled(vehicle, 1, modifications[18][2])
 | |
|     SetVehicleNeonLightEnabled(vehicle, 2, modifications[18][3])
 | |
|     SetVehicleNeonLightEnabled(vehicle, 3, modifications[18][4])
 | |
|     
 | |
|     SetVehicleNeonLightsColour(vehicle, modifications[19][1], modifications[19][2], modifications[19][3])
 | |
|     
 | |
|     -- mods
 | |
|     SetVehicleMod(vehicle,  0, modifications[22], modifications[15])
 | |
|     SetVehicleMod(vehicle,  1, modifications[23], modifications[15])
 | |
|     SetVehicleMod(vehicle,  2, modifications[24], modifications[15])
 | |
|     SetVehicleMod(vehicle,  3, modifications[25], modifications[15])
 | |
|     SetVehicleMod(vehicle,  4, modifications[26], modifications[15])
 | |
|     SetVehicleMod(vehicle,  5, modifications[27], modifications[15])
 | |
|     SetVehicleMod(vehicle,  6, modifications[28], modifications[15])
 | |
|     SetVehicleMod(vehicle,  7, modifications[29], modifications[15])
 | |
|     SetVehicleMod(vehicle,  8, modifications[30], modifications[15])
 | |
|     SetVehicleMod(vehicle,  9, modifications[31], modifications[15])
 | |
|     SetVehicleMod(vehicle, 10, modifications[32], modifications[15])
 | |
|     
 | |
|     SetVehicleMod(vehicle, 11, modifications[33], modifications[15])
 | |
|     SetVehicleMod(vehicle, 12, modifications[34], modifications[15])
 | |
|     SetVehicleMod(vehicle, 13, modifications[35], modifications[15])
 | |
|     
 | |
|     SetVehicleMod(vehicle, 14, modifications[36], modifications[15])
 | |
|     
 | |
|     SetVehicleMod(vehicle, 15, modifications[37], modifications[15])
 | |
|     SetVehicleMod(vehicle, 16, modifications[38], modifications[15])
 | |
|     
 | |
|     ToggleVehicleMod(vehicle, 18, modifications[39])
 | |
|     ToggleVehicleMod(vehicle, 20, modifications[40])
 | |
|     ToggleVehicleMod(vehicle, 22, modifications[41])
 | |
|     
 | |
|     SetVehicleMod(vehicle, 23, modifications[42], modifications[15])
 | |
|     SetVehicleMod(vehicle, 24, modifications[43], modifications[16])
 | |
|     
 | |
|     SetVehicleMod(vehicle, 25, modifications[44], modifications[15])
 | |
|     SetVehicleMod(vehicle, 26, modifications[45], modifications[15])
 | |
|     SetVehicleMod(vehicle, 27, modifications[46], modifications[15])
 | |
|     SetVehicleMod(vehicle, 28, modifications[47], modifications[15])
 | |
|     SetVehicleMod(vehicle, 29, modifications[48], modifications[15])
 | |
|     SetVehicleMod(vehicle, 30, modifications[49], modifications[15])
 | |
|     SetVehicleMod(vehicle, 31, modifications[50], modifications[15])
 | |
|     SetVehicleMod(vehicle, 32, modifications[51], modifications[15])
 | |
|     SetVehicleMod(vehicle, 33, modifications[52], modifications[15])
 | |
|     SetVehicleMod(vehicle, 34, modifications[53], modifications[15])
 | |
|     SetVehicleMod(vehicle, 35, modifications[54], modifications[15])
 | |
|     SetVehicleMod(vehicle, 36, modifications[55], modifications[15])
 | |
|     SetVehicleMod(vehicle, 37, modifications[56], modifications[15])
 | |
|     SetVehicleMod(vehicle, 38, modifications[57], modifications[15])
 | |
|     SetVehicleMod(vehicle, 39, modifications[58], modifications[15])
 | |
|     SetVehicleMod(vehicle, 40, modifications[59], modifications[15])
 | |
|     SetVehicleMod(vehicle, 41, modifications[60], modifications[15])
 | |
|     SetVehicleMod(vehicle, 42, modifications[61], modifications[15])
 | |
|     SetVehicleMod(vehicle, 43, modifications[62], modifications[15])
 | |
|     SetVehicleMod(vehicle, 44, modifications[63], modifications[15])
 | |
|     SetVehicleMod(vehicle, 45, modifications[64], modifications[15])
 | |
|     SetVehicleMod(vehicle, 46, modifications[65], modifications[15])
 | |
|     SetVehicleMod(vehicle, 48, modifications[66], modifications[15])
 | |
| 
 | |
|     SetVehicleLivery(vehicle, modifications[67])
 | |
| 
 | |
|     -- extras
 | |
|     for i = 1, #modifications[21], 1 do
 | |
|         SetVehicleExtra(vehicle, modifications[21][i][1], modifications[21][i][2])
 | |
|     end
 | |
|     
 | |
|     -- stats
 | |
|     SetEntityHealth(vehicle, modifications[3])
 | |
|     SetVehicleBodyHealth(vehicle, modifications[4])
 | |
|     SetVehicleEngineHealth(vehicle, modifications[5])
 | |
|     SetVehiclePetrolTankHealth(vehicle, modifications[6])
 | |
|     if (Config.renderScorched and (modifications[5] < -3999.0 or modifications[6] < -999.0)) then
 | |
|         TriggerServerEvent("mh_Parking:renderScorched", NetworkGetNetworkIdFromEntity(vehicle), true)
 | |
|     end
 | |
|     
 | |
|     SetVehicleDirtLevel(vehicle, modifications[7])
 | |
|     exports[Config.exports]:SetFuel(vehicle, modifications[8])
 | |
| 
 | |
|     ---------------------------------------------------------------------- Implementierung Miho
 | |
|     --[[
 | |
|         fuel = modifications[8]
 | |
|     if type(fuel) == 'number' and fuel >= 0 and fuel <= 100 then
 | |
| 		SetVehicleFuelLevel(vehicle, fuel + 0.0)
 | |
| 		DecorSetFloat(vehicle, Config.FuelDecor, GetVehicleFuelLevel(vehicle))
 | |
| 	end
 | |
|     ]]
 | |
|     ---------------------------------------------------------------------- Implementierung Miho ENDE
 | |
| 
 | |
| 
 | |
|     -- doors
 | |
|     for i = 1, #modifications[68], 1 do
 | |
|         SetVehicleDoorBroken(vehicle, modifications[68][i], true)
 | |
|     end
 | |
|     
 | |
|     -- tires
 | |
|     SetVehicleTyresCanBurst(vehicle, not modifications[69])
 | |
|     if (not modifications[69]) then
 | |
|         for i = 1, #modifications[70], 1 do
 | |
|             SetVehicleTyreBurst(vehicle, modifications[70][i][1], modifications[70][i][2], 1000.0)
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     -- windows
 | |
|     for i = 1, #modifications[71], 1 do
 | |
|         SmashVehicleWindow(vehicle, modifications[71][i])
 | |
|     end
 | |
|     
 | |
|     -- xenon lights
 | |
| 	if (modifications[72]) then
 | |
| 		SetVehicleXenonLightsColour(vehicle, modifications[72])
 | |
| 	end
 | |
| end
 | |
| 
 | |
| -- Return closest loaded vehicle entity or nil if no vehicle is found
 | |
| function GetClosestVehicle(position, maxRadius)
 | |
|     local vehicles       = GetAllVehicles()
 | |
|     local dist           = maxRadius
 | |
|     local closestVehicle = nil
 | |
|     
 | |
|     for i=1, #vehicles, 1 do
 | |
|         local vehicleCoords = GetEntityCoords(vehicles[i])
 | |
|         local tempDist = Vdist(vehicleCoords.x, vehicleCoords.y, vehicleCoords.z, position.x, position.y, position.z)
 | |
|         if (tempDist < dist) then
 | |
|             dist = tempDist
 | |
|             closestVehicle = vehicles[i]
 | |
|         end
 | |
|     end
 | |
|     
 | |
|     if (closestVehicle ~= nil and DoesEntityExist(closestVehicle)) then
 | |
|         return closestVehicle
 | |
|     else
 | |
|         return nil
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- Returns all loaded vehicles on client side
 | |
| function GetAllVehicles()
 | |
|     local vehicles = {}
 | |
|     
 | |
|     for vehicle in EnumerateVehicles() do
 | |
|         table.insert(vehicles, vehicle)
 | |
|     end
 | |
|     
 | |
|     return vehicles
 | |
| end
 | |
| 
 | |
| function IsVehicleBlacklisted(vehicle)
 | |
|     -- check class
 | |
|     local class = GetVehicleClass(vehicle)
 | |
|     for i = 1, #Config.classesBlacklist, 1 do
 | |
|         if (class == Config.classesBlacklist[i]) then
 | |
|             return true
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     -- check model
 | |
|     local modelHash = GetEntityModel(vehicle)
 | |
|     for i = 1, #Config.vehiclesBlacklist, 1 do
 | |
|         if (modelHash == Config.vehiclesBlacklist[i]) then
 | |
|             return true
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     return false
 | |
| end
 | |
| 
 | |
| function GetVehiclePosition(plate)
 | |
|     if (GetResourceState("kimi_callbacks") ~= "started") then
 | |
|         Log("^1[ERROR] \"kimi_callbacks\" is either not installed properly or hasn't been started!")
 | |
|         Log("^1[ERROR] The export \"GetVehiclePosition\" can only be used when having this resource installed.")
 | |
|         return nil
 | |
|     end
 | |
| 
 | |
|     if (plate == nil) then
 | |
|         Log("^1[ERROR] \"plate\" was nil while trying to call export \"GetVehiclePosition\"!")
 | |
|         return nil
 | |
|     end
 | |
|     
 | |
|     if (type(plate) ~= "string") then
 | |
|         Log("^1[ERROR] \"plate\" (\"" .. plate .. "\") needs to be of type string when calling export \"GetVehiclePosition\"!")
 | |
|         return nil
 | |
|     end
 | |
| 
 | |
|     local position = exports["kimi_callbacks"]:Trigger("AP:getVehiclePosition", plate:upper())
 | |
| 
 | |
|     return position
 | |
| end
 | |
| 
 | |
| function GetVehiclePositions(...)
 | |
|     if (GetResourceState("kimi_callbacks") ~= "started") then
 | |
|         Log("^1[ERROR] \"kimi_callbacks\" is either not installed properly or hasn't been started!")
 | |
|         Log("^1[ERROR] The export \"GetVehiclePositions\" can only be used when having this resource installed.")
 | |
|         return nil
 | |
|     end
 | |
| 
 | |
|     local plates = { ... }
 | |
| 
 | |
|     for i, plate in ipairs(plates) do
 | |
|         if (plate == nil) then
 | |
|             Log("^1[ERROR] \"plate\" (Index: \"" .. i .. "\") was nil while trying to call export \"GetVehiclePositions\"!")
 | |
|             return nil
 | |
|         end
 | |
|         
 | |
|         if (type(plate) ~= "string") then
 | |
|             Log("^1[ERROR] \"plate\" (\"" .. plate .. "\") (Index: " .. i .. ") needs to be of type string when calling export \"GetVehiclePositions\"!")
 | |
|             return nil
 | |
|         end
 | |
|         
 | |
|         plates[i] = plates[i]:upper()
 | |
|     end
 | |
| 
 | |
|     local data = exports["kimi_callbacks"]:Trigger("AP:getVehiclePositions", plates)
 | |
| 
 | |
|     return data
 | |
| end
 | |
| 
 | |
| -- getting all vehicles
 | |
| function EnumerateVehicles()
 | |
|     return EnumerateEntities(FindFirstVehicle, FindNextVehicle, EndFindVehicle)
 | |
| end
 | |
| function EnumerateEntities(initFunc, moveFunc, disposeFunc)
 | |
|     return coroutine.wrap(function()
 | |
|         local iter, id = initFunc()
 | |
|         if not id or id == 0 then
 | |
|             disposeFunc(iter)
 | |
|             return
 | |
|         end
 | |
| 
 | |
|         local enum = {handle = iter, destructor = disposeFunc}
 | |
|         setmetatable(enum, entityEnumerator)
 | |
| 
 | |
|         local next = true
 | |
|         repeat
 | |
|             coroutine.yield(id)
 | |
|             next, id = moveFunc(iter)
 | |
|         until not next
 | |
| 
 | |
|         enum.destructor, enum.handle = nil, nil
 | |
|         disposeFunc(iter)
 | |
|     end)
 | |
| end
 | |
| local entityEnumerator = {
 | |
|     __gc = function(enum)
 | |
|         if enum.destructor and enum.handle then
 | |
|             enum.destructor(enum.handle)
 | |
|         end
 | |
|         enum.destructor = nil
 | |
|         enum.handle = nil
 | |
|     end
 | |
| }
 | 
