
Avant de rentrer dans les détails techniques, je vous indique la source du problème, ce qui vous évitera de voir votre dépot en vrac :
Il ne faut pas se connecter au jeu avec un inventaire vide ! Si votre dépot est en vrac, mettez n'importe quoi dans votre inventaire et relancez le jeu ! (et oui, tout simplement...)
La suite s'adresse plus particulièrement à l'équipe pour régler tout ça.
Explication du bug
Si le dépôt s'affiche de travers, c'est qu'il y a un décalage dans la lecture des infos transmises par le serveur. La raison : l'utilisation ou non de l'item uid, ou plutot l'auto-détection de son utilisation par le client.
Car le client reste normalement capable de fonctionner avec un serveur utilisant ces uid, ou pas. Mais cette auto-détection est en réalité un peu légère... donc foireuse dans certains cas ! Elle s'opère au moment du HERE_YOUR_INVENTORY en observant la taille des infos transmises :
Fichier multiplayer.c (ligne 840)
Code : Tout sélectionner
if (data_length <= 3)
{
LOG_WARNING("CAUTION: Possibly forged HERE_YOUR_INVENTORY packet received.\n");
break;
}
items = in_data[3];
if (data_length - 4 == items * 8 )
{
item_uid_enabled = 0;
plen = 8;
}
else if (data_length - 4 == items * 10 )
{
item_uid_enabled = 1;
plen = 10;
}
else
plen = 8;
Alors par défaut (et en priorité), le client considère qu'il n'y a pas d'uid. D'où le décalage quand il reçoit les objets du dépot et peut-être même d'autres soucis :/
Résolution du bug
On pourrait bien sûr revoir ce fameux test, et pourquoi pas le retirer (puisque le serveur n'a pas de raison de ne plus utiliser les uid) ou tout simplement inverser l'ordre pour que le client considère les item uid actifs par défaut sur le serveur.
Bon l'autodétection n'en demeurre pas moins bancale, mais tant que le serveur ne change plus ça passerait... Par contre ça nécessite une recompilation du client (avec tout le bazar pour le mettre à jour).
Heureusement il y a une autre solution, car le client utilise une autre info pour son autodétection : l'interception d'un simple message serveur :
Fichier text.c (ligne 635)
Code : Tout sélectionner
else if (my_strncompare(text_to_add+1, "Send Item UIDs ", 15)) {
if (text_to_add[1+15] == '0')
item_uid_enabled = 0;
else if (text_to_add[1+15] == '1')
item_uid_enabled = 1;
printf("item_uid_enabled=%d\n", item_uid_enabled);
}