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

Помогите Рефлексия [Решено(Оооо дааа)]

Тема в разделе "Разработка плагинов для новичков", создана пользователем Exception_Prototype, 19 мар 2017.

  1. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Чёт печаль
     
  2. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Бле, может в скайп тогда? Может помогу.
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Раздели if, сперва проверь есть там дамагер, или он нулл.
     
  4. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Пару сек
    Я пока что так проверил.
    Код:
            Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] " + event.getDamager().getType().toString());
            Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] " + event.getEntity().getType().toString());
    
    [​IMG]
    Я это сразу проверял, суть в этом и есть. Дамагер == ЭНТИТИ, который нанёс урон, т.е. не тот, кто его инициировал, а именно то, что нанесло урон, а просто энтити == жертва.
    Подпись читай.
     
  5. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    CraftEntity cen = (CraftEntity) event.getDamager();
    net.minecraft.server.v1_6_R3.Entity en = cen.getHandle();
    en твоя пуля.
    P.s чтоб скомпилить, собирай с крафтведром и те будет импорт к net.minecraft.server.v1_6_R3.Entity
    Я полагаю вопрос решен? Получил ты свою nmsпулю?
     
  6. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    В процессе пока что.
    Код:
        @EventHandler
        public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
    
            if (plugin.isDebug) {
                Bukkit.broadcastMessage("[Debug] call EntityDamageByEntityEvent");
            }
    
            Player p;
            Entity entity = event.getDamager();
            if (entity != null) {
                CraftEntity cen = (CraftEntity) event.getDamager();
                net.minecraft.server.v1_6_R3.Entity en = cen.getHandle();
                Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] Class name" + en.getClass().getName());
                if (en.getClass().getName().endsWith("EntityBullet")) {
                    Entity owner = getField(en.getClass(), en, "owner"); // Caused by: java.lang.ClassCastException: net.minecraft.entity.player.EntityPlayerMP cannot be cast to org.bukkit.entity.Entity. Качаю другое ядро.
                    if (owner instanceof Player) {
                        p = (Player) owner;
                        Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] Owner name" + p.getName());
                    }
                } else if (entity.getType() == EntityType.PLAYER) {
                    p = (Player) entity;
                    if (isAccess(p)) {
                        if (plugin.isDebug) {
                            p.sendMessage("[Debug] PvP: false");
                        }
                        p.addPotionEffect(blindness);
                        p.sendMessage(CHAT_PREFIX + ChatColor.RED + "Вы не можете наносить повреждения кому-либо с безопасной зоны!");
                        event.setCancelled(true);
                    }
                } else if (entity instanceof Projectile) {
                    LivingEntity livingentity = ((Projectile) entity).getShooter();
                    if (livingentity.getType() == EntityType.PLAYER) {
                        p = (Player) livingentity;
                        if (isAccess(p)) {
                            if (plugin.isDebug) {
                                p.sendMessage("[Debug] PvP: false");
                            }
                            p.addPotionEffect(blindness);
                            p.sendMessage(CHAT_PREFIX + ChatColor.RED + "Вы не можете наносить повреждения кому-либо с безопасной зоны!");
                            event.setCancelled(true);
                        }
                    }
                }
            } else {
                Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] attacker is not player");
            }
        }
    
     
  7. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    А просто cen.remove(); не катит?
     
  8. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Так овнера же пули не получил ещё ClassCastException.
    Надо же определить, от куда была выпущена))
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Хотя по твоим словам ивент там имеется и event.setCancelled(true); должен сработать.
    Игрок, гет локатионс. Не думаю, что он успеет так быстро перебежать.
     
  10. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Не понял, гетлокакейшен чего? Пули? Не врубился чёт. Игрока то нет ещё, кого от куда брать?
     
  11. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну ты же пулю получил и с него игрока, не?
    Ах да, ты не забыл сконвертить nmsентити в ведроентити? Или дергай координаты прям из nms.
     
  12. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    [​IMG]
     
  13. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    net.minecraft.server.v1_10_R1.Entity nmsen = твой nms ентити
    Entity craften = nmsen.getBukkitEntity(); Конвертим в ведроентити.

    Ну а дальше кастуешь в Player
     
    Последнее редактирование: 19 мар 2017
  14. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Вот так удалось получить владельца пули. Что скажете?
    Код:
            if (entity != null) {
                CraftEntity cen = (CraftEntity) event.getDamager();
                net.minecraft.server.v1_6_R3.Entity en = cen.getHandle();
                Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] Class name" + en.getClass().getName());
                if (en.getClass().getName().endsWith("EntityBullet")) { //en.getBukkitEntity();
                    CraftEntity owner = CraftEntity.getEntity((CraftServer) entity.getServer(), (net.minecraft.server.v1_6_R3.Entity) getField(en.getClass(), en, "owner"));
                    if (owner instanceof Player) {
                        p = (Player) owner;
                        Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] Owner name" + p.getName());
                    }
    
     
  15. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    nmsen.getBukkitEntity(); так правильней.
     
  16. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Дык мы получим пулю по тому, что ты написал, а в той строке через рефлексию мы ещё получаем овнера.
     
  17. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну да, он и есть net.minecraft.server.v1_10_R1.Entity как и пуля, в нем есть метод getBukkitEntity();
     
  18. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Так, я совсем перестал понимать.
    У нас есть оригинальный Entity (сама пуля) . В моём коде с помощью рефлексии мы достоём овнера и получаем его на сервере, далее проверяем, что он игрок и делаем то, что нам нужно. Вашу идею не могу понять.
    Можете кодом показать?
     
  19. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    net.minecraft.server.v1_6_R3.Entity пуля = cen.getHandle();
    net.minecraft.server.v1_6_R3.Entity игрок = getField(en.getClass(), пуля, "owner"));
    Entity крафтигрок = игрок.getBukkitEntity();
    if (крафтигрок instanceof Player) {
    p = (Player) крафтигрок;
    }
     
  20. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Уже сделали эту фигню. Вариант рабочий.
    Так
    Код:
    Entity крафтигрок = игрок.getBukkitEntity();
    не будет ибо получаем мы не бакитовского Entity, а EntityPlayerMP.
     

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