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

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

Ребят, помогите пожалуйста, как открыть игроку инвентарь от наковальни через команду?
Я попробовал вариант:

Код:
        player.openInventory(Bukkit.createInventory(p, InventoryType.ANVIL));
, но после крафта при нажатии на вещь она распадается и возвращается на прежнюю позицию. ( Крч отменяется крафт ). В консоли так-же вылезает ошибка:

Код:
java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 33, Size: 0
        at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_301]
        at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_301]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:45) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [server.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_301]
Caused by: java.lang.IndexOutOfBoundsException: Index: 33, Size: 0
        at java.util.ArrayList.rangeCheck(ArrayList.java:659) ~[?:1.8.0_301]
        at java.util.ArrayList.get(ArrayList.java:435) ~[?:1.8.0_301]
        at net.minecraft.server.v1_8_R3.Container.getSlot(Container.java:109) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:1513) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:31) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:9) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_301]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_301]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) ~[server.jar:git-Spigot-db6de12-18fbb24]
        ... 5 more
Версия 1.8
Всё хорошо на 1.8 в 2к22?
 
Всё хорошо на 1.8 в 2к22?
Не понимаю вас. 1.8 незаменима, пушто на версиях выше пвп дерьмище, а проекты которые нацелены на это, будут только на ней. Раз человек задал этот вопрос, следовательно, упор идёт именно на эту версию, а помощи по типу "динозавр" ему явно не надо
 
Не понимаю вас. 1.8 незаменима, пушто на версиях выше пвп дерьмище, а проекты которые нацелены на это, будут только на ней. Раз человек задал этот вопрос, следовательно, упор идёт именно на эту версию, а помощи по типу "динозавр" ему явно не надо
Лучше было в альфе, ничего лишнего.
 
Не понимаю вас. 1.8 незаменима, пушто на версиях выше пвп дерьмище, а проекты которые нацелены на это, будут только на ней. Раз человек задал этот вопрос, следовательно, упор идёт именно на эту версию, а помощи по типу "динозавр" ему явно не надо
Тогда нужно лазить в старую версию и разбиратся
 
Как можно получить сообщение, отправленное игроку плагином? Дайте готовый код, я просмотрел весь интернет, всё что там есть, вызывает ошибки. Мне нужно проверить строку на наличие определенного сообщения и отменить event или удалить ее.
 
Как можно получить сообщение, отправленное игроку плагином? Дайте готовый код, я просмотрел весь интернет, всё что там есть, вызывает ошибки. Мне нужно проверить строку на наличие определенного сообщения и отменить event или удалить ее.
Это не особо просто делается, поэтому ответил в отдельной теме
 
Две ситуации:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Понятно, большое спасибо
 
Больше времени потратишь на реализацию.
Правда еще один вопрос возник.

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

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

И все.

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

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

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

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

И все.

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

Много времени это не заняло.
Видимо, потому что что-то сделано неправильно.
Если это так, можете мне подсказать, что гуглить, чтобы узнать правильный способ реализации такого взаимодействия между плагинами?
Ты, вероятно, в коде где-то ошибся, т.к. отработать ивент в любом случае должны все плагины
 
Ты, вероятно, в коде где-то ошибся, т.к. отработать ивент в любом случае должны все плагины
О чем речь? Почему другие плагины должны отработать ивент, если у этих других плагинов нет листенера на этот ивент?
 
Последнее редактирование:
private PvPManager pvPManager;
final RegisteredServiceProvider<Antirelog> reg = (RegisteredServiceProvider<Antirelog>)Bukkit.getServicesManager().getRegistration((Class)Antirelog.class);
pvPManager = reg.getProvider().getPvpManager();
pvPmanager возвращает null, а мне нужно узнать, находится-ли игрок в пвп.
Подскажите пожалуйста как. Плаигн AntriRelog от славика
 
О чем речь? Почему другие плагины должны отработать ивент, если у этих других плагинов нет листенера на этот ивент?
Не так прочитал, Я подумал у тебя в двух плагин зарегистрирован ивент, и один не отрабатывает.

Так а в чем твоя ошибка? Что ты спрашиваешь, если все отрабатывает?
 
Правда еще один вопрос возник.

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

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

И все.

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

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

Так а в чем твоя ошибка? Что ты спрашиваешь, если все отрабатывает?
Не очень понял вопроса. Что конкретно смущает? Что это не заняло много времени? А почему должно было занять много?
Да, смутило, что в целом это было не сложно (разве что не охота каждый плагин делать зависимым от плагина с листенером), и много времени не заняло.
Подумал, может быть я что-то неправильно сделал, и так не принято подключаться к другому плагину, и есть более правильные способы.

Ну, судя по вашим ответам, такой способ является нормальной практикой. Поэтому, видимо, вопрос снят.
 
Всем привет. Создается инвентарь, и сразу открывается для игрока. Как-то можно у этого инвентаря через некоторое время заменить заголовок, не переоткрывая его?
Код:
Inventory inventory = Bukkit.createInventory(null, size, inventoryTitle);
player.openInventory(inventory);
Bukkit.getScheduler().runTaskLater(plugin, () -> {
    // inventory.setTitle(newTitle); ???
}, 20L);
 
Всем привет. Создается инвентарь, и сразу открывается для игрока. Как-то можно у этого инвентаря через некоторое время заменить заголовок, не переоткрывая его?
Код:
Inventory inventory = Bukkit.createInventory(null, size, inventoryTitle);
player.openInventory(inventory);
Bukkit.getScheduler().runTaskLater(plugin, () -> {
    // inventory.setTitle(newTitle); ???
}, 20L);
У инвентаря нет возможности изменить заголовок. Можно только создать новый, скопировать содержимое и открыть его без закрытия строго, чтобы курсор не перебрасывался в центр
 
Помогите пожалуйста.
Мне нужно, чтобы когда игрок ест, плагин получал тип еды, которую в данный момент игрок ест.
Всё попробовал, ничего не получается.
Юзаю ивент PlayerItemConsumeEvent
Ява 20
Версия майна 1.20
 

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

Назад
Верх