2017-04-03 1 views
0

Je crée un plugin PvP, mais je ne peux pas continuer parce que j'ai un problème de casting ennuyeux que je ne peux pas résoudre. Je suis en train d'obtenir la dernière cause des dommages, la damager, vérifiez si le damager utilisé un Flèche, convertir la « flèche » dans le jeu de tir . Mais il me donne constamment des erreurs dans ma console.Bukkit/Spigot - EntityDamageByEntityEvent: lancer le shooter

Alors, voici mon code

Player player = (Player)event.getPlayer(); // this variable is in my public void onPlayerMovement event 
if(((EntityDamageByEntityEvent) player.getLastDamageCause()).getDamager() instanceof Arrow) 
{ 
    Arrow arrow = (Arrow) ((EntityDamageByEntityEvent) player.getLastDamageCause()).getDamager(); 
    ProjectileSource shooter = ((ProjectileSource) ((EntityDamageByEntityEvent) player.getLastDamageCause()).getDamager()); 

    if(shooter instanceof Player) // checking if the shooter is a player. 
    { 
     shooter.sendMessage("You hitted someone with a bow right?"); 
     player.sendMessage("You got hit by a bow.."); 
    } 
} 

La raison pour laquelle je veux convertir la flèche dans le jeu de tir est parce que je veux afficher un message au tireur, et deux autres choses.

C'est l'erreur

[22:39:10 ERROR]: Could not pass event PlayerMoveEvent to FendykPVP v1.8 
    org.bukkit.event.EventException 
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:270) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInPosition.a(SourceFile:57) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_121] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_121] 
    at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121] 
Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_8_R3.entity.CraftArrow cannot be cast to org.bukkit.entity.Player 
    at GameCore.playerKill.onPlayerMovement(playerKill.java:102) ~[?:?] 
    at sun.reflect.GeneratedMethodAccessor1391.invoke(Unknown Source) ~[?:?] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_121] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_121] 
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.8.8.jar:git-Spigot-21fe707-e1ebe52] 
    ... 15 more 

J'espère que quelqu'un peut me aider avec ce

Répondre

1

Cela peut ou peut ne pas fonctionner, n'ont pas testé moi-même. Mais vous devez vérifier si c'est une flèche avant de la lancer. Aussi pour obtenir le tireur il y a la méthode arrow.getShooter() dans la classe de projectile qui peut être utilisée par la flèche.

if(((EntityDamageByEntityEvent) player.getLastDamageCause()).getDamager() instanceof Arrow) { 
    Arrow arrow = (Arrow) ((EntityDamageByEntityEvent) player.getLastDamageCause()).getDamager(); 
    ProjectileSource shooter = arrow.getShooter(); 

     if(shooter instanceof Player) // checking if the shooter is a player. 
     { 
      Player shooterPlayer = (Player) shooter; 
      shooterPlayer.sendMessage("You hitted someone with a bow right?"); 
      player.sendMessage("You got hit by a bow.."); 
     } 
} 

Si cela ne vous aide pas, faites-moi savoir ce que la ligne 102 est.

+0

Ligne 102: Player damager = (Joueur) entitydamager; –

+0

Cette ligne est appelée quand Y <= 10 –

+0

J'ai ajouté ProjectileSource shooter = arrow.getShooter(); mais cela me donne une erreur quand j'essaie d'utiliser ceci: shooter.sendmessage() ;. Son dit: "la méthode sendMessage (String) n'est pas définie pour le type ProjectileSource". –

1

Ce qui suit est un extrait d'une solution testée pour avertir les joueurs lorsqu'ils se tirent dessus. Cela devrait vous aider.

@EventHandler 
public void onEntityDamageByEntity(EntityDamageByEntityEvent evt) { 
    // Is target a player, if not stop 
    if (!(evt.getEntity() instanceof Player)) 
     return; 

    Player damagee = (Player) evt.getEntity(); 

    // Is damager an arrow, if not stop 
    if (!(evt.getDamager() instanceof Arrow)) 
     return; 

    // Is shooter a player, if not stop 
    ProjectileSource src = ((Arrow) evt.getDamager()).getShooter(); 
    if (!(src instanceof Player)) 
     return; 

    Player damager = (Player) src; 
    damager.sendMessage("You just shot " + damagee.getName()); 
    damagee.sendMessage("You were shot by " + damager.getName()); 
}