Minestom/src/main/java/net/minestom/server/item/metadata/WrittenBookMeta.java

97 lines
3.4 KiB
Java

package net.minestom.server.item.metadata;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.minestom.server.item.ItemMetaView;
import net.minestom.server.item.component.CustomData;
import net.minestom.server.item.component.ItemComponent;
import net.minestom.server.item.component.ItemComponentMap;
import net.minestom.server.item.component.ItemComponentPatch;
import net.minestom.server.tag.Tag;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnknownNullability;
import java.util.Arrays;
import java.util.List;
public record WrittenBookMeta(@NotNull ItemComponentPatch components) implements ItemMetaView<WrittenBookMeta.Builder> {
private static final Tag<Boolean> RESOLVED = Tag.Boolean("resolved").defaultValue(false);
private static final Tag<WrittenBookGeneration> GENERATION = Tag.Integer("resolved").map(integer -> WrittenBookGeneration.values()[integer], Enum::ordinal);
private static final Tag<String> AUTHOR = Tag.String("author");
private static final Tag<String> TITLE = Tag.String("title");
private static final Tag<List<Component>> PAGES = Tag.String("pages")
.map(GsonComponentSerializer.gson()::deserialize, GsonComponentSerializer.gson()::serialize)
.list().defaultValue(List.of());
public boolean isResolved() {
return getTag(RESOLVED);
}
public @Nullable WrittenBookGeneration getGeneration() {
return getTag(GENERATION);
}
public @Nullable String getAuthor() {
return getTag(AUTHOR);
}
public @Nullable String getTitle() {
return getTag(TITLE);
}
public @NotNull List<@NotNull Component> getPages() {
return getTag(PAGES);
}
@Override
public <T> @UnknownNullability T getTag(@NotNull Tag<T> tag) {
return components.get(ItemComponent.CUSTOM_DATA, CustomData.EMPTY).getTag(tag);
}
public enum WrittenBookGeneration {
ORIGINAL, COPY_OF_ORIGINAL, COPY_OF_COPY, TATTERED
}
public record Builder(@NotNull ItemComponentMap.Builder components) implements ItemMetaView.Builder {
public Builder resolved(boolean resolved) {
setTag(RESOLVED, resolved);
return this;
}
public Builder generation(@Nullable WrittenBookGeneration generation) {
setTag(GENERATION, generation);
return this;
}
public Builder author(@Nullable String author) {
setTag(AUTHOR, author);
return this;
}
public Builder author(@Nullable Component author) {
return author(author != null ? LegacyComponentSerializer.legacySection().serialize(author) : null);
}
public Builder title(@Nullable String title) {
setTag(TITLE, title);
return this;
}
public Builder title(@Nullable Component title) {
return title(title != null ? LegacyComponentSerializer.legacySection().serialize(title) : null);
}
public Builder pages(@NotNull List<@NotNull Component> pages) {
setTag(PAGES, pages);
return this;
}
public Builder pages(Component... pages) {
return pages(Arrays.asList(pages));
}
}
}