MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    "Accroché" une entité à une autre entité

    Planifier Épinglé Verrouillé Déplacé Sans suite
    1.9.4
    37 Messages 7 Publieurs 6.8k Vues 1 Watching
    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.
    • AxaurusA Hors-ligne
      Axaurus
      dernière édition par

      Mais je ne sais pas comment faire avec les NBTTags. J’ai essayé de faire ça dans le onItemRightClick de ma corde :

      EntityReindeer entityReindeer = (EntityReindeer)worldIn.getEntityByID(502);
      if(entityReindeer instanceof EntityReindeer)
      {
      System.out.println("reindeer");
      }
      if(!(entityReindeer instanceof EntityReindeer))
      {
      System.out.println("not reindeer");
      }
      
      ```Quand je fait click droit autre part que sur un renne, ça me met le messae comme quoi ce n'est pas un renne, mais quand je fait click droit dessus, pas de message.
      
      J'ai aussi découvert que dans la classe EntityLiving (donc dans le renne également), il y a deux fonctions : une qui renvoie un boolean qui dit si le renne est accroché à une corde ou non et une qui dit quelle entité le tire. Je ne pense pas qu'on aura besoin de la 2ème.
      1 réponse Dernière réponse Répondre Citer 0
      • RedenR Hors-ligne
        Reden
        dernière édition par

        Le getEntityByID renvoie l’instance de l’entité ayant l’ID entrée en argument. Mais ce n’est pas le même ID qu’a l’enregistrement dans le registre, comme l’a dit Plaigon il est plus simple de passer par la méthode interact() dans la classe de ton renne, et de faire référence à son instance avec un this tout simplement. Après si tu tiens à garder ton processus dans le onItemRightClick() il faudra passer par un raytracer.

        1 réponse Dernière réponse Répondre Citer 1
        • DeletedD Hors-ligne
          Deleted
          dernière édition par

          Réexplique clairement ce que tu veux faire, car là j’ai pas tout compris. Ainsi on pourra faire en sorte de te donner un ensemble d’étapes à suivre, bien détaillé et accessible pour que tu puisses résoudre ton problème 😉

          1 réponse Dernière réponse Répondre Citer 0
          • AxaurusA Hors-ligne
            Axaurus
            dernière édition par

            Je voudrais faire un truc comme ça : (j’ai mis spoiler, image trop grande):::

            :::

            C’est à dire, qu’on puisse accrocher un renne à mon traîneau. Une fois qu’il sera accroché, on ne pourra plus monter dessus. Et on ne pourra avancer avec le traîneau seulement si au moins un renne est accroché, avec une limite de six rennes.

            Je ne sais pas si c’est mieux expliquer, je pense qu’avec l’image c’est déjà mieux.
            Dans la classe du renne, j’ai fait ça :

            public boolean processInteract(EntityPlayer player, EnumHand p_184645_2_, ItemStack stack)
            {
            
            if (stack != null && stack.getItem() == Items.LEAD)
            {
            return false;
            }
            else if (stack != null && stack.getItem() == CreateItems.Rope && this.canBeLeashedTo(player))
            {
            this.setLeashedToEntity(player, true);
            –stack.stackSize;
            return true;
            }
            else if (this.getLeashed() && /*le joueur click droit sur le traineau*/)
            {
            this.setLeashedToEntity(/*traîneau où le joueur click*/, true);
            return true;
            }
            else if (!this.worldObj.isRemote && (!this.isBeingRidden() || this.isRidingOrBeingRiddenBy(player)))
            {
            player.startRiding(this);
            return true;
            }
            else
            {
            return false;
            }
            }
            

            Dans la condition this.getLeashed, il faudrait pouvoir détecter où le joueur fait un click droit. Et s’il fait click droit sur le traineau, ça les attache ensemble. J’ai déjà tout préparé, il manque plus que la détection de l’endroit du click.

            1 réponse Dernière réponse Répondre Citer 0
            • SCAREXS Hors-ligne
              SCAREX
              dernière édition par

              Je pense pas que tu puisse savoir grâce à un paramètre où se trouve l’autre bout de la laisse, en revanche tu dois pouvoir avoir accès à l’entité de la laisse

              Site web contenant mes scripts : http://SCAREXgaming.github.io

              Pas de demandes de support par MP ni par skype SVP.
              Je n'accepte sur skype que l…

              1 réponse Dernière réponse Répondre Citer 0
              • DeletedD Hors-ligne
                Deleted
                dernière édition par

                @SCAREX:

                en revanche tu dois pouvoir avoir accès à l’entité de la laisse

                Oui, si il a bien enregistré l’id de cet entity dans les tags de la laisse en question 😃

                1 réponse Dernière réponse Répondre Citer 0
                • AxaurusA Hors-ligne
                  Axaurus
                  dernière édition par

                  Salut
                  @‘Plaigon’:

                  @‘SCAREX’:

                  en revanche tu dois pouvoir avoir accès à l’entité de la laisse

                  Oui, si il a bien enregistré l’id de cet entity dans les tags de la laisse en question 😃

                  Justement, je ne vois pas comment enregistré l’entité dans les tags de la laisse. D’ailleurs, de base l’entité n’est pas enregistré non plus dans des tags.
                  La fonction que j’ai donné ne peut pas marcher ?

                  Sinon j’avais donné une autre fonction qui ne marchais pas, y’avait un problème d’ID. J’ai essayé de faire :

                  public ActionResult <itemstack>onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand)
                     {
                      EntitySleigh sleigh = new EntitySleigh(worldIn);
                  EntitySleigh entitySleigh = (EntitySleigh)worldIn.getEntityByID(sleigh.getEntityId());
                  
                  if (!(entitySleigh instanceof EntitySleigh))
                  {
                  System.out.println("l'entité n'est pas une instance de EntitySleigh");
                             return new ActionResult(EnumActionResult.PASS, itemStackIn);
                  }
                  else
                  {
                  if (!worldIn.isRemote)
                  {
                  System.out.println("l'entité est une instance de EntitySleigh");
                  attachToSleigh(playerIn, worldIn, entitySleigh);
                  }
                  
                             return new ActionResult(EnumActionResult.SUCCESS, itemStackIn);
                  }
                  }
                  ``` mais ça ne marche pas. Ici ça récupère l'ID d'une nouvelle instance. Or je voudrais récupéré l'instance de l'entité existante mais je n'ai rien trouvé.</itemstack>
                  1 réponse Dernière réponse Répondre Citer 0
                  • DeletedD Hors-ligne
                    Deleted
                    dernière édition par

                    Il te faut un raytracer pour savoir si tu pointes bien vers une EntityLiving, et si c’est le cas, la cast ensuite en EntitySleigh 😉

                    1 réponse Dernière réponse Répondre Citer 0
                    • AxaurusA Hors-ligne
                      Axaurus
                      dernière édition par

                      Dans la classe de mon renne, j’ai testé : ```java
                      public boolean processInteract(EntityPlayer player, EnumHand hand, ItemStack stack)
                      {
                      RayTraceResult rtr = player.rayTrace(50, 1);

                      if(rtr.entityHit instanceof EntityReindeer)
                      {
                      System.out.println(“le joueur regarde (ou click, je sais pas) un entityliving”);
                      return true;
                      }
                      /* if (stack != null && stack.getItem() == Items.LEAD)
                      {
                      return false;
                      }
                      else if (stack != null && stack.getItem() == CreateItems.Rope && this.canBeLeashedTo(player))
                      {
                      this.setLeashedToEntity(player, true);
                      –stack.stackSize;
                      System.out.println(this.getLeashed());
                      System.out.println(this.getLeashedToEntity());
                      return true;
                      }
                      // else if (this.getLeashed() && this.getLeashedToEntity() == player && rtr.entityHit instanceof EntityLiving/le joueur click droit sur le traineau///)
                      // {
                      // System.out.println(“le renne est leashed au joueur ET le joueur regarde (ou click, je sais pas) un entityliving”);
                      // EntitySleigh sleigh = (EntitySleigh)rtr.hitInfo;
                      // this.setLeashedToEntity(sleigh/traîneau où le joueur click/, true);
                      // return true;
                      /* }
                      else if (!this.worldObj.isRemote && (!this.isBeingRidden() || this.isRidingOrBeingRiddenBy(player)))
                      {
                      player.startRiding(this);
                      return true;
                      }*/
                      else
                      {
                      return false;
                      }
                      }

                      Une idée ?
                      1 réponse Dernière réponse Répondre Citer 0
                      • DeletedD Hors-ligne
                        Deleted
                        dernière édition par

                        Alors ça fait longtemps que je ne m’étais plus servir des raytraces, mais de mémoire je me servais plutôt de la méthode World#rayTraceBlock, qui prenait en paramètre un simple vecteur, et en deuxième celui du regard du joueur.

                        1 réponse Dernière réponse Répondre Citer 0
                        • AxaurusA Hors-ligne
                          Axaurus
                          dernière édition par

                          Salut
                          Si je comprend bien le nom de la fonction, c’est pour les blocks et non pour les entités. Peut-être que ça marche quand même, je sais pas

                          Sinon, je pense m’y prendre très mal. J’ai fait :

                          World world = player.worldObj;
                          RayTraceResult rtr = player.rayTrace(50, 0);
                          RayTraceResult rtr2 = world.rayTraceBlocks(this.getLookVec(), player.getLookVec());
                          
                          if(rtr2.hitInfo instanceof EntityReindeer)
                          {
                          System.out.println("le joueur regarde (ou click, je sais pas) un entityliving");
                          return true;
                          }
                          ``` et crash au click droit, NPE. Ca m'indique la condition. Et encore ça va posé problème quand je veux faire mon truc. Il faudrait donc détecté un traîneau pour ensuite récupérer son vecteur. Ou alors on peut directement passer par l'entitySleigh, mai c'est pareil, problème. J'ai fait : ```java
                          if (stack != null && stack.getItem() == CreateItems.Rope)
                          {
                          return ItemRope.attachToSleigh(player, player.worldObj, entity);
                          }
                          ``` Je me suis inspiré du blockFence : ```java
                          public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ)
                          {
                          return worldIn.isRemote ? true : ItemLead.attachToFence(playerIn, worldIn, pos);
                          }
                          ``` Mais le problème, c'est que je doit entrer l'entité du renne.
                          
                          Donc au final, c'est pareil : on est coincé. Si on utilise la méthode dans l'entityReindeer (donc avec rayTrace), déjà ça crash et ensuite il faut récupérer l'instance d'entitySleigh sur lequel je fais click droit. Et si on utilise la méthode dans l'entitySleigh (donc inspirée du BlockFence) il faut récupéré l'instance de l'entityReindeer (donc si j'ai bien compris les messages de la page précédente, avec des NBTTags, dont je ne sais pas comment faire). C'est assez problématique :/
                          1 réponse Dernière réponse Répondre Citer 0
                          • AxaurusA Hors-ligne
                            Axaurus
                            dernière édition par

                            Salut. Personne ne sait comment faire ?

                            1 réponse Dernière réponse Répondre Citer 0
                            • DeletedD Hors-ligne
                              Deleted
                              dernière édition par

                              Sinon au lieu de te prendre la tête avec un RayTracer, tu peux très bien override la méthode itemInteractionForEntity, qui possède elle-même un argument de l’EntityLiving avec laquelle on a interagi 😉

                              1 réponse Dernière réponse Répondre Citer 0
                              • AxaurusA Hors-ligne
                                Axaurus
                                dernière édition par

                                Je te remercie, c’est plus facile. Mais du coup j’ai deux problèmes : comme c’est une fonction qui va dans l’item de ma corde, il faut détecter les deux mobs : le renne et le traîneau. J’arrive à détecter le renne, mais c’est le traîneau qu’il faut. Mais c’est plus dur pour celui-ci car target est un EntityLivingBase. Or mon traîneau est un Entity. Et pis si j’arrive à détecter le traîneau, il faudrait quand même que je détecte si un renne est accroché à la corde.

                                Au pire si y’a aucune autre solution, je pourrais modifier le model du traîneau pour y inclure les modèles des rennes. Je mettrais un nouveau loot quand on tue le renne, et je l’utiliserait dans le craft du traîneau. Ca fera bizarre, mais au pire je peux faire ça si y’a pas de solution, et je réessayerait pour ma version de l’année prochaine, j’aurai plus de temps pour m’y consacrer. Après, si toi ou quelqu’un d’autre à une autre solution avant la fin du mois, j’essayerais et je vous dirais ce que ça fait, si ça marche ou pas.

                                1 réponse Dernière réponse Répondre Citer 0
                                • DeletedD Hors-ligne
                                  Deleted
                                  dernière édition par

                                  C’est pour ça que tu dois enregistrer le tout dans les itemstack de ta rope. On te l’a déjà dit plusieurs fois ^^
                                  Sinon vois pour l’extends EntityLiving…
                                  Ou peut-être que l’event EntityinteractEvent supporte les Entity 😉

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • AxaurusA Hors-ligne
                                    Axaurus
                                    dernière édition par

                                    @‘Plaigon’:

                                    C’est pour ça que tu dois enregistrer le tout dans les itemstack de ta rope. On te l’a déjà dit plusieurs fois ^^

                                    Justement, je l’ai aussi dit, je ne sais pas comment faire pour enregistrer l’entité dans les NBT de l’item. Je sais utiliser des NBTTags, mais il faut détecter l’entité au bout de la corde pour ensuite l’enregsitrer. Et ça, je ne sais pas

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • DeletedD Hors-ligne
                                      Deleted
                                      dernière édition par

                                      Y’a juste énormément de demandes sur comment se servir des NBT d’Itemstack, fais une recherche là…
                                      Autre question, ta rope peut-elle être utilisé sur plusieurs rennes ou alors sur qu’un seul ?
                                      Dans tous les cas, il faudra register un integer dans les NBT, l’id du renne. Si il est possible d’en attacher plusieurs, il faudra opter pour une NBTTagList d’integer 😉

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • AxaurusA Hors-ligne
                                        Axaurus
                                        dernière édition par

                                        Salut
                                        J’ai fait des recherches mais je ne comprend pas à quoi servent les Integer. C’est grâce à ça qu’on pourra détecter l’ID du renne accroché ? Et pour ta seconde question, on pourra accroché plusieurs rennes à la fois (un maximum de 6)

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • DeletedD Hors-ligne
                                          Deleted
                                          dernière édition par

                                          Les integers stockeraient alors les id’s des rennes concernés. Et au moment de les relier au traîneau, on ferait alors un getEntityID (me souviens plus de la clase exacte), et on irait get dans les NBT de la rope actuellement tenu par le joueurs, tous les rennes précédemment attachés. Et ainsi avec toutes les instances d’EntityRenne qu’on aurait eu, t’aurais pu appeler ta méthode spécialement codée pour les accrocher au bon endroit, avec la bonne rotation, etc…Tu vois ou t’as d’autres questions ? 😃
                                          Moi après c’est ce que j’aurais fait, peut-être que d’autres personnes auraient vu + simple…

                                          1 réponse Dernière réponse Répondre Citer 0
                                          • AxaurusA Hors-ligne
                                            Axaurus
                                            dernière édition par

                                            Ok merci. Je vais essayer et je reviens quand j’aurais des problèmes (car malheureusement j’en aurai)

                                            EDIT : J’ai fait une trouvaille sans doute interressante. Je cherchait l’entité de la corde (celle qui se créer quand le renne est accroché au joueur(car je ne pense pas qu’on puisse mettre un integer à un item, en tout cas j’ai rien trouvé)) et là j’ai trouvé un packet ayant pour paramètre l’entité acccroché etr un boolean Je suis allé dedans et j’ai vu ```java
                                               public SPacketEntityAttach(Entity entityIn, @Nullable Entity vehicleIn)
                                               {
                                                   this.entityId = entityIn.getEntityId();
                                                   this.vehicleEntityId = vehicleIn != null ? vehicleIn.getEntityId() : -1;
                                               }

                                            
                                            :::
                                            Voilà la classe du packet en entier : ```java
                                            package net.minecraft.network.play.server;
                                            
                                            import java.io.IOException;
                                            import javax.annotation.Nullable;
                                            import net.minecraft.entity.Entity;
                                            import net.minecraft.network.Packet;
                                            import net.minecraft.network.PacketBuffer;
                                            import net.minecraft.network.play.INetHandlerPlayClient;
                                            import net.minecraftforge.fml.relauncher.Side;
                                            import net.minecraftforge.fml.relauncher.SideOnly;
                                            
                                            public class SPacketEntityAttach implements Packet <inethandlerplayclient>{
                                               private int entityId;
                                               private int vehicleEntityId;
                                            
                                               public SPacketEntityAttach()
                                               {
                                               }
                                            
                                               public SPacketEntityAttach(Entity entityIn, @Nullable Entity vehicleIn)
                                               {
                                                   this.entityId = entityIn.getEntityId();
                                                   this.vehicleEntityId = vehicleIn != null ? vehicleIn.getEntityId() : -1;
                                               }
                                            
                                               /**
                                                * Reads the raw packet data from the data stream.
                                                */
                                               public void readPacketData(PacketBuffer buf) throws IOException
                                               {
                                                   this.entityId = buf.readInt();
                                                   this.vehicleEntityId = buf.readInt();
                                               }
                                            
                                               /**
                                                * Writes the raw packet data to the data stream.
                                                */
                                               public void writePacketData(PacketBuffer buf) throws IOException
                                               {
                                                   buf.writeInt(this.entityId);
                                                   buf.writeInt(this.vehicleEntityId);
                                               }
                                            
                                               /**
                                                * Passes this Packet on to the NetHandler for processing.
                                                */
                                               public void processPacket(INetHandlerPlayClient handler)
                                               {
                                                   handler.handleEntityAttach(this);
                                               }
                                            
                                               @SideOnly(Side.CLIENT)
                                               public int getEntityId()
                                               {
                                                   return this.entityId;
                                               }
                                            
                                               @SideOnly(Side.CLIENT)
                                               public int getVehicleEntityId()
                                               {
                                                   return this.vehicleEntityId;
                                               }
                                            }
                                            

                                            :::</inethandlerplayclient>

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

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB