Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап ///

Статус
Закрыто для дальнейших ответов.
Как вариант - сохранять в кэш обработанныйt объекты onHit event (например, время выполнения и игрока) и проверять в onProjectileHitEvent с приоритетом @EventHandler(priority = EventPriority.LOWEST), совпадают ли события: если да, то event.setCancelled(true), в ином случае - ничего :D
 
Попробовал:
Код:
ArrayList<Player> cache = new ArrayList<Player>();
   @EventHandler(priority = EventPriority.HIGHEST)
   public void onhit(EntityDamageByEntityEvent e) {
 Entity entityHit = e.getEntity();
Player playerHit = (Player) entityHit;
Entity damager = e.getDamager();
Arrow arrow = (Arrow) damager;
Entity p = (Entity) arrow.getShooter();
                 if (p.getName().equals(playerHit.getName())) {
                      cache.add((Player) p);
                     (Player)p.sendMessage("Вы попали в самого себя");


                     arrow.remove();
                 }
}

   @EventHandler(priority = EventPriority.LOWEST)
   public void onProjectileHitEvent(final ProjectileHitEvent event) {
final Player player = (Player)event.getEntity().getShooter();
if (cache.contains(player)) return;
p.sendMessage("Вы попали в блок");
}
Не помогло, сообщение перестает выдаваться только со второго раза, когда игрок уже записан в кэш.
Я хочу сделать так, что-бы при попадании в игрока сообщение не выводилось вовсе.
Объясни что должно в конце получиться. Судя по коду выше, это можно записать и так
PHP:
@EventHandler
public void onProjectileHitEvent(ProjectileHitEvent e) {
   if(!(e.getEntity().getShooter() instanceof Player)) return;
   Player player = (Player) e.getEntity().getShooter();
   if(e.getHitBlock() != null) p.sendMessage("Вы попали в блок!");
   if(e.getHitEntity().equals(p)) p.sendMessage("Вы попали в себя!");
}
 
Последнее редактирование:
Мне нужно сделать между ними взаимодействие, к примеру, что-бы при попадании в самого себя евент:
onhit выполнялся, а евент: onProjectileHitEvent игнорировался, и на оборот, когда стрела попадает в блок евент: onhit игнорировался, а евент: onProjectileHitEvent выполнялся. Как такое можно реализовать?
Так ты сделать не сможешь. Оба зарегистрированные события будут выполнятся. Вероятнее всего ProjectileHitEvent выполнится перед EntityDamageByEntityEvent, если стрела попадет в существо. Возможно второе событие не выполнится, если хит будет отменен. Опять таки Cool_boy тебе скинул решение по идее с одним событием. Что не так?

* Не идет учет изменения кода ядра и т.п. хакингов *
 
Заморочка с методами. Темболее я представил чисто гепотетический код.
И какой евент лучше для использования переменных:
Player player = (Player)event.getEntity().getShooter();
Projectile proj = event.getEntity();
для получения координат блоков, на которые упала стрела, или получение ника того, кто нанес/получил урон.
ProjectileHitEvent
Ты получаешь стрелу (отсюда ее свойства включая коорды), можешь получить того кто стрелял, и того, куда попала стрела (существо или блок).
 
Я перепробовал различные методы получения имени игрока в которого попали
PHP:
Entity entity = e.getHitEntity();
if(entity != null && entity instanceof Player) {
Player hit = (Player) entity;
hit.getName(); //ЗОЧЕМ 2 ИВЕНТА!!11!1!
}
 
PHP:
Entity entity = e.getHitEntity();
if(entity != null && entity instanceof Player) {
Player hit = (Player) entity;
hit.getName(); //ЗОЧЕМ 2 ИВЕНТА!!11!1!
}
Вангую что он динозавр, где еще не было getHitBlock(). От сюда и ипет свой мозг.
P.s при instanceof нет смысла проверять не null.
 
Потом же бросит NPE потом, если не проверить
Paris_Tuileries_Garden_Facepalm_statue.jpg

Условие не пройдет же.
 
А можно такое реализовать на версии 1.8 - 1.9 +?
Уже 500 строк написал, и переход на новую версию убьет весь проект.
На подобие такого, можно что-то смастерить?
Код:
@EventHandler
   public void Trasers(ProjectileHitEvent e)
   {
       Entity entity = e.getEntity();
       if(entity instanceof Arrow)
       {
           Arrow arrow = (Arrow) entity;
           Entity shooter = (Entity) arrow.getShooter();
           if(shooter instanceof Player)
           {
               Player player = (Player) shooter;
               if(player.getItemInHand().getType() == Material.BOW)
               {
                   if(player.getLastDamageCause() instanceof EntityDamageByEntityEvent)
                   {
                   
                       EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) player.getLastDamageCause();
                       player.sendMessage("Вы подстрелили: " + (Player)event.getEntity().getName());
                   }
               }
           }       
       }
   }
Уже не важно, на сколько это будет большим. Можно ли, это как-то реализовать без переходов на версии 1.11 - 1.12?
Ну тогда твой костыль во втором посте выглядит рабочим. Только как это должно работать? Игрок стреляет себя - попадает в список, потом стреляет в блок - выходит из него?
 
А можно такое реализовать на версии 1.8 - 1.9 +?
Уже 500 строк написал, и переход на новую версию убьет весь проект.
Ого, 500 строк кода) Наверное много времени понадобится чтоб перенести все на новую версию)
 
Может использовать

Не много, больше скорее всего гемора. Темболее проект требуется написать для версии 1.8-1.9
Я никак не расчитывал,что придется все переписывать. Костыли проще использовать.
Щяс думаю с какой стороны лучше подойти.
Ну вот смирись и переходи. Там много чего полезного добавили. Сэкономишь кучу времени и сил.
 
Как выставить триггер, если евент: ProjectileHitEvent выполняется раньше EntityDamageByEntityEvent? Помогут ли приоритеты?
Нет конечно. Уже 3тий день мучаешься из за динозавра. Мог бы успеть перейти на нормальную версию.
 
Руинить целый проект спустя неделю работы это не дело. Может есть способ? Хоть и трудный но способ, помимо перехода на другую версию? Может есть способ перенести все с новой версии на старую? Может заменить евент, который работает так-же?
Если ты будешь всегда идти в ногу со временем, у тебя будет намного меньше проблем, уж поверь, не пожалеешь.
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх