Fixed broken book page. Added examples for showing up in the book. Todo: Create a separate template!

This commit is contained in:
Robert Sosnitzka
2017-01-03 00:05:03 +01:00
parent 18bd88e7f9
commit 0eb536e16b
13 changed files with 529 additions and 27 deletions

View File

@@ -0,0 +1,206 @@
package com.sosnitzka.taiga.book;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.gson.annotations.SerializedName;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.oredict.OreDictionary;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.element.ImageData;
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.ElementText;
import slimeknights.tconstruct.common.ClientProxy;
import slimeknights.tconstruct.library.TinkerRegistry;
import slimeknights.tconstruct.library.Util;
import slimeknights.tconstruct.library.book.TinkerPage;
import slimeknights.tconstruct.library.book.elements.ElementTinkerItem;
import slimeknights.tconstruct.library.client.CustomFontColor;
import slimeknights.tconstruct.library.materials.Material;
import slimeknights.tconstruct.library.modifiers.IModifier;
import slimeknights.tconstruct.library.modifiers.IModifierDisplay;
import slimeknights.tconstruct.library.tools.ToolCore;
import slimeknights.tconstruct.tools.TinkerMaterials;
import java.util.ArrayList;
import java.util.List;
@SideOnly(Side.CLIENT)
public class ContentOres extends TinkerPage {
public static final transient String ID = "modifier";
public static final transient int TEX_SIZE = 256;
//public static final transient ImageData IMG_MODIFY = new ImageData(ClientProxy.BOOK_MODIFY), 0, 0, 122, 70, TEX_SIZE, TEX_SIZE);
public static final transient ImageData IMG_SLOT_1 = new ImageData(ClientProxy.BOOK_MODIFY, 0, 75, 22, 22, TEX_SIZE, TEX_SIZE);
public static final transient ImageData IMG_SLOT_2 = new ImageData(ClientProxy.BOOK_MODIFY, 0, 97, 40, 22, TEX_SIZE, TEX_SIZE);
public static final transient ImageData IMG_SLOT_3 = new ImageData(ClientProxy.BOOK_MODIFY, 0, 119, 58, 22, TEX_SIZE, TEX_SIZE);
public static final transient ImageData IMG_SLOT_5 = new ImageData(ClientProxy.BOOK_MODIFY, 0, 141, 58, 41, TEX_SIZE, TEX_SIZE);
public static final transient ImageData IMG_TABLE = new ImageData(ClientProxy.BOOK_MODIFY, 214, 0, 42, 46, TEX_SIZE, TEX_SIZE);
private transient IModifier modifier;
private transient List<Item> tool;
public TextData[] text;
public String[] effects;
@SerializedName("modifier")
public String modifierName;
public String[] demoTool = new String[]{Util.getResource("pickaxe").toString()};
public ContentOres() {
}
public ContentOres(IModifier modifier) {
this.modifier = modifier;
this.modifierName = modifier.getIdentifier();
}
@Override
public void load() {
if (modifierName == null) {
modifierName = parent.name;
}
if (modifier == null) {
modifier = TinkerRegistry.getModifier(modifierName);
}
if (tool == null) {
tool = Lists.newArrayList();
for (String entry : demoTool) {
Item item = Item.REGISTRY.getObject(new ResourceLocation(entry));
if (item != null) {
tool.add(item);
}
}
}
}
@Override
public void build(BookData book, ArrayList<BookElement> list, boolean rightSide) {
int color = 0xdddddd;
int inCount = 1;
ItemStack[][] inputItems = null;
if (modifier instanceof IModifierDisplay) {
IModifierDisplay modifierDisplay = (IModifierDisplay) modifier;
color = modifierDisplay.getColor();
// determine how many slots we need to display
List<List<ItemStack>> inputList = modifierDisplay.getItems(); // cache it, can be expensive
inputItems = new ItemStack[5][]; // max size so we don't have to iterate twice
for (int i = 0; i < 5; i++) {
inputItems[i] = new ItemStack[inputList.size()];
}
for (int i = 0; i < inputList.size(); i++) {
List<ItemStack> inputs = new ArrayList<>(inputList.get(i));
if (inputs.size() > inCount) {
inCount = inputs.size();
}
for (int j = 0; j < inputs.size() && j < 5; j++) {
ItemStack stack = inputs.get(j);
if (stack != null && stack.getMetadata() == OreDictionary.WILDCARD_VALUE) {
stack = stack.copy();
stack.setItemDamage(0);
}
inputItems[j][i] = stack;
}
}
}
addTitle(list, CustomFontColor.encodeColor(color) + modifier.getLocalizedName(), true);
// description
int h = GuiBook.PAGE_WIDTH / 3 - 10;
list.add(new ElementText(10, 20, GuiBook.PAGE_WIDTH - 20, h, text));
if (effects.length > 0) {
TextData head = new TextData(parent.translate("modifier.effect"));
head.underlined = true;
list.add(new ElementText(10, 20 + h, GuiBook.PAGE_WIDTH / 2 - 5, GuiBook.PAGE_HEIGHT - h - 20, head));
List<TextData> effectData = Lists.newArrayList();
for (String e : effects) {
effectData.add(new TextData("\u25CF "));
effectData.add(new TextData(e));
effectData.add(new TextData("\n"));
}
list.add(new ElementText(10, 30 + h, GuiBook.PAGE_WIDTH / 2 + 5, GuiBook.PAGE_HEIGHT - h - 20, effectData));
}
ImageData img;
switch (inCount) {
case 1:
img = IMG_SLOT_1;
break;
case 2:
img = IMG_SLOT_2;
break;
case 3:
img = IMG_SLOT_3;
break;
default:
img = IMG_SLOT_5;
}
int imgX = GuiBook.PAGE_WIDTH / 2 + 20;
int imgY = GuiBook.PAGE_HEIGHT / 2 + 30;
// move ot towards the center wher ewe want it, since image sice can differ
imgX = imgX + 29 - img.width / 2;
imgY = imgY + 20 - img.height / 2;
//int[] slotX = new int[] { 7, 3, 28, 53, 49};
//int[] slotY = new int[] {50, 24, 3, 24, 50};
int[] slotX = new int[]{3, 21, 39, 12, 30};
int[] slotY = new int[]{3, 3, 3, 22, 22};
//list.add(new ElementItemCustom(imgX + IMG_MODIFY.width/2 - 24, imgY - 25, 3f, new ItemStack(TinkerTools.toolTables, 1, BlockToolTable.TableTypes.ToolStation.meta), new ItemStack(TinkerTools.toolForge)));
list.add(new ElementImage(imgX + (img.width - IMG_TABLE.width) / 2, imgY - 24, -1, -1, IMG_TABLE));
list.add(new ElementImage(imgX, imgY, -1, -1, img, book.appearance.slotColor));
ItemStack[] demo = getDemoTools(inputItems);
ElementTinkerItem toolItem = new ElementTinkerItem(imgX + (img.width - 16) / 2, imgY - 24, 1f, demo);
toolItem.noTooltip = true;
list.add(toolItem);
list.add(new ElementImage(imgX + (img.width - 22) / 2, imgY - 27, -1, -1, IMG_SLOT_1, 0xffffff));
if (inputItems != null) {
for (int i = 0; i < inCount; i++) {
list.add(new ElementTinkerItem(imgX + slotX[i], imgY + slotY[i], 1f, inputItems[i]));
}
}
}
protected ItemStack[] getDemoTools(ItemStack[][] inputItems) {
ItemStack[] demo = new ItemStack[tool.size()];
for (int i = 0; i < tool.size(); i++) {
if (tool.get(i) instanceof ToolCore) {
ToolCore core = (ToolCore) tool.get(i);
List<Material> mats = ImmutableList.<Material>of(TinkerMaterials.wood, TinkerMaterials.cobalt, TinkerMaterials.ardite, TinkerMaterials.manyullyn);
mats = mats.subList(0, core.getRequiredComponents().size());
demo[i] = ((ToolCore) tool.get(i)).buildItemForRendering(mats);
} else if (tool != null) {
demo[i] = new ItemStack(tool.get(i));
}
if (demo[i] != null) {
modifier.apply(demo[i]);
}
}
return demo;
}
}

View File

@@ -0,0 +1,85 @@
package com.sosnitzka.taiga.book;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import slimeknights.mantle.client.book.data.BookData;
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 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 java.util.ArrayList;
import static slimeknights.mantle.client.gui.book.Textures.TEX_SMELTING;
public class ContentSmelting extends PageContent {
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);
public static final transient int INPUT_X = 5;
public static final transient int INPUT_Y = 5;
public static final transient int RESULT_X = 74;
public static final transient int RESULT_Y = 41;
public static final transient int FUEL_X = 5;
public static final transient int FUEL_Y = 77;
public static final transient float ITEM_SCALE = 2.0F;
public String title = "Smelting";
public ItemStackData input;
public ItemStackData result;
public TextData[] description;
@Override
public void build(BookData book, ArrayList<BookElement> list, boolean rightSide) {
int x = GuiBook.PAGE_WIDTH / 2 - IMG_SMELTING.width / 2;
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.slotColor));
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 && !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()));
if (description != null && description.length > 0) {
list.add(new ElementText(0, IMG_SMELTING.height + y + 5, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT - y - 5, description));
}
}
public ItemStack[] getFuelsList() {
//TODO ask JEI for fuel list if it is present
ItemStack[] fuels = new ItemStack[13];
fuels[0] = new ItemStack(Blocks.WOODEN_SLAB);
fuels[1] = new ItemStack(Blocks.PLANKS);
fuels[2] = new ItemStack(Blocks.COAL_BLOCK);
fuels[3] = new ItemStack(Items.WOODEN_PICKAXE);
fuels[4] = new ItemStack(Items.WOODEN_SWORD);
fuels[5] = new ItemStack(Items.WOODEN_HOE);
fuels[6] = new ItemStack(Items.STICK);
fuels[7] = new ItemStack(Items.COAL);
fuels[8] = new ItemStack(Items.LAVA_BUCKET);
fuels[9] = new ItemStack(Blocks.SAPLING);
fuels[10] = new ItemStack(Items.BLAZE_ROD);
fuels[11] = new ItemStack(Items.WOODEN_SHOVEL);
fuels[12] = new ItemStack(Items.WOODEN_AXE);
return fuels;
}
}

View File

@@ -0,0 +1,48 @@
package com.sosnitzka.taiga.book;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import slimeknights.mantle.client.book.data.BookData;
import slimeknights.mantle.client.book.data.content.PageContent;
import slimeknights.mantle.client.book.data.element.ImageData;
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.ElementText;
import java.util.ArrayList;
@SideOnly(Side.CLIENT)
public class ContentTextRightImage extends PageContent {
public String title;
public TextData[] text1;
public TextData[] text2;
public ImageData image;
@Override
public void build(BookData book, ArrayList<BookElement> list, boolean rightSide) {
int y = TITLE_HEIGHT;
if (title == null || title.isEmpty()) {
y = 0;
} else {
addTitle(list, title);
}
if (text1 != null && text1.length > 0) {
list.add(new ElementText(0, y, GuiBook.PAGE_WIDTH - 55, 50, text1));
}
if (image != null && image.location != null) {
list.add(new ElementImage(GuiBook.PAGE_WIDTH - 50, y, 50, 50, image));
} else {
list.add(new ElementImage(GuiBook.PAGE_WIDTH - 50, y, 50, 50, ImageData.MISSING));
}
if (text2 != null && text2.length > 0) {
list.add(new ElementText(0, y + 55, GuiBook.PAGE_WIDTH, GuiBook.PAGE_HEIGHT - 55 - y, text2));
}
}
}