# Ziplines and ropes Both are found by place, not by collision: a cable or a rope needs no mesh that blocks anything, and nothing about them is sent over the network. Every machine finds the same line from where the character's hands are, so riding and swinging are predicted like the other moves. The hands are **Line Hands Above Head** (15 cm) over the top of the capsule. Everything below is measured from them. ## Ziplines Add a **TRC Zipline** component (`UTRCZiplineComponent`) where the cable starts, and set its **End**, relative to the component, where it ends. The example map's **TRCExampleZipline** draws a cable between the two. | Setting on the component | Default | What it does | |---|---|---| | End | 1500, 0, -300 | The far end, relative to the component | | Downhill Only | on | Ridden only toward its lower end. Off: either way, the way the character was going when it grabbed | | | | |---|---| | Grab | In the air, the hands within **Zipline Grab Radius** (45 cm) of the cable, moving toward it, away from its ends (**Zipline End Margin**, 60 cm). No button: a jump up to it is enough. A jump on the ground with a cable within **Line Jump Reach** (100 cm) above the hands stays a jump, even at a ledge it would otherwise drop down to | | Ride | Gravity along the cable (**Zipline Gravity Scale**, 0.6) between **Zipline Min Speed** (400 cm/s) and **Zipline Max Speed** (1400 cm/s) | | Let go | A new jump press: the ride's speed kept, and **Zipline Let Go Down Speed** (150 cm/s) downward, so it is not grabbed again. The end of the cable lets go too, and so does something in the way | Place the cable so a standing character's hands are below it and a jump reaches it, with room for the feet under it the whole way: on the example's character (hands 207 cm above the feet, a jump adds 90), the cable starts 340 cm above the platform. ## Ropes Add a **TRC Rope** component (`UTRCRopeComponent`) where the rope hangs from, with its **Length** (600 cm by default). It hangs straight down. The example map's **TRCExampleRope** draws it, following the hands of whoever swings on it. | | | |---|---| | Grab | In the air, the hands within **Rope Grab Radius** (55 cm) of the rope, moving toward it, no closer to the anchor than **Rope Min Length** (150 cm). A jump on the ground with a rope within **Rope Jump Reach** (300 cm) ahead stays a jump | | Swing | A pendulum as long as the hands are from the anchor. The move input pushes it across the rope (**Rope Swing Acceleration**, 700 cm/s²), **Rope Damping** (0.15) slows it, and it never goes past **Rope Max Swing Angle** (70°) from hanging straight | | Let go | A new jump press: the swing's velocity times **Rope Let Go Boost** (1.15), plus **Rope Let Go Up Speed** (350 cm/s). Swinging into a wall stops the swing there | ## Animation **Zipline Animation** and **Rope Animation** loop at their **Speed** while on the line. Or leave them empty and read `GetTraversal()`: **Zipline** and **Rope**. ## Mover `UTRCCharacterMoverComponent` has both modes. A Character Mover Component of your own needs two more entries under **Movement Modes**: `TraversecraftZipline` → **TRC Mover Zipline Mode** and `TraversecraftRope` → **TRC Mover Rope Mode** (or run **Set Up for Traversecraft** on its Blueprint again, which adds what is missing). Without them, the component simply never grabs a line. ## Measured On their own courses, dedicated server and two clients, 150 ms of lag and 5% packet loss, 8 runs each: a zipline 25 m long grabbed with a jump, let go of and grabbed again halfway, and ridden to its end; a rope 4.5 m long grabbed with a running jump, swung on and let go of onto a platform. Every step completed in every run. | Course | CMC | Mover | |---|---|---| | Zipline | 0 to 4 corrections per run, the largest 7.3 cm | 0 to 2 rollbacks per run | | Rope | 2 to 5 corrections per run, the largest 6.6 cm | 0 to 1 rollback per run |