mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-06-10 22:58:56 +02:00
c36346b97d
# Conflicts: # src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java # src/main/java/com/simibubi/create/foundation/command/AllCommands.java # src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java # src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java # src/main/java/com/simibubi/create/foundation/command/PonderCommand.java # src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java # src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java # src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java # src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java # src/main/java/com/simibubi/create/foundation/gui/AllIcons.java # src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java # src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java # src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java # src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java # src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java # src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java # src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java # src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java # src/main/resources/create.mixins.json
227 lines
6.3 KiB
Java
227 lines
6.3 KiB
Java
package com.simibubi.create.foundation.ponder.content;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Objects;
|
|
|
|
import org.apache.commons.lang3.mutable.MutableBoolean;
|
|
|
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
|
import com.simibubi.create.AllBlocks;
|
|
import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock;
|
|
import com.simibubi.create.foundation.gui.ScreenOpener;
|
|
import com.simibubi.create.foundation.gui.Theme;
|
|
import com.simibubi.create.foundation.gui.UIRenderHelper;
|
|
import com.simibubi.create.foundation.ponder.NavigatableSimiScreen;
|
|
import com.simibubi.create.foundation.ponder.PonderRegistry;
|
|
import com.simibubi.create.foundation.ponder.PonderUI;
|
|
import com.simibubi.create.foundation.ponder.ui.ChapterLabel;
|
|
import com.simibubi.create.foundation.ponder.ui.LayoutHelper;
|
|
import com.simibubi.create.foundation.ponder.ui.PonderButton;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.client.MainWindow;
|
|
import net.minecraft.client.gui.widget.Widget;
|
|
import net.minecraft.client.renderer.Rectangle2d;
|
|
import net.minecraft.item.BlockItem;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.math.MathHelper;
|
|
import net.minecraftforge.registries.ForgeRegistries;
|
|
|
|
public class PonderIndexScreen extends NavigatableSimiScreen {
|
|
|
|
protected final List<PonderChapter> chapters;
|
|
private final double chapterXmult = 0.5;
|
|
private final double chapterYmult = 0.3;
|
|
protected Rectangle2d chapterArea;
|
|
|
|
protected final List<Item> items;
|
|
private final double itemXmult = 0.5;
|
|
private double itemYmult = 0.75;
|
|
protected Rectangle2d itemArea;
|
|
|
|
private ItemStack hoveredItem = ItemStack.EMPTY;
|
|
|
|
public PonderIndexScreen() {
|
|
chapters = new ArrayList<>();
|
|
items = new ArrayList<>();
|
|
}
|
|
|
|
@Override
|
|
protected void init() {
|
|
widgets.clear();
|
|
super.init();
|
|
|
|
chapters.clear();
|
|
// chapters.addAll(PonderRegistry.chapters.getAllChapters());
|
|
|
|
items.clear();
|
|
PonderRegistry.all.keySet()
|
|
.stream()
|
|
.map(key -> {
|
|
Item item = ForgeRegistries.ITEMS.getValue(key);
|
|
if (item == null) {
|
|
Block b = ForgeRegistries.BLOCKS.getValue(key);
|
|
if (b != null)
|
|
item = b.asItem();
|
|
}
|
|
return item;
|
|
})
|
|
.filter(Objects::nonNull)
|
|
.filter(PonderIndexScreen::exclusions)
|
|
.forEach(items::add);
|
|
|
|
boolean hasChapters = !chapters.isEmpty();
|
|
|
|
// setup chapters
|
|
LayoutHelper layout = LayoutHelper.centeredHorizontal(chapters.size(),
|
|
MathHelper.clamp((int) Math.ceil(chapters.size() / 4f), 1, 4), 200, 38, 16);
|
|
chapterArea = layout.getArea();
|
|
int chapterCenterX = (int) (width * chapterXmult);
|
|
int chapterCenterY = (int) (height * chapterYmult);
|
|
|
|
// todo at some point pagination or horizontal scrolling may be needed for
|
|
// chapters/items
|
|
for (PonderChapter chapter : chapters) {
|
|
ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(),
|
|
chapterCenterY + layout.getY(), (mouseX, mouseY) -> {
|
|
centerScalingOn(mouseX, mouseY);
|
|
ScreenOpener.transitionTo(PonderUI.of(chapter));
|
|
});
|
|
|
|
widgets.add(label);
|
|
layout.next();
|
|
}
|
|
|
|
// setup items
|
|
if (!hasChapters) {
|
|
itemYmult = 0.5;
|
|
}
|
|
|
|
int maxItemRows = hasChapters ? 4 : 7;
|
|
layout = LayoutHelper.centeredHorizontal(items.size(),
|
|
MathHelper.clamp((int) Math.ceil(items.size() / 11f), 1, maxItemRows), 28, 28, 8);
|
|
itemArea = layout.getArea();
|
|
int itemCenterX = (int) (width * itemXmult);
|
|
int itemCenterY = (int) (height * itemYmult);
|
|
|
|
for (Item item : items) {
|
|
PonderButton b = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4)
|
|
.showing(new ItemStack(item))
|
|
.withCallback((x, y) -> {
|
|
if (!PonderRegistry.all.containsKey(item.getRegistryName()))
|
|
return;
|
|
|
|
centerScalingOn(x, y);
|
|
ScreenOpener.transitionTo(PonderUI.of(new ItemStack(item)));
|
|
});
|
|
|
|
widgets.add(b);
|
|
layout.next();
|
|
}
|
|
|
|
}
|
|
|
|
private static boolean exclusions(Item item) {
|
|
if (item instanceof BlockItem) {
|
|
Block block = ((BlockItem) item).getBlock();
|
|
if (block instanceof ValveHandleBlock && !AllBlocks.COPPER_VALVE_HANDLE.is(item))
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void tick() {
|
|
super.tick();
|
|
PonderUI.ponderTicks++;
|
|
|
|
hoveredItem = ItemStack.EMPTY;
|
|
MainWindow w = client.getWindow();
|
|
double mouseX = client.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth();
|
|
double mouseY = client.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight();
|
|
for (Widget widget : widgets) {
|
|
if (widget instanceof PonderButton)
|
|
if (widget.isMouseOver(mouseX, mouseY)) {
|
|
hoveredItem = ((PonderButton) widget).getItem();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
|
|
int x = (int) (width * chapterXmult);
|
|
int y = (int) (height * chapterYmult);
|
|
|
|
if (!chapters.isEmpty()) {
|
|
ms.push();
|
|
ms.translate(x, y, 0);
|
|
|
|
UIRenderHelper.streak(ms, 0, chapterArea.getX() - 10, chapterArea.getY() - 20, 20, 220);
|
|
textRenderer.draw(ms, "Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, Theme.i(Theme.Key.TEXT));
|
|
|
|
ms.pop();
|
|
}
|
|
|
|
x = (int) (width * itemXmult);
|
|
y = (int) (height * itemYmult);
|
|
|
|
ms.push();
|
|
ms.translate(x, y, 0);
|
|
|
|
UIRenderHelper.streak(ms, 0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 220);
|
|
textRenderer.draw(ms, "Items to inspect", itemArea.getX() - 5, itemArea.getY() - 25, Theme.i(Theme.Key.TEXT));
|
|
|
|
ms.pop();
|
|
}
|
|
|
|
@Override
|
|
protected void renderWindowForeground(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
|
|
if (hoveredItem.isEmpty())
|
|
return;
|
|
|
|
ms.push();
|
|
ms.translate(0, 0, 200);
|
|
|
|
renderTooltip(ms, hoveredItem, mouseX, mouseY);
|
|
|
|
ms.pop();
|
|
}
|
|
|
|
/*@Override
|
|
public boolean mouseClicked(double x, double y, int button) {
|
|
MutableBoolean handled = new MutableBoolean(false);
|
|
widgets.forEach(w -> {
|
|
if (handled.booleanValue())
|
|
return;
|
|
if (!w.isMouseOver(x, y))
|
|
return;
|
|
if (w instanceof PonderButton) {
|
|
PonderButton btn = (PonderButton) w;
|
|
btn.runCallback(x, y);
|
|
handled.setTrue();
|
|
}
|
|
});
|
|
|
|
if (handled.booleanValue())
|
|
return true;
|
|
return super.mouseClicked(x, y, button);
|
|
}*/
|
|
|
|
@Override
|
|
public boolean isEquivalentTo(NavigatableSimiScreen other) {
|
|
return other instanceof PonderIndexScreen;
|
|
}
|
|
|
|
public ItemStack getHoveredTooltipItem() {
|
|
return hoveredItem;
|
|
}
|
|
|
|
@Override
|
|
public boolean isPauseScreen() {
|
|
return true;
|
|
}
|
|
}
|