forked from Simnation/Main
ed
This commit is contained in:
parent
17e8dfe748
commit
b2d3b24185
2 changed files with 86 additions and 247 deletions
|
@ -10,23 +10,42 @@ end
|
|||
|
||||
-- Erstelle Tabelle bei Serverstart
|
||||
CreateThread(function()
|
||||
MySQL.query([[
|
||||
CREATE TABLE IF NOT EXISTS `vehicle_antidespawn` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`plate` varchar(50) NOT NULL,
|
||||
`model` varchar(50) NOT NULL,
|
||||
`coords` longtext NOT NULL,
|
||||
`heading` float NOT NULL,
|
||||
`fuel` int(11) DEFAULT 100,
|
||||
`mods` longtext DEFAULT NULL,
|
||||
`last_updated` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `plate` (`plate`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
]])
|
||||
-- Prüfe ob die Tabelle existiert
|
||||
MySQL.query("SHOW TABLES LIKE 'vehicle_antidespawn'", {}, function(result)
|
||||
if result and #result > 0 then
|
||||
-- Tabelle existiert, prüfe ob das mods-Feld existiert
|
||||
MySQL.query("SHOW COLUMNS FROM vehicle_antidespawn LIKE 'mods'", {}, function(columns)
|
||||
if columns and #columns == 0 then
|
||||
-- mods-Feld existiert nicht, füge es hinzu
|
||||
Debug("Füge mods-Feld zur Tabelle hinzu...")
|
||||
MySQL.query("ALTER TABLE vehicle_antidespawn ADD COLUMN mods LONGTEXT DEFAULT NULL", {})
|
||||
end
|
||||
end)
|
||||
else
|
||||
-- Tabelle existiert nicht, erstelle sie
|
||||
Debug("Erstelle Datenbank-Tabelle...")
|
||||
MySQL.query([[
|
||||
CREATE TABLE IF NOT EXISTS `vehicle_antidespawn` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`plate` varchar(50) NOT NULL,
|
||||
`model` varchar(50) NOT NULL,
|
||||
`coords` longtext NOT NULL,
|
||||
`heading` float NOT NULL,
|
||||
`fuel` int(11) DEFAULT 100,
|
||||
`mods` longtext DEFAULT NULL,
|
||||
`last_updated` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `plate` (`plate`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
]])
|
||||
end
|
||||
end)
|
||||
|
||||
Debug("Datenbank initialisiert")
|
||||
|
||||
-- Warte kurz, bis die Tabelle aktualisiert wurde
|
||||
Wait(1000)
|
||||
|
||||
-- Lade alle Fahrzeuge aus der Datenbank
|
||||
MySQL.query("SELECT * FROM vehicle_antidespawn", {}, function(results)
|
||||
if results and #results > 0 then
|
||||
|
@ -38,7 +57,7 @@ CreateThread(function()
|
|||
coords = json.decode(vehicle.coords),
|
||||
heading = vehicle.heading,
|
||||
fuel = vehicle.fuel,
|
||||
mods = json.decode(vehicle.mods),
|
||||
mods = vehicle.mods and json.decode(vehicle.mods) or nil,
|
||||
last_updated = vehicle.last_updated
|
||||
}
|
||||
end
|
||||
|
@ -64,6 +83,13 @@ RegisterNetEvent('antidespawn:server:registerVehicle', function(plate, model, co
|
|||
MySQL.query('SELECT * FROM player_vehicles WHERE plate = ? AND state = ?', {plate, 1}, function(result)
|
||||
if result and #result > 0 then
|
||||
Debug("Fahrzeug ist in der Garage, nicht registrieren: " .. plate)
|
||||
|
||||
-- Entferne aus Anti-Despawn Datenbank falls vorhanden
|
||||
if vehicles[plate] then
|
||||
vehicles[plate] = nil
|
||||
MySQL.query("DELETE FROM vehicle_antidespawn WHERE plate = ?", {plate})
|
||||
Debug("Fahrzeug aus Anti-Despawn entfernt: " .. plate)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
|
@ -76,195 +102,4 @@ RegisterNetEvent('antidespawn:server:registerVehicle', function(plate, model, co
|
|||
last_updated = os.time()
|
||||
}
|
||||
|
||||
MySQL.query("INSERT INTO vehicle_antidespawn (plate, model, coords, heading, fuel, mods) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE coords = VALUES(coords), heading = VALUES(heading), mods = VALUES(mods), last_updated = CURRENT_TIMESTAMP", {
|
||||
plate,
|
||||
tostring(model), -- Speichere als String in der Datenbank
|
||||
json.encode(coords),
|
||||
heading,
|
||||
100,
|
||||
json.encode(mods)
|
||||
})
|
||||
|
||||
Debug("Fahrzeug registriert: " .. plate .. " (Modell: " .. tostring(model) .. ")")
|
||||
end)
|
||||
end)
|
||||
|
||||
|
||||
-- Aktualisiere ein Fahrzeug
|
||||
RegisterNetEvent('antidespawn:server:updateVehicle', function(plate, coords, heading, mods)
|
||||
if not vehicles[plate] then return end
|
||||
|
||||
-- Prüfe ob Fahrzeug in der Garage ist
|
||||
MySQL.query('SELECT * FROM player_vehicles WHERE plate = ? AND state = ?', {plate, 1}, function(result)
|
||||
if result and #result > 0 then
|
||||
Debug("Fahrzeug ist in der Garage, entferne aus Tracking: " .. plate)
|
||||
vehicles[plate] = nil
|
||||
|
||||
MySQL.query("DELETE FROM vehicle_antidespawn WHERE plate = ?", {
|
||||
plate
|
||||
})
|
||||
return
|
||||
end
|
||||
|
||||
vehicles[plate].coords = coords
|
||||
vehicles[plate].heading = heading
|
||||
vehicles[plate].mods = mods
|
||||
vehicles[plate].last_updated = os.time()
|
||||
|
||||
MySQL.query("UPDATE vehicle_antidespawn SET coords = ?, heading = ?, mods = ?, last_updated = CURRENT_TIMESTAMP WHERE plate = ?", {
|
||||
json.encode(coords),
|
||||
heading,
|
||||
json.encode(mods),
|
||||
plate
|
||||
})
|
||||
|
||||
Debug("Fahrzeug aktualisiert: " .. plate)
|
||||
end)
|
||||
end)
|
||||
|
||||
-- Respawn ein Fahrzeug
|
||||
RegisterNetEvent('antidespawn:server:respawnVehicle', function(plate)
|
||||
local src = source
|
||||
|
||||
if not vehicles[plate] then
|
||||
Debug("Fahrzeug nicht in Datenbank: " .. plate)
|
||||
return
|
||||
end
|
||||
|
||||
-- Prüfe ob Fahrzeug in der Garage ist
|
||||
MySQL.query('SELECT * FROM player_vehicles WHERE plate = ? AND state = ?', {plate, 1}, function(result)
|
||||
if result and #result > 0 then
|
||||
Debug("Fahrzeug ist in der Garage, nicht respawnen: " .. plate)
|
||||
|
||||
-- Entferne aus Anti-Despawn Datenbank
|
||||
vehicles[plate] = nil
|
||||
|
||||
MySQL.query("DELETE FROM vehicle_antidespawn WHERE plate = ?", {
|
||||
plate
|
||||
})
|
||||
return
|
||||
end
|
||||
|
||||
-- Sende Spawn-Event zurück an den Client
|
||||
TriggerClientEvent('antidespawn:client:spawnVehicle', src, {
|
||||
plate = plate,
|
||||
model = vehicles[plate].model,
|
||||
coords = vehicles[plate].coords,
|
||||
heading = vehicles[plate].heading,
|
||||
fuel = vehicles[plate].fuel,
|
||||
mods = vehicles[plate].mods
|
||||
})
|
||||
|
||||
Debug("Fahrzeug Respawn angefordert: " .. plate)
|
||||
end)
|
||||
end)
|
||||
|
||||
-- Lade Fahrzeuge für einen Spieler
|
||||
RegisterNetEvent('antidespawn:server:loadVehicles', function()
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
local playerCoords = GetEntityCoords(GetPlayerPed(src))
|
||||
|
||||
-- Prüfe für jedes Fahrzeug, ob es in der Garage ist
|
||||
for plate, vehicle in pairs(vehicles) do
|
||||
MySQL.query('SELECT * FROM player_vehicles WHERE plate = ? AND state = ?', {plate, 1}, function(result)
|
||||
if result and #result > 0 then
|
||||
Debug("Fahrzeug ist in der Garage, nicht laden: " .. plate)
|
||||
|
||||
-- Entferne aus Anti-Despawn Datenbank
|
||||
vehicles[plate] = nil
|
||||
|
||||
MySQL.query("DELETE FROM vehicle_antidespawn WHERE plate = ?", {
|
||||
plate
|
||||
})
|
||||
return
|
||||
end
|
||||
|
||||
-- Lade nur Fahrzeuge in der Nähe des Spielers
|
||||
local distance = #(playerCoords - vector3(vehicle.coords.x, vehicle.coords.y, vehicle.coords.z))
|
||||
|
||||
if distance < 100.0 then
|
||||
TriggerClientEvent('antidespawn:client:spawnVehicle', src, {
|
||||
plate = plate,
|
||||
model = vehicle.model,
|
||||
coords = vehicle.coords,
|
||||
heading = vehicle.heading,
|
||||
fuel = vehicle.fuel,
|
||||
mods = vehicle.mods
|
||||
})
|
||||
|
||||
Debug("Fahrzeug für Spieler geladen: " .. plate)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
-- Cleanup alte Einträge (älter als 24 Stunden)
|
||||
CreateThread(function()
|
||||
while true do
|
||||
Wait(3600000) -- 1 Stunde
|
||||
MySQL.query("DELETE FROM vehicle_antidespawn WHERE last_updated < DATE_SUB(NOW(), INTERVAL 24 HOUR)")
|
||||
Debug("Alte Fahrzeugeinträge bereinigt")
|
||||
end
|
||||
end)
|
||||
|
||||
-- Registriere jg-advancedgarages Events
|
||||
RegisterNetEvent('jg-advancedgarages:server:vehicle-stored', function(data)
|
||||
if data and data.plate then
|
||||
Debug("Fahrzeug in Garage gespeichert: " .. data.plate)
|
||||
|
||||
-- Entferne aus Anti-Despawn Datenbank
|
||||
if vehicles[data.plate] then
|
||||
vehicles[data.plate] = nil
|
||||
|
||||
MySQL.query("DELETE FROM vehicle_antidespawn WHERE plate = ?", {
|
||||
data.plate
|
||||
})
|
||||
|
||||
Debug("Fahrzeug aus Anti-Despawn entfernt: " .. data.plate)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('jg-advancedgarages:server:vehicle-spawned', function(data)
|
||||
if data and data.plate then
|
||||
Debug("Fahrzeug aus Garage gespawnt: " .. data.plate)
|
||||
|
||||
-- Entferne aus Anti-Despawn Datenbank, da es jetzt von der Garage verwaltet wird
|
||||
if vehicles[data.plate] then
|
||||
vehicles[data.plate] = nil
|
||||
|
||||
MySQL.query("DELETE FROM vehicle_antidespawn WHERE plate = ?", {
|
||||
data.plate
|
||||
})
|
||||
|
||||
Debug("Fahrzeug aus Anti-Despawn entfernt: " .. data.plate)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- Befehl zum Bereinigen der Datenbank
|
||||
RegisterCommand('clearvehicles', function(source, args, rawCommand)
|
||||
if source == 0 then -- Nur über Konsole ausführbar
|
||||
local count = 0
|
||||
|
||||
for plate, vehicle in pairs(vehicles) do
|
||||
local model = vehicle.model
|
||||
|
||||
-- Prüfe ob das Modell gültig ist
|
||||
if type(model) == "string" and not tonumber(model) then
|
||||
-- Ungültiges Modell, entferne aus Datenbank
|
||||
MySQL.query("DELETE FROM vehicle_antidespawn WHERE plate = ?", {plate})
|
||||
vehicles[plate] = nil
|
||||
count = count + 1
|
||||
Debug("Ungültiges Modell entfernt: " .. plate .. " (Modell: " .. tostring(model) .. ")")
|
||||
end
|
||||
end
|
||||
|
||||
Debug("Bereinigung abgeschlossen. " .. count .. " Fahrzeuge entfernt.")
|
||||
end
|
||||
end, true)
|
||||
MySQL.query("INSERT INTO vehicle_antidespawn (plate, model, coords, heading, fuel
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue