diff --git a/src/main/java/slimeknights/mantle/client/book/BookLoader.java b/src/main/java/slimeknights/mantle/client/book/BookLoader.java index 1a0d85b8..3b17bb7b 100644 --- a/src/main/java/slimeknights/mantle/client/book/BookLoader.java +++ b/src/main/java/slimeknights/mantle/client/book/BookLoader.java @@ -24,9 +24,9 @@ import slimeknights.mantle.client.book.data.content.ContentTextLeftImage; import slimeknights.mantle.client.book.data.content.ContentTextRightImage; import slimeknights.mantle.client.book.data.content.PageContent; +import slimeknights.mantle.client.book.repository.BookRepository; import slimeknights.mantle.network.NetworkWrapper; import slimeknights.mantle.network.book.PacketUpdateSavedPage; -import static slimeknights.mantle.client.book.ResourceHelper.setBookRoot; @SideOnly(Side.CLIENT) public class BookLoader implements IResourceManagerReloadListener { @@ -42,9 +42,6 @@ public class BookLoader implements IResourceManagerReloadListener { private static final NetworkWrapper wrapper = new NetworkWrapper("mantle:books"); - private static final Random random = new Random(); - private static char[] randAlphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray(); - public BookLoader() { ((IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager()).registerReloadListener(this); @@ -93,11 +90,11 @@ public static Class getPageType(String name) { * Be warned that the returned BookData object is not immediately populated, and is instead populated when the resources are loaded/reloaded * * @param name The name of the book, modid: will be automatically appended to the front of the name unless that is already added - * @param location The location of the book folder, prefixed with the resource domain + * @param repositories All the repositories the book will load the sections from * @return The book object, not immediately populated */ - public static BookData registerBook(String name, String location) { - BookData info = new BookData(location); + public static BookData registerBook(String name, BookRepository... repositories) { + BookData info = new BookData(repositories); books.put(name.contains(":") ? name : Loader.instance().activeModContainer().getModId() + ":" + name, info); @@ -124,28 +121,13 @@ public static void updateSavedPage(EntityPlayer player, ItemStack item, String p wrapper.network.sendToServer(new PacketUpdateSavedPage(page)); } - public static String randomName() { - int length = random.nextInt(10); - - String s = ""; - - for (int i = 0; i < length; i++) { - s += randAlphabet[random.nextInt(randAlphabet.length)]; - } - - return s; - } - /** * Reloads all the books, called when the resource manager reloads, such as when the resource pack or the language is changed */ @Override public void onResourceManagerReload(IResourceManager resourceManager) { for (BookData book : books.values()) { - setBookRoot(book.bookLocation); - - book.pageCount = book.cascadeLoad(); - book.fullPageCount = (int) Math.ceil((book.pageCount - 1) / 2F) + 1; + book.load(); } } } \ No newline at end of file diff --git a/src/main/java/slimeknights/mantle/client/book/ResourceHelper.java b/src/main/java/slimeknights/mantle/client/book/ResourceHelper.java index 59bdb7ab..66543457 100644 --- a/src/main/java/slimeknights/mantle/client/book/ResourceHelper.java +++ b/src/main/java/slimeknights/mantle/client/book/ResourceHelper.java @@ -115,7 +115,7 @@ public static String resourceToString(IResource resource, boolean skipCommments) return ""; } - public static void setBookRoot(String location) { + public static void setRoot(String location) { bookRoot = location; } } diff --git a/src/main/java/slimeknights/mantle/client/book/data/AppearanceData.java b/src/main/java/slimeknights/mantle/client/book/data/AppearanceData.java index 22d33e7d..8dd4dc9e 100644 --- a/src/main/java/slimeknights/mantle/client/book/data/AppearanceData.java +++ b/src/main/java/slimeknights/mantle/client/book/data/AppearanceData.java @@ -14,7 +14,7 @@ public class AppearanceData implements IDataItem { public boolean drawPageNumbers = true; @Override - public int cascadeLoad() { - return 0; + public void load() { + } } diff --git a/src/main/java/slimeknights/mantle/client/book/data/BookData.java b/src/main/java/slimeknights/mantle/client/book/data/BookData.java index 55e52245..3600109a 100644 --- a/src/main/java/slimeknights/mantle/client/book/data/BookData.java +++ b/src/main/java/slimeknights/mantle/client/book/data/BookData.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import javax.annotation.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; @@ -10,6 +11,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import slimeknights.mantle.client.book.BookLoader; import slimeknights.mantle.client.book.BookTransformer; +import slimeknights.mantle.client.book.repository.BookRepository; import slimeknights.mantle.client.gui.book.GuiBook; import static slimeknights.mantle.client.book.ResourceHelper.getResource; import static slimeknights.mantle.client.book.ResourceHelper.getResourceLocation; @@ -18,44 +20,43 @@ @SideOnly(Side.CLIENT) public class BookData implements IDataItem { - + public transient int unnamedSectionCounter = 0; public transient ArrayList sections = new ArrayList<>(); public transient AppearanceData appearance = new AppearanceData(); - public transient int pageCount; - public transient int fullPageCount; - - public final transient String bookLocation; protected final transient ArrayList transformers = new ArrayList<>(); - public BookData(String bookLocation) { - this.bookLocation = bookLocation; + private ArrayList repositories; + + public BookData(BookRepository... repositories) { + this.repositories = new ArrayList<>(Arrays.asList(repositories)); } @Override - public int cascadeLoad() { - int pages = 0; - - sections = new ArrayList<>(Arrays.asList(BookLoader.GSON.fromJson(resourceToString(getResource(getResourceLocation("index.json"))), SectionData[].class))); + public void load() { + for(BookRepository repo : repositories) { + List repoContents = repo.getSections(); + sections.addAll(repoContents); - ResourceLocation coverLocation = getResourceLocation("appearance.json"); + if(repo.hasAppearanceData){ + ResourceLocation appearanceLocation = getResourceLocation("appearance.json"); - if (resourceExists(coverLocation)) - appearance = BookLoader.GSON.fromJson(resourceToString(getResource(coverLocation)), AppearanceData.class); - else - appearance = new AppearanceData(); + if (resourceExists(appearanceLocation)) + appearance = BookLoader.GSON.fromJson(resourceToString(getResource(appearanceLocation)), AppearanceData.class); + else + appearance = new AppearanceData(); - appearance.cascadeLoad(); + appearance.load(); + } + } for (BookTransformer transformer : transformers) transformer.transform(this); for (SectionData section : sections) { section.parent = this; - pages += section.cascadeLoad(); + section.load(); } - - return pages; } public SectionData findSection(String name) { @@ -72,7 +73,7 @@ public int getFirstPageNumber(SectionData section) { if (section == sect) return pages + 1; - pages += sect.pageCount; + pages += sect.getPageCount(); } return -1; @@ -84,10 +85,10 @@ public PageData findPage(int number) { int pages = 0; for (SectionData section : sections) { - if (pages + section.pageCount > number) + if (pages + section.getPageCount() > number) return section.pages.get(number - pages); else - pages += section.pageCount; + pages += section.getPageCount(); } return null; @@ -110,7 +111,7 @@ public int findPageNumber(String location) { for (SectionData section : sections) { if (!sectionName.equals(section.name)) { - pages += section.pageCount; + pages += section.getPageCount(); continue; } @@ -127,12 +128,30 @@ public int findPageNumber(String location) { return -1; } + public int getPageCount() { + int pages = 0; + for(SectionData section : sections){ + pages += section.getPageCount(); + } + return pages; + } + + public int getFullPageCount() { + return (int) Math.ceil((getPageCount() - 1) / 2F) + 1; + } + public void openGui(@Nullable ItemStack item) { - Minecraft.getMinecraft().displayGuiScreen(new GuiBook(this, item)); + if(Minecraft.getMinecraft().currentScreen == null) + Minecraft.getMinecraft().displayGuiScreen(new GuiBook(this, item)); + } + + public void addRepository(BookRepository repository) { + if(repository != null && !this.repositories.contains(repository)) + this.repositories.add(repository); } public void addTransformer(BookTransformer transformer) { - if (!transformers.contains(transformer)) + if (transformer != null && !transformers.contains(transformer)) transformers.add(transformer); } } diff --git a/src/main/java/slimeknights/mantle/client/book/data/IDataItem.java b/src/main/java/slimeknights/mantle/client/book/data/IDataItem.java index e06926fa..da86dae1 100644 --- a/src/main/java/slimeknights/mantle/client/book/data/IDataItem.java +++ b/src/main/java/slimeknights/mantle/client/book/data/IDataItem.java @@ -5,6 +5,5 @@ @SideOnly(Side.CLIENT) public interface IDataItem { - - int cascadeLoad(); + void load(); } diff --git a/src/main/java/slimeknights/mantle/client/book/data/PageData.java b/src/main/java/slimeknights/mantle/client/book/data/PageData.java index 0df7386c..e306d681 100644 --- a/src/main/java/slimeknights/mantle/client/book/data/PageData.java +++ b/src/main/java/slimeknights/mantle/client/book/data/PageData.java @@ -15,7 +15,7 @@ @SideOnly(Side.CLIENT) public class PageData implements IDataItem { - public String name = BookLoader.randomName(); + public String name = null; public String type = ""; public String data = ""; @@ -32,7 +32,10 @@ public PageData(boolean custom) { } @Override - public int cascadeLoad() { + public void load() { + if(name == null) + name = "page" + parent.unnamedPageCounter++; + name = name.toLowerCase(); if (!data.equals("no-load")) { @@ -60,10 +63,6 @@ public int cascadeLoad() { } catch (IllegalAccessException e) { e.printStackTrace(); } - - System.out.println(f.isAccessible()); } - - return 0; } } diff --git a/src/main/java/slimeknights/mantle/client/book/data/SectionData.java b/src/main/java/slimeknights/mantle/client/book/data/SectionData.java index b250ca38..9864f901 100644 --- a/src/main/java/slimeknights/mantle/client/book/data/SectionData.java +++ b/src/main/java/slimeknights/mantle/client/book/data/SectionData.java @@ -14,15 +14,13 @@ @SideOnly(Side.CLIENT) public class SectionData implements IDataItem { - - public String name = BookLoader.randomName(); + public String name = null; public String title = ""; public ImageData icon = new ImageData(); public CriteriaData[] unlockCriteria = new CriteriaData[0]; public String data = ""; - public int pageCount; - + public transient int unnamedPageCounter = 0; public transient BookData parent; public transient ArrayList pages = new ArrayList<>(); @@ -36,7 +34,10 @@ public SectionData(boolean custom) { } @Override - public int cascadeLoad() { + public void load() { + if(name == null) + name = "section" + parent.unnamedSectionCounter++; + name = name.toLowerCase(); if (!data.equals("no-load")) { @@ -50,13 +51,13 @@ public int cascadeLoad() { for (PageData page : pages) { page.parent = this; - page.cascadeLoad(); + page.load(); } icon.location = getResourceLocation(icon.file, true); + } - pageCount = pages.size(); - - return pageCount; + public int getPageCount() { + return pages.size(); } } diff --git a/src/main/java/slimeknights/mantle/client/book/repository/BookRepository.java b/src/main/java/slimeknights/mantle/client/book/repository/BookRepository.java new file mode 100644 index 00000000..a2399532 --- /dev/null +++ b/src/main/java/slimeknights/mantle/client/book/repository/BookRepository.java @@ -0,0 +1,19 @@ +package slimeknights.mantle.client.book.repository; + +import java.util.List; +import slimeknights.mantle.client.book.data.SectionData; + +public abstract class BookRepository { + + public final boolean hasAppearanceData; + + public BookRepository () { + this(false); + } + + public BookRepository (boolean hasAppearanceData) { + this.hasAppearanceData = hasAppearanceData; + } + + public abstract List getSections(); +} diff --git a/src/main/java/slimeknights/mantle/client/book/repository/FileRepository.java b/src/main/java/slimeknights/mantle/client/book/repository/FileRepository.java new file mode 100644 index 00000000..2a8c571b --- /dev/null +++ b/src/main/java/slimeknights/mantle/client/book/repository/FileRepository.java @@ -0,0 +1,32 @@ +package slimeknights.mantle.client.book.repository; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import slimeknights.mantle.client.book.BookLoader; +import slimeknights.mantle.client.book.data.SectionData; +import static slimeknights.mantle.client.book.ResourceHelper.getResource; +import static slimeknights.mantle.client.book.ResourceHelper.getResourceLocation; +import static slimeknights.mantle.client.book.ResourceHelper.resourceToString; +import static slimeknights.mantle.client.book.ResourceHelper.setRoot; + +public class FileRepository extends BookRepository { + + public final String location; + + public FileRepository(String location) { + this(location, false); + } + + public FileRepository(String location, boolean hasAppearanceData) { + super(hasAppearanceData); + + this.location = location; + } + + @Override + public List getSections() { + setRoot(location); + return new ArrayList<>(Arrays.asList(BookLoader.GSON.fromJson(resourceToString(getResource(getResourceLocation("index.json"))), SectionData[].class))); + } +} diff --git a/src/main/java/slimeknights/mantle/client/gui/book/GuiBook.java b/src/main/java/slimeknights/mantle/client/gui/book/GuiBook.java index bd55415a..2eaf82c9 100644 --- a/src/main/java/slimeknights/mantle/client/gui/book/GuiBook.java +++ b/src/main/java/slimeknights/mantle/client/gui/book/GuiBook.java @@ -150,7 +150,7 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { // Set color back to white GlStateManager.color(1F, 1F, 1F, 1F); - if ((page < book.fullPageCount - 1 || book.pageCount % 2 != 0) && page < book.fullPageCount) { + if ((page < book.getFullPageCount() - 1 || book.getPageCount() % 2 != 0) && page < book.getFullPageCount()) { drawModalRectWithCustomSizedTexture(width / 2, height / 2 - PAGE_HEIGHT_UNSCALED / 2, PAGE_WIDTH_UNSCALED, PAGE_HEIGHT_UNSCALED, PAGE_WIDTH_UNSCALED, PAGE_HEIGHT_UNSCALED, 512, 512); GlStateManager.pushMatrix(); @@ -196,7 +196,7 @@ else if (page % 2 == 0) else bookPage = (page - 2) / 2 + 1; - if (bookPage >= -1 && bookPage < book.fullPageCount) { + if (bookPage >= -1 && bookPage < book.getFullPageCount()) { if (returner) oldPage = this.page; @@ -261,16 +261,17 @@ public void updateScreen() { super.updateScreen(); previousArrow.visible = page != -1; - nextArrow.visible = page < book.fullPageCount - (book.pageCount % 2 != 0 ? 0 : 1); + nextArrow.visible = page < book.getFullPageCount() - (book.getPageCount() % 2 != 0 ? 0 : 1); backArrow.visible = oldPage >= -1; if (page == -1) { nextArrow.xPosition = width / 2 + 80; + indexArrow.visible = false; } else { previousArrow.xPosition = width / 2 - 184; nextArrow.xPosition = width / 2 + 165; - indexArrow.visible = (page - 1) * 2 + 2 > book.findSection("index").pageCount; + indexArrow.visible = (page - 1) * 2 + 2 > book.findSection("index").getPageCount(); } previousArrow.yPosition = height / 2 + 75; @@ -291,8 +292,8 @@ public void actionPerformed(GuiButton button) { page = -1; } else if (button == nextArrow) { page++; - if (page > book.fullPageCount - (book.pageCount % 2 != 0 ? 0 : 1)) - page = book.fullPageCount - 1; + if (page > book.getFullPageCount() - (book.getPageCount() % 2 != 0 ? 0 : 1)) + page = book.getFullPageCount() - 1; } else if (button == backArrow) { if (oldPage >= -1) page = oldPage; @@ -343,8 +344,10 @@ public void onGuiClosed() { if (page == null) page = book.findPage((this.page - 1) * 2 + 2); - if (page != null || this.page == -1) - BookLoader.updateSavedPage(mc.thePlayer, item, this.page == -1 ? "" : (page.parent.name + "." + page.name)); + if(this.page == -1) + BookLoader.updateSavedPage(mc.thePlayer, item, ""); + else if (page != null) + BookLoader.updateSavedPage(mc.thePlayer, item, page.parent.name + "." + page.name); } @Override