170 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
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
 | 
						|
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)
 | 
						|
        SetVehicleNumberPlateText(veh, "KART" .. math.random(100, 999))
 | 
						|
        TaskWarpPedIntoVehicle(playerPed, veh, -1)
 | 
						|
        rueckgabeMarkerActive = true
 | 
						|
    end, Config.MietStation.coords, true)
 | 
						|
 | 
						|
end)
 | 
						|
 | 
						|
-- Fahrezug despawnen
 | 
						|
RegisterNetEvent("kartverleih:despawnVeh", function()
 | 
						|
    if mietFahrzeug and DoesEntityExist(mietFahrzeug) then
 | 
						|
        DeleteVehicle(mietFahrzeug)
 | 
						|
        mietFahrzeug = nil
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
-- Mietende
 | 
						|
AddEventHandler('baseevents:onPlayerDied', function()
 | 
						|
    TriggerServerEvent("kartverleih:stopMiete")
 | 
						|
    if mietFahrzeug and DoesEntityExist(mietFahrzeug) then
 | 
						|
        DeleteVehicle(mietFahrzeug)
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("kartverleih:stopClientMiete", function()
 | 
						|
    if mietFahrzeug and DoesEntityExist(mietFahrzeug) then
 | 
						|
        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)
 |