Appliquer des dégâts / déclencher des évènements lorsqu'une boule de neige touche un joueur.

TetraCmoi

Aventurier
16 Août 2024
1
0
1
21
Bonjour,

Je suis entrain de développer un plugin pour un serveur en 1.8, et j'ai besoin d'appliquer des dégâts à un joueur qui reçoit une boule de neige. J'ai déjà essayer 2 méthodes:
-Détecté les instances de dégâts de boule de neige, ça n'a pas marché, après investigation, le plugin ne détecte jamais les dégâts de boule de neige:
-Traquer la position de la boule de neige et lorsqu'elle est assez proche d'un joueur, lui appliquer des dégâts. Cela n'a pas marché non plus. Voici le code utiliser pour cette dernière méthode:
private void startSnowballTracking() {
new BukkitRunnable() {
@Override
public void run() {
Player player = getPlayer();
for (Entity entity : player.getWorld().getEntities()) {
if (entity instanceof Snowball) {
player.sendMessage("Snowball detected");
Snowball snowball = (Snowball) entity;
if (snowball.getShooter() instanceof Player) {
Player shooter = (Player) snowball.getShooter();
player.sendMessage("Snowball shooter: " + shooter.getName());
if (shooter.equals(player)) {
player.sendMessage("Shooter is Gon player");
if (FEUILLE_ITEM_NAME.equals(snowball.getCustomName())) {
player.sendMessage("Feuille Snowball detected");
// Vérifier la proximité avec les autres joueurs
for (Player target : Bukkit.getOnlinePlayers()) {
if (!target.equals(player)) {
player.sendMessage("Checking distance to " + target.getName());
// Utiliser un vecteur directionnel pour la collision
Vector toTarget = target.getLocation().toVector().subtract(snowball.getLocation().toVector());
double dot = toTarget.dot(snowball.getVelocity().normalize());
player.sendMessage("Dot product: " + dot + ", Distance squared: " + toTarget.lengthSquared());
// Seuil de détection basé sur le dot product
if (dot > 0 && toTarget.lengthSquared() < 0.25) { // 0.25 est une valeur ajustée pour la détection
player.sendMessage("Collision detected with " + target.getName());
applyTrueDamage(target, 2); // Infliger 1 cœur de dégâts (2 points)
snowball.remove(); // Supprimer la boule de neige après avoir infligé des dégâts
break;
}
}
}
} else {
player.sendMessage("Snowball is not a Feuille Snowball");
}
}
} else {
player.sendMessage("Shooter is not a player");
}
}
}
}
}.runTaskTimer(plugin, 0L, 1L); // Exécuter toutes les 1 tick
}

Donc voila je suis ouvert à toute solution.
 
Bonjour,

Lorsque tu lances un projectile, celui-ci ne prend pas le nom de l'item.
Java:
private final List<UUID> snowballs = new ArrayList<>();

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onProjectileLaunch(ProjectileLaunchEvent e) {
    Projectile projectile = e.getEntity();
   
    if(projectile.getShooter() instanceof Player p) {
       ItemStack stack = p.getInventory().getItemInMainHand();
       ItemMeta meta = stack.hasItemMeta() ? stack.getItemMeta() : null;
       
        // Généralement on fait plutôt `x.equals(CONSTANTE)` que `CONSTANTE.equals(x)`,
        // et tout le `if` serait plutôt un `if(isMySnowball(stack)) { ... }`
       if(stack.getType() == Material.SNOWBALL && meta != null && meta.hasDisplayName() && meta.getDisplayName().equals("/* Nom */")) {
          this.snowballs.add(projectile.getUniqueId());
       }
    }
}

@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
    if(this.snowballs.remove(e.getDamager().getUniqueId())) {
       e.setDamage(2 /* FIXME: Utiliser une constante */);
    }
}

Cordialement,
ShE3py