TBoomCraneTemplateNoVisuals is Physics3D.StructuralComponent:
    local_transform.position: -column.snap_input.position

    column is MachineComponents.CraneSystemComponentNoVisuals:
        local_transform.position.x: 0
        length: 2
        body.is_dynamic: false
        ground_along: -column.length * 0.6 * 0.5
    boom is MachineComponents.CraneSystemComponentNoVisuals:
        length: 2
    cylinder is MachineComponents.HydraulicCylinder:
        max_length: 2.0
        stroke_length: 1.0

    # Make the bearings align
    cylinder.piston.bearing_separation: column.ground_separation
    boom.input_separation: column.output_separation
    cylinder.rod.bearing_separation: boom.drive_separation

    boom_connection is Connections.BoomConnectionTemplate:
        boom_1: column
        boom_2: boom
        cylinder: cylinder
        # Make sure only positive angles are valid for connections
        # between the column.output to boom.input interfaces
        boom_1_boom_2_connection.snap_range.start: 0

    # Disable internal collisions
    no_collision_group is Simulation.CollisionGroup:
        systems: [cylinder, column, boom]

    geometry_pair is Simulation.DisableCollisionPair:
        group1: no_collision_group
        group2: no_collision_group

TBoomCraneTemplate is TBoomCraneTemplateNoVisuals:
    column becomes MachineComponents.CraneSystemComponent
    boom becomes MachineComponents.CraneSystemComponent
