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

Не работает такая вещь

Тема в разделе "Разработка плагинов для новичков", создана пользователем Tyzun, 19 авг 2013.

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

    Tyzun Старожил

    Баллы:
    153
    Skype:
    tyzun1997
    Имя в Minecraft:
    _Tyzun_
    Пишу плагин который будет испускать фаербол если нажать мотыгой, написал вот код:
    Код:
    package ru.tyzun.plugin.hoefireball;
     
    import org.bukkit.Material;
    import org.bukkit.Server;
    import org.bukkit.entity.Fireball;
    import org.bukkit.entity.Player;
    import org.bukkit.entity.Projectile;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.util.Vector;
     
    public class HoeFireBall extends JavaPlugin implements Listener {
     
        @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvents(this, this);
        }
       
        @SuppressWarnings({ "unchecked", "rawtypes" })
        @EventHandler
        public void plugin(PlayerInteractEvent e, Player user, Server server){
            ItemStack i = user.getItemInHand();
            Class type = Fireball.class;
            Action a = e.getAction();
            int speed = 2;
            if(i.getType().equals(Material.DIAMOND_HOE) || i.getType().equals(Material.GOLD_HOE) || i.getType().equals(Material.IRON_HOE) || i.getType().equals(Material.STONE_HOE) || i.getType().equals(Material.WOOD_HOE)){
                if(a == Action.LEFT_CLICK_AIR){
                    Vector direction = user.getEyeLocation().getDirection().multiply(speed);
                    Projectile projectile = (Projectile)user.getWorld().spawn(user.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), type);
                    projectile.setShooter(user.getPlayer());
                    projectile.setVelocity(direction);
                }
            }
        }
    }
    но оно не работает.
    Подскажите, что не так я сделал?
     
    slavik123123123 нравится это.
  2. Хостинг MineCraft
    <
  3. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Код:
    public void plugin(PlayerInteractEvent e, Player user, Server server){
    \/ \/ \/
    public void PlayerInteractEvent (PlayerInteractEvent e){
    Код:
    if(a == Action.LEFT_CLICK_AIR){
    \/ \/ \/
     
    if(a.equals(Action.LEFT_CLICK_AIR)){
    Траекторию менять не нужно. Изначально будет норм.
    Последнюю ошибку найдешь сам.
     
  4. Автор темы
    Tyzun

    Tyzun Старожил

    Баллы:
    153
    Skype:
    tyzun1997
    Имя в Minecraft:
    _Tyzun_
    Непонял что имееш ввиду
     
  5. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Спавни дроп и задавай ему траекторию
     
  6. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Action можно сравнивть с пощью == , это же енумы, а вот с эвентом товарищ и правда налажал.
     
    fromgate нравится это.
  7. RVXman

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

    Баллы:
    123
    Имя в Minecraft:
    RVXman
    • 100500-е предупреждение, которое нужно кому-то выдать
    @оффтоп
    Время 00:01
    # Мой сотый пост, нужно где то красиво разместить было)
     
  8. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Ребята, не могу никак заставить работать вот этот код:
    Код:
      public void onPlayerInteract(PlayerInteractEvent event)
        {
            Player player = event.getPlayer();
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Player-Was-Interacted").toString());
           
            if(event.getAction().equals(Action.LEFT_CLICK_AIR)){
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Air").toString());}
    }
    
    Когда кликаю по чему-нибудь - выдает первое сообщение. Второе сообщение не выдает никогда.
    CraftBukkit - 1.4.5.
     
  9. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Правые и левые клики по воздуху всегда как то худо вызывались
     
  10. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    LEFT_CLICK_AIR, на сколько я помню, выдаётся при ударе мечём по воздуху.
     
  11. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Ну вообще изначально я так и делал. А цитата кода, которую я привел выше - это после попытки сделать так, как предлагал выше Jampire. Не работает ни то, ни другое. Плагин решительно не отзывается на клик по воздуху. Ни на левый, ни на правый.

    Что делать, люди? Плагин хороший пропадает...
     
  12. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    Вру, работает он почти всегда.
     
  13. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    У меня не срабатывает никогда. Что за фигня?
     
  14. second_vynder

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

    Баллы:
    153
    Skype:
    my.nik.vynder
    Это Баккит, брат.
     
  15. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Я скачал плагин - он работает с ошибками. Решил декомпилировать и доточить его сам (исходников нет на страничке плагина). И там был подобный кусок кода. Фишка в том, что изначально этот плагин у меня реагировал на клик по воздуху. А если декомпилировать и обратно собрать - уже не работает ни фига. Получается, что при декомпилировании что-то потерялось или было разобрано с ошибкой. Помогите.
     
  16. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Декомпиляция - неблагодарное дело. Она никогда не восстанавливает 100% сорцев.
    В любом случае нужно сделать такие веши:

    1) посмотреть в логи компилятора. Возможно он и не компилируется вовсе. Возможно есть очень важные предупреждения, которые он выдал. Конечно, это можно приложить тут в спойлер.

    2) Посмотреть, загружен ли плагин вообще. Для этого есть команда /plugins

    3) Самое основное! Открыть логи сервера. Внимательно прочитать. Если найдутся сообщения об ошибках - прочитать еще внимательнее и постараться найти баг. (обычно бывает написано "Exception at [$строка:$столбец]" ) Вообще в логах содержится 99% полезной информации. Поэтому было бы не плохо логи приложить к сообщению в спойлере (хотя бы отрывок лога с ошибкой)

    4) Приложить исходники. Нужно прикладывать не отрывок кода (функцию, метод), а весь файл целиком, с нумерацией строк.
    [spoiler][code=java]можно вставить код так[/code][/spoiler]
    или же воспользоваться услугами сайта pastebin.com

    UPD:
    5) Научитесь использовать обычный дебаггер! Он сильно экономит время при поиске ошибки.
    Было бы здорово поставить программу на паузу, и посмотреть какие значения хранятся в переменных, верно?!
     
    Последнее редактирование: 11 ноя 2013
  17. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    1. Компилятор не ругается. Вообще.
    2. Команда /plugins выдает, что плагин загружен. Впрочем, появление при клике по блоку фразы "Player-Was-Interacted", по-моему, куда красноречивее этой команды. Плагин работает и откликается на первое условие - наличие event. Но только если кликать по блоку. Если кликать по воздуху - фраза не появляется, процедура вообще не запускается. А ведь должна.
    3. Самое основное находится у меня перед глазами всегда. Потому что сервер работает в консоли в соседнем окне моего монитора. И там нет сообщений об ошибках. Не только связанных с этим плагином, но и вообще никаких ошибок нет.
    4. В данном случае речь идет даже не о целом плагине, а об этой конкретной процедуре. И весь код сюда вытаскивать совсем необязательно для того, чтобы обсуждать вопрос. Потому что по коду, по-моему, очевидно, что он никак не зависит от соседних процедур плагина - по крайней мере, в том виде, в котором я сюда его привёл.
    5. Не спорю. Но разве в моем коде недостаточно меток, чтобы при работе процедуры понять, что она работает не так, как ожидается? И понять, что значение переменной Action не принимает значения LEFT_CLICK_AIR, когда я произвожу при тестировании LEFT_CLICK_AIR, исходя из того, что процедура не запускается, когда я кликаю по воздуху?
     
  18. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Код:
    public void onPlayerInteract(PlayerInteractEvent event){
            System.out.println(event.getAction());
            System.out.println(event.getAction() == Action.LEFT_CLICK_AIR);
            Player player = event.getPlayer();
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Player-Was-Interacted").toString());
           
            if(event.getAction().equals(Action.LEFT_CLICK_AIR)){
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Air").toString());}
    }
    
    вот очень грубый способ диагностики.
     
  19. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Ребятки, а вы @EventHandler не забыли?)
     
  20. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Jampire, нет. Если бы забыли, по моему опыту, процедура вообще не работала бы.

    DPOH-VAR, вставил я эти строки. Сделал такой блок:
    Код:
    @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
    
        public void onPlayerInteract(PlayerInteractEvent event)
        {
            System.out.println(event.getAction());
            System.out.println(event.getAction() == Action.LEFT_CLICK_AIR);
           
            Player player = event.getPlayer();
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Player-Was-Interacted").toString());
           
            if(event.getAction() == (Action.LEFT_CLICK_AIR)){
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Air").toString());}
           
            if(event.getAction() == (Action.RIGHT_CLICK_AIR)){
                player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Right-Clicked-Air").toString());}
           
            if(event.getAction() == (Action.LEFT_CLICK_BLOCK)){
            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Left-Clicked-Block").toString());}
           
            if(event.getAction() == (Action.RIGHT_CLICK_BLOCK)){
                player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("Right-Clicked-Block").toString());}
    }
    На экране в игре только : "Left-Click-Block", "Right-Click-Block", "Player-Was-interacted".
    В консоли только: "LEFT_CLICK_BLOCK", "RIGHT_CLICK_BLOCK" и "false".
    Не видит эта процедура событий клика по воздуху. Вообще. Видимо, это нужно прослушивать каким-то другим методом.
     
  21. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Обрати внимание на аннотацию!
    Код:
    @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
    В ней установлено правило - не обрабатывать событие, если оно отменено.
    А событие клика по воздуху изначально создается как отмененное (я сам удивился... но это так)
    Убери ignoreCancelled, и все заработает.

    Это еще раз говорит о том, что файл с исходниками нужно показывать полностью ;)
     
    smilesdc, Den_Abr, LaoTheLizard и ещё 1-му нравится это.

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