mirror of
https://github.com/PuzzleMC/Puzzle.git
synced 2025-12-16 20:05:09 +01:00
First beta build
Most basic features work Support for some mods
This commit is contained in:
70
src/main/java/eu/midnightdust/puzzle/screen/PuzzleOptionsScreen.java
Executable file
70
src/main/java/eu/midnightdust/puzzle/screen/PuzzleOptionsScreen.java
Executable file
@@ -0,0 +1,70 @@
|
||||
package eu.midnightdust.puzzle.screen;
|
||||
|
||||
import eu.midnightdust.puzzle.screen.page.GraphicsPage;
|
||||
import eu.midnightdust.puzzle.screen.page.MiscPage;
|
||||
import eu.midnightdust.puzzle.screen.page.PerformancePage;
|
||||
import eu.midnightdust.puzzle.screen.page.TexturesPage;
|
||||
import net.coderbot.iris.gui.ShaderPackScreen;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.ScreenTexts;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class PuzzleOptionsScreen extends Screen {
|
||||
|
||||
public PuzzleOptionsScreen(Screen parent) {
|
||||
super(new TranslatableText("puzzle.screen.title"));
|
||||
this.parent = parent;
|
||||
}
|
||||
private final Screen parent;
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
GraphicsPage graphicsPage = new GraphicsPage(this);
|
||||
MiscPage miscPage = new MiscPage(this);
|
||||
PerformancePage performancePage = new PerformancePage(this);
|
||||
TexturesPage texturesPage = new TexturesPage(this);
|
||||
|
||||
this.addButton(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 48 - 6, 150, 20, graphicsPage.getTitle().copy().append("..."), (button) -> {
|
||||
Objects.requireNonNull(client).openScreen(graphicsPage);
|
||||
}));
|
||||
this.addButton(new ButtonWidget(this.width / 2 + 5, this.height / 6 + 48 - 6, 150, 20, texturesPage.getTitle().copy().append("..."), (button) -> {
|
||||
Objects.requireNonNull(client).openScreen(texturesPage);
|
||||
}));
|
||||
this.addButton(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 72 - 6, 150, 20, performancePage.getTitle().copy().append("..."), (button) -> {
|
||||
Objects.requireNonNull(client).openScreen(performancePage);
|
||||
}));
|
||||
this.addButton(new ButtonWidget(this.width / 2 + 5, this.height / 6 + 72 - 6, 150, 20, miscPage.getTitle().copy().append("..."), (button) -> {
|
||||
Objects.requireNonNull(client).openScreen(miscPage);
|
||||
}));
|
||||
if (FabricLoader.getInstance().isModLoaded("iris")) {
|
||||
try {
|
||||
ShaderPackScreen shaderPackPage = new ShaderPackScreen(this);
|
||||
this.addButton(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 96 - 6, 150, 20, shaderPackPage.getTitle().copy().append("..."), (button) -> {
|
||||
Objects.requireNonNull(client).openScreen(shaderPackPage);
|
||||
}));
|
||||
}
|
||||
catch (NoClassDefFoundError e) {
|
||||
LogManager.getLogger("Puzzle").info("The shaderpack selection screen is not present, not adding it.");
|
||||
}
|
||||
}
|
||||
|
||||
this.addButton(new ButtonWidget(this.width / 2 - 100, this.height / 6 + 168, 200, 20, ScreenTexts.DONE, (button) -> {
|
||||
Objects.requireNonNull(client).openScreen(parent);
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
this.renderBackground(matrices);
|
||||
|
||||
super.render(matrices, mouseX, mouseY, delta);
|
||||
drawCenteredText(matrices, textRenderer, title, width/2, 15, 0xFFFFFF);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package eu.midnightdust.puzzle.screen.page;
|
||||
|
||||
import eu.midnightdust.puzzle.screen.widget.PuzzleOptionListWidget;
|
||||
import eu.midnightdust.puzzle.screen.widget.PuzzleWidget;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.ScreenTexts;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
public abstract class AbstractPuzzleOptionsPage extends Screen {
|
||||
private PuzzleOptionListWidget list;
|
||||
private final List<PuzzleWidget> options;
|
||||
|
||||
public AbstractPuzzleOptionsPage(Screen parent, TranslatableText title, List<PuzzleWidget> options) {
|
||||
super(title);
|
||||
this.parent = parent;
|
||||
this.options = options;
|
||||
}
|
||||
private final Screen parent;
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
this.list = new PuzzleOptionListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
|
||||
list.addAll(options);
|
||||
this.children.add(this.list);
|
||||
|
||||
super.init();
|
||||
|
||||
this.addButton(new ButtonWidget(this.width / 2 - 100, this.height - 28, 200, 20, ScreenTexts.DONE, (button) -> {
|
||||
Objects.requireNonNull(client).openScreen(parent);
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
this.renderBackground(matrices);
|
||||
this.list.render(matrices, mouseX, mouseY, delta);
|
||||
|
||||
drawCenteredText(matrices, textRenderer, title, width/2, 15, 0xFFFFFF);
|
||||
super.render(matrices, mouseX, mouseY, delta);
|
||||
}
|
||||
}
|
||||
13
src/main/java/eu/midnightdust/puzzle/screen/page/GraphicsPage.java
Executable file
13
src/main/java/eu/midnightdust/puzzle/screen/page/GraphicsPage.java
Executable file
@@ -0,0 +1,13 @@
|
||||
package eu.midnightdust.puzzle.screen.page;
|
||||
|
||||
import eu.midnightdust.puzzle.PuzzleApi;
|
||||
import eu.midnightdust.puzzle.screen.page.AbstractPuzzleOptionsPage;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
public class GraphicsPage extends AbstractPuzzleOptionsPage {
|
||||
|
||||
public GraphicsPage(Screen parent) {
|
||||
super(parent, new TranslatableText("puzzle.page.graphics"), PuzzleApi.GRAPHICS_OPTIONS);
|
||||
}
|
||||
}
|
||||
12
src/main/java/eu/midnightdust/puzzle/screen/page/MiscPage.java
Executable file
12
src/main/java/eu/midnightdust/puzzle/screen/page/MiscPage.java
Executable file
@@ -0,0 +1,12 @@
|
||||
package eu.midnightdust.puzzle.screen.page;
|
||||
|
||||
import eu.midnightdust.puzzle.PuzzleApi;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
public class MiscPage extends AbstractPuzzleOptionsPage {
|
||||
|
||||
public MiscPage(Screen parent) {
|
||||
super(parent, new TranslatableText("puzzle.page.misc"), PuzzleApi.MISC_OPTIONS);
|
||||
}
|
||||
}
|
||||
12
src/main/java/eu/midnightdust/puzzle/screen/page/PerformancePage.java
Executable file
12
src/main/java/eu/midnightdust/puzzle/screen/page/PerformancePage.java
Executable file
@@ -0,0 +1,12 @@
|
||||
package eu.midnightdust.puzzle.screen.page;
|
||||
|
||||
import eu.midnightdust.puzzle.PuzzleApi;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
public class PerformancePage extends AbstractPuzzleOptionsPage {
|
||||
|
||||
public PerformancePage(Screen parent) {
|
||||
super(parent, new TranslatableText("puzzle.page.performance"), PuzzleApi.PERFORMANCE_OPTIONS);
|
||||
}
|
||||
}
|
||||
13
src/main/java/eu/midnightdust/puzzle/screen/page/TexturesPage.java
Executable file
13
src/main/java/eu/midnightdust/puzzle/screen/page/TexturesPage.java
Executable file
@@ -0,0 +1,13 @@
|
||||
package eu.midnightdust.puzzle.screen.page;
|
||||
|
||||
import eu.midnightdust.puzzle.PuzzleApi;
|
||||
import eu.midnightdust.puzzle.screen.page.AbstractPuzzleOptionsPage;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
public class TexturesPage extends AbstractPuzzleOptionsPage {
|
||||
|
||||
public TexturesPage(Screen parent) {
|
||||
super(parent, new TranslatableText("puzzle.page.textures"), PuzzleApi.TEXTURE_OPTIONS);
|
||||
}
|
||||
}
|
||||
5
src/main/java/eu/midnightdust/puzzle/screen/widget/ButtonType.java
Executable file
5
src/main/java/eu/midnightdust/puzzle/screen/widget/ButtonType.java
Executable file
@@ -0,0 +1,5 @@
|
||||
package eu.midnightdust.puzzle.screen.widget;
|
||||
|
||||
public enum ButtonType {
|
||||
BUTTON, SLIDER, TEXT_FIELD
|
||||
}
|
||||
19
src/main/java/eu/midnightdust/puzzle/screen/widget/PuzzleButtonWidget.java
Executable file
19
src/main/java/eu/midnightdust/puzzle/screen/widget/PuzzleButtonWidget.java
Executable file
@@ -0,0 +1,19 @@
|
||||
package eu.midnightdust.puzzle.screen.widget;
|
||||
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
public class PuzzleButtonWidget extends ButtonWidget {
|
||||
private final PuzzleWidget.TextAction title;
|
||||
|
||||
public PuzzleButtonWidget(int x, int y, int width, int height, PuzzleWidget.TextAction title, PressAction onPress) {
|
||||
super(x, y, width, height, Text.of(""), onPress);
|
||||
this.title = title;
|
||||
}
|
||||
@Override
|
||||
public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
title.setTitle(this);
|
||||
super.renderButton(matrices, mouseX, mouseY, delta);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package eu.midnightdust.puzzle.screen.widget;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.Element;
|
||||
import net.minecraft.client.gui.widget.AbstractButtonWidget;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.gui.widget.ElementListWidget;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class PuzzleOptionListWidget extends ElementListWidget<PuzzleOptionListWidget.ButtonEntry> {
|
||||
TextRenderer textRenderer;
|
||||
|
||||
public PuzzleOptionListWidget(MinecraftClient minecraftClient, int i, int j, int k, int l, int m) {
|
||||
super(minecraftClient, i, j, k, l, m);
|
||||
this.centerListVertically = false;
|
||||
textRenderer = minecraftClient.textRenderer;
|
||||
}
|
||||
|
||||
public void addButton(AbstractButtonWidget button, Text text) {
|
||||
this.addEntry(ButtonEntry.create(button, text));
|
||||
}
|
||||
|
||||
public void addAll(List<PuzzleWidget> buttons) {
|
||||
for (int i = 0; i < buttons.size(); ++i) {
|
||||
PuzzleWidget button = buttons.get(i);
|
||||
if (button.buttonType == ButtonType.BUTTON) {
|
||||
this.addButton(new PuzzleButtonWidget(this.width / 2 - 155 + 160, 0, 150, 20, button.buttonTextAction, button.onPress), button.descriptionText);
|
||||
}
|
||||
else if (button.buttonType == ButtonType.SLIDER) {
|
||||
this.addButton(new PuzzleSliderWidget(button.min,button.max,this.width / 2 - 155 + 160, 0, 150, 20, ((TranslatableText) button.buttonText),1), button.descriptionText);
|
||||
}
|
||||
else if (button.buttonType == ButtonType.TEXT_FIELD) {
|
||||
this.addButton(new PuzzleTextFieldWidget(textRenderer,this.width / 2 - 155 + 160, 0, 150, 20,null, button.buttonText), button.descriptionText);
|
||||
}
|
||||
else LogManager.getLogger("Puzzle").warn("Button " + button + " is missing the buttonType variable. This shouldn't happen!");
|
||||
}
|
||||
}
|
||||
|
||||
public int getRowWidth() {
|
||||
return 400;
|
||||
}
|
||||
|
||||
protected int getScrollbarPositionX() {
|
||||
return super.getScrollbarPositionX() + 32;
|
||||
}
|
||||
|
||||
public Optional<AbstractButtonWidget> getHoveredButton(double mouseX, double mouseY) {
|
||||
for (ButtonEntry buttonEntry : this.children()) {
|
||||
for (AbstractButtonWidget abstractButtonWidget : buttonEntry.buttons) {
|
||||
if (abstractButtonWidget.isMouseOver(mouseX, mouseY)) {
|
||||
return Optional.of(abstractButtonWidget);
|
||||
}
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static class ButtonEntry extends ElementListWidget.Entry<ButtonEntry> {
|
||||
private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
|
||||
private final List<AbstractButtonWidget> buttons;
|
||||
private final Map<AbstractButtonWidget, Text> buttonsWithText;
|
||||
|
||||
private ButtonEntry(ImmutableMap<AbstractButtonWidget, Text> buttons) {
|
||||
this.buttons = buttons.keySet().asList();
|
||||
this.buttonsWithText = buttons;
|
||||
}
|
||||
|
||||
public static ButtonEntry create(AbstractButtonWidget button, Text text) {
|
||||
return new ButtonEntry(ImmutableMap.of(button, text));
|
||||
}
|
||||
|
||||
public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
|
||||
this.buttonsWithText.forEach((button, text) -> {
|
||||
button.y = y;
|
||||
button.render(matrices, mouseX, mouseY, tickDelta);
|
||||
drawTextWithShadow(matrices,textRenderer, text,x+15,y+5,0xFFFFFF);
|
||||
});
|
||||
}
|
||||
|
||||
public List<? extends Element> children() {
|
||||
return buttons;
|
||||
}
|
||||
}
|
||||
}
|
||||
29
src/main/java/eu/midnightdust/puzzle/screen/widget/PuzzleSliderWidget.java
Executable file
29
src/main/java/eu/midnightdust/puzzle/screen/widget/PuzzleSliderWidget.java
Executable file
@@ -0,0 +1,29 @@
|
||||
package eu.midnightdust.puzzle.screen.widget;
|
||||
|
||||
import net.minecraft.client.gui.widget.SliderWidget;
|
||||
import net.minecraft.text.LiteralText;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
public class PuzzleSliderWidget extends SliderWidget {
|
||||
private final int min;
|
||||
private final double difference;
|
||||
|
||||
public PuzzleSliderWidget(int min, int max, int x, int y, int width, int height, TranslatableText label, double value) {
|
||||
super(x,y,width,height,label,value);
|
||||
this.updateMessage();
|
||||
this.min = min;
|
||||
this.difference = max - min;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateMessage() {
|
||||
Text text = new LiteralText((int) (min + this.value * difference) + "");
|
||||
this.setMessage(new TranslatableText("label").append(": ").append((Text) text));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyValue() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package eu.midnightdust.puzzle.screen.widget;
|
||||
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.widget.SliderWidget;
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
||||
import net.minecraft.text.LiteralText;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class PuzzleTextFieldWidget extends TextFieldWidget {
|
||||
private TranslatableText label;
|
||||
|
||||
public PuzzleTextFieldWidget(TextRenderer textRenderer, int x, int y, int width, int height, @Nullable TextFieldWidget copyFrom, Text text) {
|
||||
super(textRenderer, x, y, width, height, text);
|
||||
}
|
||||
}
|
||||
58
src/main/java/eu/midnightdust/puzzle/screen/widget/PuzzleWidget.java
Executable file
58
src/main/java/eu/midnightdust/puzzle/screen/widget/PuzzleWidget.java
Executable file
@@ -0,0 +1,58 @@
|
||||
package eu.midnightdust.puzzle.screen.widget;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.gui.widget.AbstractButtonWidget;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
public class PuzzleWidget {
|
||||
public ButtonType buttonType;
|
||||
public int min;
|
||||
public int max;
|
||||
public Text descriptionText;
|
||||
public Text buttonText;
|
||||
public TextAction buttonTextAction;
|
||||
public ButtonWidget.PressAction onPress;
|
||||
public PuzzleWidget.SaveAction onSave;
|
||||
|
||||
/**
|
||||
* Puzzle Button Widget Container
|
||||
* @param descriptionText Tells the user what the option does.
|
||||
* @param getTitle Function to set the text on the button.
|
||||
* @param onPress Function to call when the user presses the button.
|
||||
*/
|
||||
public PuzzleWidget(Text descriptionText, PuzzleWidget.TextAction getTitle, ButtonWidget.PressAction onPress) {
|
||||
this.buttonType = ButtonType.BUTTON;
|
||||
this.descriptionText = descriptionText;
|
||||
this.buttonTextAction = getTitle;
|
||||
this.onPress = onPress;
|
||||
}
|
||||
/**
|
||||
* Puzzle Slider Widget Container (WIP - Doesn't work)
|
||||
*/
|
||||
public PuzzleWidget(int min, int max, Text descriptionText, TranslatableText buttonText) {
|
||||
this.buttonType = ButtonType.SLIDER;
|
||||
this.min = min;
|
||||
this.max = max;
|
||||
this.descriptionText = descriptionText;
|
||||
this.buttonText = buttonText;
|
||||
}
|
||||
/**
|
||||
* Puzzle Text Field Widget Container (WIP - Doesn't work)
|
||||
*/
|
||||
public PuzzleWidget(Text descriptionText, Text buttonText) {
|
||||
this.buttonType = ButtonType.TEXT_FIELD;
|
||||
this.descriptionText = descriptionText;
|
||||
this.buttonText = buttonText;
|
||||
}
|
||||
@Environment(EnvType.CLIENT)
|
||||
public interface SaveAction {
|
||||
void onSave(AbstractButtonWidget button);
|
||||
}
|
||||
@Environment(EnvType.CLIENT)
|
||||
public interface TextAction {
|
||||
void setTitle(AbstractButtonWidget button);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user