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

Помогите Большая задержка при изменении предметов в меню

Тема в разделе "Разработка плагинов для новичков", создана пользователем normalped, 28 май 2024.

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

    normalped Участник Пользователь

    Баллы:
    36
    Приветствую! Я слушаю пакет из ProtocolLib под названием Window Items, чтобы отследить момент когда игрок открывает меню. Я прохожусь по каждому предмету, устанавливаю форматирование из MiniMessage с небольшими добавлениями для его имени и описания. Метод который устанавливает форматирование занимает +-0.1 секунду (зависит от размера текста), по этому весь этот процесс с заменной предметов в пакете занимает от 3 до 5 секунд, что очень фигово как по мне. Возможно ли ускорить все это дело? Буду благодарен за ваши предложения.
     
  2. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    так ты хоть код покажи
     
  3. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    Вот основная часть. Но чем это поможет, если проблема в другом?
    Код:
    var mm = MiniMessage.builder()
            .tags(TagResolver.builder()
                    .resolver(StandardTags.defaults())
                    .build()
            ).build();
    Component component = mm.deserialize(text);
    String json = GsonComponentSerializer.gson().serialize(component);
    
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Я так понимаю, меню из какого-то постороннего плагина? Тогда почему не InventoryOpenEvent?
    Работа через апи практически всегда производительней работы через ProtocolLib.

    Исходя из каких параметров предмета устанавливается кастомное название и описание? Возможно есть вариант кэшировать компоненты/json, чтобы не (де)сериализовать их каждый раз?

    Для чего ты каждый раз создаёшь новый инстанс MiniMessage? Его можно закэшировать, а в твоём, случае, скорее всего, стоит и вовсе использовать уже готовый MiniMessage.miniMessage(), поскольку кастомных тегов у тебя нет.

    Также покажи:
    1) Как ты из предмета в пакете получаешь text
    2) Как модифицируешь получившийся json
    3) Как затем устанавливаешь json обратно предмету в пакете
     
    Последнее редактирование: 29 май 2024
  5. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    Уже решил таким способом:
    Код:
    List<ItemStack> newItems = items.parallelStream()
            .map(item -> packet.setItemData(e.getPlayer(), item))
            .collect(Collectors.toList());
    
    Но не знаю, может это будет нагружать сервер.
     
  6. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    Я хочу чтобы форматирование было в каждом инвентаре/меню сервера и не слетало после взаимодействия с предметов в нем. Пробовал через апи это сделать, но там были какие то проблемы, по этому решил все делать через protocollib. И у меня так же есть свои теги, я походу немного не тот код отправил.
     

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