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

Бле, может в скайп тогда? Может помогу.
 
Раздели if, сперва проверь есть там дамагер, или он нулл.
Пару сек
Раздели if, сперва проверь есть там дамагер, или он нулл.
Я пока что так проверил.
Java:
        Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] " + event.getDamager().getType().toString());
        Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] " + event.getEntity().getType().toString());
KAgGaQVF47Zk9A.png

Я это сразу проверял, суть в этом и есть. Дамагер == ЭНТИТИ, который нанёс урон, т.е. не тот, кто его инициировал, а именно то, что нанесло урон, а просто энтити == жертва.
Бле, может в скайп тогда? Может помогу.
Подпись читай.
 
Пару сек

Я пока что так проверил.
Java:
        Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] " + event.getDamager().getType().toString());
        Bukkit.broadcastMessage(CHAT_PREFIX + "[Debug] " + event.getEntity().getType().toString());
KAgGaQVF47Zk9A.png

Я это сразу проверял, суть в этом и есть. Дамагер == ЭНТИТИ, который нанёс урон, т.е. не тот, кто его инициировал, а именно то, что нанесло урон, а просто энтити == жертва.

Подпись читай.
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пулю?
 
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пулю?
В процессе пока что.
Java:
    @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");
        }
    }
 
В процессе пока что.
Java:
    @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");
        }
    }
А просто cen.remove(); не катит?
 
Хотя по твоим словам ивент там имеется и event.setCancelled(true); должен сработать.
Так овнера же пули не получил ещё ClassCastException.
Надо же определить, от куда была выпущена))
Игрок, гет локатионс. Не думаю, что он успеет так быстро перебежать.
 
Хотя по твоим словам ивент там имеется и event.setCancelled(true); должен сработать.

Игрок, гет локатионс. Не думаю, что он успеет так быстро перебежать.
Не понял, гетлокакейшен чего? Пули? Не врубился чёт. Игрока то нет ещё, кого от куда брать?
 
Не понял, гетлокакейшен чего? Пули? Не врубился чёт. Игрока то нет ещё, кого от куда брать?
Ну ты же пулю получил и с него игрока, не?
Ах да, ты не забыл сконвертить nmsентити в ведроентити? Или дергай координаты прям из nms.
 
net.minecraft.server.v1_10_R1.Entity nmsen = твой nms ентити
Entity craften = nmsen.getBukkitEntity(); Конвертим в ведроентити.

Ну а дальше кастует в Player
Вот так удалось получить владельца пули. Что скажете?
Java:
        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());
                }
 
Вот так удалось получить владельца пули. Что скажете?
Java:
        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());
                }
nmsen.getBukkitEntity(); так правильней.
 
Ну да, он и есть net.minecraft.server.v1_10_R1.Entity как и пуля, в нем есть метод getBukkitEntity();
Так, я совсем перестал понимать.
У нас есть оригинальный Entity (сама пуля) . В моём коде с помощью рефлексии мы достоём овнера и получаем его на сервере, далее проверяем, что он игрок и делаем то, что нам нужно. Вашу идею не могу понять.
Можете кодом показать?
 
Так, я совсем перестал понимать.
У нас есть оригинальный Entity (сама пуля) . В моём коде с помощью рефлексии мы достоём овнера и получаем его на сервере, далее проверяем, что он игрок и делаем то, что нам нужно. Вашу идею не могу понять.
Можете кодом показать?
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) крафтигрок;
}
 
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) крафтигрок;
}
Уже сделали эту фигню. Вариант рабочий.
Так
Код:
Entity крафтигрок = игрок.getBukkitEntity();
не будет ибо получаем мы не бакитовского Entity, а EntityPlayerMP.
 
Назад
Верх