1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем GoodPlayer, 18 май 2024.

Статус темы:
Закрыта.
  1. Автор темы
    GoodPlayer

    GoodPlayer Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    <удалено>
     
    Последнее редактирование: 21 май 2024
  2. mirrerror

    mirrerror Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    а нам остается лишь догадываться, какую ты ошибку словил
     
  3. Автор темы
    GoodPlayer

    GoodPlayer Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Ошибся, ошибки нет, но задержка не выдаётся.
     
  4. koten0k

    koten0k Активный участник Пользователь

    Баллы:
    46
    Bukkit.getServer().getPluginManager().registerEvents(new YourClass(), this);
    Эта строка в onEnable() есть?
     
  5. Автор темы
    GoodPlayer

    GoodPlayer Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    да, конечно
     
  6. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Я бы на твоём месте сделал какой-нибудь метод, а-ля 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;
     
  7. Автор темы
    GoodPlayer

    GoodPlayer Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Спасибо, попробовал, но я так понимаю, что метода getSource() нет в 1.12.2? Можно ли его заменить каким-то другим методом?
     
  8. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    *getShooter
     
  9. Автор темы
    GoodPlayer

    GoodPlayer Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Спасибо, работает, но теперь при нанесении удара не игрока, а мобу возникает такая ошибка:
    Код:
    [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
     
  10. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Логично, что надо проверять является энтити игроком или нет.
     
  11. Автор темы
    GoodPlayer

    GoodPlayer Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Код:
            if (!(e.getEntity() instanceof Player))
                return;
    Проверяю таким образом, но ошибка остаётся. Проверял и напрямую в самом ивенте и в самом методе.
     
    Последнее редактирование: 22 май 2024
  12. Автор темы
    GoodPlayer

    GoodPlayer Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Чуть переработал метод, исправил ошибку. Всем спасибо, кто помогал <3
     
Статус темы:
Закрыта.

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