package tonius.neiintegration.mods.mcforge;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import tonius.neiintegration.PositionedFluidTank;
import tonius.neiintegration.RecipeHandlerBase;
import tonius.neiintegration.Utils;
import tonius.neiintegration.config.Config;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.PositionedStack;
import codechicken.nei.recipe.GuiRecipe;
public class RecipeHandlerFluidRegistry extends RecipeHandlerBase {
public class CachedFluidRegistryRecipe extends CachedBaseRecipe {
public PositionedFluidTank fluid;
public PositionedStack block = null;
public PositionedStack emptyContainer = null;
public PositionedStack filledContainer = null;
public CachedFluidRegistryRecipe(Fluid fluid) {
this.fluid = new PositionedFluidTank(new FluidStack(fluid, 1000), 1000, new Rectangle(32, 5, 96, 32));
this.fluid.showAmount = false;
if (fluid.getBlock() != null) {
this.block = new PositionedStack(new ItemStack(fluid.getBlock()), 32, 43);
}
this.setContainerItems(fluid);
}
private void setContainerItems(Fluid fluid) {
List<ItemStack> emptyContainers = new ArrayList<ItemStack>();
List<ItemStack> filledContainers = new ArrayList<ItemStack>();
for (FluidContainerData data : FluidContainerRegistry.getRegisteredFluidContainerData()) {
if (data.fluid.getFluid() == fluid) {
emptyContainers.add(data.emptyContainer);
filledContainers.add(data.filledContainer);
}
}
if (!emptyContainers.isEmpty() && !filledContainers.isEmpty()) {
this.emptyContainer = new PositionedStack(emptyContainers, 71, 43);
this.filledContainer = new PositionedStack(filledContainers, 112, 43);
}
}
@Override
public PositionedFluidTank getFluidTank() {
return this.fluid;
}
@Override
public PositionedStack getOtherStack() {
return this.block;
}
@Override
public PositionedStack getIngredient() {
if (this.emptyContainer != null) {
this.randomRenderPermutation(this.emptyContainer, RecipeHandlerFluidRegistry.this.cycleticks / 20);
}
return this.emptyContainer;
}
@Override
public PositionedStack getResult() {
if (this.filledContainer != null) {
this.randomRenderPermutation(this.filledContainer, RecipeHandlerFluidRegistry.this.cycleticks / 20);
}
return this.filledContainer;
}
public void setPermutation(PositionedStack pStack, ItemStack stack) {
if (pStack != null) {
for (int i = 0; i < pStack.items.length; i++) {
if (Utils.areStacksSameTypeCraftingSafe(stack, pStack.items[i])) {
pStack.item = pStack.items[i];
pStack.item.setItemDamage(stack.getItemDamage());
pStack.items = new ItemStack[] { pStack.item };
pStack.setPermutationToRender(0);
break;
}
}
}
}
}
@Override
public String getRecipeName() {
return Utils.translate("handler.fluidRegistry");
}
@Override
public String getRecipeID() {
return "forge.fluidRegistry";
}
@Override
public String getGuiTexture() {
return "neiintegration:textures/fluidRegistry.png";
}
@Override
public void loadTransferRects() {
this.addTransferRect(91, 42, 17, 17);
}
@Override
public void drawBackground(int recipe) {
this.changeToGuiTexture();
GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 160, 65);
}
@Override
public List<String> provideTooltip(GuiRecipe guiRecipe, List<String> currenttip, CachedBaseRecipe crecipe, Point relMouse) {
super.provideTooltip(guiRecipe, currenttip, crecipe, relMouse);
Rectangle tank = ((CachedFluidRegistryRecipe) crecipe).fluid.position;
Fluid fluid = ((CachedFluidRegistryRecipe) crecipe).fluid.tank.getFluid().getFluid();
if (tank.contains(relMouse)) {
currenttip.add(EnumChatFormatting.GOLD + Utils.translate("handler.fluidRegistry.id") + " " + EnumChatFormatting.GRAY + fluid.getName() + " (" + fluid.getID() + ")");
currenttip.add(EnumChatFormatting.GOLD + Utils.translate("handler.fluidRegistry.state") + " " + EnumChatFormatting.GRAY + (fluid.isGaseous() ? Utils.translate("handler.fluidRegistry.state.gaseous") : Utils.translate("handler.fluidRegistry.state.liquid")));
currenttip.add(EnumChatFormatting.GOLD + Utils.translate("handler.fluidRegistry.placeable") + " " + EnumChatFormatting.GRAY + (fluid.canBePlacedInWorld() ? Utils.translate("yes") : Utils.translate("no")));
currenttip.add("");
currenttip.add(EnumChatFormatting.GOLD + Utils.translate("handler.fluidRegistry.temperature") + " " + EnumChatFormatting.GRAY + fluid.getTemperature());
currenttip.add(EnumChatFormatting.GOLD + Utils.translate("handler.fluidRegistry.luminosity") + " " + EnumChatFormatting.GRAY + fluid.getLuminosity());
currenttip.add(EnumChatFormatting.GOLD + Utils.translate("handler.fluidRegistry.density") + " " + EnumChatFormatting.GRAY + fluid.getDensity());
currenttip.add(EnumChatFormatting.GOLD + Utils.translate("handler.fluidRegistry.viscosity") + " " + EnumChatFormatting.GRAY + fluid.getViscosity());
}
return currenttip;
}
public List<Fluid> getFluids() {
List<Fluid> fluids = new LinkedList<Fluid>();
for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) {
if (fluid != null) {
fluids.add(fluid);
}
}
Collections.sort(fluids, new Comparator<Fluid>() {
@Override
public int compare(Fluid f1, Fluid f2) {
if (f1 == null || f2 == null) {
return 0;
}
return Integer.compare(f1.getID(), f2.getID());
}
});
return fluids;
}
@Override
public void loadAllRecipes() {
if (Config.handlerFluidRegistry) {
for (Fluid fluid : this.getFluids()) {
this.arecipes.add(new CachedFluidRegistryRecipe(fluid));
}
}
}
@Override
public void loadCraftingRecipes(ItemStack result) {
if (Utils.isFluidBlock(result)) {
super.loadCraftingRecipes(result);
}
if (Config.handlerFluidRegistry) {
for (Fluid fluid : this.getFluids()) {
CachedFluidRegistryRecipe crecipe = new CachedFluidRegistryRecipe(fluid);
if (crecipe.filledContainer != null && crecipe.filledContainer.contains(result)) {
crecipe.setPermutation(crecipe.filledContainer, result);
for (FluidContainerData data : FluidContainerRegistry.getRegisteredFluidContainerData()) {
if (Utils.areStacksSameTypeCraftingSafe(data.filledContainer, result)) {
crecipe.setPermutation(crecipe.emptyContainer, data.emptyContainer);
}
}
this.arecipes.add(crecipe);
}
}
}
}
@Override
public void loadCraftingRecipes(FluidStack result) {
if (Config.handlerFluidRegistry) {
for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) {
if (fluid == result.getFluid()) {
this.arecipes.add(new CachedFluidRegistryRecipe(fluid));
}
}
}
}
@Override
public void loadUsageRecipes(ItemStack ingredient) {
super.loadUsageRecipes(ingredient);
if (Config.handlerFluidRegistry) {
for (Fluid fluid : this.getFluids()) {
CachedFluidRegistryRecipe crecipe = new CachedFluidRegistryRecipe(fluid);
if (crecipe.emptyContainer != null && crecipe.emptyContainer.contains(ingredient)) {
crecipe.setPermutation(crecipe.emptyContainer, ingredient);
for (FluidContainerData data : FluidContainerRegistry.getRegisteredFluidContainerData()) {
if (Utils.areStacksSameTypeCraftingSafe(data.emptyContainer, ingredient)) {
crecipe.setPermutation(crecipe.filledContainer, data.filledContainer);
}
}
this.arecipes.add(crecipe);
}
}
}
}
@Override
public void loadUsageRecipes(FluidStack ingredient) {
if (Config.handlerFluidRegistry) {
for (Fluid fluid : this.getFluids()) {
if (fluid == ingredient.getFluid()) {
this.arecipes.add(new CachedFluidRegistryRecipe(fluid));
}
}
}
}
}