MFF

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

    Monture Custom

    Planifier Épinglé Verrouillé Déplacé Sans suite
    1.7.10
    72 Messages 7 Publieurs 16.3k 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.
    • DeletedD Hors-ligne
      Deleted
      dernière édition par

      Je ne pense pas que ce soit trop possible, les deux joueurs risquent de se superposer. Il faudrait que tu réecrives la méthode pour monter une entity 😕

      1 réponse Dernière réponse Répondre Citer 0
      • robin4002R Hors-ligne
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
        dernière édition par

        @‘Toutoune1008’:

        Ou alors, question: Peut-on faire monter deux joueurs sur le cheval de Minecraft? Si oui, je pourrais me débrouiller pour faire s’asseoir le second gars un peu à côté.

        Non. Mais sur ta propre entité ça devrait être possible. Il faudrait reprendre tout le code en rapport avec mountEntity et faire une version avec un tableau + des boucles.

        1 réponse Dernière réponse Répondre Citer 0
        • FolganskyF Hors-ligne
          Folgansky Correcteurs
          dernière édition par

          Sauf que ma propre entité est extends EntityHorse malheureusement ^^

          Du coup je reviens sur ma première proposition. Actuellement donc j’ai simplement les méthodes pour ajouter une touche personnalisée.

              @SubscribeEvent
              public void onEvent(KeyInputEvent event)
              {
                  if(ModPg2.keyBindPassager.isPressed())
                  {
                      keyPassagerTyped();
                  }
              }
          
              private void keyPassagerTyped()
              {
                   if (Minecraft.getMinecraft().thePlayer.ridingEntity != null)
                   {
                       // Je fais spawn mon entité qui suivra le joueur
          
                   if (Minecraft.getMinecraft().thePlayer.ridingEntity != null)
                   {
                       // Je fais spawn mon entité qui suivra le joueur
                        EntitySittable e = new EntitySittable(Minecraft.getMinecraft().thePlayer.worldObj);
                         if(!Minecraft.getMinecraft().thePlayer.worldObj.isRemote)
                         {
                             e.setPosition(Minecraft.getMinecraft().thePlayer.posX + 0.5F, Minecraft.getMinecraft().thePlayer.posY, Minecraft.getMinecraft().thePlayer.posZ);
                             Minecraft.getMinecraft().thePlayer.worldObj.spawnEntityInWorld(e);
                         }
                   }
          
                   }
                  Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Ok pour la touche"));
              }
          

          et la classe de mon entité qui devra suivre le joueur

          package fr.powergame.modpg2.common;
          
          import net.minecraft.entity.Entity;
          import net.minecraft.entity.player.EntityPlayer;
          import net.minecraft.nbt.NBTTagCompound;
          import net.minecraft.world.World;
          
          public class EntitySittable extends Entity
          {
              public int entityPosX;
              public int entityPosY;
              public int entityPosZ;
          
              public EntitySittable(World world)
              {
                  super(world);
                  this.preventEntitySpawning = true;
                  this.setSize(0.5F, 0.5F);
              }
          
              public EntitySittable(World world, EntityPlayer entityplayer, int x, int y, int z, float entityX, float entityY, float entityZ)
              {
                  this(world);
                  this.entityPosX = x;
                  this.entityPosY = y;
                  this.entityPosZ = z;
                  this.setPosition(entityX, entityY, entityZ);
              }
          
              public boolean interact(EntityPlayer entityplayer)
              {
                  if(this.riddenByEntity != null)
                  {
                      return true;
                  }
          
                  if(!this.worldObj.isRemote)
                  {
                      entityplayer.mountEntity(this);
                  }
                  return true;
              }
          
              @Override
              public void onEntityUpdate()
              {
                  if(this.riddenByEntity == null || this.riddenByEntity.isDead)
                  {
                      this.setDead();
                  }
                  super.onEntityUpdate();
              }    
          
              @Override
              public void writeEntityToNBT(NBTTagCompound nbt)
              {
                  nbt.setInteger("entityPosX", this.entityPosX);
                  nbt.setInteger("entityPosY", this.entityPosY);
                  nbt.setInteger("entityPosZ", this.entityPosZ);
              }
          
              @Override
              public void readEntityFromNBT(NBTTagCompound nbt)
              {
                  this.entityPosX = nbt.getInteger("entityPosX");
                  this.entityPosY = nbt.getInteger("entityPosY");
                  this.entityPosZ = nbt.getInteger("entityPosZ");
              }
          
              @Override
              protected void entityInit()
              {
          
              }
          }
          

          A la base cette entité sert pour s’asseoir sur un bloc, j’ai juste renommé les Posx/y/z en attendant.

          1 réponse Dernière réponse Répondre Citer 0
          • robin4002R Hors-ligne
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs
            dernière édition par

            Je vois.
            Ça peut aussi fonctionner, mais tu peux très bien faire ce que j’ai dit avant. La classe est à toi, tu peux faire ce que tu veux avec, le fait qu’elle soit extends EntityHorse ne dérange pas.

            1 réponse Dernière réponse Répondre Citer 0
            • FolganskyF Hors-ligne
              Folgansky Correcteurs
              dernière édition par

              Cette méthode de la classe Entity?

               /**
                   * Called when a player mounts an entity. e.g. mounts a pig, mounts a boat.
                   */
                  public void mountEntity(Entity p_70078_1_)
                  {
                      this.entityRiderPitchDelta = 0.0D;
                      this.entityRiderYawDelta = 0.0D;
              
                      if (p_70078_1_ == null)
                      {
                          if (this.ridingEntity != null)
                          {
                              this.setLocationAndAngles(this.ridingEntity.posX, this.ridingEntity.boundingBox.minY + (double)this.ridingEntity.height, this.ridingEntity.posZ, this.rotationYaw, this.rotationPitch);
                              this.ridingEntity.riddenByEntity = null;
                          }
              
                          this.ridingEntity = null;
                      }
                      else
                      {
                          if (this.ridingEntity != null)
                          {
                              this.ridingEntity.riddenByEntity = null;
                          }
              
                          if (p_70078_1_ != null)
                          {
                              for (Entity entity1 = p_70078_1_.ridingEntity; entity1 != null; entity1 = entity1.ridingEntity)
                              {
                                  if (entity1 == this)
                                  {
                                      return;
                                  }
                              }
                          }
              
                          this.ridingEntity = p_70078_1_;
                          p_70078_1_.riddenByEntity = this;
                      }
                  }
              
              1 réponse Dernière réponse Répondre Citer 0
              • robin4002R Hors-ligne
                robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                dernière édition par

                Faut modifier tout ce qui est en rapport avec ridingEntity

                1 réponse Dernière réponse Répondre Citer 0
                • FolganskyF Hors-ligne
                  Folgansky Correcteurs
                  dernière édition par

                  J’ai un peu de mal avec l’approche nécessaire.

                  ridingEntity correspond à l’entité que l’on est en train de monter, ici un véhicule. (C.f "The entity we are currently riding ")
                  riddenByEntity correspond à une entité qui est en train d’en monter une autre, ici le joueur. (C.f "The entity that is riding this entity ")

                  Du coup moi je me mélange tout. Car ridingEntity semble être le joueur.

                  Du coup si je veux ajouter un passager sur mon entité, je dois pouvoir enregistrer 2 "ridingEntity " dessus.
                  Pourquoi devoir modifier toutes les fois où ridingEntity apparaît du coup?

                  Je préfèrerais détecter si mon entité est actuellement toujours montée par un joueur et si oui pouvoir monter dessus mais à une place différente.

                  En tout cas, voilà ce que je comprend des méthodes qui me semblent concernées (si j’en oublie ça viendra)

                  public void updateRidden() //ce qu'il se passe du côté de véhicule
                      {
                          if (this.ridingEntity.isDead)  //si le joueur est mort
                          {
                              this.ridingEntity = null;   //Le joueur ne la monte plus
                          }
                          else    //qu'il y ait ou pas un joueur bien vivant sur le véhicule
                          {
                              this.motionX = 0.0D;       //
                              this.motionY = 0.0D;       //  Mouvements bloqués
                              this.motionZ = 0.0D;       //
                              this.onUpdate();
                  
                              if (this.ridingEntity != null)   //si il y a un joueur/entité sur le véhicule
                              {
                                  this.ridingEntity.updateRiderPosition();   //On définit sa position sur le véhicule
                                  this.entityRiderYawDelta += (double)(this.ridingEntity.rotationYaw - this.ridingEntity.prevRotationYaw);  //La hauteur des yeux du joueur je suppose
                  
                  // la suite j'en ai aucune idée, des trucs concernant là où le joueur regarde peut-être, sûrement pour conserver de bonnes valeurs… enfin bon tant Pi
                                  for (this.entityRiderPitchDelta += (double)(this.ridingEntity.rotationPitch - this.ridingEntity.prevRotationPitch); this.entityRiderYawDelta >= 180.0D; this.entityRiderYawDelta -= 360.0D)
                                  {
                                      ;
                                  }
                  
                                  while (this.entityRiderYawDelta < -180.0D)
                                  {
                                      this.entityRiderYawDelta += 360.0D;
                                  }
                  
                                  while (this.entityRiderPitchDelta >= 180.0D)
                                  {
                                      this.entityRiderPitchDelta -= 360.0D;
                                  }
                  
                                  while (this.entityRiderPitchDelta < -180.0D)
                                  {
                                      this.entityRiderPitchDelta += 360.0D;
                                  }
                  
                                  double d0 = this.entityRiderYawDelta * 0.5D;
                                  double d1 = this.entityRiderPitchDelta * 0.5D;
                                  float f = 10.0F;
                  
                                  if (d0 > (double)f)
                                  {
                                      d0 = (double)f;
                                  }
                  
                                  if (d0 < (double)(-f))
                                  {
                                      d0 = (double)(-f);
                                  }
                  
                                  if (d1 > (double)f)
                                  {
                                      d1 = (double)f;
                                  }
                  
                                  if (d1 < (double)(-f))
                                  {
                                      d1 = (double)(-f);
                                  }
                  
                                  this.entityRiderYawDelta -= d0;
                                  this.entityRiderPitchDelta -= d1;
                              }
                          }
                      }
                  
                      public void updateRiderPosition()  //position du joueur par rapport au véhicule. Toucher au Y est simple, mais le X et Z... là je vois mal.
                      {
                          if (this.riddenByEntity != null)
                          {
                              this.riddenByEntity.setPosition(this.posX, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ);
                          }
                      }
                  
                      public void mountEntity(Entity ent)   //quand une entité monte sur un véhicule
                      {
                          this.entityRiderPitchDelta = 0.0D;   //on soude les visions des deux entités je suppose
                          this.entityRiderYawDelta = 0.0D;
                  
                          if (ent == null)        //si l'entité qui monte le véhicule est null
                          {
                              if (this.ridingEntity != null)  //si le véhicule est sensé être en train d'être monté
                              {
                                  this.setLocationAndAngles(this.ridingEntity.posX, this.ridingEntity.boundingBox.minY + (double)this.ridingEntity.height, this.ridingEntity.posZ, this.rotationYaw, this.rotationPitch);   // On fait je sais pas quoi mais ça a l'air important
                                  this.ridingEntity.riddenByEntity = null;  //on définit que l'entité qui montait le véhicule est maintenant null
                              }
                  
                              this.ridingEntity = null;  //le véhicule n'est plus monté
                          }
                          else    // si il y a une entité sur le véhicule
                          {
                              if (this.ridingEntity != null)  // si le véhicule est déjà monté
                              {
                                  this.ridingEntity.riddenByEntity = null; //problème de lecture du java, là je ne vois pas quelle entité devient null. On empêche de monter sur le véhicule je suppose
                              }
                  
                              if (ent != null)  //Si il y a bien une entité sur le véhicule
                              {
                                  for (Entity entity1 = ent.ridingEntity; entity1 != null; entity1 = entity1.ridingEntity) //euh... On check les entités sur le véhicule?
                                  {
                                      if (entity1 == this)
                                      {
                                          return;
                                      }
                                  }
                              }
                  
                              this.ridingEntity = ent; //on définit l'entité comme celle qui est montée sur le véhicule
                              ent.riddenByEntity = this; //on définit le véhicule montée par l'entité comme étant le véhicule en question...
                          }
                      }
                  

                  Bref, je n’ai pas tout compris et je pense me tromper surtout sur pas mal de choses.

                  1 réponse Dernière réponse Répondre Citer 0
                  • robin4002R Hors-ligne
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                    dernière édition par

                    C’est bien riddenByEntity qui correspond au joueur qui monte l’entité.

                    Ce qu’il faut faire c’est faire une liste d’entité riddenByEntityList par exemple et override toutes les fonctions en rapport avec riddenByEntity et remplacer riddenByEntity par cette liste.

                    1 réponse Dernière réponse Répondre Citer 0
                    • FolganskyF Hors-ligne
                      Folgansky Correcteurs
                      dernière édition par

                      Ouki, j’ai rien compris. Chui plus désolé pour toi que pour moi pour le coup.
                      Mais c’est mon niveau qui fait ça. Une autre personne (compétente elle-aussi) m’a conseillé ce que tu viens de dire.

                      J’vais laisser cette modification de côté pour l’instant. Mais j’y reviendrai au plus vite car c’est un truc qu’on me réclame assez fortement.

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

                        J’ai une base de code pour ton problème. Je pense la revoir mieux en détail demain pour pouvoir te la passer. Je ne te garantis pas qu’elle marchera à 100% mais avec l’aide de robin (ou de quelqu’un d’autre) elle le sera ^^’

                        1 réponse Dernière réponse Répondre Citer 0
                        • FolganskyF Hors-ligne
                          Folgansky Correcteurs
                          dernière édition par

                          Ravi que ce problème soit commun à d’autres ^^

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

                            Je t’explique alors comment je procède. Tous les joueurs interagissant avec l’entity qu’il souhaite monter sont enregistrés dans une ArrayList d’EntityPlayer, qui elle-même est enregistrée dans les tag de l’entity dont il est question.
                            Si je ne me suis pas trompé, voilà le code pour les NBTTagCompound :

                            
                            public void writeEntityToNBT(NBTTagCompound compound)
                            {
                            super.writeEntityToNBT(compound);
                            NBTTagList nbttagList = new NBTTagList();
                            NBTTagCompound nbtcompound;
                            for(int i = 0; i < this.mountingPlayersList.size(); i++)
                            {
                            nbtcompound = new NBTTagCompound();
                            if(this.mountingPlayersList.get(i).getCommandSenderName() != null)
                            nbtcompound.setString(this.mountingPlayersList.get(i).getCommandSenderName(), this.mountingPlayersList.get(i).getCommandSenderName());
                            nbttagList.appendTag(nbtcompound);
                            compound.setTag("MoutingPlayersList", nbttagList);
                            }
                            }
                            
                            public void readEntityFromNBT(NBTTagCompound compound)
                            {
                            super.readEntityFromNBT(compound);
                            NBTTagList nbttaglist;
                            if(compound.hasKey("MoutingPlayersList", 0))
                            {
                            nbttaglist = compound.getTagList("MoutingPlayersList", 0);
                            
                            for (int i = 0; i < this.mountingPlayersList.size(); ++i)
                            {
                            String currentPlayerName = this.mountingPlayersList.get(i).getCommandSenderName();
                            currentPlayerName = compound.getString("MoutingPlayersList");
                            }
                            }
                            }
                            
                            

                            Après je ne l’ai pas testé, à toi de voir ce qui est bon et ce qui ne l’est pas, mais ça reste tout de même une bonne base.
                            Ensuite dans la méthode interact après avoir ajouté l’EntityPlayer dans la liste (seulement si il n’y est pas déjà, car une fois monté, je pense qu’on peut quand même faire clic droit sur l’Entity, et donc interagir), on appelle la méthode mountEntity qui a été recodé dans la classe et qui a comme argument une ArrayList d’EntityPlayer. Comme ça à chaque fois qu’un joueur interagit, la méthode parcourt la liste pour savoir à quel endroit il faut placer tel joueur obtenu à tel tour. Après je n’ai pas encore fini pour la méthode mountManyPlayers, mais tu as déjà l’idée de comment t’y prendre 😉

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

                              Après pour la sauvegarde dans les nbt, c’est un peu spécial, car il y a quelque chose qu’on ne peut pas modifier dans le système de sauvegarde, si je me trompe pas, le rider enregistre le porteur dans ses tags et je fait spawn au chargement du monde (où l’inverse)

                              Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                              AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                              Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                              Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

                              MINECRAFT FORGE FRANCE © 2024

                              Powered by NodeBB