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 | 
