Plugin Résolu [Mon plugin] Supprimer flèches, effets de potion et particules

iKreal

Poseur de cobblestone
30 Octobre 2015
40
2
23
21
Bonjour,
Je suis débutant dans la programmation Java et de plugins Minecraft et je souhaite faire une arme à feu, précisément un pistolet, et j'ai plusieurs problèmes avec celui-ci. Tout d'abord, voici l'événement déclenchant le lancement de "balles" (ici des flèches) (l'événement est bien enregistré) :
Code:
@EventHandler
    public void onInteract(PlayerInteractEvent event) {
       
        Player player = event.getPlayer();
        Action action = event.getAction();
        ItemStack it = event.getItem();
        Location ploc = player.getLocation();

        if(it == null) return;
       
        if(it.getType() == Material.WOOD_HOE && it.hasItemMeta() && it.getItemMeta().hasDisplayName() && it.getItemMeta().getDisplayName().equalsIgnoreCase("§fPistol")) {
            if(action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) {
                player.launchProjectile(Arrow.class, ploc.getDirection().normalize().multiply(8));

            }
        }
    }
Les problèmes sont les suivants :
1 - Comment faire disparaître la flèche lancée une fois qu'elle touche un bloc ou une entité ?
2 - Je souhaiterais également rendre la flèche invisible, puisqu'en réalité c'est une balle et je ne sais pas comment le faire (j'ai pourtant essayé)
3 - Enfin, j'aimerais aussi que des particules apparaissent sur la flèche en vol

Alors pour la première question, j'avais pensé à faire ceci :
Code:
@EventHandler
    public void onProjectileHit(ProjectileHitEvent event) {
        Entity entity = event.getEntity();
        if (entity.getType() == EntityType.ARROW) {
            entity.remove();
        }
    }
Mais ici toutes les flèches sont prises en compte, et pas uniquement celles lancées par l'arme à feu.

Merci à ceux qui ont pris le temps de lire, et merci à ceux qui m'aideront ! :)
 

Cercus

Un modérateur chat trop mignon
Staff
Modérateur
6 Octobre 2013
792
77
152
24
Au lieu de PlayerInteractEvent et ProjectileHitEvent, utilises EntityShootBowEvent

Pour rendre ta flèche invisible, tu lui applique l'effet de potion invisibilité comme c'est considérée comme une entité
 
Dernière édition:

iKreal

Poseur de cobblestone
30 Octobre 2015
40
2
23
21
Merci pour ta réponse, mais je sais bien qu'il fallait ajouter un effet de potion, seulement, comment je récupères cette flèche particulièrement, et pour que l'effet d'invisibilité ne soit pas appliqué sur une flèche tirée à l'arc ?

Edit : Si je remplace par l'événement EntityShootBowEvent, je ne peux plus récupérer le joueur et l'item dans sa main. Comment faire ?
 
Dernière édition:

iKreal

Poseur de cobblestone
30 Octobre 2015
40
2
23
21
Attends, qu'on soit bien d'accord, l'objet qui permet de tirer est considéré comme un "arc" mais ce n'en est pas un ? (Car j'utilise une houe)
 

Cercus

Un modérateur chat trop mignon
Staff
Modérateur
6 Octobre 2013
792
77
152
24
Ah je croyais un arc. Je vois cela demain
 

ShE3py

Développeur en autodidacte
Support
26 Septembre 2015
2 507
57
353
247
20
Mìlhüsa
Player#launchProjectile renvoie l'entité créée.
Après, soit tu ajoutes un NBTTag à cette flèche, soit tu ajoutes son ID dans une List, pour vérifier après quand la flèche touche quelque chose qu'elle a bien le tag/qu'il soit dans la liste.

Pour les particules l'évènement EntityMove devrait convenir.
Je suis en vacances je ne peut pas tester en local, mais je rentre demain soir pour tester. Les noms de classes/fonctions peuvent différer.

Cordialement,
ShE3py

P.S: Entity#getNBTTag() est @Nullable, il peut falloir le créer.
 

iKreal

Poseur de cobblestone
30 Octobre 2015
40
2
23
21
Bonsoir,
En fait j'ai du mal à récupérer des variables d'autres méthodes je crois...
Voici le code :
Code:
@EventHandler
    public void onInteract(PlayerInteractEvent event) {
       
        Player player = event.getPlayer();
        Action action = event.getAction();
        ItemStack it = event.getItem();
        Location ploc = player.getLocation();
         
        if(it == null) return;
       
        if(it.getType() == Material.WOOD_HOE && it.hasItemMeta() && it.getItemMeta().hasDisplayName() && it.getItemMeta().getDisplayName().equalsIgnoreCase("§fPistol")) {
            if(action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) {
                Arrow arrow = player.launchProjectile(Arrow.class, ploc.getDirection().normalize().multiply(8));

                ArrayList pistolarrowlist = new ArrayList();
                pistolarrowlist.add(arrow.getEntityId());

            }
        }
    }
Maintenant, si j'ai bien compris, il faut récupérer l'objet de la liste pour supprimer la flèche quand elle touche quelque chose.
Donc l'événement est le suivant :
Code:
@EventHandler
    public void onProjectileHit(ProjectileHitEvent event) {

    }
Pour faire le tour d'une liste, il faut écrire :
Code:
for(int i = 0; i < pistolarrowlist.size(); i++)
Mais si je mets ça dans l'événement ProjectileHitEvent, je ne peux pas récupérer la liste, si ?
Je ne sais pas comment faire :/