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.
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.