Skip to content

Commit

Permalink
feat: Bookmarks (#219)
Browse files Browse the repository at this point in the history
* feat: add bookmark storage and bookmark access helpers

* feat: add bookmark screen

* feat: add buttons for bookmark system

* feat: add show category button to index screens

* feat: add add/remove bookmark buttons

Also update some map init code and use fastutil maps more extensively

* fix: neo network packet registration (play direction)

* fix: crash

* fix: locked entries are clickable
  • Loading branch information
klikli-dev authored Jun 17, 2024
1 parent 0758265 commit 872da1c
Show file tree
Hide file tree
Showing 33 changed files with 840 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,15 @@ public static class Gui {
public static final String BOOK_INDEX_LIST_TITLE = PREFIX + "book.index_list_title";
public static final String CATEGORY_INDEX_LIST_TITLE = PREFIX + "category.index_list_title";

public static final String BOOKMARKS_SCREEN_TITLE = PREFIX + "bookmarks.screen.title";
public static final String BOOKMARKS_INFO_TEXT = PREFIX + "bookmarks.info";
public static final String BOOKMARKS_ENTRY_LIST_TITLE = PREFIX + "bookmarks.entry_list_title";
public static final String BOOKMARKS_NO_RESULTS = PREFIX + "bookmarks.no_results";

public static final String OPEN_SEARCH = PREFIX + "open_search";
public static final String OPEN_BOOKMARKS = PREFIX + "open_bookmarks";
public static final String ADD_BOOKMARK = PREFIX + "add_bookmark";
public static final String REMOVE_BOOKMARK = PREFIX + "remove_bookmark";

public static final String RECIPE_PAGE_RECIPE_MISSING = PREFIX + "recipe_page.recipe_missing";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package com.klikli_dev.modonomicon.api.datagen;

import com.google.gson.JsonObject;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.minecraft.data.CachedOutput;
import net.minecraft.data.DataProvider;
import net.minecraft.data.PackOutput;
Expand All @@ -23,7 +24,7 @@
import java.util.function.Supplier;

public abstract class AbstractModonomiconLanguageProvider implements ModonomiconLanguageProvider, DataProvider {
private final Map<String, String> data = new TreeMap<>();
private final Map<String, String> data = new Object2ObjectOpenHashMap<>();
private final PackOutput output;
private final String modid;
private final String locale;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public abstract class ModonomiconProviderBase {
protected final Map<String, ModonomiconLanguageProvider> translations;
protected final BookContextHelper context;
protected final ConditionHelper conditionHelper;
private Map<String, String> macros = new Object2ObjectOpenHashMap<>();
private final Map<String, String> macros = new Object2ObjectOpenHashMap<>();

protected ModonomiconProviderBase(String modId, ModonomiconLanguageProvider lang, Map<String, ModonomiconLanguageProvider> translations, BookContextHelper context, ConditionHelper conditionHelper) {
this.modId = modId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@ public boolean isLeaflet() {

public BookAddress getLeafletAddress() {
var leafletEntry = this.getEntry(this.leafletEntry);
return BookAddress.ignoreSavedAndOpen(leafletEntry);
return BookAddress.ignoreSaved(leafletEntry);
}

public PageDisplayMode getPageDisplayMode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,11 @@ public BookUnlockStates(Map<ResourceLocation, Set<ResourceLocation>> readEntries
entryPagesMap.forEach((entryId, pages) -> innerMap.put(entryId, new ObjectOpenHashSet<>(pages)));
});

this.unlockedEntries = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>(unlockedEntries));
this.unlockedCategories = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>(unlockedCategories));
this.unlockedEntries = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>());
unlockedEntries.forEach((bookId, entries) -> this.unlockedEntries.put(bookId, new ObjectOpenHashSet<>(entries)));

this.unlockedCategories = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>());
unlockedCategories.forEach((bookId, categories) -> this.unlockedCategories.put(bookId, new ObjectOpenHashSet<>(categories)));

this.usedCommands = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>());
usedCommands.forEach((bookId, commandUsesMap) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.klikli_dev.modonomicon.bookstate.visual.BookVisualState;
import com.klikli_dev.modonomicon.bookstate.visual.CategoryVisualState;
import com.klikli_dev.modonomicon.bookstate.visual.EntryVisualState;
import com.klikli_dev.modonomicon.client.gui.book.BookAddress;
import com.klikli_dev.modonomicon.networking.RequestSyncBookStatesMessage;
import com.klikli_dev.modonomicon.networking.SyncBookVisualStatesMessage;
import com.klikli_dev.modonomicon.platform.Services;
Expand All @@ -21,6 +22,8 @@
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.saveddata.SavedData;

import java.util.List;

public class BookVisualStateManager {

private static final BookVisualStateManager instance = new BookVisualStateManager();
Expand All @@ -47,6 +50,10 @@ public EntryVisualState getEntryStateFor(Player player, BookEntry entry) {
return this.getStateFor(player).getEntryState(entry);
}

public List<BookAddress> getBookmarksFor(Player player, Book book) {
return this.getStateFor(player).getBookmarks(book);
}

public void setEntryStateFor(ServerPlayer player, BookEntry entry, EntryVisualState state) {
this.getStateFor(player).setEntryState(entry, state);
this.saveData.setDirty();
Expand All @@ -62,6 +69,22 @@ public void setBookStateFor(ServerPlayer player, Book book, BookVisualState stat
this.saveData.setDirty();
}

public void setBookmarksFor(ServerPlayer player, Book book, List<BookAddress> bookmarks) {
this.getStateFor(player).setBookmarks(book, bookmarks);
this.saveData.setDirty();
}

public void addBookmarkFor(Player player, Book book, BookAddress bookmark) {
this.getStateFor(player).addBookmark(book, bookmark);
this.saveData.setDirty();
}

public boolean removeBookmarkFor(Player player, Book book, BookAddress bookmark) {
var result = this.getStateFor(player).removeBookmark(book, bookmark);
this.saveData.setDirty();
return result;
}

public void syncFor(ServerPlayer player) {
Services.NETWORK.sendTo(player, new SyncBookVisualStatesMessage(this.getStateFor(player)));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@
import io.netty.buffer.ByteBuf;
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceLocation;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

Expand All @@ -43,7 +45,8 @@ public BookVisualStates() {

public BookVisualStates(Map<ResourceLocation, BookVisualState> bookStates, Map<ResourceLocation, List<BookAddress>> bookBookmarks) {
this.bookStates = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>(bookStates));
this.bookBookmarks = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>(bookBookmarks));
this.bookBookmarks = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>());
bookBookmarks.forEach((bookId, entries) -> this.bookBookmarks.put(bookId, new ArrayList<>(entries)));
}

public BookVisualState getBookState(Book book) {
Expand All @@ -58,6 +61,10 @@ public EntryVisualState getEntryState(BookEntry entry) {
return this.getCategoryState(entry.getCategory()).entryStates.computeIfAbsent(entry.getId(), (id) -> new EntryVisualState());
}

public List<BookAddress> getBookmarks(Book book) {
return this.bookBookmarks.computeIfAbsent(book.getId(), (id) -> new ArrayList<>());
}

public void setBookState(Book book, BookVisualState state) {
this.bookStates.put(book.getId(), state);
}
Expand All @@ -69,4 +76,16 @@ public void setEntryState(BookEntry entry, EntryVisualState state) {
public void setCategoryState(BookCategory category, CategoryVisualState state) {
this.getBookState(category.getBook()).categoryStates.put(category.getId(), state);
}

public void setBookmarks(Book book, List<BookAddress> bookmarks) {
this.bookBookmarks.put(book.getId(), bookmarks);
}

public void addBookmark(Book book, BookAddress bookmark) {
this.getBookmarks(book).add(bookmark);
}

public boolean removeBookmark(Book book, BookAddress bookmark) {
return this.getBookmarks(book).remove(bookmark);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -212,10 +212,6 @@ protected void openBookInIndexMode(Book book, BookAddress address) {
@ApiStatus.Internal
public void openCategory(BookCategory category, BookAddress address) {
if (this.openBookCategoryScreen != null) {
//skip if the category is already open
if (this.openBookCategoryScreen.getCategory() == category)
return;

BookGuiManager.get().closeCategoryScreen(this.openBookCategoryScreen);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,13 @@ private BookAddress(@NotNull ResourceLocation bookId,
this(bookId, categoryId.orElse(null), ignoreSavedCategory, entryId.orElse(null), ignoreSavedEntry, page, ignoreSavedPage);
}

public static BookAddress ignoreSavedAndOpen(@NotNull BookEntry entry) {
return ignoreSaved(entry.getBook().getId(), entry.getCategory().getId(), entry.getId(), -1);
public static BookAddress ignoreSaved(@NotNull BookEntry entry, int page) {
return ignoreSaved(entry.getBook().getId(), entry.getCategory().getId(), entry.getId(), page);
}


public static BookAddress ignoreSaved(@NotNull BookEntry entry) {
return ignoreSaved(entry, -1);
}

public static BookAddress defaultFor(@NotNull BookCategory category) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@ public interface BookParentScreen {

void saveState(BookVisualState state);

void onSyncBookUnlockCapabilityMessage(SyncBookUnlockStatesMessage message);
void onSyncBookUnlockStatesMessage(SyncBookUnlockStatesMessage message);
}
Loading

0 comments on commit 872da1c

Please sign in to comment.