Netcode-valkuilen: berichten die stilletjes verdwijnen
Multiplayer-bugs zijn een soort apart genre: er crasht niets, er komt geen foutmelding in een log – er gebeurt gewoon niets. Twee van onze favoriete valkuilen uit onze eigen netwerkcode, als waarschuwing en ter vermaak.
Valkuil 1: het niet-geregistreerde bericht. Ons netwerkprotocol kent berichtklassen – “blok veranderd”, “speler bewogen”, “chat”. Elk nieuw berichttype moet bij de codec geregistreerd worden, zodat het een ID krijgt en geserialiseerd kan worden. Vergeet je dat, dan gebeurt het allerergste: de verzendaanroep mislukt, maar op een plek waar de fout stilletjes wordt weggeslikt. Geen crash, geen log – de functie “doet het gewoon niet”. We hebben dat meer dan eens zitten debuggen, tot de reflex erin zat: nieuwe berichtklasse? Eerste vraag: is hij geregistreerd?
Valkuil 2: het spookblok. Wanneer de server een blok verandert – bijvoorbeeld omdat een script het terrein hervormt – moet hij dat actief aan alle verbonden spelers melden. Vergeet je de broadcast, dan krijg je een spookblok: de server weet dat er een blok staat, de client toont lucht. De speler loopt tegen een onzichtbare muur – of erger, bouwt op een plek die aan de serverkant niet meer bestaat. Pas als je de chunk opnieuw laadt, staan beide werelden weer gelijk.
De gemene deler: in multiplayer zijn er altijd twee waarheden – die van de server en die van de client – en elke plek waar beide gelijk moeten blijven lopen is een potentiële valkuil. Ons antwoord waren tests die precies deze synchronisatie controleren, en checklists voor nieuwe berichten. Niet spectaculair, maar de spoken zijn sindsdien zeldzaam geworden.
Opmerkingen