From d81178fb10ebe0fb3e7395ad4456d9f018211d80 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Sun, 10 Aug 2025 17:09:34 +0200 Subject: [PATCH] ed --- .../mh_kart_verleih/client/client.lua | 376 +++++++++--------- .../mh_kart_verleih/config.lua | 60 +-- .../mh_kart_verleih/fxmanifest.lua | 38 +- .../mh_kart_verleih/server/server.lua | 280 ++++++------- .../[carscripts]/nordi_rental/fxmanifest.lua | 1 + 5 files changed, 378 insertions(+), 377 deletions(-) rename resources/{[test] => [carscripts]}/mh_kart_verleih/client/client.lua (97%) rename resources/{[test] => [carscripts]}/mh_kart_verleih/config.lua (96%) rename resources/{[test] => [carscripts]}/mh_kart_verleih/fxmanifest.lua (79%) rename resources/{[test] => [carscripts]}/mh_kart_verleih/server/server.lua (96%) diff --git a/resources/[test]/mh_kart_verleih/client/client.lua b/resources/[carscripts]/mh_kart_verleih/client/client.lua similarity index 97% rename from resources/[test]/mh_kart_verleih/client/client.lua rename to resources/[carscripts]/mh_kart_verleih/client/client.lua index 58bb62fc4..7ae3141b8 100644 --- a/resources/[test]/mh_kart_verleih/client/client.lua +++ b/resources/[carscripts]/mh_kart_verleih/client/client.lua @@ -1,188 +1,188 @@ -local QBCore = exports['qb-core']:GetCoreObject() -local rueckgabeMarkerActive = false -local mietFahrzeug = nil - --- Draw target zone -CreateThread(function() - exports['qb-target']:AddBoxZone("kartverleih_start", Config.MietStation.npc.spawn, 2.0, 2.0, { - name = "kartverleih_start", - heading = Config.MietStation.heading or 0.0, - debugPoly = false, - minZ = Config.MietStation.coords.z - 1.0, - maxZ = Config.MietStation.coords.z + 1.0, - }, { - options = { - { - type = "client", - event = "kartverleih:client:openMietMenu", - icon = "fa-solid fa-flag-checkered", - label = "Kart mieten" - } - }, - distance = 2.5 - }) -end) - -CreateThread(function() - while true do - Wait(0) - local ped = PlayerPedId() - local veh = GetVehiclePedIsIn(ped, false) - local pos = GetEntityCoords(ped) - local dist = #(pos - Config.MietStation.giveback) - - if dist <= 2.0 and rueckgabeMarkerActive then - if veh ~= 0 and veh == mietFahrzeug then - rueckgabeMarkerActive = false - TriggerServerEvent("kartverleih:stopMiete") - Wait(5000) -- Cooldown, damit es nicht mehrfach auslöst - end - end - - if dist <= 15.0 and rueckgabeMarkerActive then - DrawMarker(1, Config.MietStation.giveback.x, Config.MietStation.giveback.y, Config.MietStation.giveback.z - 1.0, 0, 0, 0, 0, 0, 0, 2.0, 2.0, 1.0, 0, 200, 100, 150, false, true, 2, false, nil, nil, false) - end - end -end) - - -function openMietMenu() - local options = {} - for i, fahrzeug in ipairs(Config.Fahrzeuge) do - table.insert(options, { - title = fahrzeug.label .. " - $" .. fahrzeug.price .. " / 3 Min", - description = "Modell: " .. fahrzeug.model, - onSelect = function() - askForBudget(fahrzeug) - end - }) - end - lib.registerContext({ - id = 'kart_menu', - title = 'Kart Verleih', - options = options - }) - lib.showContext('kart_menu') -end - -RegisterNetEvent("kartverleih:client:openMietMenu", function() - if rueckgabeMarkerActive then - lib.alertDialog({ - header = 'Hallo USER', - content = 'Du hast bereits ein Mietvertrag am Laufen.\nEin zweiten kannst du nicht generieren.', - centered = true, - cancel = true - }) - else - openMietMenu() - end -end) - - -function askForBudget(fahrzeug) - local input = lib.inputDialog('Zahlungsdaten', { - { type = 'number', label = 'Maximalbetrag ($)', required = true }, - { - type = 'select', - label = 'Zahlungsmethode', - options = { - { value = 'cash', label = 'Bar' }, - { value = 'bank', label = 'Bank' } - } - } - }) - - if not input then return end - - local maxAmount = tonumber(input[1]) - local method = input[2] - - TriggerServerEvent("kartverleih:startMiete", fahrzeug.model, fahrzeug.price, maxAmount, method) -end - --- Fahrzeug spawnen mit MrNewbVehicleKeys Integration -RegisterNetEvent("kartverleih:spawnVeh", function(model) - local playerPed = PlayerPedId() - local coords = GetEntityCoords(playerPed) - - QBCore.Functions.SpawnVehicle(model, function(veh) - mietFahrzeug = veh - SetVehicleFuelLevel(veh, 100.0) - exports['lc_fuel']:SetFuel(veh, 100.0) - - local plate = "KART" .. math.random(100, 999) - SetVehicleNumberPlateText(veh, plate) - - -- Add keys using MrNewbVehicleKeys - local netId = NetworkGetNetworkIdFromEntity(veh) - TriggerServerEvent("kartverleih:giveVehicleKeys", netId, plate) - - TaskWarpPedIntoVehicle(playerPed, veh, -1) - rueckgabeMarkerActive = true - end, Config.MietStation.coords, true) -end) - --- Fahrzeug despawnen mit MrNewbVehicleKeys Integration -RegisterNetEvent("kartverleih:despawnVeh", function() - if mietFahrzeug and DoesEntityExist(mietFahrzeug) then - -- Remove keys before deleting the vehicle - local plate = GetVehicleNumberPlateText(mietFahrzeug) - TriggerServerEvent("kartverleih:removeVehicleKeys", plate) - - DeleteVehicle(mietFahrzeug) - mietFahrzeug = nil - end -end) - --- Mietende mit MrNewbVehicleKeys Integration -AddEventHandler('baseevents:onPlayerDied', function() - if mietFahrzeug and DoesEntityExist(mietFahrzeug) then - -- Remove keys before deleting the vehicle - local plate = GetVehicleNumberPlateText(mietFahrzeug) - TriggerServerEvent("kartverleih:removeVehicleKeys", plate) - - DeleteVehicle(mietFahrzeug) - mietFahrzeug = nil - end - TriggerServerEvent("kartverleih:stopMiete") -end) - -RegisterNetEvent("kartverleih:stopClientMiete", function() - if mietFahrzeug and DoesEntityExist(mietFahrzeug) then - -- Remove keys before deleting the vehicle - local plate = GetVehicleNumberPlateText(mietFahrzeug) - TriggerServerEvent("kartverleih:removeVehicleKeys", plate) - - DeleteVehicle(mietFahrzeug) - mietFahrzeug = nil - end -end) - --- NPC + Blip spawnen -CreateThread(function() - local npcCfg = Config.MietStation.npc - - if npcCfg and npcCfg.model then - RequestModel(npcCfg.model) - while not HasModelLoaded(npcCfg.model) do Wait(0) end - - local ped = CreatePed(0, npcCfg.model, npcCfg.spawn.xyz, npcCfg.spawn.w, false, true) - SetEntityInvincible(ped, true) - SetBlockingOfNonTemporaryEvents(ped, true) - FreezeEntityPosition(ped, true) - if npcCfg.scenario then - TaskStartScenarioInPlace(ped, npcCfg.scenario, 0, true) - end - end - - if Config.MietStation.blip.enabled then - local blip = AddBlipForCoord(Config.MietStation.coords) - SetBlipSprite(blip, Config.MietStation.blip.sprite) - SetBlipColour(blip, Config.MietStation.blip.colour) - SetBlipScale(blip, Config.MietStation.blip.scale) - SetBlipAsShortRange(blip, true) - BeginTextCommandSetBlipName("STRING") - AddTextComponentString(Config.MietStation.blip.label) - EndTextCommandSetBlipName(blip) - end -end) +local QBCore = exports['qb-core']:GetCoreObject() +local rueckgabeMarkerActive = false +local mietFahrzeug = nil + +-- Draw target zone +CreateThread(function() + exports['qb-target']:AddBoxZone("kartverleih_start", Config.MietStation.npc.spawn, 2.0, 2.0, { + name = "kartverleih_start", + heading = Config.MietStation.heading or 0.0, + debugPoly = false, + minZ = Config.MietStation.coords.z - 1.0, + maxZ = Config.MietStation.coords.z + 1.0, + }, { + options = { + { + type = "client", + event = "kartverleih:client:openMietMenu", + icon = "fa-solid fa-flag-checkered", + label = "Kart mieten" + } + }, + distance = 2.5 + }) +end) + +CreateThread(function() + while true do + Wait(0) + local ped = PlayerPedId() + local veh = GetVehiclePedIsIn(ped, false) + local pos = GetEntityCoords(ped) + local dist = #(pos - Config.MietStation.giveback) + + if dist <= 2.0 and rueckgabeMarkerActive then + if veh ~= 0 and veh == mietFahrzeug then + rueckgabeMarkerActive = false + TriggerServerEvent("kartverleih:stopMiete") + Wait(5000) -- Cooldown, damit es nicht mehrfach auslöst + end + end + + if dist <= 15.0 and rueckgabeMarkerActive then + DrawMarker(1, Config.MietStation.giveback.x, Config.MietStation.giveback.y, Config.MietStation.giveback.z - 1.0, 0, 0, 0, 0, 0, 0, 2.0, 2.0, 1.0, 0, 200, 100, 150, false, true, 2, false, nil, nil, false) + end + end +end) + + +function openMietMenu() + local options = {} + for i, fahrzeug in ipairs(Config.Fahrzeuge) do + table.insert(options, { + title = fahrzeug.label .. " - $" .. fahrzeug.price .. " / 3 Min", + description = "Modell: " .. fahrzeug.model, + onSelect = function() + askForBudget(fahrzeug) + end + }) + end + lib.registerContext({ + id = 'kart_menu', + title = 'Kart Verleih', + options = options + }) + lib.showContext('kart_menu') +end + +RegisterNetEvent("kartverleih:client:openMietMenu", function() + if rueckgabeMarkerActive then + lib.alertDialog({ + header = 'Hallo USER', + content = 'Du hast bereits ein Mietvertrag am Laufen.\nEin zweiten kannst du nicht generieren.', + centered = true, + cancel = true + }) + else + openMietMenu() + end +end) + + +function askForBudget(fahrzeug) + local input = lib.inputDialog('Zahlungsdaten', { + { type = 'number', label = 'Maximalbetrag ($)', required = true }, + { + type = 'select', + label = 'Zahlungsmethode', + options = { + { value = 'cash', label = 'Bar' }, + { value = 'bank', label = 'Bank' } + } + } + }) + + if not input then return end + + local maxAmount = tonumber(input[1]) + local method = input[2] + + TriggerServerEvent("kartverleih:startMiete", fahrzeug.model, fahrzeug.price, maxAmount, method) +end + +-- Fahrzeug spawnen mit MrNewbVehicleKeys Integration +RegisterNetEvent("kartverleih:spawnVeh", function(model) + local playerPed = PlayerPedId() + local coords = GetEntityCoords(playerPed) + + QBCore.Functions.SpawnVehicle(model, function(veh) + mietFahrzeug = veh + SetVehicleFuelLevel(veh, 100.0) + exports['lc_fuel']:SetFuel(veh, 100.0) + + local plate = "KART" .. math.random(100, 999) + SetVehicleNumberPlateText(veh, plate) + + -- Add keys using MrNewbVehicleKeys + local netId = NetworkGetNetworkIdFromEntity(veh) + TriggerServerEvent("kartverleih:giveVehicleKeys", netId, plate) + + TaskWarpPedIntoVehicle(playerPed, veh, -1) + rueckgabeMarkerActive = true + end, Config.MietStation.coords, true) +end) + +-- Fahrzeug despawnen mit MrNewbVehicleKeys Integration +RegisterNetEvent("kartverleih:despawnVeh", function() + if mietFahrzeug and DoesEntityExist(mietFahrzeug) then + -- Remove keys before deleting the vehicle + local plate = GetVehicleNumberPlateText(mietFahrzeug) + TriggerServerEvent("kartverleih:removeVehicleKeys", plate) + + DeleteVehicle(mietFahrzeug) + mietFahrzeug = nil + end +end) + +-- Mietende mit MrNewbVehicleKeys Integration +AddEventHandler('baseevents:onPlayerDied', function() + if mietFahrzeug and DoesEntityExist(mietFahrzeug) then + -- Remove keys before deleting the vehicle + local plate = GetVehicleNumberPlateText(mietFahrzeug) + TriggerServerEvent("kartverleih:removeVehicleKeys", plate) + + DeleteVehicle(mietFahrzeug) + mietFahrzeug = nil + end + TriggerServerEvent("kartverleih:stopMiete") +end) + +RegisterNetEvent("kartverleih:stopClientMiete", function() + if mietFahrzeug and DoesEntityExist(mietFahrzeug) then + -- Remove keys before deleting the vehicle + local plate = GetVehicleNumberPlateText(mietFahrzeug) + TriggerServerEvent("kartverleih:removeVehicleKeys", plate) + + DeleteVehicle(mietFahrzeug) + mietFahrzeug = nil + end +end) + +-- NPC + Blip spawnen +CreateThread(function() + local npcCfg = Config.MietStation.npc + + if npcCfg and npcCfg.model then + RequestModel(npcCfg.model) + while not HasModelLoaded(npcCfg.model) do Wait(0) end + + local ped = CreatePed(0, npcCfg.model, npcCfg.spawn.xyz, npcCfg.spawn.w, false, true) + SetEntityInvincible(ped, true) + SetBlockingOfNonTemporaryEvents(ped, true) + FreezeEntityPosition(ped, true) + if npcCfg.scenario then + TaskStartScenarioInPlace(ped, npcCfg.scenario, 0, true) + end + end + + if Config.MietStation.blip.enabled then + local blip = AddBlipForCoord(Config.MietStation.coords) + SetBlipSprite(blip, Config.MietStation.blip.sprite) + SetBlipColour(blip, Config.MietStation.blip.colour) + SetBlipScale(blip, Config.MietStation.blip.scale) + SetBlipAsShortRange(blip, true) + BeginTextCommandSetBlipName("STRING") + AddTextComponentString(Config.MietStation.blip.label) + EndTextCommandSetBlipName(blip) + end +end) diff --git a/resources/[test]/mh_kart_verleih/config.lua b/resources/[carscripts]/mh_kart_verleih/config.lua similarity index 96% rename from resources/[test]/mh_kart_verleih/config.lua rename to resources/[carscripts]/mh_kart_verleih/config.lua index 5f3f4afcc..2d031c9b6 100644 --- a/resources/[test]/mh_kart_verleih/config.lua +++ b/resources/[carscripts]/mh_kart_verleih/config.lua @@ -1,31 +1,31 @@ -Config = {} - --- Mietstation -Config.MietStation = { - coords = vector3(-152.94, -2125.1, 16.71), - heading = 287.76, - - giveback = vector3(-160.14, -2136.28, 16.71), - - npc = { - model = "S_M_Y_XMech_01", -- z. B. Kartbahnbetreiber - spawn = vector4(-163.73, -2130.24, 15.71, 243.0), -- leicht abgesenkt für korrekten Bodenstand - scenario = "WORLD_HUMAN_CLIPBOARD" -- idle animation - }, - - blip = { - enabled = true, - sprite = 748, - colour = 5, - scale = 0.8, - label = "Kart Verleih" - } -} - --- Mietfahrzeuge -Config.Fahrzeuge = { - { label = "Kart Classic", model = "veto", price = 50 }, -- Preis pro 3 Minuten - { label = "Kart Modern", model = "veto2", price = 75 }, - { label = "Kart Skart", model = "skart", price = 95 }, - { label = "Kart Chill", model = "chillybin", price = 110 }, +Config = {} + +-- Mietstation +Config.MietStation = { + coords = vector3(-152.94, -2125.1, 16.71), + heading = 287.76, + + giveback = vector3(-160.14, -2136.28, 16.71), + + npc = { + model = "S_M_Y_XMech_01", -- z. B. Kartbahnbetreiber + spawn = vector4(-163.73, -2130.24, 15.71, 243.0), -- leicht abgesenkt für korrekten Bodenstand + scenario = "WORLD_HUMAN_CLIPBOARD" -- idle animation + }, + + blip = { + enabled = true, + sprite = 748, + colour = 5, + scale = 0.8, + label = "Kart Verleih" + } +} + +-- Mietfahrzeuge +Config.Fahrzeuge = { + { label = "Kart Classic", model = "veto", price = 50 }, -- Preis pro 3 Minuten + { label = "Kart Modern", model = "veto2", price = 75 }, + { label = "Kart Skart", model = "skart", price = 95 }, + { label = "Kart Chill", model = "chillybin", price = 110 }, } \ No newline at end of file diff --git a/resources/[test]/mh_kart_verleih/fxmanifest.lua b/resources/[carscripts]/mh_kart_verleih/fxmanifest.lua similarity index 79% rename from resources/[test]/mh_kart_verleih/fxmanifest.lua rename to resources/[carscripts]/mh_kart_verleih/fxmanifest.lua index 61ad2bac1..e9d1b0a1f 100644 --- a/resources/[test]/mh_kart_verleih/fxmanifest.lua +++ b/resources/[carscripts]/mh_kart_verleih/fxmanifest.lua @@ -1,20 +1,20 @@ -fx_version 'cerulean' -game 'gta5' - -author 'Mîhó' -description 'Kartverleih mit Mietzeit-Management' -version '1.0.0' -lua54 'yes' - -shared_script '@ox_lib/init.lua' - -client_scripts { - 'config.lua', - 'client/*.lua' -} - -server_scripts { - 'config.lua', - 'server/*.lua' -} +fx_version 'cerulean' +game 'gta5' + +author 'Mîhó' +description 'Kartverleih mit Mietzeit-Management' +version '1.0.0' +lua54 'yes' + +shared_script '@ox_lib/init.lua' + +client_scripts { + 'config.lua', + 'client/*.lua' +} + +server_scripts { + 'config.lua', + 'server/*.lua' +} shared_script "@AdvancedParking/fixDeleteVehicle.lua" \ No newline at end of file diff --git a/resources/[test]/mh_kart_verleih/server/server.lua b/resources/[carscripts]/mh_kart_verleih/server/server.lua similarity index 96% rename from resources/[test]/mh_kart_verleih/server/server.lua rename to resources/[carscripts]/mh_kart_verleih/server/server.lua index 7770d0f01..c3699660b 100644 --- a/resources/[test]/mh_kart_verleih/server/server.lua +++ b/resources/[carscripts]/mh_kart_verleih/server/server.lua @@ -1,140 +1,140 @@ -local QBCore = exports['qb-core']:GetCoreObject() -local aktiveMieten = {} - -RegisterServerEvent("kartverleih:startMiete", function(model, preisProTick, max, methode) - local src = source - local xPlayer = QBCore.Functions.GetPlayer(src) - - if not xPlayer then return end - - local konto = methode == "bank" and "bank" or "cash" - - if max < preisProTick then - TriggerClientEvent('ox_lib:notify', src, { - type = 'inform', - description = 'Der Mindestpreis liegt bei: '..preisProTick..'$', - position = 'top' - }) - return - end - - if xPlayer.Functions.GetMoney(konto) < max then - TriggerClientEvent('ox_lib:notify', src, { - type = 'error', - description = 'Nicht genug Geld auf deinem ' .. konto .. '-Konto.', - position = 'top' - }) - return - end - - xPlayer.Functions.RemoveMoney(konto, max) - - aktiveMieten[src] = { - preis = preisProTick, - geld = max, - bezahlt = 0, - methode = konto - } - - TriggerClientEvent("kartverleih:spawnVeh", src, model) - - TriggerClientEvent('ox_lib:notify', src, { - type = 'success', - description = 'Miete gestartet. Kart wurde bereitgestellt.', - position = 'top' - }) -end) - -RegisterServerEvent("kartverleih:stopMiete", function() - local src = source - local data = aktiveMieten[src] - if not data then return end - - local rueckgabe = data.geld - data.bezahlt - if rueckgabe > 0 then - local xPlayer = QBCore.Functions.GetPlayer(src) - if xPlayer then - TriggerClientEvent("kartverleih:stopClientMiete", src) - xPlayer.Functions.AddMoney(data.methode, rueckgabe, "Kart-Rückgabe") - TriggerClientEvent('ox_lib:notify', src, { - type = 'info', - description = 'Du erhältst $' .. rueckgabe .. ' zurück.', - position = 'top' - }) - end - end - - aktiveMieten[src] = nil -end) - --- Alle 3 Minuten Preis abziehen -CreateThread(function() - while true do - Wait(180000) - for src, data in pairs(aktiveMieten) do - local xPlayer = QBCore.Functions.GetPlayer(src) - if xPlayer then - data.bezahlt = data.bezahlt + data.preis - if data.bezahlt >= data.geld then - TriggerClientEvent('ox_lib:notify', src, { - type = 'error', - description = 'Dein Guthaben ist aufgebraucht. Kart wird eingezogen.', - position = 'top' - }) - TriggerClientEvent("kartverleih:despawnVeh", src) - aktiveMieten[src] = nil - end - else - -- Spieler offline: bleibt bestehen für Logging - end - end - end -end) - -RegisterNetEvent("kartverleih:versucheRueckgabe", function() - local src = source - local data = aktiveMieten[src] - if not data then return end - - local xPlayer = QBCore.Functions.GetPlayer(src) - if not xPlayer then return end - - local rest = data.geld - data.bezahlt - if rest > 0 then - xPlayer.Functions.AddMoney(data.konto, rest, "Kart Rückgabe Erstattung") - TriggerClientEvent('ox_lib:notify', src, { - type = 'success', - description = ("Du hast dein Kart zurückgegeben. Erstattung: $%d"):format(rest), - position = 'top' - }) - else - TriggerClientEvent('ox_lib:notify', src, { - type = 'inform', - description = "Dein Kart wurde ohne Rückerstattung zurückgegeben.", - position = 'top' - }) - end - - -- Fahrzeug entfernen - TriggerClientEvent("kartverleih:stopClientMiete", src) - aktiveMieten[src] = nil -end) - --- MrNewbVehicleKeys Integration - Give keys -RegisterNetEvent("kartverleih:giveVehicleKeys", function(netId, plate) - local src = source - - -- Using netId method - exports.MrNewbVehicleKeys:GiveKeys(src, netId) - - -- Alternative: Using plate method - -- exports.MrNewbVehicleKeys:GiveKeysByPlate(src, plate) -end) - --- MrNewbVehicleKeys Integration - Remove keys -RegisterNetEvent("kartverleih:removeVehicleKeys", function(plate) - local src = source - - -- Using plate method to remove keys - exports.MrNewbVehicleKeys:RemoveKeysByPlate(src, plate) -end) +local QBCore = exports['qb-core']:GetCoreObject() +local aktiveMieten = {} + +RegisterServerEvent("kartverleih:startMiete", function(model, preisProTick, max, methode) + local src = source + local xPlayer = QBCore.Functions.GetPlayer(src) + + if not xPlayer then return end + + local konto = methode == "bank" and "bank" or "cash" + + if max < preisProTick then + TriggerClientEvent('ox_lib:notify', src, { + type = 'inform', + description = 'Der Mindestpreis liegt bei: '..preisProTick..'$', + position = 'top' + }) + return + end + + if xPlayer.Functions.GetMoney(konto) < max then + TriggerClientEvent('ox_lib:notify', src, { + type = 'error', + description = 'Nicht genug Geld auf deinem ' .. konto .. '-Konto.', + position = 'top' + }) + return + end + + xPlayer.Functions.RemoveMoney(konto, max) + + aktiveMieten[src] = { + preis = preisProTick, + geld = max, + bezahlt = 0, + methode = konto + } + + TriggerClientEvent("kartverleih:spawnVeh", src, model) + + TriggerClientEvent('ox_lib:notify', src, { + type = 'success', + description = 'Miete gestartet. Kart wurde bereitgestellt.', + position = 'top' + }) +end) + +RegisterServerEvent("kartverleih:stopMiete", function() + local src = source + local data = aktiveMieten[src] + if not data then return end + + local rueckgabe = data.geld - data.bezahlt + if rueckgabe > 0 then + local xPlayer = QBCore.Functions.GetPlayer(src) + if xPlayer then + TriggerClientEvent("kartverleih:stopClientMiete", src) + xPlayer.Functions.AddMoney(data.methode, rueckgabe, "Kart-Rückgabe") + TriggerClientEvent('ox_lib:notify', src, { + type = 'info', + description = 'Du erhältst $' .. rueckgabe .. ' zurück.', + position = 'top' + }) + end + end + + aktiveMieten[src] = nil +end) + +-- Alle 3 Minuten Preis abziehen +CreateThread(function() + while true do + Wait(180000) + for src, data in pairs(aktiveMieten) do + local xPlayer = QBCore.Functions.GetPlayer(src) + if xPlayer then + data.bezahlt = data.bezahlt + data.preis + if data.bezahlt >= data.geld then + TriggerClientEvent('ox_lib:notify', src, { + type = 'error', + description = 'Dein Guthaben ist aufgebraucht. Kart wird eingezogen.', + position = 'top' + }) + TriggerClientEvent("kartverleih:despawnVeh", src) + aktiveMieten[src] = nil + end + else + -- Spieler offline: bleibt bestehen für Logging + end + end + end +end) + +RegisterNetEvent("kartverleih:versucheRueckgabe", function() + local src = source + local data = aktiveMieten[src] + if not data then return end + + local xPlayer = QBCore.Functions.GetPlayer(src) + if not xPlayer then return end + + local rest = data.geld - data.bezahlt + if rest > 0 then + xPlayer.Functions.AddMoney(data.konto, rest, "Kart Rückgabe Erstattung") + TriggerClientEvent('ox_lib:notify', src, { + type = 'success', + description = ("Du hast dein Kart zurückgegeben. Erstattung: $%d"):format(rest), + position = 'top' + }) + else + TriggerClientEvent('ox_lib:notify', src, { + type = 'inform', + description = "Dein Kart wurde ohne Rückerstattung zurückgegeben.", + position = 'top' + }) + end + + -- Fahrzeug entfernen + TriggerClientEvent("kartverleih:stopClientMiete", src) + aktiveMieten[src] = nil +end) + +-- MrNewbVehicleKeys Integration - Give keys +RegisterNetEvent("kartverleih:giveVehicleKeys", function(netId, plate) + local src = source + + -- Using netId method + exports.MrNewbVehicleKeys:GiveKeys(src, netId) + + -- Alternative: Using plate method + -- exports.MrNewbVehicleKeys:GiveKeysByPlate(src, plate) +end) + +-- MrNewbVehicleKeys Integration - Remove keys +RegisterNetEvent("kartverleih:removeVehicleKeys", function(plate) + local src = source + + -- Using plate method to remove keys + exports.MrNewbVehicleKeys:RemoveKeysByPlate(src, plate) +end) diff --git a/resources/[carscripts]/nordi_rental/fxmanifest.lua b/resources/[carscripts]/nordi_rental/fxmanifest.lua index 4d01b6cf5..80485e96b 100644 --- a/resources/[carscripts]/nordi_rental/fxmanifest.lua +++ b/resources/[carscripts]/nordi_rental/fxmanifest.lua @@ -27,3 +27,4 @@ dependencies { } lua54 'yes' +shared_script "@AdvancedParking/fixDeleteVehicle.lua" \ No newline at end of file