ProjectZombie/src/projectzombie/menu/gui/GUIRecipeCard.java

193 lines
4.3 KiB
Java

package projectzombie.menu.gui;
import gl_engine.matrix.Matrix4;
import gl_engine.vec.Vec2d;
import projectzombie.init.Models;
import projectzombie.inventory.Crafting;
import projectzombie.inventory.Inventory;
import projectzombie.inventory.recipe.Recipe;
import projectzombie.model.ModelGui;
import projectzombie.util.math.ItemStack;
public class GUIRecipeCard implements GUIContainer
{
private static final ModelGui LABEL = Models.UI_LABEL_RECIPE;
private Vec2d pos;
private Recipe recipe;
private GUIContainer gui;
private GUIItemSlot result_display_slot;
private GUIItemSlot result_slot;
private GUIItemSlot[] ingredients;
private Inventory inventory;
private Crafting tool;
public GUIRecipeCard(Inventory inventory, GUIContainer gui, Recipe recipe, Crafting tool, Vec2d pos)
{
this.gui = gui;
this.recipe = recipe;
this.pos = pos;
this.inventory = inventory;
this.tool = tool;
result_slot = new GUIItemSlot(1.5, true, new GUIItemSlotGetter()
{
@Override
public void setItemStack(ItemStack stack) {
}
@Override
public boolean isAllowed(ItemStack stack) {
return false;
}
@Override
public ItemStack getItemStack() {
return (recipe.canCraft(tool) &&
recipe.hasResourcesToCraft(inventory)) ?
recipe.getResult().copy() :
ItemStack.getEmpty();
}
@Override
public boolean mustTakeAll() {
return true;
}
@Override
public void onRemoveItemStack() {
if(recipe.canCraft(tool) && recipe.hasResourcesToCraft(inventory)) {
recipe.craftResult(inventory);
}
}
});
result_slot.setPos(pos.add(new Vec2d(
Models.UI_LABEL_RECIPE.getWidth() * 103 / 128.0 + 0.25,
Models.UI_LABEL_RECIPE.getHeight() * 9 / 32.0 + 0.25)));
result_display_slot = new GUIItemSlotReadonly(1, true, recipe.getResult());
result_display_slot.setPos(pos.add(new Vec2d(
Models.UI_LABEL_RECIPE.getWidth() * 87 / 128.0 + 0.25,
Models.UI_LABEL_RECIPE.getHeight() * 9 / 32.0 + 0.25)));
ItemStack[] ingredients = recipe.getIngredients();
this.ingredients = new GUIItemSlot[ingredients.length];
for(int i=0;i<ingredients.length;i++)
{
ItemStack ingredient = ingredients[i];
GUIItemSlot ingredientDisplay = new GUIItemSlotReadonly(1, true, ingredient);
ingredientDisplay.setPos(pos.add(new Vec2d(
Models.UI_LABEL_RECIPE.getWidth() * (27 + 16 * i) / 128.0 + 0.25,
Models.UI_LABEL_RECIPE.getHeight() * 9 / 32.0 + 0.25)));
this.ingredients[i] = ingredientDisplay;
}
}
@Override
public void render(Matrix4 matrix, Vec2d mousePos, boolean canHover)
{
LABEL.setModel(Matrix4.multiply(matrix, Matrix4.translate(pos.x, pos.y, 0)));
LABEL.render();
for(GUIComponent c : allComponents()) {
c.render(matrix, mousePos, canHover);
}
}
private GUIComponent[] allComponents()
{
GUIComponent[] components = new GUIComponent[ingredients.length + 2];
components[0] = result_slot;
components[1] = result_display_slot;
for(int i=0;i<ingredients.length;i++) {
components[i+2] = ingredients[i];
}
return components;
}
@Override
public void update(Vec2d mousePos) {
for(GUIComponent c : allComponents()) {
c.update(mousePos);
}
}
@Override
public boolean checkMouseHover(Vec2d mousePos) {
for(GUIComponent c : allComponents()) {
if(c.checkMouseHover(mousePos)) {
return true;
}
}
return false;
}
@Override
public void onScroll(Vec2d mousePos, double amount) {
for(GUIComponent c : allComponents()) {
c.onScroll(mousePos, amount);
}
}
@Override
public void onRightClick(Vec2d mousePos) {
for(GUIComponent c : allComponents()) {
c.onRightClick(mousePos);
}
}
@Override
public void onMouseClick(Vec2d mousePos) {
for(GUIComponent c : allComponents()) {
c.onMouseClick(mousePos);
}
}
@Override
public void onActivate() {
for(GUIComponent c : allComponents()) {
c.onActivate();
}
}
@Override
public void onBack() {
for(GUIComponent c : allComponents()) {
c.onBack();
}
}
@Override
public GUIItemSlot getHoveringItemSlot(Vec2d mousePos)
{
for(GUIComponent c : allComponents()) {
if(c.checkMouseHover(mousePos) && c instanceof GUIItemSlot) {
return (GUIItemSlot)c;
}
}
return null;
}
@Override
public void add(GUIComponent c) {
}
@Override
public void clear() {
}
}