package slimeknights.tconstruct.library.book.content; 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 java.util.ArrayList; import java.util.List; 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.elements.ElementTinkerItem; import slimeknights.tconstruct.library.book.TinkerPage; 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; @SideOnly(Side.CLIENT) public class ContentModifier 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 ContentModifier() { } public ContentModifier(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 < 5; 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; } }