forked from Simnation/Main
ed
This commit is contained in:
parent
6d22d5f77c
commit
63fbc60a00
86 changed files with 8352 additions and 3428 deletions
59
resources/[Developer]/mh_garage/server/log.lua
Normal file
59
resources/[Developer]/mh_garage/server/log.lua
Normal file
|
@ -0,0 +1,59 @@
|
|||
function sendToDiscord(Titel, Text, Color) ------ Sende Nachricht an Channel: Join/Left
|
||||
local embeds = {
|
||||
{
|
||||
["title"]=Text,
|
||||
["type"]="rich",
|
||||
["color"] =Config.Log.Color[Color],
|
||||
["footer"]= {
|
||||
["text"]= Config.Log.SystemName,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
PerformHttpRequest(Config.Log.Webhook, function(err, text, headers)
|
||||
if err and err ~= 204 and err ~= 200 then
|
||||
print("Fehler beim Discord Webhook [" .. tostring(err) .. "]: " .. tostring(text))
|
||||
end
|
||||
end, 'POST', json.encode({ username = Titel.." - Mîhó",avatar_url = Config.SystemAvatar, embeds = embeds, tts = TTS}), { ['Content-Type'] = 'application/json' })
|
||||
end
|
||||
|
||||
AddEventHandler('mh_garage:log')
|
||||
RegisterServerEvent('mh_garage:log', function(type)
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
local PlyData = Player.PlayerData
|
||||
local Color = "purple"
|
||||
|
||||
Playerinfo = {
|
||||
name = PlyData.charinfo.firstname .. " ".. PlyData.charinfo.lastname,
|
||||
citizenid = PlyData.citizenid,
|
||||
}
|
||||
local user = Playerinfo.name.."[".. Playerinfo.citizenid .."]"
|
||||
|
||||
if type == "call" then
|
||||
Text = "Dr. Teddy wurde von " .. user .." gerufen."
|
||||
Color = "grey"
|
||||
elseif type == "cash" then
|
||||
Text = user.." hat Bar Bezahlt."
|
||||
Color = "green"
|
||||
elseif type == "bank" then
|
||||
Text = user .. "hat via Überweisung Bezahlt."
|
||||
Color = "green"
|
||||
elseif type == "noMoney" then
|
||||
Text = user .." Hatte nicht genug Geld."
|
||||
Color = "orange"
|
||||
elseif type == "noPlayer" then
|
||||
Text = user .. " Wurde nicht gefunden und abgebrochen!"
|
||||
Color = "red"
|
||||
elseif type == "storno" then
|
||||
Text = user .. " Hat die Behandlung doch Abgelehnt."
|
||||
Color = "red"
|
||||
elseif type == "heal" then
|
||||
Text = user.. " Wurde Geheilt."
|
||||
Color = "green"
|
||||
elseif type == "end" then
|
||||
Text = "NPC wurde wieder Entfernt..."
|
||||
Color = "blue"
|
||||
end
|
||||
|
||||
sendToDiscord("Garage", Text, Color)
|
||||
end)
|
159
resources/[Developer]/mh_garage/server/server.lua
Normal file
159
resources/[Developer]/mh_garage/server/server.lua
Normal file
|
@ -0,0 +1,159 @@
|
|||
QBCore = exports['qb-core']:GetCoreObject()
|
||||
local test_vari = {}
|
||||
|
||||
RegisterServerEvent('mh_garage:setMods')
|
||||
AddEventHandler('mh_garage:setMods', function(mods)
|
||||
if test_vari[mods.plate] == true then
|
||||
return
|
||||
else
|
||||
MySQL.query("SELECT mods FROM player_vehicles WHERE plate = ?", {mods.plate}, function(rs)
|
||||
-- Prüfen ob rs überhaupt Daten enthält
|
||||
if rs and rs[1] then
|
||||
-- Wenn mods ein String ist, konvertieren wir es zu einem Table
|
||||
local modsData = type(rs[1].mods) == "string" and json.decode(rs[1].mods) or rs[1].mods
|
||||
|
||||
if not modsData or next(modsData) == nil then
|
||||
-- Hier sollten Sie wahrscheinlich auch die mods-Daten übergeben, nicht nur plate
|
||||
MySQL.query("UPDATE player_vehicles SET mods = ? WHERE plate = ?", {json.encode(mods), mods.plate})
|
||||
test_vari[mods.plate] = true
|
||||
else
|
||||
test_vari[mods.plate] = true
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
QBCore.Functions.CreateCallback('mh_garage:storedVehicle', function(source, cb, veh, zone)
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
|
||||
if Player ~= nil then
|
||||
if Player.Functions.GetMoney('bank', zone.price) then
|
||||
MySQL.query("SELECT * FROM player_vehicles WHERE citizenid = ? AND plate = ?", {Player.PlayerData.citizenid, veh.plate}, function(rs)
|
||||
if rs[1] ~= nil then
|
||||
MySQL.query("UPDATE player_vehicles SET garage = ?, mods = ? WHERE plate = ?", {zone.name, json.encode(veh), veh.plate})
|
||||
DelVehParking(veh.plate)
|
||||
cb({
|
||||
status = true,
|
||||
text = "Fahrzeug erfolgreich eingeparkt!",
|
||||
type = "success",
|
||||
other = false,
|
||||
police = false
|
||||
})
|
||||
else
|
||||
MySQL.query("SELECT * FROM vehicle_keys WHERE owner = ? AND plate = ?", {Player.PlayerData.citizenid, veh.plate}, function(rs)
|
||||
if rs[1] ~= nil then
|
||||
MySQL.query("UPDATE player_vehicles SET garage = ?, mods = ? WHERE plate = ?", {zone.name, json.encode(veh), veh.plate})
|
||||
--TriggerEvent('mh_Parking:removeVehicle', source, veh.plate)
|
||||
--DelVehParking(veh.plate)
|
||||
cb({
|
||||
status = true,
|
||||
text = "Fahrzeug erfolgreich eingeparkt!",
|
||||
type = "success",
|
||||
other = true,
|
||||
police = false
|
||||
})
|
||||
else
|
||||
cb({
|
||||
status = false,
|
||||
text = "Du besitzt kein Schlüssel für dieses Fahrzeug.",
|
||||
type = "warning",
|
||||
other = false,
|
||||
police = true
|
||||
})
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
function DelVehParking(plate)
|
||||
MySQL.query("SELECT * FROM vehicle_parking WHERE plate = ?", {plate}, function(rs)
|
||||
if rs[1] ~= nil then
|
||||
MySQL.query("DELETE FROM vehicle_parking WHERE plate = ?", {plate})
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
QBCore.Functions.CreateCallback('mh_garage:retrieveOwnerVehicle', function(source, cb, zone)
|
||||
local _source = source
|
||||
local Player = QBCore.Functions.GetPlayer(_source)
|
||||
local pedid = Player.PlayerData.citizenid
|
||||
local veh = {}
|
||||
|
||||
MySQL.query("SELECT * FROM player_vehicles WHERE citizenid = ? and garage = ?", {pedid, zone}, function(rs)
|
||||
if rs ~= nil and rs[1] ~= nil then
|
||||
for k, v in pairs (rs) do
|
||||
table.insert(veh, {
|
||||
vehicle = v.vehicle,
|
||||
mods = v.mods,
|
||||
plate = v.plate,
|
||||
name = v.name
|
||||
})
|
||||
end
|
||||
Wait(100)
|
||||
cb(veh)
|
||||
else
|
||||
cb(false)
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
QBCore.Functions.CreateCallback('mh_garage:retrieveKeyVehicle', function(source, cb, zone)
|
||||
local _source = source
|
||||
local Player = QBCore.Functions.GetPlayer(_source)
|
||||
local pedid = Player.PlayerData.citizenid
|
||||
local veh = {}
|
||||
|
||||
MySQL.query("SELECT pv.* FROM player_vehicles pv JOIN vehicle_keys vk ON pv.plate = vk.plate WHERE vk.owner = ? AND vk.count > 0 AND pv.garage = ?", {pedid, zone}, function(vehicles)
|
||||
if vehicles and #vehicles > 0 then
|
||||
for _, vehicle in pairs(vehicles) do
|
||||
table.insert(veh, {
|
||||
vehicle = vehicle.vehicle,
|
||||
mods = vehicle.mods,
|
||||
plate = vehicle.plate,
|
||||
name = vehicle.name
|
||||
})
|
||||
end
|
||||
Wait(100)
|
||||
cb(veh)
|
||||
else
|
||||
cb(false)
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
QBCore.Functions.CreateCallback('mh_garage:verwaltung', function(source, cb)
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
local vehicles = {}
|
||||
MySQL.query("SELECT * FROM player_vehicles WHERE citizenid = ?", {Player.PlayerData.citizenid}, function(rs)
|
||||
if rs and rs[1] then
|
||||
for k, v in pairs(rs) do
|
||||
table.insert(vehicles, {
|
||||
current_garage = v.garage,
|
||||
current_in_garage = v.parking,
|
||||
current_name = v.name,
|
||||
current_plate = v.plate,
|
||||
})
|
||||
end
|
||||
end
|
||||
end)
|
||||
return vehicles
|
||||
end)
|
||||
|
||||
RegisterServerEvent('mh_garage:spawnedVehicle')
|
||||
AddEventHandler('mh_garage:spawnedVehicle', function(netID, plate)
|
||||
MySQL.query("UPDATE player_vehicles SET garage = ? WHERE plate = ?", {"OUT", plate})
|
||||
end)
|
||||
|
||||
QBCore.Functions.CreateCallback('mh_garage:CheckownerVehicles', function(source, cb, plate)
|
||||
MySQL.query("SELECT * FROM player_vehicles WHERE plate = ?", {plate}, function(rs)
|
||||
if rs ~= nil and rs[1] ~= nil then
|
||||
cb(true)
|
||||
else
|
||||
cb(false)
|
||||
end
|
||||
end)
|
||||
end)
|
181
resources/[Developer]/mh_garage/server/vehicleadmin.lua
Normal file
181
resources/[Developer]/mh_garage/server/vehicleadmin.lua
Normal file
|
@ -0,0 +1,181 @@
|
|||
-- vehicleadmin.lua - Füge diese Datei in deinen server-Ordner ein
|
||||
|
||||
-- Erweitere die Log-Funktion für das Fahrzeugadmin-System
|
||||
RegisterServerEvent('vehicleadmin:log')
|
||||
AddEventHandler('vehicleadmin:log', function(action, plate, garage)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
local playerName = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname
|
||||
local citizenid = Player.PlayerData.citizenid
|
||||
local jobName = Player.PlayerData.job.name
|
||||
local jobLabel = Player.PlayerData.job.label
|
||||
|
||||
local logText = ""
|
||||
local logColor = "blue"
|
||||
|
||||
if action == "move" then
|
||||
logText = playerName .. " (" .. jobLabel .. ") hat Fahrzeug " .. plate .. " in Garage " .. garage .. " gestellt."
|
||||
elseif action == "delete" then
|
||||
logText = playerName .. " (" .. jobLabel .. ") hat Fahrzeug " .. plate .. " von der Map gelöscht."
|
||||
logColor = "orange"
|
||||
elseif action == "repair" then
|
||||
logText = playerName .. " (" .. jobLabel .. ") hat Fahrzeug " .. plate .. " repariert."
|
||||
logColor = "green"
|
||||
end
|
||||
|
||||
-- Verwende die bestehende Log-Funktion
|
||||
sendToDiscord("Fahrzeugadmin", logText, logColor)
|
||||
|
||||
-- Speichere den Log in der Datenbank (optional)
|
||||
MySQL.Async.execute('INSERT INTO admin_logs (action, player_name, citizenid, job, target_plate, target_garage, timestamp) VALUES (?, ?, ?, ?, ?, ?, NOW())',
|
||||
{action, playerName, citizenid, jobName, plate, garage or "none"})
|
||||
end)
|
||||
|
||||
-- Füge zusätzliche Callback-Funktionen für erweiterte Features hinzu
|
||||
QBCore.Functions.CreateCallback('vehicleadmin:getVehicleHistory', function(source, cb, plate)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then
|
||||
cb(false)
|
||||
return
|
||||
end
|
||||
|
||||
-- Prüfe, ob der Spieler die Berechtigung hat
|
||||
local hasPermission = false
|
||||
local playerJob = Player.PlayerData.job.name
|
||||
|
||||
if QBCore.Functions.HasPermission(src, 'admin') then
|
||||
hasPermission = true
|
||||
elseif playerJob == 'police' or playerJob == 'mechanic' then
|
||||
hasPermission = true
|
||||
end
|
||||
|
||||
if not hasPermission then
|
||||
cb(false)
|
||||
return
|
||||
end
|
||||
|
||||
-- Hole den Fahrzeugverlauf aus der Datenbank
|
||||
MySQL.Async.fetchAll('SELECT * FROM admin_logs WHERE target_plate = ? ORDER BY timestamp DESC LIMIT 20', {plate}, function(results)
|
||||
if results and #results > 0 then
|
||||
cb(results)
|
||||
else
|
||||
cb({})
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
-- Füge einen Event-Handler für das Löschen von Fahrzeugen hinzu
|
||||
RegisterServerEvent('vehicleadmin:deleteVehicle')
|
||||
AddEventHandler('vehicleadmin:deleteVehicle', function(plate)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
-- Prüfe, ob der Spieler die Berechtigung hat
|
||||
local hasPermission = false
|
||||
local playerJob = Player.PlayerData.job.name
|
||||
|
||||
if QBCore.Functions.HasPermission(src, 'admin') then
|
||||
hasPermission = true
|
||||
elseif playerJob == 'police' or playerJob == 'mechanic' then
|
||||
hasPermission = true
|
||||
end
|
||||
|
||||
if not hasPermission then
|
||||
TriggerClientEvent('ox_lib:notify', src, {
|
||||
title = 'Keine Berechtigung',
|
||||
description = 'Du hast keine Berechtigung für diese Aktion',
|
||||
type = 'error'
|
||||
})
|
||||
return
|
||||
end
|
||||
|
||||
-- Lösche das Fahrzeug aus der Datenbank
|
||||
MySQL.Async.execute('DELETE FROM player_vehicles WHERE plate = ?', {plate}, function(rowsChanged)
|
||||
if rowsChanged > 0 then
|
||||
-- Lösche auch alle zugehörigen Schlüssel
|
||||
MySQL.Async.execute('DELETE FROM vehicle_keys WHERE plate = ?', {plate})
|
||||
|
||||
-- Lösche das Fahrzeug aus dem Parking-System
|
||||
MySQL.Async.execute('DELETE FROM vehicle_parking WHERE plate = ?', {plate})
|
||||
|
||||
-- Log die Aktion
|
||||
TriggerEvent('vehicleadmin:log', "delete_permanent", plate, nil)
|
||||
|
||||
TriggerClientEvent('ox_lib:notify', src, {
|
||||
title = 'Fahrzeugverwaltung',
|
||||
description = 'Fahrzeug wurde permanent gelöscht',
|
||||
type = 'success'
|
||||
})
|
||||
else
|
||||
TriggerClientEvent('ox_lib:notify', src, {
|
||||
title = 'Fahrzeugverwaltung',
|
||||
description = 'Fahrzeug nicht gefunden',
|
||||
type = 'error'
|
||||
})
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
-- Füge einen Event-Handler für das Ändern des Fahrzeugbesitzers hinzu
|
||||
RegisterServerEvent('vehicleadmin:changeOwner')
|
||||
AddEventHandler('vehicleadmin:changeOwner', function(plate, newOwnerCID)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
-- Prüfe, ob der Spieler die Berechtigung hat
|
||||
if not QBCore.Functions.HasPermission(src, 'admin') then
|
||||
TriggerClientEvent('ox_lib:notify', src, {
|
||||
title = 'Keine Berechtigung',
|
||||
description = 'Nur Admins können den Besitzer ändern',
|
||||
type = 'error'
|
||||
})
|
||||
return
|
||||
end
|
||||
|
||||
-- Prüfe, ob der neue Besitzer existiert
|
||||
MySQL.Async.fetchAll('SELECT * FROM players WHERE citizenid = ?', {newOwnerCID}, function(players)
|
||||
if not players or #players == 0 then
|
||||
TriggerClientEvent('ox_lib:notify', src, {
|
||||
title = 'Fehler',
|
||||
description = 'Spieler mit dieser Citizen ID nicht gefunden',
|
||||
type = 'error'
|
||||
})
|
||||
return
|
||||
end
|
||||
|
||||
-- Ändere den Besitzer des Fahrzeugs
|
||||
MySQL.Async.execute('UPDATE player_vehicles SET citizenid = ? WHERE plate = ?', {newOwnerCID, plate}, function(rowsChanged)
|
||||
if rowsChanged > 0 then
|
||||
-- Erstelle einen neuen Schlüssel für den neuen Besitzer
|
||||
MySQL.Async.execute('INSERT INTO vehicle_keys (plate, owner, count) VALUES (?, ?, 1) ON DUPLICATE KEY UPDATE count = 1', {plate, newOwnerCID})
|
||||
|
||||
-- Log die Aktion
|
||||
local newOwnerInfo = json.decode(players[1].charinfo)
|
||||
local newOwnerName = newOwnerInfo.firstname .. " " .. newOwnerInfo.lastname
|
||||
|
||||
TriggerEvent('vehicleadmin:log', "change_owner", plate, newOwnerName)
|
||||
|
||||
TriggerClientEvent('ox_lib:notify', src, {
|
||||
title = 'Fahrzeugverwaltung',
|
||||
description = 'Fahrzeugbesitzer wurde geändert',
|
||||
type = 'success'
|
||||
})
|
||||
else
|
||||
TriggerClientEvent('ox_lib:notify', src, {
|
||||
title = 'Fahrzeugverwaltung',
|
||||
description = 'Fahrzeug nicht gefunden',
|
||||
type = 'error'
|
||||
})
|
||||
end
|
||||
end)
|
||||
end)
|
||||
end)
|
Loading…
Add table
Add a link
Reference in a new issue