• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Synchronisation position entity

    1.8.x
    1.8
    2
    4
    1572
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • LeBossMax2
      LeBossMax2 dernière édition par

      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;
          }
      

      :::

      [20:41:09] [STDOUT]: [x=-652,50, y=5,00, z=-950,75]Client ? false time : 6
      [20:41:09] [STDOUT]: [x=-652,50, y=5,00, z=-950,75]Client ? true  time : 6    // à 6 ticks, client et serveurs synchronisés
      [20:41:09] [STDOUT]: [x=-652,50, y=5,00, z=-950,63]Client ? false time : 7
      [20:41:09] [STDOUT]: [x=-652,50, y=5,00, z=-950,63]Client ? true  time : 7    // à 7 ticks, client et serveurs synchronisés
      [20:41:09] [STDOUT]: [x=-652,50, y=5,00, z=-950,50]Client ? false time : 8
      [20:41:09] [STDOUT]: [x=-652,50, y=4,96, z=-950,63]Client ? true  time : 8    // à 8 ticks, client et serveurs ne sont plus synchronisés
      [20:41:09] [STDOUT]: [x=-652,50, y=4,96, z=-950,50]Client ? false time : 9
      [20:41:09] [STDOUT]: [x=-652,50, y=4,94, z=-950,63]Client ? true  time : 9    // plus de mouvement horizontal donc pas de modification des coordonnées X et Z
      [20:41:09] [STDOUT]: [x=-652,50, y=4,90, z=-950,50]Client ? false time : 10
      [20:41:09] [STDOUT]: [x=-652,50, y=4,94, z=-950,63]Client ? true  time : 10   // plus de mouvement horizontal donc pas de modification des coordonnées X et Z
      

      :::

      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…)

      1 réponse Dernière réponse Répondre Citer 0
      • Benjamin Loison
        Benjamin Loison dernière édition par

        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 ! 🙂

        >! Développeur de Altis-Life (Arma III) sur Minecraft !
        >! Site web     : https://lemnoslife.com
        TeamSpeak : ts.lemnoslife.com

        1 réponse Dernière réponse Répondre Citer 0
        • LeBossMax2
          LeBossMax2 dernière édition par

          @‘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 ?

          1 réponse Dernière réponse Répondre Citer 0
          • LeBossMax2
            LeBossMax2 dernière édition par

            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 !

            1 réponse Dernière réponse Répondre Citer 1
            • 1 / 1
            • Premier message
              Dernier message
            Design by Woryk
            Contact / Mentions Légales

            MINECRAFT FORGE FRANCE © 2018

            Powered by NodeBB