forked from Simnation/Main
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 |