The Big Disaster | Root Access Devlog #8
Some weeks you find out that something you thought was working never really was. My first major bug that nearly drove me to madness.
It started simply enough. I was wiring up the 3D card movement, the moment a card physically travels from one place to another on the board. Visually, one of the more satisfying things to get right. I had the card spawning correctly, data flowing from the server to the client, commands being received and acknowledged. Everything pointed to this being straightforward.
Then I tried to move the card and nothing happened.
There was no errors on the logs, no crashes… just nothing. The card sat exactly where it was, completely indifferent to the fact that it was supposed to be moving.
I started digging. The movement logic lived on the tick (the function that runs in every frame). So I did the simplest possible test: I dropped a print string into the tick on the client side. Just a line of text that would appear on screen every frame to confirm the tick was running.
Nothing printed on the log.
That was strange. The card was spawning correctly on the client, the server was generating it and the client was receiving it. RPC calls were going through. Data was replicating. But the tick? Silent.
I took a step back and checked BeginPlay (the function that fires once when an actor first enters the world). If anything was going to work on the client, it should be that.
Also silent.
At this point I was no longer looking at a card movement bug. I was looking at something deeper and considerably more unsettling.
Ruling Things Out
I went through everything methodically. Replication settings => checked and rechecked. Forced tick enabled explicitly in the constructor. Verified the actor was set to replicate. Tried variations, combinations, approaches I’d already tried once because I was running out of ideas.
Nothing changed. The client side remained completely unresponsive. Tick not firing. BeginPlay not firing. And yet any RPCs calls where working with data replicating, spawning correct. The contradiction made no sense.
Then I thought I’d found a way around it. If tick wasn’t firing reliably on the client, maybe I could drive the card movement through a timeline instead (a defined animation curve that plays out over time rather than recalculating every frame). Cleaner, arguably more appropriate for smooth card movement anyway. I wired it up and ran it.
The timeline fired once. Then stopped completely. No loop, no continuation, just a single pulse and then silence… as if something was actively preventing anything time-based from sustaining itself on the client. Tick broken. BeginPlay broken. Timelines broken. It wasn’t one unlucky system. It was everything that depended on time passing on the client side.
So I ran a final test. I created a completely fresh actor. No logic, no systems, nothing inherited from the project. Just a simple replicated actor with a single print string on tick that said “hello world”. I dragged it into the map, which is always replicated to connected clients, and pressed play.
Just the server printed the logs. The client printed nothing.
I was losing my mind a little by this point.
The Moment It Clicked
One more test. I opened a completely fresh Unreal project. Clean template, nothing carried over from my work. Created the exact same actor. Dragged it into the map. Connected a client.
It worked immediately. Tick firing. BeginPlay firing. “Hello world” printing on both ends exactly as it should.
The template worked. My project didn’t. We are now getting somewhere.
After more testing, the conclusion was unavoidable: something in my project is broken at a fundamental level. Client-side ticks and BeginPlay events are not firing at all. Not just for cards, not just for replicated actors, but across the board. A silent, systemic failure that had been sitting underneath everything, invisible until I tried to do something that depended on it.
Where Things Stand
I know what the problem is. I know where it lives. I’ve already found the solution, but I’ll save it for the next post. If you’re an Unreal Engine developer, I’d love for you to leave a comment guessing what the issue might be. It’s easier than you think! Based on my description, I’m curious to see if you can spot exactly what’s going on.
Supporters
I would like to extend my sincere gratitude to the following individuals who have chosen to support this project. Your contribution means a great deal and helps keep this work moving forward.
Andre Fonseca
If you would like to appear here, you can support the project via the buymeacoffee or by subscribing to get extra content and preview of the posts.


