/* * Copyright (C) 2022 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with NotEnoughUpdates. If not, see . */ package io.github.moulberry.notenoughupdates.mbgui; import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.inventory.GuiContainer; import org.lwjgl.util.vector.Vector2f; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; public class MBGuiGroupFloating extends MBGuiGroup { private GuiScreen lastScreen = null; private final HashMap childrenPositionOffset = new HashMap<>(); //Serialized private final LinkedHashMap children; public MBGuiGroupFloating(int width, int height, LinkedHashMap children) { this.width = width; this.height = height; this.children = children; recalculate(); } public Map getChildrenMap() { return Collections.unmodifiableMap(children); } @Override public Map getChildrenPosition() { GuiScreen currentScreen = Minecraft.getMinecraft().currentScreen; if (currentScreen instanceof GuiContainer || currentScreen instanceof GuiItemRecipe) { if (lastScreen != currentScreen) { lastScreen = currentScreen; ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); int screenWidth = scaledResolution.getScaledWidth(); int screenHeight = scaledResolution.getScaledHeight(); int xSize = -1; int ySize = -1; int guiLeft = -1; int guiTop = -1; if (currentScreen instanceof GuiContainer) { GuiContainer currentContainer = (GuiContainer) currentScreen; try { xSize = (int) Utils.getField(GuiContainer.class, currentContainer, "xSize", "field_146999_f"); ySize = (int) Utils.getField(GuiContainer.class, currentContainer, "ySize", "field_147000_g"); guiLeft = (int) Utils.getField(GuiContainer.class, currentContainer, "guiLeft", "field_147003_i"); guiTop = (int) Utils.getField(GuiContainer.class, currentContainer, "guiTop", "field_147009_r"); } catch (Exception ignored) { } } else { xSize = ((GuiItemRecipe) currentScreen).xSize; ySize = ((GuiItemRecipe) currentScreen).ySize; guiLeft = ((GuiItemRecipe) currentScreen).guiLeft; guiTop = ((GuiItemRecipe) currentScreen).guiTop; } if (xSize <= 0 && ySize <= 0 && guiLeft <= 0 && guiTop <= 0) { lastScreen = null; return Collections.unmodifiableMap(childrenPosition); } for (Map.Entry entry : children.entrySet()) { MBGuiElement child = entry.getKey(); MBAnchorPoint anchorPoint = entry.getValue(); Vector2f childPos; if (childrenPosition.containsKey(child)) { childPos = new Vector2f(childrenPosition.get(child)); } else { childPos = new Vector2f(); } if (anchorPoint.inventoryRelative) { int defGuiLeft = (screenWidth - xSize) / 2; int defGuiTop = (screenHeight - ySize) / 2; childPos.x += guiLeft - defGuiLeft + (0.5f - anchorPoint.anchorPoint.x) * xSize; childPos.y += guiTop - defGuiTop + (0.5f - anchorPoint.anchorPoint.y) * ySize; } childrenPositionOffset.put(child, childPos); } } return Collections.unmodifiableMap(childrenPositionOffset); } else { return Collections.unmodifiableMap(childrenPosition); } } @Override public void recalculate() { lastScreen = null; for (MBGuiElement child : children.keySet()) { child.recalculate(); } for (Map.Entry entry : children.entrySet()) { MBGuiElement child = entry.getKey(); MBAnchorPoint anchorPoint = entry.getValue(); float x = anchorPoint.anchorPoint.x * width - anchorPoint.anchorPoint.x * child.getWidth() + anchorPoint.offset.x; float y = anchorPoint.anchorPoint.y * height - anchorPoint.anchorPoint.y * child.getHeight() + anchorPoint.offset.y; if (anchorPoint.inventoryRelative) { x = width * 0.5f + anchorPoint.offset.x; y = height * 0.5f + anchorPoint.offset.y; } childrenPosition.put(child, new Vector2f(x, y)); } } @Override public Collection getChildren() { return children.keySet(); } }