Puzzle 0.3.0 - 1.17

Modulized into:
puzzle-base (update checker + config)
puzzle-gui (unified config gui)
puzzle-models (remove limitations)
puzzle-blocks (custom render layers)
puzzle-splashscreen (resourcepack-provided spash screen)

Updated to 1.17
This commit is contained in:
Motschen
2021-06-08 15:00:27 +02:00
parent 2e7c504e72
commit 2ee6f0be51
72 changed files with 1881 additions and 431 deletions

View File

@@ -0,0 +1,18 @@
package net.puzzlemc.gui.screen;
import net.coderbot.iris.gui.screen.ShaderPackScreen;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import java.util.Objects;
public class IrisButton extends DrawableHelper {
public static ButtonWidget getButton(int x, int y, int width, int height, Screen parent, MinecraftClient client) {
ShaderPackScreen shaderPackPage = new ShaderPackScreen(parent);
return new ButtonWidget(x, y, width, height, shaderPackPage.getTitle().copy().append("..."), (button) -> {
Objects.requireNonNull(client).openScreen(shaderPackPage);
});
}
}

View File

@@ -0,0 +1,14 @@
package net.puzzlemc.gui.screen;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.util.math.MatrixStack;
public class LoadingScreenBackgrond {
public static void render(MinecraftClient client, MatrixStack matrices, int width, int height, float delta) {
// if (client.world != null) {
// LogManager.getLogManager().getLogger("Puzzle").info(client.world.getDimension().toString());
// }
// client.getTextureManager().bindTexture(new Identifier("minecraft","optifine/gui/loading/background0.png"));
// DrawableHelper.drawTexture(matrices,0,0,width,height,0,0,width,height,width,height);
}
}

View File

@@ -0,0 +1,49 @@
package net.puzzlemc.gui.screen;
import net.fabricmc.loader.api.FabricLoader;
import net.puzzlemc.gui.screen.page.GraphicsPage;
import net.puzzlemc.gui.screen.page.MiscPage;
import net.puzzlemc.gui.screen.page.PerformancePage;
import net.puzzlemc.gui.screen.page.ResourcesPage;
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.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);
ResourcesPage resourcesPage = new ResourcesPage(this);
this.addDrawableChild(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 48 - 6, 150, 20, graphicsPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).openScreen(graphicsPage)));
this.addDrawableChild(new ButtonWidget(this.width / 2 + 5, this.height / 6 + 48 - 6, 150, 20, resourcesPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).openScreen(resourcesPage)));
this.addDrawableChild(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 72 - 6, 150, 20, performancePage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).openScreen(performancePage)));
this.addDrawableChild(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")) {
this.addDrawableChild(IrisButton.getButton(this.width / 2 - 155, this.height / 6 + 96 - 6, 150, 20, this, client));
}
this.addDrawableChild(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);
}
}

View File

@@ -0,0 +1,44 @@
package net.puzzlemc.gui.screen.page;
import net.puzzlemc.gui.screen.widget.PuzzleOptionListWidget;
import net.puzzlemc.gui.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.addSelectableChild(this.list);
super.init();
this.addDrawableChild(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);
}
}

View File

@@ -0,0 +1,12 @@
package net.puzzlemc.gui.screen.page;
import net.puzzlemc.gui.PuzzleApi;
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);
}
}

View File

@@ -0,0 +1,12 @@
package net.puzzlemc.gui.screen.page;
import net.puzzlemc.gui.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);
}
}

View File

@@ -0,0 +1,12 @@
package net.puzzlemc.gui.screen.page;
import net.puzzlemc.gui.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);
}
}

View File

@@ -0,0 +1,12 @@
package net.puzzlemc.gui.screen.page;
import net.puzzlemc.gui.PuzzleApi;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.TranslatableText;
public class ResourcesPage extends AbstractPuzzleOptionsPage {
public ResourcesPage(Screen parent) {
super(parent, new TranslatableText("puzzle.page.resources"), PuzzleApi.RESOURCE_OPTIONS);
}
}

View File

@@ -0,0 +1,5 @@
package net.puzzlemc.gui.screen.widget;
public enum ButtonType {
TEXT, BUTTON, SLIDER, TEXT_FIELD
}

View File

@@ -0,0 +1,10 @@
package net.puzzlemc.gui.screen.widget;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.text.Text;
public class DummyButtonWidget extends ButtonWidget {
public DummyButtonWidget() {
super(-1,-1,0,0,Text.of(""),null);
}
}

View File

@@ -0,0 +1,19 @@
package net.puzzlemc.gui.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);
}
}

View File

@@ -0,0 +1,99 @@
package net.puzzlemc.gui.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.Selectable;
import net.minecraft.client.gui.widget.ClickableWidget;
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(ClickableWidget button, Text text) {
this.addEntry(ButtonEntry.create(button, text));
}
public void addAll(List<PuzzleWidget> buttons) {
for (PuzzleWidget button : buttons) {
if (button.buttonType == ButtonType.TEXT) {
this.addButton(new DummyButtonWidget(), button.descriptionText);
} else 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<ClickableWidget> getHoveredButton(double mouseX, double mouseY) {
for (ButtonEntry buttonEntry : this.children()) {
for (ClickableWidget widget : buttonEntry.buttons) {
if (widget.isMouseOver(mouseX, mouseY)) {
return Optional.of(widget);
}
}
}
return Optional.empty();
}
public static class ButtonEntry extends ElementListWidget.Entry<ButtonEntry> {
private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
private final List<ClickableWidget> buttons;
private final Map<ClickableWidget, Text> buttonsWithText;
private ButtonEntry(ImmutableMap<ClickableWidget, Text> buttons) {
this.buttons = buttons.keySet().asList();
this.buttonsWithText = buttons;
}
public static ButtonEntry create(ClickableWidget 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);
if (button instanceof DummyButtonWidget) drawCenteredText(matrices,textRenderer, text,x + 200,y+5,0xFFFFFF);
else drawTextWithShadow(matrices,textRenderer, text,x+15,y+5,0xFFFFFF);
});
}
public List<? extends Element> children() {
return buttons;
}
@Override
public List<? extends Selectable> method_37025() {
return null;
}
}
}

View File

@@ -0,0 +1,29 @@
package net.puzzlemc.gui.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));
}
@Override
protected void applyValue() {
}
}

View File

@@ -0,0 +1,15 @@
package net.puzzlemc.gui.screen.widget;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.widget.TextFieldWidget;
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);
}
}

View File

@@ -0,0 +1,67 @@
package net.puzzlemc.gui.screen.widget;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.ClickableWidget;
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 Text Widget Container
* @param descriptionText The text you want to display.
*/
public PuzzleWidget(Text descriptionText) {
this.buttonType = ButtonType.TEXT;
this.descriptionText = descriptionText;
}
/**
* 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(ClickableWidget button);
}
@Environment(EnvType.CLIENT)
public interface TextAction {
void setTitle(ClickableWidget button);
}
}