Войти или зарегистрироваться

Помогите Эвент в таймере

  • Автор темы Автор темы GodlikE
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

GodlikE

Старожил
Пользователь
Баллы
103
Имя в Minecraft
GodlikE
Всем привет=) Я создал плагин, который создает взрывы в месте падения яйца (основан на эвенте ProjectileHitEvent), и хочу, чтобы он работал несколько секунд, когда игрок написал команду, допустим, /egon. Я создал таймер, как полагается, но не знаю, как затолкать туда ProjectileHitEvent. Помогите пожалуйста, кому не сложно, желательно на примере кода=)
P.S. Мой код ниже.
Код:
public class MainClass extends JavaPlugin implements Listener{
        private int sec = 20;
        Location loc;
        public void onEnable()
    {
        getLogger().info("EggGrenade was enabled");
        Bukkit.getPluginManager().registerEvents(this, this);
    }
    @EventHandler
    public void onProjectileHit(ProjectileHitEvent e)
    {
      
        if(e.getEntity().getType() == EntityType.EGG)
        {
            e.getEntity().getWorld().createExplosion(e.getEntity().getLocation(), 4F, true);
            loc = e.getEntity().getLocation();
        }
      
    }
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args)
    {
        if (sender instanceof Player)
        {
            Player player = (Player) sender;
            if(cmd.getName().equalsIgnoreCase("egon")){
            BukkitRunnable runnable = new BukkitRunnable() {
                @Override
                public void run()
                {
                if (sec >= 0)
                        {
                    sec -= 1;
                        }
                else
                    cancel();
                    }
                }
            ;
            runnable.runTaskTimer(this, 1L, 20L);
            
            }
        }
        return true;
    }  
  
    public void onDisable()
    {
        getLogger().info("EggGrenade was disabled");
    }  
  
}
 
Всем привет=) Я создал плагин, который создает взрывы в месте падения яйца (основан на эвенте ProjectileHitEvent), и хочу, чтобы он работал несколько секунд, когда игрок написал команду, допустим, /egon. Я создал таймер, как полагается, но не знаю, как затолкать туда ProjectileHitEvent. Помогите пожалуйста, кому не сложно, желательно на примере кода=)
P.S. Мой код ниже.
Код:
public class MainClass extends JavaPlugin implements Listener{
        private int sec = 20;
        Location loc;
        public void onEnable()
    {
        getLogger().info("EggGrenade was enabled");
        Bukkit.getPluginManager().registerEvents(this, this);
    }
    @EventHandler
    public void onProjectileHit(ProjectileHitEvent e)
    {
     
        if(e.getEntity().getType() == EntityType.EGG)
        {
            e.getEntity().getWorld().createExplosion(e.getEntity().getLocation(), 4F, true);
            loc = e.getEntity().getLocation();
        }
     
    }
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args)
    {
        if (sender instanceof Player)
        {
            Player player = (Player) sender;
            if(cmd.getName().equalsIgnoreCase("egon")){
            BukkitRunnable runnable = new BukkitRunnable() {
                @Override
                public void run()
                {
                if (sec >= 0)
                        {
                    sec -= 1;
                        }
                else
                    cancel();
                    }
                }
            ;
            runnable.runTaskTimer(this, 1L, 20L);
           
            }
        }
        return true;
    } 
 
    public void onDisable()
    {
        getLogger().info("EggGrenade was disabled");
    } 
 
}
Как эвент может работать несколько секунд? Изъясняйтесь, пожалуйста, так, чтобы мы хотя бы поняли, что от нас надо.
 
Создаете обработчик ивента с проверкой флага, перед запуском таймера включаете, в конце выключаете.
Напишите кодом пожалуйста, а дальше я разберусь))
Как эвент может работать несколько секунд? Изъясняйтесь, пожалуйста, так, чтобы мы хотя бы поняли, что от нас надо.
Не эвент работал несколько секунд, а плагин)
 
Не эвент работал несколько секунд, а плагин)
Чтобы яйцо полетело, его естественно нужно запустить. Так как вы это делаете через время, а не по действию игрока, то запускать надо самостоятельно. Для этого есть метод launchProjectile. Когда оно упадёт, вызовется ваш уже обрабатываемый эвент. Ну и возможно придётся ещё отслеживать ProjectileLaunchEvent, чтобы задать траекторию полёта, если при запуске сила броска не задастся сама.
 
Чтобы яйцо полетело, его естественно нужно запустить. Так как вы это делаете через время, а не по действию игрока, то запускать надо самостоятельно. Для этого есть метод launchProjectile. Когда оно упадёт, вызовется ваш уже обрабатываемый эвент. Ну и возможно придётся ещё отслеживать ProjectileLaunchEvent, чтобы задать траекторию полёта, если при запуске сила броска не задастся сама.
Я понял так, что после введения команды, если игрок кидает яйцо в какой-то отрезок времени, то что-то происходит.
 
Последнее редактирование:
Я понял так, что после введения команды, если игрок кидает яйцо в какой-то отрезок времени, ьто что-то происходит.
Ну вот так вот человек описал задачу, что каждый понимает по своему.
 
Мне нужно, чтобы плагин работал в таком порядке:
1) Игрок пишет комманду /egon
2) Таймер начинает работать
3) Пока таймер работает, игрок может кинуть яйцо и оно взорвется
4) таймер прекращает работать
5) если игрок кинет яйцо, оно не взорвется
Ну вот как-то так=) Вроде разъяснил понятно=)
 
Последнее редактирование:
Мне нужно, чтобы плагин работал в таком порядке:
1) Игрок пишет комманду /egon
2) Таймер начинает работать
3) Пока таймер работает, игрок может кинуть яйцо и оно взорвется
4) таймер прекращает работать
5) если игрок кинет яйцо, оно не взорвется
Ну вот как-то так=) Вроде разъяснил понятно=)
Зачем вам таймер?
 

В смысле, что тут таймер не нужен. Игрок пишет команду - запоминаете время. Он бросает яйцо. Вы снова смотрите не часы. Если прошло времени больше чем нужно - оно не взрывается. Если меньше - взрывается.
 
В смысле, что тут таймер не нужен. Игрок пишет команду - запоминаете время. Он бросает яйцо. Вы снова смотрите не часы. Если прошло времени больше чем нужно - оно не взрывается. Если меньше - взрывается.
Я понял вашу мысль, но не понял, как это реализовать=) (как "посмотреть на часы"?)
Даже если я смогу посмотреть на часы, то как мне отмерить нужное время?=) Нужно ведь знать, в каком формате пишется время=)
Все сводится к тому, что нужно найти метод отмены ловли события. Подскажите, есть ли такой?=)
Как перестать ловить событие?=)
 
Последнее редактирование:
Я понял вашу мысль, но не понял, как это реализовать=) (как "посмотреть на часы"?)
Даже если я смогу посмотреть на часы, то как мне отмерить нужное время?=) Нужно ведь знать, в каком формате пишется время=)
Все сводится к тому, что нужно найти метод отмены ловли события. Подскажите, есть ли такой?=)
Как перестать ловить событие?=)
Просто создай дополнительное условие и проверяй его. Если A - тогда делать что-то, если B - тогда ничего не делать (игнорировать событие). Я думаю лучше всего выбрать тип переменной boolean, тогда соответственно A - true, а B - false.

P.S. Под условием я подразумеваю какую-то переменную, значение которой мы и будет проверять с помощью if
Пожалуй тебе ещё подойдёт вариант записи (текущего времени + времени на бросок яйца) в long, тогда при вызове соответственного эвента сравнивай записанное время с текущим. Если первое больше, тогда делай что-то, а если больше второе - ничего не делай.
 
Просто создай дополнительное условие и проверяй его. Если A - тогда делать что-то, если B - тогда ничего не делать (игнорировать событие). Я думаю лучше всего выбрать тип переменной boolean, тогда соответственно A - true, а B - false.

P.S. Под условием я подразумеваю какую-то переменную, значение которой мы и будет проверять с помощью if
Пожалуй тебе ещё подойдёт вариант записи (текущего времени + времени на бросок яйца) в long, тогда при вызове соответственного эвента сравнивай записанное время с текущим. Если первое больше, тогда делай что-то, а если больше второе - ничего не делай.
С таймером я вроде разобрался, но как это все привязать к комманде?=) У меня получается либо есть ивент внутри цикла таймера на 20 сек, но без комманды, либо есть комманда и таймер на 20 сек, но без ивента=)
P.S. Если не затруднит, покажи кодом плиз=)
Блин, вопрос, конечно, глупый, но почему он ругается на If?=)
Код:
if (eggs == 0)
        {
            @EventHandler
            public void onProjectileHit(ProjectileHitEvent e)
            {
               
                if(e.getEntity().getType() == EntityType.EGG)
                {
                    e.getEntity().getWorld().createExplosion(e.getEntity().getLocation(), 4F, true);
                    loc = e.getEntity().getLocation();
                   
                }
               
            }
        }
        else
    }
 
Блин, вопрос, конечно, глупый, но почему он ругается на If?=)
Код:
if (eggs == 0)
        {
            @EventHandler
            public void onProjectileHit(ProjectileHitEvent e)
            {
              
                if(e.getEntity().getType() == EntityType.EGG)
                {
                    e.getEntity().getWorld().createExplosion(e.getEntity().getLocation(), 4F, true);
                    loc = e.getEntity().getLocation();
                  
                }
              
            }
        }
        else
    }
Вы этот бред пишете от безысходности, потому что никто не хочет писать за вас?
Выучите наконец основы языка, а потом разработки плагинов
 
Вы этот бред пишете от безысходности, потому что никто не хочет писать за вас?
Выучите наконец основы языка, а потом разработки плагинов
Все, я разобрался, спасибо всем, кто подсказывал=) Gentalion, огромное спасибо за идею №1=)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх