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

Помогите WitherSkull

Тема в разделе "Разработка плагинов для новичков", создана пользователем Freeos, 2 фев 2016.

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

    Freeos Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    freeos
    Я пытаюсь сделать плагин, который при использовании некого предмета (PlayerInteractEvent), будет запускать голову скелета (черного такого - иссушителя). Впрочем, с запуском головы быстро справился:
    Код:
    e.getPlayer().launchProjectile(WitherSkull.class, e.getPlayer().getEyeLocation().getDirection().multiply(2));
    shooters.add(e.getPlayer())
    Далее я отлавливаю EntityDamageByEntityEvent, чтобы "найти" (если возможно) игрока у которого голова попала. И вот тут у меня проблема суть которой заключается в том, что EntityDamageByEntityEvent не может "отловить" само попадание (по крайней мере у меня не выходит) головы в игрока:
    Код:
     @EventHandler
        public void EntityDamageByEntity(EntityDamageByEntityEvent e) {
            if (e.getEntity() instanceof Player) {
                if (e.getDamager() instanceof WitherSkull) {
                    WitherSkull ws = (WitherSkull) e.getDamager();
                    if (ws.getShooter() instanceof Player && shooters.contains(ws.getShooter())) {
                        ((Player) e.getEntity()).setWalkSpeed(0.0F);
                        ((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 10000, 128));
                        Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(),
                                new Runnable() {
                                    @Override
                                    public void run() {
                                        ((Player) e.getEntity()).setWalkSpeed(0.2F);
                                        ((Player) e.getEntity()).removePotionEffect(PotionEffectType.JUMP);
                                    }
                                }, 40L);
                        shooters.remove(ws.getShooter());
                    }
                }
    }
    Возможно я что то делаю не так, хотя на иностранных форумах, на которых я пытался найти решение, все было так как у меня.
     
  2. Хостинг MineCraft
    <
  3. AxmeD

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

    Баллы:
    103
    Skype:
    ahmed136323
    Ошибки есть?
     
  4. Автор темы
    Freeos

    Freeos Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    freeos
    В том дело, что нету :D. Оно просто "не хочет" "видеть"/"читать", вот это:
    Код:
    if (e.getDamager() instanceof WitherSkull)
     
  5. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    А зачем вы используете долгую операцию instanceof там, где это имеет мало смысла?
    Для сущностей предусмотрен метод getType(), для игрока -- getType()==EntityType.PLAYER, для черепа иссушителя getType()==EntityType.WITHER_SKULL.
     
  6. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А разве этот череп не взрывается? Если да, то тогда EntityDamageByEntityEvent тут неуместен.
     
  7. Автор темы
    Freeos

    Freeos Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    freeos
    Если можете, то дайте пример, как сделать, чтобы "перехватить" сам тот эвент, то есть, чтобы дальше там например эффект наложить игроку, в которого я попала, или еще что то. Ну даже когда она (голова) взрывается, то наверное она почему это делает, значит она попадает в игрока, и тогда уже может взорваться (я так думаю).[DOUBLEPOST=1454491829,1454491421][/DOUBLEPOST]
    Учту :good:

    Только что провел некоторые "тесты", и выяснилось, что EntityDamageByEntityEvent все таки уместен (ну может есть еще что то другое разве, кроме EntityDamageEvent - он не совсем мне подходит, так как нужно еще мне взять damager'а). При проверке, я взял DamageCause. Выяснилось что это тип ENTITY_ATTACK. А сам e.getDamager() это (CraftPlayer) - игрок который выпустил голову. Теперь осталось доделать некоторые костыли.
    Возможно я опять что то не так сделал. Если знаете, то скажите, что еще можно сделать.
     
    Последнее редактирование: 3 фев 2016

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