Résolu Récupérer le "lanceur" d'une flèche
-
Bonjour tout le monde, ça fait longtemps que je n’ai pas posté dans cette partie du forum mais là je suis vraiment bloqué et j’ai besoin de votre aide
donc, comme le titre l’indique, j’aurais besoin de pouvoir récupérer le joueur qui est à l’origine de l’envoi de la flèche. J’ai cherché dans la classe de la flèche mais il n’y a rien
mon code actuel :
public class BowHandler { @SubscribeEvent public void onArrowSpawned(LivingSpawnEvent event) { if (event.entity instanceof EntityArrow) { EntityArrow arrow = (EntityArrow) event.entity; } } }
(pour ceux qui voudraient le savoir, je fais un mod qui rajoute des enchantements)
-
Regarde dans les tags NBT de l’entité, je pense qu’il doit y avoir l’auteur de la flèche
-
Hum tu veux en faire quoi ? (L’enchantement permettra de faire quoi ?)
J’ai déjà vu comment récupérer la flèche mais c’était côté client :sEdit pour utybo : apparemment cela n’y est pas dans les NBT
-
J’essaie de faire un enchant qui permet de faire en sorte que les flèches soit explosives
-
Je vois pas de rapport avec le player
Tu dis que si l’arc à l’enchant ça utilise une entité(flèche) qui explose ._. non ? -
Effectivement pas besoin de traquer l’auteur de la flèche pour ça
Si tu cherches à savoir si la flèche est sur le sol ou non, c’est un tag NBT, ça j’en suis sûr -
Si tu cherches à savoir si la flèche est sur le sol ou non, c’est un tag NBT, ça j’en suis sûr
Oui effectivement lorsque tu créera l’entité de la flèche explosive tu as :
public void onUpdate() { super.onUpdate(); if (this.inGround) { //Je te laisse deviner ^^ } }
-
Tu condition ne sera jamais vrai car la flèche n’est pas extends EntityLiving.
Et dans la classe de la flèche tu as ça :
public Entity shootingEntity;
Vérifie juste que l’entity n’est pas null, si elle est tiré par un dispenser, elle sera null. -
Robin : ma condition est vrai parce que le event.entity retourne une Entity, pas une EntityLivingBase
mais merci à toi et a tous les autres
-
Non, ça ne fonctionnera pas non plus, l’événement LivingSpawnEvent n’est que appelé dans les entités vivantes.
En revanche, ça :@SubscribeEvent public void onArrowSpawned(EntityJoinWorldEvent event) { if(event.entity instanceof EntityArrow) { EntityArrow arrow = (EntityArrow)event.entity; System.out.println("flèche"); } }
ça fonctionne
-
Ah ok merci
Edit : il se passe un truc assez bizarre
avec ce code :
@SubscribeEvent public void onArrowSpawned(EntityJoinWorldEvent event) { if (event.entity instanceof EntityArrow) { EntityArrow arrow = (EntityArrow) event.entity; if (arrow.shootingEntity != null) { System.out.println("flèche" + arrow.shootingEntity); } else { System.out.println("flèche sans lanceur :'("); } } }
dans les logs ça donne ça :
flèche EntityPlayerMP['Player867'/193, l='New World', x=-941,55, y=4,00, z=603,81] flèche sans lanceur :'(
en gros, il fait le if et le else ? o_O on m’explique s’ils vous plait ?
-
Client / Serveur …
-
ah ok x)
Edit : merci beaucoup tout le monde, spécialement Robin, mais maintenant je me trouve confronté à un autre problème : commet détecter si la flèche a atteint sa cible (entité ou bloc) ?
-
NBTTag : “inTile” (sur un bloc) et
arrow.isDead (entité, il me semble)
^^ -
J’ai testé ça, mais je ne peux tester ça qu’une seule fois dès le début de l’event (donc ça ne marcheras pas). Une boucle while semble adaptée mais fait complètement bugger le jeu
-
La seule solution que je vois, c’est mettre un tag dans l’entity data lors du lancement si le joueur à l’enchantement.
Ensuite avec un event fml :@SubscribeEvent public void onWorldTick(TickEvent.WorldTickEvent event) { for(Object o : event.world.loadedEntityList) { if(o instanceof EntityArrow) { EntityArrow arrow = (EntityArrow)o; if(arrow.getEntityData().hasKey("explosion")); { // … } } } }
C’est la seule solution que je vois, et niveau performance ça risque d’être pas génial
-
d’accord, j’essaye
Edit : bon ben je laisse tomber hein ^^