Помогите EntityDamageByEntityEvent проверка на Не игрока

AguRChek_TV

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
AguRChek_TV
пробовал сделать так но не работает

Код:
                if (!(e.getDamager() instanceof Player)) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                        ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + e.getDamager().getType());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }

вот полный код

Код:
        @EventHandler
        public void dmg(EntityDamageByEntityEvent e) {
            Player p = (Player) e.getEntity();
            Player k = (Player) e.getDamager();
            if ((((Damageable) e.getEntity()).getHealth() - e.getFinalDamage() <= 0)) {
                p.setGameMode(GameMode.SPECTATOR);
                p.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "you died and moved to observer mode");
                e.setCancelled(true);
                if (e.getDamager() instanceof Player) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                        ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + k.getName());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }
                if (!(e.getDamager() instanceof Player)) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                        ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + e.getDamager().getType());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }
                int size = 0;
                ArrayList<Player> PE = new ArrayList<Player>();
                ArrayList<Player> PL = new ArrayList<Player>();
                PL.addAll(Bukkit.getOnlinePlayers());
                for(Player pe : PL) {
                    if(pe.getGameMode().equals(GameMode.SURVIVAL)) {
                        PE.add(pe);
                        size = PE.size();
                    }
                }
                if(size < 2) {
                    if(status == 1) {
                        for(Player ps: Bukkit.getOnlinePlayers()) {
                            // top1
                        }
                    }
                }
            }
        }
 
maxresdefault-3-1000x563.jpg
 
пробовал сделать так но не работает

Код:
                if (!(e.getDamager() instanceof Player)) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                        ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + e.getDamager().getType());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }

вот полный код

Код:
        @EventHandler
        public void dmg(EntityDamageByEntityEvent e) {
            Player p = (Player) e.getEntity();
            Player k = (Player) e.getDamager();
            if ((((Damageable) e.getEntity()).getHealth() - e.getFinalDamage() <= 0)) {
                p.setGameMode(GameMode.SPECTATOR);
                p.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "you died and moved to observer mode");
                e.setCancelled(true);
                if (e.getDamager() instanceof Player) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                        ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + k.getName());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }
                if (!(e.getDamager() instanceof Player)) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                        ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + e.getDamager().getType());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }
                int size = 0;
                ArrayList<Player> PE = new ArrayList<Player>();
                ArrayList<Player> PL = new ArrayList<Player>();
                PL.addAll(Bukkit.getOnlinePlayers());
                for(Player pe : PL) {
                    if(pe.getGameMode().equals(GameMode.SURVIVAL)) {
                        PE.add(pe);
                        size = PE.size();
                    }
                }
                if(size < 2) {
                    if(status == 1) {
                        for(Player ps: Bukkit.getOnlinePlayers()) {
                            // top1
                        }
                    }
                }
            }
        }
Начиная с изначального вопроса - твой вариант должен сработать, если ты всё сделал правильно. Иначе же ты можешь проверить это через (e.getDamager().getType() == EntityType.PLAYER).

Ты в начале своего кода сразу рассчитываешь, что и ударивший, и жертва - игроки.
Код:
            Player p = (Player) e.getEntity();
            Player k = (Player) e.getDamager();
Это в итоге приведет к ошибке, если кто-то из них не игрок. Прежде всего убедись, что жертва - игрок.
Код:
if (e.getEntity().getType() != EntityType.PLAYER) return;
Player p = (Player) e.getEntity();

Вот здесь можно упростить.
Код:
if ((((Damageable) e.getEntity()).getHealth() - e.getFinalDamage() <= 0))
до
Код:
if (p.getHealth() <= e.getFinalDamage())

Дальше - у тебя два практически идентичных блока кода. К тому же ты кидаешь молнию и звук от каждого игрока, т.е. если на сервере 100 игроков - 100 молний ударят в одно и то же место. Также отправку сообщения всем игрокам можно сделать без цикла через Bukkit.broadcastMessage(String)
Код:
                if (e.getDamager() instanceof Player) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                       ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + k.getName());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }
                if (!(e.getDamager() instanceof Player)) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                       ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + e.getDamager().getType());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }
Сделай из двух блоков один и исправь косяки. Ради приличия ещё заменил все ChatColor одним методом, но это необязательно - медленнее на 1-2 миллисекунды хд
Код:
Entity damager = e.getDamager()
String name = damager.getType() == EntityType.PLAYER ? ((Player) damager).getName() : damager.getType().name();
Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&7&lPlayer &f&l" p.getName() "&7&l killed by &f&l" + name));
Location  loc = p.getLocation();
p.getWorld().strikeLightningEffect(loc);
p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);

Здесь я тебе уже показывал, как можно одним циклом без лишних списков посчитать количество игроков по определенному критерию.
Код:
                int size = 0;
                ArrayList<Player> PE = new ArrayList<Player>();
                ArrayList<Player> PL = new ArrayList<Player>();
                PL.addAll(Bukkit.getOnlinePlayers());
                for(Player pe : PL) {
                    if(pe.getGameMode().equals(GameMode.SURVIVAL)) {
                        PE.add(pe);
                        size = PE.size();
                    }
                }
Код:
int size = 0;
for (Player player : Bukkit.getOnlinePlayer())
    if (player.getGameMode() == GameMode.SURVIVAL) size++;

Писал с тлф, потому неуверен, что весь код сработает без поправок
 
Нахера тебе ChatColor? С таким же успехом можно написать сразу § не? Это же не чат где параграф писать нельзя.
 
Нахера тебе ChatColor? С таким же успехом можно написать сразу § не? Это же не чат где параграф писать нельзя.
Можно, но лично мне зачастую просто лениво каждый раз гуглить или искать этот символ в коде. Хотя можно забиндить на какую-нибудь комбинацию к клавиатуре.
 
Можно, но лично мне зачастую просто лениво каждый раз гуглить или искать этот символ в коде. Хотя можно забиндить на какую-нибудь комбинацию к клавиатуре.
Ну ты и курица, alt+21 че там запоминать?
 
Начиная с изначального вопроса - твой вариант должен сработать, если ты всё сделал правильно. Иначе же ты можешь проверить это через (e.getDamager().getType() == EntityType.PLAYER).

Ты в начале своего кода сразу рассчитываешь, что и ударивший, и жертва - игроки.
Код:
            Player p = (Player) e.getEntity();
            Player k = (Player) e.getDamager();
Это в итоге приведет к ошибке, если кто-то из них не игрок. Прежде всего убедись, что жертва - игрок.
Код:
if (e.getEntity().getType() != EntityType.PLAYER) return;
Player p = (Player) e.getEntity();

Вот здесь можно упростить.
Код:
if ((((Damageable) e.getEntity()).getHealth() - e.getFinalDamage() <= 0))
до
Код:
if (p.getHealth() <= e.getFinalDamage())

Дальше - у тебя два практически идентичных блока кода. К тому же ты кидаешь молнию и звук от каждого игрока, т.е. если на сервере 100 игроков - 100 молний ударят в одно и то же место. Также отправку сообщения всем игрокам можно сделать без цикла через Bukkit.broadcastMessage(String)
Код:
                if (e.getDamager() instanceof Player) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                       ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + k.getName());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }
                if (!(e.getDamager() instanceof Player)) {
                    for(Player ps: Bukkit.getOnlinePlayers()) {
                       ps.sendMessage(ChatColor.GRAY + "" + ChatColor.BOLD + "player " + ChatColor.WHITE + "" + ChatColor.BOLD + p.getName() + ChatColor.GRAY + "" + ChatColor.BOLD + " killed by " + ChatColor.WHITE + "" + ChatColor.BOLD + e.getDamager().getType());
                        Location  loc = p.getLocation();
                        p.getWorld().strikeLightningEffect(loc);
                        p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);
                    }
                }
Сделай из двух блоков один и исправь косяки. Ради приличия ещё заменил все ChatColor одним методом, но это необязательно - медленнее на 1-2 миллисекунды хд
Код:
Entity damager = e.getDamager()
String name = damager.getType() == EntityType.PLAYER ? ((Player) damager).getName() : damager.getType().name();
Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&7&lPlayer &f&l" p.getName() "&7&l killed by &f&l" + name));
Location  loc = p.getLocation();
p.getWorld().strikeLightningEffect(loc);
p.getWorld().playSound(loc,Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 0);

Здесь я тебе уже показывал, как можно одним циклом без лишних списков посчитать количество игроков по определенному критерию.
Код:
                int size = 0;
                ArrayList<Player> PE = new ArrayList<Player>();
                ArrayList<Player> PL = new ArrayList<Player>();
                PL.addAll(Bukkit.getOnlinePlayers());
                for(Player pe : PL) {
                    if(pe.getGameMode().equals(GameMode.SURVIVAL)) {
                        PE.add(pe);
                        size = PE.size();
                    }
                }
Код:
int size = 0;
for (Player player : Bukkit.getOnlinePlayer())
    if (player.getGameMode() == GameMode.SURVIVAL) size++;

Писал с тлф, потому неуверен, что весь код сработает без поправок


огромное спасибо братик
 
Назад
Верх