Problem with EntityDeathEvent

Discussion in 'Plugin Development' started by Drakonix, Nov 30, 2011.

Thread Status:
Not open for further replies.
  1. Offline

    Drakonix

    I'm creatting a small PVP rewarding plugin. And it doesn't work.
    This is my code.

    Code:JAVA
    1.  
    2. public class entityListener extends EntityListener
    3. {
    4. @SuppressWarnings("unused")
    5. private final Kill4Reward plugin;
    6.  
    7.  
    8. public entityListener(Kill4Reward plugin)
    9. {
    10. this.plugin = plugin;
    11. }
    12.  
    13. @Override
    14. public void onEntityDeath (EntityDeathEvent event)
    15. {
    16. if (event instanceof PlayerDeathEvent) {
    17. Player attacker = (Player) ((EntityDamageByEntityEvent) event.getEntity().getLastDamageCause()).getDamager();
    18. Player victim = (Player) event.getEntity();
    19. Kill4Reward.economy.depositPlayer(attacker.getName(), 10);
    20. attacker.sendMessage(ChatColor.RED + "You killed" + victim + "and obtained 10");
    21.  
    22. }
    23.  
    24. }
    25. }
    26.  

    Any solution? :)
    Thanks for help.

    //EDIT
    no errors, at console.
     
  2. Offline

    Jogy34

    For precautions do this:
    Code:
    public void onEntityDeath (EntityDeathEvent event)
    {
    if (event instanceof PlayerDeathEvent) {
    Player attacker = ((EntityDamageByEntityEvent) event.getEntity().getLastDamageCause()).getDamager();
    Player victim = event.getEntity();
    if((attacker instanceof Player) && (victim instanceof Player))
    {
    Kill4Reward.economy.depositPlayer(attacker.getName(), 10);
    attacker.sendMessage(ChatColor.RED + "You killed" + victim + "and obtained 10");
    }
    }
    
    That will guard against trying to cast a creeper, spider, ghast, zombie, etc... as a Player.
     
  3. Offline

    bleachisback

    but you "cast"(Not really since you just try and convert Entity to Player without a cast) before the if statement...
     
  4. Offline

    Drakonix

    Something like this ?

    Code:JAVA
    1.  
    2. @Override
    3. public void onEntityDeath (EntityDeathEvent event)
    4. {
    5. if (event instanceof PlayerDeathEvent) {
    6. Entity eventEntity = ((EntityDamageByEntityEvent) event.getEntity().getLastDamageCause()).getDamager();
    7. Player victim = (Player) event.getEntity();
    8. if(eventEntity instanceof Player){
    9. Kill4Reward.economy.depositPlayer(((Player) eventEntity).getName(), 10);
    10. ((Player) eventEntity).sendMessage(ChatColor.RED + "You killed" + victim + "and obtained 10");
    11. }
    12.  
    13. }
    14.  
    15. }
    16.  
     
  5. Offline

    bleachisback

    Yes, that's better, but you're also casting into an EntityDamageByEntityEvent when you don't know if the last damage someone took was from an Entity
     
    Drakonix likes this.
  6. Offline

    Drakonix

    Yup I figured that out but forgot to post :)

    Working code:
    Code:JAVA
    1.  
    2. @Override
    3. public void onEntityDeath(EntityDeathEvent event){
    4. Entity e = event.getEntity();
    5. if(event.getEntity().getLastDamageCause() instanceof EntityDamageByEntityEvent){
    6. Entity dmgr = ((EntityDamageByEntityEvent) event.getEntity().getLastDamageCause()).getDamager();
    7. if(e instanceof Player){
    8. if(dmgr instanceof Player){
    9.  
    10. ((Player) dmgr).sendMessage("You killed " + ((Player) e).getName() + " and obtained " + plugin.getConfig_reward());
    11. Server server = plugin.getServer();
    12. server.broadcastMessage(((Player) dmgr).getName() + " killed " + ((Player) e).getName());
    13. plugin.economy.depositPlayer(((Player) dmgr).getName(), plugin.getConfig_reward());
    14.  
    15.  
    16. }
    17. }
    18. }
    19.  
    20. }
    21.  
     
    hammale likes this.
Thread Status:
Not open for further replies.

Share This Page