C’est compliqué.
Compliqué est un adjectif que je déteste, il est utilisé à toutes les sauces par ceux qui n’ont de notre langue qu’une connaissance lacunaire.
– Comment tu vas aujourd’hui ?
– C’est compliqué…
Ben non, tu vas bien, ou tu vas pas bien, mais arrête de tortiller du cul pour chier droit !
Bon, la réplication, par contre, c’est compliqué au sens étymologique : difficile à démêler. Je pensais naïvement que déclarer des variables répliquées et utiliser le nœud “Has authority” serait suffisant et il n’en est rien.
Bien entendu, comme j’ai le pompon pour me mettre dans des situations impossibles, il a fallu que je commence mon travail par la réplication de l’apparence des joueurs. Je suis arrivé à répliquer les boucles d’oreilles de mes fifilles, mais rien à faire pour les pièces d’armure, non seulement elles ne se répliquent pas sur l’écran des autres mais en plus elles ne changent même plus sur leur propre écran !
C’est là que je me suis rendu compte après fouille du net que la réplication des skeletal meshes ne fonctionne pas correctement et qu’il faut finasser pour y arriver. Et encore, j’ai été prévenu que ça ne marchera de toutes façons pas pour les clients qui se connecteront au serveur après l’exécution du code de réplication. Ça promet.
Pour donner une idée des joyeusetés auxquelles je fais face, tout a commencé par le choix de mode de test. Je peux lancer mes différents clients en mode “standalone”, totalement inutile car cela revient à ne pas utiliser le client-serveur du tout, en mode “listen server” qui, comme je l’ai appris après de longues recherches, permet à un client d’héberger un serveur auquel peuvent se connecter d’autres joueurs, ou en mode “client only” qui est finalement la bonne solution car ainsi je teste exclusivement les clients et Unreal lance de manière transparente un serveur dans le background.
Ensuite, il faut jongler avec des techniques qui n’ont rien d’intuitif. Par exemple, la documentation d’Unreal renseigne qu’il est possible de marquer une fonction pour la réplication. Je n’y arrive pas. Je cherche, je peste, je cherche encore et je finis par découvrir qu’ils sont vraiment désolés mais que tout compte fait non, ça ne marche qu’en C++. On se fout de qui là ?
Je contourne la difficulté en créant des “Custom events” qui eux peuvent être flaggés pour s’exécuter sur le serveur uniquement ou sur tous les postes, après quoi c’est un mic-mac pas possible pour déterminer ce que l’on veut exécuter sur le serveur et la manière dont cela est répliqué sur les clients.
Je n’ai pas terminé de tout mettre en œuvre, trop de travail avec mes élèves, je ne pourrai probablement reprendre que jeudi, c’est le genre de chantier pour lequel j’aime avoir du temps devant moi.
Je dois aussi résoudre un bug qui m’empêche de dormir: quand je suis en mode client, ma boule de feu s’exécute correctement mais une copie me reste collée à l’estomac, qui se détache – la boule, pas l’estomac ! – quand je lance au autre sort. Probablement une faute de conception dans les vidéos de Ryan Lalay, que je ne consulte plus jamais, et qui se résoudra peut-être d’elle-même lorsque j’aurai programmé la réplication des compétences.
Je vais finir par avoir triomphé de toutes les difficultés techniques, mais c’est pas encore pour demain !