forked from Simnation/Main
ed
This commit is contained in:
parent
8ee1bc193d
commit
6fbb9c5ea6
2 changed files with 183 additions and 5 deletions
|
@ -50,6 +50,52 @@ local function isBoat(vehicle)
|
|||
return boatClasses[vehicleClass] or false
|
||||
end
|
||||
|
||||
-- Lade verankerte Boote vom Server
|
||||
local function loadAnchoredBoats()
|
||||
QBCore.Functions.TriggerCallback('nordi_seats:server:getAnchoredBoats', function(serverAnchors)
|
||||
if serverAnchors then
|
||||
for plate, anchorData in pairs(serverAnchors) do
|
||||
-- Finde Fahrzeug mit dieser Kennzeichen
|
||||
local vehicles = GetGamePool('CVehicle')
|
||||
for _, vehicle in pairs(vehicles) do
|
||||
if DoesEntityExist(vehicle) then
|
||||
local vehicleProps = QBCore.Functions.GetVehicleProperties(vehicle)
|
||||
if vehicleProps.plate == plate and isBoat(vehicle) then
|
||||
-- Setze Boot an gespeicherte Position
|
||||
SetEntityCoords(vehicle, anchorData.coords.x, anchorData.coords.y, anchorData.coords.z)
|
||||
SetEntityHeading(vehicle, anchorData.heading)
|
||||
FreezeEntityPosition(vehicle, true)
|
||||
SetEntityInvincible(vehicle, true)
|
||||
|
||||
local vehicleNetId = NetworkGetNetworkIdFromEntity(vehicle)
|
||||
anchoredBoats[vehicleNetId] = anchorData
|
||||
|
||||
print("^2[Anker]^7 Boot mit Kennzeichen " .. plate .. " wurde verankert geladen.")
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
-- Speichere Anker auf Server
|
||||
local function saveAnchorToServer(vehicle, anchorData)
|
||||
local vehicleProps = QBCore.Functions.GetVehicleProperties(vehicle)
|
||||
if vehicleProps.plate then
|
||||
TriggerServerEvent('nordi_seats:server:saveAnchor', vehicleProps.plate, anchorData)
|
||||
end
|
||||
end
|
||||
|
||||
-- Entferne Anker vom Server
|
||||
local function removeAnchorFromServer(vehicle)
|
||||
local vehicleProps = QBCore.Functions.GetVehicleProperties(vehicle)
|
||||
if vehicleProps.plate then
|
||||
TriggerServerEvent('nordi_seats:server:removeAnchor', vehicleProps.plate)
|
||||
end
|
||||
end
|
||||
|
||||
-- Anker setzen/entfernen
|
||||
local function toggleAnchor(vehicle)
|
||||
if not isBoat(vehicle) then
|
||||
|
@ -65,6 +111,9 @@ local function toggleAnchor(vehicle)
|
|||
SetEntityInvincible(vehicle, false)
|
||||
anchoredBoats[vehicleNetId] = nil
|
||||
|
||||
-- Entferne vom Server
|
||||
removeAnchorFromServer(vehicle)
|
||||
|
||||
QBCore.Functions.Notify('⚓ Anker gelichtet! Das Boot kann wieder bewegt werden.', 'success')
|
||||
|
||||
-- Effekt: Kurzes Wackeln beim Anker lichten
|
||||
|
@ -85,17 +134,22 @@ local function toggleAnchor(vehicle)
|
|||
FreezeEntityPosition(vehicle, true)
|
||||
SetEntityInvincible(vehicle, true)
|
||||
|
||||
anchoredBoats[vehicleNetId] = {
|
||||
local anchorData = {
|
||||
coords = coords,
|
||||
heading = heading,
|
||||
time = GetGameTimer()
|
||||
}
|
||||
|
||||
anchoredBoats[vehicleNetId] = anchorData
|
||||
|
||||
-- Speichere auf Server
|
||||
saveAnchorToServer(vehicle, anchorData)
|
||||
|
||||
QBCore.Functions.Notify('⚓ Anker geworfen! Das Boot ist jetzt verankert.', 'success')
|
||||
|
||||
-- Anker-Wurf Effekt
|
||||
CreateThread(function()
|
||||
-- Spiele Anker-Sound (falls vorhanden)
|
||||
-- Spiele Anker-Sound
|
||||
PlaySoundFromEntity(-1, "CHECKPOINT_PERFECT", vehicle, "HUD_MINI_GAME_SOUNDSET", 0, 0)
|
||||
|
||||
-- Kleine Wellen-Animation
|
||||
|
@ -103,7 +157,6 @@ local function toggleAnchor(vehicle)
|
|||
local coords = GetEntityCoords(vehicle)
|
||||
local waterHeight = GetWaterHeight(coords.x, coords.y, coords.z)
|
||||
if waterHeight then
|
||||
-- Erstelle Wasser-Effekt um das Boot
|
||||
local effect = "ent_sht_water"
|
||||
RequestNamedPtfxAsset(effect)
|
||||
while not HasNamedPtfxAssetLoaded(effect) do
|
||||
|
@ -129,6 +182,51 @@ local function isBoatAnchored(vehicle)
|
|||
return anchoredBoats[vehicleNetId] ~= nil
|
||||
end
|
||||
|
||||
-- Überwache gespawnte Fahrzeuge für Anker-Wiederherstellung
|
||||
CreateThread(function()
|
||||
local checkedVehicles = {}
|
||||
|
||||
while true do
|
||||
local vehicles = GetGamePool('CVehicle')
|
||||
|
||||
for _, vehicle in pairs(vehicles) do
|
||||
if DoesEntityExist(vehicle) and not checkedVehicles[vehicle] then
|
||||
checkedVehicles[vehicle] = true
|
||||
|
||||
if isBoat(vehicle) then
|
||||
-- Prüfe ob dieses Boot einen gespeicherten Anker hat
|
||||
local vehicleProps = QBCore.Functions.GetVehicleProperties(vehicle)
|
||||
if vehicleProps.plate then
|
||||
QBCore.Functions.TriggerCallback('nordi_seats:server:getAnchorByPlate', function(anchorData)
|
||||
if anchorData then
|
||||
-- Setze Boot an gespeicherte Position
|
||||
SetEntityCoords(vehicle, anchorData.coords.x, anchorData.coords.y, anchorData.coords.z)
|
||||
SetEntityHeading(vehicle, anchorData.heading)
|
||||
FreezeEntityPosition(vehicle, true)
|
||||
SetEntityInvincible(vehicle, true)
|
||||
|
||||
local vehicleNetId = NetworkGetNetworkIdFromEntity(vehicle)
|
||||
anchoredBoats[vehicleNetId] = anchorData
|
||||
|
||||
print("^2[Anker]^7 Boot " .. vehicleProps.plate .. " automatisch verankert.")
|
||||
end
|
||||
end, vehicleProps.plate)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Cleanup nicht mehr existierende Fahrzeuge
|
||||
for vehicle, _ in pairs(checkedVehicles) do
|
||||
if not DoesEntityExist(vehicle) then
|
||||
checkedVehicles[vehicle] = nil
|
||||
end
|
||||
end
|
||||
|
||||
Wait(5000) -- Prüfe alle 5 Sekunden
|
||||
end
|
||||
end)
|
||||
|
||||
-- Funktion um verfügbare Sitze zu bekommen
|
||||
local function getAvailableSeats(vehicle)
|
||||
local seats = {}
|
||||
|
@ -553,10 +651,16 @@ RegisterNetEvent('vehicle:openSeatMenu', function(data)
|
|||
end
|
||||
end)
|
||||
|
||||
-- Lade Anker beim Start
|
||||
CreateThread(function()
|
||||
Wait(2000) -- Warte bis QBCore geladen ist
|
||||
loadAnchoredBoats()
|
||||
end)
|
||||
|
||||
-- Cleanup verankerte Boote bei Resource Stop
|
||||
AddEventHandler('onResourceStop', function(resourceName)
|
||||
if GetCurrentResourceName() == resourceName then
|
||||
-- Alle verankerten Boote wieder freigeben
|
||||
-- Alle verankerten Boote wieder freigeben (aber nicht vom Server löschen)
|
||||
for vehicleNetId, _ in pairs(anchoredBoats) do
|
||||
local vehicle = NetworkGetEntityFromNetworkId(vehicleNetId)
|
||||
if DoesEntityExist(vehicle) then
|
||||
|
@ -606,5 +710,5 @@ RegisterCommand('anchor', function()
|
|||
end, false)
|
||||
|
||||
-- Keybinds registrieren
|
||||
RegisterKeyMapping('seats', 'Sitzplatz Menü öffnen', 'keyboard', 'F6')
|
||||
RegisterKeyMapping('seats', 'Sitzplatz Menü öffnen', 'keyboard', 'F1')
|
||||
RegisterKeyMapping('anchor', 'Anker werfen/lichten', 'keyboard', 'H')
|
||||
|
|
74
resources/[carscripts]/nordi_seats/server/main.lua
Normal file
74
resources/[carscripts]/nordi_seats/server/main.lua
Normal file
|
@ -0,0 +1,74 @@
|
|||
local QBCore = exports['qb-core']:GetCoreObject()
|
||||
local anchoredBoats = {} -- Gespeicherte Anker {plate = anchorData}
|
||||
|
||||
-- Lade Anker aus Datenbank
|
||||
local function loadAnchorsFromDB()
|
||||
local result = MySQL.query.await('SELECT * FROM anchored_boats')
|
||||
if result then
|
||||
for _, row in pairs(result) do
|
||||
anchoredBoats[row.plate] = {
|
||||
coords = json.decode(row.coords),
|
||||
heading = row.heading,
|
||||
time = row.timestamp
|
||||
}
|
||||
end
|
||||
print("^2[Anker]^7 " .. #result .. " verankerte Boote aus der Datenbank geladen.")
|
||||
end
|
||||
end
|
||||
|
||||
-- Speichere Anker in Datenbank
|
||||
local function saveAnchorToDB(plate, anchorData)
|
||||
MySQL.insert('INSERT INTO anchored_boats (plate, coords, heading, timestamp) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE coords = VALUES(coords), heading = VALUES(heading), timestamp = VALUES(timestamp)', {
|
||||
plate,
|
||||
json.encode(anchorData.coords),
|
||||
anchorData.heading,
|
||||
anchorData.time or os.time()
|
||||
})
|
||||
end
|
||||
|
||||
-- Entferne Anker aus Datenbank
|
||||
local function removeAnchorFromDB(plate)
|
||||
MySQL.execute('DELETE FROM anchored_boats WHERE plate = ?', {plate})
|
||||
end
|
||||
|
||||
-- Events
|
||||
RegisterNetEvent('nordi_seats:server:saveAnchor', function(plate, anchorData)
|
||||
local src = source
|
||||
if not plate or not anchorData then return end
|
||||
|
||||
anchoredBoats[plate] = anchorData
|
||||
saveAnchorToDB(plate, anchorData)
|
||||
|
||||
print("^2[Anker]^7 Boot " .. plate .. " wurde verankert (Spieler: " .. src .. ")")
|
||||
end)
|
||||
|
||||
RegisterNetEvent('nordi_seats:server:removeAnchor', function(plate)
|
||||
local src = source
|
||||
if not plate then return end
|
||||
|
||||
anchoredBoats[plate] = nil
|
||||
removeAnchorFromDB(plate)
|
||||
|
||||
print("^2[Anker]^7 Boot " .. plate .. " Anker wurde gelichtet (Spieler: " .. src .. ")")
|
||||
end)
|
||||
|
||||
-- Callbacks
|
||||
QBCore.Functions.CreateCallback('nordi_seats:server:getAnchoredBoats', function(source, cb)
|
||||
cb(anchoredBoats)
|
||||
end)
|
||||
|
||||
QBCore.Functions.CreateCallback('nordi_seats:server:getAnchorByPlate', function(source, cb, plate)
|
||||
cb(anchoredBoats[plate])
|
||||
end)
|
||||
|
||||
-- Lade Anker beim Start
|
||||
CreateThread(function()
|
||||
loadAnchorsFromDB()
|
||||
end)
|
||||
|
||||
-- Cleanup bei Resource Stop
|
||||
AddEventHandler('onResourceStop', function(resourceName)
|
||||
if GetCurrentResourceName() == resourceName then
|
||||
print("^3[Anker]^7 Resource gestoppt. Anker bleiben in der Datenbank gespeichert.")
|
||||
end
|
||||
end)
|
Loading…
Add table
Add a link
Reference in a new issue