Archived
Private
Public Access
1
0
This repository has been archived on 2026-02-04. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ProjectBackup/Java/Microcraft/src/com/jdh/microcraft/gui/crafting/CraftingMenu.java
2022-09-04 12:45:01 +02:00

237 lines
7.0 KiB
Java

package com.jdh.microcraft.gui.crafting;
import com.jdh.microcraft.entity.EntityPlayer;
import com.jdh.microcraft.gui.ItemListMenu;
import com.jdh.microcraft.gui.ItemSelectMenu;
import com.jdh.microcraft.gui.Menu;
import com.jdh.microcraft.item.Item;
import com.jdh.microcraft.item.ItemInstance;
import com.jdh.microcraft.item.ItemStack;
import com.jdh.microcraft.item.crafting.Recipe;
import com.jdh.microcraft.sound.Sound;
import com.jdh.microcraft.util.Control;
import com.jdh.microcraft.util.ControlHandler;
import java.util.List;
import java.util.stream.Collectors;
public abstract class CraftingMenu extends Menu {
private class CraftingList extends ItemSelectMenu {
private final Control craft;
public CraftingList(Control up, Control down, Control craft) {
super(true, up, down);
this.craft = craft;
this.focused = true;
}
public Recipe getSelectedRecipe() {
if (CraftingMenu.this.recipes.size() == 0) {
return null;
}
return CraftingMenu.this.recipes.get(this.selectedIndex);
}
private boolean canCraft(int index) {
return this.selectedIndex < CraftingMenu.this.recipes.size() &&
CraftingMenu.this.recipes.get(index)
.canMake(CraftingMenu.this.player.inventory, CraftingMenu.this.getStation());
}
@Override
public void tick() {
super.tick();
if (this.craft.pressedTick() && this.canCraft(this.selectedIndex)) {
ItemStack result = this.getSelectedRecipe().make(CraftingMenu.this.player.inventory);
CraftingMenu.this.player.inventory.add(result);
CraftingMenu.this.onCraft(result);
}
}
@Override
public List<ItemStack> getItems() {
return CraftingMenu.this.items;
}
@Override
public int getItemTextColor(int index) {
return this.canCraft(index) ? 555 : 333;
}
@Override
public String getName() {
return CraftingMenu.this.getName();
}
}
private class HaveMenu extends ItemListMenu {
public HaveMenu() {
super(
CraftingMenu.this.craftingList.x + (CraftingMenu.this.craftingList.width + 2) * 8,
CraftingMenu.this.craftingList.y,
10, 3
);
}
@Override
public List<ItemStack> getItems() {
Recipe recipe = CraftingMenu.this.craftingList.getSelectedRecipe();
return recipe == null ?
List.of() :
List.of(new ItemStack(recipe.result.instance, 1));
}
@Override
public String getItemName(int index) {
Recipe recipe = CraftingMenu.this.craftingList.getSelectedRecipe();
assert (recipe != null);
return Integer.toString(CraftingMenu.this.player.inventory.count(recipe.result.instance.item));
}
@Override
public int getItemTextColor(int index) {
return 555;
}
@Override
public String getName() {
return "HAVE";
}
}
private class CostMenu extends ItemListMenu {
public CostMenu() {
super(
CraftingMenu.this.craftingList.x + (CraftingMenu.this.craftingList.width + 2) * 8,
CraftingMenu.this.craftingList.y + (CraftingMenu.this.haveMenu.height + 1) * 8,
10, CraftingMenu.this.craftingList.height - CraftingMenu.this.haveMenu.height - 1
);
}
@Override
public List<ItemStack> getItems() {
Recipe recipe = CraftingMenu.this.craftingList.getSelectedRecipe();
return recipe == null ?
List.of() :
recipe.ingredients.stream()
.map(i -> new ItemStack(new ItemInstance(i.item, 0), 0))
.collect(Collectors.toList());
}
@Override
public String getItemName(int index) {
Recipe recipe = CraftingMenu.this.craftingList.getSelectedRecipe();
assert (recipe != null);
ItemStack item = this.getItems().get(index);
int have = CraftingMenu.this.player.inventory.count(item.instance.item),
required = recipe.ingredients.stream()
.filter(i -> i.item.id == item.instance.item.id)
.findFirst().get().count;
return required + "/" + have;
}
@Override
public int getItemTextColor(int index) {
return 555;
}
@Override
public String getName() {
return "COST";
}
}
protected final CraftingList craftingList;
protected final HaveMenu haveMenu;
protected final CostMenu costMenu;
protected final List<Menu> submenus;
protected final EntityPlayer player;
protected final List<Recipe> recipes;
protected final List<ItemStack> items;
public CraftingMenu(EntityPlayer player) {
this.player = player;
this.recipes = Item.STATION_RECIPES.get(this.getStation());
this.items = this.recipes.stream().map(r -> r.result).collect(Collectors.toList());
this.craftingList = new CraftingList(ControlHandler.MENU_UP, ControlHandler.MENU_DOWN, ControlHandler.MENU_SELECT);
this.haveMenu = new HaveMenu();
this.costMenu = new CostMenu();
this.submenus = List.of(this.craftingList, this.haveMenu, this.costMenu);
this.sort();
}
private void sort() {
this.recipes.sort(
(var a, var b) -> {
boolean ma = a.canMake(this.player.inventory, this.getStation()),
mb = b.canMake(this.player.inventory, this.getStation());
return ma == mb ? String.CASE_INSENSITIVE_ORDER.compare(
a.result.instance.item.getName(),
b.result.instance.item.getName()
) : (ma ? -1 : 1);
}
);
this.items.clear();
for (Recipe r : this.recipes) {
this.items.add(r.result);
}
}
@Override
public void init() {
super.init();
for (Menu m : submenus) {
m.init();
}
}
@Override
public void destroy() {
super.destroy();
for (Menu m : submenus) {
m.destroy();
}
}
@Override
public void tick() {
super.tick();
this.sort();
for (Menu m : submenus) {
m.tick();
}
}
@Override
public void update() {
super.update();
for (Menu m : submenus) {
m.update();
}
}
@Override
public void render() {
super.render();
for (Menu m : submenus) {
m.render();
}
}
protected void onCraft(ItemStack stack) {
Sound.CRAFT.play();
}
public abstract int getStation();
public abstract String getName();
}