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

Стартап Помощь новичкам и тем, кто мало писал плагины. (+ LifeHack'и)

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

  1. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Всё хорошо на 1.8 в 2к22?
     
  2. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Не понимаю вас. 1.8 незаменима, пушто на версиях выше пвп дерьмище, а проекты которые нацелены на это, будут только на ней. Раз человек задал этот вопрос, следовательно, упор идёт именно на эту версию, а помощи по типу "динозавр" ему явно не надо
     
  3. HauserGrim

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

    Баллы:
    96
    Лучше было в альфе, ничего лишнего.
     
  4. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Тогда нужно лазить в старую версию и разбиратся
     
  5. Andrine

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

    Баллы:
    66
    Я использую эту версию для мг и мне нужна накова, как ее получить я не понимаю.
     
  6. Andrine

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

    Баллы:
    66
    Как можно получить сообщение, отправленное игроку плагином? Дайте готовый код, я просмотрел весь интернет, всё что там есть, вызывает ошибки. Мне нужно проверить строку на наличие определенного сообщения и отменить event или удалить ее.
     
  7. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Это не особо просто делается, поэтому ответил в отдельной теме
     
  8. SmashDestroy

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

    Баллы:
    63
    Две ситуации:

    1. Есть 10 плагинов.
    У каждого плагина есть свой список каких-то обьектов.
    У каждого плагина зарегистрирован свой листенер на ивент PlayerJoinEvent (условно, тип ивента не меняет суть вопроса).
    Получается, что при срабатывании ивента PlayerJoinEvent у каждого из 10 плагинов срабатывает свой листенер, и каждый листенер перебирает свой список обьектов.

    2. Есть 1 плагин с листенером PlayerJoinEvent и 10 других плагинов.
    При запуске сервера 10 других плагинов получают плагин с листенером из getPluginManager() и регистрируют в общем списке какие-то свои обьекты.
    Получается, что при срабатывании ивента PlayerJoinEvent срабатывает один листенер, который перебирает один список каких-то обьектов.

    Правильно ли я понимаю, что в ситуации с одним листенером и одним списком обьектов затраты времени на выполнение кода будут меньше, чем в ситуации со множеством одинаковых листенеров и разных списков обьектов?

    Теоретически, сильная ли вообще разница между этими двумя ситуациями?

    По идее вопрос можно свести к более простому: сильно ли в плане нагрузки на сервер много одинаковых листенеров отличаются от одного листенера.
     
  9. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Для того, чтобы ответить на этот вопрос, надо понимать, как в ядре работает вызов событий слушателей.
    По большому счёту там список объектов, которые и вызываются при отработке того или иного события. Более того, там даже не рефлексией вызов. В Paper там чуть ли не прямые вызовы. Поэтому оверхед самих по себе слушателей минимален.
    Но надо понимать, что внутри слушателей тоже есть проверки. Если ты добавишь по одному условию в каждый слушатель, то это уже 10 проверок буквально одного и того же условия.
    Поэтому если определить все операции в один слушатель, то можно существенно сократить кол-во используемого процессорного времени, если в слушателе много условий или других операций.

    Поэтому однозначного ответа на твой вопрос нет. Всё зависит от контакта, логики работы конкретно твоего приложения.

    Но одно я могу сказать точно - если у тебя реально просто 10 слушателей, которые просто перебирают лист своих объектов, то тут от оптимизации будет одно название, буквально экономия наносекунд. Больше времени потратишь на реализацию. А твое время жизни куда ценнее, чем время исполнения программы
     
  10. SmashDestroy

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

    Баллы:
    63
    Понятно, большое спасибо
     
  11. SmashDestroy

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

    Баллы:
    63
    Правда еще один вопрос возник.

    Может я что-то неправильно сделал, но в целом вышло так:
    Создал плагин с листенером нужного мне действия. Внутри листенера объявил список. И в главном классе плагина (который наследуется от JavaPlugin) объявил метод добавления новых объектов в этот список (пусть будет "addNewObject();").

    Далее в код другого плагина, который должен в список плагина с листенером записывать свой объект, я грубо говоря добавил одну строку (ну и "depend" в "plugin.yml"):
    Код:
    Bukkit.getServer().getPluginManager().getPlugin("имя-плагина-с-листенером").addNewObject(какой-то_объект);
    И все.

    После запуска сервера первым запускается плагин с листенером, делает у себя переменную с пустым списком.
    Когда запускается второй плагин, он добавляет в список необходимый обьект.

    Много времени это не заняло.
    Видимо, потому что что-то сделано неправильно.
    Если это так, можете мне подсказать, что гуглить, чтобы узнать правильный способ реализации такого взаимодействия между плагинами?
     
  12. ReloGGrc

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

    Баллы:
    46
    Имя в Minecraft:
    ALis
    Ты, вероятно, в коде где-то ошибся, т.к. отработать ивент в любом случае должны все плагины
     
  13. SmashDestroy

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

    Баллы:
    63
    О чем речь? Почему другие плагины должны отработать ивент, если у этих других плагинов нет листенера на этот ивент?
     
    Последнее редактирование: 15 дек 2022
  14. Warrner

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

    Баллы:
    61
    private PvPManager pvPManager;
    final RegisteredServiceProvider<Antirelog> reg = (RegisteredServiceProvider<Antirelog>)Bukkit.getServicesManager().getRegistration((Class)Antirelog.class);
    pvPManager = reg.getProvider().getPvpManager();
    pvPmanager возвращает null, а мне нужно узнать, находится-ли игрок в пвп.
    Подскажите пожалуйста как. Плаигн AntriRelog от славика
     
  15. ReloGGrc

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

    Баллы:
    46
    Имя в Minecraft:
    ALis
    Не так прочитал, Я подумал у тебя в двух плагин зарегистрирован ивент, и один не отрабатывает.

    Так а в чем твоя ошибка? Что ты спрашиваешь, если все отрабатывает?
     
  16. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Не очень понял вопроса. Что конкретно смущает? Что это не заняло много времени? А почему должно было занять много?
     
  17. SmashDestroy

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

    Баллы:
    63
    Да, смутило, что в целом это было не сложно (разве что не охота каждый плагин делать зависимым от плагина с листенером), и много времени не заняло.
    Подумал, может быть я что-то неправильно сделал, и так не принято подключаться к другому плагину, и есть более правильные способы.

    Ну, судя по вашим ответам, такой способ является нормальной практикой. Поэтому, видимо, вопрос снят.
     
  18. Studenikin

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

    Баллы:
    123
    Skype:
    vanya.studenikin
    Имя в Minecraft:
    stuvanya
    Всем привет. Создается инвентарь, и сразу открывается для игрока. Как-то можно у этого инвентаря через некоторое время заменить заголовок, не переоткрывая его?
    Код:
    Inventory inventory = Bukkit.createInventory(null, size, inventoryTitle);
    player.openInventory(inventory);
    Bukkit.getScheduler().runTaskLater(plugin, () -> {
        // inventory.setTitle(newTitle); ???
    }, 20L);
    
     
  19. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    У инвентаря нет возможности изменить заголовок. Можно только создать новый, скопировать содержимое и открыть его без закрытия строго, чтобы курсор не перебрасывался в центр
     
  20. T0rr0

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

    Баллы:
    66
    Помогите пожалуйста.
    Мне нужно, чтобы когда игрок ест, плагин получал тип еды, которую в данный момент игрок ест.
    Всё попробовал, ничего не получается.
    Юзаю ивент PlayerItemConsumeEvent
    Ява 20
    Версия майна 1.20
     

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