• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Solved Probleme avec un mob

    1.7.x
    1.7.10
    5
    38
    6171
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • P
      PlagueZ last edited by

      Bonjour,

      j’ ai un problème avec un mob que je voudrait un peu particulier,
      le mob en question spawn a l’emplacement du joueur après la mort de celui-ci, et j’ aimerait que ce mob récupère la totalité de l’inventaire du joueur afin que le joueur ai à tuer le mob afin de récupérer son stuff.

      j’ai essayer beaucoup de choses sans résultat, et aussi entreprit de longues recherche sur internet sans résultat si vous avez une idée ou une piste je suis preneur

      Merci d’avance

      “Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire wo…

      1 Reply Last reply Reply Quote 0
      • EmotionFox
        EmotionFox last edited by

        Salut VirusZ,

        Bon déjà à ta place j’utiliserais l’event “LivingAttackEvent” (à chaque fois qu’une entité est blessée) parce qu’une fois le joueur mort je ne pense pas qu’on puisse récupérer sont inventaire, à confirmer.

           @SubscribeEvent
           public void whenHurt(LivingAttackEvent e)
           {}
        

        Ensuite il faudrait créer un tableau public dans cette event qui est égal à l’inventaire du joueur et qui ce mettrais à jour donc chaque fois que le joueur est blessé. Pour vérifier que l’entité est bien un joueur tu doit vérifier que l’entité de l’event est bien instanceof EntityPlayer

               if(e.entity instanceof EntityPlayer)
               {
                   EntityPlayer player = (EntityPlayer)e.entity;
               }
        

        Après il te faudra un autre event (utiliser quand un jouer est dupliqué, si wasDeath = true c’est forcement un spawn) que tu pourrais mettre dans la même classe

           @SubscribeEvent
           public void whenSpawn(Clone e)
           {
               if(e.wasDeath == true)
               {
                   for(int i = 0; i <= 5; ++i)
                   {
                       if(i == 5)
                       {
                           EntityScorpion scorpion = new EntityScorpion(e.entityPlayer.worldObj);
                           scorpion.setPosition(e.entityPlayer.posX, e.entityPlayer.posY, e.entityPlayer.posZ);
                           e.entityPlayer.worldObj.spawnEntityInWorld(scorpion);
                       }
                   }
               }
           }
        

        Donc là, suite à 5 int obligatoire, tu fais spawner ton monstre sur le joueur.
        A la suite de ça tu créer une liste des entités au alentour du joueur dans un rayon de 5 block qui serait égal à ton mob en question pour moi et pour l’exemple l’EntityScorpion

        int posX = position.getX();
        int posY = position.getY() + 1;
        int posZ = position.getZ();
        int radius = 5;
        
           List <entityscorpion>entities = world.getEntitiesWithinAABB(EntityScorpion.class, AxisAlignedBB.fromBounds(posX - radius, posY - radius, posZ - radius, posX + radius, posY + radius, posZ + radius));
        

        Et finalement tu dis que si cette liste est égal à null (donc si le mob est mort) et une boucle for la taille du tableau de l’inventaire du joueur tu drop les items du tableau au joueur

        e.entityPlayer.dropItem(itemIn, size);
        

        Donc voilà moi je ferais comme ça après peut-être qu’il y a une solution plus simple mais bon c’est toujours qu’une piste :)</entityscorpion>

        1 Reply Last reply Reply Quote 0
        • P
          PlagueZ last edited by

          Merci pour la piste,
          En théorie je pense que il y a un moyen puisque les mob son capable de ramasser les armure etc etc
          avec la boolean canPickUpLoot() dans le EntityLiving,
          la boolean sert a une condition dans le void onLivingUpdate()

          le truc c’est que c’est que des slot d’armure et que j’avoue ne pas tout comprendre a ce code pour pouvoir transformer les “SlotArmor” en Slot inventaire.___```java

          int posX = position.getX();
          int posY = position.getY() + 1;
          int posZ = position.getZ();
          int radius = 5;

          List <entityscorpion>entities = world.getEntitiesWithinAABB(EntityScorpion.class, AxisAlignedBB.fromBounds(posX - radius, posY - radius, posZ - radius, posX + radius, posY + radius, posZ + radius));

          Et finalement tu dis que si cette liste est égal à null (donc si le mob est mort) et une boucle for la taille du tableau de l’inventaire du joueur tu drop les items du tableau au joueur

          Code Java : (Tout sélectionner)

          e.entityPlayer.dropItem(itemIn, size);

          
          je comprend pas ou utiliser cette partie du code :/</entityscorpion>

          “Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire wo…

          1 Reply Last reply Reply Quote 0
          • SCAREX
            SCAREX last edited by

            Règle n°1 du code des développeurs (crée par moi-même 😉 ) : “Ne jamais copier de classe entière ni de morceaux de codes que tu ne comprends pas”.

            à ta place je n’utiliserai pas le canPickUpLoot : il vaut mieux directement transférer l’inventaire du joueur dans l’inventaire du mob avec une boucle for.

            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 Reply Last reply Reply Quote 0
            • P
              PlagueZ last edited by

              @‘SCAREX’:

              Règle n°1 du code des développeurs (crée par moi-même 😉 ) : “Ne jamais copier de classe entière ni de morceaux de codes que tu ne comprends pas”.

              à ta place je n’utiliserai pas le canPickUpLoot : il vaut mieux directement transférer l’inventaire du joueur dans l’inventaire du mob avec une boucle for.

              comment je fait ça un indice une piste un morceau de documentation?
              a la base c’est exactement ce que je veut que le mob en question ai l inventaire du joueur mort mais je doit avouer maitriser beaucoup plus les block, évent, gui que les entité elle me font toujours bien galérer que ce soit pour l animation on pour les IA custom

              “Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire wo…

              1 Reply Last reply Reply Quote 0
              • EmotionFox
                EmotionFox last edited by

                Je me suis rendue compte que c’était con de chercher ton mob au alentour du joueur sachant que de une, ce dernier ne spawn pas forcement à l’endroit de sa mort et de deux que tu voulais que ton mob spawn à l’endroit où le joueur est décédé.

                Donc là du coup il faudrait garder la pos du joueur (player.getPosition()) dans l’event “Living Attack Event” et faire spawn le mob à la recréation du joueur aux coordonnées de sa mort. Enfin pour détecter que le mob n’est plus vivant pas besoin d’une liste juste d’un if (je pense que ça fonctionne) :

                if(scorpion.isDead)
                {}
                

                1 Reply Last reply Reply Quote 0
                • P
                  PlagueZ last edited by

                  ça y est le mob spawn a l’emplacement du joueur reste a faire en sorte que l inventaire du joueur soit a l’intérieur de ce mob et la je vois pas du tout comment faire sachant que je veut pas que le mob récupère uniquement l’armure et les arme du joueur

                  “Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire wo…

                  1 Reply Last reply Reply Quote 0
                  • EmotionFox
                    EmotionFox last edited by

                    Je sais pas vraiment je suis pas habitué au tableau mais ça doit pas être très compliqué comme

                    ItemStack playerInventory[] = {}; //Le tableau
                    

                    Puis le définir genre

                    playerInventory = player.inventory.mainInventory; //Recuperer l'inventaire principale
                    

                    Et enfin pour la boucle c’est simple, ça ce fait comme ça :

                       for(int i = 0; i < playerInventory.length; i++) //Ajouter 1 a i tant que pas supérieur taille tableau
                       {}
                    

                    1 Reply Last reply Reply Quote 0
                    • SCAREX
                      SCAREX last edited by

                      Tu ne veux pas qu’il récupère que ces Items, que veux-tu qu’il récupère d’autre ?

                      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 Reply Last reply Reply Quote 0
                      • EmotionFox
                        EmotionFox last edited by

                        Si justement je lui conseil de faire un tableau contenant l’inventaire du joueur et qui ce rafraichie à chaque fois qu’il prend des dégâts (donc avant ça mort) pour ensuite, utiliser ce tableau lors du spawn en le lisant un par un et en dropant l’item actuel du tableau au joueur quand l’entité “scorpion” est morte.

                        Après je pense qu’il est possible de faire en sorte que le mob contienne les items dans sont propre genre d’inventaire mais que ce soit lui ou le programme ça reviens sensiblement au même, après si il veux que les items pops à l’endroit ou l’entité est morte (d’où l’envie que ce soit le monstre qui porte tout ça) il lui suffit de garder à elle aussi ces coordonnés  pour les utiliser plus tard.

                        Après pour faire ce genre de chose il faut quand même un minimum de connaissance et comprendre quelque base mais je pense avoir bien aidé et avoir fournis une méthode fonctionnelle.

                        Ps: Je donne pas la solution complète en un bloc, d’une parce que c’est pas très instructif (je préfère expliquer chaque manip) et de deux parce que je sais pas gérer les tableaux, notamment les lires donc je risque pas de t’aider à ce niveau désolé cependant internet doit contenir ce genre d’info ,)

                        1 Reply Last reply Reply Quote 0
                        • SCAREX
                          SCAREX last edited by

                          Moi j’aurai utilisé le LivingDeathEvent et dedans j’aurais récupéré les items du joueur pour les passer dans l’inventaire du mob.

                          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 Reply Last reply Reply Quote 0
                          • EmotionFox
                            EmotionFox last edited by

                            Sauf qu’une fois mort les items sont aux sol est non dans l’inventaire je me trompe ?

                            1 Reply Last reply Reply Quote 0
                            • SCAREX
                              SCAREX last edited by

                              @‘EmotionFox’:

                              Sauf qu’une fois mort les items sont aux sol est non dans l’inventaire je me trompe ?

                              Non car l’event est déclenché avant ce qui se passe en vanilla (c’est pour ça que si on annule l’event, l’entité ne meurt pas)

                              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 Reply Last reply Reply Quote 0
                              • P
                                PlagueZ last edited by

                                • A Effacer-

                                “Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire wo…

                                1 Reply Last reply Reply Quote 0
                                • P
                                  PlagueZ last edited by

                                  @‘SCAREX’:

                                  Tu ne veux pas qu’il récupère que ces Items, que veux-tu qu’il récupère d’autre ?

                                  tout les item dans l inventaire du joueur bouffe, potion etc etc

                                  j ai réussi a créé le tableau:http://puu.sh/ihB1d/934e99f19e.png
                                  mais pas a le faire looter j’ai des array out of bounds exception lorsque le mob meurt je supprime le code du loot et je regarde ça demain a tête reposer trop longtemps que je me bat avec le même morceau de code vais tout casser xD

                                  “Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire wo…

                                  1 Reply Last reply Reply Quote 0
                                  • EmotionFox
                                    EmotionFox last edited by

                                    Bon allez, je vais t’aider quand même j’aime pas voir les gens galérer 107 ans, l’essentiel c’est d’apprendre de ces erreurs alors relis le code jusqu’à le comprendre (les commentaires sont là pour ça).

                                    public class TutoEventEmo
                                    {
                                    private BlockPos death; //Position joueur mort
                                    private ItemStack inventory[] = {}; //Le tableau
                                    
                                    @SubscribeEvent
                                    public void whenDeath(LivingDeathEvent e)
                                    {
                                    if(e.entity instanceof EntityPlayer)
                                    {
                                    EntityPlayer player = (EntityPlayer)e.entity;
                                    death = player.getPosition();
                                    
                                    for(int i = 0; i < player.inventory.getSizeInventory(); i++)
                                    {
                                    if(player.inventory.getStackInSlot(i) != null)
                                    {
                                    inventory = new ItemStack[] {player.inventory.getStackInSlot(i)}; //Ajouter tableau chaque item
                                    }
                                    }
                                    
                                    player.inventory.clear(); //Clear inventaire
                                    }
                                    }
                                    
                                    @SubscribeEvent
                                    public void whenSpawn(Clone e)
                                    {
                                    if(e.wasDeath == true) //Si joueur est mort
                                    {
                                    for(int i = 0; i <= 5; i++)
                                    {
                                    if(i == 5)
                                    {
                                    EntityPlayer player = e.entityPlayer;
                                    World world = player.worldObj;
                                    EntityScorpion scorpion = new EntityScorpion(world);
                                    
                                    scorpion.setPosition(death.getX(), death.getY(), death.getZ());
                                    world.spawnEntityInWorld(scorpion);
                                    
                                    if(scorpion.isDead) //Si scorpion est mort
                                    {
                                    for(int j = 0; j < inventory.length; j++) //Selon taille du tableau
                                    {
                                    player.dropItem(inventory*, true, false); //Drop item du tableau au joueur
                                    }
                                    }
                                    }
                                    }
                                    }
                                    }
                                    }
                                    

                                    Voilà, ça devrait marcher après si il y à des erreurs dis le moi et j’essayerais de t’aider (je suis pas du tout familiarisé au tableau) ,)

                                    1 Reply Last reply Reply Quote 0
                                    • robin4002
                                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                                      J’aurai plutôt fait comme ça :

                                      public class TutoEventEmo
                                      {
                                          private BlockPos death; //Position joueur mort
                                          private ItemStack inventory[]; //Le tableau
                                      
                                          @SubscribeEvent
                                          public void whenDeath(LivingDeathEvent e)
                                          {
                                              if(e.entity instanceof EntityPlayer)
                                              {
                                                  EntityPlayer player = (EntityPlayer)e.entity;
                                                  death = player.getPosition();
                                      
                                      inventory = new ItemStack[player.inventory.getSizeInventory()];
                                                  for(int i = 0; i < player.inventory.getSizeInventory(); i++)
                                                  {
                                                      if(player.inventory.getStackInSlot(i) != null)
                                                      {
                                                          inventory* = player.inventory.getStackInSlot(i); //Ajouter tableau chaque item
                                                      }
                                                  }
                                      
                                                  player.inventory.clear(); //Clear inventaire
                                              }
                                          }
                                      
                                          @SubscribeEvent
                                          public void whenSpawn(Clone e)
                                          {
                                              if(e.wasDeath == true) //Si joueur est mort
                                              {
                                                  for(int i = 0; i <= 5; i++)
                                                  {
                                                      if(i == 5)
                                                      {
                                                          EntityPlayer player = e.entityPlayer;
                                                          World world = player.worldObj;
                                                          EntityScorpion scorpion = new EntityScorpion(world);
                                      
                                                          scorpion.setPosition(death.getX(), death.getY(), death.getZ());
                                                          world.spawnEntityInWorld(scorpion);
                                      
                                                          if(scorpion.isDead) //Si scorpion est mort
                                                          {
                                                              for(int j = 0; j < inventory.length; j++) //Selon taille du tableau
                                                              {
                                                                  player.dropItem(inventory*, true, false); //Drop item du tableau au joueur
                                                              }
                                                          }
                                                      }
                                                  }
                                              }
                                          }
                                      }
                                      

                                      ça fonctionnera un peu mieux …
                                      Et la encore le code est perfectible, il faudrait mettre le tableau dans mob en question, sinon il va y avoir des problèmes.

                                      1 Reply Last reply Reply Quote 0
                                      • P
                                        PlagueZ last edited by

                                        j’ ai modifier le code car j avait des erreur a BlockPos et dans le dropItem mais ça fonctionne toujours pas et le mob spawn sur le joueur seulement quand il respawn T_T j’ai une idée pour corriger le spawn du mob par contre il drop toujours pas mon tableau

                                        private ItemStack inventory[]; //Le tableau
                                        
                                        @SubscribeEvent
                                        public void whenDeath(LivingDeathEvent e)
                                        {
                                        if(e.entity instanceof EntityPlayer)
                                        {
                                        EntityPlayer player = (EntityPlayer)e.entity;
                                        
                                        inventory = new ItemStack[player.inventory.getSizeInventory()];
                                        for(int i = 0; i < player.inventory.getSizeInventory(); i++)
                                        {
                                        if(player.inventory.getStackInSlot(i) != null)
                                        {
                                        inventory* = player.inventory.getStackInSlot(i); //Ajouter tableau chaque item
                                        }
                                        }
                                        
                                        player.inventory.clearInventory(null, -1); //Clear inventaire tout les item ingnore les metadata
                                        }
                                        }
                                        
                                        @SubscribeEvent
                                        public void whenSpawn(Clone e)
                                        {
                                        if(e.wasDeath == true) //Si joueur est mort
                                        {
                                        for(int i = 0; i <= 5; i++)
                                        {
                                        if(i == 5)
                                        {
                                        EntityPlayer player = e.entityPlayer;
                                        World world = player.worldObj;
                                        //spawn entityReaper
                                        EntityReaper var2 = new EntityReaper(e.entityLiving.worldObj);
                                        var2.setLocationAndAngles(e.entityLiving.posX, e.entityLiving.posY, e.entityLiving.posZ, e.entityLiving.rotationYaw, e.entityLiving.rotationPitch);
                                        e.entityLiving.worldObj.spawnEntityInWorld(var2);
                                        
                                        if(var2.isDead) //Si scorpion est mort
                                        {
                                        for(int j = 0; j < inventory.length; j++) //Selon taille du tableau
                                        {
                                        player.entityDropItem(inventory*, 0); //Drop item du tableau au joueur
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }
                                        

                                        et quand j’utilise le DropItem() il me dit que les arguments son DropItem(Item, int) et considère que le tableau n’est pas un item

                                        “Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire wo…

                                        1 Reply Last reply Reply Quote 0
                                        • EmotionFox
                                          EmotionFox last edited by

                                          Ah oui effectivement t’es pas en 1.8 je viens de remarquer seulement ça maintenant, du coup je sais pas désolé mon code est fonctionnelle chez moi mais si on a pas la même version tu m’étonne, mais l’important est quand même là, tu connais les bases et sais comment tu doit faire. Essaye de te renseigner sur ce qui pose problème genre tuto, doc etc…

                                          Ps: Si le monstre pop au joueur c’est parce que t’a pas gardé la pos lors de sa mort et que t’a pas changé les positions pour le spawn du monstre ,)

                                          1 Reply Last reply Reply Quote 0
                                          • P
                                            PlagueZ last edited by

                                            Pour le mob j ai déjà solutionné le problème mais pour le tableau ça marche pas T_T je comprend pas a quoi sert la float dans entityDropItem après le itemStack ;S

                                            pour la fonction DropItem(Item,int) je sait que c’est Item, Nombre

                                            je pense pas a une metadata en Float ce serait plutôt étrange ;S
                                            peut être un probabilité de loot j’avoue que avec tout ces field ça me rend dingue U_u

                                              if(var2.isDead) //Si Reaper est mort
                                                               {
                                                                System.out.println("lel");
                                                                   for(int j = 0; j < inventory.length; j++) //Selon taille du tableau
                                                                   {
                                                                       player.entityDropItem(inventory*, 110); //Drop item du tableau au joueur
                                                                       System.out.println(inventory*);
                                                                   }
                                                               }
                                            

                                            ne s’execute carrément pas a la mort du mob je creuse un peu on est pret du but

                                            “Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire wo…

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • First post
                                              Last post
                                            Design by Woryk
                                            Contact / Mentions Légales

                                            MINECRAFT FORGE FRANCE © 2018

                                            Powered by NodeBB