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

Помогите WitherSkull

Discussion in 'Разработка плагинов для новичков' started by Freeos, Feb 2, 2016.

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

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

    Trophy Points:
    36
    Имя в Minecraft:
    freeos
    Я пытаюсь сделать плагин, который при использовании некого предмета (PlayerInteractEvent), будет запускать голову скелета (черного такого - иссушителя). Впрочем, с запуском головы быстро справился:
    Code:
    e.getPlayer().launchProjectile(WitherSkull.class, e.getPlayer().getEyeLocation().getDirection().multiply(2));
    shooters.add(e.getPlayer())
    Далее я отлавливаю EntityDamageByEntityEvent, чтобы "найти" (если возможно) игрока у которого голова попала. И вот тут у меня проблема суть которой заключается в том, что EntityDamageByEntityEvent не может "отловить" само попадание (по крайней мере у меня не выходит) головы в игрока:
    Code:
     @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 Старожил Пользователь

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

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

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

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

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

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

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

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

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

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

Share This Page