Synchronisation position entity



  • Bonjour tout le monde !
        Je un problème avec une entité : c'est l’entité d'un block qui ce déplace sur un tapis roulant : il est censé ce déplacer dans le sens du tapis roulant (pendant 8 tick à une vitesse de 1/8 de block/s) puis tomber au block suivant :

    Mais le block reste "coincé" sur le tapis, coté client et est correctement positionné coté serveur (il manque 2 pixel soit 1/8 de blocks pour que l'entité soit au bonne endroit):

    Pour une raison inconnue, la position du block n'est pas synchronisé au dernier tick avant de tomber. J'ai donc trouvé deux solution plutôt mauvaises :
     - Ajouter un tick de déplacement comme ça, coté lient, l'entité est au bon endroit mais le problème c'est que le block ne peut plus tomber dans un trou d'un block de long car coté serveur, l'entité est 1/8 de block trop loin donc il est sur le block suivant.
     - Diminuer la hitbox de l'entité (coté client seulement) comme ça le block tombe bien mais il y a comme même 2 pixel du block qui passent à travers le tapis roulant.

    Je n'ai donc pas trouvé "la" solution. Voici le partie de la fonction "onUpdate" qui nous intéresse :

       System.out.println(this + "Client ? " + this.worldObj.isRemote + " time : " + moveTime);
    
        int maxMoveTime = 8;
    
        if (this.moveTime == maxMoveTime) // Au moment où l'entité doit finir de se déplacer horizontalement
        {
            this.motionX = 0D;  // On arrête de la déplacer horizontallment
            this.motionZ = 0D;
        }
    
        if (this.moveTime >= maxMoveTime) // Si l'entité a fini de se déplacer horizontalement
        {
            this.motionY -= 0.04D;  // On applique les mouvement comme si c'était du sable : elle tombe
            this.motionX *= 0.5D;
            this.motionZ *= 0.5D;
            this.motionY *= 0.9D;
        }
    

    EDIT : Petite remarque : si le block est poussé par un piston pour se retrouvé sur le tapis roulant, l'entité est correctement positionnée. (Merci, les bizarreries de Minecraft…)



  • Si j'étais toi je bricolerai côté client pour que ça passe ni vu ni connu, il y a des bugs de Minecraft comme ça qui ne faut pas essayer de comprendre ^^ En tout cas bon courage ! 🙂



  • @'Benjamin Loison':

    Si j'étais toi je bricolerai côté client pour que ça passe ni vu ni connu, il y a des bugs de Minecraft comme ça qui ne faut pas essayer de comprendre ^^ En tout cas bon courage ! 🙂

    Merci.
    C'est très étrange car si je dit coté client de replacer l'entité au bon endroit, au tick suivant, l'entité est reparti en arrière pour ce coincer sur le tapis roulant.

    EDIT : De plus, si je pousse le block par un piston sur le tapis roulant lors de la première phase (déplacement horizontal) l'entité est mal placée mais revien au bon endroi quand il tombe (c'est tout le contraire de ce qu'il ce passe d'habitude)

    EDIT 2 : Il n'y a pas moyen de demander au serveur de synchroniser avec le client ?



  • Aujourd'hui, j'ai décidé de m'attaquer à cette entité (et les blocks qui fonctionnent avec) pour améliorer ce code que j'ai fait il y as presque un an.

    Premièrement, j'ai changé la manière dont l'entité spawn car j'avais pris ça sur le code des blocks de sable/gravier, et je trouve ce code très moche (1: regarder si les conditions requises pour spawn l'entité sont validées, 2: spawn l'entité, 3: lors du premier tick de l'entité : regarder si les conditions sont encore valides et supprimer le block qui étais à la place de l'entité en fessant un simple check  de block et no de BlockState (-> bug de changement de state sable normal/rouge…)).
    Après beaucoup d'ajustements, il se trouve que ce que j'ai fait marche beaucoup mieux qu'avant : plus de block invisible pendant un tick ni de block rendu en double. Mais le fameux "bug" que j'ai présente dans se sujet est toujours présent.

    Ensuite, je me suis attaqué à se bug ! Comme javais l'impression que cela ne venais pas de mon code (position qui change toute seul entre deux ticks 😕 ), je me demandais si cela ne pouvais pas venir de la fonction de registrer de l'entité, car je ne savais pas exactement à quoi correspondais les 3 arguments (trackingRange, updateFrequency et sendsVelocityUpdates). J'ai donc cherché quels étais les valeurs utilisées pour les entités de FallingBlock. J'ai copié les valeurs et la WOW !! Le bug a disparu ! Après quelques tests, j'ai compris que le paramètre trackingRange devais être mis à 20 pour ne pas avoir de problème (il était à 10 avant ce qui signifie 1 update tous les deux ticks, donc je ne vois pas trop pourquoi ça ne fonctionnais pas).

    Donc je peux enfin passer ce sujet en résolu !