Fishing NPC floats above the river bank and a script that fails a correct fix in Unreal Engine 5.8
Wednesday
Wednesday meant work, so the game got the evening. The weekly allowance on Claude Code had come back at nine that morning, which is the only reason there was an evening to spend.
The job was a polish pass on river fishing. Fishing was already in: cast, bite, fight, land. What it needed was the second coat. The agent was Claude Code Opus 5.5, and the session ran from half past five until the context filled up at ten.
Twelve functions in a Blueprint with 485 variables
The first hour was plumbing. The fight component, the part that decides how hard a fish pulls and when it jumps, had to be hooked into the player character, and that meant writing twelve function bodies into a Blueprint that has 485 variables. A Blueprint that size does not forgive a slip. So the agent took a snapshot of the character before it touched anything, and afterwards read every one of the 485 variables back from the default object. None had changed. All twelve bodies went in with no node missing and none refused.
Then it played it. The cast flew 606 centimetres over just under half a second, and a frame caught the float high over the water, so it is a throw and not a teleport. A perch took the bait, a brown trout after it, and the trout jumped 58 centimetres clear. In hand, the perch wriggles: two frames a second apart show a different bend in the tail. U puts it back and it arcs out over the water. I keeps it. That second key is new, and it replaced the old one on the same fish, which is why the on-screen tip had to change.

The salmon came later, in the second slot of the evening: 84 centimetres, mid-air, caught on a frame by luck.

Six new species went in as well. Chub, roach, bream, gudgeon, pike and eel, each normalised to roughly a metre so the existing palette sizes them correctly, each with a body material and a fin material, all on the one shared skeleton. The resident anglers started landing them straight away in the test runs.
The peg that floated
The residents who fish, Ron, Brian and Ajit, sit at numbered pegs along the bank. James watched a run and asked for them to sit closer to the river. Then he asked for them to sit clear of the reeds.
The first change was easy to write and wrong. The agent moved all eight pegs to 220 centimetres from the water's edge. Run in the game afterwards, Ron's chair was two and a half metres above the water. A peg works out where the ground is by tracing down onto it, and at 220 centimetres that trace hit the top of the reed bed and called it ground. Brian's peg did the same. Both went back to 320, which gave ground heights that made sense.
The reed request needed a survey. The agent wrote a read-only script that counts every reed instance in a corridor from the chair to two metres past the water, three metres either side. There are 9,994 reed instances on the bank. The script reported 19,988, because the distant-building copies of the same actors repeat every position, and that changes no result. Six pegs had reeds in the line, up to 66 clumps in one corridor. Each slid along the bank in two-metre steps until it found a gap. All eight found one within 20 metres.

Ron's peg and Ajit's peg were checked by eye. The other six were checked by the survey alone, and that is what the next run is for.

One thing the stills gave away. Ajit's face renders as a white blob in a close-up, a white beard and white hair over a pale mask of a face. That looks like a fault in his hair or his face material, and for now every picture of him is from behind.
A splash, and two scripts that lied
The throw-back needed a splash. The agent wrote one in C++: three ripple rings spawning at zero, 0.16 and 0.34 seconds, plus a handful of droplets. It built green first time, which is rare enough here to put in the notes.
The test could not show it. Frozen just after a throw-back, the component held two ring planes and eight droplets, so the code spawns them. The frames showed nothing clear. At the lowest graphics setting the rings are translucent and may not draw at all. The next run is at a higher setting.
The other two stumbles were scripts.
A guard in the fish-tips builder failed a correct fix. The new tip text was right, "Got him! Press I to keep him, or U to put him back.", but the check still searched for the old wording and reported the body as not taken. The body was fine and the marker was stale.
The species importer crashed in its final check. It asked a package whether it was dirty, which is a method Unreal Engine 5.8's Python does not have. The meshes and textures were already saved, so the damage was twelve materials left unsaved. The agent finished with a read-only check and a save of just those twelve.
Rockstar have a department for the water in GTA VI. He had a Wednesday evening and the part after tea.
The fault
An NPC sits two and a half metres above the water: ground trace hits reeds in Unreal Engine 5.8
Pegs moved to 220 cm from the water's edge. At two of eight, the downward trace for the ground height landed on top of the reed bed, so the chair and the seated character were placed 2.5 m up. The readback looked fine, because the number was a legitimate hit. Two more faults the same evening: a build guard that reported a correct Blueprint body as failed (it still searched for the previous on-screen text), and AttributeError: 'Package' object has no attribute 'is_dirty' from a Python import script.
The fix
Floating pegs and false failures
- Step the two floating pegs back to 320 cm, then survey reeds read-only and slide each peg along the bank in 2 m steps to a clear gap. Read the ground height back at the seated position, not just the hit.
- When a guard rejects a body that looks right, read what text the guard searches for before touching the body.
- In Unreal Engine 5.8 Python, ask for dirty packages with
EditorLoadingAndSavingUtils.get_dirty_content_packages().
The kit
What was used
Claude Code with the Unreal MCP and Monolith servers. A snapshot of the character Blueprint before editing, and a variable-by-variable diff of all 485 variables after. A standalone game run for the stills, since the editor viewport screenshots do not carry the interface.
Plain English
| Term | What it means |
|---|---|
| static mesh | A 3D model that does not bend - a wall, a bin, a bottle. It can be moved as a whole, but its shape is fixed. |
| skeleton | The hierarchy of bones inside an animated model. Two models sharing a skeleton can share animation. |
Things we still need to fix tomorrow:
- Look at the splash at a higher graphics setting. The rings spawn; the next run shows whether they draw.
- Sit Ron at peg 04 in a fresh run and confirm the float guard.
- Check pegs 01, 02, 03, 05, 06 and 07 by eye, not just by survey.
- Fix Ajit's white face in close-up.
- Reg reads his own list of pegs, so he sits where he did. Moving him is next.