2017-04-03 33 views
0

我正在创建一个PvP插件,但我无法继续,因为我有一个令人讨厌的演员问题,我无法解决。我试图让最后损害的原因,则销毁器,检查是否在销毁使用,转换“箭头”到射手。但它不断给我在我的控制台的错误。Bukkit/Spigot - EntityDamageByEntityEvent:投射手

因此,这里是我的代码

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.."); 
    } 
} 

我为什么要箭头转换成射手的原因是因为我想显示一条消息,射手,和几个其他的事情。

这是错误

[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 

我希望有人能帮助我这个

回答

1

这可能会或可能无法正常工作,还没有测试它自己。但是在投射之前你需要检查它是否是一个箭头。同样为了获得射手,弹箭类中的方法arrow.getShooter()可以被箭头使用。

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.."); 
     } 
} 

如果没有帮助,请让我知道第102行是什么。

+0

第102行:玩家damager =(玩家)entitydamager; –

+0

当玩家的Y <= 10时,这条线被称为 –

+0

我添加了ProjectileSource射手= arrow.getShooter();但是当我尝试使用这个时它给了我一个错误:shooter.sendmessage();.它说:“sendMessage(String)方法未定义类型ProjectileSource”。 –

1

以下是测试解决方案的摘录,以通知玩家彼此互相射击。这应该可以帮助你。

@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()); 
}