Вопрос PlayerEditBookEvent или изменение текста после редактирования книги

Статус
В этой теме нельзя размещать новые ответы.

Xezard

Дегустатор лени
Разработчик
Инструктор
Пользователь
Сообщения
600
Решения
52
Веб-сайт
xezard.me
Привет.

В процессе написания небольшого плагина наткнулся на следующую проблему - при редактировании игроком книги мне нужно изменять текст внесённый игроком, в зависимости от некоторых условий. Для решения этой задачи я использую PlayerEditBookEvent.
Суть в том, что, когда игрок нажимает кнопку "Done", после того как закончил вносить текст - событие вызывается корректно и код слушателя выполняется, но вот текст в книге при этом не изменяется.
Мой код выглядит примерно следующим образом:
Java:
@EventHandler
public void onEdit(PlayerEditBookEvent event)
{
    Player player = event.getPlayer();

    BookMeta bookMeta = event.getNewBookMeta();

    bookMeta.setPages(Collections.singletonList("test"));

    event.setNewBookMeta(bookMeta);
}
Тесты этого кода я проводил на Yatopia-"7f24790" (MC: 1.16.4) (Implementing API version 1.16.4-R0.1-SNAPSHOT)

Из интересного - код корректно работает при попытке подписать книгу - мета книги изменяется на тот текст, который мне нужен.
Мне же нужно чтобы текст книги менялся при каждой попытке его редактирования игроком.

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

Java:
    @EventHandler
    public void onEdit(PlayerEditBookEvent event)
    {
        Player player = event.getPlayer();
        
        ItemStack book = player.getInventory().getItemInMainHand();
        BookMeta bookMeta = (BookMeta) book.getItemMeta();
        
        bookMeta.setPage(1, bookMeta.getPage(1).replace("a", "b"));
        
        book.setItemMeta(bookMeta);
    }
Попробуй менять не мету ивента а мету книги по типу

Java:
    @EventHandler
    public void onEdit(PlayerEditBookEvent event)
    {
        Player player = event.getPlayer();
        
        ItemStack book = player.getInventory().getItemInMainHand();
        BookMeta bookMeta = (BookMeta) book.getItemMeta();
        
        bookMeta.setPage(1, bookMeta.getPage(1).replace("a", "b"));
        
        book.setItemMeta(bookMeta);
    }
 
Попробуй менять не мету ивента а мету книги по типу

Java:
    @EventHandler
    public void onEdit(PlayerEditBookEvent event)
    {
        Player player = event.getPlayer();
      
        ItemStack book = player.getInventory().getItemInMainHand();
        BookMeta bookMeta = (BookMeta) book.getItemMeta();
      
        bookMeta.setPage(1, bookMeta.getPage(1).replace("a", "b"));
      
        book.setItemMeta(bookMeta);
    }
Я хотел было уже пометить тему решённой, но, при таком варианте, выяснилось, что на версии 1.12.2 [Paper version git-Paper-1618 (MC: 1.12.2
) (Implementing API version 1.12.2-R0.1-SNAPSHOT)] этот код просто не работает. Никаких ошибок, ничего, текст в книге просто не заменяется. При этом этот же код работает отлично на версии 1.16.4 на Yatopia.
 
Я хотел было уже пометить тему решённой, но, при таком варианте, выяснилось, что на версии 1.12.2 [Paper version git-Paper-1618 (MC: 1.12.2
) (Implementing API version 1.12.2-R0.1-SNAPSHOT)] этот код просто не работает. Никаких ошибок, ничего, текст в книге просто не заменяется. При этом этот же код работает отлично на версии 1.16.4 на Yatopia.
Выполни присваивание меты через тик
 
Выполни присваивание меты через тик
Хех, жесть костыли конечно.
Теперь, при первом редактировании - текст заменяется. Но если после этого отредактировать изменённый плагином текст - он не заменяется.
Авто объединение сообщений:

UPD: прикрутил player.updateInventory(); и всё встало на свои места.
Большое спасибо за помощь.

Решено.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу