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

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

Jampire

Старожил
Пользователь
Баллы
173
Имя в Minecraft
Jampire
Как зарегистрировать метод, что-бы его можно было вызвать из другого плагина?
Java:
Bukkit.getPluginManager().getPlugin(plugin).myMethod();
 
Если я не ошибаюсь, то просто в главном классе плагина лепишь public метод, а в другом плагине пишешь нечто подобное


Java:
import ru.myCoolPlugin.CoolPlugin;
 
<...>
 
try {
 
CoolPlugin cpl = ( CoolPlugin ) Bukkit.getPluginManager().getPlugin("CoolPlugin");
 
} catch (Exception e) {
 
//твой плагин не найден
 
}
 
cpl.anyMethod();
 
Если я не ошибаюсь, то просто в главном классе плагина лепишь public метод, а в другом плагине пишешь нечто подобное


Java:
import ru.myCoolPlugin.CoolPlugin;
 
<...>
 
try {
 
CoolPlugin cpl = ( CoolPlugin ) Bukkit.getPluginManager().getPlugin("CoolPlugin");
 
} catch (Exception e) {
 
//твой плагин не найден
 
}
 
cpl.anyMethod();
Именно так уже пробовал.. (
Так-же пытался рыться в WG - но так ничего и не нашел.. Слишком много кода там..)
 
Решил самостоятельно.
Java:
    private ChatShop getChatShop() {
        Plugin ch = Bukkit.getPluginManager().getPlugin("ChatShop");
        if (ch == null || !(ch instanceof ChatShop)) {
            return null;
        }
        return (ChatShop) ch;
    }
    getChatShop().myMethod();
 
Подскажите где почитать или покажите пример кода взаимодействия плагинов.
Задача: взаимодействовать с плагинов iConomy, и в будущем сделать связку своих плагинов, которые бы могли работать автономно.

Например плагин определяет какой-либо тип/статус игроку, и нужно получить этот статус другим своим плагином. Общую таблицу в бд не предлагать, т.к. неудобно и ресурсоемко.
 
Если нужно взаимодействовать с iConomy - то нужно однозначно работать с Vault. Просто потому, что в нём уже учтено API от множества экономических плагинов и можно быть спокойным: если стоит Vault, то неважно что за экономика используется на сервере.

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

Ну и аналогично нужно организовывать взаимодействие между плагинами. Также как к Vault можно "подцепиться" к любому плагину и воспользоваться любым методом (если он public, конечно). Единственное не всегда авторы плагинов заботятся о том, что кому-то могут потребоваться их методы и переменные, тогда приходится изучать кода плагина чтобы получить хоть что-то путное.
 
TEEN, объединил две темы. Ответ на Ваш вопрос - выше :)
 
Пример WorldEdit:
Java:
    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;
    }

Java:
 WorldEditPlugin worldEdit = enGuard.getWorldEdit();

Пример на enMoney (нашей системе денег):
Java:
    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;
    }

Java:
enMoney money = enGuard.getMoney();
 
Не знаю куда обратиться с этим вопросом поэтому пишу сюда.
Такой вопрос : как сделать чтобы действие выполнялось не сразу, а например через 2 сек. в этом коде:
Java:
    @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))
            {
                //Действия
            }
        }
    }
 
Нужно создать "отложенную задачу".

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

Java:
        Bukkit.getScheduler().scheduleAsyncDelayedTask(plg, new Runnable(){
            public void run (){
                // тут чего-то делаем
            }
        }, <20*время в секундах>);

Обращаю внимание, что это это ассинхронная задача - т.е. выполняется не в основном потоке сервера, поэтому если в этой задаче производиться действия с блоками то можно уронить сервер.

Можно аналогично выполнить отложенной синхронизированную задачу. Но с ними тоже есть нюанс - если эта задача ресурсоемка - лагать будут все ;)
 
Под действием скрывается это:
Java:
player.getInventory().setItemInHand(new ItemStack(0));
Я так уже пробовал и тут я не могу понять, как достать игрока.
 
Ну... сделай процедуру похожую на эту (работает или нет - не проверял ;)) И вызывай её когда нужно.


Java:
    public void removeItem (final Player player){
        Bukkit.getScheduler().scheduleSyncDelayedTask(plg, new Runnable(){
            public void run (){
                player.getInventory().setItemInHand(new ItemStack(0));
            }
        }, 40L);
    }

Но... Ты не думаешь, что ушлые игроки будут успевать за две секунды менять тот предмет, который ты хочешь вытащить из рук на что-то другое? Или даже случайно - колесом мыши крутанул и уже вместо убер-меча в руках деревянная лопата ;)
 
Причем тут public void removeItem? если надо чтоб задержка была в:
Java:
    @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));                          
                }
          }
      }
    }
 
CrazyJared, читайте себя выше:

Не знаю куда обратиться с этим вопросом поэтому пишу сюда.
Такой вопрос : как сделать чтобы действие выполнялось не сразу, а например через 2 сек. в этом коде:

Под действием скрывается это:
Код (Java):
  1. player.getInventory().setItemInHand(new ItemStack(0));

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

Именно player.getInventory().setItemInHand(new ItemStack(0)); вызывается с задержкой. Можно конечно раскрыть процедуру и перенести её внутрь Вашей. Но суть от этого не меняется.
 
Спс, вопрос исчерпан)
Но возник другой, как проверить, если player что либо выпил или если player cъел что либо? Какое событие в этом задействовано?
Это конечно можно обойти, но ресурсоемко.
 
Спс, вопрос исчерпан)
Но возник другой, как проверить, если player что либо выпил или если player cъел что либо? Какое событие в этом задействовано?
Это конечно можно обойти, но ресурсоемко.
PlayerInteract / или погляди jd.bukkit.org... Мб есть событие другое.
 
Пример WorldEdit:
Java:
    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;
    }

Java:
 WorldEditPlugin worldEdit = enGuard.getWorldEdit();

Пример на enMoney (нашей системе денег):
Java:
    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;
    }

Java:
enMoney money = enGuard.getMoney();


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

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

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

Назад
Верх