From 5f71e16d4a9047a6be0c4e5780a9e48b984007b0 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Wed, 2 Jul 2025 06:35:52 +0200 Subject: [PATCH] Update main.lua --- resources/[carscripts]/re_boat_winch/main.lua | 103 +++++++++++++++++- 1 file changed, 98 insertions(+), 5 deletions(-) diff --git a/resources/[carscripts]/re_boat_winch/main.lua b/resources/[carscripts]/re_boat_winch/main.lua index 10a9ee62c..1fb693022 100644 --- a/resources/[carscripts]/re_boat_winch/main.lua +++ b/resources/[carscripts]/re_boat_winch/main.lua @@ -14,30 +14,33 @@ local boatOnTrailer = false local function getTrailerOffset(trailer) local model = GetEntityModel(trailer) if model == `boattrailer6` then - return vector3(0.0, 1.5, 0.3) -- Angepasste Werte für yftrailer + return vector3(0.0, 0.5, 0.3) -- Adjusted values for boattrailer6 (moved forward toward hitch) else - return vector3(0.0, 1.8, 0.0) -- Original boattrailer Werte + return vector3(0.0, 1.8, 0.0) -- Original boattrailer values end end local function getBoatAttachmentOffset(trailer) local model = GetEntityModel(trailer) if model == `boattrailer6` then - return vector3(0.0, -1.0, 0.25) -- Angepasste Werte für yftrailer + return vector3(0.0, -1.0, 0.25) -- Adjusted values for boattrailer6 else - return vector3(0.0, -1.02, 0.3) -- Original boattrailer Werte + return vector3(0.0, -1.02, 0.3) -- Original boattrailer values end end local function isSupportedBoat(closest) + if not closest then return false end for _, model in pairs(Config.SupportedBoats) do if GetEntityModel(closest) == model then return true end end + return false end local function isTrailer(vehicle) + if not vehicle then return false end local model = GetEntityModel(vehicle) return model == `boattrailer` or model == `boattrailer6` end @@ -68,6 +71,34 @@ local function notify(text) DrawNotification(true, false) end +-- Function to check if boat is positioned over trailer +local function IsBoatOverTrailer(boat) + if not boat or not isSupportedBoat(boat) then return false end + + local boatCoords = GetEntityCoords(boat) + local vehicles = GetGamePool('CVehicle') + local foundTrailer = nil + + for i = 1, #vehicles do + local vehicle = vehicles[i] + if isTrailer(vehicle) then + local trailerCoords = GetEntityCoords(vehicle) + local distance = #(boatCoords - trailerCoords) + if distance < 3.0 then + -- Additional check for proper alignment + local trailerHeading = GetEntityHeading(vehicle) + local boatHeading = GetEntityHeading(boat) + local headingDiff = math.abs(trailerHeading - boatHeading) + if headingDiff < 30.0 or headingDiff > 330.0 then + foundTrailer = vehicle + break + end + end + end + end + return foundTrailer +end + CreateThread(function() while true do Wait(1000) @@ -169,6 +200,19 @@ CreateThread(function() end return not hasTakenRope and hookedToBoat and createdRope end + }, + { + type = "client", + event = "re_boat_winch:client:selfDockBoat", + icon = 'fas fa-anchor', + label = "Secure boat to trailer", + canInteract = function(entity) + if not isSupportedBoat(entity) then + return false + end + local trailer = IsBoatOverTrailer(entity) + return trailer ~= nil + end } }, distance = 2.5 @@ -252,6 +296,20 @@ CreateThread(function() end return not hasTakenRope and hookedToBoat and createdRope end + }, + { + event = "re_boat_winch:client:selfDockBoat", + icon = 'fas fa-anchor', + label = "Secure boat to trailer", + name = "re_boat_winch:client:selfDockBoat", + distance = 2.5, + canInteract = function(entity) + if not isSupportedBoat(entity) then + return false + end + local trailer = IsBoatOverTrailer(entity) + return trailer ~= nil + end } }) end @@ -269,6 +327,7 @@ AddEventHandler('onResourceStop', function(resourceName) exports['qb-target']:RemoveGlobalVehicle("Boot vom Anhänger lösen") exports['qb-target']:RemoveGlobalVehicle("Seil einhängen") exports['qb-target']:RemoveGlobalVehicle("Seil aushängen") + exports['qb-target']:RemoveGlobalVehicle("Boot am Anhänger befestigen") else exports.ox_target:removeGlobalVehicle("re_boat_winch:client:takeRope") exports.ox_target:removeGlobalVehicle("re_boat_winch:client:returnRope") @@ -276,6 +335,7 @@ AddEventHandler('onResourceStop', function(resourceName) exports.ox_target:removeGlobalVehicle("re_boat_winch:client:detachBoat") exports.ox_target:removeGlobalVehicle("re_boat_winch:client:hookUpRope") exports.ox_target:removeGlobalVehicle("re_boat_winch:client:unHookRope") + exports.ox_target:removeGlobalVehicle("re_boat_winch:client:selfDockBoat") end end) @@ -333,6 +393,10 @@ RegisterNetEvent('re_boat_winch:client:returnRope', function() DeleteEntity(colObj) DeleteRope(createdRope) + + -- Unfreeze the trailer when returning the rope + FreezeEntityPosition(closestTrailer, false) + SetEntityInvincible(closestTrailer, false) end) RegisterNetEvent('re_boat_winch:client:detachBoat', function() @@ -395,6 +459,36 @@ RegisterNetEvent('re_boat_winch:client:controlRope', function() notify("Du kontrollierst die Winde") end) +-- New event for self-docking boats +RegisterNetEvent('re_boat_winch:client:selfDockBoat', function() + local playerPed = PlayerPedId() + local boat = GetVehiclePedIsIn(playerPed, false) + + if not boat or not isSupportedBoat(boat) then + notify("Du musst in einem unterstützten Boot sein") + return + end + + local trailer = IsBoatOverTrailer(boat) + if not trailer then + notify("Kein Anhänger in der Nähe gefunden") + return + end + + -- Exit the boat + TaskLeaveVehicle(playerPed, boat, 0) + Wait(1500) + + -- Attach boat to trailer + local attachOffset = getBoatAttachmentOffset(trailer) + AttachEntityToEntity(boat, trailer, 0, attachOffset.x, attachOffset.y, attachOffset.z, 0.0, 0.0, 0.0, false, false, false, false, 2, true) + + closestBoat = boat + closestTrailer = trailer + boatOnTrailer = true + notify("Boot am Anhänger befestigt") +end) + local function attachBoatToTrailer() if not DoesEntityExist(closestTrailer) or not DoesEntityExist(closestBoat) then return @@ -484,4 +578,3 @@ CreateThread(function() end end end) -