From ada75f8479da2bbef3e0e0c2deac82bc2ef05a5d Mon Sep 17 00:00:00 2001 From: HRiggs Date: Sat, 7 Feb 2026 16:34:43 -0500 Subject: [PATCH] Working yet too close --- .../media/lua/client/TowBar/TowingHooking.lua | 40 +++++++++++++++---- 42.13/media/lua/client/TowBar/TowingUI.lua | 29 +------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/42.13/media/lua/client/TowBar/TowingHooking.lua b/42.13/media/lua/client/TowBar/TowingHooking.lua index 9b1d7c9..d63d257 100644 --- a/42.13/media/lua/client/TowBar/TowingHooking.lua +++ b/42.13/media/lua/client/TowBar/TowingHooking.lua @@ -4,6 +4,27 @@ if not TowBarMod.Hook then TowBarMod.Hook = {} end local TowBarTowMass = 200 local AutoReattachCooldownHours = 1 / 7200 -- 0.5 seconds TowBarMod.Hook.lastAutoReattachAtByVehicle = TowBarMod.Hook.lastAutoReattachAtByVehicle or {} +local AutoReattachPlayerCooldownHours = 1 / 14400 -- 0.25 seconds +TowBarMod.Hook.lastAutoReattachAtByPlayer = TowBarMod.Hook.lastAutoReattachAtByPlayer or {} + +local function isTowBarTowPair(towingVehicle, towedVehicle) + if not towingVehicle or not towedVehicle then return false end + + local towingModData = towingVehicle:getModData() + local towedModData = towedVehicle:getModData() + if not towingModData or not towedModData then return false end + + if towingModData["isTowingByTowBar"] and towedModData["isTowingByTowBar"] and towedModData["towed"] then + return true + end + + -- Rejoin fallback: original towbar state on the towed vehicle is enough to reapply rigid spacing. + if towedModData.towBarOriginalScriptName ~= nil then + return true + end + + return false +end local function getTowBarItem(playerObj) if not playerObj then return nil end @@ -144,8 +165,7 @@ function TowBarMod.Hook.reattachTowBarFromDriverSeat(playerObj, towingVehicle) local towingModData = towingVehicle:getModData() local towedModData = towedVehicle:getModData() if not towingModData or not towedModData then return end - if not towingModData["isTowingByTowBar"] then return end - if not towedModData["isTowingByTowBar"] or not towedModData["towed"] then return end + if not isTowBarTowPair(towingVehicle, towedVehicle) then return end local attachmentA = towingVehicle:getTowAttachmentSelf() or "trailer" local attachmentB = towingVehicle:getTowAttachmentOther() or "trailerfront" @@ -192,21 +212,27 @@ local function tryAutoReattachFromCharacter(character) if not character or not instanceof(character, "IsoPlayer") or not character:isLocalPlayer() then return end local playerObj = character + local nowHours = getGameTime() and getGameTime():getWorldAgeHours() or 0 + local playerNum = playerObj:getPlayerNum() + local lastPlayerHours = TowBarMod.Hook.lastAutoReattachAtByPlayer[playerNum] + if lastPlayerHours and (nowHours - lastPlayerHours) < AutoReattachPlayerCooldownHours then + return + end + local towingVehicle = playerObj:getVehicle() if not towingVehicle then return end if not towingVehicle:isDriver(playerObj) then return end - if not towingVehicle:getVehicleTowing() then return end - - local modData = towingVehicle:getModData() - if not modData or not modData["isTowingByTowBar"] then return end + local towedVehicle = towingVehicle:getVehicleTowing() + if not towedVehicle then return end + if not isTowBarTowPair(towingVehicle, towedVehicle) then return end local vehicleId = towingVehicle:getId() - local nowHours = getGameTime() and getGameTime():getWorldAgeHours() or 0 local lastHours = TowBarMod.Hook.lastAutoReattachAtByVehicle[vehicleId] if lastHours and (nowHours - lastHours) < AutoReattachCooldownHours then return end + TowBarMod.Hook.lastAutoReattachAtByPlayer[playerNum] = nowHours TowBarMod.Hook.lastAutoReattachAtByVehicle[vehicleId] = nowHours TowBarMod.Hook.reattachTowBarFromDriverSeat(playerObj, towingVehicle) end diff --git a/42.13/media/lua/client/TowBar/TowingUI.lua b/42.13/media/lua/client/TowBar/TowingUI.lua index c623ed5..6631845 100644 --- a/42.13/media/lua/client/TowBar/TowingUI.lua +++ b/42.13/media/lua/client/TowBar/TowingUI.lua @@ -126,23 +126,6 @@ function TowBarMod.UI.addUnhookOptionToMenu(playerObj, vehicle) ) end -function TowBarMod.UI.addDriverReattachOptionToMenu(playerObj, towingVehicle) - local menu = getPlayerRadialMenu(playerObj:getPlayerNum()) - if menu == nil then return end - if not towingVehicle then return end - if not towingVehicle:isDriver(playerObj) then return end - if not towingVehicle:getVehicleTowing() then return end - if not towingVehicle:getModData()["isTowingByTowBar"] then return end - - menu:addSlice( - "Reattach Towbar (Debug)", - getTexture("media/textures/tow_bar_attach.png"), - TowBarMod.Hook.reattachTowBarFromDriverSeat, - playerObj, - towingVehicle - ) -end - --------------------------------------------------------------------------- --- Mod compability --------------------------------------------------------------------------- @@ -163,17 +146,9 @@ end function ISVehicleMenu.showRadialMenu(playerObj) TowBarMod.UI.defaultShowRadialMenu(playerObj) - local vehicle = playerObj:getVehicle() - if vehicle then - if vehicle:isDriver(playerObj) and vehicle:getVehicleTowing() and vehicle:getModData()["isTowingByTowBar"] then - TowBarMod.UI.removeDefaultDetachOption(playerObj) - TowBarMod.UI.addUnhookOptionToMenu(playerObj, vehicle) - TowBarMod.UI.addDriverReattachOptionToMenu(playerObj, vehicle) - end - return - end + if playerObj:getVehicle() then return end - vehicle = ISVehicleMenu.getVehicleToInteractWith(playerObj) + local vehicle = ISVehicleMenu.getVehicleToInteractWith(playerObj) if vehicle == nil then return end if vehicle:getModData()["isTowingByTowBar"] then