Death by Drowning or Flame issue

Discussion in 'Spigot Plugin Development' started by Drawethree, May 28, 2017.

  1. Hey guys, im developing a pvp minigame. Im using this code to check if player "dies" and then add him to spectators. Only problem is, when player is killed by drowning / flame etc... this event doesnt work. Which event should I use ? EntityDamageEvent ?

    Code (Text):
    @EventHandler
        public void onFinalDamage(EntityDamageByEntityEvent e) {
            if (e.getEntity() instanceof Player) {
                Player p = (Player) e.getEntity();
                if (GameManager.getManager().isInGame(p)) {
                    if (GameManager.getManager().gameState == GAMESTATE.PVP) {
                        if (e.getFinalDamage() >= p.getHealth()) {
                            for (PotionEffect effect : p.getActivePotionEffects()) {
                                p.removePotionEffect(effect.getType());
                            }

                            e.setCancelled(true);
                            p.setHealth(20);
                            p.setFoodLevel(20);

                            GameStatsManager.getManager().sendGameStats(p);

                            if (e.getDamager() instanceof Player) {
                                Player d = (Player) e.getDamager();

                                PVPGameManager.getManager().playerKills.put(d,
                                        PVPGameManager.getManager().playerKills.get(d) + 1);

                                StatsManager.getManager().addPVPKill(d);
                                StatsManager.getManager().addPVPDeath(p);
                                GameStatsManager.getManager().addPVPKill(d);

                                SpectatorManager.getManager().addPlayerToSpec(p);

                                if (plugin.getEcononomy() != null) {
                                    plugin.getEcononomy().depositPlayer(d,
                                            fm.getConfig("config.yml").get().getDouble("rewards.economy.player_pvp_kill"));
                                }
                                if (plugin.getCoinsAPI() != null) {
                                    plugin.getCoinsAPI().addCoins(d.getUniqueId().toString(),
                                            fm.getConfig("config.yml").get().getInt("rewards.CoinsAPI.player_pvp_kill"));
                                }

                                for (Player p1 : GameManager.getManager().getPlayers()) {
                                    p1.playSound(p1.getLocation(),
                                            Sound.valueOf(fm.getConfig("sounds.yml").get().getString("PVP_KILL")), 1F, 1F);
                                    p1.sendMessage(Variables.prefix + ChatColor.translateAlternateColorCodes('&',
                                            fm.getConfig("messages.yml").get().getString("player_killed_player")
                                                    .replaceAll("%player%", p.getName())
                                                    .replaceAll("%killer%", d.getName())));
                                    p1.sendMessage(Variables.prefix + ChatColor.translateAlternateColorCodes('&',
                                            fm.getConfig("messages.yml").get().getString("players_remain").replaceAll(
                                                    "%players%", String.valueOf(PVPGameManager.livingPlayers.size()))));
                                }
                            } else if (e.getDamager() instanceof Projectile) {
                                Projectile proj = (Projectile) e.getDamager();
                                if (proj.getShooter() instanceof Player) {
                                    Player d = (Player) proj.getShooter();
                                    PVPGameManager.getManager().playerKills.put(d,
                                            PVPGameManager.getManager().playerKills.get(d) + 1);

                                    StatsManager.getManager().addPVPKill(d);
                                    StatsManager.getManager().addPVPDeath(p);
                                    GameStatsManager.getManager().addPVPKill(d);

                                    if (plugin.getEcononomy() != null) {
                                        plugin.getEcononomy().depositPlayer(d, fm.getConfig("config.yml").get()
                                                .getDouble("rewards.economy.player_pvp_kill"));
                                    }
                                    if (plugin.getCoinsAPI() != null) {
                                        plugin.getCoinsAPI().addCoins(d.getUniqueId().toString(), fm.getConfig("config.yml")
                                                .get().getInt("rewards.CoinsAPI.player_pvp_kill"));
                                    }

                                    for (Player p1 : GameManager.getManager().getPlayers()) {
                                        p1.playSound(p.getLocation(),
                                                Sound.valueOf(fm.getConfig("sounds.yml").get().getString("PVP_KILL")), 1F,
                                                1F);
                                        p1.sendMessage(Variables.prefix + ChatColor.translateAlternateColorCodes('&',
                                                fm.getConfig("messages.yml").get().getString("player_killed_player")
                                                        .replaceAll("%player%", p.getName())
                                                        .replaceAll("%killer%", d.getName())));
                                        p1.sendMessage(Variables.prefix + ChatColor.translateAlternateColorCodes('&',
                                                fm.getConfig("messages.yml").get().getString("players_remain").replaceAll(
                                                        "%players%", String.valueOf(PVPGameManager.livingPlayers.size()))));
                                    }
                                }

                                SpectatorManager.getManager().addPlayerToSpec(p);
                            } else {
                                SpectatorManager.getManager().addPlayerToSpec(p);
                                StatsManager.getManager().addPVPDeath(p);

                                for (Player p1 : GameManager.getManager().getPlayers()) {
                                    p1.playSound(p.getLocation(),
                                            Sound.valueOf(fm.getConfig("sounds.yml").get().getString("PVP_KILL")), 1F, 1F);
                                    p1.sendMessage(Variables.prefix + ChatColor.translateAlternateColorCodes('&',
                                            fm.getConfig("messages.yml").get().getString("player_killed")
                                                    .replaceAll("%player%", p.getName())
                                                    .replaceAll("%entity%", e.getCause().toString())));
                                    p1.sendMessage(Variables.prefix + ChatColor.translateAlternateColorCodes('&',
                                            fm.getConfig("messages.yml").get().getString("players_remain").replaceAll(
                                                    "%players%", String.valueOf(PVPGameManager.livingPlayers.size()))));
                                }
                            }
                            if (PVPGameManager.getManager().livingPlayers.size() == 2) {
                                PVPGameManager.getManager().winners.add(p);
                            } else if (PVPGameManager.getManager().livingPlayers.size() <= 1) {
                                PVPGameManager.getManager().winners.add(p);
                                PVPGameManager.getManager().winners.add(p.getKiller());
                                PVPGameManager.getManager().finishPVPGame();
                            }
                        }
                    }
                }
            }
        }
     
  2. You might want to use PlayerDeathEvent
     
  3. I dont want to use PlayerDeathEvent because in that event the death screen appears. I want to check if damage >= player's health and then cancel it, and add him to specs. Everything works fine unless the damage caused by drowning / flame etc..
     
  4. Then use EntityDamageEvent
     
  5. Then you just skip that screen by force respawning them (Player.Spigot::respawn())
     
  6. Instead of using EntityDamageByEntityEvent, use EntityDamageEvent (This will cover all types of damage including fire and drowning)
    https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/entity/EntityDamageEvent.html
     
  7. Yeah, but I also want to get a Player in some of that causes.
     
  8. Check if the cause of damage is by another entity, then check if that entity is an instance of player
     
  9. How to check if cause is done by another entity ?
     
  10. Bump, just use the PlayerDeathEvent