Plugin Résolu [1.8.9]Comment savoir la vie des joueurs toucher a l'arc ?

ShayFox_

Pack de texture & Plugin maker
1 Mars 2020
38
1
3
8
Hey,
Je pense que le titre explique bien ce que je recherche mais je vais repréciser, donc je programme un plugin et j'aimerais bien faire en sorte que quand une personne est toucher par l'une des flèches que nous avons tiré nous voyons dans notre actionbar le message ci: "<Pseudo> est à <vieenpourcent> % de vie.
Mais jusque là je n'arrive pas a faire la partie qui détecte la vie du joueur tout le reste sinon j'y arrive, une âme charitable pourrait m'aider ?
Ps: je laisse le commencement de mon script


@EventHandler
public void damagebyarrow(EntityDamageByEntityEvent e){
if(e.getDamager() instanceof org.bukkit.entity.Arrow && e.getEntity instanceof Entity) {
Projectile arrow = (Projectile)e.getDamager();
Entity shot = (Entity)e.getEntity();
If (arrow.getShooter() instanceof Player){
Player shouter = (Player) arrow.getShooter();
Title.sendActionBar(shouter, " §e"+shot.getName()+" est à "+((Damageable) shot).getHealth()+" % de sa vie");
}}}}

Voilà désoler pour le fait que se soit pas mis sous code mais je n'y arrivais pas et aussi je détecte les entité et non les joueur pour mes phase de test (que je puisse tester mon code sur les mob pour voir si ça marche) et mon problème ici c'est que déjà ce n'est pas en pourcentage et aussi ça indique la vie avant que la flêche le touche donc par exemple 20hp.
Voilà j'éspère avoir été claire et merci !!
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Bonjour !

Je ne sais pas si cela réglera le problème, mais lorsque tu récupère l'entité qui a tiré, tu cast bien shouter en tant que Player, mais par contre lorsque tu défini shot, tu précise que c'est une entité. Or, (il me semble faut vérifier) que les joueurs sont aussi des entités, ce qui veut dire que tu peux probablement faire quelque chose comme :

Player shot = (Player) e.getEntity();

AlexFatta
 
  • J'aime
Reactions: Fau8

Fau8

Architecte en herbe
20 Février 2017
169
1
10
126
Hey,
Je pense que le titre explique bien ce que je recherche mais je vais repréciser, donc je programme un plugin et j'aimerais bien faire en sorte que quand une personne est toucher par l'une des flèches que nous avons tiré nous voyons dans notre actionbar le message ci: "<Pseudo> est à <vieenpourcent> % de vie.
Mais jusque là je n'arrive pas a faire la partie qui détecte la vie du joueur tout le reste sinon j'y arrive, une âme charitable pourrait m'aider ?
Ps: je laisse le commencement de mon script


@EventHandler
public void damagebyarrow(EntityDamageByEntityEvent e){
if(e.getDamager() instanceof org.bukkit.entity.Arrow && e.getEntity instanceof Entity) {
Projectile arrow = (Projectile)e.getDamager();
Entity shot = (Entity)e.getEntity();
If (arrow.getShooter() instanceof Player){
Player shouter = (Player) arrow.getShooter();
Title.sendActionBar(shouter, " §e"+shot.getName()+" est à "+((Damageable) shot).getHealth()+" % de sa vie");
}}}}

Voilà désoler pour le fait que se soit pas mis sous code mais je n'y arrivais pas et aussi je détecte les entité et non les joueur pour mes phase de test (que je puisse tester mon code sur les mob pour voir si ça marche) et mon problème ici c'est que déjà ce n'est pas en pourcentage et aussi ça indique la vie avant que la flêche le touche donc par exemple 20hp.
Voilà j'éspère avoir été claire et merci !!
Ce code devrait être utile :
Java:
public class Switch
  implements Listener
{
    public Switch(Core core) {}
  
  @SuppressWarnings("deprecation")
@EventHandler(priority=EventPriority.HIGH)
  public void DamageEvent(EntityDamageByEntityEvent entity)
  {
    if ((entity.getDamager() instanceof Arrow))
    {
      Arrow arrow = (Arrow)entity.getDamager();
      if ((arrow.getShooter() instanceof Player))
      {
        Player player = (Player)arrow.getShooter();
      
        Damageable pl = (Damageable)entity.getEntity();
        if ((pl instanceof Player))
        {
          Player v = (Player)pl;
          double ptviev = pl.getHealth();
          Integer damage = Integer.valueOf((int)entity.getFinalDamage());
          if (!pl.isDead())
          {
            Integer realHealth = Integer.valueOf((int)(ptviev - damage.intValue()));
            if (realHealth.intValue() > 0) {
              
                Location pl1 = player.getLocation();
                player.playSound(player.getLocation(),Sound.ENDERMAN_TELEPORT, 1, 1);
                v.playSound(v.getLocation(),Sound.ENDERMAN_TELEPORT, 1, 1);
                player.teleport(v);
                v.teleport(pl1);

            }
          }
        }
      }
    }
  }
}
Source : https://www.spigotmc.org/threads/how-to-detect-if-the-arrow-has-damaged-the-player.216857/

Pour ton pourcentage, tu as juste à faire :
Code:
"La vie du joueur" * 100/20
 

ShayFox_

Pack de texture & Plugin maker
1 Mars 2020
38
1
3
8
Merci à vous deux pour votre rapidité grâce à vous mon problème à trouvé solution !!
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
455
247
21
Mìlhüsa
Bonsoir,

J'avais déjà commencé à rédiger avant que tu passes le sujet en résolu, je pense quand même ce que j'ai fait car le code est légèrement plus propre, et ne contient pas 50 accolades fermantes.
Java:
public class EntityDamageByEntityHandler implements Listener {
   @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
   public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
      Entity damager = e.getDamager();
      if(!(damager instanceof Arrow))
         return;
      
      ProjectileSource projectileShooter = ((Projectile) damager).getShooter();
      if(!(projectileShooter instanceof Player))
         return;
      
      Entity attackedEntity = e.getEntity();
      if(!(attackedEntity instanceof Player))
         return;
      
      Player shooter = (Player) projectileShooter;
      Player attacked = (Player) attackedEntity;
      
      //noinspection ConstantConditions
      double maxHealth = Math.ceil(attacked.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
      double currentHealth = Math.ceil(attacked.getHealth());
      
      if(currentHealth < -0d)
         return;
      
      String text =
         "§e"
         + shooter.getName()
         + " est à "
         + (int) Math.ceil((currentHealth / maxHealth) * 100)
         + "% de sa vie";
      
      shooter.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(text));
   }
}

Pour commenter un peu, j'ai mis la priorité de l'évènement en MONITOR, qui est la plus haute priorité, ce qui force la fonction à être appelée après tous les autres plugins. L'on met généralement HIGHEST pour cela, mais puisque dans notre cas l'on ne modifie pas l'évènement, on peut se permettre de prendre la plus haute priorité.

Bon sinon j'ai aussi fait des arrondis supérieurs, cela évite que le joueur ait 0.9 PV et qu'il affiche 0, le (cast) d'un nombre à virgule vers un nombre entier enlève simplement tous les nombres après la virgule, ce qui équivaut à un arrondi inférieur pour les nombres positifs.

Cordialement,
ShE3py.
 

ShayFox_

Pack de texture & Plugin maker
1 Mars 2020
38
1
3
8
merci à toi pour ce code aussi complet !

Après avoir tester malgré quelque petite erreur de ta part comme par exemple a la fin ou tu met le nom du shooter au lieu de celui de la victime et le getAttribute() qui n'existe pas et que j'ai donc remplacer par getMaxHealth() ton code affiche la vie du joueur avant la flêche prise donc un joueur peut être mort de la flêche mais afficher 20% je sait pas si tu m'a compris en tout cas j'en suis venue a un autre code qui marche très bien donc tes effort non pas servie a rien et je t'en remercie, si tu veut que je te montre mon code demande le moi (par contre faudrais que j'arrive a comprendre leur système de code sur ce site) Sur ce Bonne soirée !
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
455
247
21
Mìlhüsa
Effectivement erreur d'étourderie, j'ai oublié de soustraire des dégâts de la flèche.
Java:
double currentHealth = Math.ceil(attacked.getHealth() - e.getFinalDamages());


Bon après que tu prennes un autre code ça ne me dérange pas du tout, l'essentiel est un peu de te montrer que les évènements peuvent avoir des priorités qui permettent d'avoir des comportements plus justes s'il y a beaucoup d'autres plugins, dans ce cas-là avec la priorité par défaut le plugin ne prendrait pas en compte des modifications de dégâts d'autres plugins qui auraient une priorité haute ou supérieure, et ça permet aussi de voir d'autres styles d'écriture, par ex. de faire un return au lieu d'un if imbriqué.

Sinon pour insérer du code sur le forum, tu dois passer par la barre d'outils :
1591306047639.png


En sélectionnant « Java » comme langage pour avoir la coloration syntaxique.