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,39 @@
package net.puzzlemc.gui;
import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.gui.screen.widget.PuzzleWidget;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
public class PuzzleApi {
private static Logger LOGGER = LogManager.getLogger("puzzle-gui");
public static List<PuzzleWidget> GRAPHICS_OPTIONS = new ArrayList<>();
public static List<PuzzleWidget> MISC_OPTIONS = new ArrayList<>();
public static List<PuzzleWidget> PERFORMANCE_OPTIONS = new ArrayList<>();
public static List<PuzzleWidget> RESOURCE_OPTIONS = new ArrayList<>();
public static void addToGraphicsOptions(PuzzleWidget button) {
GRAPHICS_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.asString() + " -> Graphics Options");
}
public static void addToMiscOptions(PuzzleWidget button) {
MISC_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.asString() + " -> Misc Options");
}
public static void addToPerformanceOptions(PuzzleWidget button) {
PERFORMANCE_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.asString() + "- > Performance Options");
}
public static void addToResourceOptions(PuzzleWidget button) {
RESOURCE_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.asString() + " -> Resource Options");
}
@Deprecated public static void addToTextureOptions(PuzzleWidget button) {
RESOURCE_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.asString() + " -> LEGACY Texture Options");
}
}

View File

@@ -0,0 +1,109 @@
package net.puzzlemc.gui;
import dev.lambdaurora.lambdabettergrass.LBGConfig;
import dev.lambdaurora.lambdabettergrass.LambdaBetterGrass;
import dev.lambdaurora.lambdynlights.DynamicLightsConfig;
import dev.lambdaurora.lambdynlights.LambDynLights;
import eu.midnightdust.cullleaves.config.CullLeavesConfig;
import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.gui.screen.widget.PuzzleWidget;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import net.puzzlemc.splashscreen.PuzzleSplashScreen;
//import team.chisel.ctm.client.CTMClient;
//import team.chisel.ctm.client.config.ConfigManager;
public class PuzzleClient implements ClientModInitializer {
public final static String id = "puzzle";
public static final Text YES = new TranslatableText("gui.yes").formatted(Formatting.GREEN);
public static final Text NO = new TranslatableText("gui.no").formatted(Formatting.RED);
@Override
public void onInitializeClient() {
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("Puzzle")));
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("Check for Updates"), (button) -> button.setMessage(PuzzleConfig.checkUpdates ? YES : NO), (button) -> {
PuzzleConfig.checkUpdates = !PuzzleConfig.checkUpdates;
PuzzleConfig.write(id);
}));
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("Show Puzzle version info"), (button) -> button.setMessage(PuzzleConfig.showPuzzleInfo ? YES : NO), (button) -> {
PuzzleConfig.showPuzzleInfo = !PuzzleConfig.showPuzzleInfo;
PuzzleConfig.write(id);
}));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Puzzle")));
if (FabricLoader.getInstance().isModLoaded("puzzle-splashscreen")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Use resourcepack splash screen "), (button) -> button.setMessage(PuzzleConfig.resourcepackSplashScreen ? YES : NO), (button) -> {
PuzzleConfig.resourcepackSplashScreen = !PuzzleConfig.resourcepackSplashScreen;
PuzzleConfig.write(id);
PuzzleSplashScreen.resetColors();
MinecraftClient.getInstance().getTextureManager().registerTexture(PuzzleSplashScreen.LOGO, new PuzzleSplashScreen.LogoTexture());
}));
}
if (FabricLoader.getInstance().isModLoaded("puzzle-randomentities")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Random Entity Textures"), (button) -> button.setMessage(PuzzleConfig.randomEntityTextures ? YES : NO), (button) -> {
PuzzleConfig.randomEntityTextures = !PuzzleConfig.randomEntityTextures;
PuzzleConfig.write(id);
}));
}
if (FabricLoader.getInstance().isModLoaded("puzzle-models")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Unlimited Model Rotations"), (button) -> button.setMessage(PuzzleConfig.unlimitedRotations ? YES : NO), (button) -> {
PuzzleConfig.unlimitedRotations = !PuzzleConfig.unlimitedRotations;
PuzzleConfig.write(id);
}));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Bigger Custom Models"), (button) -> button.setMessage(PuzzleConfig.biggerModels ? YES : NO), (button) -> {
PuzzleConfig.biggerModels = !PuzzleConfig.biggerModels;
PuzzleConfig.write(id);
}));
}
if (FabricLoader.getInstance().isModLoaded("puzzle-blocks")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Render Layer Overwrites"), (button) -> button.setMessage(PuzzleConfig.customRenderLayers ? YES : NO), (button) -> {
PuzzleConfig.customRenderLayers = !PuzzleConfig.customRenderLayers;
PuzzleConfig.write(id);
}));
}
if (FabricLoader.getInstance().isModLoaded("cullleaves")) {
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.of("CullLeaves")));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.of("Cull Leaves"), (button) -> button.setMessage(CullLeavesConfig.enabled ? YES : NO), (button) -> {
CullLeavesConfig.enabled = !CullLeavesConfig.enabled;
CullLeavesConfig.write("cullleaves");
MinecraftClient.getInstance().worldRenderer.reload();
}));
}
if (FabricLoader.getInstance().isModLoaded("lambdynlights")) {
DynamicLightsConfig ldlConfig = LambDynLights.get().config;
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambDynamicLights")));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdynlights.option.mode"), (button) -> button.setMessage(ldlConfig.getDynamicLightsMode().getTranslatedText()), (button) -> ldlConfig.setDynamicLightsMode(ldlConfig.getDynamicLightsMode().next())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.entities")), (button) -> button.setMessage(ldlConfig.hasEntitiesLightSource() ? YES : NO), (button) -> ldlConfig.setEntitiesLightSource(!ldlConfig.hasEntitiesLightSource())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.block_entities")), (button) -> button.setMessage(ldlConfig.hasBlockEntitiesLightSource() ? YES : NO), (button) -> ldlConfig.setBlockEntitiesLightSource(!ldlConfig.hasBlockEntitiesLightSource())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("entity.minecraft.creeper")), (button) -> button.setMessage(ldlConfig.getCreeperLightingMode().getTranslatedText()), (button) -> ldlConfig.setCreeperLightingMode(ldlConfig.getCreeperLightingMode().next())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("block.minecraft.tnt")), (button) -> button.setMessage(ldlConfig.getTntLightingMode().getTranslatedText()), (button) -> ldlConfig.setTntLightingMode(ldlConfig.getTntLightingMode().next())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.water_sensitive")), (button) -> button.setMessage(ldlConfig.hasWaterSensitiveCheck() ? YES : NO), (button) -> ldlConfig.setWaterSensitiveCheck(!ldlConfig.hasWaterSensitiveCheck())));
}
// if (FabricLoader.getInstance().isModLoaded("ctm")) {
// PuzzleApi.addToTextureOptions(new PuzzleWidget(Text.of("ConnectedTexturesMod for Fabric")));
// ConfigManager ctmfConfigManager = CTMClient.getConfigManager();
// ConfigManager.Config ctmfConfig = CTMClient.getConfigManager().getConfig();
// PuzzleApi.addToTextureOptions(new PuzzleWidget(new TranslatableText("puzzle.option.ctm"), (button) -> button.setMessage(ctmfConfig.disableCTM ? NO : YES), (button) -> {
// ctmfConfig.disableCTM = !ctmfConfig.disableCTM;
// ctmfConfigManager.onConfigChange();
// }));
// PuzzleApi.addToTextureOptions(new PuzzleWidget(new TranslatableText("puzzle.option.inside_ctm"), (button) -> button.setMessage(ctmfConfig.connectInsideCTM ? YES : NO), (button) -> {
// ctmfConfig.connectInsideCTM = !ctmfConfig.connectInsideCTM;
// ctmfConfigManager.onConfigChange();
// }));
// }
if (FabricLoader.getInstance().isModLoaded("lambdabettergrass")) {
LBGConfig lbgConfig = LambdaBetterGrass.get().config;
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambdaBetterGrass")));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdabettergrass.option.mode"), (button) -> button.setMessage(lbgConfig.getMode().getTranslatedText()), (button) -> lbgConfig.setMode(lbgConfig.getMode().next())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdabettergrass.option.better_snow"), (button) -> button.setMessage(lbgConfig.hasBetterLayer() ? YES : NO), (button) -> lbgConfig.setBetterLayer(!lbgConfig.hasBetterLayer())));
}
}
}

View File

@@ -0,0 +1,28 @@
package net.puzzlemc.gui.config;
import com.google.common.collect.ImmutableMap;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi;
import net.puzzlemc.gui.screen.PuzzleOptionsScreen;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import java.util.Map;
@Environment(EnvType.CLIENT)
public class ModMenuIntegration implements ModMenuApi {
// Used to set the config screen for all modules //
// @Override
// public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
// Map<String, ConfigScreenFactory<?>> map = ImmutableMap.of();
// map.put("puzzle",PuzzleOptionsScreen::new);
// map.put("puzzle-gui",PuzzleOptionsScreen::new);
// map.put("puzzle-blocks",PuzzleOptionsScreen::new);
// map.put("puzzle-base",PuzzleOptionsScreen::new);
// map.put("puzzle-models",PuzzleOptionsScreen::new);
// map.put("puzzle-randomentities",PuzzleOptionsScreen::new);
// map.put("puzzle-splashscreen",PuzzleOptionsScreen::new);
// return map;
// }
}

View File

@@ -0,0 +1,29 @@
package net.puzzlemc.gui.mixin;
import net.puzzlemc.gui.screen.PuzzleOptionsScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.option.OptionsScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Objects;
@Mixin(OptionsScreen.class)
public class MixinOptionsScreen extends Screen {
protected MixinOptionsScreen(Text title) {
super(title);
}
@Inject(at = @At("TAIL"),method = "init")
public void init(CallbackInfo ci) {
PuzzleOptionsScreen puzzleScreen = new PuzzleOptionsScreen(this);
this.addDrawableChild(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 144 - 6, 150, 20, new TranslatableText("puzzle.screen.title").append("..."), (button) -> Objects.requireNonNull(this.client).openScreen(puzzleScreen)));
}
}

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);
}
}

View File

@@ -0,0 +1,17 @@
package net.puzzlemc.gui.util;
import java.awt.*;
public class ColorUtil {
/**
* @credit https://stackoverflow.com/questions/4129666/how-to-convert-hex-to-rgb-using-java
* @param colorStr e.g. "FFFFFF"
* @return
*/
public static Color hex2Rgb(String colorStr) {
return new Color(
Integer.valueOf( colorStr.substring( 0, 2 ), 16 ),
Integer.valueOf( colorStr.substring( 2, 4 ), 16 ),
Integer.valueOf( colorStr.substring( 4, 6 ), 16 ));
}
}