package me.shedaniel.gui; import me.shedaniel.api.IDisplayCategory; import me.shedaniel.api.IRecipe; import me.shedaniel.gui.widget.AEISlot; import me.shedaniel.gui.widget.Button; import me.shedaniel.gui.widget.Control; import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.inventory.Container; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; public class RecipeGui extends GuiContainer { private static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("almostenoughitems", "textures/gui/recipecontainer.png"); private final MainWindow mainWindow; private final Container container; private final GuiScreen prevScreen; private final Map> recipes; private int guiWidth = 176; private int guiHeight = 222; ArrayList categories = new ArrayList<>(); private int categoryPointer = 0; private int recipePointer = 0; private List slots; private int cycleCounter = 0; private int[] itemPointer; List controls = new LinkedList<>(); public RecipeGui(Container p_i1072_1_, GuiScreen prevScreen, Map> recipes) { super(new RecipeContainer()); this.container = p_i1072_1_; this.prevScreen = prevScreen; this.recipes = recipes; this.mc = Minecraft.getInstance(); this.itemRender = mc.getItemRenderer(); this.fontRenderer = mc.fontRenderer; this.mainWindow = Minecraft.getInstance().mainWindow; setupCategories(); } private void setupCategories() { categories.addAll(recipes.keySet()); updateRecipe(); } @Override public void render(int mouseX, int mouseY, float partialTicks) { super.render(mouseX, mouseY, partialTicks); int y = (int) ((mainWindow.getScaledHeight() / 2 - this.guiHeight / 2)); drawCenteredString(this.fontRenderer, categories.get(categoryPointer).getDisplayName(), guiLeft + guiWidth / 2, y + 11, -1); drawCenteredString(this.fontRenderer, String.format("%d/%d", 1 + getCurrentPage(), getTotalPages()), guiLeft + guiWidth / 2, y + 34, -1); controls.forEach(Control::draw); } private int getCurrentPage() { return recipePointer / 2; } @Override public void tick() { super.tick(); slots.forEach(AEISlot::tick); controls.forEach(Control::tick); } @Override public void onResize(Minecraft p_onResize_1_, int p_onResize_2_, int p_onResize_3_) { super.onResize(p_onResize_1_, p_onResize_2_, p_onResize_3_); updateRecipe(); } private void updateRecipe() { IRecipe recipe = recipes.get(categories.get(categoryPointer)).get(recipePointer); categories.get(categoryPointer).resetRecipes(); categories.get(categoryPointer).addRecipe(recipe); slots = categories.get(categoryPointer).setupDisplay(0); if (recipes.get(categories.get(categoryPointer)).size() >= categoryPointer + 2) { IRecipe recipe2 = recipes.get(categories.get(categoryPointer)).get(recipePointer + 1); categories.get(categoryPointer).addRecipe(recipe2); slots.addAll(categories.get(categoryPointer).setupDisplay(1)); } guiLeft = (int) ((mainWindow.getScaledWidth() / 2 - this.guiWidth / 2)); guiTop = (int) ((mainWindow.getScaledHeight() / 2 - this.guiHeight / 2)); for(AEISlot slot : slots) { slot.move(guiLeft, guiTop); } Button btnCategoryLeft = new Button(guiLeft + 10, guiTop + 5, 15, 20, "<"); Button btnCategoryRight = new Button(guiLeft + guiWidth - 25, guiTop + 5, 15, 20, ">"); btnCategoryRight.onClick = this::btnCategoryRight; btnCategoryLeft.onClick = this::btnCategoryLeft; Button btnRecipeLeft = new Button(guiLeft + 10, guiTop + 28, 15, 20, "<"); Button btnRecipeRight = new Button(guiLeft + guiWidth - 25, guiTop + 28, 15, 20, ">"); btnRecipeLeft.setEnabled(recipes.get(categories.get(categoryPointer)).size() > 1 && recipePointer > 0); btnRecipeRight.setEnabled(recipes.get(categories.get(categoryPointer)).size() > 1 && getCurrentPage() + 1 < getTotalPages()); btnRecipeRight.onClick = this::btnRecipeRight; btnRecipeLeft.onClick = this::btnRecipeLeft; controls.clear(); controls.add(btnCategoryLeft); controls.add(btnCategoryRight); if (categories.size() <= 2) { btnCategoryLeft.setEnabled(false); btnCategoryRight.setEnabled(false); } controls.add(btnRecipeLeft); controls.add(btnRecipeRight); itemPointer = new int[9]; for(int i = 0; i < itemPointer.length; i++) { itemPointer[i] = 0; } List newControls = new LinkedList<>(); categories.get(categoryPointer).addWidget(newControls, 0); if (recipes.get(categories.get(categoryPointer)).size() >= categoryPointer + 2) { categories.get(categoryPointer).addWidget(newControls, 1); } newControls.forEach(f -> f.move(guiLeft, guiTop)); controls.addAll(newControls); } @Override protected void drawGuiContainerBackgroundLayer(float v, int i, int i1) { drawDefaultBackground(); GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(CHEST_GUI_TEXTURE); int lvt_4_1_ = (int) ((mainWindow.getScaledWidth() / 2 - this.guiWidth / 2)); int lvt_5_1_ = (int) ((mainWindow.getScaledHeight() / 2 - this.guiHeight / 2)); this.drawTexturedModalRect(lvt_4_1_, lvt_5_1_, 0, 0, this.guiWidth, this.guiHeight); slots.forEach(AEISlot::draw); } @Override protected void initGui() { super.initGui(); } @Override public boolean keyPressed(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_) { if (p_keyPressed_1_ == 259 && prevScreen != null && AEIRenderHelper.focusedControl == null) { Minecraft.getInstance().displayGuiScreen(prevScreen); return true; } return super.keyPressed(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_); } @Override public void onGuiClosed() { super.onGuiClosed(); } private boolean btnCategoryLeft(int button) { recipePointer = 0; categoryPointer--; if (categoryPointer < 0) { categoryPointer = categories.size() - 1; } updateRecipe(); return true; } private boolean btnCategoryRight(int button) { recipePointer = 0; categoryPointer++; if (categoryPointer >= categories.size()) { categoryPointer = 0; } updateRecipe(); return true; } private boolean btnRecipeLeft(int button) { recipePointer -= 2; if (recipePointer < 0) { recipePointer = (getTotalPages() - 1) * 2; } updateRecipe(); return true; } private boolean btnRecipeRight(int button) { recipePointer += 2; if (recipePointer >= recipes.get(categories.get(categoryPointer)).size()) { recipePointer = 0; } updateRecipe(); return true; } private int riseDoublesToInt(double i) { return (int) (i + (i % 1 == 0 ? 0 : 1)); } private int getTotalPages() { return MathHelper.clamp(riseDoublesToInt(recipes.get(categories.get(categoryPointer)).size() / 2), 1, Integer.MAX_VALUE); } }