1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-08-06 15:36:50 +02:00
parent 6d22d5f77c
commit 63fbc60a00
86 changed files with 8352 additions and 3428 deletions

View file

@ -0,0 +1,770 @@
local vehicles = {}
local DB_vehicles = {}
-- Command to delete ALL vehicles from the database table. Needs to be executed twice for security reason.
local deleteSavedVehicles = false
RegisterCommand("deleteSavedVehicles", function(source, args, raw)
if (deleteSavedVehicles) then
MySQL.query("DELETE FROM vehicle_parking", { })
vehicles = {}
Log("Deleted all vehicles from the vehicle_parking table.")
else
Log("Are you sure that you want to delete all vehicles from the parking list?\nIf yes, type the command a second time!")
end
deleteSavedVehicles = not deleteSavedVehicles
end, true)
-- read all vehicles from the database on startup and do a cleanup check
MySQL.ready(function()
-- fetch all database results
MySQL.query("SELECT plate, posX, posY, posZ, rotX, rotY, rotZ, modifications, lastUpdate FROM vehicle_parking", {}, function(results)
Log("Found " .. #results .. " saved vehicles in vehicle_parking.")
for i = 1, #results do
vehicles[results[i].plate] = {
handle = nil,
position = vector3(results[i].posX, results[i].posY, results[i].posZ),
rotation = vector3(results[i].rotX, results[i].rotY, results[i].rotZ),
modifications = json.decode(results[i].modifications),
lastUpdate = results[i].lastUpdate,
spawning = false,
spawningPlayer = nil,
faultyModel = false
}
end
--CleanUp()
end)
end)
-- Default CleanUp function. Deletes vehicles from the database after a specific amount of time has passed (configurable in config)
function CleanUp()
local currentTime = os.time()
local threshold = 60 * 60 * Config.cleanUpThresholdTime
local toDelete = {}
for plate, vehicle in pairs(vehicles) do
if (vehicle.lastUpdate < os.difftime(currentTime, threshold)) then
MySQL.query("DELETE FROM vehicle_parking WHERE plate = @plate",
{
["@plate"] = plate
})
table.insert(toDelete, plate)
end
end
for i = 1, #toDelete, 1 do
local plate = toDelete[i]
vehicles[plate] = nil
end
Log("CleanUp complete. Deleted " .. #toDelete .. " entries.")
end
-- loop to spawn vehicles near players
Citizen.CreateThread(function()
while (true) do
Citizen.Wait(5000)
if (GetActivePlayerCount() > 0) then
TrySpawnVehicles()
end
end
end)
Citizen.CreateThread(function()
while (true) do
CallDB_Vehicles()
Citizen.Wait(60000 * 5)
end
end)
-- loop to delete vehicles
Citizen.CreateThread(function()
if (Config.deleteTimer <= 0) then
return
end
while (true) do
Citizen.Wait(60000 * (Config.deleteTimer - Config.deleteNotificationTimes[1]))
TriggerClientEvent("mh_Parking:notification", -1, string.format(Config.timeLeftNotification, Config.deleteNotificationTimes[1]))
for i = 2, #Config.deleteNotificationTimes, 1 do
Citizen.Wait(60000 * (Config.deleteNotificationTimes[i - 1] - Config.deleteNotificationTimes[i]))
TriggerClientEvent("mh_Parking:notification", -1, string.format(Config.timeLeftNotification, Config.deleteNotificationTimes[i]))
end
Citizen.Wait(60000 * Config.deleteNotificationTimes[#Config.deleteNotificationTimes])
DeleteAllVehicles()
end
end)
-- sync player position
RegisterServerEvent("mh_Parking:syncPlayerPosition")
AddEventHandler("mh_Parking:syncPlayerPosition", function(position)
activePlayerPositions[source] = position
end)
-- player disconnected
AddEventHandler("playerDropped", function(disconnectReason)
activePlayerPositions[source] = nil
end)
-- player entered a vehicle
RegisterServerEvent("mh_Parking:enteredVehicle")
AddEventHandler("mh_Parking:enteredVehicle", function(networkId, plate, modifications)
local vehicle = NetworkGetEntityFromNetworkId(networkId)
if (DoesEntityExist(vehicle)) then
local currentTime = os.time()
local position = GetEntityCoords(vehicle)
position = vector3(math.floor(position.x * 100.0) / 100.0, math.floor(position.y * 100.0) / 100.0, math.floor(position.z * 100.0) / 100.0)
local rotation = GetEntityRotation(vehicle)
rotation = vector3(math.floor(rotation.x * 100.0) / 100.0, math.floor(rotation.y * 100.0) / 100.0, math.floor(rotation.z * 100.0) / 100.0)
if (vehicles[plate]) then
-- already on server list
Log("Entered vehicle " .. plate .. ". Updating...")
if (vehicles[plate].handle ~= vehicle) then
if (DoesEntityExist(vehicles[plate].handle)) then
DeleteEntity(vehicles[plate].handle)
end
vehicles[plate].handle = vehicle
end
vehicles[plate].position = position
vehicles[plate].rotation = rotation
vehicles[plate].modifications = modifications
vehicles[plate].lastUpdate = currentTime
MySQL.query("UPDATE vehicle_parking SET posX = @posX, posY = @posY, posZ = @posZ, rotX = @rotX, rotY = @rotY, rotZ = @rotZ, modifications = @modifications, lastUpdate = @lastUpdate WHERE plate = @plate", {
["@plate"] = plate,
["@posX"] = vehicles[plate].position.x,
["@posY"] = vehicles[plate].position.y,
["@posZ"] = vehicles[plate].position.z,
["@rotX"] = vehicles[plate].rotation.x,
["@rotY"] = vehicles[plate].rotation.y,
["@rotZ"] = vehicles[plate].rotation.z,
["@modifications"] = json.encode(vehicles[plate].modifications),
["@lastUpdate"] = vehicles[plate].lastUpdate
})
else
-- insert in db
Log("Entered vehicle " .. plate .. ". Inserting new...")
vehicles[plate] = {
handle = vehicle,
position = position,
rotation = rotation,
modifications = modifications,
lastUpdate = currentTime,
spawning = false,
spawningPlayer = nil
}
MySQL.query('SELECT * FROM player_vehicles WHERE plate = @plate', { ['@plate'] = plate }, function(rs)
Log(json.encode(rs))
if rs[1] then
Log("FOUND OWNER FROM VEHICLE")
MySQL.query("INSERT INTO vehicle_parking (plate, posX, posY, posZ, rotX, rotY, rotZ, modifications, lastUpdate) VALUES (@plate, @posX, @posY, @posZ, @rotX, @rotY, @rotZ, @modifications, @lastUpdate)", {
["@plate"] = plate,
["@posX"] = vehicles[plate].position.x,
["@posY"] = vehicles[plate].position.y,
["@posZ"] = vehicles[plate].position.z,
["@rotX"] = vehicles[plate].rotation.x,
["@rotY"] = vehicles[plate].rotation.y,
["@rotZ"] = vehicles[plate].rotation.z,
["@modifications"] = json.encode(vehicles[plate].modifications),
["@lastUpdate"] = vehicles[plate].lastUpdate
})
else
Log("1: NO VEHICLE FOUND")
end
end)
end
else
Log("Vehicle does not exist. Might be a Onesync error.")
end
end)
-- player left a vehicle
RegisterServerEvent("mh_Parking:leftVehicle")
AddEventHandler("mh_Parking:leftVehicle", function(networkId, modifications)
local vehicle = NetworkGetEntityFromNetworkId(networkId)
if (DoesEntityExist(vehicle)) then
local currentTime = os.time()
local plate = GetVehicleNumberPlateText(vehicle)
local position = GetEntityCoords(vehicle)
position = vector3(math.floor(position.x * 100.0) / 100.0, math.floor(position.y * 100.0) / 100.0, math.floor(position.z * 100.0) / 100.0)
local rotation = GetEntityRotation(vehicle)
rotation = vector3(math.floor(rotation.x * 100.0) / 100.0, math.floor(rotation.y * 100.0) / 100.0, math.floor(rotation.z * 100.0) / 100.0)
if (vehicles[plate]) then
-- already on server list
Log("Left vehicle " .. plate .. ". Updating...")
if (vehicles[plate].handle ~= vehicle) then
if (DoesEntityExist(vehicles[plate].handle)) then
DeleteEntity(vehicles[plate].handle)
end
vehicles[plate].handle = vehicle
end
vehicles[plate].position = position
vehicles[plate].rotation = rotation
vehicles[plate].modifications = modifications
vehicles[plate].lastUpdate = currentTime
MySQL.query("UPDATE vehicle_parking SET posX = @posX, posY = @posY, posZ = @posZ, rotX = @rotX, rotY = @rotY, rotZ = @rotZ, modifications = @modifications, lastUpdate = @lastUpdate WHERE plate = @plate",{
["@plate"] = plate,
["@posX"] = vehicles[plate].position.x,
["@posY"] = vehicles[plate].position.y,
["@posZ"] = vehicles[plate].position.z,
["@rotX"] = vehicles[plate].rotation.x,
["@rotY"] = vehicles[plate].rotation.y,
["@rotZ"] = vehicles[plate].rotation.z,
["@modifications"] = json.encode(vehicles[plate].modifications),
["@lastUpdate"] = currentTime
})
else
-- insert in db
Log("Left vehicle " .. plate .. ". Inserting new...")
vehicles[plate] = {
handle = vehicle,
position = position,
rotation = rotation,
modifications = modifications,
lastUpdate = currentTime,
spawning = false,
spawningPlayer = nil
}
MySQL.query('SELECT * FROM player_vehicles WHERE plate = @plate', { ['@plate'] = plate }, function(rs)
if rs[1] then
Log("FOUND OWNER FROM VEHICLE")
MySQL.query("INSERT INTO vehicle_parking (plate, posX, posY, posZ, rotX, rotY, rotZ, modifications, lastUpdate) VALUES (@plate, @posX, @posY, @posZ, @rotX, @rotY, @rotZ, @modifications, @lastUpdate)",{
["@plate"] = plate,
["@posX"] = vehicles[plate].position.x,
["@posY"] = vehicles[plate].position.y,
["@posZ"] = vehicles[plate].position.z,
["@rotX"] = vehicles[plate].rotation.x,
["@rotY"] = vehicles[plate].rotation.y,
["@rotZ"] = vehicles[plate].rotation.z,
["@modifications"] = json.encode(vehicles[plate].modifications),
["@lastUpdate"] = vehicles[plate].lastUpdate
})
else
Log("2: NO VEHICLE FOUND")
end
end)
end
end
end)
-- update a vehicle with its modifications
RegisterServerEvent("mh_Parking:updateVehicle")
AddEventHandler("mh_Parking:updateVehicle", function(networkId, modifications)
local vehicle = NetworkGetEntityFromNetworkId(networkId)
if (DoesEntityExist(vehicle)) then
local currentTime = os.time()
local plate = GetVehicleNumberPlateText(vehicle)
local position = GetEntityCoords(vehicle)
position = vector3(math.floor(position.x * 100.0) / 100.0, math.floor(position.y * 100.0) / 100.0, math.floor(position.z * 100.0) / 100.0)
local rotation = GetEntityRotation(vehicle)
rotation = vector3(math.floor(rotation.x * 100.0) / 100.0, math.floor(rotation.y * 100.0) / 100.0, math.floor(rotation.z * 100.0) / 100.0)
if (vehicles[plate] ~= nil) then
-- already on server list
Log("Updating vehicle " .. plate)
if (vehicles[plate].handle ~= vehicle) then
if (DoesEntityExist(vehicles[plate].handle)) then
DeleteEntity(vehicles[plate].handle)
end
vehicles[plate].handle = vehicle
end
vehicles[plate].position = position
vehicles[plate].rotation = rotation
vehicles[plate].modifications = modifications
vehicles[plate].lastUpdate = currentTime
MySQL.query("UPDATE vehicle_parking SET posX = @posX, posY = @posY, posZ = @posZ, rotX = @rotX, rotY = @rotY, rotZ = @rotZ, modifications = @modifications, lastUpdate = @lastUpdate WHERE plate = @plate",{
["@plate"] = plate,
["@posX"] = vehicles[plate].position.x,
["@posY"] = vehicles[plate].position.y,
["@posZ"] = vehicles[plate].position.z,
["@rotX"] = vehicles[plate].rotation.x,
["@rotY"] = vehicles[plate].rotation.y,
["@rotZ"] = vehicles[plate].rotation.z,
["@modifications"] = json.encode(vehicles[plate].modifications),
["@lastUpdate"] = vehicles[plate].lastUpdate
})
else
-- insert in db
Log("Updating vehicle " .. plate .. ". Inserting new...")
vehicles[plate] = {
handle = vehicle,
position = position,
rotation = rotation,
modifications = modifications,
lastUpdate = currentTime,
spawning = false,
spawningPlayer = nil
}
MySQL.query('SELECT * FROM player_vehicles WHERE plate = @plate', { ['@plate'] = plate }, function(rs)
if rs[1] then
Log("FOUND OWNER FROM VEHICLE")
MySQL.query("INSERT INTO vehicle_parking (plate, posX, posY, posZ, rotX, rotY, rotZ, modifications, lastUpdate) VALUES (@plate, @posX, @posY, @posZ, @rotX, @rotY, @rotZ, @modifications, @lastUpdate)",{
["@plate"] = plate,
["@posX"] = vehicles[plate].position.x,
["@posY"] = vehicles[plate].position.y,
["@posZ"] = vehicles[plate].position.z,
["@rotX"] = vehicles[plate].rotation.x,
["@rotY"] = vehicles[plate].rotation.y,
["@rotZ"] = vehicles[plate].rotation.z,
["@modifications"] = json.encode(vehicles[plate].modifications),
["@lastUpdate"] = vehicles[plate].lastUpdate
})
else
Log("3: NO VEHICLE FOUND")
end
end)
end
end
end)
-- delete a vehicle from the table (and world) with its plate
RegisterServerEvent("mh_Parking:deleteVehicle")
AddEventHandler("mh_Parking:deleteVehicle", function(plate, deleteEntity)
if (plate == nil) then
Log("^1mh_Parking: \"plate\" was nil while trying to delete vehicle!")
return
end
Log("Trying to delete " .. tostring(plate))
if (vehicles[plate] ~= nil) then
if (deleteEntity and DoesEntityExist(vehicles[plate].handle)) then
DeleteEntity(vehicles[plate].handle)
end
vehicles[plate] = nil
MySQL.query("DELETE FROM vehicle_parking WHERE plate = @plate",
{
["@plate"] = plate
})
else
local loadedVehicles = GetAllVehicles()
local loadedVehicle = TryGetLoadedVehicle(plate, loadedVehicles)
if (loadedVehicle ~= nil) then
if (deleteEntity and DoesEntityExist(loadedVehicle)) then
DeleteEntity(loadedVehicle)
end
MySQL.query("DELETE FROM vehicle_parking WHERE plate = @plate",
{
["@plate"] = plate
})
end
end
end)
-- checks if vehicles have to be spawned and spawns them if necessary
function TrySpawnVehicles()
local loadedVehicles = GetAllVehicles()
local playerVehiclePlates = {}
for id, position in pairs(activePlayerPositions) do
local ped = GetPlayerPed(id)
local veh = GetVehiclePedIsIn(ped, false)
if (DoesEntityExist(veh)) then
table.insert(playerVehiclePlates, GetVehicleNumberPlateText(veh))
end
end
-- check, if vehicles need to be spawned
for plate, vehicleData in pairs(vehicles) do
local plateCheck = CheckPlate(plate)
if (plateCheck ~= false) then
if (not vehicleData.faultyModel) then
if (not vehicleData.spawning) then
local closestPlayer, dist = GetClosestPlayerId(vehicleData.position)
if (closestPlayer ~= nil and dist < Config.spawnDistance and not ContainsPlate(plate, playerVehiclePlates)) then
if (vehicleData.handle ~= nil and DoesEntityExist(vehicleData.handle)) then
-- vehicle found on server side
UpdateVehicle(plate)
else
-- vehicle not found on server side
-- check, if it is loaded differently
local loadedVehicle = TryGetLoadedVehicle(plate, loadedVehicles)
if (loadedVehicle ~= nil) then
-- vehicle found
vehicleData.handle = loadedVehicle
UpdateVehicle(plate)
else
-- vehicle not found
-- try and spawn it
local playerId, distance = GetClosestPlayerId(vehicleData.position)
if (playerId and distance < Config.spawnDistance) then
vehicleData.spawning = true
Citizen.CreateThread(function()
local vec4 = vector4(vehicleData.position.x, vehicleData.position.y, vehicleData.position.z, vehicleData.rotation.z)
local vehicle = Citizen.InvokeNative(GetHashKey("CREATE_AUTOMOBILE"), vehicleData.modifications[1], vec4.xyzw)
while (not DoesEntityExist(vehicle)) do
Citizen.Wait(0)
end
SetEntityCoords(vehicle, vehicleData.position.x, vehicleData.position.y, vehicleData.position.z)
SetEntityRotation(vehicle, vehicleData.rotation.x, vehicleData.rotation.y, vehicleData.rotation.z)
vehicleData.handle = vehicle
local networkOwner = -1
while (networkOwner == -1) do
Citizen.Wait(0)
networkOwner = NetworkGetEntityOwner(vehicleData.handle)
end
vehicleData.spawningPlayer = GetPlayerIdentifiersSorted(networkOwner)["license"]
Log("Creating vehicle " .. plate .. " at " .. tostring(vehicleData.position) .. " at entity owner " .. tostring(networkOwner))
TriggerClientEvent("mh_Parking:setVehicleMods", networkOwner, NetworkGetNetworkIdFromEntity(vehicleData.handle), plate, vehicleData.modifications)
end)
end
end
end
end
elseif (vehicleData.spawningPlayer) then
-- if vehicle is currently spawning check if responsible player is still connected
if (not IsPlayerWithLicenseActive(vehicleData.spawningPlayer)) then
TriggerEvent("mh_Parking:setVehicleModsFailed", plate)
end
end
end
end
end
end
RegisterServerEvent("mh_Parking:setVehicleModsSuccess")
AddEventHandler("mh_Parking:setVehicleModsSuccess", function(plate)
Log("Setting mods successful...")
if (vehicles[plate]) then
vehicles[plate].spawning = false
vehicles[plate].spawningPlayer = nil
end
end)
RegisterServerEvent("mh_Parking:setVehicleModsFailed")
AddEventHandler("mh_Parking:setVehicleModsFailed", function(plate)
Log("Setting mods for " .. plate .. " failed... retrying...")
if (vehicles[plate] and vehicles[plate].handle and DoesEntityExist(vehicles[plate].handle)) then
local networkOwner = -1
while (networkOwner == -1) do
Citizen.Wait(0)
networkOwner = NetworkGetEntityOwner(vehicles[plate].handle)
end
local netOwnerLicense = GetPlayerIdentifiersSorted(networkOwner)["license"]
if (netOwnerLicense ~= nil) then
vehicles[plate].spawningPlayer = GetPlayerIdentifiersSorted(networkOwner)["license"]
TriggerClientEvent("mh_Parking:setVehicleMods", networkOwner, NetworkGetNetworkIdFromEntity(vehicles[plate].handle), plate, vehicles[plate].modifications)
else
Log("Something went wrong while trying to get player license for spawning vehicle " .. tostring(plate) .. ". Despawning vehicle")
DeleteEntity(vehicles[plate].handle)
vehicles[plate].handle = nil
vehicles[plate].spawningPlayer = nil
vehicles[plate].spawning = false
end
end
end)
RegisterServerEvent("mh_Parking:modelDoesNotExist")
AddEventHandler("mh_Parking:modelDoesNotExist", function(plate)
if (vehicles[plate] == nil) then
return
end
if (DoesEntityExist(vehicles[plate].handle)) then
DeleteEntity(vehicles[plate].handle)
end
vehicles[plate].handle = nil
vehicles[plate].spawningPlayer = nil
vehicles[plate].spawning = false
Log("The model for vehicle " .. tostring(plate) .. " does not exist. Removing from spawn pool...")
vehicles[plate].faultyModel = true
end)
RegisterServerEvent("mh_Parking:updatePlate")
AddEventHandler("mh_Parking:updatePlate", function(oldPlate, newPlate)
if (oldPlate == nil or newPlate == nil) then
Log("^1mh_Parking: \"oldPlate\" or \"newPlate\" was nil while trying to update a plate!")
return
end
if (vehicles[oldPlate]) then
if (vehicles[newPlate]) then
Log("Updating plate failed. New plate was already there!")
else
vehicles[newPlate] = vehicles[oldPlate]
vehicles[oldPlate] = nil
Log("Updating plate successful!")
MySQL.query("UPDATE vehicle_parking SET plate = @newPlate WHERE plate = @oldPlate",
{
["@newPlate"] = newPlate,
["@oldPlate"] = oldPlate
})
end
else
Log("Updating plate failed or unnecessary. Old plate was not found!")
end
end)
function UpdateVehicle(plate)
local newPos = GetEntityCoords(vehicles[plate].handle)
local newRot = GetEntityRotation(vehicles[plate].handle)
newPos = vector3(math.floor(newPos.x * 100.0) * 0.01, math.floor(newPos.y * 100.0) * 0.01, math.floor(newPos.z * 100.0) * 0.01)
newRot = vector3(math.floor(newRot.x * 100.0) * 0.01, math.floor(newRot.y * 100.0) * 0.01, math.floor(newRot.z * 100.0) * 0.01)
local newLockStatus = GetVehicleDoorLockStatus(vehicles[plate].handle)
local newEngineHealth = math.floor(GetVehicleEngineHealth(vehicles[plate].handle) * 10.0) * 0.1
local newTankHealth = math.floor(GetVehiclePetrolTankHealth(vehicles[plate].handle) * 10.0) * 0.1
if (Vector3DistFast(vehicles[plate].position, newPos) > 1.0
or GetRotationDifference(vehicles[plate].rotation, newRot) > 15.0
or newLockStatus ~= vehicles[plate].modifications[2]
or math.abs(newEngineHealth - vehicles[plate].modifications[5]) > 5.0
or math.abs(newTankHealth - vehicles[plate].modifications[6]) > 5.0
) then
vehicles[plate].modifications[2] = newLockStatus
vehicles[plate].modifications[5] = newEngineHealth
vehicles[plate].modifications[6] = newTankHealth
Log("Updating vehicle " .. plate)
vehicles[plate].position = newPos
vehicles[plate].rotation = newRot
MySQL.query("UPDATE vehicle_parking SET posX = @posX, posY = @posY, posZ = @posZ, rotX = @rotX, rotY = @rotY, rotZ = @rotZ, modifications = @modifications WHERE plate = @plate",
{
["@posX"] = vehicles[plate].position.x,
["@posY"] = vehicles[plate].position.y,
["@posZ"] = vehicles[plate].position.z,
["@rotX"] = vehicles[plate].rotation.x,
["@rotY"] = vehicles[plate].rotation.y,
["@rotZ"] = vehicles[plate].rotation.z,
["@modifications"] = json.encode(vehicles[plate].modifications),
["@plate"] = plate
})
end
end
function DeleteAllVehicles()
TriggerClientEvent("mh_Parking:notification", -1, Config.deleteNotification)
local peds = GetAllPeds()
local playerPeds = {}
for i = 1, #peds, 1 do
if (IsPedAPlayer(peds[i])) then
table.insert(playerPeds, peds[i])
end
end
if (#playerPeds == 0) then
return
end
local time = GetGameTimer()
local vehs = GetAllVehicles()
local deleted = 0
for i = 1, #vehs, 1 do
if (not IsAnyPlayerInsideVehicle(vehs[i], playerPeds)) then
local closestPlayer, distance = GetClosestPlayerPed(GetEntityCoords(vehs[i]), playerPeds)
if (closestPlayer ~= nil and distance > Config.deleteDistance) then
local plate = GetVehicleNumberPlateText(vehs[i])
if (vehicles[plate] ~= nil) then
vehicles[plate] = nil
MySQL.query("DELETE FROM vehicle_parking WHERE plate = @plate",
{
["@plate"] = plate
})
end
DeleteEntity(vehs[i])
deleted = deleted + 1
end
end
end
Log("Deleted " .. tostring(deleted) .. "/" .. tostring(#vehs) .. " vehicles. Took " .. tostring((GetGameTimer() - time) / 1000.0) .. "sec")
end
AddEventHandler("onResourceStop", function(name)
if (name ~= GetCurrentResourceName()) then
return
end
-- delete vehicles that are still being spawned before actually stopping the resource
for plate, vehicleData in pairs(vehicles) do
if (vehicleData.spawning and DoesEntityExist(vehicleData.handle)) then
DeleteEntity(vehicleData.handle)
end
end
end)
-- render entity scorched (trigger with netid of the vehicle and false when repairing)
RegisterServerEvent("mh_Parking:renderScorched")
AddEventHandler("mh_Parking:renderScorched", function(vehicleNetId, scorched)
local vehicleHandle = NetworkGetEntityFromNetworkId(vehicleNetId)
if (DoesEntityExist(vehicleHandle)) then
TriggerClientEvent("mh_Parking:renderScorched", -1, vehicleNetId, scorched)
end
end)
if (GetResourceState("kimi_callbacks") == "started") then
exports["kimi_callbacks"]:Register("AP:getVehiclePosition", function(source, plate)
local vehs = GetAllVehicles()
for i, veh in ipairs(vehs) do
local vehPlate = GetVehicleNumberPlateText(veh)
if (plate == vehPlate or plate == string.gsub(vehPlate, "^%s*(.-)%s*$", "%1")) then
return GetEntityCoords(veh)
end
end
for vehPlate, vehData in pairs(vehicles) do
if (plate == vehPlate or plate == string.gsub(vehPlate, "^%s*(.-)%s*$", "%1")) then
return vehData.position
end
end
return nil
end)
exports["kimi_callbacks"]:Register("AP:getVehiclePositions", function(source, plates)
local platePositions = {}
Log("Looking for plates:")
for i, plate in ipairs(plates) do
Log("\"" .. plate .. "\"")
end
local vehs = GetAllVehicles()
for i, veh in ipairs(vehs) do
local vehPlate = GetVehicleNumberPlateText(veh)
local trimmedVehPlate = string.gsub(vehPlate, "^%s*(.-)%s*$", "%1")
for j, plate in ipairs(plates) do
if (plate == vehPlate or plate == trimmedVehPlate) then
platePositions[plate] = GetEntityCoords(veh)
break
end
end
end
for i, plate in ipairs(plates) do
if (platePositions[plate] == nil) then
for vehPlate, vehData in pairs(vehicles) do
local trimmedVehPlate = string.gsub(vehPlate, "^%s*(.-)%s*$", "%1")
if (plate == vehPlate or plate == trimmedVehPlate) then
platePositions[plate] = vehData.position
break
end
end
end
end
return platePositions
end)
end
RegisterNetEvent('mh_Parking:removeVehicle')
AddEventHandler('mh_Parking:removeVehicle', function(plate)
print("mh_parking: "..plate)
vehicles[plate] = nil
end)
function CallDB_Vehicles()
DB_vehicles = {}
MySQL.query('SELECT * FROM player_vehicles', {}, function(rs)
for k, v in pairs(rs) do
table.insert(DB_vehicles, v)
end
end) --DB_vehicles
end
function CheckPlate(plate) -- DB_Players
for k, v in pairs(DB_vehicles) do
if Config.isDebug then
Log(json.encode(v))
Log(plate)
Log(v.plate)
end
if v.plate == plate then
return true
end
end
return false
end