package com.austinv11.thaumicnei.handlers;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.PositionedStack;
import codechicken.nei.recipe.TemplateRecipeHandler;
import com.austinv11.thaumicnei.reference.Config;
import com.austinv11.thaumicnei.reference.Reference;
import com.austinv11.thaumicnei.utils.Logger;
import net.minecraft.item.ItemStack;
import net.minecraft.util.StatCollector;
import net.minecraftforge.oredict.OreDictionary;
import org.lwjgl.opengl.GL11;
import thaumcraft.api.ThaumcraftApi;
import thaumcraft.api.ThaumcraftApiHelper;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.crafting.ShapelessArcaneRecipe;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class ShapelessArcaneWorkbenchHandler extends TemplateRecipeHandler {
@Override
public String getGuiTexture() {
return "thaumcraft:textures/gui/gui_arcaneworkbench.png";
}
@Override
public String getRecipeName() {
return StatCollector.translateToLocal(Reference.MOD_ID+":gui.nei.arcaneWorkbench.shapeless");
}
@Override
public int recipiesPerPage() {
return 1;
}
@Override
public void drawBackground(int recipe) {
GL11.glColor4f(1, 1, 1, 1);
GuiDraw.changeTexture(getGuiTexture());
GuiDraw.drawTexturedModalRect(0, 0, 11, 10, 123, 126);
GuiDraw.drawTexturedModalRect(126, 0, 147, 10, 75, 100);//FIXME: Add support to show wands
}
@Override
public void drawForeground(int recipe) {
super.drawForeground(recipe);
}
@Override
public void drawExtras(int recipe) {
CachedShapelessArcaneWorkbenchRecipe r = (CachedShapelessArcaneWorkbenchRecipe) arecipes.get(recipe);
int coords[] = {0,0,0,0,260,260};
int textCoords[] = {0,0};
for (Aspect aspect : r.aspects.getAspects()) {
if (aspect.isPrimal()) {
if (aspect.getName().equalsIgnoreCase("Ignis")) {//Oh no, no switch statement! D:
textCoords[0] = 8;
textCoords[1] = 101;
} else if (aspect.getName().equalsIgnoreCase("Aer")) {
textCoords[0] = 68;
textCoords[1] = 17;
} else if (aspect.getName().equalsIgnoreCase("Terra")) {
textCoords[0] = 8;
textCoords[1] = 43;
} else if (aspect.getName().equalsIgnoreCase("Aqua")) {
textCoords[0] = 68;
textCoords[1] = 98;
} else if (aspect.getName().equalsIgnoreCase("Ordo")) {
textCoords[0] = 104;
textCoords[1] = 101;
} else if (aspect.getName().equalsIgnoreCase("Perditio")) {
textCoords[0] = 104;
textCoords[1] = 43;
}
GuiDraw.drawString(r.aspects.getAmount(aspect) + "", textCoords[0], textCoords[1], 0xFFFFFF, true);
}
}
GL11.glScalef(.065f,.065f,.065f);
GL11.glEnable(GL11.GL_BLEND);
for (Aspect aspect : r.aspects.getAspects()){
if (aspect.isPrimal()) {
if (aspect.getName().equalsIgnoreCase("Ignis")) {//Oh no, no switch statement! D:
coords[0] = 78;
coords[1] = 1281;
}else if (aspect.getName().equalsIgnoreCase("Aer")) {
coords[0] = 808;
coords[1] = 48;
}else if (aspect.getName().equalsIgnoreCase("Terra")) {
coords[0] = 78;
coords[1] = 387;
}else if (aspect.getName().equalsIgnoreCase("Aqua")) {
coords[0] = 808;
coords[1] = 1621;
}else if (aspect.getName().equalsIgnoreCase("Ordo")) {
coords[0] = 1540;
coords[1] = 1281;
}else if (aspect.getName().equalsIgnoreCase("Perditio")) {
coords[0] = 1540;
coords[1] = 387;
}
Color color = new Color(aspect.getColor());
GL11.glColor4f(color.getRed()/255f, color.getGreen()/255f, color.getBlue()/255f, 1f);
GuiDraw.changeTexture(aspect.getImage());
GuiDraw.drawTexturedModalRect(coords[0], coords[1], coords[2], coords[3], coords[4], coords[5]);
}
}
GL11.glDisable(GL11.GL_BLEND);
}
@Override
public void loadCraftingRecipes(ItemStack result) {
List recipes = ThaumcraftApi.getCraftingRecipes();
for (int i = 0; i < recipes.size(); i++){//Sorry, no enhanced for loop here :P
if (recipes.get(i) instanceof ShapelessArcaneRecipe) {
ShapelessArcaneRecipe recipe = (ShapelessArcaneRecipe) recipes.get(i);
if (ThaumcraftApiHelper.isResearchComplete(Reference.PLAYER_NAME, recipe.getResearch()) || Config.cheatMode){
if (recipe.getRecipeOutput().isItemEqual(result)) {
if (checkDupe(recipe)) {
CachedShapelessArcaneWorkbenchRecipe r = new CachedShapelessArcaneWorkbenchRecipe(recipe);
r.prepVisuals();
this.arecipes.add(r);
}
}
}
}
}
}
@Override
public void loadUsageRecipes(ItemStack ingredient) {
List recipes = ThaumcraftApi.getCraftingRecipes();
for (int i = 0; i < recipes.size(); i++) {//Sorry, no enhanced for loop here again :P
if (recipes.get(i) instanceof ShapelessArcaneRecipe) {
ShapelessArcaneRecipe recipe = (ShapelessArcaneRecipe) recipes.get(i);
if (ThaumcraftApiHelper.isResearchComplete(Reference.PLAYER_NAME, recipe.getResearch()) || Config.cheatMode){
for (Object o : recipe.getInput()) {
if (o instanceof ItemStack) {
ItemStack item = (ItemStack) o;
if (item.isItemEqual(ingredient)) {
if (checkDupe(recipe)) {
CachedShapelessArcaneWorkbenchRecipe r = new CachedShapelessArcaneWorkbenchRecipe(recipe);
r.prepVisuals();
r.setIngredientPermutation(r.inputs,ingredient);
this.arecipes.add(r);
}
}
}
}
}
}
}
}
private boolean checkDupe(ShapelessArcaneRecipe recipe) {
for (Object o : this.arecipes.toArray()){
if (o instanceof CachedShapelessArcaneWorkbenchRecipe){
CachedShapelessArcaneWorkbenchRecipe r = (CachedShapelessArcaneWorkbenchRecipe) o;
if (r.recipe.getInput() == recipe.getInput()){
if (r.recipe.getRecipeOutput().isItemEqual(recipe.getRecipeOutput())) {
return false;
}
}
}
}
return true;
}
public class CachedShapelessArcaneWorkbenchRecipe extends CachedRecipe{
private final int[] outCoords = {139,54};
private final int[] inCoords = {29,53,77,75,81,103};//3 x coords, then 3 y coords
private final int[] wandCoords = {139, 34};
private PositionedStack output;
private List<PositionedStack> inputs = new ArrayList<PositionedStack>();
//private PositionedStack extra = new PositionedStack()TODO add wand extras
public AspectList aspects;
public ShapelessArcaneRecipe recipe;
public CachedShapelessArcaneWorkbenchRecipe(ShapelessArcaneRecipe recipe){//Wow that's a long class name!
this.aspects = recipe.getAspects();
this.output = new PositionedStack(recipe.getRecipeOutput(), outCoords[0], outCoords[1]);
this.recipe = recipe;
ArrayList<Object> input = recipe.getInput();
int i = 0;
for (Object inputItem : input){
//if (inputItem != null){
switch (i) {
case 0:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[0], inCoords[0]));
}
break;
case 1:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[1], inCoords[0]));
}
break;
case 2:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[2], inCoords[0]));
}
break;
case 3:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[0], inCoords[1]));
}
break;
case 4:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[1], inCoords[1]));
}
break;
case 5:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[2], inCoords[1]));
}
break;
case 6:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[0], inCoords[2]));
}
break;
case 7:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[1], inCoords[2]));
}
break;
case 8:
if (inputItem != null) {
this.inputs.add(new PositionedStack(inputItem, inCoords[2], inCoords[2]));
}
break;
}
i++;
//}
}
}
@Override
public PositionedStack getResult() {
return this.output;
}
@Override
public List<PositionedStack> getIngredients() {
return getCycledIngredients(cycleticks / 20, this.inputs);
}
public void prepVisuals() {
for (PositionedStack i : this.inputs) {
i.generatePermutations();
}
}
@Override
public PositionedStack getOtherStack() {
//return new PositionedStack(ItemApi.getItem("Thaumcraft:WandCasting", 0), wandCoords[0], wandCoords[1]);FIXME
return null;
}
}
@Override
public String getOverlayIdentifier(){
return "arcane";
}
}