Détruire les entités d'item environnantes


  • Correcteurs

    Bonjour, je constate qu'il serait intéressant de rajouter une fonctionnalité à mon mod, un item qui permettent de faire disparaître des entités d'items au sol autour d'eux.

    En gros, ça pvp, ça fait un kill et ensuite ça veut empêcher la victime de revenir chercher son stuff.

    J'ai testé le système exposé dans l'un des tutos sur les items afin de détecter des entités environnantes, mon soucis doit être que je ne cherche pas à détecter la bonne chose, je ne comprend pas trop comment fonctionne la classe EntityItem.

    Voici mon code actuel:

    @Override
        public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
        {
            int metadata = stack.getItemDamage();
    
    //[…]
    
             if(metadata == 2)
            {
                IEntitySelector filter;
                filter = new IEntitySelector()
                {
                    @Override
                    public boolean isEntityApplicable(Entity entity)
                    {
                        if(entity instanceof EntityItem)
                        {
                            return true;
                        }
                    return false;
                    }
                };
                @SuppressWarnings("rawtypes")
                List entitythisList = player.worldObj.selectEntitiesWithinAABB(EntityLivingBase.class, player.boundingBox.expand(3.D, 1.0D, 3.0D), filter);
                for(Object entity : entitythisList)
                {                    
                    EntityItem item = (EntityItem)entity;
                    item.setDead();
                }            
                return false;
            }
    

  • Moddeurs confirmés Rédacteurs

    
    List <entityitem>entitythisList = player.worldObj.selectEntitiesWithinAABB(EntityItem.class, new AxisalignedBB(player.getPosition()).expand(3.D, 1.0D, 3.0D));
    for(EntityItem entity : entitythisList)
    {
    entity.setDead();
    }
    
    

    Je peux pas vérifier si c'est marche mais ça devrait avec ça seulement
    (Adapte pour la 1.7) je suis sur portable, le java avec un correcteur d'orthographe c'est moyen</entityitem>


  • Correcteurs

    ça me fait une erreur sur le getPosition, en me proposant de compléter avec un float en argument (ou de mettre "getBedLocation(…)", merci Eclipse).

    J'ai essayé avec
    Vec3.createVectorHelper(player.posX, player.posY + (player.getEyeHeight() - player.getDefaultEyeHeight()), player.posZ)

    ou même 1.0F ou encore "hitX"

    ça marque en gros constructeur "AxisAlignedBB(Vec3)" indéfinis dans chaque cas.


  • Moddeurs confirmés Rédacteurs

    Dès que suis sur mon PC, je te donne le code pour la 1.7



  • List <entityitem>entitythisList = player.worldObj.selectEntitiesWithinAABB(EntityItem.class, new AxisalignedBB(player.getPosition()).expand(3.D, 1.0D, 3.0D));
    –->
    List <entityitem>entitythisList = player.worldObj.selectEntitiesWithinAABB(EntityItem.class, player.getBoudingBox().expand(3.D, 1.0D, 3.0D));</entityitem></entityitem>


  • Correcteurs

    List <entityitem>entitythisList = player.worldObj.selectEntitiesWithinAABB(EntityItem.class, player.getBoundingBox().expand(3.D, 1.0D, 3.0D));
                for(EntityItem entity : entitythisList)
                {                    
                    entity.setDead();
                }
    

    Erreur sur "selectEntitiesWithinAABB" car il veut rajouter le paramètre IEntitySelector.
    Ou bien changer par "getEntitiesWithinAABB"</entityitem>


  • Moddeurs confirmés Rédacteurs

    Remplace par getEntitiesWithinAABB dans ce cas


  • Correcteurs

    J'avais testé mais du coup ça me fait crash NPE sur la ligne
    "List <entityitem>entitythisList = player.worldObj.getEntitiesWithinAABB(EntityItem.class, player.getBoundingBox().expand(3.D, 1.0D, 3.0D));"</entityitem>


  • Moddeurs confirmés Rédacteurs

    List <entityitem>entitythisList = player
    .worldObj
    .getEntitiesWithinAABB(EntityItem.class, player
    .getBoundingBox()
    .expand(3.D, 1.0D, 3.0D));
    

    Pour voir où est le NPE</entityitem>


  • Correcteurs

    Le NPE est sur l'expand


  • Moddeurs confirmés Rédacteurs

    Parce que player.getBoundingBox retourne null (ctrl + clic)

    
    List <entityitem>entities = player.worldObj.getEntitiesWithinAABB(EntityItem.class,
    AxisAlignedBB.getBoundingBox(player.posX - 3, player.posY, player.posZ - 3,
    player.posX + 3, player.posY + 2, player.posZ + 3));
    for(EntityItem entity : entities) {
    entity.setDead();
    }
    
    ```</entityitem>

  • Correcteurs

    Ok c'est nice ça. Ce code est fonctionnel.

    Du coup je me suis demandé comment rajouter un .class en plus comme argument, pour le moment la fonction que je voulais avoir est bien exécuté, mais bon ce principe de détecter ce qu'il y a dans une boundingBox d'un joueur ça offre pas mal de possibilités en fait.

    J'ai tenté

    […].getEntitiesWithinAABB(EntityItem.class || EntityAutre.class , […]
    

    Mais la fonction n'est pas bonne.
    Il faudrait refaire une liste à chaque fois? Ou ça rejoint le ISelector?


  • Moddeurs confirmés Rédacteurs

    Avec un ISelector ça devrait marcher (flemme de tester) mais surtout n'utilise pas player.getBoundingBox()
    Dans le sélecteur tu vérifie si l'entité est soit un item, soit un zombie, soit un chat, etc … tout ce que tu veux.


  • Correcteurs

    Ouki ça roule ^^

    Merci pour le coup de main.


Log in to reply