|
|
|
@@ -1,5 +1,6 @@
|
|
|
|
|
package crazypants.enderio.nei;
|
|
|
|
|
|
|
|
|
|
import java.awt.Point;
|
|
|
|
|
import java.awt.Rectangle;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
@@ -8,6 +9,7 @@ import java.util.Map;
|
|
|
|
|
|
|
|
|
|
import net.minecraft.client.gui.inventory.GuiContainer;
|
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
|
import net.minecraft.util.EnumChatFormatting;
|
|
|
|
|
import net.minecraft.util.StatCollector;
|
|
|
|
|
import net.minecraftforge.fluids.Fluid;
|
|
|
|
|
import net.minecraftforge.fluids.FluidContainerRegistry;
|
|
|
|
@@ -15,13 +17,17 @@ import net.minecraftforge.fluids.FluidStack;
|
|
|
|
|
|
|
|
|
|
import org.lwjgl.opengl.GL11;
|
|
|
|
|
|
|
|
|
|
import com.enderio.core.client.render.RenderUtil;
|
|
|
|
|
import com.enderio.core.common.util.FluidUtil;
|
|
|
|
|
|
|
|
|
|
import codechicken.lib.gui.GuiDraw;
|
|
|
|
|
import codechicken.nei.ItemStackMap;
|
|
|
|
|
import codechicken.nei.PositionedStack;
|
|
|
|
|
import codechicken.nei.recipe.StackInfo;
|
|
|
|
|
import codechicken.nei.recipe.GuiCraftingRecipe;
|
|
|
|
|
import codechicken.nei.recipe.GuiRecipe;
|
|
|
|
|
import codechicken.nei.recipe.GuiUsageRecipe;
|
|
|
|
|
import codechicken.nei.recipe.TemplateRecipeHandler;
|
|
|
|
|
import crazypants.enderio.fluid.Fluids;
|
|
|
|
|
import crazypants.enderio.gui.GuiContainerBaseEIO;
|
|
|
|
|
import crazypants.enderio.machine.recipe.IRecipe;
|
|
|
|
|
import crazypants.enderio.machine.recipe.RecipeInput;
|
|
|
|
@@ -32,6 +38,9 @@ import crazypants.util.ColorUtils;
|
|
|
|
|
|
|
|
|
|
public class VatRecipeHandler extends TemplateRecipeHandler {
|
|
|
|
|
|
|
|
|
|
private final Rectangle inTankBounds = new Rectangle(25, 1, 15, 47);
|
|
|
|
|
private final Rectangle outTankBounds = new Rectangle(127, 1, 15, 47);
|
|
|
|
|
|
|
|
|
|
public VatRecipeHandler() {}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@@ -85,7 +94,7 @@ public class VatRecipeHandler extends TemplateRecipeHandler {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void loadCraftingRecipes(ItemStack result) {
|
|
|
|
|
FluidStack fluid = getFluidFromNeiItem(result);
|
|
|
|
|
FluidStack fluid = FluidUtil.getFluidFromItem(result);
|
|
|
|
|
if (fluid != null) {
|
|
|
|
|
loadCraftingRecipes(fluid);
|
|
|
|
|
}
|
|
|
|
@@ -113,7 +122,7 @@ public class VatRecipeHandler extends TemplateRecipeHandler {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void loadUsageRecipes(ItemStack ingredient) {
|
|
|
|
|
FluidStack fluid = getFluidFromNeiItem(ingredient);
|
|
|
|
|
FluidStack fluid = FluidUtil.getFluidFromItem(ingredient);
|
|
|
|
|
if (fluid != null) {
|
|
|
|
|
loadUsageRecipes(fluid);
|
|
|
|
|
}
|
|
|
|
@@ -150,37 +159,109 @@ public class VatRecipeHandler extends TemplateRecipeHandler {
|
|
|
|
|
@Override
|
|
|
|
|
public void drawExtras(int recipeIndex) {
|
|
|
|
|
InnerVatRecipe rec = (InnerVatRecipe) arecipes.get(recipeIndex);
|
|
|
|
|
if (rec.inFluid != null && rec.inFluid.getFluid() != null) {
|
|
|
|
|
RenderUtil.renderGuiTank(
|
|
|
|
|
rec.inFluid,
|
|
|
|
|
FluidContainerRegistry.BUCKET_VOLUME * 8,
|
|
|
|
|
rec.getInputFluidAmount(),
|
|
|
|
|
inTankBounds.x,
|
|
|
|
|
inTankBounds.y,
|
|
|
|
|
0,
|
|
|
|
|
inTankBounds.width,
|
|
|
|
|
inTankBounds.height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (rec.result != null && rec.result.getFluid() != null) {
|
|
|
|
|
RenderUtil.renderGuiTank(
|
|
|
|
|
rec.result,
|
|
|
|
|
FluidContainerRegistry.BUCKET_VOLUME * 8,
|
|
|
|
|
rec.getResultFluidAmount(),
|
|
|
|
|
outTankBounds.x,
|
|
|
|
|
outTankBounds.y,
|
|
|
|
|
0,
|
|
|
|
|
outTankBounds.width,
|
|
|
|
|
outTankBounds.height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String energyString = PowerDisplayUtil.formatPower(rec.energy) + " " + PowerDisplayUtil.abrevation();
|
|
|
|
|
GuiDraw.drawStringC(energyString, 86, 54, ColorUtils.neiEnergyString.getColor(), false);
|
|
|
|
|
|
|
|
|
|
Fluid outputFluid = rec.resultFluid.getFluid();
|
|
|
|
|
Fluid outputFluid = rec.result.getFluid();
|
|
|
|
|
List<PositionedStack> stacks = rec.getIngredients();
|
|
|
|
|
for (PositionedStack ps : stacks) {
|
|
|
|
|
if (ps instanceof PositionedStack.Tank) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
float mult = VatRecipeManager.getInstance()
|
|
|
|
|
.getMultiplierForInput(rec.inFluid.getFluid(), ps.item, outputFluid);
|
|
|
|
|
GuiDraw.drawStringC(
|
|
|
|
|
"x" + mult,
|
|
|
|
|
ps.relx + 8,
|
|
|
|
|
ps.rely + 19,
|
|
|
|
|
ColorUtils.neiMultiplierString.getColor(),
|
|
|
|
|
false);
|
|
|
|
|
String str = "x" + mult;
|
|
|
|
|
GuiDraw.drawStringC(str, ps.relx + 8, ps.rely + 19, ColorUtils.neiMultiplierString.getColor(), false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static FluidStack getFluidFromNeiItem(ItemStack stack) {
|
|
|
|
|
FluidStack fluid = StackInfo.getFluid(stack);
|
|
|
|
|
return fluid != null ? fluid : FluidUtil.getFluidFromItem(stack);
|
|
|
|
|
@Override
|
|
|
|
|
public List<String> handleItemTooltip(GuiRecipe<?> gui, ItemStack stack, List<String> currenttip, int recipeIndex) {
|
|
|
|
|
return currenttip;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static FluidStack withAmount(FluidStack fluid, int amount) {
|
|
|
|
|
FluidStack copy = fluid.copy();
|
|
|
|
|
copy.amount = amount;
|
|
|
|
|
return copy;
|
|
|
|
|
@Override
|
|
|
|
|
public List<String> handleTooltip(GuiRecipe<?> gui, List<String> currenttip, int recipeIndex) {
|
|
|
|
|
final InnerVatRecipe rec = (InnerVatRecipe) arecipes.get(recipeIndex);
|
|
|
|
|
final Point pos = GuiDraw.getMousePosition();
|
|
|
|
|
final Point offset = gui.getRecipePosition(recipeIndex);
|
|
|
|
|
final Point relMouse = new Point(pos.x - gui.guiLeft - offset.x, pos.y - gui.guiTop - offset.y);
|
|
|
|
|
|
|
|
|
|
if (inTankBounds.contains(relMouse) && rec.inFluid != null && rec.inFluid.getFluid() != null) {
|
|
|
|
|
currenttip.add(rec.inFluid.getFluid().getLocalizedName(rec.inFluid));
|
|
|
|
|
currenttip.add(EnumChatFormatting.GRAY.toString() + rec.getInputFluidAmount() + " " + Fluids.MB());
|
|
|
|
|
} else if (outTankBounds.contains(relMouse) && rec.result != null && rec.result.getFluid() != null) {
|
|
|
|
|
currenttip.add(rec.result.getFluid().getLocalizedName(rec.result));
|
|
|
|
|
currenttip.add(EnumChatFormatting.GRAY.toString() + rec.getResultFluidAmount() + " " + Fluids.MB());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return super.handleTooltip(gui, currenttip, recipeIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean mouseClicked(GuiRecipe<?> gui, int button, int recipeIndex) {
|
|
|
|
|
if (button == 0) {
|
|
|
|
|
if (this.transferFluidTanks(gui, recipeIndex, false)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
} else if (button == 1) {
|
|
|
|
|
if (this.transferFluidTanks(gui, recipeIndex, true)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return super.mouseClicked(gui, button, recipeIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean transferFluidTanks(GuiRecipe<?> gui, int recipeIndex, boolean usage) {
|
|
|
|
|
InnerVatRecipe rec = (InnerVatRecipe) arecipes.get(recipeIndex);
|
|
|
|
|
Point pos = GuiDraw.getMousePosition();
|
|
|
|
|
Point offset = gui.getRecipePosition(recipeIndex);
|
|
|
|
|
Point relMouse = new Point(pos.x - gui.guiLeft - offset.x, pos.y - gui.guiTop - offset.y);
|
|
|
|
|
|
|
|
|
|
if (inTankBounds.contains(relMouse)) {
|
|
|
|
|
transferFluidTank(rec.inFluid, usage);
|
|
|
|
|
} else if (outTankBounds.contains(relMouse)) {
|
|
|
|
|
transferFluidTank(rec.result, usage);
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean transferFluidTank(FluidStack tank, boolean usage) {
|
|
|
|
|
if (tank != null && tank.amount > 0) {
|
|
|
|
|
if (usage) {
|
|
|
|
|
if (!GuiUsageRecipe.openRecipeGui("liquid", new Object[] { tank.copy() })) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (!GuiCraftingRecipe.openRecipeGui("liquid", new Object[] { tank.copy() })) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<ItemStack> getInputs(RecipeInput input) {
|
|
|
|
@@ -198,32 +279,20 @@ public class VatRecipeHandler extends TemplateRecipeHandler {
|
|
|
|
|
public class InnerVatRecipe extends TemplateRecipeHandler.CachedRecipe {
|
|
|
|
|
|
|
|
|
|
private final List<PositionedStack> inputs = new ArrayList<>();
|
|
|
|
|
private final ItemStackMap<Float> firstItemMultiplier = new ItemStackMap<Float>();
|
|
|
|
|
private final ItemStackMap<Float> secondItemMultiplier = new ItemStackMap<Float>();
|
|
|
|
|
private final ItemStackMap<Float> firstItemMultiplier = new ItemStackMap();
|
|
|
|
|
private final ItemStackMap<Float> secondItemMultiplier = new ItemStackMap();
|
|
|
|
|
private final Map<FluidStack, Float> fluidMultiplier = new HashMap<>();
|
|
|
|
|
private final FluidStack resultFluid;
|
|
|
|
|
private final int energy;
|
|
|
|
|
private final FluidStack result;
|
|
|
|
|
private FluidStack inFluid;
|
|
|
|
|
|
|
|
|
|
private int inTankIndex = -1;
|
|
|
|
|
private int lastInputAmount;
|
|
|
|
|
private PositionedStack resultTank;
|
|
|
|
|
private int lastResultAmount;
|
|
|
|
|
|
|
|
|
|
public int getEnergy() {
|
|
|
|
|
return energy;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<PositionedStack> getIngredients() {
|
|
|
|
|
if (this.inTankIndex >= 0) {
|
|
|
|
|
int amount = getInputFluidAmount();
|
|
|
|
|
if (amount != this.lastInputAmount) {
|
|
|
|
|
this.lastInputAmount = amount;
|
|
|
|
|
this.inputs.set(this.inTankIndex, createTank(withAmount(this.inFluid, amount), 25, 1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return this.inputs;
|
|
|
|
|
return getCycledIngredients(cycleticks / 30, this.inputs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getInputFluidAmount() {
|
|
|
|
@@ -252,12 +321,7 @@ public class VatRecipeHandler extends TemplateRecipeHandler {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public PositionedStack getResult() {
|
|
|
|
|
int amount = getResultFluidAmount();
|
|
|
|
|
if (amount != this.lastResultAmount || this.resultTank == null) {
|
|
|
|
|
this.lastResultAmount = amount;
|
|
|
|
|
this.resultTank = createTank(withAmount(this.resultFluid, amount), 127, 1);
|
|
|
|
|
}
|
|
|
|
|
return this.resultTank;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public InnerVatRecipe(int energy, RecipeInput[] ingredients, FluidStack result) {
|
|
|
|
@@ -291,28 +355,15 @@ public class VatRecipeHandler extends TemplateRecipeHandler {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Item stacks must stay at indices 0/1: getFirstItemMultiplier()/getSecondItemMultiplier() rely on it.
|
|
|
|
|
if (!inputsOne.isEmpty()) {
|
|
|
|
|
this.inputs.add(new PositionedStack(inputsOne, 51, 1));
|
|
|
|
|
}
|
|
|
|
|
if (!inputsTwo.isEmpty()) {
|
|
|
|
|
this.inputs.add(new PositionedStack(inputsTwo, 100, 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.energy = energy;
|
|
|
|
|
this.resultFluid = result;
|
|
|
|
|
|
|
|
|
|
if (this.inFluid != null) {
|
|
|
|
|
this.inTankIndex = this.inputs.size();
|
|
|
|
|
this.lastInputAmount = getInputFluidAmount();
|
|
|
|
|
this.inputs.add(createTank(withAmount(this.inFluid, this.lastInputAmount), 25, 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.lastResultAmount = getResultFluidAmount();
|
|
|
|
|
this.resultTank = createTank(withAmount(this.resultFluid, this.lastResultAmount), 127, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static PositionedStack.Tank createTank(FluidStack fluid, int x, int y) {
|
|
|
|
|
return new PositionedStack.Tank(fluid, x, y, 15, 47, FluidContainerRegistry.BUCKET_VOLUME * 8);
|
|
|
|
|
this.result = result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|