From 083e6db6131e83185c696830a9bf9c5bf84582cd Mon Sep 17 00:00:00 2001 From: HRiggs Date: Sat, 7 Feb 2026 18:21:03 -0500 Subject: [PATCH] Intresting --- .../Landtrain/UnlimitedTowbarChains.lua | 67 +++++++++++---- tools/java/BaseVehicleConstraintPatch.java | 80 +++++++++++++++++- zombie/vehicles/BaseVehicle.class | Bin 282823 -> 282960 bytes 3 files changed, 131 insertions(+), 16 deletions(-) diff --git a/42.13/media/lua/client/Landtrain/UnlimitedTowbarChains.lua b/42.13/media/lua/client/Landtrain/UnlimitedTowbarChains.lua index 925a8cc..c6443fa 100644 --- a/42.13/media/lua/client/Landtrain/UnlimitedTowbarChains.lua +++ b/42.13/media/lua/client/Landtrain/UnlimitedTowbarChains.lua @@ -554,7 +554,32 @@ local function breakConstraintSafe(vehicle, reason) local playerObj = getSpecificPlayer(0) if playerObj ~= nil then - sendClientCommand(playerObj, "towbar", "detachConstraint", { vehicle = vehicle:getId() }) + local towingVehicle = vehicle + local towedVehicle = vehicle:getVehicleTowing() + if towedVehicle == nil then + local frontVehicle = vehicle:getVehicleTowedBy() + if frontVehicle ~= nil then + towingVehicle = frontVehicle + towedVehicle = vehicle + end + end + + local detachCommand = "detachTowBar" + if TowBarMod and TowBarMod.Hook and TowBarMod.Hook.performDetachTowBar == nil then + detachCommand = "detachConstraint" + end + + local args = {} + if towingVehicle ~= nil then + args.towingVehicle = towingVehicle:getId() + end + if towedVehicle ~= nil then + args.vehicle = towedVehicle:getId() + else + args.vehicle = vehicle:getId() + end + + sendClientCommand(playerObj, "towbar", detachCommand, args) return true end return false @@ -1208,9 +1233,19 @@ local function menuHasTowbarAttachSlice(menu) return false end +local function getTowbarDetachAction() + if TowBarMod == nil or TowBarMod.Hook == nil then return nil end + return TowBarMod.Hook.deattachTowBarAction or TowBarMod.Hook.detachTowBarAction +end + +local function getTowbarPerformDetachHook() + if TowBarMod == nil or TowBarMod.Hook == nil then return nil end + return TowBarMod.Hook.performDetachTowBar or TowBarMod.Hook.performDeattachTowBar +end + local function menuHasTowbarDetachSlice(menu) if menu == nil or menu.slices == nil then return false end - local detachAction = TowBarMod and TowBarMod.Hook and TowBarMod.Hook.deattachTowBarAction or nil + local detachAction = getTowbarDetachAction() if detachAction == nil then return false end @@ -1288,7 +1323,8 @@ end local function addLandtrainUnhookOptionToMenu(playerObj, vehicle) if playerObj == nil or vehicle == nil then return end - if TowBarMod == nil or TowBarMod.Hook == nil or TowBarMod.Hook.deattachTowBarAction == nil then return end + local detachAction = getTowbarDetachAction() + if detachAction == nil then return end local menu = getPlayerRadialMenu(playerObj:getPlayerNum()) if menu == nil then return end @@ -1300,7 +1336,7 @@ local function addLandtrainUnhookOptionToMenu(playerObj, vehicle) menu:addSlice( getText("ContextMenu_Vehicle_DetachTrailer", ISVehicleMenu.getVehicleDisplayName(towedVehicle)), getTexture("media/textures/tow_bar_detach.png"), - TowBarMod.Hook.deattachTowBarAction, + detachAction, playerObj, towedVehicle ) @@ -1538,7 +1574,7 @@ local function installLandtrainTowbarPatch() return resolvedTowing, resolvedTowed end - local originalPerformDetach = TowBarMod.Hook.performDeattachTowBar + local originalPerformDetach = getTowbarPerformDetachHook() if originalPerformDetach and originalPerformDetach ~= TowBarMod.Hook._landtrainPerformDetachWrapper then local performDetachWrapper = function(playerObj, towingVehicle, towedVehicle) local resolvedTowingVehicle, resolvedTowedVehicle = resolveTowbarDetachPair(towingVehicle, towedVehicle) @@ -1550,11 +1586,11 @@ local function installLandtrainTowbarPatch() return end - dumpTowState("performDeattachTowBar pre towing", resolvedTowingVehicle) - dumpTowState("performDeattachTowBar pre towed", resolvedTowedVehicle) + dumpTowState("performDetachTowBar pre towing", resolvedTowingVehicle) + dumpTowState("performDetachTowBar pre towed", resolvedTowedVehicle) originalPerformDetach(playerObj, resolvedTowingVehicle, resolvedTowedVehicle) - dumpTowState("performDeattachTowBar post-original towing", resolvedTowingVehicle) - dumpTowState("performDeattachTowBar post-original towed", resolvedTowedVehicle) + dumpTowState("performDetachTowBar post-original towing", resolvedTowingVehicle) + dumpTowState("performDetachTowBar post-original towed", resolvedTowedVehicle) clearLandtrainFrontLinkData(resolvedTowedVehicle) reconcileTowbarSplitAround(resolvedTowingVehicle) @@ -1573,13 +1609,14 @@ local function installLandtrainTowbarPatch() refreshTowBarState(resolvedTowedVehicle:getVehicleTowing()) saveActiveLandtrainTowbarSnapshot() - dumpTowState("performDeattachTowBar post-reconcile towing", resolvedTowingVehicle) - dumpTowState("performDeattachTowBar post-reconcile towed", resolvedTowedVehicle) + dumpTowState("performDetachTowBar post-reconcile towing", resolvedTowingVehicle) + dumpTowState("performDetachTowBar post-reconcile towed", resolvedTowedVehicle) end + TowBarMod.Hook.performDetachTowBar = performDetachWrapper TowBarMod.Hook.performDeattachTowBar = performDetachWrapper TowBarMod.Hook._landtrainPerformDetachWrapper = performDetachWrapper - ltLog("installLandtrainTowbarPatch patched TowBarMod.Hook.performDeattachTowBar") + ltLog("installLandtrainTowbarPatch patched TowBarMod.Hook.performDetachTowBar") end -- If vanilla detach sneaks into the radial menu, redirect it to Towbar timed detach. @@ -1592,9 +1629,9 @@ local function installLandtrainTowbarPatch() end local towbarDetachTarget = getTowbarDetachTargetVehicle(vehicleToCheck) - if playerObj ~= nil and towbarDetachTarget ~= nil - and TowBarMod and TowBarMod.Hook and TowBarMod.Hook.deattachTowBarAction then - TowBarMod.Hook.deattachTowBarAction(playerObj, towbarDetachTarget) + local detachAction = getTowbarDetachAction() + if playerObj ~= nil and towbarDetachTarget ~= nil and detachAction ~= nil then + detachAction(playerObj, towbarDetachTarget) return end diff --git a/tools/java/BaseVehicleConstraintPatch.java b/tools/java/BaseVehicleConstraintPatch.java index b3dc692..445e768 100644 --- a/tools/java/BaseVehicleConstraintPatch.java +++ b/tools/java/BaseVehicleConstraintPatch.java @@ -7,6 +7,7 @@ import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.Opcodes; @@ -17,6 +18,9 @@ import org.objectweb.asm.Opcodes; */ public final class BaseVehicleConstraintPatch { private static final String TARGET_NAME = "addPointConstraint"; + private static final String CLINIT_NAME = ""; + private static final String VOID_NOARG_DESC = "()V"; + private static final String PATCH_LOG_LINE = "[Landtrain][BaseVehiclePatch] BaseVehicle override enabled"; private static final String BREAK_DESC_OBJECT_BOOL = "(ZLjava/lang/Boolean;)V"; private static final String BREAK_DESC_PRIMITIVE_BOOL = "(ZZ)V"; private static final String BASE_VEHICLE_OWNER = "zombie/vehicles/BaseVehicle"; @@ -55,13 +59,19 @@ public final class BaseVehicleConstraintPatch { + inspectedAddPointMethods + ")"); } + if (!ensureClassInitLog(classNode)) { + throw new IllegalStateException("Failed to inject BaseVehicle class-init debug log"); + } ClassWriter writer = new ClassWriter(0); classNode.accept(writer); Files.createDirectories(output.getParent()); Files.write(output, writer.toByteArray()); - System.out.println("Patched BaseVehicle.class; removed breakConstraint calls: " + removedCalls); + System.out.println( + "Patched BaseVehicle.class; removed breakConstraint calls: " + + removedCalls + + ", class-init debug log: enabled"); } private static boolean isTargetAddPointConstraint(String methodDesc) { @@ -102,4 +112,72 @@ public final class BaseVehicleConstraintPatch { return patched; } + + private static boolean ensureClassInitLog(ClassNode classNode) { + MethodNode clinit = null; + for (MethodNode method : classNode.methods) { + if (CLINIT_NAME.equals(method.name) && VOID_NOARG_DESC.equals(method.desc)) { + clinit = method; + break; + } + } + + if (clinit == null) { + clinit = new MethodNode(Opcodes.ACC_STATIC, CLINIT_NAME, VOID_NOARG_DESC, null, null); + clinit.instructions = new InsnList(); + clinit.instructions.add(createPatchLogInstructions()); + clinit.instructions.add(new InsnNode(Opcodes.RETURN)); + clinit.maxStack = 2; + clinit.maxLocals = 0; + classNode.methods.add(clinit); + return true; + } + + if (hasPatchLog(clinit)) { + return true; + } + + boolean inserted = false; + for (AbstractInsnNode node = clinit.instructions.getFirst(); node != null; ) { + AbstractInsnNode next = node.getNext(); + if (node.getOpcode() == Opcodes.RETURN) { + clinit.instructions.insertBefore(node, createPatchLogInstructions()); + inserted = true; + } + node = next; + } + + if (inserted) { + clinit.maxStack = Math.max(clinit.maxStack, 2); + } + return inserted; + } + + private static boolean hasPatchLog(MethodNode method) { + for (AbstractInsnNode node = method.instructions.getFirst(); node != null; node = node.getNext()) { + if (node instanceof LdcInsnNode ldc + && ldc.cst instanceof String text + && PATCH_LOG_LINE.equals(text)) { + return true; + } + } + return false; + } + + private static InsnList createPatchLogInstructions() { + InsnList insns = new InsnList(); + insns.add(new org.objectweb.asm.tree.FieldInsnNode( + Opcodes.GETSTATIC, + "java/lang/System", + "out", + "Ljava/io/PrintStream;")); + insns.add(new LdcInsnNode(PATCH_LOG_LINE)); + insns.add(new MethodInsnNode( + Opcodes.INVOKEVIRTUAL, + "java/io/PrintStream", + "println", + "(Ljava/lang/String;)V", + false)); + return insns; + } } diff --git a/zombie/vehicles/BaseVehicle.class b/zombie/vehicles/BaseVehicle.class index 314d1c740a187a8ba5b3df2e69246eb9f5bf49d8..3d1d73f3eddca92afd6e7e38fb9f2922c9627c41 100644 GIT binary patch delta 27135 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 Iy|kkL1B<-Y^8f$<