Skip to content

Commit

Permalink
Book item lists
Browse files Browse the repository at this point in the history
- Added block interaction page type
- Added smithing (anvil) page type
- Integrated the title
- Renamed textdata onClick to action
- Implemented item list JSON files instead of nesting item data
- Replaced the hardcoded ImageData transformer with a modular hotswap system
  • Loading branch information
fuj1n committed Feb 10, 2016
1 parent 3861ce5 commit 4e98678
Show file tree
Hide file tree
Showing 26 changed files with 445 additions and 44 deletions.
4 changes: 4 additions & 0 deletions src/main/java/slimeknights/mantle/client/book/BookLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
import slimeknights.mantle.client.book.data.PageData;
import slimeknights.mantle.client.book.data.SectionData;
import slimeknights.mantle.client.book.data.content.ContentBlank;
import slimeknights.mantle.client.book.data.content.ContentBlockInteraction;
import slimeknights.mantle.client.book.data.content.ContentCrafting;
import slimeknights.mantle.client.book.data.content.ContentError;
import slimeknights.mantle.client.book.data.content.ContentImage;
import slimeknights.mantle.client.book.data.content.ContentImageText;
import slimeknights.mantle.client.book.data.content.ContentSmelting;
import slimeknights.mantle.client.book.data.content.ContentSmithing;
import slimeknights.mantle.client.book.data.content.ContentText;
import slimeknights.mantle.client.book.data.content.ContentTextImage;
import slimeknights.mantle.client.book.data.content.ContentTextLeftImage;
Expand Down Expand Up @@ -63,6 +65,8 @@ public BookLoader() {
registerPageType("text with right image etch", ContentTextRightImage.class);
registerPageType("crafting", ContentCrafting.class);
registerPageType("smelting", ContentSmelting.class);
registerPageType("smithing", ContentSmithing.class);
registerPageType("block interaction", ContentBlockInteraction.class);

// Register action protocols
StringActionProcessor.registerProtocol(new ProtocolGoToPage());
Expand Down
56 changes: 54 additions & 2 deletions src/main/java/slimeknights/mantle/client/book/data/PageData.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,24 @@

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import net.minecraft.client.resources.IResource;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import slimeknights.mantle.client.book.BookLoader;
import slimeknights.mantle.client.book.data.content.ContentError;
import slimeknights.mantle.client.book.data.content.PageContent;
import slimeknights.mantle.client.book.data.element.ImageData;
import slimeknights.mantle.client.book.data.element.ItemStackData;
import static slimeknights.mantle.client.book.ResourceHelper.getResource;
import static slimeknights.mantle.client.book.ResourceHelper.getResourceLocation;
import static slimeknights.mantle.client.book.ResourceHelper.resourceToString;

@SideOnly(Side.CLIENT)
public class PageData implements IDataItem {

private static final transient ArrayList<ValueHotswap> hotswaps = new ArrayList<>();

public String name = null;
public String type = "";
public String data = "";
Expand Down Expand Up @@ -61,14 +65,62 @@ public void load() {
}

for (Field f : content.getClass().getFields()) {
if (f.getType().isAssignableFrom(ImageData.class) && !Modifier.isTransient(f.getModifiers()))
for (ValueHotswap swap : hotswaps) {
if (f.getType().isAssignableFrom(swap.t) && !Modifier.isTransient(f.getModifiers()) && !Modifier.isStatic(f.getModifiers()) && !Modifier.isFinal(f.getModifiers())) {
try {
f.setAccessible(true);
Object o = f.get(content);

swap.swap(o);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
/*if (f.getType().isAssignableFrom(ImageData.class) && !Modifier.isTransient(f.getModifiers()))
try {
f.setAccessible(true);
ImageData d = (ImageData) f.get(content);
d.location = getResourceLocation(d.file, true);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}*/
}
}

public static void addSwap(Class<?> t, Class<? extends ValueHotswap> swap) {
try {
ValueHotswap hotswap = swap.newInstance();
hotswap.t = t;

hotswaps.add(hotswap);
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}

static {
addSwap(ImageData.class, new ValueHotswap<ImageData>() {
@Override
public void swap(ImageData object) {
object.location = getResourceLocation(object.file, true);
}
}.getClass());
addSwap(ItemStackData.class, new ValueHotswap<ItemStackData>() {
@Override
public void swap(ItemStackData object) {
object.itemListLocation = getResourceLocation(object.itemList);

if (object.itemListLocation != null)
object.id = "->itemList";
}
}.getClass());
}

public static abstract class ValueHotswap<T> {

protected Class<?> t;

public abstract void swap(T object);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,5 @@ public class ContentBlank extends PageContent {

@Override
public void build(BookData book, ArrayList<BookElement> list) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package slimeknights.mantle.client.book.data.content;

import java.util.ArrayList;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.element.ImageData;
import slimeknights.mantle.client.book.data.element.ItemStackData;
import slimeknights.mantle.client.book.data.element.TextData;
import slimeknights.mantle.client.gui.book.GuiBook;
import slimeknights.mantle.client.gui.book.element.BookElement;
import slimeknights.mantle.client.gui.book.element.ElementImage;
import slimeknights.mantle.client.gui.book.element.ElementItem;
import slimeknights.mantle.client.gui.book.element.ElementText;
import static slimeknights.mantle.client.gui.book.Textures.TEX_MISC;

public class ContentBlockInteraction extends PageContent {

public static final transient int TEX_SIZE = 512;
public static final transient ImageData IMG_SMITHING = new ImageData(TEX_MISC, 0, 0, 88, 55, TEX_SIZE, TEX_SIZE);

public static final transient int INPUT_X = 6;
public static final transient int INPUT_Y = 18;
public static final transient int BLOCK_X = 40;
public static final transient int BLOCK_Y = 26;

public static final transient float ITEM_SCALE = 2.0F;
public static final transient float BLOCK_SCALE = 5.0F;

public String title = "Block Interaction";
public ItemStackData input;
public ItemStackData block;
public TextData[] description;

@Override
public void build(BookData book, ArrayList<BookElement> list) {
int x = GuiBook.PAGE_WIDTH / 2 - IMG_SMITHING.width / 2 - 10;
int y = TITLE_HEIGHT;

if (title == null || title.isEmpty())
y = 0;
else
addTitle(list, title);

list.add(new ElementImage(x, y, IMG_SMITHING.width, IMG_SMITHING.height, IMG_SMITHING, book.appearance.coverColor));

if (input != null && !input.id.equals("")) {
list.add(new ElementItem(x + INPUT_X, y + INPUT_Y, ITEM_SCALE, input.getItems(), input.action));
}

if (block != null && !block.id.equals("")) {
list.add(new ElementItem(x + BLOCK_X, y + BLOCK_Y, BLOCK_SCALE, block.getItems(), block.action));
}

if (description != null && description.length > 0) {
list.add(new ElementText(0, IMG_SMITHING.height + y + 50, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT - IMG_SMITHING.height - y - 50, description));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package slimeknights.mantle.client.book.data.content;

import java.util.ArrayList;
import net.minecraft.util.ResourceLocation;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.element.ImageData;
import slimeknights.mantle.client.book.data.element.ItemStackData;
Expand All @@ -11,10 +10,10 @@
import slimeknights.mantle.client.gui.book.element.ElementImage;
import slimeknights.mantle.client.gui.book.element.ElementItem;
import slimeknights.mantle.client.gui.book.element.ElementText;
import static slimeknights.mantle.client.gui.book.Textures.TEX_CRAFTING;

public class ContentCrafting extends PageContent {

public static final transient ResourceLocation TEX_CRAFTING = new ResourceLocation("mantle:textures/gui/book/crafting.png");
public static final transient int TEX_SIZE = 256;
public static final transient ImageData IMG_CRAFTING_LARGE = new ImageData(TEX_CRAFTING, 0, 0, 183, 114, TEX_SIZE, TEX_SIZE);
public static final transient ImageData IMG_CRAFTING_SMALL = new ImageData(TEX_CRAFTING, 0, 114, 155, 78, TEX_SIZE, TEX_SIZE);
Expand Down Expand Up @@ -65,12 +64,12 @@ public void build(BookData book, ArrayList<BookElement> list) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j].id.equals(""))
continue;
list.add(new ElementItem(x + SLOT_MARGIN + (SLOT_PADDING + Math.round(ElementItem.ITEM_SIZE_HARDCODED * ITEM_SCALE)) * j, y + SLOT_MARGIN + (SLOT_PADDING + Math.round(ElementItem.ITEM_SIZE_HARDCODED * ITEM_SCALE)) * i, ITEM_SCALE, grid[i][j].getItemStack()));
list.add(new ElementItem(x + SLOT_MARGIN + (SLOT_PADDING + Math.round(ElementItem.ITEM_SIZE_HARDCODED * ITEM_SCALE)) * j, y + SLOT_MARGIN + (SLOT_PADDING + Math.round(ElementItem.ITEM_SIZE_HARDCODED * ITEM_SCALE)) * i, ITEM_SCALE, grid[i][j].getItems(), grid[i][j].action));
}
}

if (result != null) {
list.add(new ElementItem(resultX, resultY, ITEM_SCALE, result.getItemStack()));
list.add(new ElementItem(resultX, resultY, ITEM_SCALE, result.getItems(), result.action));
}

if (description != null && description.length > 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ public ContentError(String errorStage, Exception e) {

@Override
public void build(BookData book, ArrayList<BookElement> list) {
addTitle(list, "Error");

TextData[] text = new TextData[1 + (exception != null ? 2 : 0)];
text[0] = new TextData(errorStage);
text[0].color = "dark_red";
Expand All @@ -41,6 +43,6 @@ public void build(BookData book, ArrayList<BookElement> list) {
text[2].paragraph = true;
}

list.add(new ElementText(0, 0, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT, text));
list.add(new ElementText(0, TITLE_HEIGHT, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT - TITLE_HEIGHT, text));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,21 @@
@SideOnly(Side.CLIENT)
public class ContentImage extends PageContent {

public String title = null;
public ImageData image;

@Override
public void build(BookData book, ArrayList<BookElement> list) {
int y = TITLE_HEIGHT;

if (title == null || title.isEmpty())
y = 0;
else
addTitle(list, title);

if (image != null && image.location != null)
list.add(new ElementImage(0, 0, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT, image));
list.add(new ElementImage(0, y, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT - y, image));
else
list.add(new ElementImage(image));
list.add(new ElementImage(ImageData.MISSING));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,25 @@
@SideOnly(Side.CLIENT)
public class ContentImageText extends PageContent {

public String title = null;
public ImageData image;
public TextData[] text;

@Override
public void build(BookData book, ArrayList<BookElement> list) {
int y = TITLE_HEIGHT;

if (title == null || title.isEmpty())
y = 0;
else
addTitle(list, title);

if (image != null && image.location != null)
list.add(new ElementImage(0, 0, GuiBook.PAGE_WIDTH, 100, image));
list.add(new ElementImage(0, y, GuiBook.PAGE_WIDTH, 100, image));
else
list.add(new ElementImage(0, 0, 32, 32, ImageData.MISSING));
list.add(new ElementImage(0, y, 32, 32, ImageData.MISSING));

if (text != null && text.length > 0)
list.add(new ElementText(0, 105, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT - 105, text));
list.add(new ElementText(0, y + 105, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT - 105 - y, text));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.element.ImageData;
import slimeknights.mantle.client.book.data.element.ItemStackData;
Expand All @@ -14,10 +13,10 @@
import slimeknights.mantle.client.gui.book.element.ElementImage;
import slimeknights.mantle.client.gui.book.element.ElementItem;
import slimeknights.mantle.client.gui.book.element.ElementText;
import static slimeknights.mantle.client.gui.book.Textures.TEX_SMELTING;

public class ContentSmelting extends PageContent {

public static final transient ResourceLocation TEX_SMELTING = new ResourceLocation("mantle:textures/gui/book/smelting.png");
public static final transient int TEX_SIZE = 128;
public static final transient ImageData IMG_SMELTING = new ImageData(TEX_SMELTING, 0, 0, 110, 114, TEX_SIZE, TEX_SIZE);

Expand All @@ -38,19 +37,19 @@ public class ContentSmelting extends PageContent {
@Override
public void build(BookData book, ArrayList<BookElement> list) {
int x = GuiBook.PAGE_WIDTH / 2 - IMG_SMELTING.width / 2;
int y = 16;
int y = TITLE_HEIGHT;

TextData tdTitle = new TextData(title);
tdTitle.underlined = true;
list.add(new ElementText(0, 0, GuiBook.PAGE_WIDTH, 9, new TextData[]{tdTitle}));
list.add(new ElementImage(x, y, IMG_SMELTING.width, IMG_SMELTING.height, IMG_SMELTING, book.appearance.coverColor));

if (input != null) {
list.add(new ElementItem(x + INPUT_X, y + INPUT_Y, ITEM_SCALE, input.getItemStack()));
if (input != null && !input.id.equals("")) {
list.add(new ElementItem(x + INPUT_X, y + INPUT_Y, ITEM_SCALE, input.getItems(), input.action));
}

if (result != null) {
list.add(new ElementItem(x + RESULT_X, y + RESULT_Y, ITEM_SCALE, result.getItemStack()));
if (result != null && !result.id.equals("")) {
list.add(new ElementItem(x + RESULT_X, y + RESULT_Y, ITEM_SCALE, result.getItems(), result.action));
}

list.add(new ElementItem(x + FUEL_X, y + FUEL_Y, ITEM_SCALE, getFuelsList()));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package slimeknights.mantle.client.book.data.content;

import java.util.ArrayList;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.element.ImageData;
import slimeknights.mantle.client.book.data.element.ItemStackData;
import slimeknights.mantle.client.book.data.element.TextData;
import slimeknights.mantle.client.gui.book.GuiBook;
import slimeknights.mantle.client.gui.book.element.BookElement;
import slimeknights.mantle.client.gui.book.element.ElementImage;
import slimeknights.mantle.client.gui.book.element.ElementItem;
import slimeknights.mantle.client.gui.book.element.ElementText;
import static slimeknights.mantle.client.gui.book.Textures.TEX_MISC;

public class ContentSmithing extends PageContent {

public static final transient int TEX_SIZE = 512;
public static final transient ImageData IMG_SMITHING = new ImageData(TEX_MISC, 88, 0, 210, 42, TEX_SIZE, TEX_SIZE);

public static final transient int INPUT_X = 5;
public static final transient int INPUT_Y = 5;
public static final transient int MODIFIER_X = 89;
public static final transient int MODIFIER_Y = 5;
public static final transient int RESULT_X = 173;
public static final transient int RESULT_Y = 5;

public static final transient float ITEM_SCALE = 2.0F;

public String title = "Smithing";
public ItemStackData input;
public ItemStackData modifier;
public ItemStackData result;
public TextData[] description;

@Override
public void build(BookData book, ArrayList<BookElement> list) {
int x = GuiBook.PAGE_WIDTH / 2 - IMG_SMITHING.width / 2;
int y = TITLE_HEIGHT;

if (title == null || title.isEmpty())
y = 0;
else
addTitle(list, title);

list.add(new ElementImage(x, y, IMG_SMITHING.width, IMG_SMITHING.height, IMG_SMITHING, book.appearance.coverColor));

if (input != null && !input.id.equals("")) {
list.add(new ElementItem(x + INPUT_X, y + INPUT_Y, ITEM_SCALE, input.getItems(), input.action));
}

if (modifier != null && !modifier.id.equals("")) {
list.add(new ElementItem(x + MODIFIER_X, y + MODIFIER_Y, ITEM_SCALE, modifier.getItems(), modifier.action));
}

if (result != null && !result.id.equals("")) {
list.add(new ElementItem(x + RESULT_X, y + RESULT_Y, ITEM_SCALE, result.getItems(), result.action));
}

if (description != null && description.length > 0) {
list.add(new ElementText(0, IMG_SMITHING.height + y + 5, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT - IMG_SMITHING.height - y - 5, description));
}
}
}
Loading

0 comments on commit 4e98678

Please sign in to comment.