Second Chance GazetteDevlogToken Use

The bin lifter tips the wrong way in Unreal Engine 5.8 and every angle check passes

unreal-engineblueprintsrotationanimationaudiosilent-failurebin-round

The man who could not say it

The fix took twenty minutes. Getting to it took a pencil, a video somebody found on their phone, and most of a Saturday night.

Second Chance has a bin round in it. Not a mission with a marker and a timer - a job. The council wagon works a real terraced street on a real route, two loaders take a kerb each, and the player can be one of them. GTA 6 will have refuse lorries in it and they will be scenery. This one has a rota.

James's mate Durrell does the job for a living, and he came round on the Saturday evening and watched the round end to end. The drone footage was the part everyone in the room reacted to - a camera following the wagon down the terrace with both men working the bins, the first time the round has read as a job being done by people rather than as a system running.

Then he said the lift was wrong.

He could not say why. He has watched that mechanism happen thousands of times and he stood there for a long while trying to put it into a sentence, which is not a thing he had ever needed to do. James handed him a pen and paper. He drew it. A second mate went and found a video of a real lorry working on social media, and between the drawing and the footage there was a specification.

A refuse lorry seen from above at a terraced kerb, its body plain teal with no lettering and its rear loading gear orange, a loader in a bright yellow hi-vis top standing at the back of it.
The state before any of it: plain teal body, no lettering, and a loader in yellow. Both of those were wrong and neither had been questioned.

Two faults. The tipping action was running in reverse. And there was no bar at the top of the travel for the bin to strike - on a real wagon the bin is raised until it meets that bar, and the impact is what shakes the contents out. Without it there is nothing for the motion to work against, so even with the direction right the action reads as a shrug.

Rockstar could hire a consultant for this. He had a mate round on a Saturday night, and the consultant would not have been able to say it either.

Which way round is not the same as how far

The tipping angle is one number on the lorry's Blueprint, and it was +150. It is now −180.

That is the whole fix, and it had survived three separate tuning passes because of how it was being checked. There is a gate on that number. It measures how far off vertical the bin finishes, and it never looks at which way it travelled to get there. So every wrong-handed value passed it, cleanly, every time. Somebody had already tuned it by eye twice - 140, then 170, then 150 - and all three were inside the same wrong family. Each one looked slightly better than the last and every one of them was tipping the bin forward and under, through the body of the truck.

The agent settled it by sweeping the angle in the editor with a bin hung on the comb and reading the bin's transform back at each stop, in the lorry's own coordinates rather than the world's. Not the number - the direction the bin's mouth was pointing.

anglewhere the mouth ends up
+90inside the tailgate structure
+150aimed off the back of the lorry
−90up and over, outside the truck entirely
−180inverted over the hopper throat, pointing straight down

Positive swings the bin forward and under. Negative swings it back, up and over, which is the arc a comb lift actually makes. Both signs finish in the same place at 180 degrees; only one of them gets there outside the vehicle.

The back of a refuse lorry on a terraced street with a green wheelie bin raised on the lifting comb above the hopper, two loaders in orange hi-vis standing either side of the tailgate, a brown bin waiting on the tarmac.
The corrected lift, mid-cycle. The comb takes the bin back and over rather than forward and under, and it stops against the bar.

The nice part was free. The shake at the top is built as a sine wave added onto the comb angle, and about a negative tip that overshoot stops reading as the bin tipping further past its stop and starts reading as the bin bouncing back off the bar. The test that guards the shake still holds either way, because a sine peaks at +1 whichever direction you approached it from - which is the same reason it never caught anything.

James's verdict on the finished action was that it looked just like real life.

Orange, and it says Council on the side

The other flat correction from a man who wears the kit: the hi-vis is orange, not yellow.

That went in on the Sunday morning and it is done. What is worth writing down is the twenty minutes that got burnt before it started, because there was a note in the handover proposing a diagnosis. Every screenshot of the crew showed yellow, the wardrobe notes said orange, and the note reasoned that this was the classic Unreal failure where a change to a Blueprint's template never reaches the copies already placed in the level. Plausible. Wrong. The screenshots were taken between half eleven and midnight, and the script that recolours the kit was written at three minutes past two. The yellow is simply the before.

Two file timestamps settled it in about ten seconds. Looking at the clock before theorising would have been quicker than theorising, and this happens often enough to be worth a habit.

The wagon's lettering got finished the same day, and it says Oakhaven City Council - Refuse Collection. It has taken three separate corrections from James to make that stick, because the project is full of plausible evidence for the wrong answer: an earlier crew palette named after a private contractor, a contractor number in the phone book, a contractor's registration in the plate table, and a line in the bin round's own handover insisting the round is contracted out - two thousand lines away from another line in the same file saying it is the council's. None of those were instructions. They were notes somebody wrote, and reading them and reaching for the contractor again is re-deciding a question that was already closed.

The rear of a refuse lorry in an Oakhaven City Council livery on a red-brick terraced street, red and yellow chevrons and a yellow number plate across the tailgate, two loaders in orange hi-vis walking brown wheelie bins out to it.
Finished livery, correct kit, both loaders working. The council arms, the council wordmark, and a registration that matches the plate table.

Being small is why the wagon is right. Nobody had to be persuaded that the hi-vis colour was worth an afternoon.

Fifty-six variables and twenty-seven functions

Then the day tried to eat itself.

The lorry needed three new mirror meshes, so the agent ran the script that builds the lorry's Blueprint from its component table. That script is a from-scratch builder. It deletes the Blueprint and recreates it from the parent class, then rebuilds all sixty-five components from a generated table - and nothing else. Every variable and every function graph that other scripts had added to it over previous sessions went with it. Fifty-six variables and twenty-seven functions became none and one. The twin combs, the packer, the state machine and the entire sound layer.

Nothing errored. The Blueprint reported itself compiled and up to date, with sixty-four components present, and it was telling the truth about the components. The damage only surfaced when a placement script failed trying to read a variable that no longer existed.

It reads as safe because the component table is generated and re-runnable, so the script looks like something you can run twice. The logic is not in that table and is not regenerated. It was recovered from an autosave - the good one is 2.14 MB and the wreck is 139 KB, which is the fastest way to pick the right file out of the folder - and the two things built after that autosave were re-run by hand.

A job you hear advertised

Also on the Sunday, and cheap by comparison: Oakhaven FM now carries an advert for the bin loader job.

That is a small loop and it is one of the reasons for building a town rather than a level. The radio plays in shops and in the house. You hear a council advert for refuse loaders. You can then go and be one, and there is an induction film waiting for you at the depot when you turn up.

The station's DJ is a virtual clock with a four-step cycle - track, ident, track, advert - and it picks an advert by building a filename out of a band prefix and a random number. There is no such thing as an advert that plays at every time of day; there are morning adverts, daytime, late night and graveyard, and nothing else. The bin man advert wants to be heard at all four. Duplicating a sixty-second recording into every band would have cost four copies of an eight-megabyte file for one advert.

So each band got an alias instead: a tiny cue holding a single player pointed at the one shared recording, about 4 KB each. The loader casts to the general sound type, so a cue drops straight into a slot a raw recording used to fill, and asking a cue how long it is returns the underlying recording's length, so the timer that schedules the next segment stays correct.

Two traps in that, both silent. A newly created cue defaults to three-quarters volume while every recording in the folder plays at full, so an untouched alias airs quieter than everything around it for no visible reason. And because every filename is built by joining strings at runtime, a count set one too high resolves to a name that does not exist and the segment plays silence, with no error anywhere in the editor. There is a verifier for that folder now which enumerates every name the DJ can possibly construct and asserts each one loads, is in the right sound class and is not zero length. It passed.

Do everything you can until six

He had breakfast at two, went for a half-hour swim and a walk round the rec in the sun, came back and cooked steak and chips, and then set the agent going on the induction film and went to bed. The instruction was to do everything it could until six.

Both modules came out the other end as MP4s: sixty-nine seconds and forty-four seconds, at 1920 by 1080, twenty-five frames a second. Two thousand eight hundred and eighty frames, each one rendered out of the editor as a still and assembled afterwards.

A high view straight down a narrow street of red-brick terraces, the refuse lorry small in the middle of the road with a loader working each kerb and green and brown wheelie bins out along both pavements.
A frame from the overnight shoot. The camera cranes over the terrace with a loader on each kerb - the shot that made the round look like a job rather than a system.

The single largest thing learnt overnight is a number. Raising anti-aliasing to the third quality step costs six times as much per frame in this map: 1.1 seconds a frame against 6.7, which turns a thirty-two minute render into three and a quarter hours. A side-by-side of the two comes out nearly identical - the visible difference is the contact shadow under a wheelie bin. Everything else stayed on the lowest quality step with textures raised on their own, and it holds up. The floor is the lowest step and not zero; zero flattens the lighting in a way anyone would notice.

It also crashed the editor once, immediately after taking a 3840 by 2160 still in a map holding 17,634 actors with the graphics card already about 920 MB over budget. The still survived and James approved it - it is the third picture in this entry - and 1080p ran over 1,700 consecutive frames without complaint.

Nobody has watched either film with sound yet. They were cut with nobody at the desk and checked frame by frame by eye, which proves the picture and proves nothing at all about the timing or whether any of the jokes land. Neither film is in the game; they are two loose video files.

That is the part worth being honest about. The agent ran for six hours unsupervised and produced two films, and the check that matters has not happened.

The thing he cannot buy

About twenty-four hours have now gone into making one job, in one town, in one game, behave like the real thing. He messaged a mate about it and said he hoped people would want to play it. The mate said people will love it and he has nothing to worry about.

He is not sure whether that is true or whether it is just what a mate says. Until somebody who does not know him shows an interest, cautiously optimistic is where he is staying.

The fault

The bin lifter tips the wrong way in Unreal Engine 5.8 and every angle check passes

The comb raised the wheelie bin and tipped it forward and under, through the body of the truck, instead of back, up and over. The tipping angle was +150; it needed to be −180.

It had survived three tuning passes because the only guard on it measures how far off vertical the bin finishes and never which direction it travelled. The whole wrong-handed family passes that test:

anglewhere the bin's mouth ends up
+90inside the tailgate structure
+150aimed off the back of the lorry
−90up and over, outside the truck
−180inverted over the hopper throat, straight down

Both signs finish at the same place at 180 degrees. Only the negative path stays outside the vehicle. Two earlier by-eye passes produced 140, 170 and 150 - three values, one wrong family, no test capable of separating them.

⚠ The second half of the same fault: there was no bar at the top of the travel for the bin to strike. On a real wagon that impact is what empties it, and without it the motion has nothing to work against.

The fix

Sweep the rotation and read the direction back, not the magnitude

Set the tipping angle to −180 at source - in the parts data the mesh is generated from and on the Blueprint's template - then re-seed the template values, because a compile discards raw defaults.

Verify it by sweeping the angle with a bin hung on the comb and reading the bin's world transform back at each stop, converted into the vehicle's own coordinates, and check the direction the bin's mouth points, not the angle it makes with vertical.

The guard: a tolerance on a magnitude cannot detect handedness. Any check of the form "is this within N degrees of upright" passes both mirror images of the motion, so it will sit there green through every tuning pass. If the thing being tuned has a handedness, the assertion has to be on a vector, and somebody has to look at it on screen at least once.

⭐ Free consequence of the sign flip: the shake at the top is a sine added onto the comb angle, so about a negative tip the overshoot reads as the bin bouncing back off the bar rather than tipping further past it. The existing shake test still passes, because a sine peaks at +1 either way - which is also why it never caught the fault.

The fault

A Blueprint reports UpToDate with 64 components after losing 56 variables and 27 functions

Running the lorry's component-builder script to pick up three new meshes deleted and recreated the Blueprint, rebuilding its sixty-five components from a generated table and nothing else. Every variable and function graph added by other scripts over previous sessions was destroyed: the twin combs, the packer, the state machine, the whole sound layer.

Nothing raised. The Blueprint reported compile_status UpToDate with 64 components, which was accurate - it was answering a question about components. The loss surfaced only when an unrelated placement script failed reading a variable that no longer existed.

The trap is that a generated, re-runnable component table makes the whole script look idempotent. The logic is not in the table and is not regenerated.

The fix

Edit components in place, and recover by file size

Change components on a live Blueprint with an in-place editor that walks the named subobjects and adds only what is missing, then verifies on a fresh gather. Only run a from-scratch builder on a Blueprint you are willing to lose.

Recovery: the newest autosave, picked by size - the good file was 2.14 MB against the wreck's 139 KB. Close the editor first, or it flushes the broken in-memory copy back over the restored one. An autosave is older than the wreck by definition, so anything built after it has to be re-run, and the template defaults re-seeded because a compile wipes them.

The guard: list the Blueprint's function graph names before and after any script that touches it. A missing function is obvious in that list and invisible in a compile status.

The kit

ToolWhy this one
A refuse loader with a penNamed both faults in the lift. Nothing in the project could have.
A video of a real lorry, found on a phoneConfirmed the drawing. Neither was enough on its own.
An in-editor angle sweep with transform readbackThe only thing that could tell two mirror-image rotations apart
File modification timesDisproved a plausible template-versus-instance diagnosis in ten seconds
Autosave, sorted by file size2.14 MB good, 139 KB wrecked. Faster than reading any of them.
Sound cue aliasesFour names for one 8 MB recording, about 4 KB each

Plain English

TermWhat it means
BlueprintUnreal's visual scripting. Logic built by wiring boxes together with lines instead of typing code. This whole game is built in it.
CDOThe template a Blueprint stamps out copies from. Editing the template does not always reach the copies already placed in the level, which is a classic silent failure.
actorAnything placed in the game world — a lamp post, a person, a trigger volume, a camera. If it sits in the level, it is an actor.
static meshA 3D model that does not bend — a wall, a bin, a bottle. It can be moved as a whole, but its shape is fixed.
pivotThe point a model rotates and scales around, and the point it sits on when placed. A pivot in the wrong place makes an object float or sink.
sound cueA small wrapper around one or more sound files that the game plays instead of the file itself, so the same recording can be reused under several names or mixed with others.
sound classThe group a sound belongs to for mixing — music, speech, effects. A sound with no class sits outside the mix and ignores every volume rule set for it.
scalability settingsThe engine's quality dials — shadows, textures, effects, anti-aliasing — each of which can be set independently. Turning one up can cost far more than turning the rest up together.
anti-aliasingSmoothing the jagged edges of a rendered image. Expensive, and the higher settings often cost far more than they visibly gain.
plateA single rendered frame written out to disk, to be assembled into a film later. A minute of film is fifteen hundred of them.
VRAMMemory on the graphics card. This project has 8 GB of it, and that ceiling shapes most of the decisions in the devlog.

Things we still need to fix tomorrow:

  • Neither induction film has been watched end to end with sound. The picture is checked; the

timing, the pacing and the jokes are not.

  • Neither film is in the game. They are two loose video files; the depot classroom television

has nothing playing on it.

  • The crusher is hidden in every frame of both films rather than fixed, so Module Two's packer

beat shows the combs instead. It comes back the moment the level is reloaded.

  • Loaders carry one bin at a time and walk it in front of them. Durrell says two at a time,

dragged behind. Not built.

  • Orange reflectors down the side of the wagon. Not modelled.
  • The wagon creeps while the crew load. It should keep creeping and **stop when the player

falls behind**, which is also the half that has to exist before impatient drivers trying to squeeze past it can mean anything. Not built.

  • Two wheelie bins had been saved into the level in the wrong place - one sitting on the

tailgate, one pitched over at 38 degrees - and survived a reload. Both put back. Nothing currently checks for that automatically.

  • The bin round has been filmed, photographed and written about. There is still no video of it

anywhere the public can watch.

← All devlog entries

Watch it get built. All of this goes up on YouTube as it happens — broken animations, buildings hovering a foot off the ground, the lot.

Subscribe on YouTube