163 lines
		
	
	
		
			No EOL
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			No EOL
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
QBCore = exports['qb-core']:GetCoreObject()
 | 
						|
 | 
						|
Player = nil
 | 
						|
local npcHandle = nil
 | 
						|
local isNPCSpawned = false
 | 
						|
CurrentZone = nil
 | 
						|
 | 
						|
Citizen.CreateThread(function()
 | 
						|
    while Player == nil do
 | 
						|
        Player = exports['qb-core']:GetPlayerData()
 | 
						|
        Wait(0)
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
Citizen.CreateThread(function()
 | 
						|
    while true do
 | 
						|
        Wait(15000)
 | 
						|
        local ped = PlayerPedId()
 | 
						|
 | 
						|
        if IsPedInAnyVehicle(ped, false) then
 | 
						|
            local veh = GetVehiclePedIsIn(ped, false)
 | 
						|
            local mods = QBCore.Functions.GetVehicleProperties(veh)
 | 
						|
            print("Triggert setMods: "..json.encode(mods))
 | 
						|
            TriggerServerEvent('mh_garage:setMods', mods)
 | 
						|
        end
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
-- Funktion zum Spawnen des NPCs
 | 
						|
function SpawnGuardNPC(npc)
 | 
						|
    -- Ped Model laden
 | 
						|
    RequestModel(npc.model)
 | 
						|
    local timeout = 0
 | 
						|
    while not HasModelLoaded(npc.model) and timeout < 100 do
 | 
						|
        timeout = timeout + 1
 | 
						|
        Wait(100)
 | 
						|
    end
 | 
						|
 | 
						|
    if not HasModelLoaded(npc.model) then
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
    -- NPC erstellen
 | 
						|
    npcHandle = CreatePed(4, npc.model, npc.spawn.x, npc.spawn.y, npc.spawn.z, npc.spawn.w, false, true)
 | 
						|
    if not DoesEntityExist(npcHandle) then
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
    -- NPC Eigenschaften setzen
 | 
						|
    SetEntityAsMissionEntity(npcHandle, true, true)
 | 
						|
    SetBlockingOfNonTemporaryEvents(npcHandle, true)
 | 
						|
    SetPedDiesWhenInjured(npcHandle, false)
 | 
						|
    SetPedCanPlayAmbientAnims(npcHandle, true)
 | 
						|
    SetPedCanRagdollFromPlayerImpact(npcHandle, false)
 | 
						|
    SetEntityInvincible(npcHandle, true)
 | 
						|
    FreezeEntityPosition(npcHandle, true)
 | 
						|
    
 | 
						|
    -- Optional: Animation für den NPC
 | 
						|
    TaskStartScenarioInPlace(npcHandle, "WORLD_HUMAN_GUARD_STAND", 0, true)
 | 
						|
    
 | 
						|
    isNPCSpawned = true
 | 
						|
end
 | 
						|
 | 
						|
-- Funktion zum Entfernen des NPCs
 | 
						|
function RemoveGuardNPC()
 | 
						|
    if DoesEntityExist(npcHandle) then
 | 
						|
        DeleteEntity(npcHandle)
 | 
						|
        isNPCSpawned = false
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- Hauptthread zum Überprüfen der Spieler-Position
 | 
						|
CreateThread(function()
 | 
						|
    while true do
 | 
						|
        local playerPed = PlayerPedId()
 | 
						|
        local playerCoords = GetEntityCoords(playerPed)
 | 
						|
 | 
						|
        for k, v in pairs(Config.Zonen) do
 | 
						|
            local dist = #(playerCoords - vector3(v.NPC.spawn.x, v.NPC.spawn.y, v.NPC.spawn.z))
 | 
						|
            local spawnDistance = v.NPC.distance
 | 
						|
        
 | 
						|
            if dist < spawnDistance and not isNPCSpawned then
 | 
						|
                CurrentZone = v
 | 
						|
                SpawnGuardNPC(v.NPC)
 | 
						|
                Wait(300)
 | 
						|
                AddTargetOptions()
 | 
						|
            elseif dist > spawnDistance and isNPCSpawned then
 | 
						|
                CurrentZone = nil
 | 
						|
                exports['qb-target']:RemoveTargetEntity(npcHandle)
 | 
						|
                RemoveGuardNPC()
 | 
						|
            end
 | 
						|
        end
 | 
						|
        
 | 
						|
        Wait(0) -- Überprüfung jede Sekunde
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
function AddTargetOptions()
 | 
						|
 | 
						|
    local opt = {
 | 
						|
        {
 | 
						|
            type = "client",
 | 
						|
            event = "mh_garage:storeVehicle",
 | 
						|
            icon = "fas fa-parking",
 | 
						|
            label = "Fahrzeug einparken",
 | 
						|
        },
 | 
						|
        {
 | 
						|
            type = "client",
 | 
						|
            event = "mh_garage:retrieveVehicle",
 | 
						|
            icon = "fas fa-car",
 | 
						|
            label = "Fahrzeug ausparken",
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if Config.Verwaltung.garage then
 | 
						|
        table.insert(opt, {
 | 
						|
            type = "client",
 | 
						|
            event = "mh_garage:verwaltungVeh",
 | 
						|
            icon = "hand",
 | 
						|
            label = "Fahrzeuge Verwalten",
 | 
						|
        })
 | 
						|
    end
 | 
						|
 | 
						|
    exports['qb-target']:AddTargetEntity(npcHandle, {
 | 
						|
        options = opt,
 | 
						|
        distance = 2.5
 | 
						|
    })
 | 
						|
end
 | 
						|
 | 
						|
function Notification(text, type)
 | 
						|
	lib.notify({
 | 
						|
		title = "Garage - "..CurrentZone.name,
 | 
						|
		description = text,
 | 
						|
		type = type,
 | 
						|
		position = 'top',
 | 
						|
	})
 | 
						|
end
 | 
						|
 | 
						|
---------------------------- NetEvents
 | 
						|
RegisterNetEvent('mh_jobgarage:notify')
 | 
						|
AddEventHandler('mh_jobgarage:notify', function(title, text, type)
 | 
						|
	Notification(text, type)
 | 
						|
end)
 | 
						|
 | 
						|
function GetVehicleDamagePercentage(vehicle)
 | 
						|
    if not vehicle then return 0 end
 | 
						|
    
 | 
						|
    -- Hole die verschiedenen Gesundheitswerte
 | 
						|
    local engineHealth = GetVehicleEngineHealth(vehicle)
 | 
						|
    local bodyHealth = GetVehicleBodyHealth(vehicle)
 | 
						|
    local tankHealth = GetVehiclePetrolTankHealth(vehicle)
 | 
						|
    
 | 
						|
    -- Normalisiere die Werte (Standard-Maximalwerte: 1000.0)
 | 
						|
    local enginePercent = (engineHealth / 1000.0) * 100
 | 
						|
    local bodyPercent = (bodyHealth / 1000.0) * 100
 | 
						|
    local tankPercent = (tankHealth / 1000.0) * 100
 | 
						|
    
 | 
						|
    -- Berechne Durchschnitt als Gesamtzustand
 | 
						|
    local totalHealth = (enginePercent + bodyPercent + tankPercent) / 3
 | 
						|
    
 | 
						|
    -- Runde auf ganze Zahlen
 | 
						|
    return math.floor(totalHealth)
 | 
						|
end |