24package com.dreamfirestudios.dreamcore.DreamBook;
26import com.dreamfirestudios.dreamcore.DreamChat.DreamMessageFormatter;
27import com.dreamfirestudios.dreamcore.DreamChat.DreamMessageSettings;
28import com.dreamfirestudios.dreamcore.DreamCore;
29import com.dreamfirestudios.dreamcore.DreamJava.DreamClassID;
30import com.dreamfirestudios.dreamcore.DreamPersistentData.DreamPersistentItemStack;
32import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
33import net.md_5.bungee.api.chat.TextComponent;
34import org.bukkit.Bukkit;
35import org.bukkit.Material;
36import org.bukkit.entity.Player;
37import org.bukkit.inventory.ItemStack;
38import org.bukkit.inventory.meta.BookMeta;
39import org.bukkit.persistence.PersistentDataType;
57 @Getter
private ItemStack book;
58 @Getter
private BookMeta bookMeta;
60 private final List<String> pages =
new ArrayList<>();
61 private final List<UUID> viewers =
new ArrayList<>();
73 if (player ==
null)
throw new IllegalArgumentException(
"Player cannot be null.");
74 return viewers.contains(player.getUniqueId());
82 if (player ==
null)
throw new IllegalArgumentException(
"Player cannot be null.");
84 player.closeInventory();
86 if (openEvent.isCancelled())
return;
88 player.openBook(book);
90 UUID
id = player.getUniqueId();
91 if (!viewers.contains(
id)) {
93 if (!added.isCancelled()) {
104 public void openBook(Player player,
int durationInSeconds) {
105 if (durationInSeconds < 0)
throw new IllegalArgumentException(
"Duration cannot be negative.");
107 Bukkit.getScheduler().runTaskLater(
110 durationInSeconds * 20L
119 if (player ==
null)
throw new IllegalArgumentException(
"Player cannot be null.");
121 UUID
id = player.getUniqueId();
122 if (!viewers.contains(
id))
return;
125 player.openInventory(Bukkit.createInventory(
null, 9));
126 player.closeInventory();
131 if (!removed.isCancelled()) {
141 if (player ==
null)
throw new IllegalArgumentException(
"Player cannot be null.");
153 return Collections.unmodifiableList(
new ArrayList<>(pages));
161 if (newPages ==
null)
throw new IllegalArgumentException(
"Pages cannot be null.");
163 pages.addAll(newPages);
164 bookMeta.setPages(pages);
165 book.setItemMeta(bookMeta);
173 if (additionalPages ==
null)
throw new IllegalArgumentException(
"Pages cannot be null.");
174 for (String p : additionalPages) {
175 pages.add(PlainTextComponentSerializer.plainText()
176 .serialize(DreamMessageFormatter.format(p, DreamMessageSettings.all())));
178 bookMeta.setPages(pages);
179 book.setItemMeta(bookMeta);
188 bookMeta.setPages(pages);
189 book.setItemMeta(bookMeta);
215 private final ItemStack book;
216 private final BookMeta bookMeta;
217 private final List<String> pages =
new ArrayList<>();
225 if (bookAuthor ==
null || bookTitle ==
null) {
226 throw new IllegalArgumentException(
"Author and title cannot be null.");
228 this.book =
new ItemStack(Material.WRITTEN_BOOK);
229 this.bookMeta = (BookMeta) book.getItemMeta();
230 this.bookMeta.setAuthor(PlainTextComponentSerializer.plainText()
231 .serialize(DreamMessageFormatter.format(bookAuthor, DreamMessageSettings.all())));
232 this.bookMeta.setTitle(PlainTextComponentSerializer.plainText()
233 .serialize(DreamMessageFormatter.format(bookTitle, DreamMessageSettings.all())));
250 pages.add(PlainTextComponentSerializer.plainText()
251 .serialize(DreamMessageFormatter.format(page, DreamMessageSettings.all())));
271 if (!pages.isEmpty()) bookMeta.setPages(pages);
272 book.setItemMeta(bookMeta);
274 dreamfireBook.book = book;
275 dreamfireBook.bookMeta = bookMeta;
276 dreamfireBook.pages.addAll(pages);
277 DreamPersistentItemStack.Add(
280 PersistentDataType.STRING,
282 dreamfireBook.getClassID().toString()
285 return dreamfireBook;
Fired after a DreamBook is closed by a player.
Fired when a DreamBook is about to be opened for a player.
Fired when the pages of a DreamBook are updated (set/added/cleared).
Fired when a player is recorded as a viewer of a DreamBook.
Fired when a player is removed from the viewers of a DreamBook.
BookBuilder generation(BookMeta.Generation generation)
Sets the book generation (original/copy/etc.).
DreamBook createBook()
Builds a DreamfireBook and registers it for persistence.
BookBuilder(String bookAuthor, String bookTitle)
Creates a builder with the given author and title.
BookBuilder bookPages(TextComponent... bookPages)
Deprecated: legacy Spigot TextComponent pages.
BookBuilder bookPages(String... bookPages)
Adds pages (formatted) to this builder.
void openBook(Player player, int durationInSeconds)
Opens the book for a player for a fixed duration (seconds) before closing.
void closeBook(Player player)
Closes the book for a player and removes them from the viewer list.
boolean isPlayerInBook(Player player)
Checks whether a player is currently viewing this book.
void addPages(String... additionalPages)
Appends pages and updates the underlying BookMeta.
void setPages(List< String > newPages)
Replaces all pages and updates the underlying BookMeta.
void clearPages()
Removes all pages and updates the underlying BookMeta.
List< String > getPagesView()
Returns an immutable copy of current pages.
void playerQuit(Player player)
Should be called when a player leaves; ensures the book is closed for them.
void displayNextFrame()
Reserved hook for a future “book frame” animation (no-op).
static final String DreamfireBookKey
Persistent key for tagging book items in NBT.
void openBook(Player player)
Opens the book for a player and records them as a viewer.
static final LinkedHashMap< UUID, DreamBook > DreamBooks
static DreamCore DreamCore