Résolu Détruire les entités d'item environnantes
-
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; }
-
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> -
ç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.
-
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> -
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> -
Remplace par getEntitiesWithinAABB dans ce cas
-
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> -
List <entityitem>entitythisList = player .worldObj .getEntitiesWithinAABB(EntityItem.class, player .getBoundingBox() .expand(3.D, 1.0D, 3.0D));
Pour voir où est le NPE</entityitem>
-
Le NPE est sur l’expand
-
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>
-
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? -
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. -
Ouki ça roule ^^
Merci pour le coup de main.