Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

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

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

    Баллы:
    46
    Чёт печаль
     
  2. Хостинг MineCraft
    <
  3. Qmaks

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

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

    alexandrage Администратор

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

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

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

    alexandrage Администратор

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

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

    Баллы:
    46
    В процессе пока что.
    Код:
        @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");
            }
        }
    
     
  8. alexandrage

    alexandrage Администратор

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

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

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

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Хотя по твоим словам ивент там имеется и event.setCancelled(true); должен сработать.[DOUBLEPOST=1489954016,1489953961][/DOUBLEPOST]
    Игрок, гет локатионс. Не думаю, что он успеет так быстро перебежать.
     
  11. Автор темы
    Exception_Prototype

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

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

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ну ты же пулю получил и с него игрока, не?[DOUBLEPOST=1489954431,1489954348][/DOUBLEPOST]Ах да, ты не забыл сконвертить nmsентити в ведроентити? Или дергай координаты прям из nms.
     
  13. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    [​IMG]
     
  14. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    net.minecraft.server.v1_10_R1.Entity nmsen = твой nms ентити
    Entity craften = nmsen.getBukkitEntity(); Конвертим в ведроентити.
    [DOUBLEPOST=1489954934,1489954819][/DOUBLEPOST]Ну а дальше кастуешь в Player
     
    Последнее редактирование: 19 мар 2017
  15. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Вот так удалось получить владельца пули. Что скажете?
    Код:
            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());
                    }
    
     
  16. alexandrage

    alexandrage Администратор

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

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

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

    alexandrage Администратор

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

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

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

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    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) крафтигрок;
    }
     
  21. Qmaks

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

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

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