Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Как проверить, что удар был нанесён игроком стрелой?

Статус
Закрыто для дальнейших ответов.

GoodPlayer

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
GoodPlayer
<удалено>
 
Последнее редактирование:
Bukkit.getServer().getPluginManager().registerEvents(new YourClass(), this);
Эта строка в onEnable() есть?
 
Нашёл баг в своём плагина на антирелог. Когда игрок попадает в игрока с лука ему не даётся задержка (КД). Вот код обычного пвп (от руки игрока):
Код:
    @EventHandler
    public void onPvP(EntityDamageByEntityEvent e) {
        if (!(e.getDamager() instanceof Player) || !(e.getEntity() instanceof Player) || !handlePvp(e.getEntity().getLocation()))
            return;
        Player damager = (Player)e.getDamager();
        Player player = (Player)e.getEntity();
        if (!playerInPvp(damager))
            damager.sendMessage(toColorMsg("messages.pvp-start"));
        if (!playerInPvp(player))
            player.sendMessage(toColorMsg("messages.pvp-start"));
        this.lastPlayerPvP.put(damager, Long.valueOf(System.currentTimeMillis()));
        this.lastPlayerPvP.put(player, Long.valueOf(System.currentTimeMillis()));
        if (!this.playersInPvp.contains(damager))
            this.playersInPvp.add(damager);
        if (!this.playersInPvp.contains(player))
            this.playersInPvp.add(player);
    }
Посидев я решил сделать так:
Код:
    @EventHandler
    public void onProjectile(ProjectileHitEvent e) {
        if (!(e.getEntity().getShooter() instanceof Player) || !(e.getEntity() instanceof Player))
            return;
        Player damager = (Player)e.getEntity().getShooter();
        Player player = (Player)e.getEntity();
        if (!playerInPvp(damager))
            damager.sendMessage(toColorMsg("messages.pvp-start"));
        if (!playerInPvp(player))
            player.sendMessage(toColorMsg("messages.pvp-start"));
        this.lastPlayerPvP.put(damager, Long.valueOf(System.currentTimeMillis()));
        this.lastPlayerPvP.put(player, Long.valueOf(System.currentTimeMillis()));
        if (!this.playersInPvp.contains(damager))
            this.playersInPvp.add(damager);
        if (!this.playersInPvp.contains(player))
            this.playersInPvp.add(player);
    }
В итоге ничего из этого не вышло, только получил ошибку в консоль. Подскажите, пожалуйста, как это решить?
Я бы на твоём месте сделал какой-нибудь метод, а-ля getOwningPlayer:
PHP:
public static @Nullable Player getOwningPlayer(@Nullable Entity entity) {
    if (entity == null) return null; // Нет сущности - нет проблем
    if (entity instanceof Player player) { // Если сущность уже игрок
        return player;
    }
    if (entity instanceof Projectile proj) { // Если сущность - снаряд
        ProjectileSource source = proj.getSource();
        return (source instanceof Player player) ? player : null; // Проверяем, владелец ли игрок
    }
    if (entity instanceof Tameable tame) { // Если сущность - волк или типа того
        AnimalTamer tamer = tame.getOwner();
        return (tamer instanceof Player player) ? player : null; // Проверяем, владелец ли игрок
    }
    return null; // У сущности нет владельца
}
И просто где-нибудь в начале обработки EntityDamageByEntityEvent вписать:
PHP:
Player damager = getOwningPlayer(event.getDamager());
if (damager == null) return;
 
Я бы на твоём месте сделал какой-нибудь метод, а-ля getOwningPlayer:
PHP:
public static @Nullable Player getOwningPlayer(@Nullable Entity entity) {
    if (entity == null) return null; // Нет сущности - нет проблем
    if (entity instanceof Player player) { // Если сущность уже игрок
        return player;
    }
    if (entity instanceof Projectile proj) { // Если сущность - снаряд
        ProjectileSource source = proj.getSource();
        return (source instanceof Player player) ? player : null; // Проверяем, владелец ли игрок
    }
    if (entity instanceof Tameable tame) { // Если сущность - волк или типа того
        AnimalTamer tamer = tame.getOwner();
        return (tamer instanceof Player player) ? player : null; // Проверяем, владелец ли игрок
    }
    return null; // У сущности нет владельца
}
И просто где-нибудь в начале обработки EntityDamageByEntityEvent вписать:
PHP:
Player damager = getOwningPlayer(event.getDamager());
if (damager == null) return;
Спасибо, попробовал, но я так понимаю, что метода getSource() нет в 1.12.2? Можно ли его заменить каким-то другим методом?
 
Спасибо, работает, но теперь при нанесении удара не игрока, а мобу возникает такая ошибка:
Код:
[20:07:25 ERROR]: Could not pass event EntityDamageByEntityEvent to test v1.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:72) ~[patched_1.12.2.jar:git-Paper-1620]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:78) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:513) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:94) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:620) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:523) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:652) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity0(EntityLiving.java:1415) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:888) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityMonster.damageEntity(EntityMonster.java:44) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityZombie.damageEntity(EntityZombie.java:163) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityArrow.a(EntityArrow.java:295) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityArrow.B_(EntityArrow.java:203) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityTippedArrow.B_(EntityTippedArrow.java:86) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.World.entityJoinedWorld(World.java:1797) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.World.h(World.java:1767) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.World.tickEntities(World.java:1574) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.WorldServer.tickEntities(WorldServer.java:682) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:921) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:423) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:774) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:666) ~[patched_1.12.2.jar:git-Paper-1620]
        at java.lang.Thread.run(Thread.java:842) [?:?]
Caused by: java.lang.ClassCastException: class org.bukkit.craftbukkit.v1_12_R1.entity.CraftZombie cannot be cast to class org.bukkit.entity.Player (org.bukkit.craftbukkit.v1_12_R1.entity.CraftZombie and org.bukkit.entity.Player are in unnamed module of loader 'app')
        at ru.test.test.main.onPvP(Manager.java:118) ~[?:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor20.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:70) ~[patched_1.12.2.jar:git-Paper-1620]
        ... 23 more
 
Спасибо, работает, но теперь при нанесении удара не игрока, а мобу возникает такая ошибка:
Код:
[20:07:25 ERROR]: Could not pass event EntityDamageByEntityEvent to test v1.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:72) ~[patched_1.12.2.jar:git-Paper-1620]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:78) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:513) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:94) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:620) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:523) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:652) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity0(EntityLiving.java:1415) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:888) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityMonster.damageEntity(EntityMonster.java:44) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityZombie.damageEntity(EntityZombie.java:163) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityArrow.a(EntityArrow.java:295) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityArrow.B_(EntityArrow.java:203) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.EntityTippedArrow.B_(EntityTippedArrow.java:86) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.World.entityJoinedWorld(World.java:1797) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.World.h(World.java:1767) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.World.tickEntities(World.java:1574) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.WorldServer.tickEntities(WorldServer.java:682) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:921) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:423) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:774) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:666) ~[patched_1.12.2.jar:git-Paper-1620]
        at java.lang.Thread.run(Thread.java:842) [?:?]
Caused by: java.lang.ClassCastException: class org.bukkit.craftbukkit.v1_12_R1.entity.CraftZombie cannot be cast to class org.bukkit.entity.Player (org.bukkit.craftbukkit.v1_12_R1.entity.CraftZombie and org.bukkit.entity.Player are in unnamed module of loader 'app')
        at ru.test.test.main.onPvP(Manager.java:118) ~[?:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor20.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:70) ~[patched_1.12.2.jar:git-Paper-1620]
        ... 23 more
Логично, что надо проверять является энтити игроком или нет.
 
Логично, что надо проверять является энтити игроком или нет.
Код:
        if (!(e.getEntity() instanceof Player))
            return;
Проверяю таким образом, но ошибка остаётся. Проверял и напрямую в самом ивенте и в самом методе.
 
Последнее редактирование:
Код:
        if (!(e.getEntity() instanceof Player))
            return;
Проверяю таким образом, но ошибка остаётся. Проверял и напрямую в самом ивенте и в самом методе.
Чуть переработал метод, исправил ошибку. Всем спасибо, кто помогал <3
 
Статус
Закрыто для дальнейших ответов.

Поделиться этой страницей

Назад
Верх