1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Взаимодействие плагинов между собой

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

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

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Как зарегистрировать метод, что-бы его можно было вызвать из другого плагина?
    Код:
    Bukkit.getPluginManager().getPlugin(plugin).myMethod();
     
  2. akke

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

    Баллы:
    103
    Если я не ошибаюсь, то просто в главном классе плагина лепишь public метод, а в другом плагине пишешь нечто подобное


    Код:
    import ru.myCoolPlugin.CoolPlugin;
     
    <...>
     
    try {
     
    CoolPlugin cpl = ( CoolPlugin ) Bukkit.getPluginManager().getPlugin("CoolPlugin");
     
    } catch (Exception e) {
     
    //твой плагин не найден
     
    }
     
    cpl.anyMethod();
     
    Сникерсни нравится это.
  3. Автор темы
    Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Именно так уже пробовал.. (
    Так-же пытался рыться в WG - но так ничего и не нашел.. Слишком много кода там..)
     
  4. Автор темы
    Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Решил самостоятельно.
    Код:
        private ChatShop getChatShop() {
            Plugin ch = Bukkit.getPluginManager().getPlugin("ChatShop");
            if (ch == null || !(ch instanceof ChatShop)) {
                return null;
            }
            return (ChatShop) ch;
        }
        getChatShop().myMethod();
     
    ВремяПриключений нравится это.
  5. TEEN

    TEEN Активный участник Пользователь

    Баллы:
    88
    Skype:
    teen_true
    Имя в Minecraft:
    TEEN
    Подскажите где почитать или покажите пример кода взаимодействия плагинов.
    Задача: взаимодействовать с плагинов iConomy, и в будущем сделать связку своих плагинов, которые бы могли работать автономно.

    Например плагин определяет какой-либо тип/статус игроку, и нужно получить этот статус другим своим плагином. Общую таблицу в бд не предлагать, т.к. неудобно и ресурсоемко.
     
  6. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Если нужно взаимодействовать с iConomy - то нужно однозначно работать с Vault. Просто потому, что в нём уже учтено API от множества экономических плагинов и можно быть спокойным: если стоит Vault, то неважно что за экономика используется на сервере.

    Знакомство с Vault надо начинать со страницы плагина http://dev.bukkit.org/server-mods/vault/

    Ну и аналогично нужно организовывать взаимодействие между плагинами. Также как к Vault можно "подцепиться" к любому плагину и воспользоваться любым методом (если он public, конечно). Единственное не всегда авторы плагинов заботятся о том, что кому-то могут потребоваться их методы и переменные, тогда приходится изучать кода плагина чтобы получить хоть что-то путное.
     
    Jampire и DPOH-VAR нравится это.
  7. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    TEEN, объединил две темы. Ответ на Ваш вопрос - выше :)
     
    Jampire нравится это.
  8. TEEN

    TEEN Активный участник Пользователь

    Баллы:
    88
    Skype:
    teen_true
    Имя в Minecraft:
    TEEN
    Модераторам огромное спасибо. Заметил соседний пост только после размещения своего. И все вопросы отпали :)
     
  9. ensirius

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

    Баллы:
    123
    Пример WorldEdit:
    Код:
        public static WorldEditPlugin getWorldEdit() {
            Plugin worldEdit = Bukkit.getServer().getPluginManager()
                    .getPlugin("WorldEdit");
     
            if (worldEdit == null) {
                log.info("[" + pdfFile.getName()
                        + "] WorldEdit does not appear to be installed.");
            }
     
            if ((worldEdit instanceof WorldEditPlugin)) {
                return (WorldEditPlugin) worldEdit;
            }
     
            log.info("[" + pdfFile.getName()
                    + "] WorldEdit detection failed.");
            return null;
        }
    Код:
     WorldEditPlugin worldEdit = enGuard.getWorldEdit();
    Пример на enMoney (нашей системе денег):
    Код:
        public static enMoney getMoney() {
            Plugin money = Bukkit.getServer().getPluginManager()
                    .getPlugin("enMoney");
     
            if (money == null) {
                log.info("[" + pdfFile.getName()
                        + "] enMoney does not appear to be installed.");
            }
     
            if ((money instanceof enMoney)) {
                return (enMoney) money;
            }
     
            log.info("[" + pdfFile.getName()
                    + "] enMoney detection failed.");
            return null;
        }    
    Код:
    enMoney money = enGuard.getMoney();
     
  10. CrazyJared

    CrazyJared Активный участник Пользователь

    Баллы:
    68
    Не знаю куда обратиться с этим вопросом поэтому пишу сюда.
    Такой вопрос : как сделать чтобы действие выполнялось не сразу, а например через 2 сек. в этом коде:
    Код:
        @EventHandler
        public void PlayerInteract(PlayerInteractEvent e)
        {
            Player player = e.getPlayer();
            if((e.getAction() == Action.RIGHT_CLICK_BLOCK) || (e.getAction() == Action.RIGHT_CLICK_AIR))
            {
                if(player.getItemInHand().getType().equals(Material.BOOK))
                {
                    //Действия
                }
            }
        }
     
  11. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Нужно создать "отложенную задачу".

    Приблизительно так:

    Код:
            Bukkit.getScheduler().scheduleAsyncDelayedTask(plg, new Runnable(){
                public void run (){
                    // тут чего-то делаем
                }
            }, <20*время в секундах>);
    Обращаю внимание, что это это ассинхронная задача - т.е. выполняется не в основном потоке сервера, поэтому если в этой задаче производиться действия с блоками то можно уронить сервер.

    Можно аналогично выполнить отложенной синхронизированную задачу. Но с ними тоже есть нюанс - если эта задача ресурсоемка - лагать будут все ;)
     
  12. CrazyJared

    CrazyJared Активный участник Пользователь

    Баллы:
    68
    Под действием скрывается это:
    Код:
    player.getInventory().setItemInHand(new ItemStack(0));
    Я так уже пробовал и тут я не могу понять, как достать игрока.
     
  13. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Ну... сделай процедуру похожую на эту (работает или нет - не проверял ;)) И вызывай её когда нужно.


    Код:
        public void removeItem (final Player player){
            Bukkit.getScheduler().scheduleSyncDelayedTask(plg, new Runnable(){
                public void run (){
                    player.getInventory().setItemInHand(new ItemStack(0));
                }
            }, 40L);
        }
    Но... Ты не думаешь, что ушлые игроки будут успевать за две секунды менять тот предмет, который ты хочешь вытащить из рук на что-то другое? Или даже случайно - колесом мыши крутанул и уже вместо убер-меча в руках деревянная лопата ;)
     
  14. CrazyJared

    CrazyJared Активный участник Пользователь

    Баллы:
    68
    Причем тут public void removeItem? если надо чтоб задержка была в:
    Код:
        @EventHandler
        public void PlayerInteract(PlayerInteractEvent e)
        {
            Player player = e.getPlayer();
            if((e.getAction() == Action.RIGHT_CLICK_BLOCK) || (e.getAction() == Action.RIGHT_CLICK_AIR))
            {
                if(player.getItemInHand().getType().equals(Material.BOOK))
                {
                    if(player.getItemInHand().getTypeId() == 373 && player.getItemInHand().getDurability() == 0)
                    {
                        // вот это действие нужно задержать на 2 сек - player.getInventory().setItemInHand(new ItemStack(0));                          
                    }
              }
          }
        }
     
    Stalkerdeni971 нравится это.
  15. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    CrazyJared, читайте себя выше:

    Это "действие" помещено в код процедуры, которую Вы должны будете вызвать вместо "вот это действие....".

    Именно player.getInventory().setItemInHand(new ItemStack(0)); вызывается с задержкой. Можно конечно раскрыть процедуру и перенести её внутрь Вашей. Но суть от этого не меняется.
     
    slavik123123123 нравится это.
  16. CrazyJared

    CrazyJared Активный участник Пользователь

    Баллы:
    68
    Спс, вопрос исчерпан)
    Но возник другой, как проверить, если player что либо выпил или если player cъел что либо? Какое событие в этом задействовано?
    Это конечно можно обойти, но ресурсоемко.
     
  17. Автор темы
    Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    PlayerInteract / или погляди jd.bukkit.org... Мб есть событие другое.
     
  18. UnknKriod

    UnknKriod Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    UnknKriod

    Тема, конечно устарела, но как мне получить тип (тут enMoney)?
     
  19. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Где вы находите темы 11летней давности?
    Если ты имеешь ввиду "как получить название главного класса плагина" - обычно такое пишут в документации (ну либо открой джарник, обычно по названию понятно, какой класс главный)
    Если ты имеешь ввиду "как получить объект enMoney в данном примере" - вызвать метод getMoney()
     
  20. UnknKriod

    UnknKriod Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    UnknKriod
    Спасибо за ответ, я разобрался в проблеме (просто забыл засунуть jar в проект)
     

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